diff --git a/docs/gallery/anvil/index.html b/docs/gallery/anvil/index.html
index 2a3f191f..0d10560c 100644
--- a/docs/gallery/anvil/index.html
+++ b/docs/gallery/anvil/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/apothecary-shelf/index.html b/docs/gallery/apothecary-shelf/index.html
index 00367832..b7c155c3 100644
--- a/docs/gallery/apothecary-shelf/index.html
+++ b/docs/gallery/apothecary-shelf/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/armature-bend/index.html b/docs/gallery/armature-bend/index.html
index 9edb1674..f3961581 100644
--- a/docs/gallery/armature-bend/index.html
+++ b/docs/gallery/armature-bend/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/attribute-domain-shear/index.html b/docs/gallery/attribute-domain-shear/index.html
index 1c757ec8..cf250513 100644
--- a/docs/gallery/attribute-domain-shear/index.html
+++ b/docs/gallery/attribute-domain-shear/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/bake-normal-high-to-low/index.html b/docs/gallery/bake-normal-high-to-low/index.html
index 91768b08..54b43927 100644
--- a/docs/gallery/bake-normal-high-to-low/index.html
+++ b/docs/gallery/bake-normal-high-to-low/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/bmesh-gear/index.html b/docs/gallery/bmesh-gear/index.html
index 6bfa1e15..625100a4 100644
--- a/docs/gallery/bmesh-gear/index.html
+++ b/docs/gallery/bmesh-gear/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/book-trolley/index.html b/docs/gallery/book-trolley/index.html
index 03074832..8e438b9a 100644
--- a/docs/gallery/book-trolley/index.html
+++ b/docs/gallery/book-trolley/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/bookshelf/index.html b/docs/gallery/bookshelf/index.html
index 1dd0ea9d..b9fd8f91 100644
--- a/docs/gallery/bookshelf/index.html
+++ b/docs/gallery/bookshelf/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/brazier/index.html b/docs/gallery/brazier/index.html
index 23321a96..f3200315 100644
--- a/docs/gallery/brazier/index.html
+++ b/docs/gallery/brazier/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/butter-churn/index.html b/docs/gallery/butter-churn/index.html
index 560f7bf3..09fc2327 100644
--- a/docs/gallery/butter-churn/index.html
+++ b/docs/gallery/butter-churn/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/campfire/index.html b/docs/gallery/campfire/index.html
index c298cbce..caec3f6d 100644
--- a/docs/gallery/campfire/index.html
+++ b/docs/gallery/campfire/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/car-mirror-symmetry/index.html b/docs/gallery/car-mirror-symmetry/index.html
index e92d364b..d29edb01 100644
--- a/docs/gallery/car-mirror-symmetry/index.html
+++ b/docs/gallery/car-mirror-symmetry/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/cart/index.html b/docs/gallery/cart/index.html
index 60ce6f92..e9a13815 100644
--- a/docs/gallery/cart/index.html
+++ b/docs/gallery/cart/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/chopping-block/index.html b/docs/gallery/chopping-block/index.html
index 7e950537..c1874772 100644
--- a/docs/gallery/chopping-block/index.html
+++ b/docs/gallery/chopping-block/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/collision-hull-proxy/index.html b/docs/gallery/collision-hull-proxy/index.html
index 2351b650..f60bca94 100644
--- a/docs/gallery/collision-hull-proxy/index.html
+++ b/docs/gallery/collision-hull-proxy/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/color-attribute-wheel/index.html b/docs/gallery/color-attribute-wheel/index.html
index a9d0e5e0..892777df 100644
--- a/docs/gallery/color-attribute-wheel/index.html
+++ b/docs/gallery/color-attribute-wheel/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/compositor-glare/index.html b/docs/gallery/compositor-glare/index.html
index 8cfbbd17..f8def181 100644
--- a/docs/gallery/compositor-glare/index.html
+++ b/docs/gallery/compositor-glare/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/crate-stack/index.html b/docs/gallery/crate-stack/index.html
index e26f066c..365687e8 100644
--- a/docs/gallery/crate-stack/index.html
+++ b/docs/gallery/crate-stack/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/cross-version-property-delete/index.html b/docs/gallery/cross-version-property-delete/index.html
index 3c5eac1c..1e31314a 100644
--- a/docs/gallery/cross-version-property-delete/index.html
+++ b/docs/gallery/cross-version-property-delete/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/curve-bevel-arc/index.html b/docs/gallery/curve-bevel-arc/index.html
index bc620057..80d90710 100644
--- a/docs/gallery/curve-bevel-arc/index.html
+++ b/docs/gallery/curve-bevel-arc/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/custom-normals-shade/index.html b/docs/gallery/custom-normals-shade/index.html
index 8f1aa591..b0b97c1d 100644
--- a/docs/gallery/custom-normals-shade/index.html
+++ b/docs/gallery/custom-normals-shade/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/damped-track-aim/index.html b/docs/gallery/damped-track-aim/index.html
index 811f1b18..8a06df6a 100644
--- a/docs/gallery/damped-track-aim/index.html
+++ b/docs/gallery/damped-track-aim/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/degenerate-bevel-weld/index.html b/docs/gallery/degenerate-bevel-weld/index.html
index d8356726..b9d348d9 100644
--- a/docs/gallery/degenerate-bevel-weld/index.html
+++ b/docs/gallery/degenerate-bevel-weld/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/depsgraph-export/index.html b/docs/gallery/depsgraph-export/index.html
index c2178ba8..32e11fb5 100644
--- a/docs/gallery/depsgraph-export/index.html
+++ b/docs/gallery/depsgraph-export/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/driver-wave/index.html b/docs/gallery/driver-wave/index.html
index fa50a8e3..ffce4d0e 100644
--- a/docs/gallery/driver-wave/index.html
+++ b/docs/gallery/driver-wave/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/export-preset-axis/index.html b/docs/gallery/export-preset-axis/index.html
index 05669891..f27c8415 100644
--- a/docs/gallery/export-preset-axis/index.html
+++ b/docs/gallery/export-preset-axis/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/fence-kit/index.html b/docs/gallery/fence-kit/index.html
index 25f84280..aa5a9054 100644
--- a/docs/gallery/fence-kit/index.html
+++ b/docs/gallery/fence-kit/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gltf-export-roundtrip/index.html b/docs/gallery/gltf-export-roundtrip/index.html
index 82f09013..cd58c38e 100644
--- a/docs/gallery/gltf-export-roundtrip/index.html
+++ b/docs/gallery/gltf-export-roundtrip/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gltf-skin-roundtrip/index.html b/docs/gallery/gltf-skin-roundtrip/index.html
index 298f9b65..d2449ed5 100644
--- a/docs/gallery/gltf-skin-roundtrip/index.html
+++ b/docs/gallery/gltf-skin-roundtrip/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gn-instance-grid/index.html b/docs/gallery/gn-instance-grid/index.html
index d9cd73c9..556c629b 100644
--- a/docs/gallery/gn-instance-grid/index.html
+++ b/docs/gallery/gn-instance-grid/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gn-modifier-inputs/index.html b/docs/gallery/gn-modifier-inputs/index.html
index 0987dc16..6a998932 100644
--- a/docs/gallery/gn-modifier-inputs/index.html
+++ b/docs/gallery/gn-modifier-inputs/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gn-sdf-remesh/index.html b/docs/gallery/gn-sdf-remesh/index.html
index 0b6334fd..44dbb819 100644
--- a/docs/gallery/gn-sdf-remesh/index.html
+++ b/docs/gallery/gn-sdf-remesh/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gn-sim-fountain/index.html b/docs/gallery/gn-sim-fountain/index.html
index 07517d9d..a1d9590c 100644
--- a/docs/gallery/gn-sim-fountain/index.html
+++ b/docs/gallery/gn-sim-fountain/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gn-socket-rename/index.html b/docs/gallery/gn-socket-rename/index.html
index 56a830c4..108a3db2 100644
--- a/docs/gallery/gn-socket-rename/index.html
+++ b/docs/gallery/gn-socket-rename/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gn-zone-iterate/index.html b/docs/gallery/gn-zone-iterate/index.html
index f8299322..00544673 100644
--- a/docs/gallery/gn-zone-iterate/index.html
+++ b/docs/gallery/gn-zone-iterate/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/gp-lineart-contour/index.html b/docs/gallery/gp-lineart-contour/index.html
index 28ca493b..58ce1693 100644
--- a/docs/gallery/gp-lineart-contour/index.html
+++ b/docs/gallery/gp-lineart-contour/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/grain-sacks/index.html b/docs/gallery/grain-sacks/index.html
index 7a39e755..15a16c04 100644
--- a/docs/gallery/grain-sacks/index.html
+++ b/docs/gallery/grain-sacks/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/grease-pencil-rosette/index.html b/docs/gallery/grease-pencil-rosette/index.html
index 6518c554..1e593d5a 100644
--- a/docs/gallery/grease-pencil-rosette/index.html
+++ b/docs/gallery/grease-pencil-rosette/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/grindstone/index.html b/docs/gallery/grindstone/index.html
index 2c498acd..4757da2f 100644
--- a/docs/gallery/grindstone/index.html
+++ b/docs/gallery/grindstone/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/hand-pump/index.html b/docs/gallery/hand-pump/index.html
index a52f948e..168d385f 100644
--- a/docs/gallery/hand-pump/index.html
+++ b/docs/gallery/hand-pump/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/hay-bale/index.html b/docs/gallery/hay-bale/index.html
index 5cb771d2..7a314be1 100644
--- a/docs/gallery/hay-bale/index.html
+++ b/docs/gallery/hay-bale/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/hitching-post/index.html b/docs/gallery/hitching-post/index.html
index df09b089..0311ac4b 100644
--- a/docs/gallery/hitching-post/index.html
+++ b/docs/gallery/hitching-post/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/image-pixels-testcard/index.html b/docs/gallery/image-pixels-testcard/index.html
index 9005d7ff..266f1c02 100644
--- a/docs/gallery/image-pixels-testcard/index.html
+++ b/docs/gallery/image-pixels-testcard/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/index.html b/docs/gallery/index.html
index 59c0754e..554b568e 100644
--- a/docs/gallery/index.html
+++ b/docs/gallery/index.html
@@ -4,14 +4,14 @@
Examples and Showcase — Blender Developer Tools
-
+
-
+
@@ -20,7 +20,7 @@
-
+
@@ -338,7 +357,7 @@
Examples and Showcase
- Runnable, smoke-gated Blender Python examples — each executed headless on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron), so every render reflects code that actually runs. Showcase pieces share the grid and carry the 'showcase' tag; they are budget-conformance props, not examples.
+ Runnable, smoke-gated Blender Python examples — each executed headless on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron), so every render reflects code that actually runs. Showcase pieces share the grid (use the Showcase filter to see only them); they are budget-conformance props, not examples.
@@ -349,56 +368,66 @@
Examples and Showcase
×
52 examples, 36 showcase pieces
+
+ All
+ Examples
+ Showcase
+
+
Sort
+
+ Gallery order
+ Name A–Z
+
+
Compact
Detailed
Tags
-
-
All
-
alpha
-
animation
-
armature
-
attributes
-
bevel
-
bmesh
-
compositor
-
constraints
-
context
-
curves
-
depsgraph
-
drivers
-
export
-
game-pipeline
-
geometry-nodes
-
grease-pencil
-
images
-
instancing
-
line-art
-
materials
-
mesh
-
modifiers
-
node-groups
-
objects
-
operators
-
parenting
-
performance
-
properties
-
rendering
-
sequencer
-
shape-keys
-
showcase
-
sky
-
transforms
-
uv
-
world
+
+ All
+ alpha
+ animation
+ armature
+ attributes
+ bevel
+ bmesh
+ compositor
+ constraints
+ context
+ curves
+ depsgraph
+ drivers
+ export
+ game-pipeline
+ geometry-nodes
+ grease-pencil
+ images
+ instancing
+ line-art
+ materials
+ mesh
+ modifiers
+ node-groups
+ objects
+ operators
+ parenting
+ performance
+ properties
+ rendering
+ sequencer
+ shape-keys
+ sky
+ transforms
+ uv
+ world
-
+
@@ -420,7 +449,7 @@
View example turntable →
-
+
@@ -431,7 +460,7 @@
View example gn-sdf-remesh →
-
+
@@ -442,7 +471,7 @@
View example depsgraph-export →
-
+
@@ -453,7 +482,7 @@
View example wave-displace →
-
+
@@ -464,7 +493,7 @@
View example driver-wave →
-
+
@@ -475,7 +504,7 @@
View example bmesh-gear →
-
+
@@ -486,7 +515,7 @@
View example shader-node-group →
-
+
@@ -497,7 +526,7 @@
View example temp-override-join →
-
+
@@ -508,7 +537,7 @@
View example gn-instance-grid →
-
+
@@ -519,7 +548,7 @@
View example gn-modifier-inputs →
-
+
@@ -530,7 +559,7 @@
View example shape-key-blend →
-
+
@@ -541,7 +570,7 @@
View example curve-bevel-arc →
-
+
@@ -552,7 +581,7 @@
View example compositor-glare →
-
+
@@ -563,7 +592,7 @@
View example damped-track-aim →
-
+
@@ -574,7 +603,7 @@
View example color-attribute-wheel →
-
+
@@ -585,7 +614,7 @@
View example parent-inverse-orrery →
-
+
@@ -596,7 +625,7 @@
View example grease-pencil-rosette →
-
+
@@ -607,7 +636,7 @@
View example armature-bend →
-
+
@@ -618,7 +647,7 @@
View example text-version-stamp →
-
+
@@ -629,7 +658,7 @@
View example image-pixels-testcard →
-
+
@@ -640,7 +669,7 @@
View example png-exr-alpha →
-
+
@@ -651,7 +680,7 @@
View example uv-layer-grid →
-
+
@@ -662,7 +691,7 @@
View example vse-cut-list →
-
+
@@ -673,7 +702,7 @@
View example gltf-export-roundtrip →
-
+
@@ -684,7 +713,7 @@
View example export-preset-axis →
-
+
@@ -695,7 +724,7 @@
View example lod-decimate-chain →
-
+
@@ -706,7 +735,7 @@
View example vertex-weight-limit →
-
+
@@ -717,7 +746,7 @@
View example triangulate-tangents →
-
+
@@ -728,7 +757,7 @@
View example gltf-skin-roundtrip →
-
+
@@ -739,7 +768,7 @@
View example vse-gamma-cross →
-
+
@@ -750,7 +779,7 @@
View example light-link-studio →
-
+
@@ -761,7 +790,7 @@
View example collision-hull-proxy →
-
+
@@ -772,7 +801,7 @@
View example custom-normals-shade →
-
+
@@ -783,7 +812,7 @@
View example sky-texture-sun-elevation →
-
+
@@ -794,7 +823,7 @@
View example gp-lineart-contour →
-
+
@@ -805,7 +834,7 @@
View example mesh-hygiene-audit →
-
+
@@ -816,7 +845,7 @@
View example prop-origin-transform →
-
+
@@ -827,7 +856,7 @@
View example soccer-ball-goldberg →
-
+
@@ -838,7 +867,7 @@
View example car-mirror-symmetry →
-
+
@@ -849,7 +878,7 @@
View example attribute-domain-shear →
-
+
@@ -860,7 +889,7 @@
View example degenerate-bevel-weld →
-
+
@@ -871,7 +900,7 @@
View example modular-kit-snap →
-
+
@@ -882,7 +911,7 @@
View example lightmap-uv-channel →
-
+
@@ -893,7 +922,7 @@
View example socket-attach-points →
-
+
@@ -904,7 +933,7 @@
View example vertex-color-ao →
-
+
@@ -915,7 +944,7 @@
-
+
@@ -926,7 +955,7 @@
View example usd-export-evaluation-mode →
-
+
@@ -937,7 +966,7 @@
View example gn-zone-iterate →
-
+
@@ -948,7 +977,7 @@
View example gn-sim-fountain →
-
+
@@ -959,7 +988,7 @@
View example bake-normal-high-to-low →
-
+
@@ -970,7 +999,7 @@
View example gn-socket-rename →
-
+
@@ -981,7 +1010,7 @@
View showcase piece shipping-crate →
-
+
@@ -992,7 +1021,7 @@
View showcase piece stone-well →
-
+
@@ -1003,7 +1032,7 @@
View showcase piece wooden-barrel →
-
+
@@ -1014,7 +1043,7 @@
View showcase piece campfire →
-
+
@@ -1025,7 +1054,7 @@
View showcase piece market-stall →
-
+
@@ -1036,7 +1065,7 @@
View showcase piece street-lantern →
-
+
@@ -1047,7 +1076,7 @@
View showcase piece treasure-chest →
-
+
@@ -1058,7 +1087,7 @@
View showcase piece terrain-scatter →
-
+
@@ -1069,7 +1098,7 @@
View showcase piece fence-kit →
-
+
@@ -1080,7 +1109,7 @@
View showcase piece watchtower →
-
+
@@ -1091,7 +1120,7 @@
View showcase piece cart →
-
+
@@ -1102,7 +1131,7 @@
View showcase piece park-bench →
-
+
@@ -1113,7 +1142,7 @@
View showcase piece wheelbarrow →
-
+
@@ -1124,7 +1153,7 @@
View showcase piece anvil →
-
+
@@ -1135,7 +1164,7 @@
View showcase piece water-trough →
-
+
@@ -1146,7 +1175,7 @@
View showcase piece hitching-post →
-
+
@@ -1157,7 +1186,7 @@
View showcase piece grindstone →
-
+
@@ -1168,7 +1197,7 @@
View showcase piece hand-pump →
-
+
@@ -1179,7 +1208,7 @@
View showcase piece signpost →
-
+
@@ -1190,7 +1219,7 @@
View showcase piece chopping-block →
-
+
@@ -1201,7 +1230,7 @@
View showcase piece wooden-bucket →
-
+
@@ -1212,7 +1241,7 @@
View showcase piece wall-torch →
-
+
@@ -1223,7 +1252,7 @@
View showcase piece tavern-stool →
-
+
@@ -1234,7 +1263,7 @@
View showcase piece iron-cauldron →
-
+
@@ -1245,7 +1274,7 @@
View showcase piece wooden-ladder →
-
+
@@ -1256,7 +1285,7 @@
View showcase piece hay-bale →
-
+
@@ -1267,7 +1296,7 @@
View showcase piece crate-stack →
-
+
@@ -1278,7 +1307,7 @@
View showcase piece stone-archway →
-
+
@@ -1289,7 +1318,7 @@
View showcase piece rope-bridge →
-
+
@@ -1300,7 +1329,7 @@
View showcase piece grain-sacks →
-
+
@@ -1311,7 +1340,7 @@
View showcase piece brazier →
-
+
@@ -1322,7 +1351,7 @@
View showcase piece apothecary-shelf →
-
+
@@ -1333,7 +1362,7 @@
View showcase piece wooden-yoke →
-
+
@@ -1344,7 +1373,7 @@
View showcase piece butter-churn →
-
+
@@ -1355,7 +1384,7 @@
View showcase piece bookshelf →
-
+
@@ -1368,7 +1397,7 @@
Nothing matches the current filters.
- Clear search and tags
+ Clear all filters
↑ Top
@@ -1391,18 +1420,35 @@
var count = document.getElementById('count');
var noResults = document.getElementById('noResults');
var resetFilters = document.getElementById('resetFilters');
- var densityBtns = Array.prototype.slice.call(document.querySelectorAll('.density-btn'));
+ var densityBtns = Array.prototype.slice.call(document.querySelectorAll('[data-density]'));
+ var kindBtns = Array.prototype.slice.call(document.querySelectorAll('[data-kind-filter]'));
+ var sortSel = document.getElementById('sort');
var tagsToggle = document.getElementById('tagsToggle');
var toTop = document.getElementById('toTop');
var total = cards.length;
var COUNT_LABEL = '52 examples, 36 showcase pieces';
var LS_KEY = 'bdt-gallery-density';
+ var KINDS = ['', 'examples', 'showcase'];
+ var SORTS = ['default', 'az'];
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
// Searchable text is the card's own DOM text: name, teaches, and the
// WITNESSES line (visually collapsed in compact mode, still in the DOM).
var haystacks = cards.map(function (c) { return c.textContent.toLowerCase(); });
- var state = { q: '', tag: '', density: 'compact' };
+ var cardTags = cards.map(function (c) { return (c.getAttribute('data-tags') || '').split(' '); });
+ var knownTags = chips.map(function (c) { return c.getAttribute('data-tag') || ''; })
+ .filter(function (t) { return t; });
+ var state = { q: '', tags: [], kind: '', sort: 'default', density: 'compact' };
+
+ // Fade card renders in once decoded; images already complete (cache,
+ // eager) are marked immediately so nothing stays invisible.
+ cards.forEach(function (c) {
+ var img = c.querySelector('.card-media img');
+ if (!img) return;
+ function done() { img.classList.add('is-loaded'); }
+ if (img.complete) { done(); }
+ else { img.addEventListener('load', done); img.addEventListener('error', done); }
+ });
function parseHash() {
var out = {};
@@ -1411,7 +1457,7 @@
if (i < 0) return;
var k = kv.slice(0, i), v = kv.slice(i + 1);
try { v = decodeURIComponent(v); } catch (e) {}
- if (k === 'q' || k === 'tag' || k === 'd') out[k] = v;
+ if (k === 'q' || k === 'tag' || k === 'd' || k === 'k' || k === 's') out[k] = v;
});
return out;
}
@@ -1419,61 +1465,106 @@
function writeHash() {
var parts = [];
if (state.q) parts.push('q=' + encodeURIComponent(state.q));
- if (state.tag) parts.push('tag=' + encodeURIComponent(state.tag));
+ if (state.tags.length) parts.push('tag=' + state.tags.map(encodeURIComponent).join(','));
+ if (state.kind) parts.push('k=' + state.kind);
+ if (state.sort !== 'default') parts.push('s=' + state.sort);
parts.push('d=' + state.density);
history.replaceState(null, '', location.pathname + location.search + '#' + parts.join('&'));
}
+ var hashTimer = 0;
+ function writeHashSoon() {
+ clearTimeout(hashTimer);
+ hashTimer = setTimeout(writeHash, 250);
+ }
function syncChips() {
chips.forEach(function (c) {
- c.classList.toggle('active', (c.getAttribute('data-tag') || '') === state.tag);
+ var t = c.getAttribute('data-tag') || '';
+ var on = t ? state.tags.indexOf(t) !== -1 : state.tags.length === 0;
+ c.classList.toggle('active', on);
+ c.setAttribute('aria-pressed', on ? 'true' : 'false');
});
- tagsToggle.classList.toggle('has-active', !!state.tag);
- // The chip row is collapsed on narrow screens; name the active tag
+ tagsToggle.classList.toggle('has-active', state.tags.length > 0);
+ // The chip row is collapsed on narrow screens; name the active tags
// on the toggle so a shared #tag= link is visibly filtered.
- tagsToggle.textContent = state.tag ? 'Tags: ' + state.tag : 'Tags';
+ tagsToggle.textContent = state.tags.length ? 'Tags: ' + state.tags.join(' + ') : 'Tags';
}
- function applyDensity() {
- de.classList.toggle('density-compact', state.density === 'compact');
- densityBtns.forEach(function (b) {
- var on = b.getAttribute('data-density') === state.density;
+ function syncSeg(btns, attr, value) {
+ btns.forEach(function (b) {
+ var on = b.getAttribute(attr) === value;
b.classList.toggle('active', on);
b.setAttribute('aria-pressed', on ? 'true' : 'false');
});
+ }
+
+ function applyDensity() {
+ de.classList.toggle('density-compact', state.density === 'compact');
+ syncSeg(densityBtns, 'data-density', state.density);
try { localStorage.setItem(LS_KEY, state.density); } catch (e) {}
}
+ function applySort() {
+ var order = cards.slice();
+ if (state.sort === 'az') {
+ order.sort(function (a, b) {
+ var x = a.getAttribute('data-name'), y = b.getAttribute('data-name');
+ return x < y ? -1 : x > y ? 1 : 0;
+ });
+ }
+ order.forEach(function (c) { grid.appendChild(c); });
+ sortSel.value = state.sort;
+ }
+
function applyFilters() {
var query = state.q.trim().toLowerCase();
var shown = 0;
cards.forEach(function (card, i) {
- var tagOK = !state.tag || (card.getAttribute('data-tags') || '').split(' ').indexOf(state.tag) !== -1;
+ var kindOK = !state.kind || card.getAttribute('data-kind') === state.kind;
+ var tagOK = state.tags.every(function (t) { return cardTags[i].indexOf(t) !== -1; });
var qOK = !query || haystacks[i].indexOf(query) !== -1;
- var show = tagOK && qOK;
+ var show = kindOK && tagOK && qOK;
card.classList.toggle('hidden', !show);
if (show) shown++;
});
- count.textContent = (query || state.tag) ? (shown + ' of ' + total) : COUNT_LABEL;
+ count.textContent = (query || state.tags.length || state.kind) ? (shown + ' of ' + total) : COUNT_LABEL;
noResults.hidden = shown !== 0;
qClear.hidden = !state.q;
+ syncSeg(kindBtns, 'data-kind-filter', state.kind);
}
q.addEventListener('input', function () {
state.q = q.value;
applyFilters();
- writeHash();
+ writeHashSoon();
});
qClear.addEventListener('click', function () {
q.value = ''; state.q = '';
applyFilters(); writeHash(); q.focus();
});
+ // "All" clears the tag set; any other chip toggles itself, and
+ // several active chips narrow the grid (AND, not OR).
chips.forEach(function (chip) {
chip.addEventListener('click', function () {
- state.tag = chip.getAttribute('data-tag') || '';
+ var t = chip.getAttribute('data-tag') || '';
+ if (!t) { state.tags = []; }
+ else {
+ var at = state.tags.indexOf(t);
+ if (at === -1) state.tags.push(t); else state.tags.splice(at, 1);
+ }
syncChips(); applyFilters(); writeHash();
});
});
+ kindBtns.forEach(function (b) {
+ b.addEventListener('click', function () {
+ state.kind = b.getAttribute('data-kind-filter');
+ applyFilters(); writeHash();
+ });
+ });
+ sortSel.addEventListener('change', function () {
+ state.sort = SORTS.indexOf(sortSel.value) !== -1 ? sortSel.value : 'default';
+ applySort(); writeHash();
+ });
densityBtns.forEach(function (b) {
b.addEventListener('click', function () {
state.density = b.getAttribute('data-density');
@@ -1481,7 +1572,7 @@
});
});
resetFilters.addEventListener('click', function () {
- state.q = ''; state.tag = ''; q.value = '';
+ state.q = ''; state.tags = []; state.kind = ''; q.value = '';
syncChips(); applyFilters(); writeHash(); q.focus();
});
tagsToggle.addEventListener('click', function () {
@@ -1513,7 +1604,15 @@
// Restore state: URL hash wins; density falls back to localStorage.
var h = parseHash();
state.q = h.q || '';
- state.tag = h.tag || '';
+ state.kind = KINDS.indexOf(h.k) !== -1 ? h.k : '';
+ state.sort = SORTS.indexOf(h.s) !== -1 ? h.s : 'default';
+ // Tags arrive comma-separated. "showcase" is the kind filter now, not
+ // a chip, but older links (the landing page's among them) still say
+ // #tag=showcase. A tag no chip knows would silently show zero cards.
+ (h.tag || '').split(',').forEach(function (t) {
+ if (t === 'showcase') { state.kind = 'showcase'; }
+ else if (knownTags.indexOf(t) !== -1 && state.tags.indexOf(t) === -1) { state.tags.push(t); }
+ });
if (h.d === 'compact' || h.d === 'detailed') state.density = h.d;
else {
try {
@@ -1521,12 +1620,13 @@
if (s === 'compact' || s === 'detailed') state.density = s;
} catch (e) {}
}
- // A tag in the hash that no chip knows would silently show zero cards.
- var known = chips.some(function (c) { return (c.getAttribute('data-tag') || '') === state.tag; });
- if (!known) state.tag = '';
q.value = state.q;
syncChips();
+ // A deep-linked tag may sit off-screen in the chip scroll strip.
+ var firstOn = chipsEl.querySelector('.chip.active[data-tag]:not([data-tag=""])');
+ if (firstOn) { chipsEl.scrollLeft = firstOn.offsetLeft - chipsEl.offsetLeft - 8; }
applyDensity();
+ applySort();
applyFilters();
})();
diff --git a/docs/gallery/iron-cauldron/index.html b/docs/gallery/iron-cauldron/index.html
index 2493b6dd..dd224077 100644
--- a/docs/gallery/iron-cauldron/index.html
+++ b/docs/gallery/iron-cauldron/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/light-link-studio/index.html b/docs/gallery/light-link-studio/index.html
index dcedbc3b..ecd2946f 100644
--- a/docs/gallery/light-link-studio/index.html
+++ b/docs/gallery/light-link-studio/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/lightmap-uv-channel/index.html b/docs/gallery/lightmap-uv-channel/index.html
index edbfe2a2..3e2574e9 100644
--- a/docs/gallery/lightmap-uv-channel/index.html
+++ b/docs/gallery/lightmap-uv-channel/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/lod-decimate-chain/index.html b/docs/gallery/lod-decimate-chain/index.html
index 0a1a485b..c050d176 100644
--- a/docs/gallery/lod-decimate-chain/index.html
+++ b/docs/gallery/lod-decimate-chain/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/market-stall/index.html b/docs/gallery/market-stall/index.html
index 3805b54a..3fb60e33 100644
--- a/docs/gallery/market-stall/index.html
+++ b/docs/gallery/market-stall/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/mesh-hygiene-audit/index.html b/docs/gallery/mesh-hygiene-audit/index.html
index 99d5c7e2..17f96dee 100644
--- a/docs/gallery/mesh-hygiene-audit/index.html
+++ b/docs/gallery/mesh-hygiene-audit/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/modular-kit-snap/index.html b/docs/gallery/modular-kit-snap/index.html
index cac7f91d..cfd874c2 100644
--- a/docs/gallery/modular-kit-snap/index.html
+++ b/docs/gallery/modular-kit-snap/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/parent-inverse-orrery/index.html b/docs/gallery/parent-inverse-orrery/index.html
index ff525f07..52ce4d98 100644
--- a/docs/gallery/parent-inverse-orrery/index.html
+++ b/docs/gallery/parent-inverse-orrery/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/park-bench/index.html b/docs/gallery/park-bench/index.html
index 7c166c4b..20cced37 100644
--- a/docs/gallery/park-bench/index.html
+++ b/docs/gallery/park-bench/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/png-exr-alpha/index.html b/docs/gallery/png-exr-alpha/index.html
index 06b14bbb..25500d2a 100644
--- a/docs/gallery/png-exr-alpha/index.html
+++ b/docs/gallery/png-exr-alpha/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/prop-origin-transform/index.html b/docs/gallery/prop-origin-transform/index.html
index 53a585cd..2b2ef45e 100644
--- a/docs/gallery/prop-origin-transform/index.html
+++ b/docs/gallery/prop-origin-transform/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/rope-bridge/index.html b/docs/gallery/rope-bridge/index.html
index 2a23588e..3a87a1c4 100644
--- a/docs/gallery/rope-bridge/index.html
+++ b/docs/gallery/rope-bridge/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/shader-node-group/index.html b/docs/gallery/shader-node-group/index.html
index 51f846f6..884045e7 100644
--- a/docs/gallery/shader-node-group/index.html
+++ b/docs/gallery/shader-node-group/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/shape-key-blend/index.html b/docs/gallery/shape-key-blend/index.html
index 3b8dd633..b07f6306 100644
--- a/docs/gallery/shape-key-blend/index.html
+++ b/docs/gallery/shape-key-blend/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/shipping-crate/index.html b/docs/gallery/shipping-crate/index.html
index e4eed5e2..9ffc14c7 100644
--- a/docs/gallery/shipping-crate/index.html
+++ b/docs/gallery/shipping-crate/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/signpost/index.html b/docs/gallery/signpost/index.html
index cacc311f..d61589b7 100644
--- a/docs/gallery/signpost/index.html
+++ b/docs/gallery/signpost/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/sky-texture-sun-elevation/index.html b/docs/gallery/sky-texture-sun-elevation/index.html
index 4d989ed2..12c2dfcc 100644
--- a/docs/gallery/sky-texture-sun-elevation/index.html
+++ b/docs/gallery/sky-texture-sun-elevation/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/soccer-ball-goldberg/index.html b/docs/gallery/soccer-ball-goldberg/index.html
index 825680d3..22093119 100644
--- a/docs/gallery/soccer-ball-goldberg/index.html
+++ b/docs/gallery/soccer-ball-goldberg/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/socket-attach-points/index.html b/docs/gallery/socket-attach-points/index.html
index 06f9b15b..c1e459ff 100644
--- a/docs/gallery/socket-attach-points/index.html
+++ b/docs/gallery/socket-attach-points/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/stone-archway/index.html b/docs/gallery/stone-archway/index.html
index 0df16a9a..45f1ad9e 100644
--- a/docs/gallery/stone-archway/index.html
+++ b/docs/gallery/stone-archway/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/stone-well/index.html b/docs/gallery/stone-well/index.html
index 6e505a47..0b356390 100644
--- a/docs/gallery/stone-well/index.html
+++ b/docs/gallery/stone-well/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/street-lantern/index.html b/docs/gallery/street-lantern/index.html
index e1d8a37c..4bce7d48 100644
--- a/docs/gallery/street-lantern/index.html
+++ b/docs/gallery/street-lantern/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/swatch-grid/index.html b/docs/gallery/swatch-grid/index.html
index a5ba1a00..ed19cac8 100644
--- a/docs/gallery/swatch-grid/index.html
+++ b/docs/gallery/swatch-grid/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/tavern-stool/index.html b/docs/gallery/tavern-stool/index.html
index a69fd397..4d8b1227 100644
--- a/docs/gallery/tavern-stool/index.html
+++ b/docs/gallery/tavern-stool/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/temp-override-join/index.html b/docs/gallery/temp-override-join/index.html
index d32c80fd..f2f2944f 100644
--- a/docs/gallery/temp-override-join/index.html
+++ b/docs/gallery/temp-override-join/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/terrain-scatter/index.html b/docs/gallery/terrain-scatter/index.html
index ef909054..4cd8a4b6 100644
--- a/docs/gallery/terrain-scatter/index.html
+++ b/docs/gallery/terrain-scatter/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/text-version-stamp/index.html b/docs/gallery/text-version-stamp/index.html
index d3854aab..e6d33bc6 100644
--- a/docs/gallery/text-version-stamp/index.html
+++ b/docs/gallery/text-version-stamp/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/treasure-chest/index.html b/docs/gallery/treasure-chest/index.html
index d4f546f0..d5a86af3 100644
--- a/docs/gallery/treasure-chest/index.html
+++ b/docs/gallery/treasure-chest/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/triangulate-tangents/index.html b/docs/gallery/triangulate-tangents/index.html
index 57b5fc44..10762df6 100644
--- a/docs/gallery/triangulate-tangents/index.html
+++ b/docs/gallery/triangulate-tangents/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/turntable/index.html b/docs/gallery/turntable/index.html
index c0d849f8..237e4fc6 100644
--- a/docs/gallery/turntable/index.html
+++ b/docs/gallery/turntable/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/usd-export-evaluation-mode/index.html b/docs/gallery/usd-export-evaluation-mode/index.html
index ab6c68cf..e2abb14b 100644
--- a/docs/gallery/usd-export-evaluation-mode/index.html
+++ b/docs/gallery/usd-export-evaluation-mode/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/uv-layer-grid/index.html b/docs/gallery/uv-layer-grid/index.html
index cef198d9..825999fb 100644
--- a/docs/gallery/uv-layer-grid/index.html
+++ b/docs/gallery/uv-layer-grid/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/vertex-color-ao/index.html b/docs/gallery/vertex-color-ao/index.html
index fcc07417..6354c76d 100644
--- a/docs/gallery/vertex-color-ao/index.html
+++ b/docs/gallery/vertex-color-ao/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/vertex-weight-limit/index.html b/docs/gallery/vertex-weight-limit/index.html
index d71e82c3..9ffa7df6 100644
--- a/docs/gallery/vertex-weight-limit/index.html
+++ b/docs/gallery/vertex-weight-limit/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/vse-cut-list/index.html b/docs/gallery/vse-cut-list/index.html
index f58d5dde..5c4106a1 100644
--- a/docs/gallery/vse-cut-list/index.html
+++ b/docs/gallery/vse-cut-list/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/vse-gamma-cross/index.html b/docs/gallery/vse-gamma-cross/index.html
index 820f6216..5ba44087 100644
--- a/docs/gallery/vse-gamma-cross/index.html
+++ b/docs/gallery/vse-gamma-cross/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wall-torch/index.html b/docs/gallery/wall-torch/index.html
index c0a4ec62..1327ed05 100644
--- a/docs/gallery/wall-torch/index.html
+++ b/docs/gallery/wall-torch/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/watchtower/index.html b/docs/gallery/watchtower/index.html
index e2659c8d..d58e21b2 100644
--- a/docs/gallery/watchtower/index.html
+++ b/docs/gallery/watchtower/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/water-trough/index.html b/docs/gallery/water-trough/index.html
index 18fa13fe..3b12b556 100644
--- a/docs/gallery/water-trough/index.html
+++ b/docs/gallery/water-trough/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wave-displace/index.html b/docs/gallery/wave-displace/index.html
index a7f602b2..955e9980 100644
--- a/docs/gallery/wave-displace/index.html
+++ b/docs/gallery/wave-displace/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wheelbarrow/index.html b/docs/gallery/wheelbarrow/index.html
index 0f2aea33..9c6da250 100644
--- a/docs/gallery/wheelbarrow/index.html
+++ b/docs/gallery/wheelbarrow/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wooden-barrel/index.html b/docs/gallery/wooden-barrel/index.html
index 58939eb9..f42c341c 100644
--- a/docs/gallery/wooden-barrel/index.html
+++ b/docs/gallery/wooden-barrel/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wooden-bucket/index.html b/docs/gallery/wooden-bucket/index.html
index d77582da..f6c1c0de 100644
--- a/docs/gallery/wooden-bucket/index.html
+++ b/docs/gallery/wooden-bucket/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wooden-ladder/index.html b/docs/gallery/wooden-ladder/index.html
index 08ed12d8..eb1f9e8d 100644
--- a/docs/gallery/wooden-ladder/index.html
+++ b/docs/gallery/wooden-ladder/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/docs/gallery/wooden-yoke/index.html b/docs/gallery/wooden-yoke/index.html
index c7a68754..a9c28caf 100644
--- a/docs/gallery/wooden-yoke/index.html
+++ b/docs/gallery/wooden-yoke/index.html
@@ -104,6 +104,12 @@
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -123,6 +129,14 @@
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -160,8 +174,12 @@
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -200,6 +218,7 @@
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -306,8 +325,8 @@
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
diff --git a/examples/gallery.json b/examples/gallery.json
index e0f3f0b8..08fd2780 100644
--- a/examples/gallery.json
+++ b/examples/gallery.json
@@ -1,7 +1,7 @@
{
"_comment": "FORWARD-COMPATIBLE SOURCE OF TRUTH for the examples gallery. The local page at docs/gallery/index.html is GENERATED from this file by scripts/build_gallery.py -- do not hand-edit the HTML. When the fleet template (Developer-Tools-Directory: site-template/build_site.py + template.html.j2) gains examples support (see ROADMAP: 'Fleet Pages examples support'), it reads this same file and the local page is retired. That migration is a lift-and-shift, not a rewrite: keep this schema stable. Per-entry schema: {name, dir, teaches, witnessesFix, hero, preview, tags?}; hero/preview/dir are repo-root-relative; tags is an optional additive list driving the gallery filter chips. build_gallery.py also emits a detail page per example at docs/gallery//.",
"title": "Examples and Showcase",
- "description": "Runnable, smoke-gated Blender Python examples — each executed headless on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron), so every render reflects code that actually runs. Showcase pieces share the grid and carry the 'showcase' tag; they are budget-conformance props, not examples.",
+ "description": "Runnable, smoke-gated Blender Python examples — each executed headless on Blender 5.2 LTS and 4.5 LTS (5.1 on the weekly cron), so every render reflects code that actually runs. Showcase pieces share the grid (use the Showcase filter to see only them); they are budget-conformance props, not examples.",
"repoBaseUrl": "https://github.com/TMHSDigital/Blender-Developer-Tools/tree/main",
"siteBaseUrl": "https://tmhsdigital.github.io/Blender-Developer-Tools",
"examples": [
diff --git a/scripts/build_gallery.py b/scripts/build_gallery.py
index d4a8ffc4..78a02ae3 100644
--- a/scripts/build_gallery.py
+++ b/scripts/build_gallery.py
@@ -208,6 +208,12 @@ def check_alts(entries: list) -> None:
.density-btn + .density-btn { border-left: 1px solid var(--border); }
.density-btn:hover { color: var(--select); }
.density-btn.active { background: var(--select); color: #1a1b1e; }
+ /* Segmented groups clip overflow, so the ring has to sit inside. */
+ .density-btn:focus-visible, .chip:focus-visible { outline-offset: -2px; }
+ .sort select { background: var(--surface-2); border: 1px solid var(--border); color: var(--text-dim);
+ border-radius: var(--radius); padding: 0.3rem 0.5rem; cursor: pointer;
+ font-family: var(--font-mono); font-size: 0.68rem; letter-spacing: 0.04em; text-transform: uppercase; }
+ .sort select:hover, .sort select:focus { color: var(--select); border-color: var(--select); outline: none; }
.tags-toggle { display: none; background: var(--surface-2); border: 1px solid var(--border);
color: var(--text-dim); border-radius: 3px; padding: 0.3rem 0.7rem; cursor: pointer;
font-family: var(--font-mono); font-size: 0.7rem; letter-spacing: 0.04em; text-transform: uppercase; }
@@ -227,6 +233,14 @@ def check_alts(entries: list) -> None:
transition: color 0.15s, border-color 0.15s; }
.chip:hover { color: var(--select); border-color: var(--select); }
.chip.active { color: #1a1b1e; background: var(--select); border-color: var(--select); }
+ @media (max-width: 559px) {
+ .controls-inner { padding: 0.45rem 1rem 0.5rem; gap: 0.4rem; }
+ .controls-row { gap: 0.4rem; }
+ .searchwrap { flex-basis: 100%; }
+ .count { position: absolute; width: 1px; height: 1px; overflow: hidden;
+ clip: rect(0 0 0 0); white-space: nowrap; }
+ .density-btn { padding: 0.36rem 0.5rem; }
+ }
@media (max-width: 719px) {
html.js .tags-toggle { display: inline-block; }
html.js .chips { display: none; }
@@ -264,8 +278,12 @@ def check_alts(entries: list) -> None:
transition: outline-color 0.12s ease, border-color 0.12s ease; }
.card:hover { border-color: var(--select); outline-color: var(--select); }
.card.hidden { display: none; }
- .card-media { display: block; background: var(--bg2); line-height: 0; }
- .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover; }
+ .card-media { display: block; background: var(--bg2); line-height: 0; overflow: hidden; }
+ .card-media img { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
+ transition: transform 0.35s ease, opacity 0.3s ease; }
+ .card:hover .card-media img { transform: scale(1.03); }
+ html.js .grid .card-media img { opacity: 0; }
+ html.js .grid .card-media img.is-loaded { opacity: 1; }
.card-body { padding: 1.15rem 1.4rem 1.45rem; display: flex; flex-direction: column; flex: 1 1 auto; }
.card-body h2 { font-family: var(--font-mono); font-size: 1rem; font-weight: 400; margin-bottom: 0.5rem; }
.card-body h2 a { color: var(--text); }
@@ -304,6 +322,7 @@ def check_alts(entries: list) -> None:
.md h1, .md h2, .md h3 { letter-spacing: -0.01em; margin: 1.4rem 0 0.6rem; line-height: 1.25; }
.md h1 { font-size: 1.35rem; } .md h2 { font-size: 1.15rem; } .md h3 { font-size: 1rem; }
.md p { margin: 0.7rem 0; }
+ .md > p, .md > ul, .md > ol, .md > h2, .md > h3 { max-width: 75ch; }
.md ul, .md ol { margin: 0.7rem 0 0.7rem 1.4rem; }
.md li { margin: 0.3rem 0; }
.md .table-wrap { overflow-x: auto; margin: 0.9rem 0; }
@@ -410,8 +429,8 @@ def check_alts(entries: list) -> None:
}
@media (prefers-reduced-motion: reduce) {
html { scroll-behavior: auto; }
- .card { transition: none; }
- .card:hover { transform: none; }
+ .card, .card-media img { transition: none; }
+ .card:hover .card-media img { transform: none; }
.to-top { transition: none; }
}
__HEADJS__
@@ -473,18 +492,35 @@ def check_alts(entries: list) -> None:
var count = document.getElementById('count');
var noResults = document.getElementById('noResults');
var resetFilters = document.getElementById('resetFilters');
- var densityBtns = Array.prototype.slice.call(document.querySelectorAll('.density-btn'));
+ var densityBtns = Array.prototype.slice.call(document.querySelectorAll('[data-density]'));
+ var kindBtns = Array.prototype.slice.call(document.querySelectorAll('[data-kind-filter]'));
+ var sortSel = document.getElementById('sort');
var tagsToggle = document.getElementById('tagsToggle');
var toTop = document.getElementById('toTop');
var total = cards.length;
var COUNT_LABEL = '__COUNT_LABEL__';
var LS_KEY = 'bdt-gallery-density';
+ var KINDS = ['', 'examples', 'showcase'];
+ var SORTS = ['default', 'az'];
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
// Searchable text is the card's own DOM text: name, teaches, and the
// WITNESSES line (visually collapsed in compact mode, still in the DOM).
var haystacks = cards.map(function (c) { return c.textContent.toLowerCase(); });
- var state = { q: '', tag: '', density: 'compact' };
+ var cardTags = cards.map(function (c) { return (c.getAttribute('data-tags') || '').split(' '); });
+ var knownTags = chips.map(function (c) { return c.getAttribute('data-tag') || ''; })
+ .filter(function (t) { return t; });
+ var state = { q: '', tags: [], kind: '', sort: 'default', density: 'compact' };
+
+ // Fade card renders in once decoded; images already complete (cache,
+ // eager) are marked immediately so nothing stays invisible.
+ cards.forEach(function (c) {
+ var img = c.querySelector('.card-media img');
+ if (!img) return;
+ function done() { img.classList.add('is-loaded'); }
+ if (img.complete) { done(); }
+ else { img.addEventListener('load', done); img.addEventListener('error', done); }
+ });
function parseHash() {
var out = {};
@@ -493,7 +529,7 @@ def check_alts(entries: list) -> None:
if (i < 0) return;
var k = kv.slice(0, i), v = kv.slice(i + 1);
try { v = decodeURIComponent(v); } catch (e) {}
- if (k === 'q' || k === 'tag' || k === 'd') out[k] = v;
+ if (k === 'q' || k === 'tag' || k === 'd' || k === 'k' || k === 's') out[k] = v;
});
return out;
}
@@ -501,61 +537,106 @@ def check_alts(entries: list) -> None:
function writeHash() {
var parts = [];
if (state.q) parts.push('q=' + encodeURIComponent(state.q));
- if (state.tag) parts.push('tag=' + encodeURIComponent(state.tag));
+ if (state.tags.length) parts.push('tag=' + state.tags.map(encodeURIComponent).join(','));
+ if (state.kind) parts.push('k=' + state.kind);
+ if (state.sort !== 'default') parts.push('s=' + state.sort);
parts.push('d=' + state.density);
history.replaceState(null, '', location.pathname + location.search + '#' + parts.join('&'));
}
+ var hashTimer = 0;
+ function writeHashSoon() {
+ clearTimeout(hashTimer);
+ hashTimer = setTimeout(writeHash, 250);
+ }
function syncChips() {
chips.forEach(function (c) {
- c.classList.toggle('active', (c.getAttribute('data-tag') || '') === state.tag);
+ var t = c.getAttribute('data-tag') || '';
+ var on = t ? state.tags.indexOf(t) !== -1 : state.tags.length === 0;
+ c.classList.toggle('active', on);
+ c.setAttribute('aria-pressed', on ? 'true' : 'false');
});
- tagsToggle.classList.toggle('has-active', !!state.tag);
- // The chip row is collapsed on narrow screens; name the active tag
+ tagsToggle.classList.toggle('has-active', state.tags.length > 0);
+ // The chip row is collapsed on narrow screens; name the active tags
// on the toggle so a shared #tag= link is visibly filtered.
- tagsToggle.textContent = state.tag ? 'Tags: ' + state.tag : 'Tags';
+ tagsToggle.textContent = state.tags.length ? 'Tags: ' + state.tags.join(' + ') : 'Tags';
}
- function applyDensity() {
- de.classList.toggle('density-compact', state.density === 'compact');
- densityBtns.forEach(function (b) {
- var on = b.getAttribute('data-density') === state.density;
+ function syncSeg(btns, attr, value) {
+ btns.forEach(function (b) {
+ var on = b.getAttribute(attr) === value;
b.classList.toggle('active', on);
b.setAttribute('aria-pressed', on ? 'true' : 'false');
});
+ }
+
+ function applyDensity() {
+ de.classList.toggle('density-compact', state.density === 'compact');
+ syncSeg(densityBtns, 'data-density', state.density);
try { localStorage.setItem(LS_KEY, state.density); } catch (e) {}
}
+ function applySort() {
+ var order = cards.slice();
+ if (state.sort === 'az') {
+ order.sort(function (a, b) {
+ var x = a.getAttribute('data-name'), y = b.getAttribute('data-name');
+ return x < y ? -1 : x > y ? 1 : 0;
+ });
+ }
+ order.forEach(function (c) { grid.appendChild(c); });
+ sortSel.value = state.sort;
+ }
+
function applyFilters() {
var query = state.q.trim().toLowerCase();
var shown = 0;
cards.forEach(function (card, i) {
- var tagOK = !state.tag || (card.getAttribute('data-tags') || '').split(' ').indexOf(state.tag) !== -1;
+ var kindOK = !state.kind || card.getAttribute('data-kind') === state.kind;
+ var tagOK = state.tags.every(function (t) { return cardTags[i].indexOf(t) !== -1; });
var qOK = !query || haystacks[i].indexOf(query) !== -1;
- var show = tagOK && qOK;
+ var show = kindOK && tagOK && qOK;
card.classList.toggle('hidden', !show);
if (show) shown++;
});
- count.textContent = (query || state.tag) ? (shown + ' of ' + total) : COUNT_LABEL;
+ count.textContent = (query || state.tags.length || state.kind) ? (shown + ' of ' + total) : COUNT_LABEL;
noResults.hidden = shown !== 0;
qClear.hidden = !state.q;
+ syncSeg(kindBtns, 'data-kind-filter', state.kind);
}
q.addEventListener('input', function () {
state.q = q.value;
applyFilters();
- writeHash();
+ writeHashSoon();
});
qClear.addEventListener('click', function () {
q.value = ''; state.q = '';
applyFilters(); writeHash(); q.focus();
});
+ // "All" clears the tag set; any other chip toggles itself, and
+ // several active chips narrow the grid (AND, not OR).
chips.forEach(function (chip) {
chip.addEventListener('click', function () {
- state.tag = chip.getAttribute('data-tag') || '';
+ var t = chip.getAttribute('data-tag') || '';
+ if (!t) { state.tags = []; }
+ else {
+ var at = state.tags.indexOf(t);
+ if (at === -1) state.tags.push(t); else state.tags.splice(at, 1);
+ }
syncChips(); applyFilters(); writeHash();
});
});
+ kindBtns.forEach(function (b) {
+ b.addEventListener('click', function () {
+ state.kind = b.getAttribute('data-kind-filter');
+ applyFilters(); writeHash();
+ });
+ });
+ sortSel.addEventListener('change', function () {
+ state.sort = SORTS.indexOf(sortSel.value) !== -1 ? sortSel.value : 'default';
+ applySort(); writeHash();
+ });
densityBtns.forEach(function (b) {
b.addEventListener('click', function () {
state.density = b.getAttribute('data-density');
@@ -563,7 +644,7 @@ def check_alts(entries: list) -> None:
});
});
resetFilters.addEventListener('click', function () {
- state.q = ''; state.tag = ''; q.value = '';
+ state.q = ''; state.tags = []; state.kind = ''; q.value = '';
syncChips(); applyFilters(); writeHash(); q.focus();
});
tagsToggle.addEventListener('click', function () {
@@ -595,7 +676,15 @@ def check_alts(entries: list) -> None:
// Restore state: URL hash wins; density falls back to localStorage.
var h = parseHash();
state.q = h.q || '';
- state.tag = h.tag || '';
+ state.kind = KINDS.indexOf(h.k) !== -1 ? h.k : '';
+ state.sort = SORTS.indexOf(h.s) !== -1 ? h.s : 'default';
+ // Tags arrive comma-separated. "showcase" is the kind filter now, not
+ // a chip, but older links (the landing page's among them) still say
+ // #tag=showcase. A tag no chip knows would silently show zero cards.
+ (h.tag || '').split(',').forEach(function (t) {
+ if (t === 'showcase') { state.kind = 'showcase'; }
+ else if (knownTags.indexOf(t) !== -1 && state.tags.indexOf(t) === -1) { state.tags.push(t); }
+ });
if (h.d === 'compact' || h.d === 'detailed') state.density = h.d;
else {
try {
@@ -603,12 +692,13 @@ def check_alts(entries: list) -> None:
if (s === 'compact' || s === 'detailed') state.density = s;
} catch (e) {}
}
- // A tag in the hash that no chip knows would silently show zero cards.
- var known = chips.some(function (c) { return (c.getAttribute('data-tag') || '') === state.tag; });
- if (!known) state.tag = '';
q.value = state.q;
syncChips();
+ // A deep-linked tag may sit off-screen in the chip scroll strip.
+ var firstOn = chipsEl.querySelector('.chip.active[data-tag]:not([data-tag=""])');
+ if (firstOn) { chipsEl.scrollLeft = firstOn.offsetLeft - chipsEl.offsetLeft - 8; }
applyDensity();
+ applySort();
applyFilters();
})();
"""
@@ -714,7 +804,7 @@ def check_alts(entries: list) -> None:
})();
"""
-CARD = """
+CARD = """
@@ -1167,15 +1257,15 @@ def build_index(data: dict, *, base: str, repo_root_url: str, site: str) -> str:
else f"{example_total} examples"
)
- all_tags = sorted({t for ex in examples for t in ex.get("tags", [])})
+ all_tags = sorted({t for ex in examples for t in ex.get("tags", [])} - {"showcase"})
chips_html = ""
if all_tags:
- chips = ['All ']
+ chips = ['All ']
chips += [
- f'{html.escape(t)} '
+ f'{html.escape(t)} '
for t in all_tags
]
- chips_html = (' \n '
+ chips_html = ('
\n '
+ "\n ".join(chips) + "\n
\n")
# Sticky controls bar. Every control is inert but harmless with JS
@@ -1191,6 +1281,17 @@ def build_index(data: dict, *, base: str, repo_root_url: str, site: str) -> str:
'
× \n'
'
\n'
f' {html.escape(count_label)} \n'
+ ' \n'
+ ' All \n'
+ ' Examples \n'
+ ' Showcase \n'
+ '
\n'
+ ' Sort \n'
+ ' \n'
+ ' Gallery order \n'
+ ' Name A–Z \n'
+ ' \n'
+ ' \n'
' \n'
' Compact \n'
' Detailed \n'
@@ -1213,6 +1314,7 @@ def build_index(data: dict, *, base: str, repo_root_url: str, site: str) -> str:
.replace("__HERO__", html.escape(page_relative(ex["hero"]), quote=True))
.replace("__ALT__", html.escape(alt, quote=True))
.replace("__NAME__", html.escape(ex["name"]))
+ .replace("__KINDKEY__", "showcase" if kind_noun(ex) == "showcase piece" else "examples")
.replace("__KIND__", kind_noun(ex))
.replace("__TEACHES__", html.escape(ex["teaches"]))
.replace("__WITNESSES__", html.escape(ex["witnessesFix"]))
@@ -1228,7 +1330,7 @@ def build_index(data: dict, *, base: str, repo_root_url: str, site: str) -> str:
+ "\n".join(cards)
+ "\n
\n"
+ ' Nothing matches the current filters.\n'
- + ' Clear search and tags
\n'
+ + ' Clear all filters \n'
+ " \n"
+ ' ↑ Top '
)