diff --git a/client/icons/book-back-cover.svg b/client/icons/book-back-cover.svg new file mode 100644 index 000000000..7dae7abee --- /dev/null +++ b/client/icons/book-back-cover.svg @@ -0,0 +1,52 @@ + + + + + + + + + + diff --git a/client/icons/book-front-cover.svg b/client/icons/book-front-cover.svg index 4c4ec39bc..8ec0fac80 100644 --- a/client/icons/book-front-cover.svg +++ b/client/icons/book-front-cover.svg @@ -2,7 +2,7 @@ - - - -fa-file-c - - - - - - - - - - diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index 4e88a7a22..cb6f1114f 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -6,7 +6,6 @@ const MonsterBlockGen = require('./snippets/monsterblock.gen.js'); const scriptGen = require('./snippets/script.gen.js'); const ClassFeatureGen = require('./snippets/classfeature.gen.js'); const CoverPageGen = require('./snippets/coverpage.gen.js'); -const PartCoverPageGen = require('./snippets/partcoverpage.gen.js'); const TableOfContentsGen = require('./snippets/tableOfContents.gen.js'); const dedent = require('dedent-tabs').default; @@ -188,6 +187,12 @@ module.exports = [ gen : CoverPageGen.part, experimental : true }, + { + name : 'Back Cover Page', + icon : 'fac book-back-cover', + gen : CoverPageGen.back, + experimental : true + }, { name : 'Magic Item', icon : 'fas fa-hat-wizard', diff --git a/themes/V3/5ePHB/snippets/coverpage.gen.js b/themes/V3/5ePHB/snippets/coverpage.gen.js index bd52e1d9e..7c6431da7 100644 --- a/themes/V3/5ePHB/snippets/coverpage.gen.js +++ b/themes/V3/5ePHB/snippets/coverpage.gen.js @@ -68,6 +68,16 @@ const footnote = [ 'In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.' ]; +const coverText = [ + 'Embark on a thrilling journey across a vast and varied world, where magic and mystery await you at every turn. Encounter strange creatures and ancient secrets, and forge your own destiny with your choices. The world is yours to shape and explore.', + 'Join a band of brave adventurers and set out to explore the unknown lands beyond the horizon. Along the way, you’ll face perilous challenges, make new friends and enemies, and uncover a plot that threatens to destroy everything you hold dear. The fate of the world rests in your hands.', + 'Create your own character and enter a realm of endless possibilities, where you can be whoever you want to be. Whether you prefer to fight, sneak, charm, or craft your way through the game, you’ll find a style that suits you. The only limit is your imagination.', + 'Experience a rich and immersive story that adapts to your actions and decisions. Every choice you make has consequences, for good or ill. Will you be a hero or a villain? A leader or a follower? A friend or a foe? The choice is yours.', + 'Dive into a world of epic fantasy and adventure, where you can explore ancient civilizations, dark dungeons, and hidden secrets. Along the way, you’ll meet colorful characters, collect powerful items, and learn new skills. The more you play, the more you’ll discover.', + 'Explore a vast and dynamic world that changes according to your actions. You can shape the environment, influence the politics, and alter the history of the game world. But be careful, as every change has a ripple effect that may have unforeseen consequences.', + 'Enter a world of wonder and danger, where you can find allies and enemies among the various races and factions that inhabit it. You can choose to join or oppose any of them, or forge your own path. The game world is alive and responsive to your actions.' +]; + module.exports = { front : function() { @@ -119,6 +129,28 @@ module.exports = { ![Background image](https://i.imgur.com/9TU96xY.jpg){position:absolute,bottom:0,left:0,height:100%} }} + \page`; + }, + + back : function() { + return dedent` + {{backCover}} + + # ${_.sample(subtitles)} + + ${_.sampleSize(coverText, 3).join('\n:\n')} + ___ + + For use with any fantasy roleplaying ruleset. Play the best game of your life! + + ![background image](https://i.imgur.com/MJ4YHu7.jpg){position:absolute,bottom:0,left:0,height:100%} + + {{logo + ![](/assets/naturalCritLogoWhite.svg) + + Homebrewery.Naturalcrit.com + }} + \page`; } }; diff --git a/themes/V3/5ePHB/snippets/partcoverpage.gen.js b/themes/V3/5ePHB/snippets/partcoverpage.gen.js deleted file mode 100644 index 5b808aabb..000000000 --- a/themes/V3/5ePHB/snippets/partcoverpage.gen.js +++ /dev/null @@ -1,50 +0,0 @@ -const _ = require('lodash'); - -var titles = [ - 'Introduction to the World of DnD', - 'Creating Your Character', - 'The Rules of the Game', - 'Combat and Combat Strategies', - 'Magic and Spellcasting', - 'Adventuring and Exploration', - 'Dungeon Delving', - 'Campaign Building and World Building', - 'DM Techniques and Tips', - 'Appendix: Reference Material', - 'Monsters and Creatures', - 'Equipment and Treasure', - 'Non-Player Characters (NPCs)', - 'Experience and Leveling', - 'Races and Classes', - 'Skills and Abilities', - 'Alignment and Moral Choices', - 'Player-vs-Player Conflict', - 'Game Mastering 101', - 'Running a Successful Campaign', - 'Worldbuilding and Lore', - 'Designing Encounters and Adventures', - 'Managing Players and their Expectations', - 'Factions and Political Intrigue', - 'Adventure Hooks and Plot Ideas', - 'Building a Campaign Setting', - 'Handling Rules Disputes', - 'Running Large-Scale Battles', - 'Designing Unique Magic Systems', - 'Developing and Using NPCs', - 'Crafting Memorable Quests', - 'Improvising When Things Don\'t Go as Planned', - 'Managing Session Flow and Pacing', - 'Building a World That Feels Alive' -]; - -module.exports = ()=>{ - return `{{partCover}} - -# PART X -## ${_.sample(titles)} - -{{imageMaskEdge5,--offset:10cm,--rotation:180 -![Background](https://i.imgur.com/9TU96xY.jpg){height:100%} -}} -\\page`; -}; diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index e5be33ad1..b862690c7 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -820,6 +820,95 @@ h5 + table{ } } } +//***************************** +// * BACK COVER +// *****************************/ +.page:has(.backCover) { + color: #fff; + columns: 1; + padding: 2.25cm 1.3cm 2cm 1.3cm; + &:after { + all: unset; + } + .columnWrapper { + width: 7.6cm; + } + .backCover { + position: absolute; + inset: 0; + width: 11cm; + background-image: @backCover; + background-repeat: no-repeat; + background-size: contain; + z-index: -1; + } + .blank { + height: 1.4em; + } + h1 { + margin-bottom: .3cm; + font-size: 1.35cm; + line-height: 0.95em; + font-family: NodestoCapsCondensed; + text-align: center; + color: #ED1C24; + } + h1+p::first-line, + h1+p::first-letter { + all: unset; + } + img { + position: absolute; + top: 0px; + height: 100%; + z-index: -2; + } + hr { + margin-left: auto; + margin-right: auto; + margin-top: 1.1cm; + height: .53cm; + width: 4.5cm; + visibility: visible; + background-image: @horizontalRule; + background-size: 100% 100%; + border: none; + } + p { + font-family: Overpass; + line-height: 1.5em; + font-size: 0.332cm; + } + hr+p { + text-align: center; + margin-top: .6cm; + } + .logo { + position: absolute; + z-index: 0; + height: 1.5cm; + left: 1.2cm; + bottom: 2cm; + width: 7.6cm; + img { + position: relative; + height : 1.5cm; + width : 100%; + z-index : 0; + } + p { + position: relative; + color: #fff; + font-family: NodestoCapsWide; + font-size: .4cm; + letter-spacing: 0.08em; + line-height: 1em; + text-align: center; + text-indent: 0; + width: 100%; + } + } +} //***************************** // * PART COVER diff --git a/themes/assets/assets.less b/themes/assets/assets.less index 0547e8c70..cdef32c7c 100644 --- a/themes/assets/assets.less +++ b/themes/assets/assets.less @@ -16,6 +16,7 @@ @partCoverHeaderPHB : url('/assets/partCoverHeaderPHB.png'); @partCoverHeaderDMG : url('/assets/partCoverHeaderDMG.svg'); @insideCoverMask : url('/assets/insideCoverMask.png'); +@backCover : url('/assets/backCover.png'); @scriptBorder : url('/assets/scriptBorder.png'); // Watercolor Images diff --git a/themes/assets/backCover.png b/themes/assets/backCover.png new file mode 100644 index 000000000..5c6a14d25 Binary files /dev/null and b/themes/assets/backCover.png differ diff --git a/themes/assets/naturalCritLogo.svg b/themes/assets/naturalCritLogoRed.svg similarity index 100% rename from themes/assets/naturalCritLogo.svg rename to themes/assets/naturalCritLogoRed.svg diff --git a/themes/assets/naturalCritLogoWhite.svg b/themes/assets/naturalCritLogoWhite.svg new file mode 100644 index 000000000..56b820776 --- /dev/null +++ b/themes/assets/naturalCritLogoWhite.svg @@ -0,0 +1,50 @@ + + + + + + + NaturalCritLogo + + + + + + diff --git a/themes/fonts/5e/Nodesto Caps Wide.woff2 b/themes/fonts/5e/Nodesto Caps Wide.woff2 new file mode 100644 index 000000000..d50a19915 Binary files /dev/null and b/themes/fonts/5e/Nodesto Caps Wide.woff2 differ diff --git a/themes/fonts/5e/fonts.less b/themes/fonts/5e/fonts.less index a83399567..8f089b51c 100644 --- a/themes/fonts/5e/fonts.less +++ b/themes/fonts/5e/fonts.less @@ -107,6 +107,13 @@ font-style: italic; } +@font-face { + font-family: NodestoCapsWide; + src: url('../../../fonts/5e/Nodesto Caps Wide.woff2'); + font-weight: normal; + font-style: normal +} + @font-face { font-family: Overpass; src: url('../../../fonts/5e/Overpass Medium.woff2');