/* rbhomevitrine 1.27.1 (24 Oct 2026; 1.27.1: quiet Privacy and Terms links at the bottom right of Home, mirroring the Partner Portal pill at the bottom left (London); 1.27.0 (24 Oct 2026; 1.27: London's legibility mix, picked on the switchboard preview C1GZCTNA7TwR2WQoMgQ4fM: the room stays pure black, the page-wide shadow is cut (vignette down to a faint top fade, smaller heading pool, lighter in-case shadow), every case keeps a low warm light at rest (strength 1.0), and a case's turn or hover goes brighter than before; labels unchanged; 1.26.1 (23 Oct 2026; 1.26.1: a tall exhibit (basil, cosmos, bottlebrush) is placed first on its own row, so the cosmos is not crowded out now that fewer rows fit; 1.26: each case's label names the exhibit it holds - scientific name first (London: "lean on the more scientific names"), common name, formula or type small beneath; before, the labels showed the case colour names; 1.25.0 (17 Oct 2026; 1.25: the wall is filled, no empty object cases (London) - twelve new exhibits tied to the cases, each a front still in the same warm cinematic light and sized from its real size: Sulawesi - garnierite nickel ore, serpentinite, a blue coral (Heliopora), a giant clam (Tridacna), a babirusa skull; Kepa Kurl - a gypsum desert rose, a Banksia flower and cone, a bushy-yate gum nut (Eucalyptus lehmannii); Peru/Andes - chrysocolla and azurite (copper minerals); astrobiology - olivine and the Mars meteorite ALH 84001 (a 2 cm chip, the smallest thing on the wall); each colour holds a pool of objects matched to its tone, and a case with no free object of its colour borrows a small one not yet in its row; the Hraschina meteorite is removed (its licence is non-commercial); 1.24.0 (12 Oct 2026; 1.24: the dark pool behind the heading is a fixed size centred on it, so it no longer grows and shrinks as the motto changes between glyphs and English, and its edge is softer; 1.23.0 (10 Oct 2026; 1.23: the floor is gone (London picked 'no floor' from the mockups) - the reflection, the floor band and the pools on it are removed and the wall fills the screen top to bottom again, as before 1.20; the darkening toward the edges stays; 1.22: the fixtures disappear into the dark when a case is off (London: still visible as clear as day in dark boxes) - the can is near-black and fades to almost nothing unlit, only showing when its own light comes on; 1.21: a real light fixture (London: the semicircle lamps looked rudimentary and stayed whitish when off) - each case has a small dark-bronze spotlight can on a ceiling plate, shaded like a cylinder, with a dark glass lens that only glows warm when the light is on; the light it throws is unchanged; 1.20: the dark room floor (London, from the Photo Ark room mockup WkrPJYZNdLa9zcj7bDrJo9) - the wall stands on a black glossy floor across the bottom fifth of the screen that reflects the last row (its lights follow the real cases), warm pools under lit cases on that row, and the room darkens toward the edges and ceiling; no added colour; 1.19: fewer visible repeats (London: the big basil cases sat close together) - each object at most once per row, and the tall ones (basil, cosmos, bottlebrush) each only on every third row, staggered; a case that loses its object stays empty with its colour; 1.18: the basil root module shown big, about three-quarters of the case height (London: it counts as a tool and would be pretty big); 1.17: a seventh exhibit - a space-farming root module growing basil (Sketchfab 'root module - biomass production system'; licence to check) in the Moss cases; 1.16: a sixth exhibit - the red bottlebrush (Callistemon laevis, Sketchfab; licence to check) in the Brand red cases, London's first of the botany set; 1.15: London picked D3 - realism from light only, no new parts: floor bounce on the bottom of the back wall, a dark line where floor meets wall, the base catches a thin warm edge and darkens toward the ground, the pool brightest under the object (mockup artifact ARsPyBtqaky3uAfdSE3Yd6; built-up hood/linen/bronze cases looked faker); 1.14: London picked option C2 - warm white gallery light in warm dark-grey cases (case colour only on the label bar), a single small spotlight with a hot core, a feathered beam, a scallop of light on the back wall, a tight pool around the object, objects lit from above in their true colours (mockup artifact WM6iVEERy2ER7CbGPiGq7M); 1.13: realistic glass instead of the drawn diagonal line (London) - a soft wide sheen that drifts with the mouse, the lit lamp reflected along the top of the front pane, faintly green glass edges, side panes a touch shinier (glass seen at an angle reflects more); 1.12: the rows roll like marquees, alternating directions at different slow speeds, each row in its own colour order so no diagonal repeats (London); more contrast - heavier shadows, sharper lamps (London); 1.11: sharp high-resolution exhibit images (were 256 px, looked rough on big screens); 1.10: objects scaled to their real sizes (gently compressed): cosmos plant tallest, stromatolite slab, meteorite, halite crystal, potato slices smallest; 1.9: two more exhibits - the Hraschina iron meteorite (NHM Vienna scan) in the Obsidian cases and a stromatolite (Cornell scan) in the Lagoon cases; 1.8: objects smaller and sleeker, the halite most; 1.7: objects sit right on the case floor (no riser), with a soft contact shadow; 1.6: each object lives in the case that matches it - halite in every Halite rose case, potatoes in every Andean rust case, the yellow cosmos in every Sap teal case; 1.5: objects are museum exhibits, sitting still and facing the viewer (London: no spinning) - each stands on a low riser on the case floor with a soft contact shadow; halite, potato and the yellow cosmos (CC0 scan, stray cube removed) rotate through the object cases; 1.4: halite and potato; 1.3: the heading's dark glow is anchored to the heading block (position:relative lived in the frame CSS that was removed, so the glow had stretched over the whole wall and dimmed it); 1.2: identical lighting to the approved tester - fixes a selector-weight bug where '.rbv .f{top:0}' outranked '.rbv-pool' and lifted the light pool off the floor; 1.1's extra floor reverted; 1.0: Home background = a full-screen dark museum wall of glass cases on plinths (London's "Vitrine Home Tester", approved with "More lit" + heading). Most cases stay dark; 7 at a time light up at random for 3.5-8 s and fade; hover lights one fully. Labels are mono instrument readouts (V-number, name when lit, 000-100 reading, hairline meter in the case colour). Pure CSS 3D (no WebGL): only opacity/transform change, nothing runs while idle except a light timer, paused when the tab is hidden. Home's own heading (wordmark, glyph-scramble h1, CTA) sits over the middle on a soft dark glow. */ (function(){ if (window.__rbHomeVitrines) return; window.__rbHomeVitrines = 1; var p0 = location.pathname.replace(/\/+$/, '') || '/'; if (p0 !== '/') return; var d = document, root = d.documentElement; if (!d.querySelector('link[data-rbv-serif]')) { var lf = d.createElement('link'); lf.rel = 'stylesheet'; lf.setAttribute('data-rbv-serif', ''); lf.href = 'https://fonts.googleapis.com/css2?family=Cormorant:ital,wght@0,500;1,500&display=swap'; d.head.appendChild(lf); } var css = d.createElement('style'); css.textContent = [ 'html.rb-home,html.rb-home body{background:#000!important}', '.page-wrapper,.main-wrapper,.hero,.module,.module_canvas{background:transparent!important}', '.rbv-scene{position:fixed;inset:0;z-index:0;overflow:hidden;background:radial-gradient(110% 80% at 50% 40%,#060709 0%,#000 62%)}', '.page-wrapper{position:relative;z-index:2;pointer-events:none}', '.page-wrapper .module_copy,.page-wrapper a,.page-wrapper button{pointer-events:auto}', '.module_copy{position:relative!important;isolation:isolate}', '.module_copy::before{content:"";position:absolute;left:50%;top:50%;width:max(64vw,760px);height:max(56vh,440px);transform:translate(-50%,-50%);z-index:-1;pointer-events:none;background:radial-gradient(closest-side,rgba(0,0,0,.92) 0%,rgba(0,0,0,.86) 30%,rgba(0,0,0,.66) 52%,rgba(0,0,0,.36) 72%,rgba(0,0,0,.12) 88%,rgba(0,0,0,0) 100%)}', '.rbv-wall{position:absolute;inset:-2vh 0;display:flex;flex-direction:column;justify-content:center;gap:var(--rbv-rowgap);--ry:0deg;--rx:0deg}', /* 1.27.1: Privacy and Terms links, quiet, along the bottom edge (a privacy link must be findable from Home) */ '.rbv-legal{position:fixed;right:max(20px,env(safe-area-inset-right,0px));bottom:calc(20px + env(safe-area-inset-bottom,0px));z-index:20;display:flex;gap:18px;padding:7px 16px;border-radius:999px;background:rgba(0,0,0,.62);box-shadow:0 0 18px 8px rgba(0,0,0,.62);font:400 10px/1 "IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.14em;text-transform:uppercase}', '@media (max-width:360px){.rbv-legal{gap:12px;padding:7px 12px;font-size:9px}}', '.rbv-legal a{color:rgba(242,237,228,.58);text-decoration:none;padding:4px 2px;transition:color .25s}', '.rbv-legal a:hover,.rbv-legal a:focus-visible{color:#ECE7DE;text-decoration:underline;text-decoration-color:#FF2D00;text-underline-offset:4px}', '.rbv-vig{position:absolute;inset:0;z-index:3;pointer-events:none;background:radial-gradient(75% 70% at 50% 42%,transparent 40%,rgba(0,0,0,.5) 78%,rgba(0,0,0,.82) 100%),linear-gradient(180deg,rgba(0,0,0,.5),transparent 18%)}', '.rbv-row{position:relative;width:100%;overflow:visible}', '.rbv-track{display:flex;gap:2px;width:max-content;will-change:transform;animation:rbvRoll var(--dur) linear infinite;animation-delay:var(--del)}', '.rbv-row.rev .rbv-track{animation-direction:reverse}', '.rbv-track>.rbv{width:var(--rbv-cell);flex:none}', '@keyframes rbvRoll{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}', '.rbv{--w:calc(var(--rbv-cell)*.86);--h:calc(var(--w)*1.2);--d:calc(var(--w)*.62);--lit:0;display:flex;flex-direction:column;align-items:center;gap:7px;min-width:0;outline:none}', '.rbv-stage{width:var(--w);height:calc(var(--h) + var(--w)*.30);perspective:900px;perspective-origin:50% 30%}', '.rbv-rig{position:relative;width:100%;height:100%;transform-style:preserve-3d;transform:rotateX(calc(-7deg + var(--rx))) rotateY(var(--ry));transition:transform 1.1s cubic-bezier(.2,.7,.2,1)}', '.rbv-case,.rbv-plinth{position:absolute;left:0;width:var(--w);transform-style:preserve-3d}', '.rbv-case{top:0;height:var(--h)}.rbv-plinth{top:var(--h);height:calc(var(--w)*.30)}', '.rbv .f{position:absolute;left:0;top:0}', '.rbv-case .fr,.rbv-case .bk,.rbv-in{width:var(--w);height:var(--h)}', '.rbv-case .lf,.rbv-case .rt{width:var(--d);height:var(--h);left:calc((var(--w) - var(--d))/2)}', '.rbv-case .tp,.rbv-case .rbv-pool{width:var(--w);height:var(--d);top:calc((var(--h) - var(--d))/2)}', '.rbv .fr{transform:translateZ(calc(var(--d)/2))}.rbv .bk{transform:rotateY(180deg) translateZ(calc(var(--d)/2))}', '.rbv .lf{transform:rotateY(-90deg) translateZ(calc(var(--w)/2))}.rbv .rt{transform:rotateY(90deg) translateZ(calc(var(--w)/2))}', '.rbv-case .tp{transform:rotateX(90deg) translateZ(calc(var(--h)/2))}.rbv-case .rbv-pool{transform:rotateX(-90deg) translateZ(calc(var(--h)/2 - 1px))}', '.rbv-case .rbv-in{transform:translateZ(calc(var(--d)/-2 + 1px))}', '.rbv .gl{border:1px solid rgba(214,232,224,calc(.07 + .12*var(--lit)));background:linear-gradient(180deg,rgba(255,255,255,.03),rgba(255,255,255,.006) 55%,rgba(255,255,255,.018));box-shadow:inset 1px 0 0 rgba(190,230,214,.06),inset -1px 0 0 rgba(190,230,214,.06);transition:border-color 1.6s}', '.rbv .lf.gl,.rbv .rt.gl{background:linear-gradient(180deg,rgba(255,255,255,.055),rgba(255,255,255,.014) 60%,rgba(255,255,255,.034))}', '.rbv .gl.fr::after{content:"";position:absolute;inset:0;pointer-events:none;opacity:calc(.5 + .5*var(--lit));background:linear-gradient(104deg,transparent 0%,rgba(255,255,255,.05) 22%,rgba(255,255,255,.016) 40%,transparent 58%,rgba(255,255,255,.02) 78%,transparent 100%);background-size:220% 100%;background-position:calc(40% + var(--gx,0)*25%) 0;transition:opacity 1.6s,background-position .9s cubic-bezier(.2,.7,.2,1)}', '.rbv .gl.fr::before{content:"";position:absolute;left:6%;right:6%;top:0;height:14%;pointer-events:none;background:radial-gradient(50% 60% at 50% 0%,var(--lamp),transparent 75%);opacity:calc(.22*var(--lit));transition:opacity 1.6s;mix-blend-mode:screen}', '.rbv .bk.gl{background:none;border-color:rgba(236,231,222,.05)}', '.rbv-atmo,.rbv-lamp,.rbv-cone,.rbv-pool{transition:opacity 1.6s cubic-bezier(.4,0,.2,1)}', '.rbv-atmo{position:absolute;inset:0;background:radial-gradient(80% 64% at 50% 0%,var(--c1) 0%,var(--c2) 38%,var(--c3) 80%,#000 100%);opacity:calc(.03 + .95*var(--lit))}', '.rbv-in::after{content:"";position:absolute;inset:0;pointer-events:none;box-shadow:inset 0 0 calc(var(--w)*.14) rgba(0,0,0,.72),inset 0 calc(var(--w)*-.08) calc(var(--w)*.10) rgba(0,0,0,.45)}', '.rbv-lamp{position:absolute;left:8%;right:8%;top:3px;height:2px;border-radius:2px;background:var(--lamp);box-shadow:0 0 6px 1px var(--lamp),0 3px 22px 3px var(--c1);opacity:calc(.03 + .97*var(--lit))}', '.rbv-cone{position:absolute;left:12%;right:12%;top:0;height:100%;pointer-events:none;background:linear-gradient(180deg,var(--c1),transparent 66%);clip-path:polygon(34% 0,66% 0,92% 100%,8% 100%);opacity:calc(.2*var(--lit))}', '.rbv-case .rbv-pool{background:radial-gradient(44% 40% at 50% 50%,var(--c1),transparent 70%);opacity:calc(.95*var(--lit))}', '.rbv-plinth .fr,.rbv-plinth .bk{width:var(--w);height:100%}', '.rbv-plinth .lf,.rbv-plinth .rt{width:var(--d);height:100%;left:calc((var(--w) - var(--d))/2)}', '.rbv-plinth .tp{width:var(--w);height:var(--d);top:calc((100% - var(--d))/2);transform:rotateX(90deg) translateZ(calc(var(--w)*.15))}', '.rbv .st{background:linear-gradient(180deg,#0e1013,#030304);border:1px solid rgba(236,231,222,.05)}', '.rbv-shadow{position:absolute;left:-10%;right:-10%;bottom:-14px;height:24px;border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.97),rgba(0,0,0,.6) 55%,transparent)}', '.rbv-lab{width:var(--w);display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:6px;font:400 8.5px/1.2 "IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.14em;text-transform:uppercase;color:#3a3d42;transition:color 1.2s;min-width:0}', '.rbv-lab .id,.rbv-lab .lx{font-variant-numeric:tabular-nums}', '.rbv-lab .id{grid-row:1;grid-column:1}.rbv-lab .lx{grid-row:1;grid-column:3}.rbv-lab .bar{grid-row:3}', '.rbv-lab .nm{grid-row:2;grid-column:1/-1;display:flex;flex-direction:column;gap:1px;min-width:0;text-transform:none;letter-spacing:0}', '.rbv-lab .nm .s{font:500 12.5px/1.15 Cormorant,"Cormorant Garamond",Georgia,serif;letter-spacing:.01em;color:#d9d2c5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}', '.rbv-lab .nm .s i{font-style:italic}', '.rbv-lab .nm .c{font:400 7.6px/1.3 "IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:0;color:#8a8e95;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}', '.rbv-lab .nm{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:var(--lit);transition:opacity 1.2s}', '.rbv-lab .lx{opacity:calc(.35 + .65*var(--lit))}', '.rbv-lab .bar{grid-column:1/-1;height:1px;background:rgba(236,231,222,.08);position:relative;overflow:hidden}', '.rbv-lab .bar i{position:absolute;inset:0;background:var(--c1);transform-origin:0 50%;transform:scaleX(var(--lit));transition:transform 1.6s cubic-bezier(.4,0,.2,1);box-shadow:0 0 6px var(--c1)}', '.rbv.on .rbv-lab{color:#7d828a}.rbv.on .rbv-lab .id{color:#ECE7DE}', '.rbv .rbv-ex{position:absolute;inset:0;pointer-events:none}', '.rbv .rbv-sh{position:absolute;left:50%;bottom:-6.5%;height:5%;width:calc(var(--rw)*100%);transform:translateX(-50%);border-radius:50%;background:radial-gradient(closest-side,rgba(0,0,0,.95),rgba(0,0,0,.5) 60%,transparent)}', '.rbv .rbv-obj{position:absolute;left:50%;bottom:-5%;height:calc(var(--eh)*100%);aspect-ratio:var(--ar);transform:translateX(-50%);overflow:hidden;filter:brightness(calc(.12 + 1*var(--lit))) contrast(calc(1 + .18*var(--lit))) saturate(calc(.55 + .45*var(--lit)));transition:filter 1.4s}', '.rbv .rbv-obj i{position:absolute;inset:0;background:center bottom/contain no-repeat}', '.rbv-scene .rbv{--lamp:#fff1dc!important}', '.rbv .rbv-in .rbv-atmo{background:radial-gradient(30% 50% at 50% 0%,rgba(255,236,206,.42),rgba(255,236,206,.14) 55%,transparent 100%),conic-gradient(from 150deg at 50% 0%,transparent 0deg,rgba(255,232,200,.10) 30deg,transparent 60deg,transparent 360deg),linear-gradient(180deg,#2c2723 0%,#171512 40%,#090807 80%,#000 100%)}', '.rbv .rbv-in .rbv-lamp{left:50%;right:auto;top:0;width:calc(var(--w)*.12);height:calc(var(--w)*.085);transform:translateX(-50%);border-radius:0;background:none;box-shadow:none;opacity:calc(.06 + .94*var(--lit))}', /* the fixture: a small dark-bronze spotlight can on a ceiling plate, shaded like a cylinder; it stays dark metal when the light is off */ '.rbv .rbv-in .rbv-lamp::before{content:"";position:absolute;left:0;right:0;top:0;bottom:24%;border-radius:1px 1px 18% 18% / 1px 1px 30% 30%;background:linear-gradient(90deg,#060505 0%,#141210 22%,#24201c 42%,#131110 66%,#050404 100%);box-shadow:0 -1px 0 1px #0c0b0a,inset 0 -1px 0 rgba(255,236,210,calc(.06 + .18*var(--lit)))}', /* the lens on its underside: dark glass with a faint highlight when off, a warm hot core when on */ '.rbv .rbv-in .rbv-lamp::after{content:"";position:absolute;left:14%;right:14%;bottom:8%;height:30%;border-radius:50%;background:radial-gradient(60% 70% at 50% 45%,rgba(255,250,240,calc(.98*var(--lit))) 0,rgba(255,226,184,calc(.85*var(--lit))) 45%,rgba(255,200,140,calc(.25*var(--lit))) 75%,transparent 100%),#0a0908;box-shadow:0 1px 8px 1px rgba(255,240,215,calc(.75*var(--lit))),0 6px 26px 8px rgba(255,214,160,calc(.26*var(--lit)))}', '.rbv .rbv-in .rbv-cone{left:0;right:0;clip-path:none;background:conic-gradient(from 160deg at 50% 1%,transparent 0deg,rgba(255,232,200,.55) 20deg,transparent 40deg,transparent 360deg);-webkit-mask-image:linear-gradient(180deg,#000 0%,rgba(0,0,0,.55) 55%,transparent 92%);mask-image:linear-gradient(180deg,#000 0%,rgba(0,0,0,.55) 55%,transparent 92%);opacity:calc(.42*var(--lit))}', '.rbv .rbv-case .rbv-pool{background:radial-gradient(32% 30% at 50% 54%,rgba(255,232,196,1),rgba(255,226,186,.3) 55%,transparent 80%);opacity:calc(.8*var(--lit))}', '.rbv .rbv-ex .rbv-obj{filter:brightness(calc(.12 + 1*var(--lit))) contrast(calc(1 + .12*var(--lit))) saturate(calc(.55 + .5*var(--lit)))}', '.rbv .rbv-obj .rbv-tl{position:absolute;inset:0;-webkit-mask-size:contain;mask-size:contain;-webkit-mask-position:center bottom;mask-position:center bottom;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;background:linear-gradient(180deg,rgba(255,230,190,.34),rgba(255,226,180,0) 34%,rgba(0,0,0,0) 50%,rgba(0,0,0,.6));opacity:calc(.35 + .65*var(--lit));transition:opacity 1.4s}', '.rbv .rbv-in .rbv-atmo{background:radial-gradient(40% 14% at 50% 100%,rgba(255,226,186,.16),transparent 100%),linear-gradient(0deg,rgba(0,0,0,.7) 0,transparent 2.5%),radial-gradient(30% 50% at 50% 0%,rgba(255,236,206,.42),rgba(255,236,206,.14) 55%,transparent 100%),conic-gradient(from 150deg at 50% 0%,transparent 0deg,rgba(255,232,200,.10) 30deg,transparent 60deg,transparent 360deg),linear-gradient(180deg,#2c2723 0%,#171512 40%,#090807 80%,#000 100%)}', '.rbv .rbv-plinth .fr.st{background:linear-gradient(180deg,#000 0 1px,rgba(255,232,200,calc(.06 + .16*var(--lit))) 1px 2px,#17150f 2px,#0c0b0a 45%,#040404 100%);border:0}', '.rbv .rbv-plinth .lf.st,.rbv .rbv-plinth .rt.st{background:linear-gradient(180deg,#000 0 1px,#100f0d 1px,#060606 100%);border:0}', '.rbv .rbv-case .rbv-pool{background:radial-gradient(30% 28% at 50% 54%,rgba(255,236,204,1),rgba(255,226,186,.32) 50%,rgba(255,226,186,.06) 75%,transparent 92%)}', /* 1.27: less shadow over the wall */ '.rbv-vig{background:linear-gradient(180deg,rgba(0,0,0,.35),transparent 12%)}', '.module_copy::before{width:max(46vw,560px);height:max(34vh,280px);background:radial-gradient(closest-side,rgba(0,0,0,.9) 0%,rgba(0,0,0,.8) 34%,rgba(0,0,0,.5) 58%,rgba(0,0,0,.18) 80%,rgba(0,0,0,0) 100%)}', '.rbv-in::after{box-shadow:inset 0 0 calc(var(--w)*.12) rgba(0,0,0,.55),inset 0 calc(var(--w)*-.08) calc(var(--w)*.10) rgba(0,0,0,.3)}', /* 1.27: a low light in every case at rest; the lit turn goes brighter */ '.rbv .rbv-in .rbv-atmo{opacity:calc(.3 + .68*var(--lit))}', '.rbv .rbv-case .rbv-pool{opacity:calc(.16 + .84*var(--lit))}', '.rbv .rbv-in .rbv-cone{opacity:calc(.08 + .52*var(--lit))}', '.rbv .rbv-in .rbv-lamp::after{box-shadow:0 1px 8px 1px rgba(255,240,215,calc(.12 + .78*var(--lit))),0 6px 26px 8px rgba(255,214,160,calc(.04 + .32*var(--lit)))}', '.rbv .rbv-ex .rbv-obj{filter:brightness(calc(.55 + .77*var(--lit))) contrast(calc(1 + .16*var(--lit))) saturate(calc(.75 + .4*var(--lit)))}', '.rbv .rbv-obj .rbv-tl{opacity:calc(.5 + .5*var(--lit))}', '.rbv .gl{border-color:rgba(214,232,224,calc(.11 + .14*var(--lit)))}', '@media (prefers-reduced-motion: reduce){.rbv-rig{transition:none}.rbv-track{animation:none}}' ].join('\n'); (d.head || root).appendChild(css); if (!d.querySelector('link[href*="IBM+Plex+Mono"]')) { var lk = d.createElement('link'); lk.rel = 'stylesheet'; lk.href = 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&display=swap'; (d.head || root).appendChild(lk); } var V = [ ['#2fd0b7','#0f5a52','#04110f','#d9fff7','Sap teal'], ['#3E96CE','#123a57','#03080d','#e6f4ff','Blue dot'], ['#c8873e','#5a3417','#0e0805','#ffe9c9','Potato ochre'], ['#b8573a','#4a1d12','#0c0504','#ffd9c7','Andean rust'], ['#d9d2c4','#4c4a45','#0b0b0a','#ffffff','Bone'], ['#7aa35a','#264015','#060a04','#efffd9','Moss'], ['#d9a6b4','#5b3540','#0d0709','#fff0f4','Halite rose'], ['#2c6f86','#0d2c38','#02080b','#d4f3ff','Lagoon'], ['#e0a345','#5a3a0f','#0c0803','#fff1d0','Amber'], ['#b80000','#3d0606','#090101','#ffd0cc','Brand red'], ['#c9a27a','#4f3a26','#0b0806','#fff3e3','Mars dust'], ['#3a3f47','#121417','#030304','#ffffff','Obsidian'] ]; var EX = { halite: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ac6b419d20e3d9baf48ff81_halite-hd.webp', ar: 0.981, h: 0.19, rw: 0.3 }, potato: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ac6b419ba1b33d5c67bac7a_potato-hd.webp', ar: 2.174, h: 0.15, rw: 0.46 }, flower: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ac6b4192746532e0c18ff68_flower-hd.webp', ar: 0.463, h: 0.76, rw: 0.4 }, basil: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ac6c9fd4dea783e9de630fc_basil-hd.webp', ar: 0.754, h: 0.74, rw: 0.8 }, bottlebrush: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ac6c650812e2cc79ef36fa9_bottlebrush-hd.webp', ar: 1.262, h: 0.56, rw: 0.3 }, stromatolite: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ac6b41a2817c3ab8100d919_stromatolite-hd.webp', ar: .736, h: 0.46, rw: 0.44 }, alh84001: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e18f9cee71269eb58c_vx-alh84001-hd.webp', ar: 0.903, h: 0.13, rw: 0.18 }, azurite: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e1c744622b7e328b96_vx-azurite-hd.webp', ar: 0.901, h: 0.24, rw: 0.19 }, babirusa: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e1036ce55580ac7569_vx-babirusa-hd.webp', ar: 1.549, h: 0.42, rw: 0.56 }, banksiaflower: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e16e18e4fde120c05f_vx-banksiaflower-hd.webp', ar: 0.427, h: 0.44, rw: 0.18 }, banksiapod: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e1036ce55580ac759d_vx-banksiapod-hd.webp', ar: 0.486, h: 0.27, rw: 0.18 }, chrysB: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e2b68b60eda1794e8c_vx-chrysB-hd.webp', ar: 1.087, h: 0.26, rw: 0.24 }, eucpod: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e2b68b60eda1794ebc_vx-eucpod-hd.webp', ar: 1.285, h: 0.22, rw: 0.24 }, garnierite: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e36e18e4fde120c10a_vx-garnierite-hd.webp', ar: 1.004, h: 0.34, rw: 0.29 }, heliopora: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e3d1148dcab9418439_vx-heliopora-hd.webp', ar: 1.018, h: 0.36, rw: 0.32 }, olivine: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e3e8755072ffbaefc2_vx-olivine-hd.webp', ar: 1.445, h: 0.3, rw: 0.37 }, roseB: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e3e8755072ffbaefe3_vx-roseB-hd.webp', ar: 1.489, h: 0.2, rw: 0.26 }, serpentinite: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e5aab37cfe0773c542_vx-serpentinite-hd.webp', ar: 1.344, h: 0.24, rw: 0.28 }, tridacna: { s: 'https://cdn.prod.website-files.com/6a9e51d3785d2056b505edcc/6ad356e594286fa0bf5615d5_vx-tridacna-hd.webp', ar: 1.541, h: 0.32, rw: 0.43 } }; /* each case colour holds a small pool of exhibits matched to its tone; the colour stays only on the label bar */ /* each case is labelled with what it holds (1.26): scientific name first (binomials in italics, "sp." where the species is not certain; minerals and rocks by their proper names), the common name, formula or type small beneath. Checked against each scan's source record, GBIF, WoRMS and mineral references (23 Oct 2026). Before 1.26 the labels showed the case colour names. */ var NM = {"halite": ["Halite", "NaCl"], "potato": ["Solanum tuberosum", "Andean potato"], "flower": ["Cosmos sulphureus", "Yellow cosmos"], "basil": ["Ocimum basilicum", "Basil, root module"], "bottlebrush": ["Callistemon sp.", "Bottlebrush"], "stromatolite": ["Stromatolite", "Collenia versiformis"], "alh84001": ["ALH 84001", "Martian meteorite"], "azurite": ["Azurite", "Cu₃(CO₃)₂(OH)₂"], "babirusa": ["Babyrousa sp.", "Babirusa skull"], "banksiaflower": ["Banksia hookeriana", "Hooker's banksia"], "banksiapod": ["Banksia sp.", "Banksia cone"], "chrysB": ["Chrysocolla", "with pseudomalachite"], "eucpod": ["Eucalyptus lehmannii", "Bushy yate"], "garnierite": ["Garnierite", "Ni–Mg hydrosilicates"], "heliopora": ["Heliopora coerulea", "Blue coral"], "olivine": ["Olivine", "(Mg,Fe)₂SiO₄"], "roseB": ["Gypsum", "Desert rose"], "serpentinite": ["Serpentinite", "Serpentine-group rock"], "tridacna": ["Tridacna squamosa", "Fluted giant clam"]}; var POOL = [['flower', 'garnierite'], ['chrysB', 'serpentinite'], ['banksiapod', 'eucpod'], ['potato', 'roseB'], ['babirusa', 'tridacna'], ['basil', 'olivine'], ['halite'], ['stromatolite', 'azurite'], ['banksiaflower'], ['bottlebrush'], ['alh84001'], ['heliopora']], OK; var SHORT = Object.keys(EX).filter(function(k){ return !(k in { basil: 1, flower: 1, bottlebrush: 1 }); }); var TARGET = 7, scene, wall, cases = [], lit = new Map(), hover = null; var reduce = window.matchMedia && matchMedia('(prefers-reduced-motion: reduce)').matches; function setLit(el, v){ el.style.setProperty('--lit', v); el.classList.toggle('on', v > 0); el.__lx.textContent = String(Math.round(v * 100)).padStart(3, '0'); } var STR = [1, 5, 7, 11]; /* strides that visit all 12 colours, so each row has its own order */ var BIG = { basil: 0, flower: 1, bottlebrush: 2 }; /* tall exhibits: each gets every third row, so the same tall object is always at least two rows from its twin */ function makeCase(k, id, ob){ var p = V[k], el = d.createElement('div'); el.className = 'rbv'; el.setAttribute('aria-hidden', 'true'); el.style.cssText = '--c1:' + p[0] + ';--c2:' + p[1] + ';--c3:' + p[2] + ';--lamp:' + p[3]; el.innerHTML = '
' + '
' + '
' + ((OK = ob) ? '
' : '') + '
' + '
' + '
' + '
V' + String(id).padStart(3, '0') + '' + (ob ? '' + NM[ob][0] + '' + NM[ob][1] + '' : '' + p[4] + '') + '000
'; el.__lx = el.querySelector('.lx'); el.addEventListener('pointerenter', function(){ hover = this; setLit(this, 1); }); el.addEventListener('pointerleave', function(){ hover = null; if (!lit.has(this)) setLit(this, 0); }); cases.push(el); return el; } function build(){ var W = innerWidth, H = innerHeight; var cell = Math.max(96, Math.min(150, Math.round(W / 11))); var caseH = cell * .86 * 1.5 + 52, rowgap = Math.round(cell * .16); var cols = Math.ceil((W + 40) / (cell + 2)) + 1, rows = Math.ceil((H + 40) / (caseH + rowgap)); if ((cols - 1) % 12 === 0) cols++; /* keep the loop seam from putting one colour twice in a row */ wall.style.setProperty('--rbv-cell', cell + 'px'); wall.style.setProperty('--rbv-rowgap', rowgap + 'px'); wall.textContent = ''; cases = []; lit.clear(); hover = null; var id = 1, lastStr = -1; for (var r = 0; r < rows; r++) { var row = d.createElement('div'), track = d.createElement('div'); row.className = 'rbv-row' + (r % 2 ? ' rev' : ''); track.className = 'rbv-track'; var si; do { si = Math.floor(Math.random() * STR.length); } while (si === lastStr); lastStr = si; var start = Math.floor(Math.random() * 12), stride = STR[si]; var speed = 9 + Math.random() * 13; /* px per second: every row its own pace */ var dur = cols * (cell + 2) / speed; track.style.setProperty('--dur', dur.toFixed(1) + 's'); track.style.setProperty('--del', (-Math.random() * dur).toFixed(1) + 's'); var obs = [], used = {}, last = {}; for (var j0 = 0; j0 < cols; j0++) { var pool = POOL[(start + j0 * stride) % 12], o = null, q, z; /* 1.26.1: on its own row a tall exhibit goes first, so it shows even when fewer rows fit (taller labels) */ for (q = 0; q < pool.length && !o; q++) { z = pool[q]; if (!used[z] && BIG[z] !== undefined && r % 3 === BIG[z]) o = z; } for (q = 0; q < pool.length && !o; q++) { z = pool[(q + r) % pool.length]; if (!used[z] && (BIG[z] === undefined || r % 3 === BIG[z])) o = z; } /* no exhibit of this colour free in this row: borrow a small one not yet in the row, so no case stands empty */ for (q = 0; q < SHORT.length && !o; q++) { z = SHORT[(q * 7 + j0 + r * 3) % SHORT.length]; if (!used[z]) o = z; } /* only on very wide screens (more cases than exhibits): reuse one at least 9 cases away */ for (q = 0; q < SHORT.length && !o; q++) { z = SHORT[(q + j0) % SHORT.length]; if (j0 - last[z] >= 9) o = z; } used[o] = 1; last[o] = j0; obs.push(o); } for (var copy = 0; copy < 2; copy++) for (var j = 0; j < cols; j++) { var kk = (start + j * stride) % 12; track.appendChild(makeCase(kk, id + j, obs[j])); } id += cols; row.appendChild(track); wall.appendChild(row); } } function tick(){ if (!d.hidden) { var now = performance.now(); lit.forEach(function(until, el){ if (now > until) { lit.delete(el); if (el !== hover) setLit(el, 0); } }); if (lit.size < TARGET && cases.length) { for (var t = 0; t < 24; t++) { var el = cases[Math.floor(Math.random() * cases.length)]; if (lit.has(el) || el === hover) continue; var bx = el.getBoundingClientRect(); if (bx.right < 0 || bx.left > innerWidth) continue; lit.set(el, now + 3500 + Math.random() * 4500); setLit(el, .75 + Math.random() * .25); break; } } } setTimeout(tick, reduce ? 4000 : 700 + Math.random() * 900); } function mount(){ scene = d.createElement('div'); scene.className = 'rbv-scene'; scene.setAttribute('aria-hidden', 'true'); wall = d.createElement('div'); wall.className = 'rbv-wall'; scene.appendChild(wall); var vg = d.createElement('div'); vg.className = 'rbv-vig'; scene.appendChild(vg); var lg = d.createElement('nav'); lg.className = 'rbv-legal'; lg.setAttribute('aria-label', 'Legal'); lg.innerHTML = 'PrivacyTerms'; d.body.appendChild(lg); d.body.insertBefore(scene, d.body.firstChild); build(); tick(); var rt = null; addEventListener('resize', function(){ clearTimeout(rt); rt = setTimeout(build, 200); }); if (!reduce) { var pend = false, tx = 0, ty = 0; addEventListener('pointermove', function(e){ tx = e.clientX / innerWidth * 2 - 1; ty = e.clientY / innerHeight * 2 - 1; if (pend) return; pend = true; requestAnimationFrame(function(){ pend = false; wall.style.setProperty('--ry', (tx * 10).toFixed(2) + 'deg'); wall.style.setProperty('--rx', (ty * -3).toFixed(2) + 'deg'); wall.style.setProperty('--gx', tx.toFixed(3)); }); }, { passive: true }); } } if (d.body) mount(); else d.addEventListener('DOMContentLoaded', mount); })();