Help
RSS
API
Feed
Maltego
Contact
Domain > bromantasy.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-03-16
3.166.135.18
(
ClassC
)
2025-11-26
3.175.34.112
(
ClassC
)
Port 80
HTTP/1.1 301 Moved PermanentlyServer: CloudFrontDate: Wed, 26 Nov 2025 21:28:59 GMTContent-Type: text/htmlContent-Length: 167Connection: keep-aliveLocation: https://bromantasy.com/X-Cache: Redirect from cloudfrontVia: 1.1 6f487ff94f33b54cc57c94581b06fb50.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P3X-Amz-Cf-Id: y47iVcGZXoK-KbKnN9tjs4Du9kL1bajfCRP6fmQWVbojROpF5kzjPwX-XSS-Protection: 1; modeblockX-Frame-Options: DENYReferrer-Policy: strict-origin-when-cross-originX-Content-Type-Options: nosniffpermissions-policy: interest-cohort()Vary: Origin html>head>title>301 Moved Permanently/title>/head>body>center>h1>301 Moved Permanently/h1>/center>hr>center>CloudFront/center>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 252563Connection: keep-aliveDate: Wed, 26 Nov 2025 00:28:59 GMTLast-Modified: Wed, 26 Nov 2025 00:28:25 GMTETag: b3f17e4ebe7194e8e4d44f2bb4b5ed00x-amz-server-side-encryption: AES256Cache-Control: public, max-age2592000Accept-Ranges: bytesServer: AmazonS3X-Cache: Hit from cloudfrontVia: 1.1 a149f4f5bbee293b9be1b5cd1f06e872.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P3X-Amz-Cf-Id: JwzKlyhFz0Kp3xX9qYjeakKdESs5KofFy4Y699FcWPB1zfPhGHVJ7wAge: 75601X-XSS-Protection: 1; modeblockX-Frame-Options: DENYReferrer-Policy: strict-origin-when-cross-originX-Content-Type-Options: nosniffStrict-Transport-Security: max-age31536000; includeSubDomains; preloadpermissions-policy: interest-cohort()Vary: Origin !DOCTYPE html>html langen classscroll-smooth data-astro-cid-sckkx6r4 style--playfairWoff2: /fonts/woff2/PlayfairDisplay-VariableFont_wght.woff2;--playfairTtf: /fonts/PlayfairDisplay-VariableFont_wght.ttf;--playfairItalicWoff2: /fonts/woff2/PlayfairDisplay-Italic-VariableFont_wght.woff2;--playfairItalicTtf: /fonts/PlayfairDisplay-Italic-VariableFont_wght.ttf;--glacialRegularWoff2: /fonts/woff2/GlacialIndifference-Regular.woff2;--glacialRegularOtf: /fonts/GlacialIndifference-Regular.otf;--glacialBoldWoff2: /fonts/woff2/GlacialIndifference-Bold.woff2;--glacialBoldOtf: /fonts/GlacialIndifference-Bold.otf;--glacialItalicWoff2: /fonts/woff2/GlacialIndifference-Italic.woff2;--glacialItalicOtf: /fonts/GlacialIndifference-Italic.otf;> head>meta charsetUTF-8>meta nameviewport contentwidthdevice-width, initial-scale1.0>meta namegenerator contentAstro v5.6.1>script> if (typeof window ! undefined && !window.ConsentManager) { window.ConsentManager { hasConsent: function(type) { if (type necessary) return true; const consent this.getConsent(); return consent ? consent.preferencestype : false; }, getConsent: function() { try { const cookie document.cookie .split(; ) .find(row > row.startsWith(bromantasy_consent)); if (cookie) { const value cookie.split()1; return JSON.parse(decodeURIComponent(value)); } return null; } catch (e) { return null; } }, setConsent: function(preferences) { }, revokeConsent: function() { } }; window.GDPRTracker { track: function(consentType, trackingFunction) { if (window.ConsentManager && window.ConsentManager.hasConsent(consentType)) { trackingFunction(); } }, addAction: function(name, data) { if (window.datadogRum && window.ConsentManager && window.ConsentManager.hasConsent(analytics)) { window.datadogRum.addAction(name, data); } } }; } /script>datadog-rum>/datadog-rum> !-- Load tracking utilities and Datadog RUM via NPM --> script typemodule src/_astro/DatadogRUM.astro_astro_type_script_index_0_lang.7ZsKrDFn.js>/script>!-- Enhanced RUM initialization with advanced features from gist -->script>(function(){const envName production;const version v4.10.1;const shouldInitRUM true;const clientToken pubd4ce9d0530e575fe8f456ae4cf180b52;const applicationId 3b27118b-ff19-4d26-bbb2-b0a9c08d20b5;const service bromantasy;const sampleRate 100;const enableSessionReplay true;const gitCommitSha eeca7d0993461b37c22c5d982186aa730620d696;const gitRepositoryUrl https://github.com/devindford/BroMantasy; if (shouldInitRUM) { const botPatterns /bot/i, /crawl/i, /spider/i, /slurp/i, /search/i, /index/i, /googlebot/i, /bingbot/i, /yandex/i, /baidu/i, /duckduck/i, /facebook/i, /twitter/i, /linkedin/i, /whatsapp/i, /lighthouse/i, /gtmetrix/i, /pingdom/i, /uptime/i, /monitor/i, /test/i, /check/i, /scan/i ; function isBot() { const userAgent navigator.userAgent || ; return botPatterns.some(pattern > pattern.test(userAgent)); } function getOrCreateDeviceId() { const storageKey bromantasy_device_id; let deviceId localStorage.getItem(storageKey); if (!deviceId) { deviceId xxxx-xxxx-4xxx-yxxx-xxxx.replace(/xy/g, function(c) { const r Math.random() * 16 | 0; const v c x ? r : (r & 0x3 | 0x8); return v.toString(16); }); localStorage.setItem(storageKey, deviceId); } return deviceId; } function initDatadogLogs() { if (window.datadogLogs) { window.datadogLogs.init({ clientToken: clientToken, site: datadoghq.com, internalAnalyticsSubdomain: 8b61d74c, service: service, env: envName, version: version, forwardConsoleLogs: error, warn, info, forwardReports: all, sessionSampleRate: sampleRate, }); } } let basicRumInitialized false; let enhancedRumInitialized false; async function initRUM() { if (basicRumInitialized || (window.datadogRum && window.datadogRum.getInternalContext())) { return; } basicRumInitialized true; const deviceId getOrCreateDeviceId(); const isBotDetected isBot(); if (window.datadogRum) { let hasAnalyticsConsent ConsentManager.hasConsent(analytics); if (!hasAnalyticsConsent && !ConsentManager.getConsent()) { const isGDPR await ConsentManager.isGDPRRegion(); if (!isGDPR) { hasAnalyticsConsent true; } } const finalSampleRate isBotDetected ? 0 : sampleRate; const finalSessionReplaySampleRate (isBotDetected || !enableSessionReplay) ? 0 : 50; initDatadogLogs(); window.datadogRum.init({ applicationId: applicationId, clientToken: clientToken, site: datadoghq.com, internalAnalyticsSubdomain: 8b61d74c, service: service, env: envName, version: version, sessionSampleRate: finalSampleRate, sessionReplaySampleRate: finalSessionReplaySampleRate, trackUserInteractions: false, trackFrustrations: false, defaultPrivacyLevel: mask-user-input, trackResources: true, trackLongTasks: true, traceSampleRate: 100, traceContextInjection: all, sourceMapsUploadErrorLimit: 100, allowedTracingUrls: window.location.origin, https://api.bromantasy.com, https://assets.bromantasy.com, /^https?:\/\/localhost/ , trackViewsManually: false, trackBfcacheViews: true, trackingConsent: hasAnalyticsConsent ? granted : not-granted, ...(gitCommitSha && { git_commit_sha: gitCommitSha }), ...(gitRepositoryUrl && { git_repository_url: gitRepositoryUrl }), beforeSend: (event) > { if (event.type error) { const errorMessage event.error?.message || ; const errorStack event.error?.stack || ; if (errorMessage.includes(runtime.sendMessage) || errorMessage.includes(chrome.runtime) || errorMessage.includes(browser.runtime) || errorStack.includes(chrome-extension://) || errorStack.includes(safari-extension://)) { console.debug(Datadog: Filtered browser extension error:, errorMessage); return false; // Dont send to Datadog } if (errorMessage.includes(ResizeObserver loop) || errorMessage.includes(ResizeObserver loop completed with undelivered notifications)) { console.debug(Datadog: Filtered benign ResizeObserver error); return false; } } return true; // Send all other events to Datadog } }); function updatePageLevelContext() { if (!window.datadogRum || !window.datadogRum.setGlobalContextProperty) return; // CRITICAL FIX: Read from body> element instead of html> // The body> element is swapped during Astro view transitions, so data-dd-* attributes // will be fresh for each page. The html> element persists, causing stale context. const bodyElement document.body; // Clear all previous review-specific context first const reviewContextKeys review_archetype, review_author, review_genre, review_subgenres, review_rating, review_spice, review_darkness, review_uncomfortable, review_date ; reviewContextKeys.forEach(key > { window.datadogRum.setGlobalContextProperty(key, undefined); }); // Now set new context from current pages body> data attributes Object.keys(bodyElement.dataset).forEach((key) > { if (key.startsWith(dd)) { const value bodyElement.datasetkey; if (value && value.trim()) { let parsedValue value; if (value.startsWith() || value.startsWith({)) { try { parsedValue JSON.parse(value); } catch (e) { console.debug(Failed to parse JSON for data attribute:, key, e); } } const withoutPrefix key.slice(2); const contextKey withoutPrefix.charAt(0).toLowerCase() + withoutPrefix.slice(1).replace(/A-Z/g, m > _ + m.toLowerCase()); window.datadogRum.setGlobalContextProperty(contextKey, parsedValue); } } }); } setTimeout(() > { if (window.datadogRum && window.datadogRum.setGlobalContextProperty) { window.datadogRum.setGlobalContextProperty(device_id, deviceId); window.datadogRum.setGlobalContextProperty(is_bot, isBotDetected); updatePageLevelContext(); } // With trackViewsManually: false, the SDK auto-creates views on page load and transitions // Just update context when page changes document.addEventListener(astro:page-load, () > { updatePageLevelContext(); }); let retries 0; const maxRetries 30; // 30 * 100ms 3 seconds max wait const waitForConsent setInterval(() > { const consentData ConsentManager.getConsent(); const consentReady consentData ! null; if (consentReady || retries > maxRetries) { clearInterval(waitForConsent); const hasAnalyticsConsentForUser ConsentManager.hasConsent(analytics); if (hasAnalyticsConsentForUser) { if (typeof UserManager ! undefined && window.datadogRum && window.datadogRum.setUser) { UserManager.updateRUMUser(); } } else { if (typeof UserManager ! undefined && window.datadogRum && window.datadogRum.setUser) { UserManager.updateBasicRUMUser(); } } } retries++; }, 100); // Check every 100ms }, 100); // Still start after 100ms for RUM init to complete } } function handleConsentChange() { if (basicRumInitialized && window.datadogRum) { const hasAnalyticsConsent ConsentManager.hasConsent(analytics); if (hasAnalyticsConsent && !enhancedRumInitialized) { window.datadogRum.setTrackingConsent(granted); enhancedRumInitialized true; if (typeof UserManager ! undefined && window.datadogRum && window.datadogRum.setUser) { UserManager.updateRUMUser(); } } else if (!hasAnalyticsConsent && enhancedRumInitialized) { window.datadogRum.setTrackingConsent(not-granted); enhancedRumInitialized false; if (typeof UserManager ! undefined && window.datadogRum && window.datadogRum.setUser) { UserManager.updateBasicRUMUser(); } } } } if (window.datadogRum) { initRUM().catch(e > console.error(RUM initialization error:, e)); } else { const checkRUM setInterval(() > { if (window.datadogRum) { initRUM().catch(e > console.error(RUM initialization error:, e)); clearInterval(checkRUM); } }, 50); setTimeout(() > clearInterval(checkRUM), 5000); } document.addEventListener(consentChange, (event) > { const preferences event.detail.preferences; if (preferences.analytics) { handleConsentChange(); } }); // Core Web Vitals are now tracked automatically by the SDK // No manual tracking needed with trackViewsManually: false window.RUMMetrics { /** * Track custom business metrics for GSC correlation * @param {string} metricName - Name of the metric * @param {number} value - Numeric value for the metric * @param {object} context - Optional additional context for the metric */ trackMetric(metricName, value, context {}) { if (window.datadogRum && window.datadogRum.addAction) { window.datadogRum.addAction(custom_metric, { metric_name: metricName, metric_value: value, ...context, timestamp: new Date().toISOString() }); } }, /** * Track page-specific performance metrics * Useful for correlating with GSC performance data * @param {string} metricName - Name of the performance metric * @param {number} value - Metric value in milliseconds * @param {object} context - Optional additional context */ trackPerformance(metricName, value, context {}) { if (datadogRum && datadogRum.addDurationVital) { // Use addDurationVital for performance measurements (not addAction) datadogRum.addDurationVital(`perf_${metricName}`, { startTime: 0, duration: Math.round(value), description: JSON.stringify(context) }); } }, /** * Track user engagement metrics * @param {string} engagementType - Type of engagement (scroll, click, etc.) * @param {string} target - What was engaged with * @param {number} depth - Optional engagement depth (scroll %, time, etc.) */ trackEngagement(engagementType, target, context {}) { if (window.datadogRum && window.datadogRum.addAction) { window.datadogRum.addAction(user_engagement, { engagement_type: engagementType, engagement_target: target, ...context, page: window.location.pathname, timestamp: new Date().toISOString() }); } } }; }})();/script>link relapple-touch-icon sizes180x180 href/favicon/apple-touch-icon.png>link relicon typeimage/png sizes32x32 href/favicon/favicon-32x32.png>link relicon typeimage/png sizes16x16 href/favicon/favicon-16x16.png>link relicon typeimage/svg+xml href/favicon/icon.svg>link relicon typeimage/png href/favicon/favicon.png>link relmanifest href/favicon/site.webmanifest>link relpreload href/fonts/woff2/PlayfairDisplay-VariableFont_wght.woff2 asfont typefont/woff2 crossorigin>link relpreload href/fonts/woff2/GlacialIndifference-Regular.woff2 asfont typefont/woff2 crossorigin>link relpreconnect hrefhttps://fonts.googleapis.com crossorigin>link relpreconnect hrefhttps://fonts.gstatic.com crossorigin>link hrefhttps://fonts.googleapis.com/css2?familyEB+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&familyWork+Sans:wght@300;400;500;600&displayswap relstylesheet mediaprint onloadthis.mediaall>link relpreconnect hrefhttps://assets.bromantasy.com crossorigin>link reldns-prefetch href//assets.bromantasy.com>link reldns-prefetch href//www.googletagmanager.com>link reldns-prefetch href//cdn.jsdelivr.net>noscript>link hrefhttps://fonts.googleapis.com/css2?familyEB+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&familyWork+Sans:wght@300;400;500;600&displayswap relstylesheet>/noscript>meta nametitle contentBroMantasy | Fantasy & Sci-Fi Book Reviews from a Male Perspective>meta namedescription contentHonest, story-first reviews of epic fantasy, sci-fi, and the romantasy worth your time. Were your guide to great books, complete with a no-BS spice level rating.>meta namekeywords contentromantasy for men, fantasy book reviews spice level, male perspective book reviews, romantasy books for male readers, book spice level guide, fantasy romance book reviews, Fourth Wing spice level, Sarah J Maas books for men, romantasy reading guide, fantasy book recommendations, book blog, sci-fi book reviews>meta namerobots contentindex, follow, max-image-preview:large, max-snippet:-1>link relcanonical hrefhttps://bromantasy.com/>meta propertyog:locale contenten_US>meta http-equivcontent-language contenten>meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno>meta propertyog:type contentwebsite>meta propertyog:title contentBroMantasy | Fantasy & Sci-Fi Book Reviews from a Male Perspective>meta propertyog:description contentHonest, story-first reviews of epic fantasy, sci-fi, and the romantasy worth your time. Were your guide to great books, complete with a no-BS spice level rating.>meta propertyog:url contenthttps://bromantasy.com/>meta propertyog:image contenthttps://assets.bromantasy.com/og/bromantasy-site-general.webp>meta propertyog:image:width content1200>meta propertyog:image:height content630>meta propertyog:site_name contentBroMantasy>meta propertyarticle:author contentBroMantasy>meta nametwitter:card contentsummary_large_image>meta nametwitter:title contentBroMantasy | Fantasy & Sci-Fi Book Reviews from a Male Perspective>meta nametwitter:description contentHonest, story-first reviews of epic fantasy, sci-fi, and the romantasy worth your time. Were your guide to great books, complete with a no-BS spice level rating.>meta nametwitter:image contenthttps://assets.bromantasy.com/og/bromantasy-site-general.webp>meta nametwitter:domain contentbromantasy.com>meta nametwitter:creator content@bromantasy>link relalternate typetext/markdown hrefhttps://bromantasy.com.md>meta namellm-friendly contenttrue>script> if (!window.__themeInitialized) { const currentTheme localStorage.getItem(theme) || dark; if (currentTheme dark) { document.documentElement.classList.add(dark); } else { document.documentElement.classList.remove(dark); } window.__themeInitialized true; window.__theme currentTheme; } /script>script typemodule>const edocument.documentElement;function t(){e.classList.contains(dark)?(e.classList.remove(dark),localStorage.setItem(theme,light)):(e.classList.add(dark),localStorage.setItem(theme,dark)),function(){const tdocument.querySelectorAll(#lightMode),odocument.querySelectorAll(#darkMode),ae.classList.contains(dark);t.forEach(e>{a?(e.style.opacity0,e.style.transformscale(0.95)):(e.style.opacity1,e.style.transformscale(1))}),o.forEach(e>{a?(e.style.opacity1,e.style.transformscale(1)):(e.style.opacity0,e.style.transformscale(0.95))})}()}document.addEventListener(astro:before-swap,e>{document.documentElement.classList.contains(dark)?e.newDocument.documentElement.classList.add(dark):e.newDocument.documentElement.classList.remove(dark);const tdocument.querySelectorAll(#lightMode),odocument.querySelectorAll(#darkMode);t.forEach(e>{e.classList.remove(transition-all,duration-500)}),o.forEach(e>{e.classList.remove(transition-all,duration-500)})}),document.addEventListener(astro:page-load,()>{const odocument.querySelectorAll(#themeToggle),adocument.querySelectorAll(#lightMode),sdocument.querySelectorAll(#darkMode),le.classList.contains(dark);a.forEach(e>{l?(e.style.opacity0,e.style.transformscale(0.95)):(e.style.opacity1,e.style.transformscale(1))}),s.forEach(e>{l?(e.style.opacity1,e.style.transformscale(1)):(e.style.opacity0,e.style.transformscale(0.95))}),requestAnimationFrame(()>{a.forEach(e>{e.classList.add(transition-all,duration-500)}),s.forEach(e>{e.classList.add(transition-all,duration-500)})}),window.__themeToggleHandler||(window.__themeToggleHandlert),o.forEach(e>{e.removeEventListener(click,window.__themeToggleHandler),e.addEventListener(click,window.__themeToggleHandler)})});//# sourceMappingURLLayout.astro_astro_type_script_index_0_lang.A2XrtT44.js.map/script>script typemodule src/_astro/Layout.astro_astro_type_script_index_1_lang.D0KNrG2v.js>/script>meta nameastro-view-transitions-enabled contenttrue>meta nameastro-view-transitions-fallback contentanimate>script typemodule src/_astro/ClientRouter.astro_astro_type_script_index_0_lang.FdGzU5e7.js>/script>title>BroMantasy | Fantasy & Sci-Fi Book Reviews from a Male Perspective/title>!-- Named slot for page-specific head content (e.g., schema markup) -->style> .hero-banner{position:relative;min-height:60vh} .container{max-width:1200px;margin:0 auto;padding:0 1rem} .btn{display:inline-flex;align-items:center;padding:0.75rem 1.5rem;border-radius:0.5rem;font-weight:600;text-decoration:none;transition:all 0.2s} .grid{display:grid} .grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))} @media (min-width:768px){ .md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))} .md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))} .md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))} } .gap-4{gap:1rem} .gap-6{gap:1.5rem} .gap-8{gap:2rem} .text-center{text-align:center} .relative{position:relative} .absolute{position:absolute} .inset-0{top:0;right:0;bottom:0;left:0} .w-full{width:100%} .h-full{height:100%} /style>link relstylesheet href/_astro/about.DTiNQvw3.css>link relstylesheet href/_astro/index.DbvF6XCp.css>link relstylesheet href/_astro/community-book-awards.BzA60tkK.css>link relstylesheet href/_astro/about.Cq9LLLtj.css>link relstylesheet href/_astro/index.C-3zbh0b.css>link relstylesheet href/_astro/index.LQvwUJd-.css>/head> body classmin-h-screen bg-#faf9f7 dark:bg-rich-black-950 text-rich-black-800 dark:text-gray-100 font-serif flex flex-col data-astro-cid-sckkx6r4 style--playfairWoff2: /fonts/woff2/PlayfairDisplay-VariableFont_wght.woff2;--playfairTtf: /fonts/PlayfairDisplay-VariableFont_wght.ttf;--playfairItalicWoff2: /fonts/woff2/PlayfairDisplay-Italic-VariableFont_wght.woff2;--playfairItalicTtf: /fonts/PlayfairDisplay-Italic-VariableFont_wght.ttf;--glacialRegularWoff2: /fonts/woff2/GlacialIndifference-Regular.woff2;--glacialRegularOtf: /fonts/GlacialIndifference-Regular.otf;--glacialBoldWoff2: /fonts/woff2/GlacialIndifference-Bold.woff2;--glacialBoldOtf: /fonts/GlacialIndifference-Bold.otf;--glacialItalicWoff2: /fonts/woff2/GlacialIndifference-Italic.woff2;--glacialItalicOtf: /fonts/GlacialIndifference-Italic.otf;> div classflex-grow data-astro-cid-sckkx6r4 style--playfairWoff2: /fonts/woff2/PlayfairDisplay-VariableFont_wght.woff2;--playfairTtf: /fonts/PlayfairDisplay-VariableFont_wght.ttf;--playfairItalicWoff2: /fonts/woff2/PlayfairDisplay-Italic-VariableFont_wght.woff2;--playfairItalicTtf: /fonts/PlayfairDisplay-Italic-VariableFont_wght.ttf;--glacialRegularWoff2: /fonts/woff2/GlacialIndifference-Regular.woff2;--glacialRegularOtf: /fonts/GlacialIndifference-Regular.otf;--glacialBoldWoff2: /fonts/woff2/GlacialIndifference-Bold.woff2;--glacialBoldOtf: /fonts/GlacialIndifference-Bold.otf;--glacialItalicWoff2: /fonts/woff2/GlacialIndifference-Italic.woff2;--glacialItalicOtf: /fonts/GlacialIndifference-Italic.otf;> header classborder-b border-academy-100 dark:border-rich-black-800 py-5 w-full bg-#faf9f7 dark:bg-rich-black-950 sticky top-0 z-50 backdrop-blur-sm bg-opacity-95 dark:bg-opacity-95> div classcontainer max-w-6xl mx-auto px-4 sm:px-6 lg:px-8> div classflex justify-between items-center> a href/ classtext-2xl font-bold text-accent-600 dark:text-accent-500 flex items-center font-display tracking-tight> !-- You can add your logo here --> span>BroMantasy/span> /a> div classhidden md:flex items-center> nav classflex items-center mr-4> a href/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_links data-dd-link-textHome classtext-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-medium relative after:absolute after:bottom-0 after:left-0 after:h-1px after:w-0 after:bg-accent-600 dark:after:bg-accent-500 after:transition-all hover:after:w-full font-sans text-sm uppercase tracking-wide px-3 md:px-2 lg:px-3> Home /a>a href/reviews/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_links data-dd-link-textReviews classtext-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-medium relative after:absolute after:bottom-0 after:left-0 after:h-1px after:w-0 after:bg-accent-600 dark:after:bg-accent-500 after:transition-all hover:after:w-full font-sans text-sm uppercase tracking-wide px-3 md:px-2 lg:px-3> Reviews /a>div classrelative group> button classtext-rich-black-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-medium relative after:absolute after:bottom-0 after:left-0 after:h-1px after:w-0 after:bg-accent-600 dark:after:bg-accent-500 after:transition-all group-hover:after:w-full font-sans text-sm uppercase tracking-wide px-3 md:px-2 lg:px-3 flex items-center gap-1 aria-expandedfalse aria-haspopuptrue> Discover svg classw-3 h-3 transition-transform group-hover:rotate-180 fillcurrentColor viewBox0 0 20 20> path fill-ruleevenodd dM5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z clip-ruleevenodd>/path> /svg> /button> div classabsolute left-0 mt-1 w-80 bg-white dark:bg-accent-950 rounded-lg shadow-lg border border-gray-200 dark:border-accent-700 opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200 z-50> div classpy-2> a href/community-book-awards/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textAwards classblock px-4 py-3 hover:bg-gray-50 dark:hover:bg-accent-800 transition-colors> div classfont-medium text-rich-black-900 dark:text-gray-100 text-sm> Awards /div> div classtext-xs text-gray-600 dark:text-gray-400 mt-1> Celebrate the best of books, indie, and the community /div> /a>a href/series/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textSeries classblock px-4 py-3 hover:bg-gray-50 dark:hover:bg-accent-800 transition-colors> div classfont-medium text-rich-black-900 dark:text-gray-100 text-sm> Series /div> div classtext-xs text-gray-600 dark:text-gray-400 mt-1> Complete list of all series /div> /a>a href/indie-books/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textIndie Books classblock px-4 py-3 hover:bg-gray-50 dark:hover:bg-accent-800 transition-colors> div classfont-medium text-rich-black-900 dark:text-gray-100 text-sm> Indie Books /div> div classtext-xs text-gray-600 dark:text-gray-400 mt-1> Hidden gem indie fantasy, sci-fi, & romantasy worth your time /div> /a>a href/lists/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textReading Lists classblock px-4 py-3 hover:bg-gray-50 dark:hover:bg-accent-800 transition-colors> div classfont-medium text-rich-black-900 dark:text-gray-100 text-sm> Reading Lists /div> div classtext-xs text-gray-600 dark:text-gray-400 mt-1> Curated collections and recommendations /div> /a>a href/cover-reveals/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textCover Reveals classblock px-4 py-3 hover:bg-gray-50 dark:hover:bg-accent-800 transition-colors> div classfont-medium text-rich-black-900 dark:text-gray-100 text-sm> Cover Reveals /div> div classtext-xs text-gray-600 dark:text-gray-400 mt-1> Exclusive early access to upcoming book covers /div> /a> /div> /div> /div>a href/about/ data-dd-interaction-nameheader_link_click data-dd-sectionheader_links data-dd-link-textAbout classtext-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-medium relative after:absolute after:bottom-0 after:left-0 after:h-1px after:w-0 after:bg-accent-600 dark:after:bg-accent-500 after:transition-all hover:after:w-full font-sans text-sm uppercase tracking-wide px-3 md:px-2 lg:px-3> About /a> /nav> div classflex items-center gap-3> div classrelative w-full max-w-6xl mx-auto md:w-auto md:max-w-none md:mx-0 data-search-index-path/search-index.json x-data{ isOpen: false, searchQuery: , isExpanded: false, results: , fuse: null, documents: , loading: true, error: false, hasSearched: false, isSafari: /^((?!chrome|android).)*safari/i.test(navigator.userAgent), rumDebounceTimer: null, lastSentQuery: , async init() { // Dont load search index on init - wait for user interaction this.loading false; }, async loadSearchIndex() { // Lazy load search index only when user interacts with search if (this.fuse || this.loading) return; // Already loaded or loading this.loading true; try { // Wait for Fuse.js to be available await this.waitForFuse(); // Get search index path from data attribute (handles preview base paths) const searchIndexPath this.$el.dataset.searchIndexPath || /search-index.json; // Fetch pre-built search index (cached by CloudFront for 30 days) // Use retry logic with exponential backoff for reliability const response await this.fetchWithRetry(searchIndexPath); if (!response.ok) { throw new Error(`Failed to load search index: ${response.status}`); } const indexData await response.json(); // Hydrate Fuse.js from pre-built index (FAST - ~10ms vs 50ms) const fuseIndex Fuse.parseIndex(indexData.index); this.documents indexData.documents; // Create Fuse instance with pre-built index this.fuse new Fuse( this.documents, { keys: { name: title, weight: 0.4 }, { name: author, weight: 0.3 }, { name: series, weight: 0.2 }, { name: genre, weight: 0.1 } , threshold: 0.3, includeScore: true }, fuseIndex ); this.loading false; } catch (error) { // Enhanced error logging with context for debugging const searchIndexPath this.$el.dataset.searchIndexPath || /search-index.json; console.error(Failed to load search index:, { error: error.message, browser: navigator.userAgent, isSafari: this.isSafari, url: searchIndexPath, timestamp: new Date().toISOString() }); this.loading false; this.error true; } }, waitForFuse() { return new Promise((resolve, reject) > { // Check if Fuse is already loaded if (typeof Fuse ! undefined) { resolve(); return; } // Wait for Fuse to load (max 5 seconds) const checkInterval 50; const maxAttempts 100; // 5 seconds let attempts 0; const interval setInterval(() > { attempts++; if (typeof Fuse ! undefined) { clearInterval(interval); resolve(); } else if (attempts > maxAttempts) { clearInterval(interval); reject(new Error(Fuse.js failed to load)); } }, checkInterval); }); }, async fetchWithTimeout(url, options {}, timeout 10000) { const controller new AbortController(); const id setTimeout(() > controller.abort(), timeout); try { const response await fetch(url, { ...options, signal: controller.signal }); clearTimeout(id); return response; } catch (error) { clearTimeout(id); if (error.name AbortError) { throw new Error(Request timeout - search index took too long to load); } throw error; } }, async fetchWithRetry(url, retries 3, baseDelay 1000) { for (let i 0; i retries; i++) { try { // Use fetchWithTimeout instead of raw fetch const response await this.fetchWithTimeout(url, {}, 10000); if (response.ok) { return response; } // If not the last attempt and got a server error, retry with exponential backoff if (i retries - 1 && response.status > 500) { const delay baseDelay * Math.pow(2, i); // Exponential: 1s, 2s, 4s console.warn(`Search index fetch failed (${response.status}), retrying in ${delay}ms...`); await new Promise(resolve > setTimeout(resolve, delay)); continue; } return response; } catch (error) { // Network error or timeout - retry if not the last attempt if (i retries - 1) { const delay baseDelay * Math.pow(2, i); // Exponential: 1s, 2s, 4s console.warn(`Search index fetch attempt ${i + 1} failed, retrying in ${delay}ms...`, error.message); await new Promise(resolve > setTimeout(resolve, delay)); continue; } throw error; } } }, search() { if (!this.fuse || this.searchQuery.length 2) { this.results ; this.hasSearched false; return; } // Fuzzy search with typo tolerance const fuseResults this.fuse.search(this.searchQuery); this.results fuseResults.slice(0, 8).map(r > r.item); this.hasSearched true; // Debounce RUM tracking - only send after user stops typing for 1200ms clearTimeout(this.rumDebounceTimer); this.rumDebounceTimer setTimeout(() > { // Track search analytics (with GDPR consent) - only if query changed if (this.lastSentQuery ! this.searchQuery && window.datadogRum && window.ConsentManager && window.ConsentManager.hasConsent(analytics)) { this.lastSentQuery this.searchQuery; // Update last sent query window.datadogRum.addAction(search_performed, { search_query: this.searchQuery, results_count: this.results.length, page_path: window.location.pathname, search_type: global }); // Track zero results (content gaps) if (this.results.length 0) { window.datadogRum.addAction(search_zero_results, { search_query: this.searchQuery, page_path: window.location.pathname, search_type: global }); } } }, 1200); }, async toggleSearch() { this.isExpanded !this.isExpanded; if (this.isExpanded) { // Lazy load search index when user opens search await this.loadSearchIndex(); setTimeout(() > { document.getElementById(global-search-desktop)?.focus(); }, 100); } else { this.clearSearch(); } }, clearSearch() { this.searchQuery ; this.results ; this.isOpen false; this.isExpanded false; this.hasSearched false; }, // Navigate to search page when Enter is pressed jumpToSearch() { if (this.searchQuery.trim()) { window.location.href `/search/?q${encodeURIComponent(this.searchQuery.trim())}`; } } } @click.awayclearSearch() x-initinit()> !-- Mobile Search Bar --> div classblock md:hidden relative w-full> input typesearch idglobal-search-mobile nameglobal-search-mobile autocompleteoff x-modelsearchQuery @input.debounce.300mssearch @keydown.enterjumpToSearch() @focusisOpen true; loadSearchIndex() @blurif (searchQuery.length 0) isOpen false :disabledloading :placeholderloading ? Loading search... : Search books, authors, series... classw-full px-4 py-2 text-base rounded-lg border border-academy-200 dark:border-accent-800 bg-white dark:bg-accent-900 text-rich-black-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-accent-500 dark:focus:ring-accent-600 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed &::-webkit-search-cancel-button:hidden &::-webkit-search-decoration:hidden> button typebutton classabsolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 @clickclearSearch() x-showsearchQuery x-cloak aria-labelClear search> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 fillnone viewBox0 0 24 24 strokecurrentColor> path stroke-linecapround stroke-linejoinround stroke-width2 dM6 18L18 6M6 6l12 12>/path> /svg> /button> /div> !-- Desktop Search (Collapsible) --> div classhidden md:block> template x-if!isExpanded> !-- Search Icon (Collapsed State) --> button typebutton classflex items-center justify-center h-9 w-9 text-gray-600 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-400 border border-transparent hover:bg-gray-100 dark:hover:bg-accent-950 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed @clicktoggleSearch :disabledloading aria-labelSearch> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 fillnone viewBox0 0 24 24 strokecurrentColor> path stroke-linecapround stroke-linejoinround stroke-width2 dM21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z>/path> /svg> /button> /template> template x-ifisExpanded> !-- Search Input (Expanded State) --> div classrelative w-56 x-transition:entertransition-all ease-out duration-200 x-transition:enter-startopacity-0 scale-95 x-transition:enter-endopacity-100 scale-100 x-transition:leavetransition-all ease-in duration-150 x-transition:leave-startopacity-100 scale-100 x-transition:leave-endopacity-0 scale-95> input idglobal-search-desktop nameglobal-search-desktop typesearch autocompleteoff x-modelsearchQuery @input.debounce.300mssearch @keydown.enterjumpToSearch() @focusisOpen true @blurif (searchQuery.length 0) isOpen false :disabledloading :placeholderloading ? Loading... : Search books, authors, series... classw-full pl-4 pr-10 py-2 text-sm rounded-lg border border-academy-200 dark:border-accent-800 bg-white dark:bg-accent-900 text-rich-black-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-accent-500 dark:focus:ring-accent-600 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed &::-webkit-search-cancel-button:hidden &::-webkit-search-decoration:hidden> !-- Close Button --> button typebutton classabsolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 @clicktoggleSearch aria-labelClose search> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 fillnone viewBox0 0 24 24 strokecurrentColor> path stroke-linecapround stroke-linejoinround stroke-width2 dM6 18L18 6M6 6l12 12>/path> /svg> /button> /div> /template> /div> !-- Search Results Dropdown --> div x-showisOpen && results.length > 0 x-cloak x-transition:entertransition ease-out duration-200 x-transition:enter-startopacity-0 transform scale-95 x-transition:enter-endopacity-100 transform scale-100 x-transition:leavetransition ease-in duration-100 x-transition:leave-startopacity-100 transform scale-100 x-transition:leave-endopacity-0 transform scale-95 classabsolute z-50 mt-2 w-74 md:w-80 rounded-lg shadow-lg bg-white dark:bg-accent-900 ring-1 ring-black ring-opacity-5 max-h-96 overflow-y-auto right-0> div classpy-2 rolemenu aria-orientationvertical> template x-forresult in results :keyresult.slug> a :href`/reviews/${result.slug}/` classflex gap-3 px-3 py-2 hover:bg-gray-50 dark:hover:bg-accent-800 transition rolemenuitem> !-- Book Cover Thumbnail --> img :src`https://assets.bromantasy.com/${result.coverImage}` :alt`${result.title} cover` classw-16 h-24 object-cover rounded shadow flex-shrink-0 loadinglazy> !-- Book Info --> div classmin-w-0 flex-grow> h4 classfont-semibold text-base truncate text-rich-black-900 dark:text-gray-100 x-textresult.title>/h4> p classtext-sm text-gray-600 dark:text-gray-400 truncate x-textresult.author>/p> !-- Rating & Spice --> div classflex flex-col gap-1 mt-1 text-sm font-bold> div classgrid grid-cols-2 gap-1.5 w-full min-w-full> span classflex items-center min-w-fit x-showresult.rating> span x-text`${⭐.repeat(Math.floor(result.rating))} ${result.rating}/5`>/span> /span> span classflex items-center x-showresult.spiceLevel > 0> span x-text`${🌶️.repeat(result.spiceLevel)} ${result.spiceLevel}/5`>/span> /span> /div> div classgrid grid-cols-2 gap-1 w-full min-w-full> span classflex items-center min-w-fit x-showresult.spiceLevel > 0> span x-text`${💀.repeat(result.darknessLevel)} ${result.darknessLevel}/5`>/span> /span> span classflex items-center min-w-fit x-showresult.uncomfortableLevel > 0> span x-text`${😳.repeat(result.uncomfortableLevel)} ${result.uncomfortableLevel}/5`>/span> /span> /div> /div> /div> /a> /template> /div> /div> !-- No Results Message --> div x-showisOpen && !loading && hasSearched && searchQuery.length > 2 && results.length 0 x-cloak x-transition:entertransition ease-out duration-200 x-transition:enter-startopacity-0 transform scale-95 x-transition:enter-endopacity-100 transform scale-100 x-transition:leavetransition ease-in duration-100 x-transition:leave-startopacity-100 transform scale-100 x-transition:leave-endopacity-0 transform scale-95 classabsolute z-50 mt-2 w-74 md:w-80 rounded-lg shadow-lg bg-white dark:bg-accent-900 ring-1 ring-black ring-opacity-5 right-0> div classpx-4 py-3 text-sm text-gray-500 dark:text-gray-400>No results found for span x-textsearchQuery>/span>/div> /div> !-- Error Message --> div x-showerror x-cloak classabsolute z-50 mt-2 w-74 md:w-80 rounded-lg shadow-lg bg-red-50 dark:bg-red-900 ring-1 ring-red-500 ring-opacity-20 right-0> div classpx-4 py-3 text-sm text-red-700 dark:text-red-200> template x-ifisSafari> p>Search is temporarily unavailable. Please try refreshing the page or use the site navigation to find reviews./p> /template> template x-if!isSafari> p>Failed to load search. Please refresh the page./p> /template> /div> /div> /div> !-- Load Fuse.js from CDN --> script typemodule src/_astro/GlobalSearch.astro_astro_type_script_index_0_lang.DiJmZXR7.js>/script> !-- Book-themed Toggle -->button idthemeToggle classrelative w-16 h-10 bg-gradient-to-br from-amber-100 to-amber-200 dark:from-slate-700 dark:to-slate-800 rounded-sm shadow-sm hover:shadow-md transition-all duration-300 focus:outline-none focus:ring-1 focus:ring-accent-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 w-10 h-8 md:w-16 md:h-10 align-middle ml-3> span classsr-only>Toggle reading mode/span> !-- Light Mode: Open Book - hidden in dark mode, visible in light --> div idlightMode classabsolute inset-0 opacity-100 dark:opacity-0 scale-100 dark:scale-95> div classw-full h-full flex items-center justify-center> !-- Book icon with enhanced styling --> svg classw-1.6rem h-1.6rem text-amber-800 fillcurrentColor viewBox0 0 24 24> !-- Left page with gradient effect (rotated 180°) --> path dM3 6 L3 18 L11 20 L11 8 Z fillurl(#pageGradient) strokecurrentColor stroke-width0.6>/path> !-- Right page with gradient effect (rotated 180°) --> path dM13 8 L13 20 L21 18 L21 6 Z fillurl(#pageGradient) strokecurrentColor stroke-width0.6>/path> !-- Center binding with emphasis (aligned with rotated pages) --> line x112 y18 x212 y220 strokecurrentColor stroke-width1.2>/line> !-- Page lines left with better visibility --> line x15 y111 x29 y211.5 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x15 y113 x29 y213.5 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x15 y115 x28 y215.3 strokecurrentColor stroke-width0.4 opacity0.7>/line> !-- Page lines right with better visibility --> line x115 y111.5 x219 y211 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x115 y113.5 x219 y213 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x116 y115.3 x219 y215 strokecurrentColor stroke-width0.4 opacity0.7>/line> !-- Gradient definition for pages --> defs> linearGradient idpageGradient x10% y10% x20% y2100%> stop offset0% stylestop-color:#fefce8;stop-opacity:1>/stop> stop offset100% stylestop-color:#fef3c7;stop-opacity:1>/stop> /linearGradient> /defs> /svg> !-- Enhanced sun rays with glow and varied animation --> div classabsolute inset-0> !-- Primary rays (longer) --> div classabsolute top-0.5 left-1/2 w-0.5 h-2 bg-gradient-to-b from-yellow-300 to-yellow-500 rounded-full transform -translate-x-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-duration: 1.5s;>/div> div classabsolute top-1/2 right-0 w-2 h-0.5 bg-gradient-to-r from-yellow-300 to-yellow-500 rounded-full transform -translate-y-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.2s; animation-duration: 1.5s;>/div> div classabsolute bottom-0.5 left-1/2 w-0.5 h-2 bg-gradient-to-t from-yellow-300 to-yellow-500 rounded-full transform -translate-x-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.4s; animation-duration: 1.5s;>/div> div classabsolute top-1/2 left-0 w-2 h-0.5 bg-gradient-to-l from-yellow-300 to-yellow-500 rounded-full transform -translate-y-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.6s; animation-duration: 1.5s;>/div> !-- Secondary rays (diagonal, shorter) --> div classabsolute top-1 right-1.5 w-0.5 h-1.5 bg-gradient-to-b from-yellow-400 to-amber-400 rounded-full transform rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.1s; animation-duration: 1.8s;>/div> div classabsolute bottom-1 right-1.5 w-0.5 h-1.5 bg-gradient-to-t from-yellow-400 to-amber-400 rounded-full transform -rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.3s; animation-duration: 1.8s;>/div> div classabsolute bottom-1 left-1.5 w-0.5 h-1.5 bg-gradient-to-t from-yellow-400 to-amber-400 rounded-full transform rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.5s; animation-duration: 1.8s;>/div> div classabsolute top-1 left-1.5 w-0.5 h-1.5 bg-gradient-to-b from-yellow-400 to-amber-400 rounded-full transform -rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.7s; animation-duration: 1.8s;>/div> /div> /div> /div> !-- Dark Mode: Closed Book with Moon - visible in dark mode --> div iddarkMode classabsolute inset-0 opacity-0 dark:opacity-100 scale-95 dark:scale-100> div classw-full h-full flex items-center justify-center> !-- Closed book icon with enhanced dark mode styling --> svg classw-1.35rem h-1.35rem text-slate-100 drop-shadow-0_0_4px_rgba(148,163,184,0.5) fillcurrentColor viewBox0 0 256 256 strokecurrentColor stroke-width4> !-- Main book outline with subtle glow effect --> path dM35,10.8c-3.5,1.2-6,3-7.6,5.5c-2.9,4.6-2.7-3-2.7,108c0,65.5,0.2,102.2,0.5,103.8c1.6,8.4,9,15.9,17.5,17.5c1.6,0.3,33.8,0.5,94.4,0.5H229l1.1-1.2c1.5-1.5,1.5-3.6,0-5.1c-0.9-1-1.6-1.2-3.7-1.2h-2.5v-14.7v-14.7l1.7-0.3c2.1-0.4,5.1-3.4,5.5-5.4c0.1-0.8,0.2-42.3,0.1-92.1l-0.1-90.6l-1.6-2.9c-1.8-3.4-3.4-4.8-7-6.5l-2.5-1.2L128.7,10C41.9,9.9,37.3,9.9,35,10.8z M54.2,109.5v92.1l-6.1,0.2c-6.8,0.3-9.6,1.1-13.7,3.8l-2.3,1.6v-92c0-64,0.1-92.3,0.5-93.2c0.3-0.7,0.9-1.8,1.5-2.4c1.9-2,3.2-2.3,12-2.4h8.2L54.2,109.5L54.2,109.5z M220.5,18.5c0.7,0.5,1.7,1.5,2.2,2.2l1,1.2l0.1,89.9l0.1,89.9h-81.2H61.6v-92.2V17.3l78.8,0.1C219.2,17.5,219.3,17.5,220.5,18.5z M216.5,223.9v14.8l-86.8-0.1l-86.8-0.1l-2.3-1.1c-8.2-4.1-11-14-6-21.6c1.8-2.6,4.9-5,7.8-5.9c1.5-0.5,19.2-0.6,88-0.6l86.1,0L216.5,223.9L216.5,223.9z>/path> !-- Text lines with enhanced brightness --> path dM92.3,62.7c-0.7,0.7-1.2,1.7-1.2,2.5c0,0.9,0.4,1.8,1.2,2.5l1.1,1.2h23.6h23.6l1.1-1.2c0.7-0.7,1.2-1.7,1.2-2.5c0-0.9-0.4-1.8-1.2-2.5l-1.1-1.2h-23.6H93.4L92.3,62.7z opacity0.85 classtext-slate-300>/path> path dM92.3,84.8c-0.7,0.7-1.2,1.7-1.2,2.5c0,0.9,0.4,1.8,1.2,2.5l1.1,1.2h49.4h49.4l1.1-1.2c0.7-0.7,1.2-1.7,1.2-2.5s-0.4-1.8-1.2-2.5l-1.1-1.2h-49.4H93.4L92.3,84.8z opacity0.85 classtext-slate-300>/path> path dM92.3,107c-0.7,0.7-1.2,1.7-1.2,2.5c0,0.9,0.4,1.8,1.2,2.5l1.1,1.2h36.5h36.5l1.1-1.2c0.7-0.7,1.2-1.7,1.2-2.5c0-0.9-0.4-1.8-1.2-2.5l-1.1-1.2h-36.5H93.4L92.3,107z opacity0.85 classtext-slate-300>/path> /svg> !-- Moon and stars --> div classabsolute inset-0> !-- Crescent moon with very subtle glow --> div classabsolute top-1.5 right-2 w-2 h-2 bg-blue-200 rounded-full shadow-0_0_3px_rgba(191,219,254,0.4)>/div> div classabsolute top-1.5 right-2.5 w-1.5 h-1.5 bg-slate-700 rounded-full>/div> !-- Twinkling stars with varied timing --> div classabsolute top-2 left-2 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-duration: 1.5s;>/div> div classabsolute bottom-2 left-3 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-delay: 0.3s; animation-duration: 2s;>/div> div classabsolute bottom-3 right-3 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-delay: 0.7s; animation-duration: 1.8s;>/div> div classabsolute top-3 left-4 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-delay: 1s; animation-duration: 2.2s;>/div> /div> /div> /div> /button> /div> div>/div> /div> !-- Mobile controls --> div classmd:hidden flex items-center gap-3> !-- Book-themed Toggle -->button idthemeToggle classrelative w-16 h-10 bg-gradient-to-br from-amber-100 to-amber-200 dark:from-slate-700 dark:to-slate-800 rounded-sm shadow-sm hover:shadow-md transition-all duration-300 focus:outline-none focus:ring-1 focus:ring-accent-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 w-12 h-9> span classsr-only>Toggle reading mode/span> !-- Light Mode: Open Book - hidden in dark mode, visible in light --> div idlightMode classabsolute inset-0 opacity-100 dark:opacity-0 scale-100 dark:scale-95> div classw-full h-full flex items-center justify-center> !-- Book icon with enhanced styling --> svg classw-1.6rem h-1.6rem text-amber-800 fillcurrentColor viewBox0 0 24 24> !-- Left page with gradient effect (rotated 180°) --> path dM3 6 L3 18 L11 20 L11 8 Z fillurl(#pageGradient) strokecurrentColor stroke-width0.6>/path> !-- Right page with gradient effect (rotated 180°) --> path dM13 8 L13 20 L21 18 L21 6 Z fillurl(#pageGradient) strokecurrentColor stroke-width0.6>/path> !-- Center binding with emphasis (aligned with rotated pages) --> line x112 y18 x212 y220 strokecurrentColor stroke-width1.2>/line> !-- Page lines left with better visibility --> line x15 y111 x29 y211.5 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x15 y113 x29 y213.5 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x15 y115 x28 y215.3 strokecurrentColor stroke-width0.4 opacity0.7>/line> !-- Page lines right with better visibility --> line x115 y111.5 x219 y211 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x115 y113.5 x219 y213 strokecurrentColor stroke-width0.4 opacity0.7>/line> line x116 y115.3 x219 y215 strokecurrentColor stroke-width0.4 opacity0.7>/line> !-- Gradient definition for pages --> defs> linearGradient idpageGradient x10% y10% x20% y2100%> stop offset0% stylestop-color:#fefce8;stop-opacity:1>/stop> stop offset100% stylestop-color:#fef3c7;stop-opacity:1>/stop> /linearGradient> /defs> /svg> !-- Enhanced sun rays with glow and varied animation --> div classabsolute inset-0> !-- Primary rays (longer) --> div classabsolute top-0.5 left-1/2 w-0.5 h-2 bg-gradient-to-b from-yellow-300 to-yellow-500 rounded-full transform -translate-x-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-duration: 1.5s;>/div> div classabsolute top-1/2 right-0 w-2 h-0.5 bg-gradient-to-r from-yellow-300 to-yellow-500 rounded-full transform -translate-y-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.2s; animation-duration: 1.5s;>/div> div classabsolute bottom-0.5 left-1/2 w-0.5 h-2 bg-gradient-to-t from-yellow-300 to-yellow-500 rounded-full transform -translate-x-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.4s; animation-duration: 1.5s;>/div> div classabsolute top-1/2 left-0 w-2 h-0.5 bg-gradient-to-l from-yellow-300 to-yellow-500 rounded-full transform -translate-y-1/2 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.6s; animation-duration: 1.5s;>/div> !-- Secondary rays (diagonal, shorter) --> div classabsolute top-1 right-1.5 w-0.5 h-1.5 bg-gradient-to-b from-yellow-400 to-amber-400 rounded-full transform rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.1s; animation-duration: 1.8s;>/div> div classabsolute bottom-1 right-1.5 w-0.5 h-1.5 bg-gradient-to-t from-yellow-400 to-amber-400 rounded-full transform -rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.3s; animation-duration: 1.8s;>/div> div classabsolute bottom-1 left-1.5 w-0.5 h-1.5 bg-gradient-to-t from-yellow-400 to-amber-400 rounded-full transform rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.5s; animation-duration: 1.8s;>/div> div classabsolute top-1 left-1.5 w-0.5 h-1.5 bg-gradient-to-b from-yellow-400 to-amber-400 rounded-full transform -rotate-45 animate-pulse shadow-sm shadow-yellow-400 styleanimation-delay: 0.7s; animation-duration: 1.8s;>/div> /div> /div> /div> !-- Dark Mode: Closed Book with Moon - visible in dark mode --> div iddarkMode classabsolute inset-0 opacity-0 dark:opacity-100 scale-95 dark:scale-100> div classw-full h-full flex items-center justify-center> !-- Closed book icon with enhanced dark mode styling --> svg classw-1.35rem h-1.35rem text-slate-100 drop-shadow-0_0_4px_rgba(148,163,184,0.5) fillcurrentColor viewBox0 0 256 256 strokecurrentColor stroke-width4> !-- Main book outline with subtle glow effect --> path dM35,10.8c-3.5,1.2-6,3-7.6,5.5c-2.9,4.6-2.7-3-2.7,108c0,65.5,0.2,102.2,0.5,103.8c1.6,8.4,9,15.9,17.5,17.5c1.6,0.3,33.8,0.5,94.4,0.5H229l1.1-1.2c1.5-1.5,1.5-3.6,0-5.1c-0.9-1-1.6-1.2-3.7-1.2h-2.5v-14.7v-14.7l1.7-0.3c2.1-0.4,5.1-3.4,5.5-5.4c0.1-0.8,0.2-42.3,0.1-92.1l-0.1-90.6l-1.6-2.9c-1.8-3.4-3.4-4.8-7-6.5l-2.5-1.2L128.7,10C41.9,9.9,37.3,9.9,35,10.8z M54.2,109.5v92.1l-6.1,0.2c-6.8,0.3-9.6,1.1-13.7,3.8l-2.3,1.6v-92c0-64,0.1-92.3,0.5-93.2c0.3-0.7,0.9-1.8,1.5-2.4c1.9-2,3.2-2.3,12-2.4h8.2L54.2,109.5L54.2,109.5z M220.5,18.5c0.7,0.5,1.7,1.5,2.2,2.2l1,1.2l0.1,89.9l0.1,89.9h-81.2H61.6v-92.2V17.3l78.8,0.1C219.2,17.5,219.3,17.5,220.5,18.5z M216.5,223.9v14.8l-86.8-0.1l-86.8-0.1l-2.3-1.1c-8.2-4.1-11-14-6-21.6c1.8-2.6,4.9-5,7.8-5.9c1.5-0.5,19.2-0.6,88-0.6l86.1,0L216.5,223.9L216.5,223.9z>/path> !-- Text lines with enhanced brightness --> path dM92.3,62.7c-0.7,0.7-1.2,1.7-1.2,2.5c0,0.9,0.4,1.8,1.2,2.5l1.1,1.2h23.6h23.6l1.1-1.2c0.7-0.7,1.2-1.7,1.2-2.5c0-0.9-0.4-1.8-1.2-2.5l-1.1-1.2h-23.6H93.4L92.3,62.7z opacity0.85 classtext-slate-300>/path> path dM92.3,84.8c-0.7,0.7-1.2,1.7-1.2,2.5c0,0.9,0.4,1.8,1.2,2.5l1.1,1.2h49.4h49.4l1.1-1.2c0.7-0.7,1.2-1.7,1.2-2.5s-0.4-1.8-1.2-2.5l-1.1-1.2h-49.4H93.4L92.3,84.8z opacity0.85 classtext-slate-300>/path> path dM92.3,107c-0.7,0.7-1.2,1.7-1.2,2.5c0,0.9,0.4,1.8,1.2,2.5l1.1,1.2h36.5h36.5l1.1-1.2c0.7-0.7,1.2-1.7,1.2-2.5c0-0.9-0.4-1.8-1.2-2.5l-1.1-1.2h-36.5H93.4L92.3,107z opacity0.85 classtext-slate-300>/path> /svg> !-- Moon and stars --> div classabsolute inset-0> !-- Crescent moon with very subtle glow --> div classabsolute top-1.5 right-2 w-2 h-2 bg-blue-200 rounded-full shadow-0_0_3px_rgba(191,219,254,0.4)>/div> div classabsolute top-1.5 right-2.5 w-1.5 h-1.5 bg-slate-700 rounded-full>/div> !-- Twinkling stars with varied timing --> div classabsolute top-2 left-2 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-duration: 1.5s;>/div> div classabsolute bottom-2 left-3 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-delay: 0.3s; animation-duration: 2s;>/div> div classabsolute bottom-3 right-3 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-delay: 0.7s; animation-duration: 1.8s;>/div> div classabsolute top-3 left-4 w-0.5 h-0.5 bg-blue-200 rounded-full animate-pulse styleanimation-delay: 1s; animation-duration: 2.2s;>/div> /div> /div> /div> /button> button typebutton classtext-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 aria-labelToggle menu idtoggle-menu> svg xmlnshttp://www.w3.org/2000/svg fillnone viewBox0 0 24 24 strokecurrentColor classh-6 w-6> path stroke-linecapround stroke-linejoinround stroke-width2 dM4 6h16M4 12h16m-7 6h7>/path> /svg> /button> /div> /div> !-- Mobile menu (hidden by default) --> div classhidden md:hidden pt-4 pb-2 absolute left-0 right-0 bg-#faf9f7 dark:bg-accent-950 border-b border-academy-100 dark:border-accent-800 idmobile-menu> div classcontainer max-w-6xl mx-auto px-2 sm:px-6 lg:px-8 space-y-2> div classmb-4 flex justify-between items-center> div classrelative w-full max-w-6xl mx-auto md:w-auto md:max-w-none md:mx-0 data-search-index-path/search-index.json x-data{ isOpen: false, searchQuery: , isExpanded: false, results: , fuse: null, documents: , loading: true, error: false, hasSearched: false, isSafari: /^((?!chrome|android).)*safari/i.test(navigator.userAgent), rumDebounceTimer: null, lastSentQuery: , async init() { // Dont load search index on init - wait for user interaction this.loading false; }, async loadSearchIndex() { // Lazy load search index only when user interacts with search if (this.fuse || this.loading) return; // Already loaded or loading this.loading true; try { // Wait for Fuse.js to be available await this.waitForFuse(); // Get search index path from data attribute (handles preview base paths) const searchIndexPath this.$el.dataset.searchIndexPath || /search-index.json; // Fetch pre-built search index (cached by CloudFront for 30 days) // Use retry logic with exponential backoff for reliability const response await this.fetchWithRetry(searchIndexPath); if (!response.ok) { throw new Error(`Failed to load search index: ${response.status}`); } const indexData await response.json(); // Hydrate Fuse.js from pre-built index (FAST - ~10ms vs 50ms) const fuseIndex Fuse.parseIndex(indexData.index); this.documents indexData.documents; // Create Fuse instance with pre-built index this.fuse new Fuse( this.documents, { keys: { name: title, weight: 0.4 }, { name: author, weight: 0.3 }, { name: series, weight: 0.2 }, { name: genre, weight: 0.1 } , threshold: 0.3, includeScore: true }, fuseIndex ); this.loading false; } catch (error) { // Enhanced error logging with context for debugging const searchIndexPath this.$el.dataset.searchIndexPath || /search-index.json; console.error(Failed to load search index:, { error: error.message, browser: navigator.userAgent, isSafari: this.isSafari, url: searchIndexPath, timestamp: new Date().toISOString() }); this.loading false; this.error true; } }, waitForFuse() { return new Promise((resolve, reject) > { // Check if Fuse is already loaded if (typeof Fuse ! undefined) { resolve(); return; } // Wait for Fuse to load (max 5 seconds) const checkInterval 50; const maxAttempts 100; // 5 seconds let attempts 0; const interval setInterval(() > { attempts++; if (typeof Fuse ! undefined) { clearInterval(interval); resolve(); } else if (attempts > maxAttempts) { clearInterval(interval); reject(new Error(Fuse.js failed to load)); } }, checkInterval); }); }, async fetchWithTimeout(url, options {}, timeout 10000) { const controller new AbortController(); const id setTimeout(() > controller.abort(), timeout); try { const response await fetch(url, { ...options, signal: controller.signal }); clearTimeout(id); return response; } catch (error) { clearTimeout(id); if (error.name AbortError) { throw new Error(Request timeout - search index took too long to load); } throw error; } }, async fetchWithRetry(url, retries 3, baseDelay 1000) { for (let i 0; i retries; i++) { try { // Use fetchWithTimeout instead of raw fetch const response await this.fetchWithTimeout(url, {}, 10000); if (response.ok) { return response; } // If not the last attempt and got a server error, retry with exponential backoff if (i retries - 1 && response.status > 500) { const delay baseDelay * Math.pow(2, i); // Exponential: 1s, 2s, 4s console.warn(`Search index fetch failed (${response.status}), retrying in ${delay}ms...`); await new Promise(resolve > setTimeout(resolve, delay)); continue; } return response; } catch (error) { // Network error or timeout - retry if not the last attempt if (i retries - 1) { const delay baseDelay * Math.pow(2, i); // Exponential: 1s, 2s, 4s console.warn(`Search index fetch attempt ${i + 1} failed, retrying in ${delay}ms...`, error.message); await new Promise(resolve > setTimeout(resolve, delay)); continue; } throw error; } } }, search() { if (!this.fuse || this.searchQuery.length 2) { this.results ; this.hasSearched false; return; } // Fuzzy search with typo tolerance const fuseResults this.fuse.search(this.searchQuery); this.results fuseResults.slice(0, 8).map(r > r.item); this.hasSearched true; // Debounce RUM tracking - only send after user stops typing for 1200ms clearTimeout(this.rumDebounceTimer); this.rumDebounceTimer setTimeout(() > { // Track search analytics (with GDPR consent) - only if query changed if (this.lastSentQuery ! this.searchQuery && window.datadogRum && window.ConsentManager && window.ConsentManager.hasConsent(analytics)) { this.lastSentQuery this.searchQuery; // Update last sent query window.datadogRum.addAction(search_performed, { search_query: this.searchQuery, results_count: this.results.length, page_path: window.location.pathname, search_type: global }); // Track zero results (content gaps) if (this.results.length 0) { window.datadogRum.addAction(search_zero_results, { search_query: this.searchQuery, page_path: window.location.pathname, search_type: global }); } } }, 1200); }, async toggleSearch() { this.isExpanded !this.isExpanded; if (this.isExpanded) { // Lazy load search index when user opens search await this.loadSearchIndex(); setTimeout(() > { document.getElementById(global-search-desktop)?.focus(); }, 100); } else { this.clearSearch(); } }, clearSearch() { this.searchQuery ; this.results ; this.isOpen false; this.isExpanded false; this.hasSearched false; }, // Navigate to search page when Enter is pressed jumpToSearch() { if (this.searchQuery.trim()) { window.location.href `/search/?q${encodeURIComponent(this.searchQuery.trim())}`; } } } @click.awayclearSearch() x-initinit()> !-- Mobile Search Bar --> div classblock md:hidden relative w-full> input typesearch idglobal-search-mobile nameglobal-search-mobile autocompleteoff x-modelsearchQuery @input.debounce.300mssearch @keydown.enterjumpToSearch() @focusisOpen true; loadSearchIndex() @blurif (searchQuery.length 0) isOpen false :disabledloading :placeholderloading ? Loading search... : Search books, authors, series... classw-full px-4 py-2 text-base rounded-lg border border-academy-200 dark:border-accent-800 bg-white dark:bg-accent-900 text-rich-black-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-accent-500 dark:focus:ring-accent-600 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed &::-webkit-search-cancel-button:hidden &::-webkit-search-decoration:hidden> button typebutton classabsolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 @clickclearSearch() x-showsearchQuery x-cloak aria-labelClear search> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 fillnone viewBox0 0 24 24 strokecurrentColor> path stroke-linecapround stroke-linejoinround stroke-width2 dM6 18L18 6M6 6l12 12>/path> /svg> /button> /div> !-- Desktop Search (Collapsible) --> div classhidden md:block> template x-if!isExpanded> !-- Search Icon (Collapsed State) --> button typebutton classflex items-center justify-center h-9 w-9 text-gray-600 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-400 border border-transparent hover:bg-gray-100 dark:hover:bg-accent-950 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed @clicktoggleSearch :disabledloading aria-labelSearch> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 fillnone viewBox0 0 24 24 strokecurrentColor> path stroke-linecapround stroke-linejoinround stroke-width2 dM21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z>/path> /svg> /button> /template> template x-ifisExpanded> !-- Search Input (Expanded State) --> div classrelative w-56 x-transition:entertransition-all ease-out duration-200 x-transition:enter-startopacity-0 scale-95 x-transition:enter-endopacity-100 scale-100 x-transition:leavetransition-all ease-in duration-150 x-transition:leave-startopacity-100 scale-100 x-transition:leave-endopacity-0 scale-95> input idglobal-search-desktop nameglobal-search-desktop typesearch autocompleteoff x-modelsearchQuery @input.debounce.300mssearch @keydown.enterjumpToSearch() @focusisOpen true @blurif (searchQuery.length 0) isOpen false :disabledloading :placeholderloading ? Loading... : Search books, authors, series... classw-full pl-4 pr-10 py-2 text-sm rounded-lg border border-academy-200 dark:border-accent-800 bg-white dark:bg-accent-900 text-rich-black-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-accent-500 dark:focus:ring-accent-600 focus:border-transparent disabled:opacity-50 disabled:cursor-not-allowed &::-webkit-search-cancel-button:hidden &::-webkit-search-decoration:hidden> !-- Close Button --> button typebutton classabsolute right-3 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 @clicktoggleSearch aria-labelClose search> svg xmlnshttp://www.w3.org/2000/svg classh-4 w-4 fillnone viewBox0 0 24 24 strokecurrentColor> path stroke-linecapround stroke-linejoinround stroke-width2 dM6 18L18 6M6 6l12 12>/path> /svg> /button> /div> /template> /div> !-- Search Results Dropdown --> div x-showisOpen && results.length > 0 x-cloak x-transition:entertransition ease-out duration-200 x-transition:enter-startopacity-0 transform scale-95 x-transition:enter-endopacity-100 transform scale-100 x-transition:leavetransition ease-in duration-100 x-transition:leave-startopacity-100 transform scale-100 x-transition:leave-endopacity-0 transform scale-95 classabsolute z-50 mt-2 w-74 md:w-80 rounded-lg shadow-lg bg-white dark:bg-accent-900 ring-1 ring-black ring-opacity-5 max-h-96 overflow-y-auto right-0> div classpy-2 rolemenu aria-orientationvertical> template x-forresult in results :keyresult.slug> a :href`/reviews/${result.slug}/` classflex gap-3 px-3 py-2 hover:bg-gray-50 dark:hover:bg-accent-800 transition rolemenuitem> !-- Book Cover Thumbnail --> img :src`https://assets.bromantasy.com/${result.coverImage}` :alt`${result.title} cover` classw-16 h-24 object-cover rounded shadow flex-shrink-0 loadinglazy> !-- Book Info --> div classmin-w-0 flex-grow> h4 classfont-semibold text-base truncate text-rich-black-900 dark:text-gray-100 x-textresult.title>/h4> p classtext-sm text-gray-600 dark:text-gray-400 truncate x-textresult.author>/p> !-- Rating & Spice --> div classflex flex-col gap-1 mt-1 text-sm font-bold> div classgrid grid-cols-2 gap-1.5 w-full min-w-full> span classflex items-center min-w-fit x-showresult.rating> span x-text`${⭐.repeat(Math.floor(result.rating))} ${result.rating}/5`>/span> /span> span classflex items-center x-showresult.spiceLevel > 0> span x-text`${🌶️.repeat(result.spiceLevel)} ${result.spiceLevel}/5`>/span> /span> /div> div classgrid grid-cols-2 gap-1 w-full min-w-full> span classflex items-center min-w-fit x-showresult.spiceLevel > 0> span x-text`${💀.repeat(result.darknessLevel)} ${result.darknessLevel}/5`>/span> /span> span classflex items-center min-w-fit x-showresult.uncomfortableLevel > 0> span x-text`${😳.repeat(result.uncomfortableLevel)} ${result.uncomfortableLevel}/5`>/span> /span> /div> /div> /div> /a> /template> /div> /div> !-- No Results Message --> div x-showisOpen && !loading && hasSearched && searchQuery.length > 2 && results.length 0 x-cloak x-transition:entertransition ease-out duration-200 x-transition:enter-startopacity-0 transform scale-95 x-transition:enter-endopacity-100 transform scale-100 x-transition:leavetransition ease-in duration-100 x-transition:leave-startopacity-100 transform scale-100 x-transition:leave-endopacity-0 transform scale-95 classabsolute z-50 mt-2 w-74 md:w-80 rounded-lg shadow-lg bg-white dark:bg-accent-900 ring-1 ring-black ring-opacity-5 right-0> div classpx-4 py-3 text-sm text-gray-500 dark:text-gray-400>No results found for span x-textsearchQuery>/span>/div> /div> !-- Error Message --> div x-showerror x-cloak classabsolute z-50 mt-2 w-74 md:w-80 rounded-lg shadow-lg bg-red-50 dark:bg-red-900 ring-1 ring-red-500 ring-opacity-20 right-0> div classpx-4 py-3 text-sm text-red-700 dark:text-red-200> template x-ifisSafari> p>Search is temporarily unavailable. Please try refreshing the page or use the site navigation to find reviews./p> /template> template x-if!isSafari> p>Failed to load search. Please refresh the page./p> /template> /div> /div> /div> !-- Load Fuse.js from CDN --> /div> a href/ data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_links data-dd-link-textHome classblock py-2 font-medium text-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-sans text-sm uppercase tracking-wide> Home /a>a href/reviews/ data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_links data-dd-link-textReviews classblock py-2 font-medium text-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-sans text-sm uppercase tracking-wide> Reviews /a>div classspace-y-1> div classpy-2 font-medium text-accent-700 dark:text-gray-300 font-sans text-sm uppercase tracking-wide border-b border-gray-200 dark:border-accent-700> Discover /div> a href/community-book-awards/ classblock py-2 pl-4 text-sm text-accent-600 dark:text-gray-400 hover:text-accent-600 dark:hover:text-accent-500 data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textAwards> Awards /a>a href/series/ classblock py-2 pl-4 text-sm text-accent-600 dark:text-gray-400 hover:text-accent-600 dark:hover:text-accent-500 data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textSeries> Series /a>a href/indie-books/ classblock py-2 pl-4 text-sm text-accent-600 dark:text-gray-400 hover:text-accent-600 dark:hover:text-accent-500 data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textIndie Books> Indie Books /a>a href/lists/ classblock py-2 pl-4 text-sm text-accent-600 dark:text-gray-400 hover:text-accent-600 dark:hover:text-accent-500 data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textReading Lists> Reading Lists /a>a href/cover-reveals/ classblock py-2 pl-4 text-sm text-accent-600 dark:text-gray-400 hover:text-accent-600 dark:hover:text-accent-500 data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_dropdown data-dd-link-typediscover data-dd-dropdown-item-textCover Reveals> Cover Reveals /a> /div>a href/about/ data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_links data-dd-link-textAbout classblock py-2 font-medium text-accent-700 dark:text-gray-300 hover:text-accent-600 dark:hover:text-accent-500 font-sans text-sm uppercase tracking-wide> About /a> div classpt-2> a href/contact/ classblock py-2 px-4 bg-accent-600 hover:bg-accent-700 text-white font-medium text-sm rounded text-center transition-colors data-dd-interaction-nameheader_link_click_mobile data-dd-sectionheader_links data-dd-link-textContact> Contact /a> /div> /div> /div> /div> /header> script typeapplication/ld+json> { @context: https://schema.org, @type: WebSite, url: https://bromantasy.com, potentialAction: { @type: SearchAction, target: { @type: EntryPoint, urlTemplate: https://bromantasy.com/reviews?q{search_term_string} } } }/script> script typemodule>function e(){const edocument.getElementById(toggle-menu),tdocument.getElementById(mobile-menu);if(e&&t&&e.parentNode){const ne.cloneNode(!0);e.parentNode.replaceChild(n,e),n.addEventListener(click,e>{e.stopPropagation(),t.classList.toggle(hidden)}),document.addEventListener(click,e>{const de.target,at.contains(d),on.contains(d);a||o||t.classList.contains(hidden)||t.classList.add(hidden)});t.querySelectorAll(a).forEach(e>{e.addEventListener(click,()>{t.classList.add(hidden)})})}}document.addEventListener(astro:page-load,e),document.addEventListener(astro:after-swap,e);//# sourceMappingURLHeader.astro_astro_type_script_index_0_lang.D-Gxas5a.js.map/script> main data-astro-cid-j7pv25f6> div classrelative w-full overflow-hidden data-astro-cid-wo5jh4o7> !-- Background image --> div classabsolute inset-0 w-full h-full data-astro-cid-wo5jh4o7> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/page/bromantasy-hero-1024.webp srcsethttps://assets.bromantasy.com/page/bromantasy-hero-320.webp 320w, https://assets.bromantasy.com/page/bromantasy-hero-375.webp 375w, https://assets.bromantasy.com/page/bromantasy-hero-414.webp 414w, https://assets.bromantasy.com/page/bromantasy-hero-480.webp 480w, https://assets.bromantasy.com/page/bromantasy-hero-600.webp 600w, https://assets.bromantasy.com/page/bromantasy-hero-768.webp 768w, https://assets.bromantasy.com/page/bromantasy-hero-1024.webp 1024w, https://assets.bromantasy.com/page/bromantasy-hero-1200.webp 1200w, https://assets.bromantasy.com/page/bromantasy-hero-1366.webp 1366w, https://assets.bromantasy.com/page/bromantasy-hero-1920.webp 1920w altBackground for For the Character First Fantasy Reader width1200 height512 classw-full h-full object-cover loadingeager fetchpriorityhigh sizes100vw styleobject-fit: fill; object-position: center; data-image-componenttrue> !-- Overlay - using a combined approach with both the style and additional gradient --> div classabsolute inset-0 stylebackground-color: rgba(28, 31, 46, 0.85); data-astro-cid-wo5jh4o7>/div> div classabsolute inset-0 bg-gradient-to-b from-accent-900/30 to-rich-black-900/20 data-astro-cid-wo5jh4o7>/div> /div> !-- Content --> div classrelative z-10 container mx-auto px-4 py-16 md:py-24 flex flex-col items-center justify-center text-center text-white data-astro-cid-wo5jh4o7> h1 classtext-3xl md:text-4xl lg:text-5xl font-bold mb-4 text-shadow-xl data-astro-cid-wo5jh4o7>For the Character First Fantasy Reader/h1> p classtext-xl md:text-2xl max-w-3xl text-shadow-lg data-astro-cid-wo5jh4o7>Deep, flawed, morally gray characters are what make great stories. We review epic fantasy and sci-fi, and bridge the gap to the romantasy worth your time. Honest, male-perspective reviews with a no-BS spice level guide./p> p classtext-lg text-white/90 max-w-3xl mx-auto italic my-2 data-astro-cid-j7pv25f6>Wondering if a fan of strong data-astro-cid-j7pv25f6>Joe Abercrombies/strong> morally gray heroes could enjoy strong data-astro-cid-j7pv25f6>Sarah J. Maas/strong>? Youre in the right place. Our reviews bridge the gap by focusing on great characters first./p> div classflex flex-wrap justify-center gap-4 mb-12 mt-8 data-astro-cid-j7pv25f6> a href/rating-system/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-accent-600 text-white hover:bg-accent-700 focus:ring-accent-500 border border-accent-600 hover:border-accent-700 text-base px-6 py-3 font-sans tracking-wide bg-accent-600 hover:bg-accent-700 text-white border-accent-500 font-bold data-dd-interaction-namehomepage_rating_guide_click data-dd-interaction-valuerating-system data-astro-cid-j7pv25f6true> span classflex items-center data-astro-cid-j7pv25f6>🌶️ Complete Rating Guide/span> /a> a href/reviews/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth text-accent-600 border border-accent-600 hover:bg-accent-50 dark:hover:bg-rich-black-900 dark:text-accent-400 dark:border-accent-500 focus:ring-accent-500 text-base px-6 py-3 font-sans tracking-wide bg-brand-navy/60 border-white/90 hover:bg-brand-navy/90 font-semibold data-dd-interaction-namehomepage_browse_reviews_click data-dd-interaction-valuereviews data-astro-cid-j7pv25f6true>Browse Reviews/a> /div> div classgrid grid-cols-1 md:grid-cols-3 gap-4 lg:gap-6 max-w-4xl mx-auto data-astro-cid-j7pv25f6> div classbg-white/90 dark:bg-brand-charcoal/90 p-5 rounded-lg shadow-lg backdrop-blur-sm flex flex-col items-center justify-evenly data-astro-cid-j7pv25f6> div classtext-accent-600 dark:text-accent-400 mb-2 text-3xl aria-hiddentrue data-astro-cid-j7pv25f6>🏰/div> h2 classfont-bold text-lg mb-2 text-rich-black-900 dark:text-white data-astro-cid-j7pv25f6>Epic Story Analysis/h2> p classtext-rich-black-800 dark:text-gray-200 data-astro-cid-j7pv25f6>In-depth breakdowns of world-building, characters, plot, and pacing./p> /div> div classbg-white/90 dark:bg-brand-charcoal/90 p-5 rounded-lg shadow-lg backdrop-blur-sm flex flex-col items-center justify-evenly data-astro-cid-j7pv25f6> div classtext-accent-600 dark:text-accent-400 mb-2 text-3xl aria-hiddentrue data-astro-cid-j7pv25f6>⚖️/div> h2 classfont-bold text-lg mb-2 text-rich-black-900 dark:text-white data-astro-cid-j7pv25f6>An Honest, Male Perspective/h2> p classtext-rich-black-800 dark:text-gray-200 data-astro-cid-j7pv25f6>Straightforward reviews that bridge the gap between genres by focusing on what makes a story great./p> /div> div classbg-white/90 dark:bg-brand-charcoal/90 p-5 rounded-lg shadow-lg backdrop-blur-sm flex flex-col items-center justify-evenly data-astro-cid-j7pv25f6> div classtext-accent-600 dark:text-accent-400 mb-2 text-3xl aria-hiddentrue data-astro-cid-j7pv25f6>🌶️/div> h2 classfont-bold text-lg mb-2 text-rich-black-900 dark:text-white data-astro-cid-j7pv25f6>The No-BS Rating Guide/h2> p classtext-rich-black-800 dark:text-gray-200 data-astro-cid-j7pv25f6>Our unique system includes spice, darkness, and public reading comfort so you always know what youre getting into./p> /div> /div> /div> /div> section classpt-8 pb-4 max-w-4xl mx-auto px-4 data-astro-cid-j7pv25f6> div idvault-promo-banner classannouncement-banner rounded-lg p-5 mb-6 dark:bg-gradient-to-br dark:from-accent-700 dark:via-accent-800 dark:to-brand-navy bg-gradient-to-r from-accent-200 via-accent-300 to-accent-200 shadow-pop-lg transition-all duration-200 data-astro-cid-zc47wvwf> !-- Dismiss Button --> !-- Banner Content --> div classflex flex-col sm:flex-row items-center sm:justify-between gap-2 font-display data-astro-cid-zc47wvwf> !-- Text Content --> div classflex flex-col items-center sm:items-start min-w-0 data-astro-cid-zc47wvwf> h3 classtext-lg font-bold text-accent-900 dark:text-white drop-shadow-md dark:drop-shadow-md data-astro-cid-zc47wvwf> 🏆 2025 Community Book Awards! /h3> p classtext-sm text-accent-800 dark:text-white/90 mt-1 text-center sm:text-left drop-shadow-sm dark:drop-shadow-sm data-astro-cid-zc47wvwf> Join us in celebrating the best of books, indie, and the community that loves them /p> /div> !-- CTA Link --> div classflex text-sm sm:text-base flex-shrink-0 flex-col sm:items-end items-center mt-2 sm:mt-0 data-astro-cid-zc47wvwf> a data-dd-interaction-nameannouncement_banner_cta_click data-dd-cta-textNominate Your Favorite Books href/community-book-awards/ classflex gap-1 font-bold text-accent-700 dark:text-white/95 hover:text-accent-900 dark:hover:text-accent-300 transition-all duration-200 whitespace-nowrap drop-shadow-sm dark:drop-shadow-sm data-astro-cid-zc47wvwf> Nominate Your Favorite Books span data-astro-cid-zc47wvwf>⇒/span> /a> span classtext-xs dark:text-white/75 text-accent-700/75 text-center data-astro-cid-zc47wvwf>Nominations Close Sunday 11/30 at 11:59 PM EST/span> /div> /div> /div> /section> section classpt-8 pb-6 max-w-4xl mx-auto px-4 text-center data-astro-cid-j7pv25f6> h2 classtext-3xl font-bold sm:text-4xl font-display mb-4>Its All About the Story./h2> p classtext-xl text-rich-black-700 dark:text-gray-300 mb-6 font-serif data-astro-cid-j7pv25f6>Were strong classfont-bold data-astro-cid-j7pv25f6>story first readers/strong> at our core. We believe a great book is defined by its compelling characters, high stakes plot, and immersive worlds, not by its genre label./p> p classtext-lg text-rich-black-700 dark:text-gray-300 mb-8 data-astro-cid-j7pv25f6>Thats why were comfortable comparing strong data-astro-cid-j7pv25f6>Pierce Brown/strong> to strong data-astro-cid-j7pv25f6>Rebecca Yarros/strong>, or helping a fan of strong data-astro-cid-j7pv25f6>Christopher Ruocchio/strong> decide if a strong data-astro-cid-j7pv25f6>Sarah J. Maas/strong> series is right for them. We bridge the gap by focusing on great storytelling, wherever it may be found./p> /section> section classpb-16 max-w-6xl mx-auto px-4 data-astro-cid-j7pv25f6> section idstart-here classrelative px-3 sm:px-6 pt-4 mb-5 bg-gradient-to-b dark:bg-gradient-to-b dark:from-accent-900/70 dark:via-brand-accent-900/20 dark:to-brand-navy from-accent-100/50 via-accent-100/20 to-#faf9f7 rounded-t-lg border-fade-wrapper data-astro-cid-74uxq5ss> div classmb-6 data-astro-cid-74uxq5ss> h2 classtext-3xl font-bold sm:text-4xl font-display mb-2>Start Your Journey Here/h2> p classtext-rich-black-600 dark:text-gray-400 text-lg data-astro-cid-74uxq5ss>We've handpicked these reviews to prove our story first promise. From 5 star epics that will feel right at home, to the gateway romantasy that's actually worth your time, this is the perfect place to begin./p> /div> !-- Mobile: Horizontal Scroll Carousel --> div classmd:hidden flex overflow-x-auto gap-4 pb-4 snap-x snap-mandatory scrollbar-hide bookshelf-carousel-mobile bookshelf-carousel-start-here data-astro-cid-74uxq5ss> div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugempire-of-the-dawn data-dd-book-titleEmpire of the Dawn data-dd-shelf-position0 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleEmpire of the Dawn data-dd-book-authorJay Kristoff data-dd-book-genreGrimdark Fantasy data-dd-book-subgenres"Dark Fantasy","Vampire Fantasy" data-dd-book-rating4.5 data-dd-book-spice3 data-dd-book-darkness4.5 data-dd-book-discomfort3 data-dd-book-slugempire-of-the-dawn> a href/reviews/empire-of-the-dawn/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/empire-of-the-dawn-1200.webp srcsethttps://assets.bromantasy.com/review/empire-of-the-dawn-320.webp 320w, https://assets.bromantasy.com/review/empire-of-the-dawn-400.webp 400w, https://assets.bromantasy.com/review/empire-of-the-dawn-600.webp 600w, https://assets.bromantasy.com/review/empire-of-the-dawn-800.webp 800w, https://assets.bromantasy.com/review/empire-of-the-dawn-1200.webp 1200w, https://assets.bromantasy.com/review/empire-of-the-dawn-1920.webp 1920w altCover for Empire of the Dawn by Jay Kristoff width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 50%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.50 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Empire of the Dawn/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Jay Kristoff /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>Grimdark royalty: Kristoff's magnum opus finale is brutal, hopeful, and utterly unforgettable/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>4.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Grimdark Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> script typemodule>document.addEventListener(DOMContentLoaded,()>{document.querySelectorAll(.book-cover).forEach(t>{t.addEventListener(error,function(){const tthis.getAttribute(alt)?.split( by )0||,ethis.getAttribute(alt)?.split( by )1||,ldocument.createElement(div);l.classNameabsolute inset-0 h-full w-full flex flex-col items-center justify-center p-4 text-center,l.style.backgroundColorhsl(260, 70%, 25%),l.style.colorwhite,l.innerHTML`\n div classmb-2 text-2xl font-bold>📚/div>\n div classtext-lg font-bold mb-1>${t}/div>\n div classmt-2 text-sm opacity-80>by ${e}/div>\n `,this.parentNode&&this.parentNode.replaceChild(l,this)})})});//# sourceMappingURLBookCard.astro_astro_type_script_index_0_lang.BcEb6j4y.js.map/script> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugthe-strength-of-the-few data-dd-book-titleThe Strength of the Few data-dd-shelf-position1 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleThe Strength of the Few data-dd-book-authorJames Islington data-dd-book-genreEpic Fantasy data-dd-book-subgenres"Political Fantasy" data-dd-book-rating5 data-dd-book-spice1 data-dd-book-darkness3.5 data-dd-book-discomfort1.5 data-dd-book-slugthe-strength-of-the-few> a href/reviews/the-strength-of-the-few/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/the-strength-of-the-few-1200.webp srcsethttps://assets.bromantasy.com/review/the-strength-of-the-few-320.webp 320w, https://assets.bromantasy.com/review/the-strength-of-the-few-400.webp 400w, https://assets.bromantasy.com/review/the-strength-of-the-few-600.webp 600w, https://assets.bromantasy.com/review/the-strength-of-the-few-800.webp 800w, https://assets.bromantasy.com/review/the-strength-of-the-few-1200.webp 1200w, https://assets.bromantasy.com/review/the-strength-of-the-few-1920.webp 1920w altCover for The Strength of the Few by James Islington width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 5.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>The Strength of the Few/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by James Islington /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>The best book two ever written, three complete stories in one with jaw dropping twists, intense action, deep character work, and masterful plot weaving/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1.5/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Epic Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugfourth-wing data-dd-book-titleFourth Wing data-dd-shelf-position2 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleFourth Wing data-dd-book-authorRebecca Yarros data-dd-book-genreRomantasy data-dd-book-subgenres"Dragon Fantasy","Military Fantasy" data-dd-book-rating4 data-dd-book-spice3 data-dd-book-darkness3 data-dd-book-discomfort2 data-dd-book-slugfourth-wing> a href/reviews/fourth-wing/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/fourth-wing-1200.webp srcsethttps://assets.bromantasy.com/review/fourth-wing-320.webp 320w, https://assets.bromantasy.com/review/fourth-wing-400.webp 400w, https://assets.bromantasy.com/review/fourth-wing-600.webp 600w, https://assets.bromantasy.com/review/fourth-wing-800.webp 800w, https://assets.bromantasy.com/review/fourth-wing-1200.webp 1200w, https://assets.bromantasy.com/review/fourth-wing-1920.webp 1920w altCover for Fourth Wing by Rebecca Yarros width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Fourth Wing/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Rebecca Yarros /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A thrilling blend of dragon fantasy and romance that delivers despite worldbuilding limitations/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>2/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Romantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugred-rising data-dd-book-titleRed Rising data-dd-shelf-position3 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleRed Rising data-dd-book-authorPierce Brown data-dd-book-genreScience Fiction data-dd-book-subgenres"Trials/Games","Military Sci-Fi" data-dd-book-rating4 data-dd-book-spice1 data-dd-book-darkness4 data-dd-book-discomfort1 data-dd-book-slugred-rising> a href/reviews/red-rising/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/red-rising-1200.webp srcsethttps://assets.bromantasy.com/review/red-rising-320.webp 320w, https://assets.bromantasy.com/review/red-rising-400.webp 400w, https://assets.bromantasy.com/review/red-rising-600.webp 600w, https://assets.bromantasy.com/review/red-rising-800.webp 800w, https://assets.bromantasy.com/review/red-rising-1200.webp 1200w, https://assets.bromantasy.com/review/red-rising-1920.webp 1920w altCover for Red Rising by Pierce Brown width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Red Rising/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Pierce Brown /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A gripping dystopian adventure that transcends its Hunger Games comparisons through sophisticated world-building and moral complexity/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>4/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Science Fiction /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugshadows-upon-time data-dd-book-titleShadows Upon Time data-dd-shelf-position4 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleShadows Upon Time data-dd-book-authorChristopher Ruocchio data-dd-book-genreScience Fiction data-dd-book-subgenres"Space Opera","Cosmic Horror" data-dd-book-rating5 data-dd-book-spice1 data-dd-book-darkness3.5 data-dd-book-discomfort1 data-dd-book-slugshadows-upon-time> a href/reviews/shadows-upon-time/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/shadows-upon-time-1200.webp srcsethttps://assets.bromantasy.com/review/shadows-upon-time-320.webp 320w, https://assets.bromantasy.com/review/shadows-upon-time-400.webp 400w, https://assets.bromantasy.com/review/shadows-upon-time-600.webp 600w, https://assets.bromantasy.com/review/shadows-upon-time-800.webp 800w, https://assets.bromantasy.com/review/shadows-upon-time-1200.webp 1200w, https://assets.bromantasy.com/review/shadows-upon-time-1920.webp 1920w altCover for Shadows Upon Time by Christopher Ruocchio width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 5.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Shadows Upon Time/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Christopher Ruocchio /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>Christoper Ruoccio's magnum opus, a genre defining conclusion that delivers on every promise, weaving plot lines across the series into a cohesive whole, leaving enough room for the possbility of more Sun Eater in the future. Never betraying what was foretold by the narrator Hadrian, while creating just enough room for debate and discussion for years to come/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Science Fiction /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugtusk-love data-dd-book-titleTusk Love data-dd-shelf-position5 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleTusk Love data-dd-book-authorThea Guanzon data-dd-book-genreRomantasy data-dd-book-subgenres"Fantasy Romance" data-dd-book-rating3.75 data-dd-book-spice4 data-dd-book-darkness1 data-dd-book-discomfort3 data-dd-book-slugtusk-love> a href/reviews/tusk-love/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/tusk-love-1200.webp srcsethttps://assets.bromantasy.com/review/tusk-love-320.webp 320w, https://assets.bromantasy.com/review/tusk-love-400.webp 400w, https://assets.bromantasy.com/review/tusk-love-600.webp 600w, https://assets.bromantasy.com/review/tusk-love-800.webp 800w, https://assets.bromantasy.com/review/tusk-love-1200.webp 1200w, https://assets.bromantasy.com/review/tusk-love-1920.webp 1920w altCover for Tusk Love by Thea Guanzon width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadinglazy fetchpriorityauto sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 75%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 3.75 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Tusk Love/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Thea Guanzon /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A delightful cozy romantasy that proves tie-in fiction can achieve genuine heart and quality/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>4/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Romantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugthe-pawns-of-havoc data-dd-book-titleThe Pawns of Havoc data-dd-shelf-position6 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleThe Pawns of Havoc data-dd-book-authorDave Lawson data-dd-book-genreGrimdark Fantasy data-dd-book-subgenres"Fantasy","Prequel" data-dd-book-rating4.5 data-dd-book-spice1 data-dd-book-darkness3 data-dd-book-discomfort1.5 data-dd-book-slugthe-pawns-of-havoc> a href/reviews/the-pawns-of-havoc/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/the-pawns-of-havoc-1200.webp srcsethttps://assets.bromantasy.com/review/the-pawns-of-havoc-320.webp 320w, https://assets.bromantasy.com/review/the-pawns-of-havoc-400.webp 400w, https://assets.bromantasy.com/review/the-pawns-of-havoc-600.webp 600w, https://assets.bromantasy.com/review/the-pawns-of-havoc-800.webp 800w, https://assets.bromantasy.com/review/the-pawns-of-havoc-1200.webp 1200w, https://assets.bromantasy.com/review/the-pawns-of-havoc-1920.webp 1920w altCover for The Pawns of Havoc by Dave Lawson width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadinglazy fetchpriorityauto sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 50%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.50 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> span classbg-purple-600 dark:bg-purple-700 text-white text-xs px-2 py-0.5 rounded-full uppercase tracking-wider font-bold shadow-sm>Novella/span> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>The Pawns of Havoc/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Dave Lawson /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>Grimdark novella format perfected: brutal violence, witty banter, forced proximity romance, and zero wasted pages throughout./p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1.5/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Grimdark Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugred-city data-dd-book-titleRed City data-dd-shelf-position7 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleRed City data-dd-book-authorMarie Lu data-dd-book-genreUrban Fantasy data-dd-book-subgenres"Mystery" data-dd-book-rating4.25 data-dd-book-spice3 data-dd-book-darkness2.5 data-dd-book-discomfort2 data-dd-book-slugred-city> a href/reviews/red-city/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/red-city-1200.webp srcsethttps://assets.bromantasy.com/review/red-city-320.webp 320w, https://assets.bromantasy.com/review/red-city-400.webp 400w, https://assets.bromantasy.com/review/red-city-600.webp 600w, https://assets.bromantasy.com/review/red-city-800.webp 800w, https://assets.bromantasy.com/review/red-city-1200.webp 1200w, https://assets.bromantasy.com/review/red-city-1920.webp 1920w altCover for Red City by Marie Lu width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadinglazy fetchpriorityauto sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 25%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.25 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Red City/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Marie Lu /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A stellar adult fantasy debut with innovative magic, authentic characters, and compelling crime family dynamics creating a unique and engaging read/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>2.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>2/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Urban Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div> /div> !-- Mobile Scroll Indicators --> div classmd:hidden flex justify-center gap-2 mt-4 bookshelf-indicators-container-mobile data-shelf-idstart-here data-astro-cid-74uxq5ss>/div> !-- Desktop: Centered Flex or Horizontal Scroll --> div classhidden md:block data-astro-cid-74uxq5ss> div classrelative data-astro-cid-74uxq5ss> div classflex overflow-x-auto gap-4 pb-4 snap-x snap-mandatory scrollbar-hide bookshelf-carousel-desktop bookshelf-carousel-start-here justify-start data-astro-cid-74uxq5ss> div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugempire-of-the-dawn data-dd-book-titleEmpire of the Dawn data-dd-shelf-position0 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleEmpire of the Dawn data-dd-book-authorJay Kristoff data-dd-book-genreGrimdark Fantasy data-dd-book-subgenres"Dark Fantasy","Vampire Fantasy" data-dd-book-rating4.5 data-dd-book-spice3 data-dd-book-darkness4.5 data-dd-book-discomfort3 data-dd-book-slugempire-of-the-dawn> a href/reviews/empire-of-the-dawn/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/empire-of-the-dawn-1200.webp srcsethttps://assets.bromantasy.com/review/empire-of-the-dawn-320.webp 320w, https://assets.bromantasy.com/review/empire-of-the-dawn-400.webp 400w, https://assets.bromantasy.com/review/empire-of-the-dawn-600.webp 600w, https://assets.bromantasy.com/review/empire-of-the-dawn-800.webp 800w, https://assets.bromantasy.com/review/empire-of-the-dawn-1200.webp 1200w, https://assets.bromantasy.com/review/empire-of-the-dawn-1920.webp 1920w altCover for Empire of the Dawn by Jay Kristoff width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 50%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.50 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Empire of the Dawn/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Jay Kristoff /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>Grimdark royalty: Kristoff's magnum opus finale is brutal, hopeful, and utterly unforgettable/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>4.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Grimdark Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugthe-strength-of-the-few data-dd-book-titleThe Strength of the Few data-dd-shelf-position1 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleThe Strength of the Few data-dd-book-authorJames Islington data-dd-book-genreEpic Fantasy data-dd-book-subgenres"Political Fantasy" data-dd-book-rating5 data-dd-book-spice1 data-dd-book-darkness3.5 data-dd-book-discomfort1.5 data-dd-book-slugthe-strength-of-the-few> a href/reviews/the-strength-of-the-few/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/the-strength-of-the-few-1200.webp srcsethttps://assets.bromantasy.com/review/the-strength-of-the-few-320.webp 320w, https://assets.bromantasy.com/review/the-strength-of-the-few-400.webp 400w, https://assets.bromantasy.com/review/the-strength-of-the-few-600.webp 600w, https://assets.bromantasy.com/review/the-strength-of-the-few-800.webp 800w, https://assets.bromantasy.com/review/the-strength-of-the-few-1200.webp 1200w, https://assets.bromantasy.com/review/the-strength-of-the-few-1920.webp 1920w altCover for The Strength of the Few by James Islington width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 5.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>The Strength of the Few/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by James Islington /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>The best book two ever written, three complete stories in one with jaw dropping twists, intense action, deep character work, and masterful plot weaving/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1.5/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Epic Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugfourth-wing data-dd-book-titleFourth Wing data-dd-shelf-position2 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleFourth Wing data-dd-book-authorRebecca Yarros data-dd-book-genreRomantasy data-dd-book-subgenres"Dragon Fantasy","Military Fantasy" data-dd-book-rating4 data-dd-book-spice3 data-dd-book-darkness3 data-dd-book-discomfort2 data-dd-book-slugfourth-wing> a href/reviews/fourth-wing/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/fourth-wing-1200.webp srcsethttps://assets.bromantasy.com/review/fourth-wing-320.webp 320w, https://assets.bromantasy.com/review/fourth-wing-400.webp 400w, https://assets.bromantasy.com/review/fourth-wing-600.webp 600w, https://assets.bromantasy.com/review/fourth-wing-800.webp 800w, https://assets.bromantasy.com/review/fourth-wing-1200.webp 1200w, https://assets.bromantasy.com/review/fourth-wing-1920.webp 1920w altCover for Fourth Wing by Rebecca Yarros width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Fourth Wing/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Rebecca Yarros /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A thrilling blend of dragon fantasy and romance that delivers despite worldbuilding limitations/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>2/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Romantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugred-rising data-dd-book-titleRed Rising data-dd-shelf-position3 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleRed Rising data-dd-book-authorPierce Brown data-dd-book-genreScience Fiction data-dd-book-subgenres"Trials/Games","Military Sci-Fi" data-dd-book-rating4 data-dd-book-spice1 data-dd-book-darkness4 data-dd-book-discomfort1 data-dd-book-slugred-rising> a href/reviews/red-rising/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/red-rising-1200.webp srcsethttps://assets.bromantasy.com/review/red-rising-320.webp 320w, https://assets.bromantasy.com/review/red-rising-400.webp 400w, https://assets.bromantasy.com/review/red-rising-600.webp 600w, https://assets.bromantasy.com/review/red-rising-800.webp 800w, https://assets.bromantasy.com/review/red-rising-1200.webp 1200w, https://assets.bromantasy.com/review/red-rising-1920.webp 1920w altCover for Red Rising by Pierce Brown width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Red Rising/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Pierce Brown /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A gripping dystopian adventure that transcends its Hunger Games comparisons through sophisticated world-building and moral complexity/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>4/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Science Fiction /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugshadows-upon-time data-dd-book-titleShadows Upon Time data-dd-shelf-position4 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleShadows Upon Time data-dd-book-authorChristopher Ruocchio data-dd-book-genreScience Fiction data-dd-book-subgenres"Space Opera","Cosmic Horror" data-dd-book-rating5 data-dd-book-spice1 data-dd-book-darkness3.5 data-dd-book-discomfort1 data-dd-book-slugshadows-upon-time> a href/reviews/shadows-upon-time/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/shadows-upon-time-1200.webp srcsethttps://assets.bromantasy.com/review/shadows-upon-time-320.webp 320w, https://assets.bromantasy.com/review/shadows-upon-time-400.webp 400w, https://assets.bromantasy.com/review/shadows-upon-time-600.webp 600w, https://assets.bromantasy.com/review/shadows-upon-time-800.webp 800w, https://assets.bromantasy.com/review/shadows-upon-time-1200.webp 1200w, https://assets.bromantasy.com/review/shadows-upon-time-1920.webp 1920w altCover for Shadows Upon Time by Christopher Ruocchio width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadingeager fetchpriorityhigh sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 5.00 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Shadows Upon Time/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Christopher Ruocchio /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>Christoper Ruoccio's magnum opus, a genre defining conclusion that delivers on every promise, weaving plot lines across the series into a cohesive whole, leaving enough room for the possbility of more Sun Eater in the future. Never betraying what was foretold by the narrator Hadrian, while creating just enough room for debate and discussion for years to come/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Science Fiction /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugtusk-love data-dd-book-titleTusk Love data-dd-shelf-position5 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleTusk Love data-dd-book-authorThea Guanzon data-dd-book-genreRomantasy data-dd-book-subgenres"Fantasy Romance" data-dd-book-rating3.75 data-dd-book-spice4 data-dd-book-darkness1 data-dd-book-discomfort3 data-dd-book-slugtusk-love> a href/reviews/tusk-love/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/tusk-love-1200.webp srcsethttps://assets.bromantasy.com/review/tusk-love-320.webp 320w, https://assets.bromantasy.com/review/tusk-love-400.webp 400w, https://assets.bromantasy.com/review/tusk-love-600.webp 600w, https://assets.bromantasy.com/review/tusk-love-800.webp 800w, https://assets.bromantasy.com/review/tusk-love-1200.webp 1200w, https://assets.bromantasy.com/review/tusk-love-1920.webp 1920w altCover for Tusk Love by Thea Guanzon width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadinglazy fetchpriorityauto sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 75%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 3.75 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Tusk Love/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Thea Guanzon /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A delightful cozy romantasy that proves tie-in fiction can achieve genuine heart and quality/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>4/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Romantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugthe-pawns-of-havoc data-dd-book-titleThe Pawns of Havoc data-dd-shelf-position6 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleThe Pawns of Havoc data-dd-book-authorDave Lawson data-dd-book-genreGrimdark Fantasy data-dd-book-subgenres"Fantasy","Prequel" data-dd-book-rating4.5 data-dd-book-spice1 data-dd-book-darkness3 data-dd-book-discomfort1.5 data-dd-book-slugthe-pawns-of-havoc> a href/reviews/the-pawns-of-havoc/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/the-pawns-of-havoc-1200.webp srcsethttps://assets.bromantasy.com/review/the-pawns-of-havoc-320.webp 320w, https://assets.bromantasy.com/review/the-pawns-of-havoc-400.webp 400w, https://assets.bromantasy.com/review/the-pawns-of-havoc-600.webp 600w, https://assets.bromantasy.com/review/the-pawns-of-havoc-800.webp 800w, https://assets.bromantasy.com/review/the-pawns-of-havoc-1200.webp 1200w, https://assets.bromantasy.com/review/the-pawns-of-havoc-1920.webp 1920w altCover for The Pawns of Havoc by Dave Lawson width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadinglazy fetchpriorityauto sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 50%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.50 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> span classbg-purple-600 dark:bg-purple-700 text-white text-xs px-2 py-0.5 rounded-full uppercase tracking-wider font-bold shadow-sm>Novella/span> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>The Pawns of Havoc/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Dave Lawson /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>Grimdark novella format perfected: brutal violence, witty banter, forced proximity romance, and zero wasted pages throughout./p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>1.5/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Grimdark Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div>div classflex-shrink-0 w-240px snap-start data-dd-interaction-nameshelf_book_click data-dd-shelf-idstart-here data-dd-shelf-titleStart Your Journey Here data-dd-book-slugred-city data-dd-book-titleRed City data-dd-shelf-position7 data-astro-cid-74uxq5ss> div classh-full overflow-hidden rounded-md border border-academy-100 dark:border-brand-slate bg-white dark:bg-brand-charcoal shadow-soft transition-all duration-300 hover:shadow-medium relative group data-dd-interaction-namebook_card_click data-dd-book-titleRed City data-dd-book-authorMarie Lu data-dd-book-genreUrban Fantasy data-dd-book-subgenres"Mystery" data-dd-book-rating4.25 data-dd-book-spice3 data-dd-book-darkness2.5 data-dd-book-discomfort2 data-dd-book-slugred-city> a href/reviews/red-city/ classflex flex-col h-full> div classrelative pb-115% sm:pb-125% bg-academy-50 dark:bg-rich-black-800 overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/review/red-city-1200.webp srcsethttps://assets.bromantasy.com/review/red-city-320.webp 320w, https://assets.bromantasy.com/review/red-city-400.webp 400w, https://assets.bromantasy.com/review/red-city-600.webp 600w, https://assets.bromantasy.com/review/red-city-800.webp 800w, https://assets.bromantasy.com/review/red-city-1200.webp 1200w, https://assets.bromantasy.com/review/red-city-1920.webp 1920w altCover for Red City by Marie Lu width600 height900 classbook-cover absolute inset-0 h-full w-full object-cover transition-transform duration-500 group-hover:scale-105 loadinglazy fetchpriorityauto sizes(max-width: 480px) 180px, (max-width: 768px) 240px, (max-width: 1024px) 220px, 280px data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent md:opacity-50 md:group-hover:opacity-100 opacity-0 transition-opacity duration-300>/div> div classabsolute inset-0 bg-gradient-to-t from-black/80 via-black/40 to-transparent opacity-100 md:hidden block>/div> div classabsolute bottom-0 left-0 right-0 sm:p-2 p-0 ml-1 sm:ml-0 text-white transition-transform duration-300> div classinline-block bg-black/70 backdrop-blur-lg py-1 px-1 rounded shadow-md scale-0.85 sm:scale-100 origin-left> div classflex items-center gap-0.5 drop-shadow-0_1px_2px_rgba(0,0,0,0.8)> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg>svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classrelative> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-gray-300 drop-shadow-0_1px_1px_rgba(0,0,0,0.8) viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> div classabsolute inset-0 overflow-hidden stylewidth: 25%> svg xmlnshttp://www.w3.org/2000/svg classh-5 w-5 text-accent-400 dark:drop-shadow-0_1px_1px_rgba(0,0,0,0.8) drop-shadow-none viewBox0 0 20 20 fillcurrentColor> path dM9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.8 2.034a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.54 1.118l-2.8-2.034a1 1 0 00-1.175 0l-2.8 2.034c-.784.57-1.838-.197-1.539-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.98 8.72c-.783-.57-.38-1.81.588-1.81h3.461a1 1 0 00.951-.69l1.07-3.292z>/path> /svg> /div> /div> span classml-1.5 text-accent-400 font-bold drop-shadow-0_1px_1px_rgba(0,0,0,0.8) font-sans text-sm > 4.25 /span> /div> /div> /div> div classabsolute top-0 left-0 m-2 flex flex-col gap-1> /div> /div> div classflex flex-col h-full px-3 pt-2 pb-3> div classflex flex-col flex-grow justify-between gap-3> div classflex flex-col md:justify-evenly justify-start> h3 classsm:text-3xl text-2xl font-bold font-display line-clamp-2 group-hover:text-accent-600 dark:group-hover:text-accent-500 font-bold md:text-2xl>Red City/h3> p classtext-rich-black-700 dark:text-gray-300 font-serif text-sm>by Marie Lu /p> /div> div classborder-l-2 border-accent-400 dark:border-accent-600 pl-2 py-1> p classtext-rich-black-700 font-display dark:text-gray-300 italic line-clamp-3 text-sm>A stellar adult fantasy debut with innovative magic, authentic characters, and compelling crime family dynamics creating a unique and engaging read/p> /div> div classflex flex-wrap items-center justify-center gap-0.5 sm:gap-1 > div classflex items-center gap-1.5 px-2 py-1 rounded bg-red-100/40 dark:bg-red-900/20 >span classtext-sm>🌶️/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>3/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-academy-100/60 dark:bg-rich-black-900/30 >span classtext-sm>💀/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>2.5/5/span>/div> div classflex items-center gap-1.5 px-2 py-1 rounded bg-orange-100/40 dark:bg-orange-900/20 >span classtext-sm>😳/span>span classtext-rich-black-700 dark:text-gray-300 font-medium text-sm>2/5/span>/div> /div> div classflex justify-center max-w-full gap-1> span classinline-block px-2 py-1 sm:px-2 sm:py-1 sm:text-xs text-10px max-w-full truncate bg-accent-50 dark:bg-accent-950 rounded text-accent-800 dark:text-accent-100 uppercase tracking-wider font-medium border border-accent-200 dark:border-accent-800> Urban Fantasy /span> span classconfidence-badge hidden inline-block px-1 py-1 sm:px-1.5 sm:py-0.5 text-10px max-w-full truncate rounded font-medium border>100%/span> /div> /div> /div> /a> /div> /div> /div> !-- Navigation Arrows - Overlay on sides --> button classbookshelf-nav-btn bookshelf-nav-prev bookshelf-nav-prev-start-here hidden absolute left--2.25rem top-0 w-16 h-full items-center justify-center dark:text-white text-rich-black-700 opacity-100 z-20 cursor-pointer aria-labelPrevious books data-astro-cid-74uxq5ss> svg classw-10 h-10 drop-shadow-2xl fillnone strokecurrentColor viewBox0 0 24 24 data-astro-cid-74uxq5ss> path stroke-linecapround stroke-linejoinround stroke-width2 dM15 19l-7-7 7-7 data-astro-cid-74uxq5ss>/path> /svg> /button> button classbookshelf-nav-btn bookshelf-nav-next bookshelf-nav-next-start-here hidden absolute right--2.25rem top-0 w-16 h-full items-center justify-center dark:text-white text-rich-black-700 opacity-100 z-20 cursor-pointer aria-labelNext books data-astro-cid-74uxq5ss> svg classw-10 h-10 drop-shadow-2xl fillnone strokecurrentColor viewBox0 0 24 24 data-astro-cid-74uxq5ss> path stroke-linecapround stroke-linejoinround stroke-width2 dM9 5l7 7-7 7 data-astro-cid-74uxq5ss>/path> /svg> /button> /div> !-- Desktop Scroll Indicators --> div classflex justify-center gap-2 mt-4 bookshelf-indicators-container-desktop data-shelf-idstart-here data-astro-cid-74uxq5ss>/div> /div> /section> script typemodule>const shelfId start-here;const baseUrl /; const basePath baseUrl.replace(/\/+$/, ) || /; import(`${basePath}/js/carouselUtils.js`.replace(/\/+/g, /)).then(module > { module.initCarousel(shelfId, bookshelf); });/script> div classmt-6 text-center data-astro-cid-j7pv25f6> a href/reviews/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-accent-600 text-white hover:bg-accent-700 focus:ring-accent-500 border border-accent-600 hover:border-accent-700 text-base px-5 py-2 font-sans tracking-wide data-astro-cid-j7pv25f6true>View All Reviews/a> /div> /section> section classpy-12 max-w-4xl mx-auto px-4 data-astro-cid-j7pv25f6> div classnewsletter-signup p-4 sm:p-5 bg-gradient-to-r from-accent-50/50 via-accent-100/30 to-accent-50/50 dark:from-brand-navy/40 dark:via-brand-charcoal/60 dark:to-brand-navy/40 rounded-lg border border-accent-200/50 dark:border-brand-slate/50 data-astro-cid-vxsjm25m> div classnewsletter-content data-astro-cid-vxsjm25m> h3 classtext-lg sm:text-xl font-semibold mb-2 text-rich-black-900 dark:text-white font-display data-astro-cid-vxsjm25m> Monthly Book Picks Delivered /h3> p classtext-sm sm:text-base text-gray-600 dark:text-brand-gray mb-4 data-astro-cid-vxsjm25m> Get curated romantasy reviews and recommendations straight to your inbox. No spam, just good books. /p> /div> form classnewsletter-form flex flex-col sm:flex-row gap-3 data-newsletter-form novalidate data-astro-cid-vxsjm25m> input typeemail idnewsletter-abc6daae-email namenewsletter-abc6daae-email placeholderEnter your email address autocompleteemail classw-full sm:flex-1 px-3 py-2.5 text-sm min-h-42px rounded-md border border-gray-300 dark:border-brand-slate bg-white dark:bg-brand-charcoal text-rich-black-900 dark:text-brand-white placeholder-gray-500 dark:placeholder-brand-gray focus:ring-2 focus:ring-accent-500 focus:border-accent-500 transition-colors data-newsletter-email data-astro-cid-vxsjm25m> button classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-accent-600 text-white hover:bg-accent-700 focus:ring-accent-500 border border-accent-600 hover:border-accent-700 text-base px-5 py-2 font-sans tracking-wide w-full sm:w-auto whitespace-nowrap text-sm min-h-44px typesubmit data-newsletter-submittrue data-astro-cid-vxsjm25mtrue> span data-button-text data-astro-cid-vxsjm25m>Get Monthly Picks/span> span data-button-loading classhidden data-astro-cid-vxsjm25m> svg classanimate-spin -ml-1 mr-2 h-4 w-4 text-white inline xmlnshttp://www.w3.org/2000/svg fillnone viewBox0 0 24 24 data-astro-cid-vxsjm25m> circle classopacity-25 cx12 cy12 r10 strokecurrentColor stroke-width4 data-astro-cid-vxsjm25m>/circle> path classopacity-75 fillcurrentColor dM4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z data-astro-cid-vxsjm25m>/path> /svg>Subscribing.../span> /button> /form> !-- Success/Error Messages --> div classnewsletter-messages mt-3 data-astro-cid-vxsjm25m> div data-success-message classhidden text-sm text-green-600 dark:text-green-400 font-medium data-astro-cid-vxsjm25m>✓ Thanks for subscribing! Check your email to confirm your subscription./div> div data-error-message classhidden text-sm text-red-600 dark:text-red-400 font-medium data-astro-cid-vxsjm25m>⚠ Something went wrong. Please try again later./div> /div> !-- Privacy Note --> p classtext-xs text-gray-500 dark:text-gray-500 mt-3 data-astro-cid-vxsjm25m>We respect your privacy. Unsubscribe at any time. By subscribing, you agree to oura href/privacy/ classtext-accent-600 dark:text-accent-400 hover:underline data-astro-cid-vxsjm25m>Privacy Policy/a>./p> /div> script typemodule src/_astro/NewsletterSignup.astro_astro_type_script_index_0_lang.QTqvfl_Y.js>/script> /section> section classpy-16 max-w-6xl mx-auto px-4 data-astro-cid-j7pv25f6> div classtext-center mb-12 data-astro-cid-j7pv25f6> h2 classtext-4xl md:text-5xl font-bold mb-4 text-rich-black-900 dark:text-white data-astro-cid-j7pv25f6>Curated Book Lists/h2> p classtext-xl text-rich-black-700 dark:text-gray-300 mb-4 max-w-3xl mx-auto font-serif data-astro-cid-j7pv25f6>Top picks, themed collections, and reading orders/p> p classtext-lg text-rich-black-600 dark:text-gray-400 max-w-3xl mx-auto data-astro-cid-j7pv25f6>Explore our hand-curated lists featuring top-ranked books, themed recommendations, and complete series guides./p> /div> div classgrid grid-cols-1 md:grid-cols-2 gap-8 data-astro-cid-j7pv25f6> div classgroup block bg-white dark:bg-brand-charcoal rounded-lg overflow-hidden border border-academy-100 dark:border-brand-slate shadow-sm hover:shadow-md transition-shadow > a href/lists/ranking-the-sun-eater-series/ data-dd-interaction-namelist_card_link_click data-dd-sectionlist_card data-dd-link-typelist classblock> div classaspect-75/32 relative overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/list/ranking-the-sun-eater-series-600.webp srcsethttps://assets.bromantasy.com/list/ranking-the-sun-eater-series-300.webp 300w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-340.webp 340w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-375.webp 375w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-414.webp 414w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-480.webp 480w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-600.webp 600w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-768.webp 768w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-900.webp 900w, https://assets.bromantasy.com/list/ranking-the-sun-eater-series-1200.webp 1200w altCover for Sun Eater Reading Order & Series Ranking Guide | Christopher Ruocchio width1200 height512 classw-full h-full object-cover group-hover:scale-105 transition-transform duration-300 loadinglazy fetchpriorityauto sizes(max-width: 768px) calc(100vw - 32px), (max-width: 1366px) calc(50vw - 24px), 600px styleobject-fit: cover; object-position: center; data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent>/div> div classabsolute bottom-0 left-0 p-4 w-full> h2 classtext-xl sm:text-2xl font-bold text-white drop-shadow-md>Sun Eater Reading Order & Series Ranking Guide | Christopher Ruocchio/h2> div classtext-white/90 text-sm font-medium mt-1 drop-shadow-sm> 7 books /div> div classflex flex-wrap gap-1.5 mt-2> span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> sun eater /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> christopher ruocchio /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> scifantasy /span> /div> /div> /div> div classp-4> p classtext-rich-black-700 dark:text-gray-300 mb-4 line-clamp-2>Your complete guide to the Sun Eater series by Christopher Ruocchio. Find the best reading order, character guides, and our definitive series ranking./p> /div> /a> /div>div classgroup block bg-white dark:bg-brand-charcoal rounded-lg overflow-hidden border border-academy-100 dark:border-brand-slate shadow-sm hover:shadow-md transition-shadow > a href/lists/indie-books-if-you-love-series/ data-dd-interaction-namelist_card_link_click data-dd-sectionlist_card data-dd-link-typelist classblock> div classaspect-75/32 relative overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/list/indie-books-if-you-love-series-600.webp srcsethttps://assets.bromantasy.com/list/indie-books-if-you-love-series-300.webp 300w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-340.webp 340w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-375.webp 375w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-414.webp 414w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-480.webp 480w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-600.webp 600w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-768.webp 768w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-900.webp 900w, https://assets.bromantasy.com/list/indie-books-if-you-love-series-1200.webp 1200w altCover for If You Love These Series, Try These Indie Gems width1200 height512 classw-full h-full object-cover group-hover:scale-105 transition-transform duration-300 loadinglazy fetchpriorityauto sizes(max-width: 768px) calc(100vw - 32px), (max-width: 1366px) calc(50vw - 24px), 600px styleobject-fit: cover; object-position: center; data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent>/div> div classabsolute bottom-0 left-0 p-4 w-full> h2 classtext-xl sm:text-2xl font-bold text-white drop-shadow-md>If You Love These Series, Try These Indie Gems/h2> div classtext-white/90 text-sm font-medium mt-1 drop-shadow-sm> 5 books /div> div classflex flex-wrap gap-1.5 mt-2> span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> indie books /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> indie fantasy /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> indie romantasy /span> /div> /div> /div> div classp-4> p classtext-rich-black-700 dark:text-gray-300 mb-4 line-clamp-2>Discover indie fantasy and romantasy books for readers who love traditional series. Four character-driven indie books matched to beloved mainstream series like Throne of Glass, Fourth Wing, The Sun Eater, and Joe Abercrombie. Quality storytelling knows no publisher./p> /div> /a> /div>div classgroup block bg-white dark:bg-brand-charcoal rounded-lg overflow-hidden border border-academy-100 dark:border-brand-slate shadow-sm hover:shadow-md transition-shadow > a href/lists/top-5-romantasy-books-for-men/ data-dd-interaction-namelist_card_link_click data-dd-sectionlist_card data-dd-link-typelist classblock> div classaspect-75/32 relative overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/list/top-5-romantasy-books-for-men-600.webp srcsethttps://assets.bromantasy.com/list/top-5-romantasy-books-for-men-300.webp 300w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-340.webp 340w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-375.webp 375w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-414.webp 414w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-480.webp 480w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-600.webp 600w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-768.webp 768w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-900.webp 900w, https://assets.bromantasy.com/list/top-5-romantasy-books-for-men-1200.webp 1200w altCover for Best Romantasy Books for Men: Top 5 Fantasy-Forward Picks width1200 height512 classw-full h-full object-cover group-hover:scale-105 transition-transform duration-300 loadinglazy fetchpriorityauto sizes(max-width: 768px) calc(100vw - 32px), (max-width: 1366px) calc(50vw - 24px), 600px styleobject-fit: cover; object-position: center; data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent>/div> div classabsolute bottom-0 left-0 p-4 w-full> h2 classtext-xl sm:text-2xl font-bold text-white drop-shadow-md>Best Romantasy Books for Men: Top 5 Fantasy-Forward Picks/h2> div classtext-white/90 text-sm font-medium mt-1 drop-shadow-sm> 5 books /div> div classflex flex-wrap gap-1.5 mt-2> span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> romantasy /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> introductory /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> recommendations /span> /div> /div> /div> div classp-4> p classtext-rich-black-700 dark:text-gray-300 mb-4 line-clamp-2>Discover the top 5 romantasy books for men and newcomers to the genre. Fantasy-forward stories with strong world-building, action, and romance that enhances rather than overshadows the plot./p> /div> /a> /div>div classgroup block bg-white dark:bg-brand-charcoal rounded-lg overflow-hidden border border-academy-100 dark:border-brand-slate shadow-sm hover:shadow-md transition-shadow > a href/lists/ranking-throne-of-glass-series/ data-dd-interaction-namelist_card_link_click data-dd-sectionlist_card data-dd-link-typelist classblock> div classaspect-75/32 relative overflow-hidden> !-- CDN image with manual responsive handling --> img srchttps://assets.bromantasy.com/list/ranking-throne-of-glass-series-600.webp srcsethttps://assets.bromantasy.com/list/ranking-throne-of-glass-series-300.webp 300w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-340.webp 340w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-375.webp 375w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-414.webp 414w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-480.webp 480w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-600.webp 600w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-768.webp 768w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-900.webp 900w, https://assets.bromantasy.com/list/ranking-throne-of-glass-series-1200.webp 1200w altCover for Throne of Glass Series Guide: Reading Order, Rankings & The Tandem Read width1200 height512 classw-full h-full object-cover group-hover:scale-105 transition-transform duration-300 loadinglazy fetchpriorityauto sizes(max-width: 768px) calc(100vw - 32px), (max-width: 1366px) calc(50vw - 24px), 600px styleobject-fit: cover; object-position: center; data-image-componenttrue> div classabsolute inset-0 bg-gradient-to-t from-black/60 to-transparent>/div> div classabsolute bottom-0 left-0 p-4 w-full> h2 classtext-xl sm:text-2xl font-bold text-white drop-shadow-md>Throne of Glass Series Guide: Reading Order, Rankings & The Tandem Read/h2> div classtext-white/90 text-sm font-medium mt-1 drop-shadow-sm> 8 books /div> div classflex flex-wrap gap-1.5 mt-2> span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> throne of glass /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> sarah j maas /span>span classbg-accent-600/80 backdrop-blur-sm text-white text-xs px-2 py-0.5 rounded-full> fantasy /span> /div> /div> /div> div classp-4> p classtext-rich-black-700 dark:text-gray-300 mb-4 line-clamp-2>Complete Throne of Glass guide with reading orders, rankings, and an interactive tandem read tracker that saves your progress between visits./p> /div> /a> /div> /div> div classmt-12 text-center data-astro-cid-j7pv25f6> a href/lists/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-accent-600 text-white hover:bg-accent-700 focus:ring-accent-500 border border-accent-600 hover:border-accent-700 text-base px-6 py-3 font-sans tracking-wide bg-accent-600 hover:bg-accent-700 text-white data-astro-cid-j7pv25f6true>View All Lists/a> /div> /section> section classpy-16 bg-gradient-to-b from-transparent to-accent-50 dark:to-rich-black-900/30 data-astro-cid-j7pv25f6> div classmax-w-4xl mx-auto px-4 data-astro-cid-j7pv25f6> div classgrid grid-cols-1 md:grid-cols-2 gap-12 items-center data-astro-cid-j7pv25f6> div data-astro-cid-j7pv25f6> h2 classtext-3xl font-bold sm:text-4xl font-display mb-4>Why BroMantasy?/h2> p classmb-4 text-rich-black-700 dark:text-gray-300 data-astro-cid-j7pv25f6>Great stories shouldnt be missed because of genre labels. Many men avoid romantasy, missing out on fantastic world-building, epic battles, and complex characters—all because these books include romantic elements./p> p classmb-6 text-rich-black-700 dark:text-gray-300 data-astro-cid-j7pv25f6>Our reviews focus on what makes these books universally appealing: immersive worlds, intricate magic systems, well-crafted plots, em data-astro-cid-j7pv25f6>and/em> the character development that comes through relationships of all kinds./p> a href/about/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-transparent text-accent-600 border border-accent-600 hover:bg-accent-50 dark:hover:bg-rich-black-900 dark:text-accent-400 dark:border-accent-500 focus:ring-accent-500 text-base px-5 py-2 font-sans tracking-wide data-astro-cid-j7pv25f6true>Learn More About Our Mission/a> /div> div classbg-white dark:bg-brand-charcoal p-6 rounded-lg shadow border border-academy-100 dark:border-brand-slate data-astro-cid-j7pv25f6> h3 classsm:text-3xl text-2xl font-bold font-display mb-4 text-accent-600 dark:text-accent-500>What We Review/h3> ul classspace-y-3 text-rich-black-700 dark:text-gray-300 data-astro-cid-j7pv25f6> li classflex items-start data-astro-cid-j7pv25f6> span classtext-accent-600 dark:text-accent-500 mr-2 data-astro-cid-j7pv25f6>✦/span> span data-astro-cid-j7pv25f6>strong data-astro-cid-j7pv25f6>Romantasy:/strong> Fantasy with significant romantic elements/span> /li> li classflex items-start data-astro-cid-j7pv25f6> span classtext-accent-600 dark:text-accent-500 mr-2 data-astro-cid-j7pv25f6>✦/span> span data-astro-cid-j7pv25f6>strong data-astro-cid-j7pv25f6>Epic & High Fantasy:/strong> Rich world-building and complex magic systems/span> /li> li classflex items-start data-astro-cid-j7pv25f6> span classtext-accent-600 dark:text-accent-500 mr-2 data-astro-cid-j7pv25f6>✦/span> span data-astro-cid-j7pv25f6>strong data-astro-cid-j7pv25f6>Science Fiction:/strong> Space operas to dystopian futures/span> /li> li classflex items-start data-astro-cid-j7pv25f6> span classtext-accent-600 dark:text-accent-500 mr-2 data-astro-cid-j7pv25f6>✦/span> span data-astro-cid-j7pv25f6>strong data-astro-cid-j7pv25f6>Urban Fantasy:/strong> Modern settings with supernatural elements/span> /li> li classflex items-start data-astro-cid-j7pv25f6> span classtext-accent-600 dark:text-accent-500 mr-2 data-astro-cid-j7pv25f6>✦/span> span data-astro-cid-j7pv25f6>strong data-astro-cid-j7pv25f6>Speculative Fiction:/strong> Genre-blending stories with fantastical elements/span> /li> /ul> /div> /div> /div> /section> section classpy-16 max-w-4xl mx-auto px-4 text-center data-astro-cid-j7pv25f6> h2 classtext-3xl font-bold sm:text-4xl font-display mb-6>Ready to Discover Your Next Favorite Book?/h2> p classtext-xl mb-8 max-w-2xl mx-auto text-rich-black-700 dark:text-gray-300 data-astro-cid-j7pv25f6>Join us as we explore the best of fantasy and romantasy literature, breaking down genre barriers and highlighting exceptional storytelling./p> div classflex flex-wrap justify-center gap-4 data-astro-cid-j7pv25f6> a href/about#rating-scale/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-transparent text-accent-600 border border-accent-600 hover:bg-accent-50 dark:hover:bg-rich-black-900 dark:text-accent-400 dark:border-accent-500 focus:ring-accent-500 text-base px-6 py-3 font-sans tracking-wide data-astro-cid-j7pv25f6true>Rating Scale/a> a href/reviews/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-accent-600 text-white hover:bg-accent-700 focus:ring-accent-500 border border-accent-600 hover:border-accent-700 text-base px-6 py-3 font-sans tracking-wide data-astro-cid-j7pv25f6true>Browse Reviews/a> a href/lists/ classinline-flex items-center justify-center rounded-sm font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-1 shadow-smooth bg-transparent text-accent-600 border border-accent-600 hover:bg-accent-50 dark:hover:bg-rich-black-900 dark:text-accent-400 dark:border-accent-500 focus:ring-accent-500 text-base px-6 py-3 font-sans tracking-wide data-astro-cid-j7pv25f6true>Explore Lists/a> /div> /section> /main> /div> footer classbg-rich-black-900 text-white py-12 mt-12 data-astro-cid-ioeiary4> div classmax-w-6xl mx-auto px-4 sm:px-6 lg:px-8 data-astro-cid-ioeiary4> div classflex flex-col md:flex-row justify-between items-center border-t border-rich-black-800 pt-8 data-astro-cid-ioeiary4> div classmb-4 md:mb-0 data-astro-cid-ioeiary4> p classtext-sm text-gray-400 data-astro-cid-ioeiary4>© 2025 BroMantasy. All rights reserved./p> div classmt-3 flex justify-center space-x-4 data-astro-cid-ioeiary4> a hrefhttps://www.instagram.com/bromantasy/ target_blank relnoopener noreferrer data-dd-interaction-namefooter_link_click data-dd-sectionfooter_socials data-dd-link-typeinstagram aria-labelFollow us on Instagram classtext-gray-400 hover:text-accent-400 transition-colors data-astro-cid-ioeiary4> svg classh-6 w-6 text-pink-500 fillcurrentColor viewBox0 0 24 24>path dM12 2.163c3.204 0 3.584.012 4.85.07 3.252.148 4.771 1.691 4.919 4.919.058 1.265.069 1.645.069 4.849 0 3.205-.012 3.584-.069 4.849-.149 3.225-1.664 4.771-4.919 4.919-1.266.058-1.644.07-4.85.07-3.204 0-3.584-.012-4.849-.07-3.26-.149-4.771-1.699-4.919-4.92-.058-1.265-.07-1.644-.07-4.849 0-3.204.013-3.583.07-4.849.149-3.227 1.664-4.771 4.919-4.919 1.266-.057 1.645-.069 4.849-.069zm0-2.163c-3.259 0-3.667.014-4.947.072-4.358.2-6.78 2.618-6.98 6.98-.059 1.281-.073 1.689-.073 4.948 0 3.259.014 3.668.072 4.948.2 4.358 2.618 6.78 6.98 6.98 1.281.058 1.689.072 4.948.072 3.259 0 3.668-.014 4.948-.072 4.354-.2 6.782-2.618 6.979-6.98.059-1.28.073-1.689.073-4.948 0-3.259-.014-3.667-.072-4.947-.196-4.354-2.617-6.78-6.979-6.98-1.281-.059-1.69-.073-4.949-.073zm0 5.838c-3.403 0-6.162 2.759-6.162 6.162s2.759 6.163 6.162 6.163 6.162-2.759 6.162-6.163c0-3.403-2.759-6.162-6.162-6.162zm0 10.162c-2.209 0-4-1.79-4-4 0-2.209 1.791-4 4-4s4 1.791 4 4c0 2.21-1.791 4-4 4zm6.406-11.845c-.796 0-1.441.645-1.441 1.44s.645 1.44 1.441 1.44c.795 0 1.439-.645 1.439-1.44s-.644-1.44-1.439-1.44z>/path>/svg> /a> a hrefhttps://x.com/bromantasy target_blank relnoopener noreferrer data-dd-interaction-namefooter_link_click data-dd-sectionfooter_socials data-dd-link-typex aria-labelFollow us on X classtext-gray-400 hover:text-accent-400 transition-colors data-astro-cid-ioeiary4> svg classh-6 w-6 text-black dark:text-white fillcurrentColor viewBox0 0 24 24>path dM18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z>/path>/svg> /a> a hrefhttps://pagebound.co/users/Devin target_blank relnoopener noreferrer data-dd-interaction-namefooter_link_click data-dd-sectionfooter_socials data-dd-link-typepagebound aria-labelFollow us on Pagebound classpagebound-icon transition-filter data-astro-cid-ioeiary4> img srchttps://assets.bromantasy.com/logos/pagebound-clean-24x24.webp altPagebound classh-6 w-6 pagebound-icon loadinglazy> /a> /div> /div> div classflex flex-col md:flex-row items-center space-y-2 md:space-y-0 md:space-x-6 data-astro-cid-ioeiary4> a href/about/ data-dd-interaction-namefooter_link_click data-dd-sectionfooter_links data-dd-link-typeabout classtext-sm text-gray-400 hover:text-accent-400 transition-colors data-astro-cid-ioeiary4>About/a> a href/privacy/ data-dd-interaction-namefooter_link_click data-dd-sectionfooter_links data-dd-link-typeprivacy classtext-sm text-gray-400 hover:text-accent-400 transition-colors data-astro-cid-ioeiary4>Privacy/a> a href/terms/ data-dd-interaction-namefooter_link_click data-dd-sectionfooter_links data-dd-link-typeterms classtext-sm text-gray-400 hover:text-accent-400 transition-colors data-astro-cid-ioeiary4>Terms/a> a href/contact/ data-dd-interaction-namefooter_link_click data-dd-sectionfooter_links data-dd-link-typecontact classtext-sm text-gray-400 hover:text-accent-400 transition-colors data-astro-cid-ioeiary4>Contact/a> button typebutton classtext-sm text-gray-400 hover:text-accent-400 transition-colors cursor-pointer flex items-center gap-1 data-footer-cookie-preferences data-dd-interaction-namefooter_link_click data-dd-sectionfooter_links data-dd-link-typecookie_preferences data-astro-cid-ioeiary4>Your Privacy Choices/button> a hrefmailto:contact@bromantasy.com data-dd-interaction-namefooter_link_click data-dd-sectionfooter_links data-dd-link-typecontact_email classtext-sm text-accent-400 hover:text-accent-300 transition-colors data-astro-cid-ioeiary4> contact@bromantasy.com /a> /div> /div> /div> /footer> !-- Cookie Consent Banner -->div idcookie-consent-banner classfixed bottom-0 left-0 right-0 z-50 bg-white dark:bg-rich-black-900 border-t border-gray-200 dark:border-rich-black-700 shadow-lg transform transition-transform duration-300 translate-y-full data-consent-banner data-astro-cid-wprcqz5n> div classmax-w-6xl mx-auto px-4 py-6 data-astro-cid-wprcqz5n> div classflex flex-col lg:flex-row items-start lg:items-center justify-between gap-4 data-astro-cid-wprcqz5n> !-- Content --> div classflex-1 data-astro-cid-wprcqz5n> h3 classtext-lg font-semibold text-rich-black-900 dark:text-white mb-2 data-banner-title data-astro-cid-wprcqz5n>🍪 We Value Your Privacy/h3> p classtext-sm text-rich-black-700 dark:text-gray-300 mb-3 lg:mb-0 data-banner-text data-astro-cid-wprcqz5n>We use cookies and similar technologies to enhance your experience, analyze site usage, and assist with our marketing efforts. You can manage your preferences or learn more in oura href/privacy/ classtext-accent-600 dark:text-accent-400 hover:underline font-medium data-astro-cid-wprcqz5n>Privacy Policy/a>./p> /div> !-- GDPR Buttons (full consent required) --> div classflex flex-col sm:flex-row gap-3 lg:ml-6 w-full sm:w-auto data-gdpr-buttons data-astro-cid-wprcqz5n> button typebutton classw-full sm:w-auto px-4 py-2 text-sm border border-gray-300 dark:border-rich-black-600 text-rich-black-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-rich-black-800 rounded-md transition-colors data-manage-preferences data-astro-cid-wprcqz5n>Manage Preferences/button> button typebutton classw-full sm:w-auto px-4 py-2 text-sm bg-gray-200 dark:bg-rich-black-700 text-rich-black-700 dark:text-gray-300 hover:bg-gray-300 dark:hover:bg-rich-black-600 rounded-md transition-colors data-reject-all data-astro-cid-wprcqz5n>Reject All/button> button typebutton classw-full sm:w-auto px-4 py-2 text-sm bg-accent-600 hover:bg-accent-700 text-white rounded-md transition-colors font-medium data-accept-all data-astro-cid-wprcqz5n>Accept All/button> /div> !-- Non-GDPR Buttons (opt-out model) --> div classflex flex-col sm:flex-row gap-3 lg:ml-6 w-full sm:w-auto hidden data-minimal-buttons data-astro-cid-wprcqz5n> button typebutton classw-full sm:w-auto px-4 py-2 text-sm border border-gray-300 dark:border-rich-black-600 text-rich-black-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-rich-black-800 rounded-md transition-colors data-manage-preferences data-astro-cid-wprcqz5n>Manage Preferences/button> button typebutton classw-full sm:w-auto px-4 py-2 text-sm bg-accent-600 hover:bg-accent-700 text-white rounded-md transition-colors font-medium data-continue-browsing data-astro-cid-wprcqz5n>Continue Browsing/button> /div> /div> /div> /div> !-- Detailed Preferences Modal --> div idcookie-preferences-modal classfixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm transition-opacity duration-300 opacity-0 invisible data-preferences-modal data-astro-cid-wprcqz5n> div classrelative bg-white dark:bg-rich-black-900 rounded-xl shadow-2xl max-w-2xl w-full max-h-90vh overflow-y-auto data-modal-content data-astro-cid-wprcqz5n> !-- Modal Header --> div classsticky top-0 bg-white dark:bg-rich-black-900 border-b border-gray-200 dark:border-rich-black-700 px-6 py-4 rounded-t-xl data-astro-cid-wprcqz5n> div classflex items-center justify-between data-astro-cid-wprcqz5n> h2 classtext-xl font-bold text-rich-black-900 dark:text-white font-display data-astro-cid-wprcqz5n>Cookie Preferences/h2> button typebutton classtext-gray-400 hover:text-gray-600 dark:text-gray-500 dark:hover:text-gray-300 transition-colors data-close-preferences aria-labelClose preferences data-astro-cid-wprcqz5n> svg classw-6 h-6 fillnone strokecurrentColor viewBox0 0 24 24 data-astro-cid-wprcqz5n> path stroke-linecapround stroke-linejoinround stroke-width2 dM6 18L18 6M6 6l12 12 data-astro-cid-wprcqz5n>/path> /svg> /button> /div> /div> !-- Modal Body --> div classpx-6 py-4 data-astro-cid-wprcqz5n> p classtext-gray-600 dark:text-gray-400 mb-6 data-astro-cid-wprcqz5n>We use different types of cookies to optimize your experience. You can choose which categories youd like to allow./p> !-- Cookie Categories --> div classspace-y-6 data-astro-cid-wprcqz5n> !-- Necessary Cookies --> div classborder border-gray-200 dark:border-rich-black-700 rounded-lg p-4 data-astro-cid-wprcqz5n> div classflex items-center justify-between mb-3 data-astro-cid-wprcqz5n> div classflex items-center data-astro-cid-wprcqz5n> h3 classtext-lg font-semibold text-rich-black-900 dark:text-white data-astro-cid-wprcqz5n>Necessary Cookies/h3> span classml-2 px-2 py-1 text-xs bg-green-100 dark:bg-green-900/30 text-green-800 dark:text-green-300 rounded-full data-astro-cid-wprcqz5n>Always Active/span> /div> input typecheckbox checked disabled classw-4 h-4 text-accent-600 border-gray-300 rounded focus:ring-accent-500 opacity-50 data-astro-cid-wprcqz5n> /div> p classtext-sm text-gray-600 dark:text-gray-400 data-astro-cid-wprcqz5n>These cookies are essential for the website to function properly. They enable basic functions like page navigation, access to secure areas, and remembering your preferences. The website cannot function properly without these cookies./p> /div> !-- Analytics Cookies --> div classborder border-gray-200 dark:border-rich-black-700 rounded-lg p-4 data-astro-cid-wprcqz5n> div classflex items-center justify-between mb-3 data-astro-cid-wprcqz5n> h3 classtext-lg font-semibold text-rich-black-900 dark:text-white data-astro-cid-wprcqz5n>Analytics Cookies/h3> label classrelative inline-flex items-center cursor-pointer data-astro-cid-wprcqz5n> input typecheckbox classsr-only peer data-analytics-toggle data-astro-cid-wprcqz5n> div classw-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-accent-300 dark:peer-focus:ring-accent-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content- after:absolute after:top-2px after:left-2px after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-accent-600 data-astro-cid-wprcqz5n>/div> /label> /div> p classtext-sm text-gray-600 dark:text-gray-400 data-astro-cid-wprcqz5n>These cookies help us understand how visitors interact with our website by collecting and reporting information anonymously. This includes user behavior tracking, performance monitoring, and error reporting through DataDog RUM./p> /div> !-- Marketing Cookies --> div classborder border-gray-200 dark:border-rich-black-700 rounded-lg p-4 data-astro-cid-wprcqz5n> div classflex items-center justify-between mb-3 data-astro-cid-wprcqz5n> h3 classtext-lg font-semibold text-rich-black-900 dark:text-white data-astro-cid-wprcqz5n>Marketing Cookies/h3> label classrelative inline-flex items-center cursor-pointer data-astro-cid-wprcqz5n> input typecheckbox classsr-only peer data-marketing-toggle data-astro-cid-wprcqz5n> div classw-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-accent-300 dark:peer-focus:ring-accent-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content- after:absolute after:top-2px after:left-2px after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-accent-600 data-astro-cid-wprcqz5n>/div> /label> /div> p classtext-sm text-gray-600 dark:text-gray-400 data-astro-cid-wprcqz5n>These cookies help us track newsletter-related activities to improve our email communications. This includes newsletter signup tracking, email preferences, and measuring the effectiveness of our monthly book recommendations./p> /div> !-- Functional Cookies --> div classborder border-gray-200 dark:border-rich-black-700 rounded-lg p-4 data-astro-cid-wprcqz5n> div classflex items-center justify-between mb-3 data-astro-cid-wprcqz5n> h3 classtext-lg font-semibold text-rich-black-900 dark:text-white data-astro-cid-wprcqz5n>Functional Cookies/h3> label classrelative inline-flex items-center cursor-pointer data-astro-cid-wprcqz5n> input typecheckbox classsr-only peer data-functional-toggle data-astro-cid-wprcqz5n> div classw-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-accent-300 dark:peer-focus:ring-accent-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content- after:absolute after:top-2px after:left-2px after:bg-white after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-accent-600 data-astro-cid-wprcqz5n>/div> /label> /div> p classtext-sm text-gray-600 dark:text-gray-400 data-astro-cid-wprcqz5n>These cookies enable enhanced functionality and personalization, such as remembering your preferences, theme choices, and providing personalized content recommendations./p> /div> /div> /div> !-- Modal Footer --> div classsticky bottom-0 bg-white dark:bg-rich-black-900 border-t border-gray-200 dark:border-rich-black-700 px-6 py-4 rounded-b-xl data-astro-cid-wprcqz5n> div classflex justify-end gap-3 data-astro-cid-wprcqz5n> button typebutton classpx-4 py-2 text-sm border border-gray-300 dark:border-rich-black-600 text-rich-black-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-rich-black-800 rounded-md transition-colors data-cancel-preferences data-astro-cid-wprcqz5n>Cancel/button> button typebutton classpx-4 py-2 text-sm bg-accent-600 hover:bg-accent-700 text-white rounded-md transition-colors font-medium data-save-preferences data-astro-cid-wprcqz5n>Save Preferences/button> /div> /div> /div> /div> script typemodule src/_astro/CookieConsent.astro_astro_type_script_index_0_lang.lm6YTGNr.js>/script> /body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]