diff options
| author | Paul Buetow <paul@buetow.org> | 2026-01-25 10:51:58 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-01-25 10:51:58 +0200 |
| commit | 3cf0ed0cba706c45833ad06bddfce2acefca6a37 (patch) | |
| tree | ea90532bb51b2d4bfff0f6a8e2f3c441b1b5707f | |
Add sci-fi book showcase with 54 books, covers, and summaries
Interactive HTML page featuring sci-fi book collection with:
- Responsive grid layout with book cover thumbnails
- Click-to-expand modal with cover, metadata, and summary
- Filter by author, format, and text search
- All 54 covers and summaries stored locally for offline use
- Authors include Brandhorst, Reynolds, Clarke, Banks, Simmons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
| -rw-r--r-- | css/styles.css | 505 | ||||
| -rw-r--r-- | data/books.json | 652 | ||||
| -rw-r--r-- | images/covers/1.jpg | bin | 0 -> 29314 bytes | |||
| -rw-r--r-- | images/covers/10.jpg | bin | 0 -> 45065 bytes | |||
| -rw-r--r-- | images/covers/11.jpg | bin | 0 -> 35676 bytes | |||
| -rw-r--r-- | images/covers/12.jpg | bin | 0 -> 90209 bytes | |||
| -rw-r--r-- | images/covers/13.jpg | bin | 0 -> 83092 bytes | |||
| -rw-r--r-- | images/covers/14.jpg | bin | 0 -> 34109 bytes | |||
| -rw-r--r-- | images/covers/15.jpg | bin | 0 -> 42337 bytes | |||
| -rw-r--r-- | images/covers/16.jpg | bin | 0 -> 47024 bytes | |||
| -rw-r--r-- | images/covers/17.jpg | bin | 0 -> 50155 bytes | |||
| -rw-r--r-- | images/covers/18.jpg | bin | 0 -> 45396 bytes | |||
| -rw-r--r-- | images/covers/19.jpg | bin | 0 -> 49327 bytes | |||
| -rw-r--r-- | images/covers/2.jpg | bin | 0 -> 36080 bytes | |||
| -rw-r--r-- | images/covers/20.jpg | bin | 0 -> 88702 bytes | |||
| -rw-r--r-- | images/covers/21.jpg | bin | 0 -> 81404 bytes | |||
| -rw-r--r-- | images/covers/22.jpg | bin | 0 -> 27703 bytes | |||
| -rw-r--r-- | images/covers/23.jpg | bin | 0 -> 44442 bytes | |||
| -rw-r--r-- | images/covers/24.jpg | bin | 0 -> 53616 bytes | |||
| -rw-r--r-- | images/covers/25.jpg | bin | 0 -> 31503 bytes | |||
| -rw-r--r-- | images/covers/26.jpg | bin | 0 -> 25049 bytes | |||
| -rw-r--r-- | images/covers/27.jpg | bin | 0 -> 30299 bytes | |||
| -rw-r--r-- | images/covers/28.jpg | bin | 0 -> 34005 bytes | |||
| -rw-r--r-- | images/covers/29.jpg | bin | 0 -> 18066 bytes | |||
| -rw-r--r-- | images/covers/3.jpg | bin | 0 -> 21254 bytes | |||
| -rw-r--r-- | images/covers/30.jpg | bin | 0 -> 26656 bytes | |||
| -rw-r--r-- | images/covers/31.jpg | bin | 0 -> 28194 bytes | |||
| -rw-r--r-- | images/covers/32.jpg | bin | 0 -> 28131 bytes | |||
| -rw-r--r-- | images/covers/33.jpg | bin | 0 -> 28877 bytes | |||
| -rw-r--r-- | images/covers/34.jpg | bin | 0 -> 26888 bytes | |||
| -rw-r--r-- | images/covers/35.jpg | bin | 0 -> 33636 bytes | |||
| -rw-r--r-- | images/covers/36.jpg | bin | 0 -> 22301 bytes | |||
| -rw-r--r-- | images/covers/37.jpg | bin | 0 -> 30647 bytes | |||
| -rw-r--r-- | images/covers/38.jpg | bin | 0 -> 84574 bytes | |||
| -rw-r--r-- | images/covers/39.jpg | bin | 0 -> 51592 bytes | |||
| -rw-r--r-- | images/covers/4.jpg | bin | 0 -> 51821 bytes | |||
| -rw-r--r-- | images/covers/40.jpg | bin | 0 -> 30344 bytes | |||
| -rw-r--r-- | images/covers/41.jpg | bin | 0 -> 28135 bytes | |||
| -rw-r--r-- | images/covers/42.jpg | bin | 0 -> 23216 bytes | |||
| -rw-r--r-- | images/covers/43.jpg | bin | 0 -> 34254 bytes | |||
| -rw-r--r-- | images/covers/44.jpg | bin | 0 -> 29677 bytes | |||
| -rw-r--r-- | images/covers/45.jpg | bin | 0 -> 33940 bytes | |||
| -rw-r--r-- | images/covers/46.jpg | bin | 0 -> 35886 bytes | |||
| -rw-r--r-- | images/covers/47.jpg | bin | 0 -> 53445 bytes | |||
| -rw-r--r-- | images/covers/48.jpg | bin | 0 -> 54987 bytes | |||
| -rw-r--r-- | images/covers/49.jpg | bin | 0 -> 20559 bytes | |||
| -rw-r--r-- | images/covers/5.jpg | bin | 0 -> 29581 bytes | |||
| -rw-r--r-- | images/covers/50.jpg | bin | 0 -> 44457 bytes | |||
| -rw-r--r-- | images/covers/51.jpg | bin | 0 -> 21106 bytes | |||
| -rw-r--r-- | images/covers/52.jpg | bin | 0 -> 50727 bytes | |||
| -rw-r--r-- | images/covers/53.jpg | bin | 0 -> 35815 bytes | |||
| -rw-r--r-- | images/covers/54.jpg | bin | 0 -> 42861 bytes | |||
| -rw-r--r-- | images/covers/6.jpg | bin | 0 -> 38649 bytes | |||
| -rw-r--r-- | images/covers/7.jpg | bin | 0 -> 63140 bytes | |||
| -rw-r--r-- | images/covers/8.jpg | bin | 0 -> 33946 bytes | |||
| -rw-r--r-- | images/covers/9.jpg | bin | 0 -> 40262 bytes | |||
| -rw-r--r-- | index.html | 66 | ||||
| -rw-r--r-- | js/app.js | 301 |
58 files changed, 1524 insertions, 0 deletions
diff --git a/css/styles.css b/css/styles.css new file mode 100644 index 0000000..2f7d8e5 --- /dev/null +++ b/css/styles.css @@ -0,0 +1,505 @@ +/* CSS Variables for theming */ +:root { + --bg-primary: #0a0a0f; + --bg-secondary: #12121a; + --bg-card: #1a1a24; + --bg-card-hover: #22222e; + --text-primary: #e8e8ed; + --text-secondary: #a0a0b0; + --accent: #6366f1; + --accent-hover: #818cf8; + --border-color: #2a2a3a; + --shadow: rgba(0, 0, 0, 0.4); + --overlay: rgba(0, 0, 0, 0.85); +} + +/* Reset and base styles */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + font-size: 16px; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background-color: var(--bg-primary); + color: var(--text-primary); + line-height: 1.6; + min-height: 100vh; +} + +/* Header */ +.header { + background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%); + padding: 2rem 1rem; + text-align: center; + border-bottom: 1px solid var(--border-color); +} + +.header h1 { + font-size: 2.5rem; + font-weight: 700; + margin-bottom: 0.5rem; + background: linear-gradient(135deg, var(--accent) 0%, #a78bfa 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.header p { + color: var(--text-secondary); + font-size: 1.1rem; +} + +/* Filter controls */ +.filters { + display: flex; + flex-wrap: wrap; + gap: 1rem; + justify-content: center; + padding: 1.5rem 1rem; + background-color: var(--bg-secondary); + border-bottom: 1px solid var(--border-color); +} + +.filter-group { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.filter-group label { + color: var(--text-secondary); + font-size: 0.9rem; +} + +.filter-group select, +.filter-group input { + background-color: var(--bg-card); + border: 1px solid var(--border-color); + color: var(--text-primary); + padding: 0.5rem 1rem; + border-radius: 6px; + font-size: 0.9rem; + cursor: pointer; + transition: border-color 0.2s, box-shadow 0.2s; +} + +.filter-group select:hover, +.filter-group input:hover { + border-color: var(--accent); +} + +.filter-group select:focus, +.filter-group input:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 2px rgba(99, 102, 241, 0.2); +} + +/* Main container */ +.container { + max-width: 1400px; + margin: 0 auto; + padding: 2rem 1rem; +} + +/* Book count display */ +.book-count { + text-align: center; + color: var(--text-secondary); + margin-bottom: 1.5rem; + font-size: 0.95rem; +} + +/* Books grid */ +.books-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); + gap: 1.5rem; +} + +@media (min-width: 640px) { + .books-grid { + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + } +} + +@media (min-width: 1024px) { + .books-grid { + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + } +} + +/* Book card */ +.book-card { + background-color: var(--bg-card); + border-radius: 12px; + overflow: hidden; + cursor: pointer; + transition: transform 0.2s, box-shadow 0.2s, background-color 0.2s; + border: 1px solid var(--border-color); +} + +.book-card:hover { + transform: translateY(-4px); + box-shadow: 0 12px 24px var(--shadow); + background-color: var(--bg-card-hover); +} + +.book-card:focus { + outline: none; + box-shadow: 0 0 0 3px var(--accent); +} + +/* Cover image container */ +.cover-container { + position: relative; + width: 100%; + padding-top: 150%; /* 2:3 aspect ratio for book covers */ + background-color: var(--bg-secondary); + overflow: hidden; +} + +.cover-container img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: cover; + transition: opacity 0.3s; +} + +/* Placeholder for missing covers */ +.cover-placeholder { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background: linear-gradient(135deg, var(--bg-secondary) 0%, var(--bg-card) 100%); + padding: 1rem; + text-align: center; +} + +.cover-placeholder .book-icon { + font-size: 3rem; + margin-bottom: 0.5rem; + opacity: 0.5; +} + +.cover-placeholder .placeholder-title { + font-size: 0.85rem; + color: var(--text-secondary); + word-break: break-word; +} + +/* Loading spinner for images */ +.cover-loading { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 32px; + height: 32px; + border: 3px solid var(--border-color); + border-top-color: var(--accent); + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { transform: translate(-50%, -50%) rotate(360deg); } +} + +/* Card info section */ +.card-info { + padding: 1rem; +} + +.card-info h3 { + font-size: 0.95rem; + font-weight: 600; + margin-bottom: 0.25rem; + color: var(--text-primary); + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; +} + +.card-info .author { + font-size: 0.85rem; + color: var(--text-secondary); + margin-bottom: 0.5rem; +} + +.card-info .meta { + display: flex; + gap: 0.5rem; + flex-wrap: wrap; +} + +.format-badge { + display: inline-block; + font-size: 0.7rem; + padding: 0.2rem 0.5rem; + border-radius: 4px; + background-color: var(--bg-secondary); + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.format-badge.audiobook { background-color: #3730a3; color: #c7d2fe; } +.format-badge.ebook { background-color: #065f46; color: #a7f3d0; } +.format-badge.paperback { background-color: #7c2d12; color: #fed7aa; } + +/* Modal overlay */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: var(--overlay); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; + opacity: 0; + visibility: hidden; + transition: opacity 0.3s, visibility 0.3s; + padding: 1rem; + overflow-y: auto; +} + +.modal-overlay.active { + opacity: 1; + visibility: visible; +} + +/* Modal content */ +.modal-content { + background-color: var(--bg-secondary); + border-radius: 16px; + max-width: 800px; + width: 100%; + max-height: 90vh; + overflow-y: auto; + position: relative; + transform: scale(0.9); + transition: transform 0.3s; + border: 1px solid var(--border-color); +} + +.modal-overlay.active .modal-content { + transform: scale(1); +} + +/* Close button */ +.modal-close { + position: absolute; + top: 1rem; + right: 1rem; + width: 40px; + height: 40px; + border: none; + background-color: var(--bg-card); + color: var(--text-primary); + border-radius: 50%; + cursor: pointer; + font-size: 1.5rem; + display: flex; + align-items: center; + justify-content: center; + transition: background-color 0.2s; + z-index: 10; +} + +.modal-close:hover { + background-color: var(--bg-card-hover); +} + +/* Modal body layout */ +.modal-body { + display: grid; + grid-template-columns: 1fr; + gap: 1.5rem; + padding: 1.5rem; +} + +@media (min-width: 640px) { + .modal-body { + grid-template-columns: 250px 1fr; + padding: 2rem; + } +} + +/* Modal cover image */ +.modal-cover { + position: relative; + width: 100%; + max-width: 250px; + margin: 0 auto; +} + +.modal-cover { + position: relative; +} + +.modal-cover img { + width: 100%; + height: auto; + border-radius: 8px; + box-shadow: 0 8px 24px var(--shadow); +} + +.modal-cover .cover-loading { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 48px; + height: 48px; + border: 4px solid var(--border-color); + border-top-color: var(--accent); + border-radius: 50%; + animation: spin 1s linear infinite; + z-index: 1; +} + +.modal-cover .cover-placeholder { + position: relative; + padding-top: 150%; + border-radius: 8px; +} + +/* Modal details */ +.modal-details h2 { + font-size: 1.5rem; + margin-bottom: 0.5rem; + color: var(--text-primary); +} + +.modal-details .author { + font-size: 1.1rem; + color: var(--accent); + margin-bottom: 1rem; +} + +.modal-meta { + display: flex; + gap: 1rem; + flex-wrap: wrap; + margin-bottom: 1.5rem; + padding-bottom: 1.5rem; + border-bottom: 1px solid var(--border-color); +} + +.meta-item { + display: flex; + flex-direction: column; +} + +.meta-item .label { + font-size: 0.75rem; + color: var(--text-secondary); + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.meta-item .value { + font-size: 1rem; + color: var(--text-primary); +} + +/* Summary section */ +.modal-summary h3 { + font-size: 1rem; + color: var(--text-secondary); + margin-bottom: 0.75rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.modal-summary p { + color: var(--text-primary); + line-height: 1.7; +} + +.modal-summary .loading { + color: var(--text-secondary); + font-style: italic; +} + +.modal-summary .no-summary { + color: var(--text-secondary); + font-style: italic; +} + +.modal-summary .summary-source { + margin-top: 1rem; + font-size: 0.8rem; + color: var(--text-secondary); + font-style: italic; +} + +/* Loading state for the grid */ +.loading-message { + text-align: center; + padding: 4rem 2rem; + color: var(--text-secondary); +} + +.loading-message .spinner { + width: 48px; + height: 48px; + border: 4px solid var(--border-color); + border-top-color: var(--accent); + border-radius: 50%; + animation: spin 1s linear infinite; + margin: 0 auto 1rem; +} + +/* Error state */ +.error-message { + text-align: center; + padding: 4rem 2rem; + color: #ef4444; +} + +/* No results state */ +.no-results { + text-align: center; + padding: 4rem 2rem; + color: var(--text-secondary); +} + +/* Footer */ +.footer { + text-align: center; + padding: 2rem 1rem; + color: var(--text-secondary); + font-size: 0.85rem; + border-top: 1px solid var(--border-color); + margin-top: 2rem; +} + +.footer a { + color: var(--accent); + text-decoration: none; +} + +.footer a:hover { + text-decoration: underline; +} diff --git a/data/books.json b/data/books.json new file mode 100644 index 0000000..7e0de34 --- /dev/null +++ b/data/books.json @@ -0,0 +1,652 @@ +{ + "books": [ + { + "id": 1, + "title": "Revelation Space", + "author": "Alastair Reynolds", + "year": 2000, + "format": "Paperback", + "isbn": "9780441009428", + "language": "en", + "coverLocal": "images/covers/1.jpg", + "summary": "Nine hundred thousand years ago, something annihilated the Amarantin civilization just as it was on the verge of discovering space flight. Now one scientist, Dan Sylveste, will stop at nothing to solve the Amarantin riddle before ancient history repeats itself. With no other resources at his disposal, Sylveste forges a dangerous alliance with the cyborg crew of the starship Nostalgia for Infinity. But as he closes in on the secret, a killer closes in on him. Because the Amarantin were destroyed for a reason — and if that reason is uncovered, the universe—and reality itself — could be irrecoverably altered….", + "summarySource": "OpenLibrary" + }, + { + "id": 2, + "title": "Chasm City", + "author": "Alastair Reynolds", + "year": 2001, + "format": "Paperback", + "isbn": "9780441010646", + "language": "en", + "coverLocal": "images/covers/2.jpg", + "summary": "\"The once-utopian Chasm City a domed human settlement on an otherwise inhospitable planet has been overrun by a virus known as the Melding Plague, capable of infecting any body, organic or computerized. Now, with the entire city corrupted from its people to the very buildings they inhabit only the most wretched, grim sort of existence remains.\" -- Jacket.", + "summarySource": "OpenLibrary" + }, + { + "id": 3, + "title": "Redemption Ark", + "author": "Alastair Reynolds", + "year": 2002, + "format": "Paperback", + "isbn": "9780441011735", + "language": "en", + "coverLocal": "images/covers/3.jpg", + "summary": "The Inhibitors have awakened and begun systematically destroying human colonies. Nevil Clavain, a centuries-old soldier, defects from the Conjoiners with plans to save humanity using cache weapons—doomsday devices hidden throughout space. The novel follows multiple factions racing to secure these weapons while the machine exterminators close in. A desperate tale of survival against an implacable enemy.", + "summarySource": "input.json" + }, + { + "id": 4, + "title": "Absolution Gap", + "author": "Alastair Reynolds", + "year": 2003, + "format": "Paperback", + "isbn": "9780441012916", + "language": "en", + "coverLocal": "images/covers/4.jpg", + "summary": "They are ancient killing machines, designed to locate and destroy any life form reaching a certain level of intelligence. Now, stirred from eons of sleep, the Inhibitors have descended on their latest target: Humanity.\" \"The first wave of Inhibitors has sent war veteran Clavain and a ragtag group of refugees into hiding. Their leadership is faltering, and their situation is growing more desperate. But their little colony has just received an unexpected visitor: an avenging angel with the power to lead mankind to safety - or draw down its darkest enemy.\" As she leads them to an apparently insignificant moon light-years away, it begins to dawn on Clavain and his companions that to beat one enemy, it may be necessary to forge an alliance with something much worse.", + "summarySource": "OpenLibrary" + }, + { + "id": 5, + "title": "Diamond Dogs, Turquoise Days", + "author": "Alastair Reynolds", + "year": 2005, + "format": "Paperback", + "isbn": "9780575073630", + "language": "en", + "coverLocal": "images/covers/5.jpg", + "summary": "Two novellas set in the Revelation Space universe. 'Diamond Dogs' follows a group attempting to solve a deadly alien puzzle tower that tests and mutilates those who fail. 'Turquoise Days' explores the Pattern Jugglers, alien organisms that can store and transfer consciousness, through the eyes of scientists studying them as war approaches their ocean world.", + "summarySource": "input.json" + }, + { + "id": 6, + "title": "Inhibitor Phase", + "author": "Alastair Reynolds", + "year": 2021, + "format": "Audiobook", + "isbn": "9780575090781", + "language": "en", + "coverLocal": "images/covers/6.jpg", + "summary": "Set after Absolution Gap, this novel returns to the Revelation Space universe. Miguel de Ruyter lives on a post-apocalyptic world where survivors hide from the Inhibitors in small settlements. When a stranger crashes near his village carrying secrets about a possible way to fight back, Miguel must journey across a dangerous galaxy where humanity teeters on the edge of extinction.", + "summarySource": "input.json" + }, + { + "id": 7, + "title": "Blue Remembered Earth", + "author": "Alastair Reynolds", + "year": 2016, + "format": "eBook", + "isbn": "9780575088283", + "language": "en", + "coverLocal": "images/covers/7.jpg", + "summary": "One-hundred-and-fifty years from now, the moon and Mars are settled, and colonies stretch all the way out to the edge of the solar system. But something has come to light on the Moon--secrets that could change everything--or tear this near utopia apar", + "summarySource": "OpenLibrary" + }, + { + "id": 8, + "title": "Rendezvous with Rama", + "author": "Arthur C. Clarke", + "year": 1973, + "format": "Audiobook", + "isbn": "9780553287899", + "language": "en", + "coverLocal": "images/covers/8.jpg", + "summary": "Written in 1973, a massive 50 kilometre long alien cylinder begins to pass through the solar system provoking a hurried effort to intercept it. The closest available ship rushes to rendezvous so as to have a quick study before it gets too close to the sun. Able to enter via an airlock on one end of the ship, the crew explores the huge world found inside, a world full of wonder and mystery. As usual, the science is spot on. This is the best novel of Clarke's since 2001 and Childhood's End and is a truly grand adventure full of puzzles and ideas that lead you asking more questions than are answered. Enough questions in fact to lead to numerous inferior sequels, but enough answers to leave you satisfied. Don't pass up this gem of hard science fiction.", + "summarySource": "OpenLibrary" + }, + { + "id": 9, + "title": "Rama II", + "author": "Arthur C. Clarke", + "year": 1989, + "format": "Audiobook", + "isbn": "9780553286588", + "language": "en", + "coverLocal": "images/covers/9.jpg", + "summary": "From the back cover of Bantam paperback December 1990:\r\n\r\nTHE RAMANS ARE BACK...\r\n\r\nYears ago, the enormous, enigmatic alien spacecraft called *Rama* sailed trough our solar system as mind-boggling proof that life existed -- or *had* existed -- elsewhere in the universe. Now, at the dawn of the twenty-third century, another ship is discovered hurtling toward us. A crew of Earth's best and brightest minds is assembled to rendezvous with the massive vessel. They are armed with everything we know about Raman technology and culture. But nothing can prepare them for what they are about to encounter on board Rama II: cosmic secrets that are startling, sensational -- and perhaps even deadly.", + "summarySource": "OpenLibrary" + }, + { + "id": 10, + "title": "The Garden of Rama", + "author": "Arthur C. Clarke", + "year": 1991, + "format": "Audiobook", + "isbn": "9780553298178", + "language": "en", + "coverLocal": "images/covers/10.jpg", + "summary": "Continues the story of three humans trapped aboard Rama II as it journeys to an unknown destination. Over the course of years, they establish a small colony within the vessel, raise families, and eventually reach the Node—a massive space station where multiple Rama craft converge. Humanity is judged by the Ramans' creators and given a chance to prove their worth as a species.", + "summarySource": "input.json" + }, + { + "id": 11, + "title": "Rama Revealed", + "author": "Arthur C. Clarke", + "year": 1993, + "format": "Audiobook", + "isbn": "9780553569476", + "language": "en", + "coverLocal": "images/covers/11.jpg", + "summary": "The concluding volume of the Rama saga. The human colony aboard Rama III faces internal strife, with society dividing into factions. Nicole des Jardins and her family navigate political persecution while the spacecraft approaches its final destination. The novel reveals the purpose behind the Rama vessels and the nature of their creators, exploring themes of civilization, cooperation, and humanity's place in the cosmos.", + "summarySource": "input.json" + }, + { + "id": 12, + "title": "Diamant", + "author": "Andreas Brandhorst", + "year": 2004, + "format": "Paperback", + "isbn": "9783453521193", + "language": "de", + "coverLocal": "images/covers/12.jpg", + "summary": "The first book in the Diamond Trilogy. A German science fiction epic that begins a story spanning vast cosmic scales. Brandhorst is known for his grand-scale space opera combining hard science fiction elements with philosophical questions about consciousness and the nature of reality. The trilogy establishes his signature style of sweeping galactic narratives.", + "summarySource": "input.json" + }, + { + "id": 13, + "title": "Der Metamorph", + "author": "Andreas Brandhorst", + "year": 2004, + "format": "Paperback", + "isbn": "9783453520097", + "language": "de", + "coverLocal": "images/covers/13.jpg", + "summary": "The second volume of the Diamond Trilogy continues the saga with themes of transformation and evolution. The narrative expands on the universe established in the first book, exploring the consequences of first contact and humanity's adaptation to cosmic realities far beyond Earth.", + "summarySource": "input.json" + }, + { + "id": 14, + "title": "Der Zeitkrieg", + "author": "Andreas Brandhorst", + "year": 2005, + "format": "Paperback", + "isbn": "9783453521025", + "language": "de", + "coverLocal": "images/covers/14.jpg", + "summary": "The concluding volume of the Diamond Trilogy introduces temporal conflict to the cosmic scale narrative. The title suggests warfare across time itself, a theme Brandhorst would return to in later works. The trilogy's conclusion brings together the threads of transformation, alien contact, and humanity's destiny.", + "summarySource": "input.json" + }, + { + "id": 15, + "title": "Feuervögel", + "author": "Andreas Brandhorst", + "year": 2006, + "format": "Paperback", + "isbn": "9783453522060", + "language": "de", + "coverLocal": "images/covers/15.jpg", + "summary": "The first book of the Graken Trilogy introduces a new space opera saga. The 'firebirds' of the title suggest themes of destruction and rebirth, common in Brandhorst's work. The trilogy explores encounters with alien intelligences and the transformative effects on human civilization.", + "summarySource": "input.json" + }, + { + "id": 16, + "title": "Feuerstürme", + "author": "Andreas Brandhorst", + "year": 2007, + "format": "Paperback", + "isbn": "9783453522367", + "language": "de", + "coverLocal": "images/covers/16.jpg", + "summary": "The second volume of the Graken Trilogy escalates the conflict introduced in Firebirds. The narrative continues to explore themes of cosmic scale warfare and the resilience of humanity when faced with overwhelming alien forces.", + "summarySource": "input.json" + }, + { + "id": 17, + "title": "Feuerträume", + "author": "Andreas Brandhorst", + "year": 2008, + "format": "Paperback", + "isbn": "9783453522992", + "language": "de", + "coverLocal": "images/covers/17.jpg", + "summary": "The concluding volume of the Graken Trilogy brings the saga to its end. The 'dreams' element suggests a turn toward more introspective territory, perhaps exploring consciousness or virtual realities alongside the space opera elements established in earlier volumes.", + "summarySource": "input.json" + }, + { + "id": 18, + "title": "Kinder der Ewigkeit", + "author": "Andreas Brandhorst", + "year": 2010, + "format": "Paperback", + "isbn": "9783453529830", + "language": "de", + "coverLocal": "images/covers/18.jpg", + "summary": "A standalone novel exploring themes of immortality and the long-term evolution of humanity. The 'children of eternity' may refer to beings who have transcended normal human lifespans, facing the philosophical and practical challenges of endless existence.", + "summarySource": "input.json" + }, + { + "id": 19, + "title": "Das Artefakt", + "author": "Andreas Brandhorst", + "year": 2012, + "format": "Paperback", + "isbn": "9783453528659", + "language": "de", + "coverLocal": "images/covers/19.jpg", + "summary": "A novel centered on a mysterious alien artifact. Such objects are common in science fiction as catalysts for transformation and revelation. The discovery likely forces characters to confront truths about the universe and humanity's place within it.", + "summarySource": "input.json" + }, + { + "id": 20, + "title": "Der letzte Regent", + "author": "Andreas Brandhorst", + "year": 2013, + "format": "Paperback", + "isbn": "9783453529717", + "language": "de", + "coverLocal": "images/covers/20.jpg", + "summary": "A science fiction novel with political themes suggested by 'regent.' The story may explore the end of an era of governance, perhaps across interstellar scales, dealing with succession, legitimacy, and the transition of power in future societies.", + "summarySource": "input.json" + }, + { + "id": 21, + "title": "Das Kosmotop", + "author": "Andreas Brandhorst", + "year": 2014, + "format": "Paperback", + "isbn": "9783453315440", + "language": "de", + "coverLocal": "images/covers/21.jpg", + "summary": "A novel whose title suggests a cosmic-scale habitat or ecosystem. The 'cosmotope' may be an artificial environment of enormous scale, exploring themes of ecology, self-contained worlds, and the engineering required to sustain life across vast distances.", + "summarySource": "input.json" + }, + { + "id": 22, + "title": "Ikarus", + "author": "Andreas Brandhorst", + "year": 2015, + "format": "Paperback", + "isbn": "9783492703994", + "language": "de", + "coverLocal": "images/covers/22.jpg", + "summary": "Named after the mythological figure who flew too close to the sun, this novel likely explores themes of ambition, hubris, and the dangers of reaching beyond human limitations. A cautionary tale updated for the era of space exploration and advanced technology.", + "summarySource": "input.json" + }, + { + "id": 23, + "title": "Das Schiff", + "author": "Andreas Brandhorst", + "year": 2015, + "format": "Paperback", + "isbn": "9783492703581", + "language": "de", + "coverLocal": "images/covers/23.jpg", + "summary": "A novel focused on a spacecraft and its journey. Generation ships, alien vessels, and mysterious derelicts are staples of space fiction. The ship itself becomes a character, and its voyage likely spans years or centuries, exploring isolation and discovery.", + "summarySource": "input.json" + }, + { + "id": 24, + "title": "Omni", + "author": "Andreas Brandhorst", + "year": 2016, + "format": "Paperback", + "isbn": "9783492703598", + "language": "de", + "coverLocal": "images/covers/24.jpg", + "summary": "The first book in the Omniversum series. The title suggests exploration of concepts beyond our universe—perhaps multiverse theory or higher-dimensional spaces. Brandhorst's characteristic blend of hard SF concepts with accessible storytelling creates an entry point to a new cosmic narrative.", + "summarySource": "input.json" + }, + { + "id": 25, + "title": "Das Arkonadia-Rätsel", + "author": "Andreas Brandhorst", + "year": 2017, + "format": "Paperback", + "isbn": "9783492705066", + "language": "de", + "coverLocal": "images/covers/25.jpg", + "summary": "The second Omniversum novel presents a mystery spanning cosmic scales. The enigmatic 'Arkonadia' suggests an alien civilization or artifact whose secrets drive the plot. The novel continues Brandhorst's exploration of humanity's place in a vast, mysterious universe.", + "summarySource": "input.json" + }, + { + "id": 26, + "title": "Das Erwachen", + "author": "Andreas Brandhorst", + "year": 2017, + "format": "eBook", + |
