Books have the power to transport us to different worlds, evoke deep emotions, and inspire change. In this article, we explore ten captivating book effect examples that demonstrate the profound impact literature can have on readers.
From timeless classics to modern masterpieces, these examples highlight how books can shape our thoughts, challenge our perspectives, and leave a lasting impression. Join us as we delve into the transformative power of the written word.
CODE1
Here's the code:
CODETEXT1
CODE2
Here's the code:
CODETEXT2
CODE3
Here's the code:
CODETEXT3
CODE4
Here's the code:
CODETEXT4
CODE5
Here's the code:
CODETEXT5
Designers and developers, elevate your projects with Subframe's drag-and-drop interface and intuitive, responsive canvas. Create pixel-perfect UI effortlessly, every time. Loved by professionals, Subframe makes designing a breeze.
Start for free and experience the magic of Subframe today!
CODE6
Here's the code:
CODETEXT6
CODE7
Here's the code:
CODETEXT7
CODE8
Here's the code:
CODETEXT8
CODE9
Here's the code:
CODETEXT9
CODE10
Here's the code:
CODETEXT10
Ready to elevate your UI designs? With Subframe, you can create stunning, pixel-perfect interfaces, including captivating Book Effects, in minutes. Experience unparalleled efficiency and ease with our drag-and-drop editor.
Start for free and begin designing immediately. Transform your projects with Subframe today!
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Literary eBook Reader</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } :root { --page-color: #f5f1e8; --text-color: #2a2316; --shadow-color: rgba(0, 0, 0, 0.2); --spine-color: #aa8a69; --highlight-color: #c7b299; --book-edge: #e6d9c4; } body { width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; background: linear-gradient(135deg, #634832 0%, #3d2a1a 100%); font-family: 'Libre Baskerville', Georgia, serif; overflow: hidden; } .container { width: 700px; height: 700px; display: flex; justify-content: center; align-items: center; position: relative; perspective: 1500px; } .book-container { width: 80%; height: 80%; position: relative; transform-style: preserve-3d; transition: transform 0.5s ease; } .book { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.5s ease; } .spine { position: absolute; width: 40px; height: 100%; left: -20px; top: 0; background: var(--spine-color); transform: rotateY(90deg) translateZ(-20px); display: flex; justify-content: center; align-items: center; z-index: 2; box-shadow: inset -3px 0 5px var(--shadow-color); border-radius: 3px 0 0 3px; } .spine-text { color: #f5f1e8; writing-mode: vertical-rl; text-orientation: mixed; transform: rotate(180deg); font-size: 1.2rem; letter-spacing: 2px; text-transform: uppercase; font-weight: 700; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.3); } .book-cover { position: absolute; width: 100%; height: 100%; background: var(--spine-color); transform: rotateY(0) translateZ(20px); display: flex; flex-direction: column; justify-content: center; align-items: center; box-shadow: 0 0 30px 0 var(--shadow-color); border-radius: 0 5px 5px 0; transition: transform 0.5s ease; z-index: 2; } .book-cover::before { content: ''; position: absolute; top: 10px; right: 10px; bottom: 10px; left: 10px; border: 2px solid rgba(255, 255, 255, 0.2); pointer-events: none; } .book-title { font-size: 2.2rem; font-weight: 700; color: #f5f1e8; text-align: center; margin-bottom: 20px; line-height: 1.2; padding: 0 30px; } .book-author { font-size: 1.2rem; color: #e6d9c4; font-style: italic; margin-bottom: 40px; } .open-book { font-size: 0.9rem; padding: 10px 20px; background: rgba(245, 241, 232, 0.2); color: #f5f1e8; border: 1px solid #f5f1e8; border-radius: 3px; cursor: pointer; transition: all 0.3s; outline: none; letter-spacing: 1px; } .open-book:hover { background: rgba(245, 241, 232, 0.3); transform: translateY(-2px); } .book-back { position: absolute; width: 100%; height: 100%; background: var(--book-edge); transform: rotateY(180deg) translateZ(20px); border-radius: 5px 0 0 5px; display: flex; justify-content: center; align-items: center; padding: 20px; box-shadow: 0 0 30px 0 var(--shadow-color); } .book-back-content { font-size: 0.8rem; line-height: 1.4; color: var(--text-color); text-align: justify; } .page { position: absolute; width: 100%; height: 100%; background: var(--page-color); padding: 30px; overflow: hidden; border-radius: 0 5px 5px 0; box-shadow: 0 0 5px var(--shadow-color); color: var(--text-color); transform-origin: left; transform-style: preserve-3d; transition: transform 0.6s cubic-bezier(0.645, 0.045, 0.355, 1); } .page-content { max-height: 100%; overflow: auto; scrollbar-width: thin; scrollbar-color: var(--highlight-color) var(--page-color); padding-right: 10px; } .page-content::-webkit-scrollbar { width: 6px; } .page-content::-webkit-scrollbar-track { background: transparent; } .page-content::-webkit-scrollbar-thumb { background-color: var(--highlight-color); border-radius: 3px; } .page-number { position: absolute; bottom: 20px; font-size: 0.8rem; color: var(--text-color); opacity: 0.8; } .page-left .page-number { left: 30px; } .page-right .page-number { right: 30px; } /* Left page */ .page:nth-child(odd) { transform: rotateY(0deg); z-index: 1; } /* Right page */ .page:nth-child(even) { transform: rotateY(0deg); z-index: 0; } /* Flipped left page */ .page.flipped:nth-child(odd) { transform: rotateY(-180deg); z-index: 0; } /* Flipped right page */ .page.flipped:nth-child(even) { transform: rotateY(-180deg); z-index: 1; } .page::before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; width: 30px; background: linear-gradient(to right, transparent, var(--shadow-color)); opacity: 0.1; pointer-events: none; z-index: 1; } .page.flipped::before { background: linear-gradient(to left, transparent, var(--shadow-color)); right: auto; left: 0; } .page::after { content: ''; position: absolute; top: 0; left: 0; height: 100%; width: 100%; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg=='); opacity: 0.1; pointer-events: none; } .chapter-title { font-size: 1.6rem; margin-bottom: 30px; font-weight: 700; color: var(--text-color); text-align: center; letter-spacing: 0.5px; } p { font-size: 0.9rem; line-height: 1.6; margin-bottom: 15px; text-align: justify; text-indent: 30px; } p:first-of-type::first-letter { font-size: 2.3rem; line-height: 1; font-weight: 700; float: left; margin-right: 6px; color: var(--spine-color); } .controls { position: absolute; bottom: 30px; width: 100%; display: flex; justify-content: space-between; z-index: 10; opacity: 0; transition: opacity 0.3s ease; } .book-container.opened .controls { opacity: 1; } .control-btn { background: rgba(255, 255, 255, 0.3); border: none; width: 40px; height: 40px; border-radius: 50%; display: flex; justify-content: center; align-items: center; cursor: pointer; transition: all 0.3s; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); } .control-btn:hover { background: rgba(255, 255, 255, 0.5); transform: scale(1.1); } .control-btn:active { transform: scale(0.95); } .control-btn svg { width: 20px; height: 20px; fill: var(--text-color); } .close-book { position: absolute; top: 30px; right: 30px; background: rgba(255, 255, 255, 0.2); border: none; padding: 8px 15px; color: #f5f1e8; border-radius: 20px; cursor: pointer; z-index: 10; transition: all 0.3s; opacity: 0; font-family: 'Libre Baskerville', Georgia, serif; font-size: 0.8rem; } .book-container.opened .close-book { opacity: 1; } .close-book:hover { background: rgba(255, 255, 255, 0.3); } .book-light { position: absolute; width: 100%; height: 100%; pointer-events: none; background: radial-gradient(circle at center, rgba(255, 255, 255, 0.3) 0%, transparent 70%); opacity: 0; transition: opacity 0.5s ease; z-index: 1; } .book-container.opened .book-light { opacity: 1; } .page-corner { position: absolute; right: 0; bottom: 0; width: 30px; height: 30px; background: var(--page-color); transform-origin: bottom right; transition: transform 0.3s ease; border-radius: 3px 0 0 0; box-shadow: -2px -2px 5px rgba(0, 0, 0, 0.1); cursor: pointer; z-index: 2; } .page-corner:hover { transform: rotate(-10deg); } /* Media queries for responsiveness */ @media (max-width: 700px) { .book-container { width: 90%; } .spine { width: 30px; left: -15px; } .spine-text { font-size: 1rem; } .book-title { font-size: 1.8rem; } .chapter-title { font-size: 1.4rem; } p { font-size: 0.85rem; } } /* Loading animation */ .loader { position: absolute; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; background: linear-gradient(135deg, #634832 0%, #3d2a1a 100%); z-index: 100; transition: opacity 0.5s ease, visibility 0.5s ease; } .book-loader { width: 80px; height: 100px; position: relative; background: var(--spine-color); border-radius: 4px; perspective: 500px; box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); } .page-loader { position: absolute; width: 78px; height: 98px; top: 1px; left: 1px; background: var(--page-color); transform-origin: left; animation: pageFlip 1.2s infinite; border-radius: 0 4px 4px 0; } .page-loader::before { content: ''; position: absolute; width: 100%; height: 100%; background-image: repeating-linear-gradient(var(--page-color) 0px, var(--page-color) 20px, var(--highlight-color) 20px, var(--highlight-color) 21px); opacity: 0.2; border-radius: 0 4px 4px 0; } @keyframes pageFlip { 0% { transform: rotateY(0deg); } 40% { transform: rotateY(-120deg); } 100% { transform: rotateY(0deg); } } .loader.hidden { opacity: 0; visibility: hidden; } /* Hidden state for book when opened */ .book-container.opened .book { transform: rotateY(-90deg); transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1); } /* Hidden state for book cover when opened */ .book-container.opened .book-cover { transform: rotateY(-180deg); transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1); } /* Page styles when book is opened */ .reader { position: absolute; width: 100%; height: 100%; display: flex; perspective: 1500px; visibility: hidden; opacity: 0; transition: all 0.5s ease; } .book-container.opened .reader { visibility: visible; opacity: 1; transition-delay: 0.3s; } .page-spread { width: 90%; height: 90%; transform-style: preserve-3d; display: flex; margin: auto; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); border-radius: 5px; position: relative; } .page-left, .page-right { width: 50%; height: 100%; background: var(--page-color); padding: 30px; position: relative; overflow: hidden; } .page-left { border-radius: 5px 0 0 5px; border-right: 1px solid rgba(0, 0, 0, 0.1); box-shadow: inset -10px 0 20px -10px rgba(0, 0, 0, 0.1); } .page-right { border-radius: 0 5px 5px 0; box-shadow: inset 10px 0 20px -10px rgba(0, 0, 0, 0.1); } .page-left::after, .page-right::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: url('data:image/png;base64,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'); opacity: 0.05; pointer-events: none; } .bookmark { position: absolute; top: -40px; right: 30px; width: 30px; height: 80px; background-color: #c0392b; border-radius: 3px 3px 0 0; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); z-index: 3; transition: top 0.3s ease; cursor: pointer; } .bookmark:hover { top: -30px; } .bookmark::after { content: ''; position: absolute; bottom: 0; left: 0; width: 0; height: 0; border-style: solid; border-width: 10px 15px 0 15px; border-color: #c0392b transparent transparent transparent; } .loading-text { position: absolute; bottom: 40px; color: var(--page-color); font-size: 14px; letter-spacing: 1px; animation: pulse 1.5s infinite; } @keyframes pulse { 0%, 100% { opacity: 0.5; } 50% { opacity: 1; } } .footnote { font-size: 0.75rem; font-style: italic; color: #666; margin-top: 30px; border-top: 1px solid #ddd; padding-top: 10px; } </style> </head> <body> <div class="loader"> <div class="book-loader"> <div class="page-loader"></div> </div> <div class="loading-text">Opening your literary journey...</div> </div> <div class="container"> <div class="book-container"> <div class="book"> <div class="spine"> <span class="spine-text">Wind & Sea Tales</span> </div> <div class="book-cover"> <h1 class="book-title">The Mariner's Journey</h1> <h2 class="book-author">by Elizabeth Blackwell</h2> <button class="open-book">Open Book</button> </div> <div class="book-back"> <div class="book-back-content"> <p>In the tradition of Joseph Conrad and Herman Melville, this captivating maritime adventure explores the complex relationship between humanity and the sea. Follow Captain James Harrington as he navigates both treacherous waters and the depths of his own conscience in this timeless tale of courage, redemption, and the unforgiving nature of the ocean.</p> </div> </div> </div> <div class="reader"> <div class="page-spread"> <div class="page-left"> <div class="page-content"> <h2 class="chapter-title">Chapter I<br>The Call of the Sea</h2> <p>The harbor at Portsmouth lay shrouded in morning fog, the masts of ships piercing through the grey veil like spectral fingers reaching for the hidden sky. James Harrington stood at the edge of the pier, his weathered sea chest at his feet, watching as gulls carved their way through the mist with mournful cries.</p> <p>Forty years at sea had carved lines into his face deeper than any cartographer could draw on their most detailed maps. His hands, calloused and strong, gripped the brass spyglass he'd carried through five continents and countless storms.</p> <p>"Captain Harrington!" The voice cut through the fog, and James turned to see a young man hurrying along the dock. The lad couldn't have been more than twenty, with the eager expression of someone who still believed in the romance of seafaring.</p> <p>"Mr. Fletcher," James acknowledged with a nod. "You're early."</p> <p>"Couldn't sleep, sir. Not with the <em>Tempest</em> waiting." The young man's eyes drifted past James to where the three-masted barque lay anchored, her hull disappearing into the fog so that she appeared to float on clouds rather than water.</p> <p>James studied his first mate carefully. "The sea will take all the sleep you give it, lad, and demand more besides. You'd do well to store it up when you can."</p> <div class="page-number">1</div> </div> <div class="bookmark"></div> </div> <div class="page-right"> <div class="page-content"> <p>Fletcher nodded, properly chastened, but the excitement remained in his eyes. "The cargo's been loaded, sir. Everything according to manifest. Mr. Yardley checked it twice."</p> <p>"And the crew?"</p> <p>"All aboard save for Simmons and O'Malley. They should be along shortly."</p> <p>James nodded, his gaze drifting back to the water. The tide was turning; he could feel it in the air, in the particular way the mist swirled and eddied around the mooring posts. In another hour, they would cast off, bound for the Cape of Good Hope and then the spice islands beyond. Fifteen months, if the weather held and fortune favored them.</p> <p>He had made this journey a dozen times before, but something felt different about this voyage. Perhaps it was the dreams that had been troubling his sleep—visions of storm-tossed seas and strange shores. Or perhaps it was simply that each departure now carried the weight of knowing there were fewer journeys ahead than behind.</p> <p>"They say there have been pirates spotted near the Malacca Strait," Fletcher said, interrupting James's reverie.</p> <p>"There have been pirates near Malacca since before your grandfather was born," James replied. "We'll weather them as we always have."</p> <p>As he spoke, the fog began to lift, sunlight cutting through in golden shafts. The <em>Tempest</em> emerged from the mist like a revelation, her newly painted hull gleaming black against the water, her sails furled tight but promising speed and adventure.</p> <div class="page-number">2</div> </div> <div class="page-corner"></div> </div> </div> </div> <button class="close-book">Close Book</button> <div class="controls"> <button class="control-btn prev-btn"> <svg viewBox="0 0 24 24"> <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/> </svg> </button> <button class="control-btn next-btn"> <svg viewBox="0 0 24 24"> <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/> </svg> </button> </div> <div class="book-light"></div> </div> </div> <script> document.addEventListener
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Atelier 108 Product Catalog</title> <style> @import url('https://fonts.googleapis.com/css2?family=Work+Sans:wght@300;400;500;600;700&display=swap'); :root { --primary: #5f45bb; --primary-dark: #3a2a7e; --secondary: #ff7d3a; --text: #333; --light: #f8f9fa; --dark: #212529; --page-bg: #fff; --shadow: rgba(0, 0, 0, 0.1); --transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Work Sans', sans-serif; background-color: #f2f2f7; color: var(--text); height: 100vh; display: flex; justify-content: center; align-items: center; overflow: hidden; perspective: 1500px; } .catalog-container { width: 650px; height: 600px; position: relative; perspective: 1500px; margin: 0 auto; } .book { transform-style: preserve-3d; width: 100%; height: 100%; position: relative; transition: var(--transition); } .page { position: absolute; width: 50%; height: 100%; top: 0; transform-origin: left center; transform-style: preserve-3d; transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1); border-radius: 0 5px 5px 0; box-shadow: 5px 0 15px var(--shadow); cursor: pointer; background: var(--page-bg); overflow: hidden; } .page-front, .page-back { position: absolute; width: 100%; height: 100%; top: 0; left: 0; backface-visibility: hidden; padding: 30px; display: flex; flex-direction: column; justify-content: flex-start; background: var(--page-bg); border-radius: 0 5px 5px 0; } .page-back { transform: rotateY(180deg); } .page.flipped { transform: rotateY(-180deg); } .page-number { position: absolute; bottom: 15px; font-size: 12px; color: #aaa; } .page-front .page-number { right: 15px; } .page-back .page-number { left: 15px; } .cover { position: absolute; width: 50%; height: 100%; top: 0; left: 0; background: var(--primary); display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 40px; color: white; box-shadow: -5px 0 15px var(--shadow); border-radius: 5px 0 0 5px; z-index: 1; } .back-cover { position: absolute; width: 50%; height: 100%; top: 0; right: 0; background: var(--primary-dark); display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 40px; color: white; border-radius: 0 5px 5px 0; text-align: center; } .cover h1 { font-size: 32px; margin-bottom: 15px; font-weight: 700; letter-spacing: -0.5px; } .cover p { font-size: 14px; opacity: 0.9; margin-bottom: 30px; line-height: 1.6; } .brand-logo { width: 80px; height: 80px; border-radius: 50%; background: white; display: flex; justify-content: center; align-items: center; font-size: 24px; font-weight: 700; color: var(--primary); margin-bottom: 30px; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); } .nav-buttons { position: absolute; bottom: 30px; left: 0; right: 0; display: flex; justify-content: center; z-index: 100; gap: 15px; } .nav-button { background: var(--primary); color: white; border: none; padding: 10px 18px; border-radius: 30px; cursor: pointer; font-size: 14px; font-weight: 500; transition: var(--transition); display: flex; align-items: center; justify-content: center; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .nav-button:hover { background: var(--primary-dark); transform: translateY(-2px); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); } .nav-button[disabled] { opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; } .nav-button svg { width: 18px; height: 18px; fill: currentColor; } .product { display: flex; flex-direction: column; height: 100%; } .product-image { position: relative; height: 65%; overflow: hidden; border-radius: 5px; margin-bottom: 15px; } .product-image img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; } .product:hover .product-image img { transform: scale(1.05); } .product-badge { position: absolute; top: 15px; right: 15px; background: var(--secondary); color: white; padding: 5px 10px; border-radius: 20px; font-size: 12px; font-weight: 600; transform: translateY(-5px); opacity: 0; transition: all 0.3s ease; } .product:hover .product-badge { transform: translateY(0); opacity: 1; } .product-title { font-size: 20px; font-weight: 600; margin-bottom: 5px; line-height: 1.2; } .product-description { font-size: 14px; line-height: 1.5; margin-bottom: 15px; color: #666; flex-grow: 1; } .product-price { font-size: 18px; font-weight: 600; color: var(--primary); margin-bottom: 15px; } .product-meta { display: flex; justify-content: space-between; align-items: center; } .product-rating { display: flex; align-items: center; gap: 4px; } .product-rating svg { width: 14px; height: 14px; fill: gold; } .product-rating span { font-size: 12px; color: #666; } .product-cta { display: inline-block; background: transparent; color: var(--primary); border: 1px solid var(--primary); padding: 6px 12px; border-radius: 20px; font-size: 12px; font-weight: 500; text-decoration: none; transition: var(--transition); } .product-cta:hover { background: var(--primary); color: white; } .product-details { display: flex; flex-direction: column; height: 100%; } .product-details-header { margin-bottom: 20px; } .product-details-title { font-size: 24px; font-weight: 600; margin-bottom: 10px; color: var(--dark); } .product-details-subtitle { font-size: 16px; color: #666; margin-bottom: 20px; } .product-details-content { flex-grow: 1; } .spec-item { display: flex; margin-bottom: 15px; } .spec-icon { width: 20px; height: 20px; margin-right: 10px; color: var(--primary); } .spec-text { font-size: 14px; line-height: 1.4; } .spec-text strong { display: block; font-weight: 600; margin-bottom: 2px; } .colors-section { margin-top: 25px; } .colors-title { font-size: 14px; font-weight: 600; margin-bottom: 10px; } .color-options { display: flex; gap: 10px; } .color-option { width: 25px; height: 25px; border-radius: 50%; cursor: pointer; transition: transform 0.2s ease; position: relative; } .color-option:hover { transform: scale(1.15); } .color-option.selected::after { content: ""; position: absolute; top: -4px; left: -4px; right: -4px; bottom: -4px; border: 2px solid var(--primary); border-radius: 50%; } .back-cover h2 { font-size: 24px; margin-bottom: 20px; } .back-cover p { margin-bottom: 30px; line-height: 1.6; font-size: 14px; opacity: 0.9; } .social-icons { display: flex; gap: 15px; margin-top: 30px; } .social-icon { width: 40px; height: 40px; border-radius: 50%; background: rgba(255, 255, 255, 0.2); display: flex; align-items: center; justify-content: center; transition: var(--transition); } .social-icon:hover { background: rgba(255, 255, 255, 0.4); transform: translateY(-3px); } @media (max-width: 700px) { .catalog-container { width: 90%; height: 80vh; } .page, .cover, .back-cover { padding: 20px; } .cover h1 { font-size: 24px; } .product-title { font-size: 18px; } .product-details-title { font-size: 20px; } } /* Page flip effect */ .page-turning { animation: pageTurn 0.8s cubic-bezier(0.645, 0.045, 0.355, 1) forwards; } @keyframes pageTurn { 0% { transform: rotateY(0deg); } 100% { transform: rotateY(-180deg); } } /* Page curl effect on hover */ .page:not(.flipped)::after { content: ''; position: absolute; top: 0; right: 0; width: 40px; height: 100%; background: linear-gradient(to right, rgba(0,0,0,0) 0%, rgba(0,0,0,0.1) 100%); opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } .page:not(.flipped):hover::after { opacity: 1; } /* Loading animation */ .loading-animation { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: #f2f2f7; display: flex; justify-content: center; align-items: center; z-index: 1000; } .loader { width: 50px; height: 50px; border: 3px solid rgba(95, 69, 187, 0.3); border-radius: 50%; border-top-color: var(--primary); animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } </style> </head> <body> <div class="loading-animation"> <div class="loader"></div> </div> <div class="catalog-container"> <div class="book"> <!-- Front Cover --> <div class="cover"> <div class="brand-logo">A108</div> <h1>2024 Atelier 108 Collection</h1> <p>Discover our handcrafted premium home essentials, designed for modern living with timeless elegance.</p> <p>Flip through our catalog to explore a curated selection of our best pieces.</p> </div> <!-- Pages --> <div class="page" id="page1"> <div class="page-front"> <div class="product"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1586023492125-27b2c045efd7?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="Modern Chair"> <div class="product-badge">New</div> </div> <h2 class="product-title">Nova Chair</h2> <p class="product-description">Minimalist design meets maximum comfort with our signature ergonomic chair.</p> <div class="product-price">$249</div> <div class="product-meta"> <div class="product-rating"> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <span>(42)</span> </div> <a href="#" class="product-cta">View Details</a> </div> </div> <div class="page-number">1</div> </div> <div class="page-back"> <div class="product-details"> <div class="product-details-header"> <h2 class="product-details-title">Nova Chair</h2> <p class="product-details-subtitle">The perfect balance of form and function</p> </div> <div class="product-details-content"> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/><path d="M7 12h2v5H7zm4-7h2v12h-2zm4 4h2v8h-2z"/></svg> </div> <div class="spec-text"> <strong>Materials</strong> Solid oak frame with high-resilience foam cushioning and premium fabric upholstery </div> </div> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M11 21H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h6v18zm2 0h6c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-6v18z"/></svg> </div> <div class="spec-text"> <strong>Dimensions</strong> W: 65cm × D: 67cm × H: 76cm Seat height: 43cm </div> </div> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/><path d="M12.5 7H11v6l5.25 3.15.75-1.23-4.5-2.67z"/></svg> </div> <div class="spec-text"> <strong>Lead Time</strong> Ships within 2-3 weeks </div> </div> <div class="colors-section"> <h3 class="colors-title">Available Colors</h3> <div class="color-options"> <div class="color-option selected" style="background-color: #d8d0c3;"></div> <div class="color-option" style="background-color: #5e6572;"></div> <div class="color-option" style="background-color: #b88b4a;"></div> <div class="color-option" style="background-color: #2d3142;"></div> </div> </div> </div> </div> <div class="page-number">2</div> </div> </div> <div class="page" id="page2"> <div class="page-front"> <div class="product"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1540638349517-3abd5afc5847?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="Ceramic Vase"> <div class="product-badge">Bestseller</div> </div> <h2 class="product-title">Halo Pendant Light</h2> <p class="product-description">Sculptural lighting piece that creates a warm ambient glow through handblown glass.</p> <div class="product-price">$189</div> <div class="product-meta"> <div class="product-rating"> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <span>(67)</span> </div> <a href="#" class="product-cta">View Details</a> </div> </div> <div class="page-number">3</div> </div> <div class="page-back"> <div class="product-details"> <div class="product-details-header"> <h2 class="product-details-title">Halo Pendant Light</h2> <p class="product-details-subtitle">Elevate your space with atmospheric lighting</p> </div> <div class="product-details-content"> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/><path d="M7 12h2v5H7zm4-7h2v12h-2zm4 4h2v8h-2z"/></svg> </div> <div class="spec-text"> <strong>Materials</strong> Handblown glass shade with brushed brass hardware and fabric-covered cord </div> </div> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M11 21H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h6v18zm2 0h6c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-6v18z"/></svg> </div> <div class="spec-text"> <strong>Dimensions</strong> Diameter: 28cm × Height: 32cm Cord length: 150cm (adjustable) </div> </div> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M9 21c0 .55.45 1 1 1h4c.55 0 1-.45 1-1v-1H9v1zm3-19C8.14 2 5 5.14 5 9c0 2.38 1.19 4.47 3 5.74V17c0 .55.45 1 1 1h6c.55 0 1-.45 1-1v-2.26c1.81-1.27 3-3.36 3-5.74 0-3.86-3.14-7-7-7zm2.85 11.1l-.85.6V16h-4v-2.3l-.85-.6A4.997 4.997 0 0 1 7 9c0-2.76 2.24-5 5-5s5 2.24 5 5c0 1.63-.8 3.16-2.15 4.1z"/></svg> </div> <div class="spec-text"> <strong>Bulb Specification</strong> E26 base, max 60W LED compatible (bulb not included) </div> </div> <div class="colors-section"> <h3 class="colors-title">Glass Finishes</h3> <div class="color-options"> <div class="color-option selected" style="background-color: #d1c6b6;"></div> <div class="color-option" style="background-color: #8bb1d1;"></div> <div class="color-option" style="background-color: #d1a788;"></div> <div class="color-option" style="background-color: #cdcdcd;"></div> </div> </div> </div> </div> <div class="page-number">4</div> </div> </div> <div class="page" id="page3"> <div class="page-front"> <div class="product"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1584589167171-541ce45f1eea?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="Ceramic Planter"> <div class="product-badge">Limited</div> </div> <h2 class="product-title">Terra Ceramic Collection</h2> <p class="product-description">Handcrafted ceramic planters and vessels with organic forms and textured glazes.</p> <div class="product-price">$79 - $129</div> <div class="product-meta"> <div class="product-rating"> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <span>(38)</span> </div> <a href="#" class="product-cta">View Details</a> </div> </div> <div class="page-number">5</div> </div> <div class="page-back"> <div class="product-details"> <div class="product-details-header"> <h2 class="product-details-title">Terra Ceramic Collection</h2> <p class="product-details-subtitle">Bring natural elements into your space</p> </div> <div class="product-details-content"> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V5h14v14z"/><path d="M7 12h2v5H7zm4-7h2v12h-2zm4 4h2v8h-2z"/></svg> </div> <div class="spec-text"> <strong>Materials</strong> High-fired stoneware with reactive glazes. Each piece features unique variations due to the handmade process. </div> </div> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M11 21H5c-1.1 0-2-.9-2-2V5c0-1.1.9-2 2-2h6v18zm2 0h6c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2h-6v18z"/></svg> </div> <div class="spec-text"> <strong>Sizes</strong> Small: H: 15cm × D: 12cm ($79) Medium: H: 20cm × D: 18cm ($99) Large: H: 25cm × D: 22cm ($129) </div> </div> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M9.01 14H2v2h7.01v3L13 15l-3.99-4v3zm5.98-1v-3H22V8h-7.01V5L11 9l3.99 4z"/></svg> </div> <div class="spec-text"> <strong>Features</strong> Drainage hole with cork plug for versatile use as planter or decorative vessel Water-resistant interior glaze </div> </div> <div class="colors-section"> <h3 class="colors-title">Glaze Options</h3> <div class="color-options"> <div class="color-option selected" style="background-color: #e8dfd1;"></div> <div class="color-option" style="background-color: #9fa9a3;"></div> <div class="color-option" style="background-color: #d19277;"></div> <div class="color-option" style="background-color: #2d4654;"></div> </div> </div> </div> </div> <div class="page-number">6</div> </div> </div> <div class="page" id="page4"> <div class="page-front"> <div class="product"> <div class="product-image"> <img src="https://images.unsplash.com/photo-1616627547584-bf28cee262db?ixlib=rb-1.2.1&auto=format&fit=crop&w=800&q=80" alt="Wool Rug"> <div class="product-badge">Artisan</div> </div> <h2 class="product-title">Meridian Wool Rug</h2> <p class="product-description">Hand-knotted wool rug with contemporary geometric pattern inspired by traditional motifs.</p> <div class="product-price">$549 - $1,249</div> <div class="product-meta"> <div class="product-rating"> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <svg viewBox="0 0 24 24"><path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/></svg> <span>(29)</span> </div> <a href="#" class="product-cta">View Details</a> </div> </div> <div class="page-number">7</div> </div> <div class="page-back"> <div class="product-details"> <div class="product-details-header"> <h2 class="product-details-title">Meridian Wool Rug</h2> <p class="product-details-subtitle">Handcrafted quality that grounds your space</p> </div> <div class="product-details-content"> <div class="spec-item"> <div class="spec-icon"> <svg viewBox="0 0 24 24"><path d="M19 3H5c-1.1 0-2 .9-2 2v14
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Digital Portfolio Showcase</title> <style> @import url('https://fonts.googleapis.com/css2?family=Montserrat:wght@300;500;700&family=Raleway:wght@300;600;800&display=swap'); :root { --primary: #ff3366; --secondary: #3366ff; --tertiary: #33ff99; --dark: #1a1a2e; --light: #f8f8ff; --transition: 0.5s cubic-bezier(0.77, 0, 0.175, 1); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Montserrat', sans-serif; background-color: var(--dark); color: var(--light); overflow: hidden; width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; } .portfolio-container { position: relative; width: 700px; height: 700px; perspective: 1500px; overflow: hidden; } .book { position: absolute; width: 100%; height: 100%; transform-style: preserve-3d; transition: transform 1s; } .page { position: absolute; width: 100%; height: 100%; top: 0; left: 0; transform-origin: left center; transition: transform var(--transition); transform-style: preserve-3d; background: var(--dark); overflow: hidden; cursor: pointer; box-shadow: 0 0 15px rgba(0, 0, 0, 0.5); } .page-front, .page-back { position: absolute; width: 100%; height: 100%; padding: 40px; display: flex; flex-direction: column; justify-content: center; backface-visibility: hidden; background-size: cover; background-position: center; overflow: hidden; border-radius: 2px; } .page-front { background-color: var(--dark); z-index: 1; } .page-back { background-color: var(--dark); transform: rotateY(180deg); } .page-content { position: relative; z-index: 10; padding: 20px; background: rgba(26, 26, 46, 0.8); border-radius: 8px; backdrop-filter: blur(5px); transition: all 0.4s ease; opacity: 0; transform: translateY(20px); } .page.active .page-content { opacity: 1; transform: translateY(0); transition-delay: 0.7s; } .page-title { font-family: 'Raleway', sans-serif; font-weight: 800; font-size: 32px; margin-bottom: 15px; background: linear-gradient(to right, var(--primary), var(--secondary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-transform: uppercase; letter-spacing: 1px; } .page-subtitle { font-family: 'Raleway', sans-serif; font-weight: 300; font-size: 18px; margin-bottom: 20px; color: var(--tertiary); } .page-description { font-size: 16px; line-height: 1.6; margin-bottom: 30px; } .page-tag { display: inline-block; margin-right: 8px; margin-bottom: 8px; padding: 5px 12px; background: rgba(255, 51, 102, 0.2); color: var(--primary); border-radius: 20px; font-size: 12px; font-weight: 600; border: 1px solid var(--primary); } .background-image { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-size: cover; background-position: center; opacity: 0.7; transition: all 0.8s ease; transform: scale(1.1); } .page.active .background-image { transform: scale(1); } .page-indicator { position: absolute; bottom: 30px; left: 0; width: 100%; display: flex; justify-content: center; z-index: 20; } .indicator { width: 10px; height: 10px; margin: 0 5px; border-radius: 50%; background: rgba(255, 255, 255, 0.3); cursor: pointer; transition: all 0.3s ease; } .indicator.active { background: var(--primary); transform: scale(1.3); } .page-navigation { position: absolute; top: 50%; width: 100%; display: flex; justify-content: space-between; z-index: 30; transform: translateY(-50%); padding: 0 20px; } .nav-btn { width: 50px; height: 50px; border-radius: 50%; background: rgba(26, 26, 46, 0.7); display: flex; justify-content: center; align-items: center; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); backdrop-filter: blur(5px); } .nav-btn:hover { background: var(--primary); transform: scale(1.1); } .nav-btn svg { width: 20px; height: 20px; fill: var(--light); } .cover { position: absolute; width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 40px; text-align: center; background: var(--dark); z-index: 50; opacity: 1; transition: all 0.8s ease; } .cover.hidden { opacity: 0; z-index: -1; } .cover-title { font-family: 'Raleway', sans-serif; font-weight: 800; font-size: 52px; margin-bottom: 20px; line-height: 1.1; background: linear-gradient(45deg, var(--primary), var(--secondary), var(--tertiary)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; text-transform: uppercase; letter-spacing: 2px; } .cover-subtitle { font-family: 'Montserrat', sans-serif; font-weight: 300; font-size: 24px; margin-bottom: 40px; color: var(--light); opacity: 0.8; } .start-btn { padding: 15px 40px; background: var(--primary); color: var(--light); border: none; border-radius: 30px; font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 16px; cursor: pointer; letter-spacing: 1px; transition: all 0.3s ease; text-transform: uppercase; box-shadow: 0 5px 15px rgba(255, 51, 102, 0.4); } .start-btn:hover { background: var(--secondary); transform: translateY(-3px); box-shadow: 0 8px 20px rgba(51, 102, 255, 0.4); } .cover-pattern { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: linear-gradient(30deg, var(--dark) 12%, transparent 12.5%, transparent 87%, var(--dark) 87.5%, var(--dark)), linear-gradient(150deg, var(--dark) 12%, transparent 12.5%, transparent 87%, var(--dark) 87.5%, var(--dark)), linear-gradient(30deg, var(--dark) 12%, transparent 12.5%, transparent 87%, var(--dark) 87.5%, var(--dark)), linear-gradient(150deg, var(--dark) 12%, transparent 12.5%, transparent 87%, var(--dark) 87.5%, var(--dark)), linear-gradient(60deg, rgba(51, 102, 255, 0.1) 25%, transparent 25.5%, transparent 75%, rgba(51, 102, 255, 0.1) 75%, rgba(51, 102, 255, 0.1)), linear-gradient(60deg, rgba(51, 102, 255, 0.1) 25%, transparent 25.5%, transparent 75%, rgba(51, 102, 255, 0.1) 75%, rgba(51, 102, 255, 0.1)); background-size: 40px 70px; background-position: 0 0, 0 0, 20px 35px, 20px 35px, 0 0, 20px 35px; opacity: 0.1; z-index: -1; } @keyframes float { 0% { transform: translateY(0px); } 50% { transform: translateY(-15px); } 100% { transform: translateY(0px); } } .cover-icon { position: absolute; opacity: 0.2; animation: float 6s ease-in-out infinite; } .icon-1 { top: 20%; left: 15%; width: 60px; height: 60px; animation-delay: 0s; } .icon-2 { top: 60%; right: 15%; width: 80px; height: 80px; animation-delay: 2s; } .icon-3 { bottom: 15%; left: 25%; width: 50px; height: 50px; animation-delay: 1s; } @media (max-width: 700px) { .cover-title { font-size: 36px; } .cover-subtitle { font-size: 18px; } .page-title { font-size: 26px; } .page-subtitle { font-size: 16px; } .page-front, .page-back { padding: 25px; } .page-content { padding: 15px; } } /* Hover and interaction effects */ .parallax-layer { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-size: 110% 110%; background-position: center; transition: transform 0.2s ease-out; } .shine-effect { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(45deg, rgba(255,255,255,0) 30%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 70%); background-size: 200% 200%; pointer-events: none; opacity: 0; transition: opacity 0.3s, background-position 0.3s; } .page:hover .shine-effect { opacity: 1; background-position: 200% 200%; transition: opacity 0.1s, background-position 1s; } .page-transitions { opacity: 0; transform: translateY(20px); transition: all 0.5s ease; } .page.active .page-transitions { opacity: 1; transform: translateY(0); } .delay-1 { transition-delay: 0.1s; } .delay-2 { transition-delay: 0.2s; } .delay-3 { transition-delay: 0.3s; } .delay-4 { transition-delay: 0.4s; } .scroll-indicator { position: absolute; bottom: 15px; left: 50%; transform: translateX(-50%); width: 30px; height: 50px; border: 2px solid rgba(255, 255, 255, 0.3); border-radius: 15px; z-index: 60; display: flex; justify-content: center; } .scroll-dot { width: 6px; height: 6px; background: var(--primary); border-radius: 50%; margin-top: 8px; animation: scrollAnim 2s infinite; } @keyframes scrollAnim { 0% { transform: translateY(0); opacity: 1; } 70% { transform: translateY(25px); opacity: 0; } 100% { transform: translateY(0); opacity: 1; } } /* Additional visual tweaks for embedded view */ .hover-glow { transition: all 0.3s ease; } .hover-glow:hover { text-shadow: 0 0 10px var(--primary); } .tags-container { margin-top: 10px; display: flex; flex-wrap: wrap; } </style> </head> <body> <div class="portfolio-container" id="portfolioContainer"> <div class="cover" id="cover"> <div class="cover-pattern"></div> <svg class="cover-icon icon-1" viewBox="0 0 24 24" fill="white"> <path d="M12,3C7.58,3 4,4.79 4,7C4,9.21 7.58,11 12,11C16.42,11 20,9.21 20,7C20,4.79 16.42,3 12,3M4,9V12C4,14.21 7.58,16 12,16C16.42,16 20,14.21 20,12V9C20,11.21 16.42,13 12,13C7.58,13 4,11.21 4,9M4,14V17C4,19.21 7.58,21 12,21C16.42,21 20,19.21 20,17V14C20,16.21 16.42,18 12,18C7.58,18 4,16.21 4,14Z"></path> </svg> <svg class="cover-icon icon-2" viewBox="0 0 24 24" fill="white"> <path d="M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2M6,9H18V11H6M14,14H6V12H14M18,8H6V6H18"></path> </svg> <svg class="cover-icon icon-3" viewBox="0 0 24 24" fill="white"> <path d="M4,2C2.89,2 2,2.89 2,4V14H4V4H14V2H4M8,6C6.89,6 6,6.89 6,8V18H8V8H18V6H8M12,10C10.89,10 10,10.89 10,12V20C10,21.11 10.89,22 12,22H20C21.11,22 22,21.11 22,20V12C22,10.89 21.11,10 20,10H12Z"></path> </svg> <h1 class="cover-title">Creative Portfolio</h1> <p class="cover-subtitle">Interactive Digital Showcase</p> <button class="start-btn" id="startBtn">Explore Work</button> <div class="scroll-indicator"> <div class="scroll-dot"></div> </div> </div> <div class="book" id="book"> <!-- Page 1 --> <div class="page" data-index="0"> <div class="page-front"> <div class="background-image" style="background-image: url('https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1064&q=80');"></div> <div class="shine-effect"></div> <div class="page-content"> <h2 class="page-title page-transitions">Digital Landscapes</h2> <h3 class="page-subtitle page-transitions delay-1">UI/UX Exploration</h3> <p class="page-description page-transitions delay-2">An experimental user interface for a streaming platform that defies traditional grid layouts, using dynamic color flows and morphing elements that respond to user interaction.</p> <div class="tags-container page-transitions delay-3"> <span class="page-tag">UI/UX</span> <span class="page-tag">Motion Design</span> <span class="page-tag">Interactive</span> </div> </div> </div> <div class="page-back"> <div class="background-image" style="background-image: url('https://images.unsplash.com/photo-1618005198919-d3d4b5a92ead?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1064&q=80');"></div> <div class="shine-effect"></div> <div class="page-content"> <h2 class="page-title page-transitions">Brand Evolution</h2> <h3 class="page-subtitle page-transitions delay-1">Identity Redesign</h3> <p class="page-description page-transitions delay-2">A complete overhaul of the Neutrino Tech visual language, introducing responsive logo systems that adapt to different contexts and platforms while maintaining brand consistency.</p> <div class="tags-container page-transitions delay-3"> <span class="page-tag">Branding</span> <span class="page-tag">Logo Design</span> <span class="page-tag">Visual Identity</span> </div> </div> </div> </div> <!-- Page 2 --> <div class="page" data-index="1"> <div class="page-front"> <div class="background-image" style="background-image: url('https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1064&q=80');"></div> <div class="shine-effect"></div> <div class="page-content"> <h2 class="page-title page-transitions">Immersive Typography</h2> <h3 class="page-subtitle page-transitions delay-1">Editorial Design</h3> <p class="page-description page-transitions delay-2">A typographic exploration for Quantum Magazine that pushes the boundaries of traditional editorial design. Letters transform and interact with content as readers scroll, creating a dynamic reading experience.</p> <div class="tags-container page-transitions delay-3"> <span class="page-tag">Typography</span> <span class="page-tag">Editorial</span> <span class="page-tag">Print</span> </div> </div> </div> <div class="page-back"> <div class="background-image" style="background-image: url('https://images.unsplash.com/photo-1614741118887-7a4ee193a5fa?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1064&q=80');"></div> <div class="shine-effect"></div> <div class="page-content"> <h2 class="page-title page-transitions">Sonic Visualizer</h2> <h3 class="page-subtitle page-transitions delay-1">Interactive Installation</h3> <p class="page-description page-transitions delay-2">A mixed-reality installation that translates music into living visual landscapes. Users can manipulate sound elements to create unique audio-reactive environments that respond in real-time.</p> <div class="tags-container page-transitions delay-3"> <span class="page-tag">Installation</span> <span class="page-tag">Interactive</span> <span class="page-tag">Generative Art</span> </div> </div> </div> </div> <!-- Page 3 --> <div class="page" data-index="2"> <div class="page-front"> <div class="background-image" style="background-image: url('https://images.unsplash.com/photo-1617096200227-9a6a0ac8bcda?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1064&q=80');"></div> <div class="shine-effect"></div> <div class="page-content"> <h2 class="page-title page-transitions">Holographic Interfaces</h2> <h3 class="page-subtitle page-transitions delay-1">Concept Design</h3> <p class="page-description page-transitions delay-2">A speculative design project exploring the future of workspace interfaces. These concepts integrate spatial computing with intuitive gesture controls to create fluid digital environments for collaborative work.</p> <div class="tags-container page-transitions delay-3"> <span class="page-tag">Futurism</span> <span class="page-tag">AR/VR</span> <span class="page-tag">Product Design</span> </div> </div> </div> <div class="page-back"> <div class="background-image" style="background-image: url('https://images.unsplash.com/photo-1619609825566-0942fe50043b?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=1064&q=80');"></div> <div class="shine-effect"></div> <div class="page-content"> <h2 class="page-title page-transitions">Contact</h2> <h3 class="page-subtitle page-transitions delay-1">Let's Create Together</h3> <p class="page-description page-transitions delay-2">Interested in collaborating on a project or discussing design opportunities? I'm always open to exploring new creative ventures and partnerships.</p> <div class="tags-container page-transitions delay-3"> <span class="page-tag hover-glow">[email protected]</span> <span class="page-tag hover-glow">@creative.design</span> </div> </div> </div> </div> <div class="page-indicator" id="pageIndicator"></div> <div class="page-navigation"> <div class="nav-btn prev-btn" id="prevBtn"> <svg viewBox="0 0 24 24"> <path d="M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z"></path> </svg> </div> <div class="nav-btn next-btn" id="nextBtn"> <svg viewBox="0 0 24 24"> <path d="M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z"></path> </svg> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const book = document.getElementById('book'); const pages = document.querySelectorAll('.page'); const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); const startBtn = document.getElementById('startBtn'); const cover = document.getElementById('cover'); const pageIndicator = document.getElementById('pageIndicator'); const containerEl = document.getElementById('portfolioContainer'); let currentIndex = 0; let isFlipping = false; let startX, startY; // Create page indicators pages.forEach((_, index) => { const indicator = document.createElement('div'); indicator.classList.add('indicator'); if (index === 0) indicator.classList.add('active'); indicator.addEventListener('click', () => { if (currentIndex !== index) goToPage(index); }); pageIndicator.appendChild(indicator); }); // Start button action startBtn.addEventListener('click', () => { cover.classList.add('hidden'); setTimeout(() => { pages[0].classList.add('active'); }, 300); }); // Navigation actions prevBtn.addEventListener('click', prevPage); nextBtn.addEventListener('click', nextPage); // Keyboard navigation document.addEventListener('keydown', (e) => { if (e.key === 'ArrowLeft') prevPage(); if (e.key === 'ArrowRight') nextPage(); }); // Touch/Swipe support containerEl.addEventListener('touchstart', (e) => { startX = e.touches[0].clientX; startY = e.touches[0].clientY; }, false); containerEl.addEventListener('touchend', (e) => { if (!startX || !startY) return; let endX = e.changedTouches[0].clientX; let endY = e.changedTouches[0].clientY; let diffX = startX - endX; let diffY = startY - endY; // Only register as a swipe if x movement is greater than y movement to avoid scrolling issues if (Math.abs(diffX) > Math.abs(diffY)) { if (diffX > 50) { // Swipe left nextPage(); } else if (diffX < -50) { // Swipe right prevPage(); } } startX = null; startY = null; }, false); // Parallax effect on pages pages.forEach(page => { const bgImage = page.querySelector('.background-image'); page.addEventListener('mousemove', (e) => { if (isFlipping) return; const rect = page.getBoundingClientRect(); const x = (e.clientX - rect.left) / rect.width - 0.5; const y = (e.clientY - rect.top) / rect.height - 0.5; gsParallax(bgImage, x, y, 20); }); page.addEventListener('mouseleave', () => { gsResetParallax(bgImage); }); // Make pages clickable for flipping if (page.querySelector('.page-front')) { page.querySelector('.page-front').addEventListener('click', (e) => { // Don't flip if clicking on interactive elements if (e.target.closest('.page-tag') || e.target.closest('.nav-btn')) return; nextPage(); }); } if (page.querySelector('.page-back')) { page.querySelector('.page-back').addEventListener('click', (e) => { // Don't flip if clicking on interactive elements if (e.target.closest('.page-tag') || e.target.closest('.nav-btn')) return; prevPage(); }); } }); function gsParallax(element, x, y, amount) { gsap.to(element, { x: x * amount, y: y * amount, duration: 0.3, ease: "power2.out" }); } function gsResetParallax(element) { gsap.to(element, { x: 0, y: 0, duration: 0.3, ease: "power2.out" }); } function prevPage() { if (isFlipping || currentIndex <= 0) return; goToPage(currentIndex - 1); } function nextPage() { if (isFlipping || currentIndex >= pages.length - 1) return; goToPage(currentIndex + 1); } function goToPage(index) { if (isFlipping || index === currentIndex) return; isFlipping = true; // Remove active class from current page and indicator pages[currentIndex].classList.remove('active'); document.querySelectorAll('.indicator')[currentIndex].classList.remove('active'); // Update current index currentIndex = index; // Update page position updatePagePositions(); // Add active class to new page and indicator setTimeout(() => { pages[currentIndex].classList.add('active'); document.querySelectorAll('.indicator')[currentIndex].classList.add('active'); isFlipping = false; }, 500); } function updatePagePositions() { pages.forEach((page, index) => { if (index < currentIndex) { page.style.transform = 'rotateY(-180deg)'; page.style.zIndex = pages.length - index; } else { page.style.transform = 'rotateY(0deg)'; page.style.zIndex = pages.length - index; } }); } // Initial setup updatePagePositions(); }); // Minimal GSAP-like implementation for the parallax effect const gsap = { to: (element, { x, y, duration, ease }) => { if (!element) return; element.style.transition = `transform ${duration}s ${ease === "power2.out" ? "cubic-bezier(0.25, 0.46, 0.45, 0.94)" : "ease"}`; element.style.transform = `translate(${x}px, ${y}px)`; } }; </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Wanderlust Journal</title> <style> @import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;700&family=Montserrat:wght@300;400;600&display=swap'); :root { --primary: #e9a87c; --secondary: #7c5e48; --accent: #c95d31; --background: #f8f1e9; --dark: #3d2c20; --page: #fef8f3; --shadow: rgba(0, 0, 0, 0.15); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Montserrat', sans-serif; background: var(--background); color: var(--dark); display: flex; justify-content: center; align-items: center; min-height: 700px; overflow: hidden; padding: 20px; } .journal-container { width: 650px; height: 580px; position: relative; perspective: 1500px; box-shadow: 0 20px 50px rgba(0, 0, 0, 0.3); border-radius: 5px; overflow: hidden; } .cover { position: absolute; background: var(--primary); width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; flex-direction: column; transform-style: preserve-3d; transform-origin: left; transition: transform 1.2s cubic-bezier(0.645, 0.045, 0.355, 1); border-radius: 5px; box-shadow: 0 10px 30px var(--shadow); z-index: 100; padding: 40px; background-image: url('data:image/svg+xml;utf8,<svg width="100" height="100" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="M50 10L52.5 17.5H60L53.75 22.5L56.25 30L50 25L43.75 30L46.25 22.5L40 17.5H47.5L50 10Z" fill="%23c95d31" opacity="0.2"/></svg>'); background-size: 100px; } .cover-title { font-family: 'Caveat', cursive; font-size: 3.5rem; color: var(--dark); text-align: center; margin-bottom: 15px; transform: translateZ(30px); text-shadow: 2px 2px 0px var(--shadow); } .cover-subtitle { font-family: 'Montserrat', sans-serif; font-weight: 300; font-size: 1.2rem; color: var(--dark); text-align: center; margin-bottom: 40px; transform: translateZ(20px); } .cover-image { width: 250px; height: 250px; background: var(--page); border-radius: 5px; box-shadow: 0 5px 15px var(--shadow); transform: translateZ(40px); background-image: url('data:image/svg+xml;utf8,<svg width="250" height="250" viewBox="0 0 250 250" xmlns="http://www.w3.org/2000/svg"><path d="M125 50C91.9 50 65 76.9 65 110C65 143.1 91.9 170 125 170C158.1 170 185 143.1 185 110C185 76.9 158.1 50 125 50ZM125 75C144.3 75 160 90.7 160 110C160 129.3 144.3 145 125 145C105.7 145 90 129.3 90 110C90 90.7 105.7 75 125 75Z" fill="%23e9a87c"/><path d="M125 175C75 175 25 200 25 200V225H225V200C225 200 175 175 125 175Z" fill="%23e9a87c"/></svg>'); position: relative; overflow: hidden; } .cover-image::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(45deg, transparent 65%, rgba(255, 255, 255, 0.3) 70%, transparent 75%); background-size: 200% 200%; animation: shine 3s infinite; } .open-button { position: absolute; bottom: 30px; padding: 10px 25px; background: var(--accent); color: white; border: none; border-radius: 30px; font-family: 'Caveat', cursive; font-size: 1.2rem; cursor: pointer; box-shadow: 0 5px 15px var(--shadow); transition: all 0.3s; transform: translateZ(25px); } .open-button:hover { background: var(--secondary); transform: translateZ(25px) scale(1.05); } .book { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; perspective: 1500px; } .page { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: var(--page); transform-origin: left; transform-style: preserve-3d; transition: transform 1.2s cubic-bezier(0.645, 0.045, 0.355, 1); border-radius: 0 5px 5px 0; overflow: hidden; box-shadow: 0 10px 30px var(--shadow); padding: 30px; } .page-content { position: absolute; width: 100%; height: 100%; padding: 30px; backface-visibility: hidden; display: flex; flex-direction: column; } .page-front { transform: rotateY(0deg); z-index: 1; background: var(--page); } .page-back { transform: rotateY(180deg); z-index: 0; background: var(--page); } .page-number { position: absolute; bottom: 20px; font-family: 'Caveat', cursive; font-size: 1.2rem; color: var(--secondary); } .page-front .page-number { right: 30px; } .page-back .page-number { left: 30px; } .turn-button { position: absolute; bottom: 20px; padding: 8px 20px; background: var(--primary); color: var(--dark); border: none; border-radius: 20px; font-family: 'Caveat', cursive; font-size: 1rem; cursor: pointer; transition: all 0.3s; z-index: 2; } .next-button { right: 70px; } .prev-button { left: 70px; } .turn-button:hover { background: var(--accent); color: white; } .page-background { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0.1; z-index: -1; pointer-events: none; } .page-title { font-family: 'Caveat', cursive; font-size: 2.5rem; color: var(--accent); margin-bottom: 20px; position: relative; } .page-title::after { content: ''; position: absolute; bottom: -10px; left: 0; width: 80px; height: 3px; background: var(--primary); } .page-subtitle { font-family: 'Montserrat', sans-serif; font-weight: 600; font-size: 1.1rem; color: var(--secondary); margin-bottom: 15px; } .page-text { font-family: 'Montserrat', sans-serif; font-size: 0.9rem; line-height: 1.6; margin-bottom: 15px; } .map-container { width: 100%; height: 180px; background: var(--background); border-radius: 5px; overflow: hidden; margin: 15px 0; position: relative; box-shadow: 0 3px 10px var(--shadow); } .map { width: 100%; height: 100%; background-image: url('data:image/svg+xml;utf8,<svg width="600" height="400" xmlns="http://www.w3.org/2000/svg"><rect width="600" height="400" fill="%23e9e5dd"/><path d="M50,100 C150,50 200,300 350,250 C500,200 550,100 600,150" stroke="%23c95d31" stroke-width="3" fill="none" stroke-dasharray="5,5"/><circle cx="150" cy="150" r="8" fill="%237c5e48"/><circle cx="350" cy="250" r="8" fill="%237c5e48"/><path d="M0,100 L600,100" stroke="%23aaa" stroke-width="1"/><path d="M0,200 L600,200" stroke="%23aaa" stroke-width="1"/><path d="M0,300 L600,300" stroke="%23aaa" stroke-width="1"/><path d="M200,0 L200,400" stroke="%23aaa" stroke-width="1"/><path d="M400,0 L400,400" stroke="%23aaa" stroke-width="1"/></svg>'); background-size: cover; transition: transform 0.5s; } .destination-marker { position: absolute; width: 40px; height: 40px; transform: translate(-50%, -100%); cursor: pointer; filter: drop-shadow(0 3px 5px rgba(0,0,0,0.3)); transition: transform 0.3s; } .destination-marker:hover { transform: translate(-50%, -100%) scale(1.1); } .travel-tip { background: #fff; border-left: 3px solid var(--accent); padding: 15px; border-radius: 0 5px 5px 0; margin: 15px 0; box-shadow: 0 3px 10px var(--shadow); } .tip-title { font-family: 'Caveat', cursive; font-size: 1.2rem; color: var(--secondary); margin-bottom: 5px; } .polaroid { background: white; padding: 10px 10px 30px 10px; box-shadow: 0 5px 15px var(--shadow); transform: rotate(-3deg); width: 160px; margin: 20px auto; position: relative; } .polaroid img { width: 100%; height: 120px; object-fit: cover; background: var(--primary); } .polaroid-caption { font-family: 'Caveat', cursive; text-align: center; margin-top: 10px; font-size: 1rem; } .page-decoration { position: absolute; font-family: 'Caveat', cursive; color: var(--accent); opacity: 0.1; font-size: 5rem; z-index: -1; } .top-right { top: 20px; right: 20px; transform: rotate(15deg); } .bottom-left { bottom: 60px; left: 20px; transform: rotate(-10deg); } .sticky-note { position: absolute; width: 120px; height: 120px; background: #fcf67f; padding: 15px; font-family: 'Caveat', cursive; font-size: 0.9rem; transform: rotate(5deg); box-shadow: 0 5px 10px var(--shadow); z-index: 2; } .sticky-position-1 { top: 20px; right: 40px; } .sticky-position-2 { bottom: 80px; left: 30px; transform: rotate(-3deg); background: #a5e8d0; } .check-list { padding-left: 20px; margin: 15px 0; } .check-item { font-family: 'Montserrat', sans-serif; font-size: 0.9rem; margin-bottom: 8px; position: relative; padding-left: 25px; } .check-item::before { content: ''; position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 15px; height: 15px; border: 2px solid var(--primary); border-radius: 3px; } .check-item.checked::before { background: var(--primary); content: '✓'; color: white; font-size: 0.7rem; display: flex; align-items: center; justify-content: center; } @keyframes shine { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } @keyframes float { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-10px) rotate(5deg); } } .floating { animation: float 5s ease-in-out infinite; } @media (max-width: 700px) { .journal-container { width: 100%; height: 500px; } .cover-title { font-size: 2.5rem; } .cover-image { width: 180px; height: 180px; } .page-title { font-size: 2rem; } .page { padding: 20px; } .page-content { padding: 20px; } .polaroid { width: 120px; } .map-container { height: 150px; } .sticky-note { width: 100px; height: 100px; font-size: 0.8rem; } } /* Page curl effect */ .page-curl { position: absolute; bottom: 0; right: 0; width: 50px; height: 50px; background: linear-gradient(135deg, transparent 75%, rgba(0,0,0,0.05) 75%); border-radius: 0 0 0 10px; box-shadow: -2px -2px 5px rgba(0,0,0,0.1); transition: all 0.3s; } .page:hover .page-curl { width: 70px; height: 70px; } .stamped { position: relative; } .stamp { position: absolute; top: 50px; right: 30px; width: 100px; height: 100px; background: rgba(201, 93, 49, 0.7); border-radius: 50%; transform: rotate(15deg); display: flex; justify-content: center; align-items: center; color: white; font-family: 'Caveat', cursive; font-size: 0.8rem; text-align: center; border: 2px dashed white; box-shadow: 0 0 0 5px rgba(201, 93, 49, 0.7); z-index: 3; } </style> </head> <body> <div class="journal-container"> <div class="cover"> <h1 class="cover-title">Wanderlust Journal</h1> <p class="cover-subtitle">Your pocket guide to authentic travel experiences</p> <div class="cover-image floating"></div> <button class="open-button">Open Journal</button> </div> <div class="book"> <!-- Page 1 --> <div class="page" id="page1"> <div class="page-content page-front"> <h2 class="page-title">Kyoto, Japan</h2> <h3 class="page-subtitle">Where Ancient Traditions Meet Modern Life</h3> <p class="page-text">Kyoto, once the imperial capital of Japan for more than a millennium, is home to thousands of ancient Buddhist temples, Shinto shrines, traditional gardens, and wooden houses. The light here changes the city - golden at dawn over the Kamo River, soft at dusk among the bamboo groves of Arashiyama.</p> <div class="map-container"> <div class="map" id="map1"></div> </div> <div class="travel-tip"> <h4 class="tip-title">Local Insight:</h4> <p class="page-text">Visit Fushimi Inari Shrine early morning (before 7 AM) or evening (after 7 PM) to avoid crowds and experience the mystical atmosphere of the vermillion torii gates stretching up the mountainside.</p> </div> <div class="page-decoration top-right">✈</div> <div class="page-number">1</div> <div class="page-curl"></div> </div> <div class="page-content page-back"> <div class="polaroid"> <img src="data:image/svg+xml;utf8,<svg width='160' height='120' xmlns='http://www.w3.org/2000/svg'><rect width='160' height='120' fill='%23e9a87c'/><path d='M0,90 L30,60 L60,80 L100,40 L160,90 L160,120 L0,120 Z' fill='%237c5e48'/><circle cx='120' cy='30' r='15' fill='%23f8f1e9'/></svg>" alt="Temple gardens"> <p class="polaroid-caption">Kinkaku-ji Golden Pavilion</p> </div> <h3 class="page-subtitle">Best Time to Visit</h3> <p class="page-text">Spring (March to May) for cherry blossoms and Fall (October to November) for vibrant autumn foliage. Summer brings festivals but can be hot and humid, while winter offers a serene atmosphere with occasional light snowfall.</p> <div class="check-list"> <div class="check-item checked">Explore Philosopher's Path</div> <div class="check-item checked">Try matcha tea ceremony</div> <div class="check-item">Visit Arashiyama Bamboo Grove</div> <div class="check-item">Geisha spotting in Gion</div> </div> <div class="sticky-note sticky-position-1"> Remember to bow slightly when greeting locals! </div> <div class="page-decoration bottom-left">⛩</div> <div class="page-number">2</div> </div> <button class="turn-button next-button" data-page="1">Next →</button> </div> <!-- Page 2 --> <div class="page" id="page2"> <div class="page-content page-front"> <h2 class="page-title">Santorini, Greece</h2> <h3 class="page-subtitle">The White-Washed Wonder of the Aegean</h3> <p class="page-text">Perched on the edge of a submerged volcano, Santorini is a crescent-shaped island famous for its dramatic views, stunning sunsets, white-washed buildings with blue domes, black sand beaches, and excellent wines produced from grapes grown in volcanic soil.</p> <div class="map-container"> <div class="map" id="map2"></div> </div> <div class="travel-tip"> <h4 class="tip-title">Hidden Gem:</h4> <p class="page-text">Escape the crowds of Oia by hiking the less-visited trail from Fira to Oia. This 10km path offers spectacular caldera views without the tourist masses. Start early morning to avoid the midday heat.</p> </div> <div class="page-decoration top-right">☀</div> <div class="page-number">3</div> <div class="page-curl"></div> </div> <div class="page-content page-back stamped"> <div class="polaroid" style="transform: rotate(2deg);"> <img src="data:image/svg+xml;utf8,<svg width='160' height='120' xmlns='http://www.w3.org/2000/svg'><rect width='160' height='120' fill='%237ec0de'/><path d='M0,60 Q40,50 80,60 T160,60 L160,120 L0,120 Z' fill='%23336699'/><path d='M0,0 L160,0 L160,60 Q120,40 80,60 Q40,80 0,60 Z' fill='%2384b4d8'/><rect x='20' y='20' width='40' height='30' rx='5' fill='white'/><rect x='70' y='30' width='30' height='20' rx='5' fill='white'/><rect x='110' y='15' width='35' height='25' rx='5' fill='white'/><circle cx='135' cy='15' r='8' fill='%23f8f1e9'/></svg>" alt="Santorini coast"> <p class="polaroid-caption">Oia Sunset Views</p> </div> <h3 class="page-subtitle">Local Experiences</h3> <p class="page-text">Beyond the iconic views, Santorini offers incredible volcanic wines. Visit family-run wineries like Domaine Sigalas or Gavalas for wine tastings with local cheese pairings. The Assyrtiko grape, grown in the island's unique basket-shaped vines, produces crisp white wines with mineral notes.</p> <div class="check-list"> <div class="check-item checked">Watch sunset in Oia</div> <div class="check-item checked">Swim at Red Beach</div> <div class="check-item">Visit ancient Akrotiri</div> <div class="check-item">Boat tour to the volcano</div> </div> <div class="sticky-note sticky-position-2"> Ferry schedules change often - confirm 24hrs before! </div> <div class="stamp">VISITED<br>SUMMER 2023</div> <div class="page-decoration bottom-left">⚓</div> <div class="page-number">4</div> </div> <button class="turn-button next-button" data-page="2">Next →</button> <button class="turn-button prev-button" data-page="2">← Back</button> </div> <!-- Page 3 --> <div class="page" id="page3"> <div class="page-content page-front"> <h2 class="page-title">Marrakech, Morocco</h2> <h3 class="page-subtitle">A Sensory Feast in the Red City</h3> <p class="page-text">Marrakech dazzles with its labyrinthine medina, vibrant souks, and architectural marvels. The ancient walled city is a UNESCO World Heritage site where traditional life continues amid the chaos and color. Here, the call to prayer mingles with the shouts of market vendors and the scent of spices fills the air.</p> <div class="map-container"> <div class="map" id="map3"></div> </div> <div class="travel-tip"> <h4 class="tip-title">Bargaining Etiquette:</h4> <p class="page-text">When shopping in the souks, offer about 40% of the initial asking price and work up from there. Friendly bargaining is expected, but always do it with a smile. Walking away often brings the price down quickly!</p> </div> <div class="page-decoration top-right">🧿</div> <div class="page-number">5</div> <div class="page-curl"></div> </div> <div class="page-content page-back"> <div class="polaroid" style="transform: rotate(-2deg);"> <img src="data:image/svg+xml;utf8,<svg width='160' height='120' xmlns='http://www.w3.org/2000/svg'><rect width='160' height='120' fill='%23d5a26a'/><rect x='20' y='20' width='120' height='80' fill='%23c95d31'/><path d='M50,20 L50,100 M70,20 L70,100 M90,20 L90,100 M110,20 L110,100' stroke='%23d5a26a' stroke-width='2'/><path d='M20,40 L140,40 M20,60 L140,60 M20,80 L140,80' stroke='%23d5a26a' stroke-width='2'/><path d='M80,20 L80,10 L100,0 L120,10 L120,20 Z' fill='%237c5e48'/></svg>" alt="Marrakech medina"> <p class="polaroid-caption">Jemaa el-Fnaa Square</p> </div> <h3 class="page-subtitle">Beyond the Medina</h3> <p class="page-text">While the ancient walled city captivates, don't miss the stunning Majorelle Garden created by Yves Saint Laurent, with its striking cobalt blue accents and exotic plant collection. For authentic Moroccan flavors, try a cooking class that begins with a guided market tour to select fresh ingredients.</p> <div class="check-list"> <div class="check-item checked">Get lost in the medina</div> <div class="check-item checked">Visit Bahia Palace</div> <div class="check-item">Hammam spa experience</div> <div class="check-item">Day trip to Atlas Mountains</div> </div> <div class="sticky-note sticky-position-1" style="background: #ff9e7a;"> Learn "La, shukran" (No, thank you) for persistent vendors! </div> <div class="page-decoration bottom-left">🐪</div> <div class="page-number">6</div> </div> <button class="turn-button next-button" data-page="3">Next →</button> <button class="turn-button prev-button" data-page="3">← Back</button> </div> <!-- Final page --> <div class="page" id="page4"> <div class="page-content page-front"> <h2 class="page-title">Your Next Adventure</h2> <h3 class="page-subtitle">Where will your wanderlust take you?</h3> <p class="page-text">The world is filled with extraordinary destinations waiting to be explored. Whether you seek ancient temples, pristine beaches, bustling markets, or remote wilderness, your perfect journey is out there.</p> <p class="page-text">As you plan your next adventure, remember that the most memorable experiences often come from unexpected moments and connections with local people. Stay open to serendipity and allow yourself to wander off the beaten path.</p> <div class="map-container"> <div class="map" id="map4"></div> </div> <div class="travel-tip"> <h4 class="tip-title">Travel Philosophy:</h4> <p class="page-text">"Travel isn't always pretty. It isn't always comfortable. Sometimes it hurts, it even breaks your heart. But that's okay. The journey changes you; it should change you." – Anthony Bourdain</p> </div> <div class="page-decoration top-right">🗺️</div> <div class="page-number">7</div> <div class="page-curl"></div> </div> <div class="page-content page-back"> <h2 class="page-title">Traveler's Notes</h2> <div style="background: url('data:image/svg+xml;utf8,<svg width=\"500\" height=\"300\" xmlns=\"http://www.w3.org/2000/svg\"><rect width=\"500\" height=\"300\" fill=\"%23fff\"/><line x1=\"0\" y1=\"30\" x2=\"500\" y2=\"30\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"60\" x2=\"500\" y2=\"60\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"90\" x2=\"500\" y2=\"90\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"120\" x2=\"500\" y2=\"120\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"150\" x2=\"500\" y2=\"150\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"180\" x2=\"500\" y2=\"180\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"210\" x2=\"500\" y2=\"210\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"240\" x2=\"500\" y2=\"240\" stroke=\"%23ccc\" stroke-width=\"1\"/><line x1=\"0\" y1=\"270\" x2=\"500\" y2=\"270\" stroke=\"%23ccc\" stroke-width=\"1\"/></svg>'); height: 300px; margin-top: 20px; border-radius: 5px; box-shadow: 0 3px 10px var(--shadow);"> <div style="font-family: 'Caveat', cursive; padding: 40px; font-size: 1.1rem; color: var(--secondary); line-height: 1.8;"> My travel dreams: <br><br> <span style="visibility: hidden;">Where to next?</span> </div> </div> <div class="polaroid" style="position: absolute; bottom: 80px; right: 40px; transform: rotate(5deg); width: 120px; height: 150px;"> <img src="data:image/svg+xml;utf8,<svg width='120' height='100' xmlns='http://www.w3.org/2000/svg'><rect width='120' height='100' fill='%23e9e5dd'/><circle cx='60' cy='50' r='30' fill='%23c95d31'/><circle cx='60' cy='50' r='25' fill='%23e9a87c'/><circle cx='60' cy='50' r='20' fill='%23f8f1e9'/></svg>" alt="World map"> <p class="polaroid-caption">Your Journey</p> </div> <div class="page-decoration bottom-left">✧</div> <div class="page-number">8</div> </div> <button class="turn-button prev-button" data-page="4">← Back</button> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const cover = document.querySelector('.cover'); const openButton = document.querySelector('.open-button'); const pages = document.querySelectorAll('.page'); const nextButtons = document.querySelectorAll('.next-button'); const prevButtons = document.querySelectorAll('.prev-button'); // Set initial z-index for proper stacking pages.forEach((page, index) => { page.style.zIndex = 10 - index; if (index > 0) { page.style.transform = 'rotateY(0deg)'; } }); // Handle cover open openButton.addEventListener('click', function() { cover.style.transform = 'rotateY(-180deg)'; // Add page curl hover effect after cover is opened setTimeout(() => { pages.forEach(page => { page.style.transition = 'transform 1.2s cubic-bezier(0.645, 0.045, 0.355, 1)'; }); }, 1000); }); // Handle page turns function turnPage(pageNum, direction) { const currentPage = document.getElementById(`page${pageNum}`); if (direction === 'next') { currentPage.style.transform = 'rotateY(-180deg)'; currentPage.style.zIndex = 5 - pageNum; } else { currentPage.style.transform = 'rotateY(0deg)'; currentPage.style.zIndex = 10 - pageNum; } // Add page turning sound effect const audio = new Audio('data:audio/mp3;base64,SUQzBAAAAAABEVRYWFgAAAAtAAADY29tbWVudABCaWdTb3VuZEJhbmsuY29tIC8gTGFzb25pY1N0dWRpb3MuY29tAFRYWFgAAAAcAAADZW5naW5lZXIAQmlnU291bmRCYW5rLmNvbQBUWFhYAAAAGAAAAGRhdGUAMjAxMC0wMi0wOVRYWFgAAAAdAAADY29weXJpZ2h0AEJpZ1NvdW5kQmFuay5jb20AVFNTRQAAAA8AAANMYXZmNTguMTAuMTAwAAAAAAAAAAAAAAD/80DEAAGpDbJgwEwALGm/j8ADAAhQUEFCQ0REVFVWVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Adventure Pals Storybook</title> <style> @import url('https://fonts.googleapis.com/css2?family=Bubblegum+Sans&family=Comic+Neue:wght@400;700&display=swap'); :root { --primary: #FF6B6B; --secondary: #48BEFF; --tertiary: #FFD93D; --accent: #6BCB77; --dark: #4A4A4A; --light: #F9F9F9; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Comic Neue', cursive; background-color: #f0f5ff; background-image: radial-gradient(var(--tertiary) 2px, transparent 2px), radial-gradient(var(--secondary) 2px, transparent 2px); background-size: 40px 40px; background-position: 0 0, 20px 20px; height: 100vh; display: flex; justify-content: center; align-items: center; overflow: hidden; } .container { width: 700px; height: 700px; position: relative; perspective: 1500px; } .book { position: absolute; width: 90%; height: 90%; top: 5%; left: 5%; transform-style: preserve-3d; transition: transform 0.5s; } .book-cover { position: absolute; width: 100%; height: 100%; border-radius: 15px 30px 30px 15px; background: var(--primary); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2), 5px 5px 0 var(--dark); display: flex; flex-direction: column; justify-content: center; align-items: center; backface-visibility: hidden; z-index: 10; transform-origin: left; transition: transform 0.7s cubic-bezier(0.645, 0.045, 0.355, 1.000); } .book-cover.open { transform: rotateY(-160deg); } .cover-title { font-family: 'Bubblegum Sans', cursive; font-size: 3.5rem; color: var(--light); text-align: center; text-shadow: 3px 3px 0 var(--dark); margin-bottom: 1rem; } .cover-subtitle { font-family: 'Comic Neue', cursive; font-size: 1.5rem; color: var(--light); font-weight: bold; margin-bottom: 2rem; } .cover-image { width: 70%; height: 50%; background: var(--light); border-radius: 10px; border: 8px solid var(--tertiary); display: flex; justify-content: center; align-items: center; position: relative; overflow: hidden; } .cover-image img { max-width: 100%; max-height: 100%; object-fit: cover; transition: transform 0.3s; } .start-button { margin-top: 2rem; padding: 12px 30px; font-family: 'Bubblegum Sans', cursive; font-size: 1.5rem; color: var(--dark); background-color: var(--tertiary); border: none; border-radius: 25px; cursor: pointer; box-shadow: 0 5px 0 rgba(0, 0, 0, 0.2); transition: all 0.2s; position: relative; overflow: hidden; } .start-button:hover { transform: translateY(-3px); box-shadow: 0 8px 0 rgba(0, 0, 0, 0.2); } .start-button:active { transform: translateY(2px); box-shadow: 0 3px 0 rgba(0, 0, 0, 0.2); } .start-button::after { content: ""; position: absolute; width: 100%; height: 100%; top: 0; left: -100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); transition: all 0.6s; } .start-button:hover::after { left: 100%; } .book-pages { position: absolute; width: 100%; height: 100%; transform-style: preserve-3d; } .page { position: absolute; width: 100%; height: 100%; background: var(--light); border-radius: 10px 25px 25px 10px; box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1); backface-visibility: hidden; transform-origin: left; transform-style: preserve-3d; transition: transform 0.7s cubic-bezier(0.645, 0.045, 0.355, 1.000); overflow: hidden; display: flex; justify-content: center; align-items: center; padding: 40px; } .page.flipped { transform: rotateY(-160deg); } .page-content { width: 100%; height: 100%; display: flex; flex-direction: column; justify-content: space-between; align-items: center; z-index: 2; } .page-title { font-family: 'Bubblegum Sans', cursive; font-size: 2rem; color: var(--dark); margin-bottom: 1rem; text-align: center; } .page-text { font-size: 1.2rem; line-height: 1.6; color: var(--dark); text-align: center; margin-bottom: 1rem; } .page-illustration { width: 70%; height: 50%; position: relative; margin: 20px 0; transition: transform 0.3s; } .page-illustration img { width: 100%; height: 100%; object-fit: contain; transition: all 0.3s; } .popup-element { position: absolute; transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); transform: scale(0); opacity: 0; cursor: pointer; } .popup-element.active { transform: scale(1); opacity: 1; } .popup-element:hover { transform: scale(1.1) rotate(5deg); } .nav-buttons { width: 100%; display: flex; justify-content: space-between; margin-top: 1rem; } .nav-button { padding: 10px 20px; font-family: 'Bubblegum Sans', cursive; font-size: 1.2rem; color: var(--light); background-color: var(--secondary); border: none; border-radius: 20px; cursor: pointer; box-shadow: 0 3px 0 rgba(0, 0, 0, 0.2); transition: all 0.2s; } .nav-button:hover { transform: translateY(-2px); box-shadow: 0 5px 0 rgba(0, 0, 0, 0.2); } .nav-button:active { transform: translateY(1px); box-shadow: 0 2px 0 rgba(0, 0, 0, 0.2); } .prev-button { background-color: var(--accent); } .next-button { background-color: var(--primary); } .page-number { font-family: 'Bubblegum Sans', cursive; font-size: 1rem; color: var(--dark); position: absolute; bottom: 20px; right: 20px; } .page-decoration { position: absolute; width: 100px; height: 100px; background-repeat: no-repeat; background-size: contain; opacity: 0.3; z-index: 1; } .decoration-1 { top: 20px; left: 20px; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path fill="%23FFD93D" d="M50 0 L60 40 L100 50 L60 60 L50 100 L40 60 L0 50 L40 40 Z"/></svg>'); animation: float 6s ease-in-out infinite; } .decoration-2 { bottom: 20px; right: 20px; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle fill="%236BCB77" cx="50" cy="50" r="50"/></svg>'); animation: float 7s ease-in-out infinite reverse; } .sound-button { position: absolute; top: 20px; right: 20px; width: 40px; height: 40px; background-color: var(--tertiary); border-radius: 50%; display: flex; justify-content: center; align-items: center; cursor: pointer; z-index: 20; box-shadow: 0 3px 5px rgba(0, 0, 0, 0.2); transition: all 0.3s; } .sound-button:hover { transform: scale(1.1); } .sound-icon { width: 20px; height: 20px; background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%234A4A4A" d="M14.5,12c0,1.38-0.5,2.66-1.35,3.64l1.31,1.31c1.19-1.34,1.91-3.1,1.91-5.01c0-1.89-0.72-3.63-1.89-4.96l-1.3,1.3C14,9.36,14.5,10.62,14.5,12z M9,13.5v-3c0-0.55-0.45-1-1-1H5c-0.55,0-1,0.45-1,1v3c0,0.55,0.45,1,1,1h3C8.55,14.5,9,14.05,9,13.5z M19,12c0,3.14-1.64,5.88-4.1,7.45l1.22,1.22C18.99,18.76,21,15.59,21,12s-2.01-6.76-4.88-8.67l-1.22,1.22C17.36,6.12,19,8.86,19,12z"/></svg>'); background-repeat: no-repeat; background-position: center; } .sound-off .sound-icon { background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="%234A4A4A" d="M9,13.5v-3c0-0.55-0.45-1-1-1H5c-0.55,0-1,0.45-1,1v3c0,0.55,0.45,1,1,1h3C8.55,14.5,9,14.05,9,13.5z M16.71,11.71l2.12-2.12c0.39-0.39,0.39-1.02,0-1.41s-1.02-0.39-1.41,0l-2.12,2.12l-2.12-2.12c-0.39-0.39-1.02-0.39-1.41,0s-0.39,1.02,0,1.41l2.12,2.12l-2.12,2.12c-0.39,0.39-0.39,1.02,0,1.41c0.39,0.39,1.02,0.39,1.41,0l2.12-2.12l2.12,2.12c0.39,0.39,1.02,0.39,1.41,0c0.39-0.39,0.39-1.02,0-1.41L16.71,11.71z"/></svg>'); } @keyframes float { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-15px) rotate(5deg); } } @keyframes bounce { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } @keyframes wiggle { 0%, 100% { transform: rotate(0deg); } 25% { transform: rotate(5deg); } 75% { transform: rotate(-5deg); } } @media (max-width: 700px) { .container { width: 95%; height: 95vh; } .cover-title { font-size: 2.5rem; } .cover-subtitle { font-size: 1.2rem; } .page-title { font-size: 1.5rem; } .page-text { font-size: 1rem; } .nav-button { font-size: 1rem; padding: 8px 15px; } } </style> </head> <body> <div class="container"> <div class="book"> <div class="book-cover"> <h1 class="cover-title">Willow's Magical Garden</h1> <p class="cover-subtitle">A Tale of Wonder and Friendship</p> <div class="cover-image"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 400'><rect width='600' height='400' fill='%23c6e9ff'/><circle cx='300' cy='100' r='60' fill='%23FFD93D'/><path d='M250,400 C100,350 100,200 200,150 C250,130 350,130 400,150 C500,200 500,350 350,400 Z' fill='%236BCB77'/><path d='M310,250 L310,350 L350,350 L350,280 Z' fill='%23A67C52'/><path d='M300,170 C240,200 220,280 220,350 C220,380 380,380 380,350 C380,280 360,200 300,170 Z' fill='%23FF6B6B'/><circle cx='300' cy='150' r='80' fill='%23FF6B6B'/><circle cx='270' cy='130' r='10' fill='%23FFFFFF'/><circle cx='330' cy='130' r='10' fill='%23FFFFFF'/><path d='M280,170 Q300,190 320,170' stroke='%23FFFFFF' stroke-width='5' fill='none'/><path d='M230,50 C260,30 280,70 290,50 C300,70 320,30 350,50 C320,80 260,80 230,50 Z' fill='%23FF9F1C'/></svg>" alt="Willow the Flower Fairy"> </div> <button class="start-button">Begin Adventure!</button> </div> <div class="book-pages"> <!-- Page 1 --> <div class="page" id="page1"> <div class="page-decoration decoration-1"></div> <div class="page-decoration decoration-2"></div> <div class="page-content"> <h2 class="page-title">Meet Willow</h2> <div class="page-illustration"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 400'><rect width='600' height='400' fill='%23F9F9F9' opacity='0'/><path d='M310,250 L310,350 L350,350 L350,280 Z' fill='%23A67C52'/><path d='M300,170 C240,200 220,280 220,350 C220,380 380,380 380,350 C380,280 360,200 300,170 Z' fill='%23FF6B6B'/><circle cx='300' cy='150' r='80' fill='%23FF6B6B'/><circle cx='270' cy='130' r='10' fill='%23FFFFFF'/><circle cx='330' cy='130' r='10' fill='%23FFFFFF'/><path d='M280,170 Q300,190 320,170' stroke='%23FFFFFF' stroke-width='5' fill='none'/><path d='M230,50 C260,30 280,70 290,50 C300,70 320,30 350,50 C320,80 260,80 230,50 Z' fill='%23FF9F1C'/></svg>" alt="Willow the Flower Fairy"> <div class="popup-element" style="top: 50px; left: 230px; width: 60px; height: 60px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 60'><path d='M30,0 L36,20 L60,30 L36,40 L30,60 L24,40 L0,30 L24,20 Z' fill='%23FFD93D'/></svg>" alt="Magic Sparkle"> </div> <div class="popup-element" style="bottom: 70px; right: 200px; width: 40px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 60 60'><path d='M30,0 C46.5,0 60,13.5 60,30 C60,46.5 46.5,60 30,60 C13.5,60 0,46.5 0,30 C0,13.5 13.5,0 30,0 Z' fill='%2348BEFF'/></svg>" alt="Water Drop"> </div> </div> <p class="page-text">In the heart of Blossom Valley lived a flower fairy named Willow. Her petals were as pink as the sunrise, and her smile could light up even the cloudiest day.</p> <div class="nav-buttons"> <button class="nav-button prev-button" disabled>Previous</button> <button class="nav-button next-button">Next</button> </div> <div class="page-number">1</div> </div> </div> <!-- Page 2 --> <div class="page" id="page2"> <div class="page-decoration decoration-1"></div> <div class="page-decoration decoration-2"></div> <div class="page-content"> <h2 class="page-title">The Sleepy Garden</h2> <div class="page-illustration"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 400'><rect width='600' height='400' fill='%23F9F9F9' opacity='0'/><path d='M0,350 C100,320 200,370 300,340 C400,310 500,380 600,350 L600,400 L0,400 Z' fill='%236BCB77'/><path d='M100,380 L100,300 L130,300 L130,380 Z' fill='%23A67C52'/><path d='M100,300 C70,250 60,280 100,220 C140,280 130,250 100,300 Z' fill='%236BCB77'/><path d='M200,380 L200,320 L220,320 L220,380 Z' fill='%23A67C52'/><path d='M210,320 C190,290 180,310 190,260 C210,310 230,290 210,320 Z' fill='%236BCB77'/><path d='M350,380 L350,280 L390,280 L390,380 Z' fill='%23A67C52'/><path d='M370,280 C330,220 300,240 340,180 C380,240 410,220 370,280 Z' fill='%236BCB77'/><path d='M450,380 L450,330 L470,330 L470,380 Z' fill='%23A67C52'/><path d='M460,330 C440,300 430,310 450,270 C470,310 480,300 460,330 Z' fill='%236BCB77'/><path d='M150,350 C160,320 170,330 150,300 C130,330 140,320 150,350 Z' fill='%23FF6B6B'/><path d='M250,340 C265,300 280,320 250,280 C220,320 235,300 250,340 Z' fill='%236BCB77'/><path d='M500,360 C510,330 520,340 500,310 C480,340 490,330 500,360 Z' fill='%23FF6B6B'/></svg>" alt="Sleepy Garden"> <div class="popup-element" style="top: 100px; left: 120px; width: 80px; height: 50px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 80 50'><path d='M0,25 Q20,0 40,25 Q60,50 80,25' stroke='%2348BEFF' stroke-width='5' fill='none'/><path d='M0,25 Q20,0 40,25 Q60,50 80,25' stroke='%2348BEFF' stroke-width='5' fill='none' transform='translate(0,10)'/><path d='M0,25 Q20,0 40,25 Q60,50 80,25' stroke='%2348BEFF' stroke-width='5' fill='none' transform='translate(0,20)'/></svg>" alt="Wind"> </div> <div class="popup-element" style="bottom: 120px; right: 150px; width: 50px; height: 50px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 50 50'><path d='M25,0 C25,0 10,15 10,30 C10,40 18,50 25,50 C32,50 40,40 40,30 C40,15 25,0 25,0 Z' fill='%2348BEFF'/></svg>" alt="Water Drop"> </div> </div> <p class="page-text">One day, Willow noticed the garden flowers weren't opening. "They're all still asleep!" she gasped. Without the flowers' magic, the garden creatures would have no home.</p> <div class="nav-buttons"> <button class="nav-button prev-button">Previous</button> <button class="nav-button next-button">Next</button> </div> <div class="page-number">2</div> </div> </div> <!-- Page 3 --> <div class="page" id="page3"> <div class="page-decoration decoration-1"></div> <div class="page-decoration decoration-2"></div> <div class="page-content"> <h2 class="page-title">The Magical Seeds</h2> <div class="page-illustration"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 400'><rect width='600' height='400' fill='%23F9F9F9' opacity='0'/><path d='M300,170 L300,400 L340,400 L340,170 Z' fill='%23A67C52'/><path d='M310,250 C250,200 220,280 220,350 C220,380 380,380 380,350 C380,280 350,200 310,250 Z' fill='%23FF6B6B'/><circle cx='300' cy='150' r='80' fill='%23FF6B6B'/><circle cx='270' cy='130' r='10' fill='%23FFFFFF'/><circle cx='330' cy='130' r='10' fill='%23FFFFFF'/><path d='M280,170 Q300,190 320,170' stroke='%23FFFFFF' stroke-width='5' fill='none'/><circle cx='120' cy='300' r='30' fill='%23FFD93D'/><circle cx='480' cy='300' r='30' fill='%23FFD93D'/></svg>" alt="Willow with Magic Seeds"> <div class="popup-element" style="top: 280px; left: 120px; width: 30px; height: 30px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><circle cx='15' cy='15' r='15' fill='%23FFD93D'/><circle cx='15' cy='15' r='5' fill='%23FF6B6B'/></svg>" alt="Magic Seed"> </div> <div class="popup-element" style="top: 280px; right: 120px; width: 30px; height: 30px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><circle cx='15' cy='15' r='15' fill='%23FFD93D'/><circle cx='15' cy='15' r='5' fill='%23FF6B6B'/></svg>" alt="Magic Seed"> </div> </div> <p class="page-text">"I need special sunshine seeds," Willow decided. She flew to the wise old oak who gave her two golden seeds. "Plant these with kindness and water them with giggles," instructed the oak.</p> <div class="nav-buttons"> <button class="nav-button prev-button">Previous</button> <button class="nav-button next-button">Next</button> </div> <div class="page-number">3</div> </div> </div> <!-- Page 4 --> <div class="page" id="page4"> <div class="page-decoration decoration-1"></div> <div class="page-decoration decoration-2"></div> <div class="page-content"> <h2 class="page-title">New Friends</h2> <div class="page-illustration"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 400'><rect width='600' height='400' fill='%23F9F9F9' opacity='0'/><path d='M0,350 C100,320 200,370 300,340 C400,310 500,380 600,350 L600,400 L0,400 Z' fill='%236BCB77'/><path d='M150,380 L150,300 L170,300 L170,380 Z' fill='%23A67C52'/><path d='M150,300 C120,250 110,280 130,220 C160,280 180,250 150,300 Z' fill='%2348BEFF'/><path d='M320,380 L320,320 L340,320 L340,380 Z' fill='%23A67C52'/><path d='M330,320 C310,290 300,310 310,260 C330,310 350,290 330,320 Z' fill='%23FF6B6B'/><path d='M450,380 L450,300 L470,300 L470,380 Z' fill='%23A67C52'/><path d='M460,300 C430,250 420,280 440,220 C470,280 490,250 460,300 Z' fill='%23FFD93D'/><circle cx='200' cy='200' r='40' fill='%2348BEFF'/><circle cx='180' cy='190' r='8' fill='%23FFFFFF'/><circle cx='220' cy='190' r='8' fill='%23FFFFFF'/><path d='M190,210 Q200,225 210,210' stroke='%23FFFFFF' stroke-width='3' fill='none'/><circle cx='400' cy='200' r='40' fill='%23FFD93D'/><circle cx='380' cy='190' r='8' fill='%23FFFFFF'/><circle cx='420' cy='190' r='8' fill='%23FFFFFF'/><path d='M390,210 Q400,225 410,210' stroke='%23FFFFFF' stroke-width='3' fill='none'/></svg>" alt="Willow and New Friends"> <div class="popup-element" style="top: 150px; left: 200px; width: 40px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'><path d='M20,0 L24,16 L40,20 L24,24 L20,40 L16,24 L0,20 L16,16 Z' fill='%2348BEFF'/></svg>" alt="Magic Sparkle"> </div> <div class="popup-element" style="top: 150px; right: 200px; width: 40px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 40 40'><path d='M20,0 L24,16 L40,20 L24,24 L20,40 L16,24 L0,20 L16,16 Z' fill='%23FFD93D'/></svg>" alt="Magic Sparkle"> </div> </div> <p class="page-text">Willow planted the seeds and met Dewdrop the water sprite and Sunny the light fairy. "We'll help you!" they said. Together, they sang, danced, and laughed until the seeds began to sparkle.</p> <div class="nav-buttons"> <button class="nav-button prev-button">Previous</button> <button class="nav-button next-button">Next</button> </div> <div class="page-number">4</div> </div> </div> <!-- Page 5 --> <div class="page" id="page5"> <div class="page-decoration decoration-1"></div> <div class="page-decoration decoration-2"></div> <div class="page-content"> <h2 class="page-title">The Awakening</h2> <div class="page-illustration"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 400'><rect width='600' height='400' fill='%23c6e9ff'/><circle cx='500' cy='100' r='60' fill='%23FFD93D'/><path d='M0,350 C100,320 200,370 300,340 C400,310 500,380 600,350 L600,400 L0,400 Z' fill='%236BCB77'/><path d='M150,380 L150,300 L170,300 L170,380 Z' fill='%23A67C52'/><path d='M160,300 C130,250 120,280 140,220 C170,280 190,250 160,300 Z' fill='%236BCB77'/><path d='M150,220 C160,180 180,190 150,150 C120,190 140,180 150,220 Z' fill='%23FF6B6B'/><path d='M250,380 L250,320 L270,320 L270,380 Z' fill='%23A67C52'/><path d='M260,320 C230,270 220,300 240,240 C270,300 290,270 260,320 Z' fill='%236BCB77'/><path d='M260,240 C270,200 290,210 260,170 C230,210 250,200 260,240 Z' fill='%2348BEFF'/><path d='M350,380 L350,280 L370,280 L370,380 Z' fill='%23A67C52'/><path d='M360,280 C330,230 320,260 340,200 C370,260 390,230 360,280 Z' fill='%236BCB77'/><path d='M360,200 C370,160 390,170 360,130 C330,170 350,160 360,200 Z' fill='%23FF6B6B'/><path d='M450,380 L450,300 L470,300 L470,380 Z' fill='%23A67C52'/><path d='M460,300 C430,250 420,280 440,220 C470,280 490,250 460,300 Z' fill='%236BCB77'/><path d='M460,220 C470,180 490,190 460,150 C430,190 450,180 460,220 Z' fill='%23FFD93D'/></svg>" alt="Garden Awaking"> <div class="popup-element" style="top: 180px; left: 150px; width: 30px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 40'><path d='M15,0 L30,30 L15,40 L0,30 Z' fill='%23FF6B6B'/></svg>" alt="Flower"> </div> <div class="popup-element" style="top: 200px; left: 260px; width: 30px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 40'><path d='M15,0 L30,30 L15,40 L0,30 Z' fill='%2348BEFF'/></svg>" alt="Flower"> </div> <div class="popup-element" style="top: 160px; left: 360px; width: 30px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 40'><path d='M15,0 L30,30 L15,40 L0,30 Z' fill='%23FF6B6B'/></svg>" alt="Flower"> </div> <div class="popup-element" style="top: 180px; left: 460px; width: 30px; height: 40px;"> <img src="data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>BlueSky Financials Annual Report 2023</title> <style> :root { --primary-blue: #1a5f9c; --light-blue: #4d94db; --dark-blue: #0d3b66; --gray: #718096; --light-gray: #e2e8f0; --dark-gray: #2d3748; --white: #ffffff; --black: #1a202c; --box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); --transition-speed: 0.5s; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } body { background-color: var(--light-gray); display: flex; justify-content: center; align-items: center; min-height: 700px; overflow: hidden; perspective: 1500px; } .annual-report { width: 660px; height: 660px; position: relative; transform-style: preserve-3d; transition: transform 1.2s cubic-bezier(0.4, 0, 0.2, 1); } .book { position: absolute; width: 100%; height: 100%; transform-style: preserve-3d; transition: transform 1.2s cubic-bezier(0.4, 0, 0.2, 1); } .book-cover { position: absolute; width: 100%; height: 100%; background: linear-gradient(135deg, var(--primary-blue), var(--dark-blue)); border-radius: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; color: var(--white); padding: 40px; backface-visibility: hidden; box-shadow: var(--box-shadow); z-index: 10; transform: translateZ(2px); } .book-cover h1 { font-size: 2.5rem; margin-bottom: 20px; text-align: center; font-weight: 700; letter-spacing: -1px; } .book-cover p { font-size: 1.2rem; text-align: center; opacity: 0.9; margin-bottom: 30px; } .cover-logo { width: 150px; height: 150px; background-color: var(--white); border-radius: 50%; margin-bottom: 30px; display: flex; justify-content: center; align-items: center; color: var(--primary-blue); font-size: 40px; font-weight: bold; } .open-btn { background-color: var(--white); color: var(--primary-blue); border: none; padding: 12px 30px; font-size: 1rem; font-weight: 600; border-radius: 30px; cursor: pointer; box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; margin-top: 30px; } .open-btn:hover { transform: translateY(-3px); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); background-color: rgba(255, 255, 255, 0.9); } .page { position: absolute; width: 100%; height: 100%; background-color: var(--white); border-radius: 5px; padding: 30px; backface-visibility: hidden; transition: transform 1.2s cubic-bezier(0.4, 0, 0.2, 1); overflow: hidden; box-shadow: 0 0 15px rgba(0, 0, 0, 0.1); transform-origin: left center; } .page-content { height: 100%; overflow-y: auto; padding-right: 10px; padding-bottom: 30px; } .page-content::-webkit-scrollbar { width: 6px; } .page-content::-webkit-scrollbar-track { background: var(--light-gray); border-radius: 5px; } .page-content::-webkit-scrollbar-thumb { background: var(--gray); border-radius: 5px; } .page-number { position: absolute; bottom: 15px; right: 30px; color: var(--gray); } .page-header { display: flex; justify-content: space-between; align-items: center; padding-bottom: 15px; margin-bottom: 20px; border-bottom: 1px solid var(--light-gray); } .page-title { font-size: 1.5rem; color: var(--primary-blue); font-weight: 700; } .section-title { font-size: 1.2rem; color: var(--dark-blue); margin: 25px 0 15px; font-weight: 600; } .graph { width: 100%; margin: 20px 0; height: 250px; background-color: var(--light-gray); border-radius: 5px; position: relative; overflow: hidden; } .bar { position: absolute; bottom: 0; width: 12%; background: linear-gradient(to top, var(--primary-blue), var(--light-blue)); border-radius: 5px 5px 0 0; transition: height 1s cubic-bezier(0.4, 0, 0.2, 1); height: 0; } .bar-1 { left: 5%; } .bar-2 { left: 20%; } .bar-3 { left: 35%; } .bar-4 { left: 50%; } .bar-5 { left: 65%; } .bar-6 { left: 80%; } .bar-label { position: absolute; bottom: 10px; font-size: 0.8rem; color: var(--dark-gray); width: 100%; text-align: center; } .bar-value { position: absolute; bottom: 100%; font-size: 0.8rem; font-weight: bold; color: var(--white); width: 100%; text-align: center; padding: 5px 0; } .circle-graph { width: 100%; display: flex; justify-content: space-around; margin: 20px 0; } .circle { width: 120px; height: 120px; position: relative; } .circle-outer { width: 120px; height: 120px; border-radius: 50%; background: conic-gradient(var(--primary-blue) 0%, var(--light-blue) 0); display: flex; justify-content: center; align-items: center; transition: background 1.5s ease; } .circle-inner { width: 90px; height: 90px; border-radius: 50%; background-color: var(--white); display: flex; justify-content: center; align-items: center; font-size: 1.5rem; font-weight: bold; color: var(--primary-blue); } .circle-label { text-align: center; margin-top: 10px; font-size: 0.9rem; color: var(--dark-gray); } .financial-highlights { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; margin: 20px 0; } .highlight-card { background-color: var(--light-gray); padding: 15px; border-radius: 8px; transition: transform 0.3s ease, box-shadow 0.3s ease; } .highlight-card:hover { transform: translateY(-5px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .highlight-value { font-size: 1.8rem; font-weight: bold; color: var(--primary-blue); margin-bottom: 5px; } .highlight-label { font-size: 0.9rem; color: var(--dark-gray); } .nav-buttons { position: absolute; bottom: 15px; left: 50%; transform: translateX(-50%); display: flex; gap: 20px; } .nav-btn { background-color: var(--primary-blue); color: white; border: none; width: 40px; height: 40px; border-radius: 50%; display: flex; justify-content: center; align-items: center; cursor: pointer; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); transition: all 0.3s ease; } .nav-btn:hover { background-color: var(--dark-blue); transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .nav-btn:disabled { background-color: var(--gray); cursor: not-allowed; transform: none; box-shadow: none; } .table-container { width: 100%; overflow-x: auto; margin: 20px 0; } table { width: 100%; border-collapse: collapse; } th, td { padding: 12px 15px; text-align: left; border-bottom: 1px solid var(--light-gray); } th { background-color: var(--primary-blue); color: var(--white); } tr:nth-child(even) { background-color: var(--light-gray); } .key-metrics { display: flex; flex-wrap: wrap; gap: 15px; margin: 20px 0; } .metric-card { flex: 1; min-width: 120px; background: linear-gradient(135deg, var(--primary-blue), var(--light-blue)); padding: 15px; border-radius: 8px; color: var(--white); text-align: center; transition: transform 0.3s ease; } .metric-card:hover { transform: scale(1.05); } .metric-value { font-size: 1.5rem; font-weight: bold; margin-bottom: 5px; } .metric-label { font-size: 0.8rem; opacity: 0.9; } p { margin-bottom: 15px; line-height: 1.6; color: var(--dark-gray); } .animate-in { animation: fadeIn 0.8s ease forwards; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .ceo-message { padding: 15px; background-color: var(--light-gray); border-left: 4px solid var(--primary-blue); margin: 20px 0; position: relative; } .ceo-message::before { content: '"'; font-size: 50px; color: var(--primary-blue); opacity: 0.3; position: absolute; top: 10px; left: 10px; } .ceo-message p { font-style: italic; margin-left: 25px; } .ceo-signature { margin-top: 15px; text-align: right; font-weight: bold; color: var(--dark-blue); } @media (max-width: 700px) { .annual-report { width: 95%; height: 630px; } .book-cover h1 { font-size: 2rem; } .cover-logo { width: 120px; height: 120px; font-size: 30px; } .page { padding: 20px; } .financial-highlights { grid-template-columns: 1fr; } .highlight-value { font-size: 1.5rem; } .circle-graph { flex-direction: column; align-items: center; gap: 20px; } } </style> </head> <body> <div class="annual-report"> <div class="book"> <div class="book-cover"> <div class="cover-logo">BSF</div> <h1>BlueSky Financials</h1> <p>Annual Report 2023</p> <p>Delivering Sustainable Growth and Innovation</p> <button class="open-btn">Open Report</button> </div> <div class="page" id="page1" style="transform: rotateY(-180deg)"> <div class="page-content"> <div class="page-header"> <div class="page-title">Executive Summary</div> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjMWE1ZjljIiBkPSJNOCAwYTggOCAwIDEgMCAwIDE2QTggOCAwIDAgMCA4IDB6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTggMTIuNWEuNS41IDAgMCAxLS41LS41VjhhLjUuNSAwIDAgMSAuNS0uNS41LjUgMCAwIDEgLjUuNXY0YS41LjUgMCAwIDEtLjUuNXpNOCA1LjVBLjUuNSAwIDAgMSA3LjUgNWEuNS41IDAgMCAxIC41LS41LjUuNSAwIDAgMSAuNS41LjUuNSAwIDAgMS0uNS41eiIvPjwvc3ZnPg==" alt="Info" width="30"> </div> <p>In 2023, BlueSky Financials navigated a complex global economic landscape to deliver strong performance across key metrics. Our strategic initiatives in digital transformation and sustainable financing have positioned us favorably within the competitive landscape.</p> <div class="ceo-message"> <p>Despite global economic uncertainties, we've maintained our commitment to innovation and customer-centric solutions, resulting in remarkable growth and shareholder value creation.</p> <div class="ceo-signature">- Sarah Chen, CEO</div> </div> <h2 class="section-title">Financial Highlights</h2> <div class="financial-highlights"> <div class="highlight-card"> <div class="highlight-value">$8.7B</div> <div class="highlight-label">Annual Revenue</div> </div> <div class="highlight-card"> <div class="highlight-value">18.5%</div> <div class="highlight-label">Revenue Growth</div> </div> <div class="highlight-card"> <div class="highlight-value">$2.4B</div> <div class="highlight-label">Operating Income</div> </div> <div class="highlight-card"> <div class="highlight-value">$3.42</div> <div class="highlight-label">Earnings Per Share</div> </div> </div> <h2 class="section-title">Revenue Trend (2018-2023)</h2> <div class="graph" id="revenue-graph"> <div class="bar bar-1" data-height="30"> <div class="bar-label">2018</div> <div class="bar-value">$4.2B</div> </div> <div class="bar bar-2" data-height="42"> <div class="bar-label">2019</div> <div class="bar-value">$5.1B</div> </div> <div class="bar bar-3" data-height="48"> <div class="bar-label">2020</div> <div class="bar-value">$5.8B</div> </div> <div class="bar bar-4" data-height="57"> <div class="bar-label">2021</div> <div class="bar-value">$6.3B</div> </div> <div class="bar bar-5" data-height="68"> <div class="bar-label">2022</div> <div class="bar-value">$7.5B</div> </div> <div class="bar bar-6" data-height="83"> <div class="bar-label">2023</div> <div class="bar-value">$8.7B</div> </div> </div> </div> <div class="page-number">01</div> <div class="nav-buttons"> <button class="nav-btn prev-btn" disabled>←</button> <button class="nav-btn next-btn">→</button> </div> </div> <div class="page" id="page2" style="transform: rotateY(-180deg)"> <div class="page-content"> <div class="page-header"> <div class="page-title">Business Segments</div> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjMWE1ZjljIiBkPSJNOCAwYTggOCAwIDEgMCAwIDE2QTggOCAwIDAgMCA4IDB6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTggMTIuNWEuNS41IDAgMCAxLS41LS41VjhhLjUuNSAwIDAgMSAuNS0uNS41LjUgMCAwIDEgLjUuNXY0YS41LjUgMCAwIDEtLjUuNXpNOCA1LjVBLjUuNSAwIDAgMSA3LjUgNWEuNS41IDAgMCAxIC41LS41LjUuNSAwIDAgMSAuNS41LjUuNSAwIDAgMS0uNS41eiIvPjwvc3ZnPg==" alt="Info" width="30"> </div> <p>Our business segments have each contributed significantly to our overall performance in 2023. Below is a breakdown of revenue distribution across our core segments:</p> <div class="circle-graph"> <div class="circle"> <div class="circle-outer" data-percentage="42"> <div class="circle-inner">42%</div> </div> <div class="circle-label">Corporate Banking</div> </div> <div class="circle"> <div class="circle-outer" data-percentage="31"> <div class="circle-inner">31%</div> </div> <div class="circle-label">Retail Banking</div> </div> <div class="circle"> <div class="circle-outer" data-percentage="27"> <div class="circle-inner">27%</div> </div> <div class="circle-label">Investment Services</div> </div> </div> <h2 class="section-title">Segment Performance</h2> <div class="table-container"> <table> <thead> <tr> <th>Segment</th> <th>Revenue</th> <th>YoY Growth</th> <th>Profit Margin</th> </tr> </thead> <tbody> <tr> <td>Corporate Banking</td> <td>$3.65B</td> <td>16.8%</td> <td>32.4%</td> </tr> <tr> <td>Retail Banking</td> <td>$2.70B</td> <td>21.3%</td> <td>27.9%</td> </tr> <tr> <td>Investment Services</td> <td>$2.35B</td> <td>17.5%</td> <td>35.2%</td> </tr> </tbody> </table> </div> <h2 class="section-title">Segment Highlights</h2> <p><strong>Corporate Banking:</strong> Strategic expansion in emerging markets and tailored ESG financing solutions drove significant growth. Our corporate portfolio now includes over 250 Fortune 500 companies.</p> <p><strong>Retail Banking:</strong> The successful launch of our AI-powered mobile banking platform resulted in a 34% increase in digital transactions and 1.2 million new customer accounts in 2023.</p> <p><strong>Investment Services:</strong> Our wealth management and investment advisory services saw exceptional performance, with assets under management increasing by 22.7% to $142 billion.</p> </div> <div class="page-number">02</div> <div class="nav-buttons"> <button class="nav-btn prev-btn">←</button> <button class="nav-btn next-btn">→</button> </div> </div> <div class="page" id="page3" style="transform: rotateY(-180deg)"> <div class="page-content"> <div class="page-header"> <div class="page-title">Strategic Initiatives & Outlook</div> <img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCAxNiAxNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjMWE1ZjljIiBkPSJNOCAwYTggOCAwIDEgMCAwIDE2QTggOCAwIDAgMCA4IDB6Ii8+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTggMTIuNWEuNS41IDAgMCAxLS41LS41VjhhLjUuNSAwIDAgMSAuNS0uNS41LjUgMCAwIDEgLjUuNXY0YS41LjUgMCAwIDEtLjUuNXpNOCA1LjVBLjUuNSAwIDAgMSA3LjUgNWEuNS41IDAgMCAxIC41LS41LjUuNSAwIDAgMSAuNS41LjUuNSAwIDAgMS0uNS41eiIvPjwvc3ZnPg==" alt="Info" width="30"> </div> <h2 class="section-title">2023 Key Achievements</h2> <div class="key-metrics"> <div class="metric-card"> <div class="metric-value">92%</div> <div class="metric-label">Digital Transaction Processing</div> </div> <div class="metric-card"> <div class="metric-value">$2.8B</div> <div class="metric-label">ESG Financing Portfolio</div> </div> <div class="metric-card"> <div class="metric-value">43%</div> <div class="metric-label">Cost-to-Income Ratio</div> </div> </div> <p>Our strategic focus on digital transformation has yielded significant operational efficiencies, with our cost-to-income ratio improving from 48% in 2022 to 43% in 2023. The implementation of AI-powered analytics has enhanced our risk assessment capabilities and improved customer experience across all touchpoints.</p> <h2 class="section-title">Capital Allocation</h2> <div class="graph" id="capital-graph"> <div class="bar bar-1" data-height="65"> <div class="bar-label">Tech</div> <div class="bar-value">32%</div> </div> <div class="bar bar-2" data-height="45"> <div class="bar-label">M&A</div> <div class="bar-value">24%</div> </div> <div class="bar bar-3" data-height="40"> <div class="bar-label">Dividends</div> <div class="bar-value">18%</div> </div> <div class="bar bar-4" data-height="30"> <div class="bar-label">Share Buyback</div> <div class="bar-value">14%</div> </div> <div class="bar bar-5" data-height="25"> <div class="bar-label">Reserves</div> <div class="bar-value">12%</div> </div> </div> <h2 class="section-title">2024 Outlook</h2> <p>For 2024, we are projecting continued strong performance with:</p> <ul style="margin-left: 20px; margin-bottom: 20px; color: var(--dark-gray);"> <li>Revenue growth of 15-17%</li> <li>EPS growth of 18-20%</li> <li>ROE maintaining above 18%</li> <li>Capital investment of $1.2B in digital infrastructure</li> </ul> <p>We remain focused on our three strategic pillars:</p> <ol style="margin-left: 20px; margin-bottom: 20px; color: var(--dark-gray);"> <li><strong>Digital Acceleration:</strong> Enhancing our digital platforms with next-gen technologies</li> <li><strong>Sustainable Finance:</strong> Expanding our ESG portfolio to $5B by 2025</li> <li><strong>Global Expansion:</strong> Strategic market entries in Southeast Asia and Latin America</li> </ol> </div> <div class="page-number">03</div> <div class="nav-buttons"> <button class="nav-btn prev-btn">←</button> <button class="nav-btn next-btn" disabled>→</button> </div> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { const book = document.querySelector('.book'); const openBtn = document.querySelector('.open-btn'); const prevBtns = document.querySelectorAll('.prev-btn'); const nextBtns = document.querySelectorAll('.next-btn'); const pages = document.querySelectorAll('.page'); let currentPage = 0; const totalPages = pages.length; // Open the book when clicking the open button openBtn.addEventListener('click', function() { book.style.transform = 'rotateY(-180deg)'; setTimeout(() => { animatePageContent(currentPage); animateGraphs(); }, 1200); }); // Navigation between pages prevBtns.forEach(btn => { btn.addEventListener('click', function() { if (currentPage > 0) { navigateToPage(currentPage - 1); } }); }); nextBtns.forEach(btn => { btn.addEventListener('click', function() { if (currentPage < totalPages - 1) { navigateToPage(currentPage + 1); } }); }); // Navigate to a specific page function navigateToPage(pageIndex) { pages[currentPage].style.transform = 'rotateY(-180deg)'; setTimeout(() => { pages[pageIndex].style.transform = 'rotateY(0)'; currentPage = pageIndex; updateNavButtons(); animatePageContent(currentPage); animateGraphs(); }, 600); } // Update navigation buttons state function updateNavButtons() { prevBtns.forEach(btn => { btn.disabled = currentPage === 0; }); nextBtns.forEach(btn => { btn.disabled = currentPage === totalPages - 1; }); } // Animate page content elements function animatePageContent(pageIndex) { const elements = pages[pageIndex].querySelectorAll('h2, p, .highlight-card, .metric-card, .table-container, .circle-graph, .ceo-message'); elements.forEach((el, index) => { setTimeout(() => { el.classList.add('animate-in'); }, 100 * index); }); } // Animate bar graphs function animateGraphs() { // Bar graph animation const bars = document.querySelectorAll('.bar'); bars.forEach(bar => { const height = bar.getAttribute('data-height'); setTimeout(() => { bar.style.height = `${height}%`; }, 300); }); // Circle graph animation const circles = document.querySelectorAll('.circle-outer'); circles.forEach(circle => { const percentage = circle.getAttribute('data-percentage'); setTimeout(() => { circle.style.background = `conic-gradient(var(--primary-blue) ${percentage}%, var(--light-blue) 0%)`; }, 500); }); } // Initialize first page with proper button states updateNavButtons(); }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Lumière Art Gallery Catalog</title> <style> :root { --primary-color: #f5f3ed; --secondary-color: #262321; --accent-color: #9c8b7a; --tertiary-color: #d4cdc4; --shadow-color: rgba(0, 0, 0, 0.2); } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Cormorant Garamond', serif; } body { background-color: var(--primary-color); color: var(--secondary-color); width: 100%; height: 100vh; display: flex; justify-content: center; align-items: center; overflow: hidden; position: relative; } .gallery-container { width: 100%; max-width: 700px; height: 700px; position: relative; perspective: 1500px; overflow: hidden; } .gallery-header { position: absolute; top: 20px; left: 0; width: 100%; z-index: 10; text-align: center; opacity: 0.8; transition: opacity 0.3s ease; } .gallery-header:hover { opacity: 1; } .gallery-title { font-size: 28px; font-weight: 300; letter-spacing: 3px; margin-bottom: 5px; color: var(--secondary-color); } .gallery-subtitle { font-size: 14px; font-weight: 300; letter-spacing: 1px; color: var(--accent-color); } .book { width: 100%; height: 80%; position: absolute; top: 50%; left: 0; transform: translateY(-50%); transform-style: preserve-3d; transition: transform 0.5s ease; } .page { position: absolute; width: 50%; height: 100%; top: 0; transform-origin: left center; transform-style: preserve-3d; transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1.000); background-color: var(--primary-color); box-shadow: 0 0 15px var(--shadow-color); cursor: pointer; overflow: hidden; } .page-front, .page-back { position: absolute; width: 100%; height: 100%; padding: 20px; backface-visibility: hidden; display: flex; flex-direction: column; justify-content: center; align-items: center; } .page-back { transform: rotateY(180deg); } .page-content { position: relative; width: 100%; height: 90%; display: flex; flex-direction: column; justify-content: center; align-items: center; } .artwork-container { position: relative; width: 85%; height: 75%; overflow: hidden; margin-bottom: 15px; box-shadow: 0 5px 15px var(--shadow-color); transition: transform 0.3s ease; } .artwork-container:hover { transform: scale(1.02); } .artwork { width: 100%; height: 100%; object-fit: cover; transition: transform 0.5s ease; } .artwork-info { width: 85%; text-align: center; } .artwork-title { font-size: 18px; font-weight: 500; margin-bottom: 5px; } .artwork-artist { font-size: 14px; font-style: italic; color: var(--accent-color); margin-bottom: 8px; } .artwork-year { font-size: 12px; color: var(--accent-color); } .details-btn { margin-top: 10px; background: none; border: 1px solid var(--accent-color); color: var(--accent-color); padding: 5px 15px; font-size: 12px; cursor: pointer; transition: all 0.3s ease; } .details-btn:hover { background-color: var(--accent-color); color: var(--primary-color); } .flipped { transform: rotateY(-180deg); } .navigation { position: absolute; bottom: 30px; width: 100%; display: flex; justify-content: center; gap: 50px; z-index: 10; } .nav-btn { background: none; border: none; color: var(--accent-color); font-size: 16px; cursor: pointer; transition: transform 0.3s ease, color 0.3s ease; opacity: 0.7; } .nav-btn:hover { transform: scale(1.1); opacity: 1; } .nav-btn:disabled { opacity: 0.3; cursor: not-allowed; } .modal { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(38, 35, 33, 0.9); display: flex; justify-content: center; align-items: center; z-index: 100; opacity: 0; visibility: hidden; transition: opacity 0.3s ease, visibility 0.3s ease; } .modal.active { opacity: 1; visibility: visible; } .modal-content { position: relative; width: 80%; max-width: 600px; max-height: 80%; background-color: var(--primary-color); padding: 30px; overflow-y: auto; transform: translateY(20px); transition: transform 0.4s ease; } .modal.active .modal-content { transform: translateY(0); } .close-btn { position: absolute; top: 15px; right: 15px; background: none; border: none; font-size: 20px; color: var(--accent-color); cursor: pointer; transition: transform 0.3s ease; } .close-btn:hover { transform: rotate(90deg); } .modal-artwork { width: 100%; max-height: 300px; object-fit: contain; margin-bottom: 20px; } .modal-title { font-size: 24px; margin-bottom: 5px; } .modal-artist { font-size: 18px; font-style: italic; color: var(--accent-color); margin-bottom: 15px; } .modal-details { margin-top: 15px; font-size: 14px; line-height: 1.6; } .modal-meta { display: flex; margin: 15px 0; font-size: 14px; } .modal-meta-item { margin-right: 20px; } .modal-meta-label { font-weight: bold; color: var(--accent-color); } .spine { position: absolute; top: 0; left: 50%; height: 100%; width: 4px; background-color: var(--tertiary-color); transform: translateX(-50%); z-index: 5; box-shadow: 0 0 10px var(--shadow-color); } .page-number { position: absolute; bottom: 15px; font-size: 12px; color: var(--accent-color); } .left-page-number { right: 20px; } .right-page-number { left: 20px; } .loading-screen { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--primary-color); display: flex; justify-content: center; align-items: center; z-index: 1000; transition: opacity 0.5s ease, visibility 0.5s ease; } .loader { width: 50px; height: 50px; border: 3px solid var(--tertiary-color); border-top: 3px solid var(--accent-color); border-radius: 50%; animation: spin 1.5s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .page-turn-effect { position: absolute; top: 0; right: 0; width: 0; height: 0; border-style: solid; border-width: 0 0 20px 20px; border-color: transparent transparent var(--tertiary-color) transparent; transition: all 0.3s ease; opacity: 0; } .page:hover .page-turn-effect { opacity: 1; } .cover { background-color: var(--tertiary-color); } .cover .page-content { justify-content: center; text-align: center; } .cover-title { font-size: 32px; font-weight: 300; letter-spacing: 4px; margin-bottom: 20px; } .cover-subtitle { font-size: 18px; font-weight: 300; letter-spacing: 2px; margin-bottom: 30px; color: var(--accent-color); } .cover-img { width: 60%; margin-bottom: 30px; opacity: 0.8; } /* Responsiveness */ @media (max-width: 600px) { .gallery-title { font-size: 22px; } .gallery-subtitle { font-size: 12px; } .artwork-title { font-size: 16px; } .artwork-artist { font-size: 12px; } .modal-content { width: 90%; padding: 20px; } .cover-title { font-size: 24px; } .cover-subtitle { font-size: 14px; } } /* Bookmark effect */ .bookmark { position: absolute; top: -5px; right: 20px; width: 20px; height: 40px; background-color: var(--accent-color); z-index: 2; clip-path: polygon(0 0, 100% 0, 100% 100%, 50% 80%, 0 100%); transition: transform 0.3s ease; } .page:hover .bookmark { transform: translateY(3px); } /* Page flip animation */ @keyframes pageFlip { 0% { transform: rotateY(0deg); } 100% { transform: rotateY(-180deg); } } /* Elegant page border */ .page-border { position: absolute; top: 10px; left: 10px; right: 10px; bottom: 10px; border: 1px solid rgba(156, 139, 122, 0.2); pointer-events: none; } </style> </head> <body> <div class="loading-screen"> <div class="loader"></div> </div> <div class="gallery-container"> <div class="gallery-header"> <h1 class="gallery-title">LUMIÈRE</h1> <p class="gallery-subtitle">Contemporary Masters Collection 2023</p> </div> <div class="spine"></div> <div class="book"> <!-- Cover --> <div class="page cover" id="cover"> <div class="page-front"> <div class="page-content"> <img src="https://images.unsplash.com/photo-1577083552792-a0d545c2d0e6?q=80&w=500&auto=format&fit=crop" alt="Gallery Logo" class="cover-img"> <h1 class="cover-title">LUMIÈRE GALLERY</h1> <h2 class="cover-subtitle">Contemporary Masters Collection</h2> <p style="font-style: italic; margin-top: 20px;">Curated by Isabelle Moreau</p> </div> </div> </div> <!-- Page 1 and 2 --> <div class="page" id="page1"> <div class="page-front"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1577720580849-92fb1960fa1f?q=80&w=500&auto=format&fit=crop" alt="Artwork 1" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Chromatic Resonance</h3> <p class="artwork-artist">Sophia Chen</p> <p class="artwork-year">2022</p> <button class="details-btn" data-id="1">View Details</button> </div> <div class="page-number left-page-number">1</div> <div class="bookmark"></div> <div class="page-border"></div> <div class="page-turn-effect"></div> </div> </div> <div class="page-back"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1561214115-f2f134cc4912?q=80&w=500&auto=format&fit=crop" alt="Artwork 2" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Ethereal Fragments</h3> <p class="artwork-artist">Marcus Reed</p> <p class="artwork-year">2021</p> <button class="details-btn" data-id="2">View Details</button> </div> <div class="page-number right-page-number">2</div> <div class="page-border"></div> </div> </div> </div> <!-- Page 3 and 4 --> <div class="page" id="page2"> <div class="page-front"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1578301978162-7aae4d755744?q=80&w=500&auto=format&fit=crop" alt="Artwork 3" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Velvet Silence</h3> <p class="artwork-artist">Elisa Morin</p> <p class="artwork-year">2023</p> <button class="details-btn" data-id="3">View Details</button> </div> <div class="page-number left-page-number">3</div> <div class="bookmark"></div> <div class="page-border"></div> <div class="page-turn-effect"></div> </div> </div> <div class="page-back"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1549490349-8643362247b5?q=80&w=500&auto=format&fit=crop" alt="Artwork 4" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Prismatic Memory</h3> <p class="artwork-artist">Daniel Kovac</p> <p class="artwork-year">2021</p> <button class="details-btn" data-id="4">View Details</button> </div> <div class="page-number right-page-number">4</div> <div class="page-border"></div> </div> </div> </div> <!-- Page 5 and 6 --> <div class="page" id="page3"> <div class="page-front"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1574182245530-967d9b3831af?q=80&w=500&auto=format&fit=crop" alt="Artwork 5" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Ephemeral Construct</h3> <p class="artwork-artist">Amara Singh</p> <p class="artwork-year">2022</p> <button class="details-btn" data-id="5">View Details</button> </div> <div class="page-number left-page-number">5</div> <div class="bookmark"></div> <div class="page-border"></div> <div class="page-turn-effect"></div> </div> </div> <div class="page-back"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1579541671172-43429ce17aca?q=80&w=500&auto=format&fit=crop" alt="Artwork 6" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Temporal Whisper</h3> <p class="artwork-artist">Julian Ferreira</p> <p class="artwork-year">2023</p> <button class="details-btn" data-id="6">View Details</button> </div> <div class="page-number right-page-number">6</div> <div class="page-border"></div> </div> </div> </div> <!-- Page 7 and 8 --> <div class="page" id="page4"> <div class="page-front"> <div class="page-content"> <div class="artwork-container"> <img src="https://images.unsplash.com/photo-1554188248-986adbb73be4?q=80&w=500&auto=format&fit=crop" alt="Artwork 7" class="artwork"> </div> <div class="artwork-info"> <h3 class="artwork-title">Luminous Solitude</h3> <p class="artwork-artist">Valeria Nuñez</p> <p class="artwork-year">2022</p> <button class="details-btn" data-id="7">View Details</button> </div> <div class="page-number left-page-number">7</div> <div class="bookmark"></div> <div class="page-border"></div> <div class="page-turn-effect"></div> </div> </div> <div class="page-back"> <div class="page-content" style="text-align: center; padding: 40px;"> <h2 style="margin-bottom: 30px; font-weight: 300; letter-spacing: 2px;">VISIT US</h2> <p style="margin-bottom: 20px; line-height: 1.6;">Lumière Gallery<br>23 Rue Saint-Martin<br>75004 Paris, France</p> <p style="margin-bottom: 20px; font-style: italic;">Tuesday - Sunday: 10:00 - 18:00<br>Monday: Closed</p> <p style="margin-top: 40px; font-size: 14px; color: var(--accent-color);">Contact: [email protected]<br>+33 1 42 77 38 24</p> <div style="margin-top: 40px; font-size: 12px;"> <p>All artworks © their respective artists, 2023</p> <p>Catalog design by Lumière Studio</p> </div> <div class="page-number right-page-number">8</div> <div class="page-border"></div> </div> </div> </div> </div> <div class="navigation"> <button class="nav-btn" id="prev-btn" disabled>← Previous</button> <button class="nav-btn" id="next-btn">Next →</button> </div> </div> <div class="modal" id="modal"> <div class="modal-content"> <button class="close-btn" id="close-modal">×</button> <img src="" alt="Artwork Detail" class="modal-artwork" id="modal-img"> <h2 class="modal-title" id="modal-title"></h2> <p class="modal-artist" id="modal-artist"></p> <div class="modal-meta"> <div class="modal-meta-item"> <span class="modal-meta-label">Year:</span> <span id="modal-year"></span> </div> <div class="modal-meta-item"> <span class="modal-meta-label">Medium:</span> <span id="modal-medium"></span> </div> <div class="modal-meta-item"> <span class="modal-meta-label">Dimensions:</span> <span id="modal-dimensions"></span> </div> </div> <div class="modal-details" id="modal-details"></div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Simulate loading setTimeout(() => { document.querySelector('.loading-screen').style.opacity = '0'; setTimeout(() => { document.querySelector('.loading-screen').style.visibility = 'hidden'; }, 500); }, 1500); const pages = document.querySelectorAll('.page'); const prevBtn = document.getElementById('prev-btn'); const nextBtn = document.getElementById('next-btn'); const modal = document.getElementById('modal'); const closeModal = document.getElementById('close-modal'); const detailsBtns = document.querySelectorAll('.details-btn'); let currentPage = 0; const totalPages = pages.length; // Artwork data const artworks = [ { id: 1, title: "Chromatic Resonance", artist: "Sophia Chen", year: "2022", medium: "Oil on canvas", dimensions: "120 × 90 cm", image: "https://images.unsplash.com/photo-1577720580849-92fb1960fa1f?q=80&w=500&auto=format&fit=crop", description: "Sophia Chen's 'Chromatic Resonance' explores the interplay of color and emotion through abstracted landscapes. The dynamic brushwork creates a sense of movement across the canvas, while the saturated palette evokes the sensory experience of memory. Chen's technique of layering transparent colors achieves a luminosity that seems to emit light from within the painting itself." }, { id: 2, title: "Ethereal Fragments", artist: "Marcus Reed", year: "2021", medium: "Mixed media on paper", dimensions: "76 × 102 cm", image: "https://images.unsplash.com/photo-1561214115-f2f134cc4912?q=80&w=500&auto=format&fit=crop", description: "In 'Ethereal Fragments,' Reed deconstructs familiar forms into geometric abstractions that hover between recognition and mystery. This piece is part of his acclaimed 'Disassembly' series, which examines how memory distorts perception over time. The delicate balance of precise linework and atmospheric washes creates a tension that invites prolonged contemplation." }, { id: 3, title: "Velvet Silence", artist: "Elisa Morin", year: "2023", medium: "Acrylic and gold leaf on panel", dimensions: "100 × 100 cm", image: "https://images.unsplash.com/photo-1578301978162-7aae4d755744?q=80&w=500&auto=format&fit=crop", description: "Morin's latest work 'Velvet Silence' continues her exploration of negative space and minimalist composition. The deep, monochromatic surface is interrupted by subtle textural elements and selective use of gold leaf, creating an interplay between absence and presence. The work changes dramatically with shifts in lighting, revealing hidden depths and reflective qualities that transform throughout the day." }, { id: 4, title: "Prismatic Memory", artist: "Daniel Kovac", year: "2021", medium: "Digital print on aluminum", dimensions: "150 × 100 cm", image: "https://images.unsplash.com/photo-1549490349-8643362247b5?q=80&w=500&auto=format&fit=crop", description: "Kovac's 'Prismatic Memory' represents his innovative approach to digital art that challenges traditional boundaries between photography and painting. The piece begins with architectural photography that undergoes extensive algorithmic manipulation. The result is a hypnotic visual field where structure dissolves into pure color and pattern, reflecting Kovac's interest in how digital processes can translate emotional experience." }, { id: 5, title: "Ephemeral Construct", artist: "Amara Singh", year: "2022", medium: "Watercolor and ink on handmade paper", dimensions: "80 × 110 cm", image: "https://images.unsplash.com/photo-1574182245530-967d9b3831af?q=80&w=500&auto=format&fit=crop", description: "Singh's delicate yet powerful 'Ephemeral Construct' reflects her architectural background through its structural elements that seem to float within an undefined space. The careful balance of controlled linework and loose watercolor washes speaks to themes of permanence and impermanence. This work represents part of her exploration of memory as architecture—how we build and inhabit mental spaces." }, { id: 6, title: "Temporal Whisper", artist: "Julian Ferreira", year: "2023", medium: "Oil and wax on linen", dimensions: "140 × 120 cm", image: "https://images.unsplash.com/photo-1579541671172-43429ce17aca?q=80&w=500&auto=format&fit=crop", description: "Ferreira's 'Temporal Whisper' demonstrates his mastery of texture and surface. Multiple layers of oil paint mixed with cold wax medium create a dimensional quality that extends beyond visual perception into the tactile realm. The abstracted forms emerge from and recede into a misty background, evoking the sensation of memories surfacing and dissolving. This work continues Ferreira's meditation on time and perception." }, { id: 7, title: "Luminous Solitude", artist: "Valeria Nuñez", year: "2022", medium: "Photographic print on cotton rag paper", dimensions: "90 × 120 cm", image: "https://images.unsplash.com/photo-1554188248-986adbb73be4?q=80&w=500&auto=format&fit=crop", description: "In 'Luminous Solitude,' Nuñez captures the ethereal quality of light filtering through architectural spaces. This image from her 'Interiority' series explores how physical spaces shape emotional experience. The photograph was taken at dawn in an abandoned modernist building, capturing the moment when natural light transforms ordinary surfaces into transcendent planes of color. Limited to an edition of 7, each print is meticulously produced using archival pigment inks." } ]; // Initialize the book function init() { // Set initial positions // All pages except cover start on the right for(let i = 1; i < pages.length; i++) { pages[i].style.left = '50%'; } // Add event listeners pages.forEach(page => { page.addEventListener('click', function() { if(this !== pages[currentPage]) return; if(this.classList.contains('flipped')) { this.classList.remove('flipped'); prevPage(); } else { this.classList.add('flipped'); nextPage(); } }); }); prevBtn.addEventListener('click', prevPage); nextBtn.addEventListener('click', nextPage); // Detail buttons detailsBtns.forEach(btn => { btn.addEventListener('click', function(e) { e.stopPropagation(); // Prevent triggering page flip const artworkId = parseInt(this.getAttribute('data-id')); openModal(artworkId); }); }); closeModal.addEventListener('click', function() { modal.classList.remove('active'); }); // Close modal when clicking outside content modal.addEventListener('click', function(e) { if(e.target === modal) { modal.classList.remove('active'); } }); // Prevent propagation on modal content document.querySelector('.modal-content').addEventListener('click', function(e) { e.stopPropagation(); }); updateButtons(); } function nextPage() { if(currentPage < totalPages - 1) { pages[currentPage].classList.add('flipped'); currentPage++; updateButtons(); } } function prevPage() { if(currentPage > 0) { pages[currentPage - 1].classList.remove('flipped'); currentPage--; updateButtons(); } } function updateButtons() { prevBtn.disabled = currentPage === 0; nextBtn.disabled = currentPage === totalPages - 1; } function openModal(artworkId) { const artwork = artworks.find(art => art.id === artworkId); if(!artwork) return; document.getElementById('modal-img').src = artwork.image; document.getElementById('modal-title').innerText = artwork.title; document.getElementById('modal-artist').innerText = artwork.artist; document.getElementById('modal-year').innerText = artwork.year; document.getElementById('modal-medium').innerText = artwork.medium; document.getElementById('modal-dimensions').innerText = artwork.dimensions; document.getElementById('modal-details').innerText = artwork.description; modal.classList.add('active'); } // Initialize init(); // Add responsive behavior function handleResize() { const container = document.querySelector('.gallery-container'); const width = container.offsetWidth; const height = container.offsetHeight; // Adjust book size for smaller screens if(width < 500) { document.querySelector('.book').style.width = '90%'; } else { document.querySelector('.book').style.width = '100%'; } } window.addEventListener('resize', handleResize); handleResize(); // Call once on init }); </script> </body> </html>
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Grandma's Secret Recipes</title> <style> @import url('https://fonts.googleapis.com/css2?family=Caveat:wght@400;700&family=Merriweather:wght@300;400;700&display=swap'); :root { --main-bg: #f8f3e9; --book-cover: #8c6e4a; --book-page: #fff9ee; --ink: #3a3228; --accent-light: #e9c09f; --accent-dark: #5e4532; --shadow: rgba(0, 0, 0, 0.15); --highlight: #ff9a3c; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Merriweather', serif; background-color: var(--main-bg); color: var(--ink); display: flex; justify-content: center; align-items: center; min-height: 700px; overflow: hidden; width: 100%; background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%23cbb595' fill-opacity='0.2' fill-rule='evenodd'/%3E%3C/svg%3E"); } .book-container { width: 85%; height: 600px; max-width: 700px; max-height: 650px; perspective: 2000px; margin: 20px auto; position: relative; } .book { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s cubic-bezier(0.645, 0.045, 0.355, 1); } .page { position: absolute; width: 100%; height: 100%; top: 0; left: 0; background: var(--book-page); transform-origin: left center; transform-style: preserve-3d; transition: transform 0.7s cubic-bezier(0.645, 0.045, 0.355, 1), box-shadow 0.5s ease; border-radius: 0 8px 8px 0; box-shadow: 5px 5px 20px var(--shadow); padding: 20px 30px; overflow: hidden; display: flex; flex-direction: column; } .page::before { content: ''; position: absolute; height: 100%; width: 4px; left: 0; top: 0; background: linear-gradient(to right, var(--accent-dark), var(--book-page)); } .page::after { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5z' fill='%23d9cdbf' fill-opacity='0.1' fill-rule='evenodd'/%3E%3C/svg%3E"); pointer-events: none; z-index: 1; } .cover { background: var(--book-cover); border-radius: 8px; display: flex; flex-direction: column; justify-content: center; align-items: center; z-index: 1; } .cover::before { content: none; } .cover::after { content: ''; position: absolute; width: 100%; height: 100%; top: 0; left: 0; background-image: url("data:image/svg+xml,%3Csvg width='80' height='80' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5z' fill='%235e4532' fill-opacity='0.3' fill-rule='evenodd'/%3E%3C/svg%3E"); border-radius: 8px; opacity: 0.3; } .cover h1 { color: #fff; font-family: 'Caveat', cursive; font-size: 42px; text-align: center; margin-bottom: 20px; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); position: relative; z-index: 2; } .cover p { color: #fff9ee; font-family: 'Merriweather', serif; font-size: 18px; font-weight: 300; text-align: center; max-width: 80%; position: relative; z-index: 2; } .cover-img { width: 120px; height: 120px; margin-bottom: 20px; background: var(--accent-light); border-radius: 50%; display: flex; justify-content: center; align-items: center; box-shadow: 0 4px 8px rgba(0,0,0,0.15); position: relative; z-index: 2; } .cover-img svg { width: 70px; height: 70px; fill: var(--book-cover); } .page-content { position: relative; z-index: 2; height: 100%; display: flex; flex-direction: column; } .page-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; border-bottom: 2px dashed var(--accent-dark); padding-bottom: 10px; } .page-number { font-family: 'Caveat', cursive; color: var(--accent-dark); font-size: 20px; } .page h2 { font-family: 'Caveat', cursive; color: var(--accent-dark); font-size: 32px; margin-bottom: 15px; border-bottom: 1px solid var(--accent-light); padding-bottom: 5px; position: relative; } .ingredients { margin-bottom: 20px; position: relative; } .ingredient-title { font-family: 'Caveat', cursive; font-size: 24px; color: var(--accent-dark); margin-bottom: 10px; display: flex; align-items: center; } .ingredient-title::before { content: "✽"; margin-right: 8px; color: var(--highlight); } .ingredients ul { list-style-type: none; padding-left: 15px; } .ingredients li { font-family: 'Merriweather', serif; font-size: 15px; margin-bottom: 8px; position: relative; padding-left: 20px; } .ingredients li::before { content: "•"; position: absolute; left: 0; color: var(--highlight); font-size: 20px; top: -5px; } .hotspot { cursor: pointer; text-decoration: underline; text-decoration-style: dotted; text-decoration-color: var(--highlight); color: var(--accent-dark); font-weight: bold; position: relative; display: inline-block; transition: color 0.3s; } .hotspot:hover { color: var(--highlight); } .tooltip { position: absolute; background: var(--accent-light); color: var(--ink); padding: 10px 15px; border-radius: 5px; font-size: 14px; font-family: 'Caveat', cursive; width: 180px; box-shadow: 0 5px 15px rgba(0,0,0,0.1); pointer-events: none; opacity: 0; transform: translateY(10px); transition: opacity 0.3s, transform 0.3s; z-index: 10; bottom: 100%; left: 50%; margin-left: -90px; margin-bottom: 10px; } .tooltip::after { content: ""; position: absolute; top: 100%; left: 50%; margin-left: -8px; border-width: 8px; border-style: solid; border-color: var(--accent-light) transparent transparent transparent; } .hotspot:hover .tooltip { opacity: 1; transform: translateY(0); } .instructions { flex: 1; overflow-y: auto; padding-right: 10px; } .instructions::-webkit-scrollbar { width: 6px; } .instructions::-webkit-scrollbar-track { background: var(--book-page); } .instructions::-webkit-scrollbar-thumb { background: var(--accent-light); border-radius: 3px; } .instruction-title { font-family: 'Caveat', cursive; font-size: 24px; color: var(--accent-dark); margin-bottom: 10px; display: flex; align-items: center; } .instruction-title::before { content: "✽"; margin-right: 8px; color: var(--highlight); } .instructions ol { padding-left: 15px; counter-reset: step-counter; } .instructions li { font-family: 'Merriweather', serif; font-size: 15px; margin-bottom: 15px; position: relative; padding-left: 30px; counter-increment: step-counter; } .instructions li::before { content: counter(step-counter); position: absolute; left: 0; top: 0; font-family: 'Caveat', cursive; font-size: 18px; width: 25px; height: 25px; background: var(--highlight); color: white; display: flex; align-items: center; justify-content: center; border-radius: 50%; } .note { font-family: 'Caveat', cursive; background: #fefadd; padding: 15px; border: 1px solid var(--accent-light); border-radius: 5px; margin-top: 20px; position: relative; transform: rotate(-1deg); box-shadow: 3px 3px 5px rgba(0,0,0,0.05); } .note::before { content: ''; position: absolute; top: -10px; left: 50%; transform: translateX(-50%); width: 40px; height: 30px; background: repeating-linear-gradient(90deg, var(--accent-light), var(--accent-light) 2px, transparent 2px, transparent 5px); opacity: 0.5; } .bookmark { position: absolute; width: 40px; height: 80px; background: var(--highlight); top: -5px; right: 20px; border-radius: 0 0 5px 5px; box-shadow: 0 5px 10px rgba(0,0,0,0.1); display: flex; justify-content: center; align-items: center; color: white; font-family: 'Caveat', cursive; font-size: 18px; z-index: 0; transition: transform 0.3s; cursor: pointer; } .bookmark:hover { transform: translateY(5px); } .page-controls { position: absolute; bottom: 20px; left: 0; width: 100%; display: flex; justify-content: space-between; padding: 0 20px; z-index: 100; } .btn { background: var(--accent-dark); color: white; border: none; padding: 10px 20px; border-radius: 25px; cursor: pointer; font-family: 'Merriweather', serif; font-size: 14px; transition: all 0.3s; box-shadow: 0 4px 8px rgba(0,0,0,0.1); } .btn:hover { background: var(--highlight); transform: translateY(-2px); box-shadow: 0 6px 12px rgba(0,0,0,0.15); } .btn:disabled { background: #c9bbaa; cursor: not-allowed; transform: none; box-shadow: none; } .flip { transform: rotateY(-180deg); } .backface { transform: rotateY(180deg); } .sketch { position: absolute; bottom: 20px; right: 20px; width: 120px; transform: rotate(5deg); opacity: 0.8; } .coffee-stain { position: absolute; width: 60px; height: 60px; border-radius: 50%; background: rgba(156, 109, 72, 0.15); top: 40px; right: 30px; transform: rotate(-5deg) scale(1.3, 1); } @media (max-width: 600px) { .book-container { width: 95%; height: 550px; } .page { padding: 15px 20px; } .cover h1 { font-size: 32px; } .cover p { font-size: 16px; } .page h2 { font-size: 28px; } .ingredients li, .instructions li { font-size: 14px; } .bookmark { width: 30px; height: 60px; } .btn { padding: 8px 15px; font-size: 12px; } } /* Animation for adding a hand-written effect */ @keyframes writing { 0% { width: 0; } 100% { width: 100%; } } .hand-written { display: inline-block; position: relative; color: transparent; } .hand-written::before { content: attr(data-text); position: absolute; top: 0; left: 0; width: 0; color: var(--ink); overflow: hidden; white-space: nowrap; animation: writing 2s forwards; animation-delay: var(--delay, 0s); } </style> </head> <body> <div class="book-container"> <div class="book" id="book"> <!-- Cover --> <div class="page cover" id="cover"> <div class="cover-img"> <svg viewBox="0 0 512 512"> <path d="M458.622,255.92l0-.122,0-.123a24.975,24.975,0,0,0-6.739-17.542l0-.006a25.152,25.152,0,0,0-18.207-7.761h-.246l-15.336.19-41.354-49.204c3.654-6.11,6.462-9.979,6.462-19.285V72a8,8,0,0,0-8-8h-304a8,8,0,0,0-8,8V162.069c0,9.309,2.814,13.181,6.481,19.3l-4.071,4.87-37.05,44.335L13.367,230.4c-.106,0-.213,0-.318,0a25.017,25.017,0,0,0-6.481,49.345l.127.03.126.034a24.57,24.57,0,0,0,6.546.886,25.2,25.2,0,0,0,18.09-7.639h.006a24.957,24.957,0,0,0,7.08-17.684l15.424-.191.337-.38,45.5-54.323a52.2,52.2,0,0,0,6.3-9.698,51.657,51.657,0,0,0,8.708,11.964L406.323,417.258h0a19.828,19.828,0,0,0,14.2,5.742h0a19.829,19.829,0,0,0,14.194-33.314h0L164.827,198.77a27.548,27.548,0,0,1-.227-38.869l0,0a27.549,27.549,0,0,1,38.87-.222L473.359,428.686h0a19.828,19.828,0,0,0,14.192,5.742h0a19.83,19.83,0,0,0,14.2-33.314L346.073,239.353l41.738.518h.219a24.585,24.585,0,0,0,6.615-.911,25.018,25.018,0,0,0,13.977-33.04ZM97.051,226,79.81,90h38.7a40.155,40.155,0,0,0-4.345,18.069v115.06c0,1-.052,1.882-.1,2.869ZM145.82,80.6a24.071,24.071,0,0,1,17.005-7.039h0a24.072,24.072,0,0,1,17,7.039L263.83,170.39l-34.756.431L168.047,107.33a8,8,0,0,0-11.294,11.34l48.974,48.759-34.428.426-36.9-36.9a8,8,0,1,0-11.314,11.313l25.165,25.165h-19.16a23.979,23.979,0,0,1-16.976-41.834h-.008Z"/> </svg> </div> <h1>Grandma's Secret Recipes</h1> <p>A collection of treasured family recipes passed down through generations</p> </div> <!-- Page 1 --> <div class="page" id="page1"> <div class="page-content"> <div class="page-header"> <span class="hand-written" data-text="Comfort Food Classics" style="--delay: 0.5s">Comfort Food Classics</span> <span class="page-number">1</span> </div> <h2>Classic Apple Pie</h2> <div class="coffee-stain"></div> <div class="ingredients"> <h3 class="ingredient-title">Ingredients</h3> <ul> <li>6-7 medium <span class="hotspot">Granny Smith apples<span class="tooltip">Tart apples hold their shape best when baked. Honeycrisp works well too!</span></span>, peeled and sliced</li> <li>¾ cup <span class="hotspot">granulated sugar<span class="tooltip">Reduce to ½ cup if apples are sweet varieties</span></span></li> <li>2 tablespoons all-purpose flour</li> <li>1 tablespoon <span class="hotspot">fresh lemon juice<span class="tooltip">Prevents apples from browning and adds brightness</span></span></li> <li>1 teaspoon ground cinnamon</li> <li>¼ teaspoon ground nutmeg</li> <li>2 <span class="hotspot">homemade pie crusts<span class="tooltip">See page 4 for my foolproof pie crust recipe!</span></span></li> <li>2 tablespoons butter, cut into small pieces</li> <li>1 egg beaten with 1 tablespoon water (for egg wash)</li> </ul> </div> <div class="instructions"> <h3 class="instruction-title">Instructions</h3> <ol> <li>Preheat oven to 425°F. Place one pie crust in a 9-inch pie plate.</li> <li>In a large bowl, combine apples, sugar, flour, lemon juice, cinnamon, and nutmeg. Toss gently until apples are well coated.</li> <li>Pour apple mixture into pie crust. Dot with butter pieces.</li> <li>Place second crust on top. <span class="hotspot">Crimp edges<span class="tooltip">Press your thumb and index finger together, then use knuckle of other hand to push dough between them</span></span> to seal. Cut several slits in top crust to allow steam to escape.</li> <li>Brush top with egg wash and sprinkle with a little sugar.</li> <li>Bake at 425°F for 15 minutes, then <span class="hotspot">reduce temperature<span class="tooltip">This prevents crust from burning while ensuring the filling cooks through</span></span> to 350°F and bake for 40-45 minutes more.</li> <li>Allow to cool at least 2 hours before serving.</li> </ol> <div class="note">Grandma's tip: For extra-crispy bottom crust, brush with egg white before adding filling and place pie on preheated baking sheet!</div> </div> </div> <div class="bookmark">1</div> </div> <!-- Page 2 --> <div class="page" id="page2"> <div class="page-content"> <div class="page-header"> <span class="hand-written" data-text="Sunday Suppers" style="--delay: 0.5s">Sunday Suppers</span> <span class="page-number">2</span> </div> <h2>Pot Roast with Root Vegetables</h2> <div class="ingredients"> <h3 class="ingredient-title">Ingredients</h3> <ul> <li>1 (3-4 pound) <span class="hotspot">chuck roast<span class="tooltip">Look for marbling - the fat creates tenderness during slow cooking</span></span></li> <li>2 tablespoons vegetable oil</li> <li>2 teaspoons kosher salt</li> <li>1 teaspoon black pepper</li> <li>2 large onions, quartered</li> <li>4 carrots, cut into 2-inch pieces</li> <li>3 celery stalks, cut into 2-inch pieces</li> <li>4 medium <span class="hotspot">Yukon Gold potatoes<span class="tooltip">Keeps their shape better than russets when slow-cooked</span></span>, quartered</li> <li>3 cloves garlic, minced</li> <li>2 cups <span class="hotspot">beef broth<span class="tooltip">Homemade beef stock makes all the difference if you have it!</span></span></li> <li>1 cup dry red wine (optional)</li> <li>2 bay leaves</li> <li>2 sprigs fresh rosemary</li> <li>2 tablespoons tomato paste</li> </ul> </div> <div class="instructions"> <h3 class="instruction-title">Instructions</h3> <ol> <li>Preheat oven to 325°F. <span class="hotspot">Pat roast dry<span class="tooltip">Essential for a good sear - moisture is the enemy of browning!</span></span> with paper towels. Season with salt and pepper.</li> <li>Heat oil in a large Dutch oven over medium-high heat. Brown roast on all sides, about 3-4 minutes per side. Transfer to a plate.</li> <li>Add onions, carrots, and celery to the pot. Cook until vegetables begin to brown, about 5 minutes.</li> <li>Add garlic and tomato paste; cook for 1 minute, stirring constantly.</li> <li>Pour in beef broth and wine (if using), scraping up <span class="hotspot">browned bits<span class="tooltip">These caramelized bits (fond) contain tons of flavor</span></span> from bottom of pot.</li> <li>Return roast to pot. Add bay leaves and rosemary. Liquid should come about halfway up the roast.</li> <li>Cover and transfer to oven. Cook for 3 hours, adding potatoes during the last hour.</li> <li>Remove from oven when meat is <span class="hotspot">fork-tender<span class="tooltip">Should shred easily when pulled with a fork</span></span>.</li> <li>Let rest for 15 minutes before slicing. Serve with vegetables and strained cooking liquid.</li> </ol> <div class="note">This roast is even better the next day! Make it ahead and reheat gently with a splash of broth.</div> </div> <div class="bookmark">2</div> <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMDAgMjAwIj48cGF0aCBkPSJNMTQyLjUgMTcwLjhjLTIyLjQtMTcuNy00MC43LTUuNS00Mi41LTQuMi0xLjgtMS4zLTIwLjEtMTMuNS00Mi41IDQuMmExMi4zIDEyLjMgMCAwIDEtMjAuMi05LjQgNjIuNiA2Mi42IDAgMCAxIDE4LjMtNDQuNGMxOC4yLTE4LjEgMjcuNC0xOS4xIDM2LjYtOC40IDIuMiAyLjYgNC41IDQgNy44IDQgMy4zIDAgNS42LTEuNCA3LjgtNCAxLjgtMi4xIDMuNy0zLjUgNS43LTQuMiA5LjgtMy41IDIwLjEgMS4yIDMwLjkgMTIuNmE2Mi42IDYyLjYgMCAwIDEgMTguMyA0NC40IDEyLjMgMTIuMyAwIDAgMS0yMC4yIDkuNCIgc3R5bGU9ImZpbGw6I2QyYjI4Nztvcz0wO3NvOjA7c3Q6MDsiLz48cGF0aCBkPSJNMTM3LjMgODYuOWMtMyAxLjEtNS43IDIuOS04IDUuNS00LjMgNS4xLTkuNiA4LTE1LjQgOC01LjggMC0xMS4xLTIuOS0xNS40LTgtMTUuNi0xOC4zLTM0LjUgMy40LTYyLjIgNDAuNWE3Ny44IDc3LjggMCAwIDAgLTEzIDM0LjNjLS4xIDYuMyA0LjggMTEuNCAxMSAxMS40IDMuMyAwIDYuMy0xLjUgOC4z
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Historical Archive Viewer</title> <style> @import url('https://fonts.googleapis.com/css2?family=IM+Fell+English:ital@0;1&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap'); :root { --sepia-dark: #704214; --sepia-medium: #b49164; --sepia-light: #e0cfb1; --sepia-lighter: #f5ecd9; --paper-texture: url('data:image/png;base64,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'); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Libre Baskerville', serif; background-color: #2c2416; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAEPklEQVRoQ92aW5ImIQyG/aeV96lr5mFOsHPGE8wcYU6gc4RxnB57WjOvs671Bv+iqCJQQCEBhKLaXd1tC/LlTwJJ9w3+kHF7e/sdAL6z3wDwked1c3Pzs+T7pn+85Prc9y4vLy3btJ8B4OLi4kvJupL3Ln4PXiyRm2S+4vG4wvGxxvE5B+Tx/vW2wvFpTZqZpmmTYkpA3hHAe6iI56N1OoDH5xaPTy2Ox1UAaMF3OXi8r3F8XOFwXONwWGPbHnA8HnA8HrFtD2w2O6zbLdbrLdYrO9bhsNlhvdrj4+Mj9O8rAOTCeYIDAJarc7x8TnEATjDeWKzOsVjs0HdbdLtGjfV6j/Vqj9Vyj+Vij8Vij/l8j/l8n7rBsVge0LUNuq5G19fouxp936DrG3R9E9axPZutx/m8w/m8R99vsJrvMJ/vMJ9tsZhtMZttsN/v8fb2NgKzz5WIAsFBIBA5EDQIAkEhCAQFIRirzRbr9TYJ5HA44OHhIVeiL0sgAYJCEAgKQSAoBAWRArHZrLFebTCbrTGbrTCbLTGbLnA2neNsOsf5bIHz8wUOhwPu7+9zZfo1AIwBZFIQCApBIAgEgaAQBIJCUIhciW42K6xWSwZxNp3h7JzNs7MZzs/OcX5+hhAgd3d3ORB/AcA0BkGlQSEIBIUgEASCQhAICkEgKESuRDebJZbLBRaLOeazGeazaRLE+Xk/BnF7e5sD8RMAXEQADC5XIg0KQSAIBIEgEASCQIwhcmvGbrfEcrHAfD7DbDbFbDrB2XSCM/+cns1xfn6WAnFzc1MC8T0AfJkTiFCJCASBIBAEIgUil0Y3mzkWiylmZ2c4O5tgOvXPBMKvU8/Pz1MgXl9fS5XoKwD4OgfAGNYxkBiEVI02mxkWiwnmszGIs7MTTKdTTKenODs7xXQyxWQyHYN4eXkpgfgGAL6TAJCzGasalUDEQOTWjJfnZzw/P+ZAfA8AP5YAMJcYh8iBCNVoAJEDQSD8k0CEnQiBMBCvr6+Y9PtciX4AgJ9yAMZqRgwkVqJ9FKSE4Tl0Ij/PP+Hp6UkC8SMA/JIDYAzrUhBaJ0Ig4jQaa1HTNGjbFk3ToGka1M4NnrquQ9M2qOsadd2M5qau0XUtmqYfdd2grmu0Ta+2TdNgMpng8fExB+IRALR5MQQipVQxiLhuDNPo09MTHh4eSiB+A4Df5ynlupiUPgWiabsAoZWIQHhnoHXC9RxDD7r2DnXdoXYdaue94R7n3wBge+4B1N7z0HboXIfOdeid/9m7Dk3doXbev+tch9Y516P1Pmrboe1adK5D27ZomgZN26BuGtR1g7qu0TT+3KBtWjRNA+c9YZxn+LprMZlM4pboTwD4Ky6REWZCsUZKFKnRsU6kQPz9999agf4DgH/mKdVKnwIRp1GpWP8GgP/08yFiH6TRuD5o6dPXjH8B4L88gGRf5JNq0jN9zTDN3P8B+xhzUNK7xSYAAAAASUVORK5CYII='); color: var(--sepia-dark); min-height: 700px; width: 100%; display: flex; justify-content: center; align-items: center; overflow: hidden; } .archive-viewer { width: 90%; max-width: 650px; height: 600px; position: relative; perspective: 2000px; margin: 0 auto; } .book { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.5s; } .book-cover { position: absolute; width: 100%; height: 100%; z-index: 100; border-radius: 5px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.4); transform-style: preserve-3d; transform-origin: left; background-color: #5a3921; display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; padding: 30px; color: goldenrod; border: 10px solid #3c2613; background-image: url('data:image/png;base64,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'); background-repeat: repeat; transition: transform 1s cubic-bezier(0.645, 0.045, 0.355, 1.000); } .book-cover.open { transform: rotateY(-180deg); } .cover-content { backface-visibility: hidden; } .book-title { font-family: 'IM Fell English', serif; font-size: 2.2rem; font-weight: 700; margin-bottom: 1.5rem; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8); letter-spacing: 1px; } .book-subtitle { font-family: 'Libre Baskerville', serif; font-size: 1.2rem; font-style: italic; margin-bottom: 2rem; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); } .open-book { display: inline-block; padding: 10px 20px; background-color: rgba(112, 66, 20, 0.6); color: var(--sepia-lighter); border: 2px solid goldenrod; border-radius: 4px; font-family: 'Libre Baskerville', serif; font-size: 1rem; cursor: pointer; transition: all 0.3s ease; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); } .open-book:hover { background-color: rgba(112, 66, 20, 0.8); transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4); } .book-pages { position: absolute; width: 100%; height: 100%; overflow: hidden; border-radius: 3px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); display: flex; } .book-page { position: absolute; width: 50%; height: 100%; top: 0; padding: 30px; background-color: var(--sepia-lighter); background-image: var(--paper-texture); transform-origin: left; transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1.000); overflow: hidden; z-index: 1; display: flex; flex-direction: column; justify-content: space-between; backface-visibility: hidden; box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.1); } .book-page::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: linear-gradient(to right, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0) 10%); z-index: -1; } .book-page.right-page { left: 50%; transform-origin: left; } .book-page.right-page.turn { transform: rotateY(-180deg); z-index: 2; } .page-content { position: relative; height: 100%; overflow-y: auto; padding-right: 10px; scrollbar-width: thin; scrollbar-color: var(--sepia-medium) var(--sepia-lighter); } .page-content::-webkit-scrollbar { width: 6px; } .page-content::-webkit-scrollbar-track { background: var(--sepia-lighter); } .page-content::-webkit-scrollbar-thumb { background-color: var(--sepia-medium); border-radius: 3px; } .page-content h1 { font-family: 'IM Fell English', serif; font-size: 1.5rem; color: var(--sepia-dark); margin-bottom: 1rem; border-bottom: 1px solid var(--sepia-medium); padding-bottom: 0.5rem; } .page-content h2 { font-family: 'IM Fell English', serif; font-size: 1.2rem; color: var(--sepia-dark); margin-top: 1rem; margin-bottom: 0.5rem; } .page-content p { margin-bottom: 1rem; text-align: justify; line-height: 1.6; font-size: 0.95rem; color: var(--sepia-dark); text-indent: 1.5rem; } .page-content img { max-width: 100%; height: auto; margin: 1rem 0; border: 1px solid var(--sepia-medium); filter: sepia(30%); } .page-content .signature { font-family: 'IM Fell English', serif; font-style: italic; text-align: right; margin-top: 2rem; } .page-content .date { font-family: 'IM Fell English', serif; font-size: 0.9rem; color: var(--se
<html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Horizon Planner</title> <style> :root { --primary: #a3d5e0; --secondary: #faedcd; --accent: #f6bd60; --dark: #6c757d; --light: #f8f9fa; --shadow: rgba(0, 0, 0, 0.1); --text: #495057; --success: #c1d3b8; } * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', 'Helvetica Neue', sans-serif; } body { background-color: #f5f5f5; display: flex; justify-content: center; align-items: center; min-height: 100vh; color: var(--text); overflow: hidden; } .planner-container { width: 700px; height: 700px; display: flex; justify-content: center; align-items: center; perspective: 2000px; } .planner { width: 640px; height: 600px; position: relative; transform-style: preserve-3d; transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1.000); } .cover, .back-cover { width: 100%; height: 100%; position: absolute; top: 0; left: 0; background: var(--primary); border-radius: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center; box-shadow: 0 15px 25px var(--shadow); transform-style: preserve-3d; backface-visibility: hidden; overflow: hidden; } .cover { background: linear-gradient(145deg, var(--primary), #8ec5d5); transform: rotateY(0deg); z-index: 10; } .cover.flipped, .page.flipped { transform: rotateY(-180deg); } .cover-design { background: rgba(255, 255, 255, 0.15); width: 90%; height: 90%; border-radius: 8px; display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 20px; position: relative; overflow: hidden; } .cover-design::before { content: ''; position: absolute; width: 200px; height: 200px; background: rgba(255, 255, 255, 0.1); border-radius: 50%; top: -100px; right: -100px; } .cover-design::after { content: ''; position: absolute; width: 150px; height: 150px; background: rgba(255, 255, 255, 0.1); border-radius: 50%; bottom: -50px; left: -50px; } .cover h1 { font-size: 3rem; font-weight: 700; margin-bottom: 0.5rem; color: white; text-shadow: 2px 2px 3px rgba(0, 0, 0, 0.1); z-index: 1; } .cover p { font-size: 1.2rem; color: white; text-align: center; max-width: 80%; margin-bottom: 2rem; z-index: 1; } .cover-btn { background: white; color: var(--primary); font-weight: 600; border: none; padding: 12px 24px; border-radius: 25px; cursor: pointer; font-size: 1rem; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); z-index: 1; } .cover-btn:hover { transform: translateY(-3px); box-shadow: 0 7px 20px rgba(0, 0, 0, 0.15); } .back-cover { background: linear-gradient(145deg, #8ec5d5, var(--primary)); transform: rotateY(180deg); } .back-cover-content { text-align: center; color: white; width: 80%; } .back-cover-content h2 { margin-bottom: 1rem; font-size: 2rem; } .back-cover-content p { margin-bottom: 2rem; line-height: 1.6; } .social-icons { display: flex; gap: 15px; margin-top: 20px; } .social-icon { width: 40px; height: 40px; background: rgba(255, 255, 255, 0.2); border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; cursor: pointer; } .social-icon:hover { background: rgba(255, 255, 255, 0.4); transform: translateY(-3px); } .planner-inner { width: 100%; height: 100%; position: relative; transform: translateZ(-1px); } .page { width: 100%; height: 100%; position: absolute; top: 0; left: 0; background: white; border-radius: 10px; display: flex; flex-direction: column; box-shadow: 0 5px 15px var(--shadow); transform-origin: left center; transition: transform 0.8s cubic-bezier(0.645, 0.045, 0.355, 1.000); padding: 30px; overflow: hidden; backface-visibility: hidden; } .page-right { transform: rotateY(180deg); transform-origin: right center; z-index: 5; } .month-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; position: relative; } .month-header h2 { font-size: 2rem; font-weight: 700; color: var(--dark); } .month-nav { display: flex; gap: 10px; } .nav-btn { background: transparent; border: none; cursor: pointer; font-size: 1.2rem; color: var(--dark); width: 40px; height: 40px; border-radius: 50%; display: flex; align-items: center; justify-content: center; transition: all 0.3s ease; } .nav-btn:hover { background: var(--secondary); color: var(--dark); } .calendar { display: grid; grid-template-columns: repeat(7, 1fr); gap: 10px; margin-bottom: 20px; } .weekday { text-align: center; font-weight: 600; font-size: 0.9rem; color: var(--dark); padding: 5px 0; } .day { aspect-ratio: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-start; border-radius: 8px; padding: 5px; cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; } .day:hover { background: var(--secondary); transform: translateY(-2px); } .day.active { background: var(--primary); color: white; } .day.today { border: 2px solid var(--accent); } .day.other-month { color: #ccc; } .day-number { font-weight: 600; margin-bottom: 5px; } .day-event-indicator { width: 6px; height: 6px; background: var(--accent); border-radius: 50%; margin-top: 2px; } .notes-section { flex-grow: 1; display: flex; flex-direction: column; } .notes-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .notes-list { flex-grow: 1; overflow-y: auto; padding-right: 10px; } .notes-list::-webkit-scrollbar { width: 5px; } .notes-list::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 10px; } .notes-list::-webkit-scrollbar-thumb { background: var(--primary); border-radius: 10px; } .note-item { background: var(--light); padding: 12px 15px; border-radius: 8px; margin-bottom: 10px; display: flex; justify-content: space-between; align-items: flex-start; transition: all 0.3s ease; } .note-item:hover { transform: translateX(5px); box-shadow: 0 2px 8px var(--shadow); } .note-text { flex-grow: 1; font-size: 0.95rem; } .note-delete { background: none; border: none; color: var(--dark); cursor: pointer; font-size: 1rem; opacity: 0.7; transition: all 0.2s ease; } .note-delete:hover { opacity: 1; color: #dc3545; } .note-input-container { display: flex; gap: 10px; margin-top: 15px; } .note-input { flex-grow: 1; padding: 12px 15px; border: 1px solid #ddd; border-radius: 25px; font-size: 0.95rem; outline: none; transition: all 0.3s ease; } .note-input:focus { border-color: var(--primary); box-shadow: 0 0 0 2px rgba(163, 213, 224, 0.3); } .add-note-btn { background: var(--primary); color: white; border: none; border-radius: 25px; padding: 0 20px; cursor: pointer; font-weight: 600; transition: all 0.3s ease; } .add-note-btn:hover { background: #8ec5d5; } .corner-fold { position: absolute; bottom: 0; right: 0; width: 0; height: 0; border-style: solid; border-width: 0 0 30px 30px; border-color: transparent transparent var(--secondary) transparent; cursor: pointer; transition: all 0.3s ease; } .corner-fold:hover { border-width: 0 0 40px 40px; } .page-number { position: absolute; bottom: 10px; left: 50%; transform: translateX(-50%); font-size: 0.8rem; color: var(--dark); opacity: 0.7; } .page-decoration { position: absolute; top: 0; right: 0; width: 200px; height: 200px; background: rgba(163, 213, 224, 0.05); border-radius: 0 0 0 100%; z-index: -1; } @media (max-width: 700px) { .planner { width: 100%; height: 90vh; max-height: 600px; } .cover h1 { font-size: 2.5rem; } .month-header h2 { font-size: 1.8rem; } .day { font-size: 0.8rem; } } /* Animation for page turning */ @keyframes pageTurn { 0% { transform: rotateY(0deg); z-index: 10; } 100% { transform: rotateY(-180deg); z-index: 0; } } /* Confetti animation for completing tasks */ .confetti-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1000; } .confetti { position: absolute; width: 10px; height: 10px; background-color: var(--primary); opacity: 0; } /* Loading indicator */ .loading { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100px; height: 100px; display: none; } .loading div { position: absolute; width: 100%; height: 100%; border: 5px solid transparent; border-top-color: var(--primary); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .notification { position: fixed; top: 20px; right: 20px; background: var(--success); color: white; padding: 15px 20px; border-radius: 5px; box-shadow: 0 5px 15px rgba(0,0,0,0.1); transform: translateX(150%); transition: transform 0.4s ease; z-index: 1000; } .notification.show { transform: translateX(0); } </style> </head> <body> <div class="planner-container"> <div class="planner"> <div class="cover"> <div class="cover-design"> <h1>Horizon Planner</h1> <p>Your interactive journey through 2023, one thoughtful day at a time</p> <button class="cover-btn" id="open-planner">Open Planner</button> </div> </div> <div class="planner-inner"> <!-- January - Left Page --> <div class="page" id="jan-page-left"> <div class="page-decoration"></div> <div class="month-header"> <h2>January</h2> <div class="month-nav"> <button class="nav-btn prev-month">←</button> <button class="nav-btn next-month">→</button> </div> </div> <div class="calendar"> <div class="weekday">Sun</div> <div class="weekday">Mon</div> <div class="weekday">Tue</div> <div class="weekday">Wed</div> <div class="weekday">Thu</div> <div class="weekday">Fri</div> <div class="weekday">Sat</div> <!-- First week --> <div class="day other-month"><span class="day-number">26</span></div> <div class="day other-month"><span class="day-number">27</span></div> <div class="day other-month"><span class="day-number">28</span></div> <div class="day other-month"><span class="day-number">29</span></div> <div class="day other-month"><span class="day-number">30</span></div> <div class="day other-month"><span class="day-number">31</span></div> <div class="day"><span class="day-number">1</span></div> <!-- Second week --> <div class="day"><span class="day-number">2</span></div> <div class="day"><span class="day-number">3</span></div> <div class="day"><span class="day-number">4</span></div> <div class="day"><span class="day-number">5</span></div> <div class="day"><span class="day-number">6</span></div> <div class="day"><span class="day-number">7</span></div> <div class="day"><span class="day-number">8</span></div> <!-- Third week --> <div class="day"><span class="day-number">9</span></div> <div class="day"><span class="day-number">10</span></div> <div class="day active"><span class="day-number">11</span><div class="day-event-indicator"></div></div> <div class="day"><span class="day-number">12</span></div> <div class="day"><span class="day-number">13</span></div> <div class="day"><span class="day-number">14</span></div> <div class="day"><span class="day-number">15</span></div> <!-- Fourth week --> <div class="day"><span class="day-number">16</span></div> <div class="day"><span class="day-number">17</span></div> <div class="day"><span class="day-number">18</span></div> <div class="day"><span class="day-number">19</span></div> <div class="day"><span class="day-number">20</span></div> <div class="day"><span class="day-number">21</span></div> <div class="day"><span class="day-number">22</span></div> </div> <div class="corner-fold" data-target="jan-page-left"></div> <div class="page-number">1</div> </div> <!-- January - Right Page --> <div class="page page-right" id="jan-page-right"> <div class="page-decoration"></div> <div class="notes-section"> <div class="notes-header"> <h3>January 11 Notes</h3> </div> <div class="notes-list" id="jan-notes"> <div class="note-item"> <div class="note-text">Set up quarterly planning templates in Notion</div> <button class="note-delete">×</button> </div> <div class="note-item"> <div class="note-text">First team stand-up of the year @ 10am</div> <button class="note-delete">×</button> </div> <div class="note-item"> <div class="note-text">Finalize website launch timeline with design team</div> <button class="note-delete">×</button> </div> </div> <div class="note-input-container"> <input type="text" class="note-input" placeholder="Add a new note..."> <button class="add-note-btn">Add</button> </div> </div> <div class="corner-fold" data-target="jan-page-right"></div> <div class="page-number">2</div> </div> <!-- February - Left Page --> <div class="page" id="feb-page-left"> <div class="page-decoration"></div> <div class="month-header"> <h2>February</h2> <div class="month-nav"> <button class="nav-btn prev-month">←</button> <button class="nav-btn next-month">→</button> </div> </div> <div class="calendar"> <div class="weekday">Sun</div> <div class="weekday">Mon</div> <div class="weekday">Tue</div> <div class="weekday">Wed</div> <div class="weekday">Thu</div> <div class="weekday">Fri</div> <div class="weekday">Sat</div> <!-- First week --> <div class="day other-month"><span class="day-number">30</span></div> <div class="day other-month"><span class="day-number">31</span></div> <div class="day"><span class="day-number">1</span></div> <div class="day"><span class="day-number">2</span></div> <div class="day"><span class="day-number">3</span></div> <div class="day"><span class="day-number">4</span></div> <div class="day"><span class="day-number">5</span></div> <!-- Second week --> <div class="day"><span class="day-number">6</span></div> <div class="day"><span class="day-number">7</span></div> <div class="day"><span class="day-number">8</span></div> <div class="day"><span class="day-number">9</span></div> <div class="day"><span class="day-number">10</span></div> <div class="day"><span class="day-number">11</span></div> <div class="day"><span class="day-number">12</span></div> <!-- Third week --> <div class="day"><span class="day-number">13</span></div> <div class="day today active"><span class="day-number">14</span><div class="day-event-indicator"></div></div> <div class="day"><span class="day-number">15</span></div> <div class="day"><span class="day-number">16</span></div> <div class="day"><span class="day-number">17</span></div> <div class="day"><span class="day-number">18</span></div> <div class="day"><span class="day-number">19</span></div> <!-- Fourth week --> <div class="day"><span class="day-number">20</span></div> <div class="day"><span class="day-number">21</span></div> <div class="day"><span class="day-number">22</span></div> <div class="day"><span class="day-number">23</span></div> <div class="day"><span class="day-number">24</span></div> <div class="day"><span class="day-number">25</span></div> <div class="day"><span class="day-number">26</span></div> </div> <div class="corner-fold" data-target="feb-page-left"></div> <div class="page-number">3</div> </div> <!-- February - Right Page --> <div class="page page-right" id="feb-page-right"> <div class="page-decoration"></div> <div class="notes-section"> <div class="notes-header"> <h3>February 14 Notes</h3> </div> <div class="notes-list" id="feb-notes"> <div class="note-item"> <div class="note-text">Client presentation for new dashboard design @ 2pm</div> <button class="note-delete">×</button> </div> <div class="note-item"> <div class="note-text">Review Q1 marketing analytics before EOD</div> <button class="note-delete">×</button> </div> <div class="note-item"> <div class="note-text">Valentine's dinner reservation at Olive & Vine, 7:30pm</div> <button class="note-delete">×</button> </div> </div> <div class="note-input-container"> <input type="text" class="note-input" placeholder="Add a new note..."> <button class="add-note-btn">Add</button> </div> </div> <div class="corner-fold" data-target="feb-page-right"></div> <div class="page-number">4</div> </div> <!-- March - Left Page --> <div class="page" id="mar-page-left"> <div class="page-decoration"></div> <div class="month-header"> <h2>March</h2> <div class="month-nav"> <button class="nav-btn prev-month">←</button> <button class="nav-btn next-month">→</button> </div> </div> <div class="calendar"> <div class="weekday">Sun</div> <div class="weekday">Mon</div> <div class="weekday">Tue</div> <div class="weekday">Wed</div> <div class="weekday">Thu</div> <div class="weekday">Fri</div> <div class="weekday">Sat</div> <!-- Calendar rows for March --> <!-- First week --> <div class="day other-month"><span class="day-number">27</span></div> <div class="day other-month"><span class="day-number">28</span></div> <div class="day"><span class="day-number">1</span></div> <div class="day"><span class="day-number">2</span></div> <div class="day"><span class="day-number">3</span></div> <div class="day"><span class="day-number">4</span></div> <div class="day"><span class="day-number">5</span></div> <!-- Second week --> <div class="day"><span class="day-number">6</span></div> <div class="day"><span class="day-number">7</span></div> <div class="day"><span class="day-number">8</span></div> <div class="day"><span class="day-number">9</span></div> <div class="day"><span class="day-number">10</span></div> <div class="day"><span class="day-number">11</span></div> <div class="day"><span class="day-number">12</span></div> <!-- Third week --> <div class="day"><span class="day-number">13</span></div> <div class="day"><span class="day-number">14</span></div> <div class="day active"><span class="day-number">15</span><div class="day-event-indicator"></div></div> <div class="day"><span class="day-number">16</span></div> <div class="day"><span class="day-number">17</span></div> <div class="day"><span class="day-number">18</span></div> <div class="day"><span class="day-number">19</span></div> <!-- Fourth week --> <div class="day"><span class="day-number">20</span></div> <div class="day"><span class="day-number">21</span></div> <div class="day"><span class="day-number">22</span></div> <div class="day"><span class="day-number">23</span></div> <div class="day"><span class="day-number">24</span></div> <div class="day"><span class="day-number">25</span></div> <div class="day"><span class="day-number">26</span></div> </div> <div class="corner-fold" data-target="mar-page-left"></div> <div class="page-number">5</div> </div> <!-- March - Right Page --> <div class="page page-right" id="mar-page-right"> <div class="page-decoration"></div> <div class="notes-section"> <div class="notes-header"> <h3>March 15 Notes</h3> </div> <div class="notes-list" id="mar-notes"> <div class="note-item"> <div class="note-text">Mid-month content planning session @ 11am</div> <button class="note-delete">×</button> </div> <div class="note-item"> <div class="note-text">Send invoice to Astral Design for the rebranding project</div> <button class="note-delete">×</button> </div> <div class="note-item"> <div class="note-text">Book flight for tech conference (April 5-8)</div> <button class="note-delete">×</button> </div> </div> <div class="note-input-container"> <input type="text" class="note-input" placeholder="Add a new note..."> <button class="add-note-btn">Add</button> </div> </div> <div class="corner-fold" data-target="mar-page-right"></div> <div class="page-number">6</div> </div> </div> <div class="back-cover"> <div class="back-cover-content"> <h2>Stay Organized, Plan Better</h2> <p>Horizon Planner helps you turn time into accomplishment through beautiful, thoughtful planning.</p> <p>Track your goals, schedule important events, and make every day count.</p> <div class="social-icons"> <div class="social-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"></path> </svg> </div> <div class="social-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"></path> </svg> </div> <div class="social-icon"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <rect x="2" y="2" width="20" height="20" rx="5" ry="5"></rect> <path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"></path> <line x1="17.5" y1="6.5" x2="17.5" y2="6.5"></line> </svg> </div> </div> </div> </div> </div> </div> <div class="loading"> <div></div> </div> <div class="notification" id="notification">Note added successfully!</div> <div class="confetti-container" id="confetti-container"></div> <script> document.addEventListener('DOMContentLoaded', function() { // Elements const planner = document.querySelector('.planner'); const cover = document.querySelector('.cover'); const openPlannerBtn = document.getElementById('open-planner'); const pages = document.querySelectorAll('.page'); const cornerFolds = document.querySelectorAll('.corner-fold'); const addNoteBtns = document.querySelectorAll('.add-note-btn'); const noteInputs = document.querySelectorAll('.note-input'); const notesLists = document.querySelectorAll('.notes-list'); const days = document.querySelectorAll('.day'); const notification = document.getElementById('notification'); const confettiContainer = document.getElementById('confetti-container'); const monthNavButtons = document.querySelectorAll('.nav-btn'); let currentPage = 0; const totalPages = pages.length; let isFlipping = false; // Open planner by flipping the cover openPlannerBtn.addEventListener('click', function() { cover.classList.add('flipped'); createConfetti(); // Add a slight delay to make the animation smoother setTimeout(() => { planner.style.transform = 'translateZ(-50px)'; }, 300); }); // Page corner fold functionality for flipping pages cornerFolds.forEach(fold => { fold.addEventListener('click', function() { if (isFlipping) return; const targetPageId = this.getAttribute('data-target'); const targetPage = document.getElementById(targetPageId); if (targetPage) { isFlipping = true; targetPage.classList.add('flipped'); // Show the loading indicator document.querySelector('.loading').style.display = 'block'; setTimeout(() => { document.querySelector('.loading').style.display = 'none'; isFlipping = false; }, 800); } }); }); // Add a new note addNoteBtns.forEach((btn, index) => { btn.addEventListener('click', function() { const input = noteInputs[index]; const notesList = notesLists[index]; if (input.value.trim() !== '') { addNote(notesList, input.value.trim()); input.value = ''; // Show success notification showNotification(); } }); }); // Listen for Enter key on note inputs noteInputs.forEach((input, index) => { input.addEventListener('keypress', function(e) { if (e.key === 'Enter' && input.value.trim() !== '') { addNote(notesLists[index], input.value.trim()); input.value = ''; // Show success notification showNotification(); } }); }); // Day selection functionality days.forEach(day => { day.addEventListener('click', function() { // Remove active class from all days days.forEach(d => d.classList.remove('active')); // Add active class to clicked day this.classList.add('active'); // Add event indicator if not present if (!this.querySelector('.day-event-indicator')) { const indicator = document.createElement('div'); indicator.classList.add('day-event-indicator'); this.appendChild(indicator); } }); }); // Month navigation monthNavButtons.forEach(btn => { btn.addEventListener('click', function() { if (this.classList.contains('prev-