Last active
December 9, 2025 03:58
-
-
Save mbutler/1bd55333e433528817c03627f9f574bc to your computer and use it in GitHub Desktop.
generated artifacts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Optional tiny seeded RNG so runs can be repeatable | |
| const makeRng = seed => { | |
| let h = 2166136261 ^ (seed || 0) | |
| return () => { | |
| h += h << 1 | |
| h ^= h >>> 1 | |
| h += 0x9e3779b9 | |
| h ^= h << 5 | |
| return (h >>> 0) / 4294967296 | |
| } | |
| } | |
| const choose = (rng, arr, k = 1, {weights} = {}) => { | |
| if (k === 1 && !weights) return arr[Math.floor(rng() * arr.length)] | |
| const out = [] | |
| const items = arr.map((v, i) => ({v, w: weights ? weights[i] ?? 1 : 1})) | |
| const total = items.reduce((s, x) => s + x.w, 0) | |
| for (let n = 0; n < k; n++) { | |
| let r = rng() * (items.reduce((s, x) => s + x.w, 0)) | |
| let pick = items.find(x => (r -= x.w) <= 0) || items[items.length - 1] | |
| out.push(pick.v) | |
| } | |
| return k === 1 ? out[0] : out | |
| } | |
| // --- Controlled vocabularies ---- | |
| const regions = [ | |
| // your originals | |
| 'the Anatolian plateau', | |
| 'the Atacama high desert', | |
| 'coastal Borneo', | |
| 'the Pontic–Caspian steppe', | |
| 'the Carpathian basin', | |
| 'the Andaman Sea archipelagos', | |
| 'the Levantine corridor', | |
| 'the Altai foothills', | |
| 'the Rift Valley escarpments', | |
| 'the Lesser Sunda Islands', | |
| // extended: deserts and basins | |
| 'the Kalahari basin', | |
| 'the Taklamakan depression', | |
| 'the Thar desert fringe', | |
| 'the Mojave salt plains', | |
| 'the Great Victoria Desert interior', | |
| 'the Empty Quarter dunes', | |
| 'the Dasht-e Kavir flats', | |
| 'the Nubian sandstone plateau', | |
| // mountain and plateau zones | |
| 'the Pamir knot highlands', | |
| 'the Zagros ranges', | |
| 'the Hindu Kush valleys', | |
| 'the Sierra Madre Occidental', | |
| 'the Drakensberg escarpment', | |
| 'the Caucasus spine', | |
| 'the Ethiopian highlands', | |
| 'the Tibetan plateau rim', | |
| 'the Patagonian Andes front', | |
| 'the Scandinavian fjordlands', | |
| // islands and archipelagos | |
| 'the Cycladic isles', | |
| 'the Ryukyu chain', | |
| 'the Tuamotu atolls', | |
| 'the Aleutian arc', | |
| 'the Azores ridge', | |
| 'the Nicobar islands', | |
| 'the Molucca straits', | |
| 'the Falkland banks', | |
| 'the Faroe archipelago', | |
| 'the Kuril straits', | |
| // river valleys and deltas | |
| 'the Mekong floodplain', | |
| 'the Tigris–Euphrates delta', | |
| 'the Niger inner delta', | |
| 'the Orinoco lowlands', | |
| 'the Amu Darya basin', | |
| 'the Mississippi alluvial plain', | |
| 'the Ganges–Brahmaputra delta', | |
| 'the Danube wetlands', | |
| 'the Irrawaddy delta fan', | |
| 'the Rhine–Meuse estuary', | |
| // polar and tundra environments | |
| 'the Taymyr peninsula', | |
| 'the Laptev coast', | |
| 'the Labrador plateau', | |
| 'the Svalbard ice valleys', | |
| 'the Antarctic Dry Valleys', | |
| 'the Yamal tundra belt', | |
| 'the Alaskan North Slope', | |
| 'the Greenlandic fjords', | |
| // forests and tropical belts | |
| 'the Congo basin canopy', | |
| 'the Chocó rainforest corridor', | |
| 'the Sundarbans mangroves', | |
| 'the Amazon headwaters', | |
| 'the New Guinea high forest', | |
| 'the Sierra Nevada de Santa Marta slopes', | |
| 'the Yunnan subtropics', | |
| 'the Borneo peatlands', | |
| // coastal and marine regions | |
| 'the Red Sea coral shelf', | |
| 'the Baltic littoral zone', | |
| 'the Coral Sea rim', | |
| 'the Tasman shelf edge', | |
| 'the Bay of Biscay shallows', | |
| 'the Benguela upwelling coast', | |
| 'the Labrador current front', | |
| 'the Sea of Okhotsk inlets', | |
| // historical or biogeographic corridors | |
| 'the Trans-Saharan routes', | |
| 'the Silk Road corridor', | |
| 'the Beringian land bridge', | |
| 'the Levantine passage', | |
| 'the Iberian–Maghreb exchange zone', | |
| 'the Baltic–Pontic interface', | |
| 'the Polynesian triangle', | |
| 'the Aleppo–Mosul corridor' | |
| ] | |
| const inventedEthnonyms = [ | |
| // your originals | |
| 'Eshkar', 'Tazkarr', 'Myridian', 'Seluran', 'Veylan', | |
| 'Kethara', 'Obsidian Coast', 'Yulan Valley', 'Aurelline', 'Tzora', | |
| // archaic or proto-Indo inspired | |
| 'Thalessian', 'Ardanic', 'Velkorran', 'Druvani', 'Korinthal', | |
| 'Lathic', 'Orsene', 'Tamaric', 'Itharene', 'Borellian', | |
| // high fantasy / mythic tone | |
| 'Vaeliri', 'Serathen', 'Orrukai', 'Eldrathi', 'Namarene', | |
| 'Zhelar', 'Cynvari', 'Rovannic', 'Xynar', 'Atherai', | |
| // desert / nomadic resonance | |
| 'Sahradeen', 'Tuzkari', 'Zameth', 'Khareen', 'Urval', | |
| 'Azkar', 'Rashiri', 'Dunmaar', 'Hathir', 'Saqqen', | |
| // maritime / archipelagic | |
| 'Pelagari', 'Iskellen', 'Nuarene', 'Thalori', 'Ossanic', | |
| 'Marethi', 'Corvalen', 'Seylanni', 'Tirathen', 'Nathari', | |
| // steppe and highland | |
| 'Kurgathi', 'Altirene', 'Tzunor', 'Volgari', 'Rathuun', | |
| 'Nomari', 'Kazeth', 'Pelyari', 'Tzenkai', 'Erlathi', | |
| // forest or temperate | |
| 'Sylvren', 'Velden', 'Rowathi', 'Caelwyn', 'Fendaric', | |
| 'Myrren', 'Galdari', 'Elanthir', 'Tollenic', 'Verdhari', | |
| // cold / tundra / polar | |
| 'Nerovik', 'Talmuren', 'Skelthar', 'Yrsiq', 'Voldren', | |
| 'Karnathi', 'Urskaar', 'Hrovan', 'Thyrren', 'Oskaal', | |
| // coastal / trade-oriented | |
| 'Carithene', 'Solven', 'Avrani', 'Valcerin', 'Taurine', | |
| 'Lyrassi', 'Zenithar', 'Olyssan', 'Marendic', 'Aevorran', | |
| // chthonic / deep earth / mineral | |
| 'Obrathi', 'Kezhan', 'Dravari', 'Moltheri', 'Zorrak', | |
| 'Thurnic', 'Basaltine', 'Ghalari', 'Rokaan', 'Tethric', | |
| // mystical or celestial | |
| 'Auranthi', 'Xelmarin', 'Ciryath', 'Lunathi', 'Zorynne', | |
| 'Nimari', 'Velassir', 'Eryndal', 'Soryan', 'Azuneth' | |
| ] | |
| const artifactTypes = [ | |
| // your originals | |
| 'votive idol', | |
| 'calendar disk', | |
| 'funerary container', | |
| 'mechanical charm', | |
| 'inscribed bone plate', | |
| 'ritual vessel', | |
| 'navigation plaque', | |
| 'hybrid fossil-tool', | |
| 'amulet of uncertain function', | |
| 'carved tablet of unknown script', | |
| // ceremonial & devotional | |
| 'processional effigy', | |
| 'sacrificial blade', | |
| 'incense reliquary', | |
| 'ancestor mask', | |
| 'pilgrimage token', | |
| 'censer of petrified resin', | |
| 'woven prayer panel', | |
| 'oath-binding knotstone', | |
| 'penitential torque', | |
| 'hollow idol-core', | |
| // mechanical & proto-technological | |
| 'astrolabe fragment', | |
| 'rotary computation drum', | |
| 'stellar alignment key', | |
| 'pneumatic reliquary sphere', | |
| 'geared relic engine', | |
| 'magnetite lodestone array', | |
| 'semaphore bead-chain', | |
| 'bioluminescent vial mechanism', | |
| 'synchronous coil tablet', | |
| 'spring-coded cylinder', | |
| // funerary, memorial, or mnemonic | |
| 'ossuary seal fragment', | |
| 'memory bead strand', | |
| 'embalmer’s effluent tray', | |
| 'spirit binding capsule', | |
| 'shard of a lament disk', | |
| 'cenotaph figurine', | |
| 'mourning tessera', | |
| 'cremation urn segment', | |
| 'death-mask laminate', | |
| 'reconstructed epitaph rod', | |
| // inscribed & textual | |
| 'glyph-bearing rod', | |
| 'codex spine fragment', | |
| 'etched clay roundel', | |
| 'bifacial lexeme stone', | |
| 'symbolic comb-plate', | |
| 'pictoglyph banner strip', | |
| 'scripted feather shaft', | |
| 'palimpsest tablet', | |
| 'sequential rune tile', | |
| 'memory bark-scroll', | |
| // ritual or magical-technological | |
| 'binding sigil loop', | |
| 'cryogenic votive ampoule', | |
| 'resonance prism', | |
| 'harmonic oath disc', | |
| 'alchemy retort shard', | |
| 'spore-scribed relic', | |
| 'bioactive charm pod', | |
| 'luminescent seal-stone', | |
| 'phase-aligned amulet', | |
| 'radiant containment lens', | |
| // utilitarian turned mysterious | |
| 'toolhead of unknown purpose', | |
| 'pressure vessel core', | |
| 'measured grain weight', | |
| 'cartographic inlay panel', | |
| 'tessellated hinge-piece', | |
| 'orbital chronometer shell', | |
| 'metallurgical pattern plate', | |
| 'calibration idol', | |
| 'ceramic pressure dome', | |
| 'sound-recording cone', | |
| // hybrid or anomalous | |
| 'mineral-organic conduit', | |
| 'fossilized circuitry shard', | |
| 'carbonized botanical effigy', | |
| 'ferrous vertebra assembly', | |
| 'synthetic bone idol', | |
| 'ceremonial drone husk', | |
| 'fungal memory substrate', | |
| 'crystal matrix relic', | |
| 'transbiotic mask fragment', | |
| 'metamaterial relic spine' | |
| ] | |
| const realMaterials = [ | |
| // your originals | |
| 'obsidian', 'bone', 'basalt', 'jade', 'lapis lazuli', | |
| 'copper', 'bronze', 'meteoric iron', 'carved shell', 'baked clay', | |
| 'woven bast fiber', 'ivory', 'antler', 'coral', 'bitumen', | |
| // lithic and mineral | |
| 'flint', 'chert', 'granite', 'gneiss', 'marble', | |
| 'hematite', 'malachite', 'serpentine', 'quartzite', 'limestone', | |
| 'schist', 'mica', 'amethyst', 'turquoise', 'chalcedony', | |
| 'amber', 'onyx', 'soapstone', 'agate', 'obsidian glass', | |
| // metals and alloys | |
| 'gold', 'silver', 'iron', 'lead', 'tin', | |
| 'electrum', 'brass', 'nickel', 'zinc', 'steel', | |
| 'mercury amalgam', 'cobalt', 'platinum', 'aurichalcum', 'white gold', | |
| // organic and biological | |
| 'shellac', 'horn', 'tooth enamel', 'tortoiseshell', 'resin', | |
| 'wood', 'ebony', 'bamboo', 'reed', 'papyrus', | |
| 'linen fiber', 'cotton', 'hemp cord', 'sinew binding', 'hide leather', | |
| 'pitch', 'tar', 'coir rope', 'sea silk', 'wool yarn', | |
| // ceramic, vitreous, and fired substances | |
| 'glazed earthenware', 'terracotta', 'porcelain', 'fired kaolin', 'slip-painted clay', | |
| 'glass', 'colored vitreous paste', 'faience', 'enamel', 'slag glass', | |
| 'vitrified ash ceramic', 'stoneware', 'crackle glaze', 'lead glass', 'opaline glaze', | |
| // composite and treated materials | |
| 'laminated wood resin', 'bitumen-inlaid brick', 'shell-mosaic panel', 'lead-cored bronze', 'fiber-reinforced plaster', | |
| 'gesso overwood', 'gold leaf over copper', 'inlaid stone composite', 'painted gypsum', 'ceramic-metal hybrid', | |
| // rare and mythic (still real-world adjacent) | |
| 'tektite glass', 'fulgurite', 'petrified wood', 'ambergris', 'jet', | |
| 'pearlescent nacre', 'corundum crystal', 'saltstone', 'volcanic ash cement', 'phosphorized bone', | |
| // preservation and alteration states (physical forms you might treat as material) | |
| 'fossilized resin', 'carbonized wood', 'oxidized bronze', 'patinated copper', 'calcified coral', | |
| 'sintered clay', 'verdigris-coated metal', 'ironstone concretion', 'desiccated hide', 'mineral-encrusted ceramic' | |
| ] | |
| const liminalMaterials = [ | |
| // your originals | |
| 'bone laminated with thin copper foil', | |
| 'clay tempered with ground shell and mica', | |
| 'basalt inlaid with mother-of-pearl', | |
| 'woven fiber reinforced with resinous pitch', | |
| 'meteoritic iron riveted into carved antler', | |
| // metallurgical-organic | |
| 'ivory filigreed with gold wire', | |
| 'horn etched and filled with molten tin', | |
| 'tortoiseshell fused with silver mesh', | |
| 'hide laminated with beaten bronze', | |
| 'leather inlaid with hematite dust', | |
| // lithic-organic hybrids | |
| 'jade set with coral tesserae', | |
| 'limestone carved around a wooden core', | |
| 'obsidian backed with layered bark fiber', | |
| 'petrified wood veined with bitumen', | |
| 'quartzite drilled and sealed with beeswax', | |
| // mineral-metal composites | |
| 'malachite incrusted with iron nodules', | |
| 'hematite bonded to gilded lead', | |
| 'turquoise bound in electrum filigree', | |
| 'chalcedony studded with bronze nails', | |
| 'serpentine banded with steel pins', | |
| // ceramic and glass interfaces | |
| 'earthenware glazed with powdered shell', | |
| 'slip-painted terracotta overlaid with silver leaf', | |
| 'glass frit embedded in bituminous resin', | |
| 'vitrified clay reinforced with bronze rivets', | |
| 'porcelain fused to carved bone mountings', | |
| // textile and composite constructions | |
| 'linen braided with copper filament', | |
| 'woven bast fiber stiffened with blood-derived lacquer', | |
| 'reed mat coated in volcanic ash cement', | |
| 'hemp cloth impregnated with beeswax and soot', | |
| 'felted wool interleaved with mica flakes', | |
| // post-natural or speculative liminals | |
| 'organic resin infused with magnetite dust', | |
| 'basalt-thread composite stitched with hairline gold', | |
| 'coral matrix threaded with tin wire', | |
| 'calcined bone dust compressed in bronze molds', | |
| 'bitumen-laced ivory shell composite', | |
| // preservation-induced hybrids | |
| 'wood partially mineralized with iron oxide', | |
| 'copper encrusted with marine limestone accretions', | |
| 'bronze fused to coral skeleton', | |
| 'ivory calcified with siliceous deposits', | |
| 'textile carbonized and overlaid with crystal growth', | |
| // ambiguous technological residues | |
| 'clay embedded with fragments of vitreous metal slag', | |
| 'bronze rods fused within calcite', | |
| 'ceramic shards impregnated with bituminous varnish', | |
| 'mica sheets laminated with unknown polymer traces', | |
| 'electrum wire braided into fossilized fiber' | |
| ] | |
| const speculativeMaterials = [ | |
| // your originals | |
| 'fossil matrix threaded with copper filaments', | |
| 'glassy slag fused to coral growth', | |
| 'stone aggregate containing luminescent inclusions', | |
| 'organic resin preserving patterned air voids', | |
| 'unknown alloy showing directional grain like wood', | |
| // geochemical anomalies | |
| 'silicified clay containing magnetic dendrites', | |
| 'ironstone with vitrified cellular voids', | |
| 'calcite strata interleaved with metallic veins', | |
| 'basalt shot through with translucent nodules', | |
| 'mica schist exhibiting self-luminescent patterns', | |
| // metallurgical curiosities | |
| 'copper-silver intergrowth behaving as a single crystal', | |
| 'alloyed tin with fluctuating magnetic polarity', | |
| 'iron oxide layered with glassy crusts of unknown origin', | |
| 'zinc-lead compound that blooms with color under pressure', | |
| 'metallic foam showing fractal oxidation boundaries', | |
| // organo-mineral hybrids | |
| 'petrified wood fibers threaded with conductive ore', | |
| 'calcified tissue structures with embedded quartz filaments', | |
| 'amber nodules showing electrical response to touch', | |
| 'coral skeletons plated with ferrous microcrystals', | |
| 'bone mineralized into iridescent ceramic', | |
| // metamaterial and quasi-technological | |
| 'laminated sheets of fused ceramic and carbon fiber', | |
| 'thin strata of ferroglass etched with microcircuit patterns', | |
| 'hollow spheres of sintered silica enclosing air bubbles in lattice form', | |
| 'porous bronze exhibiting spontaneous thermal gradients', | |
| 'stratified alloy foils showing recursive lamination', | |
| // optical and photonic anomalies | |
| 'opaline matrix exhibiting slow refractive drift', | |
| 'quartz slabs that polarize ambient light irregularly', | |
| 'unknown translucent polymer with embedded diffraction lattice', | |
| 'mirrorlike graphite with variable albedo response', | |
| 'vitrified mineral with frozen interference bands', | |
| // bio-synthetic residues | |
| 'organic composite secreting crystalline salt layers', | |
| 'fungal chitin substrate ossified with copper dust', | |
| 'bioceramic sheath grown from unknown culture medium', | |
| 'mineral resin infused with dormant microbial filaments', | |
| 'amorphous gelstone retaining residual bioluminescence', | |
| // post-industrial detritus fossils | |
| 'glass-carbon conglomerate with polymeric inclusions', | |
| 'oxidized wire bundles fused into silicate crust', | |
| 'synthetic aggregate incorporating carbon nanotube traces', | |
| 'ceramic shards embedded with colored microbeads', | |
| 'slag-like material with encapsulated electronic fragments', | |
| // deep-time metamorphics | |
| 'metamorphic sandstone with metallic vein reformation', | |
| 'graphitized shale emitting low thermal radiation', | |
| 'sintered mineral foam with radial fracture fields', | |
| 'crystalline matrix recording magnetic reversals', | |
| 'iridescent breccia with melted fossil inclusions', | |
| // enigmatic and borderline impossible | |
| 'unknown silicate that flexes without fracture', | |
| 'metallic crystal with quasiperiodic twinning', | |
| 'carbon lattice refracting sound waves', | |
| 'transparent ore with internal fog dynamics', | |
| 'phase-shifting ceramic appearing slightly translucent in shadow' | |
| ] | |
| const motifs = [ | |
| // your originals | |
| 'concentric rings', | |
| 'tide-like wave chevrons', | |
| 'spiral lattices', | |
| 'interlocked avian and insect forms', | |
| 'stellar rosette arrays', | |
| 'braided knotwork with discontinuities', | |
| 'radial notches resembling lunations', | |
| 'paired eyes over crossed glyphs', | |
| 'alternating serrations and smooth fields', | |
| 'nested triangles aligned to cardinal directions', | |
| // geometric and harmonic structures | |
| 'overlapping hexagonal tilings', | |
| 'meander bands with mirrored terminals', | |
| 'spiral triskelions forming a continuous loop', | |
| 'offset diamond grids with filled voids', | |
| 'zigzag arrays shifting phase every seventh step', | |
| 'radial lines converging on an absent center', | |
| 'interrupted circles linked by incised threads', | |
| 'fractal tessellations fading into abrasion', | |
| 'triadic nodal clusters resembling constellations', | |
| 'quadrant divisions emphasizing asymmetry', | |
| // zoomorphic and hybrid figuration | |
| 'entwined serpent and bird morphs', | |
| 'bicephalic animal outlines with mirrored limbs', | |
| 'winged arthropods emerging from spiral centers', | |
| 'fish forms interleaved with human limbs', | |
| 'quadrupeds rendered as negative silhouettes', | |
| 'masked faces embedded in vine patterns', | |
| 'reptilian scales merging into feathered grids', | |
| 'composite cephalopod motifs surrounding apertures', | |
| 'insect wings reframed as leaf veins', | |
| 'avian claws clasping sun discs', | |
| // astronomical and temporal | |
| 'elliptical orbits scored with dot clusters', | |
| 'phased crescents surrounding a central void', | |
| 'ecliptic bands intersected by axial glyphs', | |
| 'solar burst marks radiating from central punctures', | |
| 'cometary tails etched in spiral motion', | |
| 'star clusters arranged in arithmetic progression', | |
| 'zigzag constellations marking solstices', | |
| 'orbital nodes connected by linear bridges', | |
| 'calendar glyphs representing missing days', | |
| 'recurring lunar pits carved to varying depth', | |
| // botanical and biomimetic | |
| 'spiral fronds coiling inward', | |
| 'repeating leaf-vein lattices', | |
| 'rootlike tendrils radiating from voids', | |
| 'flower-like rosettes overlaid with dot seeds', | |
| 'vines twined into helical bands', | |
| 'shell-whorl patterns merging into spirals', | |
| 'fungal gill textures replicated in relief', | |
| 'branching coral morphologies in radial symmetry', | |
| 'seed-pod outlines split into mirrored halves', | |
| 'fiberlike striations that terminate abruptly', | |
| // symbolic, abstract, or linguistic | |
| 'glyphic sequences repeating with minor drift', | |
| 'parallel lines interrupted by rhythmic gaps', | |
| 'mirror-script inscriptions impossible to parse', | |
| 'cross-hatched grids forming pseudo-letters', | |
| 'interrupted text lines replaced with geometric substitutions', | |
| 'matrices of dots forming uncertain numerals', | |
| 'recursive symbols nested within larger ideograms', | |
| 'rotational symmetries implying linguistic rhythm', | |
| 'paired strokes alternating direction every few lines', | |
| 'abstract icons resembling both letters and insects', | |
| // mechanical or proto-technological | |
| 'gear-like circular patterns with uneven teeth', | |
| 'grids of perforations suggesting ventilation or sound', | |
| 'calibration marks spaced in harmonic intervals', | |
| 'grooved arcs resembling wave interference', | |
| 'linked discs with offset pivot points', | |
| 'etched cogs arranged in broken chains', | |
| 'line pairs showing progressive displacement', | |
| 'tessellated scales indicating measurement series', | |
| 'radial grooves converging on drilled apertures', | |
| 'series of index marks terminating in voids', | |
| // liminal or anomalous | |
| 'engraved vortices that seem to reverse direction under light', | |
| 'patterns whose repetition shifts subtly across the surface', | |
| 'incomplete glyph chains fading into dissolution', | |
| 'engraved voids forming ghostly negative reliefs', | |
| 'incised arcs that match neither known geometry nor chaos', | |
| 'structures echoing magnetic field lines', | |
| 'contour traces visible only under oblique illumination', | |
| 'superimposed carvings creating moiré interference', | |
| 'geometries that imply four-dimensional projection', | |
| 'symmetries disrupted by deliberate fractures' | |
| ] | |
| const functionsPlausible = [ | |
| // your originals | |
| 'marking seasonal rites', | |
| 'encoding lunar counts', | |
| 'serving as a funerary pledge', | |
| 'designating clan or maritime routes', | |
| 'calming or inducing trance by touch', | |
| 'pouring libations in threshold rituals', | |
| // calendrical and astronomical | |
| 'tracking the heliacal rising of key stars', | |
| 'measuring tidal or riverine cycles', | |
| 'marking solstice processions', | |
| 'aligning offerings with celestial conjunctions', | |
| 'mapping stellar parallax for navigation', | |
| 'recording intercalary months between years', | |
| 'synchronizing agricultural festivals', | |
| 'tracking eclipse intervals or omens', | |
| 'commemorating cycles of planetary return', | |
| 'regulating ritual calendars through shadow measurement', | |
| // funerary and votive | |
| 'ensuring continuity between generations', | |
| 'anchoring a spirit to ancestral domains', | |
| 'representing the oath of interment', | |
| 'protecting remains from malevolent entities', | |
| 'recording the name or essence of the deceased', | |
| 'binding grave goods to ritual identity', | |
| 'preserving a pledge of kinship beyond death', | |
| 'sealing tombs against intruders with symbolic locks', | |
| 'providing sustenance to the afterlife through symbolic vessels', | |
| 'serving as an intermediary between mourners and spirits', | |
| // ritual and ceremonial | |
| 'used to sanctify a meeting place before assemblies', | |
| 'carried in processions to invoke fertility or rain', | |
| 'cast into fire or water to seal pacts', | |
| 'offered to ensure harvest abundance', | |
| 'used in rites of passage or initiation', | |
| 'smeared with pigment or ash to awaken power', | |
| 'set at temple thresholds to repel malign forces', | |
| 'anointed with oil to consecrate new leaders', | |
| 'used as a tactile focus for meditative chants', | |
| 'rotated or shaken to produce ritual resonance', | |
| // social and communicative | |
| 'denoting rank or lineage among initiates', | |
| 'functioning as a mnemonic emblem of oral contracts', | |
| 'marking boundaries between tribal domains', | |
| 'serving as a passport for long-distance trade', | |
| 'encoding taboos or moral laws through imagery', | |
| 'identifying membership within mystery cults', | |
| 'recording victories or alliances between kin groups', | |
| 'marking the completion of long pilgrimages', | |
| 'acting as token proof of safe passage', | |
| 'carried as symbols of hospitality or protection', | |
| // practical or technological reinterpretations | |
| 'used as a primitive compass or orientation aid', | |
| 'controlling the flow of water or grain in offerings', | |
| 'serving as a tuning weight for stringed instruments', | |
| 'functioning as a heat calibration marker in kilns', | |
| 'amplifying sound in echo chambers', | |
| 'used to align multiple devices in ritual synchronization', | |
| 'acting as a prototype of record-keeping tools', | |
| 'serving as a rudimentary astrolabe or gnomon', | |
| 'providing harmonic resonance for ceremonial speech', | |
| 'emitting tones when rotated or struck', | |
| // psychological, mnemonic, and experiential | |
| 'used to focus trance induction or altered states', | |
| 'providing haptic reinforcement for memory recall', | |
| 'acting as a tactile aid for reciting genealogies', | |
| 'producing rhythmic feedback through manipulation', | |
| 'channeling collective emotion during performance', | |
| 'serving as a token of personal devotion or penitence', | |
| 'marking the stages of a meditative journey', | |
| 'imbued with symbolic balance to restore order', | |
| 'used to focus communal attention in chanting rituals', | |
| 'stimulating trance through repetitive touch patterns', | |
| // symbolic or speculative | |
| 'representing cosmological models of the world', | |
| 'encoding mythic genealogies of creation', | |
| 'symbolizing the conjunction of land and sea spirits', | |
| 'signifying renewal through cyclic destruction', | |
| 'embodying the contract between mortals and deities', | |
| 'serving as a token of the first covenant', | |
| 'depicting the rhythm of alternating ages', | |
| 'used to manifest or trap divine breath', | |
| 'materializing spoken incantations into form', | |
| 'representing the lost names of forgotten gods' | |
| ] | |
| const functionsSpeculative = [ | |
| // your originals | |
| 'mapping sound to geography', | |
| 'mediating exchanges between mineral and animal', | |
| 'storing a non-luminous notion of “light”', | |
| 'harmonizing winds with tidal calendars', | |
| 'indexing migrations by scent or resin traces', | |
| // semi-physical cosmotechnics | |
| 'translating stellar motion into subsonic vibration', | |
| 'modulating temperature through patterned resonance', | |
| 'encoding the decay rate of memory in mineral form', | |
| 'stabilizing dream-imagery across multiple minds', | |
| 'amplifying electromagnetic whispers from soil strata', | |
| 'capturing tidal harmonics as geometric interference', | |
| 'synchronizing the pulse of animal herds with magnetic drift', | |
| 'recording seismic precursors as symbolic notation', | |
| 'equalizing pressure gradients within enclosed rituals', | |
| 'balancing oceanic salinity through ritual induction', | |
| // psychoacoustic and perceptual | |
| 'rendering inaudible frequencies into tactile reliefs', | |
| 'adjusting the hue of ambient silence', | |
| 'evoking ancestral memory through resonance mapping', | |
| 'translating scent into tonal intervals', | |
| 'filtering emotional states into physical vibration', | |
| 'maintaining shared hallucinations between participants', | |
| 'anchoring wandering attention to specific magnetic fields', | |
| 'encoding oral myths into interference beats', | |
| 'storing collective memory in patterned echoes', | |
| 'projecting unseen structures through harmonics', | |
| // ontological or metaphysical interactions | |
| 'mediating between animate and inanimate consciousness', | |
| 'acting as a relay for mineral cognition', | |
| 'stabilizing boundaries between thought and matter', | |
| 'translating rainfall into proto-linguistic sequences', | |
| 'coordinating planetary breath across altitudes', | |
| 'maintaining parity between solar and subterranean forces', | |
| 'preserving patterns of probability in crystal matrices', | |
| 'binding intentions into persistent spatial arrangements', | |
| 'manifesting unseen temporal strata through vibration', | |
| 'conducting spiritual charge through mineral resonance', | |
| // ritual-cognitive and information-theoretic | |
| 'transducing ritual rhythm into data-bearing form', | |
| 'encoding cosmological alignments as nested pulses', | |
| 'balancing entropy between sacred and profane domains', | |
| 'mapping sacred geometry to neural oscillations', | |
| 'modulating dreamtime synchronization', | |
| 'compressing mnemonic sequences into harmonic keys', | |
| 'preserving extinct phonemes through material vibration', | |
| 'translating ritual cadence into thermal gradients', | |
| 'serving as a bridge between spoken prayer and meteorological change', | |
| 'recording interpersonal affect as ambient charge', | |
| // ecological and multispecies mediation | |
| 'enabling dialogue between coral and atmosphere', | |
| 'marking the migratory impulse of extinct insects', | |
| 'filtering soil nutrients through symbolic geometry', | |
| 'encoding whale song into tidal refractive patterns', | |
| 'attuning fungal growth to geomagnetic variance', | |
| 'choreographing root systems via acoustic feedback', | |
| 'storing pollination routes as scent harmonics', | |
| 'translating mineral dissolution into rhythm', | |
| 'mediating rainfall intent through leaf resonance', | |
| 'measuring planetary respiration through spore emission', | |
| // paradoxical or metaphoric | |
| 'recording future weather as memory residue', | |
| 'reflecting light that never entered', | |
| 'balancing time flow within closed ceremonial loops', | |
| 'retaining the shadow of vanished constellations', | |
| 'delaying decay through patterns of forgetting', | |
| 'translating myth into matter and back again', | |
| 'filtering chaos through selective inattention', | |
| 'binding spatial dimensions in self-reflective sequence', | |
| 'anchoring alternate histories into local topology', | |
| 'making visible the geometry of belief itself' | |
| ] | |
| const interpretations = [ | |
| // your originals | |
| 'reflects a worldview in which boundaries between living and made things are porous', | |
| 'suggests a calendar based on tides rather than solar months', | |
| 'implies navigation by resonance rather than sight', | |
| 'indicates rites of metamorphosis tied to burial and emergence', | |
| 'links kinship to specific stones or reefs rather than lineages', | |
| 'treats writing as concentric circulation rather than linear sequence', | |
| 'equates the spirit of wind with patterned surfaces', | |
| // cosmological and ecological models | |
| 'posits that mountains were once living entities undergoing slow respiration', | |
| 'frames celestial bodies as participants in local ritual economies', | |
| 'implies an understanding of weather as an index of collective emotion', | |
| 'equates rainfall with memory rather than sustenance', | |
| 'suggests tides were regarded as the pulse of the planet’s body', | |
| 'treats erosion as divine inscription rather than decay', | |
| 'renders the horizon as a reciprocal organ of perception', | |
| 'identifies the night sky as a system for exchanging dreams', | |
| 'proposes that flora and minerals shared communicative rhythms', | |
| 'links celestial precession to rites of gestation and molting', | |
| // epistemic and symbolic | |
| 'assumes that knowledge was stored through patterned motion, not recordkeeping', | |
| 'implies truth was measured by resonance rather than correspondence', | |
| 'renders geometry as a theology of continuity', | |
| 'interprets inscription as an act of nourishment, not communication', | |
| 'suggests that counting was once a devotional rather than quantitative act', | |
| 'frames craftsmanship as a mode of listening rather than making', | |
| 'links color perception to moral or seasonal phases', | |
| 'conceives of direction as emotional orientation rather than spatial vector', | |
| 'implies that symmetry was avoided to preserve contingency', | |
| 'equates meaning with material vibration rather than abstraction', | |
| // social and ritual frameworks | |
| 'infers a kinship system maintained through shared gestures instead of ancestry', | |
| 'assumes property was defined by resonance proximity rather than possession', | |
| 'suggests that law was embodied in pattern repetition, not decree', | |
| 'implies authority derived from fluency with meteorological change', | |
| 'depicts exchange as ceremonial imitation rather than trade', | |
| 'assumes healing was enacted through acoustic modulation', | |
| 'suggests collective trance replaced written contracts', | |
| 'frames conflict as the interruption of seasonal rhythm', | |
| 'proposes that childbirth and construction shared a single rite sequence', | |
| 'suggests wealth was measured in echoes rather than objects', | |
| // linguistic and cognitive | |
| 'views speech as a temporary manifestation of landscape forces', | |
| 'treats writing as a reanimation of sediment and ash', | |
| 'suggests syntax mirrored water flow rather than logical order', | |
| 'implies cognition extended into tools and habitats', | |
| 'frames silence as a form of grammatical punctuation', | |
| 'conceives narrative as orbital recurrence, not progression', | |
| 'assumes translation was an act of weather-working', | |
| 'renders forgetting as a deliberate cultural technology', | |
| 'posits grammar as a ritual to stabilize communal memory', | |
| 'links phonemes to astronomical conjunctions', | |
| // metaphysical and ontological | |
| 'proposes that death was regarded as a change in density, not cessation', | |
| 'suggests the soul was thought to oscillate between mineral and vapor states', | |
| 'equates intention with temperature rather than will', | |
| 'frames creation as rhythmic folding rather than ex nihilo emergence', | |
| 'implies being was conceived as a fluid between categories, not a substance', | |
| 'renders divinity as distributed pattern recognition', | |
| 'identifies material decay as a form of communication with the unseen', | |
| 'suggests the cosmos was tuned like an instrument rather than observed as space', | |
| 'links enlightenment to the dissolution of contrast boundaries', | |
| 'proposes that seeing was considered a reciprocal act of being seen', | |
| // anomalous or paradoxical | |
| 'describes time as reversible but only in ritual performance', | |
| 'interprets reflection as a form of speech between worlds', | |
| 'treats shadow as evidence of immaterial presence', | |
| 'asserts that matter was once self-aware in limited cycles', | |
| 'suggests distance was measured by emotional delay rather than space', | |
| 'frames artifice as a corrective to natural imbalance', | |
| 'equates corrosion with cosmic attention', | |
| 'posits a belief that tools dream when left unused', | |
| 'treats error as a sacred property of living systems', | |
| 'implies that the artifact itself is an observer of its interpreters' | |
| ] | |
| const contextFrames = [ | |
| // your originals | |
| 'unearthed from strata beneath volcanic ash lenses', | |
| 'recovered from a collapsed rock shelter with shell middens', | |
| 'found in a burial cache with red ochre staining', | |
| 'extracted from a shoreline site with storm overwash', | |
| 'collected in situ beside hearth features and knapped debris', | |
| 'documented among a cluster of postholes and threshold stones', | |
| // buried and stratigraphic contexts | |
| 'retrieved from a sealed layer beneath calcareous concretions', | |
| 'exhumed from loess deposits cut by glacial runoff', | |
| 'isolated within a paleosol horizon rich in charcoal lenses', | |
| 'lifted from compacted silt under alluvial gravels', | |
| 'found embedded in oxidized clay with manganese dendrites', | |
| 'recovered from cross-bedded dune sequences showing habitation traces', | |
| 'extracted from a marl lens beneath a collapsed terrace wall', | |
| 'recorded within a stratified midden capped by volcanic tephra', | |
| 'uncovered below a layer of reworked aeolian sand', | |
| 'retrieved from a brecciated deposit of mixed cultural material', | |
| // architectural and domestic features | |
| 'removed from the fill of a disused hearth circle', | |
| 'recovered under a collapsed corbelled vault', | |
| 'found resting atop flagstone flooring coated with soot', | |
| 'documented in a domestic courtyard with pigment residues', | |
| 'collected from drainage channels beneath a workshop platform', | |
| 'excavated from posthole packing with carbonized wood fragments', | |
| 'retrieved from beneath a threshold slab with ritual inlay', | |
| 'isolated within wall collapse debris containing burned plaster', | |
| 'lifted from the base of a storage pit lined with clay', | |
| 'found wedged between foundation stones and ash mortar', | |
| // ritual, funerary, and votive contexts | |
| 'discovered within a sealed offering pit surrounded by pebbles', | |
| 'taken from a chambered cairn containing mixed human remains', | |
| 'lifted from beneath an altar stone with charred seed impressions', | |
| 'recovered near a cenotaph ringed by ceramic fragments', | |
| 'extracted from a pit of ash and bone consistent with cremation', | |
| 'found adjacent to a carved menhir and pigment bowl', | |
| 'documented within a temple floor deposit of miniature vessels', | |
| 'collected from a riverbank cairn used for votive deposits', | |
| 'uncovered in association with shell beads and ochre nodules', | |
| 'retrieved from a mortuary trench sealed by cobbles', | |
| // aquatic and coastal | |
| 'recovered from submerged peat in an ancient lagoon', | |
| 'dredged from estuarine silts with timber post alignments', | |
| 'found entangled in coralline concretions near tidal channels', | |
| 'retrieved from beneath intertidal drift accumulations', | |
| 'collected along a paleo-shoreline now inland by several kilometers', | |
| 'lifted from mangrove mud containing fishbone refuse', | |
| 'excavated from a beach ridge stabilized by coral fragments', | |
| 'recorded in a salt-marsh horizon with reed impressions', | |
| 'found within storm-tossed shingle mixed with ceramics', | |
| 'taken from a collapsed jetty foundation under brackish sediment', | |
| // cave, highland, and interior | |
| 'found deep within a karstic fissure containing bat guano lenses', | |
| 'extracted from a limestone alcove blackened by torch soot', | |
| 'recovered from talus at the mouth of a lava tube shelter', | |
| 'documented in a scree slope pocket beneath pictograph panels', | |
| 'collected from high plateau deposits interleaved with frost heave layers', | |
| 'lifted from a permafrost lens preserving organic fibers', | |
| 'retrieved from a collapsed doline filled with dripstone debris', | |
| 'found sealed behind a stalagmitic curtain', | |
| 'exhumed from a terrace cave with hearth ash lenses', | |
| 'recovered from an upland basin containing glacial erratics', | |
| // artifact concentrations and re-use | |
| 'isolated among a scatter of broken figurines and slag droplets', | |
| 'found repurposed within later masonry as a foundation relic', | |
| 'collected from a refuse layer overlying earlier habitation', | |
| 'retrieved from a cache of tools sealed with resin plugs', | |
| 'documented within an erosion gully exposing secondary deposition', | |
| 'recovered near slag heaps and smelting furnaces', | |
| 'lifted from a collapsed storage jar cluster', | |
| 'found embedded in redeposited midden fill from rebuilding episodes', | |
| 'extracted from debris linked to ritual closure of a dwelling', | |
| 'uncovered beside a trench containing reused ceremonial fragments', | |
| // extreme and anomalous contexts | |
| 'encased in sinter growth within a hot-spring vent', | |
| 'entombed in ice beneath glacial melt layers', | |
| 'fused into vitrified stone from surface combustion', | |
| 'embedded in flood-laid sediment mixed with freshwater shells', | |
| 'found adhered to stalagmite accretions of unusual color', | |
| 'extracted from a fumarolic deposit of sulfur and clay', | |
| 'recovered from a sinkhole with both marine and terrestrial fauna', | |
| 'lifted from a peat bog displaying anaerobic preservation', | |
| 'recorded at the boundary of a burned forest horizon', | |
| 'collected from a site disturbed by seismic liquefaction' | |
| ] | |
| const identifiers = () => { | |
| const y = 1890 + Math.floor(Math.random() * 140) // rhetorical, not the seed rng | |
| const id = Math.floor(Math.random() * 900) + 100 | |
| return `Artifact ${id} – Excavation Log ${y}, Site ${String.fromCharCode(65 + Math.floor(Math.random() * 6))}-${Math.floor(Math.random()*30)+1}` | |
| } | |
| // --- Generator core ---- | |
| const generateArtifactData = (opts = {}) => { | |
| const { | |
| seed, | |
| plausibility = 0.7, // 0 = surreal, 1 = highly plausible | |
| region, // override with a real region string | |
| culture, // override with an ethnonym string | |
| forceType, // override artifact type | |
| addCatalogId = true, // include archival label flavor | |
| maxMotifs = 2, | |
| addCaveats = true // add scholarly hedging language | |
| } = opts | |
| const actualSeed = seed ?? Math.floor(Math.random() * 1e9) | |
| const rng = makeRng(actualSeed) | |
| const reg = region || choose(rng, regions) | |
| const cul = culture || choose(rng, inventedEthnonyms) | |
| const type = forceType || choose(rng, artifactTypes) | |
| // material blending by plausibility | |
| const matPool = plausibility > 0.8 | |
| ? realMaterials | |
| : plausibility > 0.5 | |
| ? realMaterials.concat(liminalMaterials) | |
| : realMaterials.concat(liminalMaterials).concat(speculativeMaterials) | |
| const materials = choose(rng, matPool, rng() < 0.4 ? 2 : 1) | |
| const motifsPicked = choose(rng, motifs, Math.max(1, Math.round(1 + rng() * (maxMotifs - 1)))) | |
| const context = choose(rng, contextFrames) | |
| const func = plausibility >= 0.6 | |
| ? choose(rng, functionsPlausible) | |
| : `${choose(rng, functionsPlausible)} or ${choose(rng, functionsSpeculative)}` | |
| const interp = choose(rng, interpretations) | |
| const hedge = addCaveats | |
| ? choose(rng, [ | |
| 'likely', 'possibly', 'provisionally', 'tentatively', 'with no definitive parallels' | |
| ]) | |
| : null | |
| const idLine = addCatalogId ? identifiers() : null | |
| const materialsList = Array.isArray(materials) ? materials : [materials] | |
| const motifsList = Array.isArray(motifsPicked) ? motifsPicked : [motifsPicked] | |
| const functionUse = `${func}${hedge ? `, ${hedge}` : ''}` | |
| const description = `Archaeological documentation of a ${type} from the ${cul} culture, excavated in ${reg}.` | |
| const construction = `Constructed from ${materialsList.join(' and ')}, featuring ${motifsList.join(' and ')}.` | |
| const useLine = `Believed to be used for ${functionUse}.` | |
| const contextLine = `Context: ${context}.` | |
| const interpretationLine = `Scholarly interpretation: ${interp}.` | |
| const tag = `Presented as a real object from a hypothetical history` | |
| const lines = [] | |
| if (idLine) lines.push(idLine) | |
| lines.push(description, construction, useLine, contextLine, interpretationLine, tag) | |
| return { | |
| id: idLine, | |
| type, | |
| culture: cul, | |
| region: reg, | |
| materials: materialsList, | |
| motifs: motifsList, | |
| functionUse, | |
| context, | |
| interpretation: interp, | |
| notes: tag, | |
| lines: {description, construction, useLine, contextLine, interpretationLine, tag}, | |
| fullText: lines.join(' '), | |
| seed: actualSeed | |
| } | |
| } | |
| const generateArtifactPrompt = (opts = {}) => generateArtifactData(opts).fullText | |
| // --- Batch helper ---- | |
| const generateSeries = (n = 4, opts = {}) => | |
| Array.from({length: n}, (_, i) => generateArtifactPrompt({...opts, seed: (opts.seed ?? 0) + i})) | |
| const artifactApi = {generateArtifactData, generateArtifactPrompt, generateSeries} | |
| // CommonJS and browser-friendly export | |
| if (typeof module !== 'undefined' && module.exports) { | |
| module.exports = artifactApi | |
| } | |
| if (typeof window !== 'undefined') { | |
| window.artifactGenerator = artifactApi | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Artifact Archive</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com"> | |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap" rel="stylesheet"> | |
| <style> | |
| :root { | |
| --paper: #f6f2e8; | |
| --ink: #2f2a1f; | |
| --muted: #645c4f; | |
| --accent: #c3b59f; | |
| --border: #d9d1c3; | |
| } | |
| * { box-sizing: border-box; } | |
| body { | |
| margin: 0; | |
| font-family: 'Inter', system-ui, -apple-system, sans-serif; | |
| background: radial-gradient(circle at 20% 20%, rgba(255,255,255,0.45), transparent 35%), radial-gradient(circle at 80% 0%, rgba(255,255,255,0.35), transparent 30%), var(--paper); | |
| color: var(--ink); | |
| min-height: 100vh; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: 32px; | |
| } | |
| .page { | |
| width: min(960px, 100%); | |
| display: grid; | |
| gap: 16px; | |
| } | |
| .masthead { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: baseline; | |
| font-size: 14px; | |
| letter-spacing: 0.06em; | |
| color: var(--muted); | |
| text-transform: uppercase; | |
| } | |
| .stamp { | |
| padding: 6px 10px; | |
| border: 1px solid var(--border); | |
| background: #fffaf1; | |
| box-shadow: inset 0 0 0 1px #efe5d6; | |
| font-family: 'IBM Plex Mono', 'Inter', monospace; | |
| font-weight: 500; | |
| } | |
| .card { | |
| background: #fffdf8; | |
| border: 1px solid var(--border); | |
| box-shadow: 0 14px 34px rgba(41, 36, 26, 0.1), inset 0 1px 0 rgba(255,255,255,0.7); | |
| padding: 20px 24px 24px; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .card::before { | |
| content: ''; | |
| position: absolute; | |
| inset: 12px 14px; | |
| border: 1px dashed rgba(100, 92, 79, 0.3); | |
| pointer-events: none; | |
| } | |
| .card-heading { | |
| display: flex; | |
| justify-content: space-between; | |
| gap: 12px; | |
| align-items: flex-end; | |
| margin-bottom: 12px; | |
| } | |
| .heading-title { | |
| font-family: 'IBM Plex Mono', 'Inter', monospace; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| font-size: 15px; | |
| color: var(--muted); | |
| } | |
| .heading-id { | |
| font-family: 'IBM Plex Mono', 'Inter', monospace; | |
| font-size: 13px; | |
| color: var(--ink); | |
| padding: 6px 10px; | |
| border: 1px solid var(--border); | |
| background: #fffaf1; | |
| min-width: 240px; | |
| text-align: right; | |
| } | |
| .grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); | |
| gap: 10px 16px; | |
| margin-bottom: 14px; | |
| } | |
| .field { | |
| display: grid; | |
| gap: 4px; | |
| background: rgba(227, 219, 202, 0.2); | |
| border: 1px solid rgba(201, 188, 169, 0.7); | |
| padding: 10px 12px; | |
| } | |
| .label { | |
| font-family: 'IBM Plex Mono', 'Inter', monospace; | |
| font-size: 11px; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| color: var(--muted); | |
| } | |
| .value { | |
| font-size: 15px; | |
| line-height: 1.5; | |
| } | |
| .notes { | |
| border-top: 1px solid var(--border); | |
| padding-top: 12px; | |
| margin-top: 8px; | |
| } | |
| .notes p { | |
| margin: 6px 0 0; | |
| line-height: 1.6; | |
| color: var(--ink); | |
| } | |
| .actions { | |
| display: flex; | |
| justify-content: flex-end; | |
| gap: 8px; | |
| } | |
| button { | |
| background: #fff; | |
| border: 1px solid var(--border); | |
| color: var(--ink); | |
| padding: 10px 16px; | |
| font-family: 'IBM Plex Mono', 'Inter', monospace; | |
| letter-spacing: 0.04em; | |
| text-transform: uppercase; | |
| cursor: pointer; | |
| transition: transform 120ms ease, box-shadow 120ms ease; | |
| box-shadow: 0 6px 18px rgba(41,36,26,0.08); | |
| } | |
| button:hover { | |
| transform: translateY(-1px); | |
| box-shadow: 0 10px 22px rgba(41,36,26,0.12); | |
| } | |
| button:active { | |
| transform: translateY(0); | |
| box-shadow: 0 4px 12px rgba(41,36,26,0.1); | |
| } | |
| @media (max-width: 640px) { | |
| body { padding: 18px; } | |
| .heading-id { min-width: auto; font-size: 12px; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="page"> | |
| <header class="masthead"> | |
| <div class="stamp">Field Archive · Artifact Card</div> | |
| <div class="meta"> | |
| Generated <span id="generated-at">—</span> | |
| </div> | |
| </header> | |
| <main class="card" aria-live="polite"> | |
| <div class="card-heading"> | |
| <div class="heading-title">Artifact Record</div> | |
| <div class="heading-id" id="artifact-id">Uncatalogued</div> | |
| </div> | |
| <div class="grid"> | |
| <div class="field"> | |
| <div class="label">Culture</div> | |
| <div class="value" id="culture"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Region</div> | |
| <div class="value" id="region"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Type</div> | |
| <div class="value" id="type"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Materials</div> | |
| <div class="value" id="materials"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Motifs</div> | |
| <div class="value" id="motifs"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Function (inferred)</div> | |
| <div class="value" id="function"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Context</div> | |
| <div class="value" id="context"></div> | |
| </div> | |
| <div class="field"> | |
| <div class="label">Interpretation</div> | |
| <div class="value" id="interpretation"></div> | |
| </div> | |
| </div> | |
| <div class="notes"> | |
| <div class="label">Narrative abstract</div> | |
| <p id="full-text"></p> | |
| </div> | |
| </main> | |
| <div class="actions"> | |
| <button id="regen" type="button">Next artifact</button> | |
| </div> | |
| </div> | |
| <script src="./artifact.js"></script> | |
| <script> | |
| const cultureEl = document.getElementById('culture') | |
| const regionEl = document.getElementById('region') | |
| const typeEl = document.getElementById('type') | |
| const materialsEl = document.getElementById('materials') | |
| const motifsEl = document.getElementById('motifs') | |
| const functionEl = document.getElementById('function') | |
| const contextEl = document.getElementById('context') | |
| const interpretationEl = document.getElementById('interpretation') | |
| const fullTextEl = document.getElementById('full-text') | |
| const idEl = document.getElementById('artifact-id') | |
| const generatedAtEl = document.getElementById('generated-at') | |
| const renderArtifact = () => { | |
| const data = window.artifactGenerator.generateArtifactData() | |
| cultureEl.textContent = data.culture | |
| regionEl.textContent = data.region | |
| typeEl.textContent = data.type | |
| materialsEl.textContent = data.materials.join(' • ') | |
| motifsEl.textContent = data.motifs.join(' • ') | |
| functionEl.textContent = data.functionUse | |
| contextEl.textContent = data.context | |
| interpretationEl.textContent = data.interpretation | |
| fullTextEl.textContent = data.fullText | |
| idEl.textContent = data.id || 'Uncatalogued' | |
| generatedAtEl.textContent = new Date().toLocaleString() | |
| } | |
| document.getElementById('regen').addEventListener('click', renderArtifact) | |
| renderArtifact() | |
| </script> | |
| </body> | |
| </html> | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment