diff --git a/client/icons/customIcons.less b/client/icons/customIcons.less index b04d16684..f3ee02dac 100644 --- a/client/icons/customIcons.less +++ b/client/icons/customIcons.less @@ -31,3 +31,6 @@ .mask-corner { content: url('../icons/mask-corner.svg'); } +.fa-file-c { + content: url('../icons/fa-file-c.svg'); +} diff --git a/client/icons/fa-file-c.svg b/client/icons/fa-file-c.svg new file mode 100644 index 000000000..3e914decf --- /dev/null +++ b/client/icons/fa-file-c.svg @@ -0,0 +1,30 @@ + + + + +fa-file-c + + + + + + + + + + diff --git a/themes/V3/5ePHB/snippets.js b/themes/V3/5ePHB/snippets.js index bea2a1da3..51b91e6b0 100644 --- a/themes/V3/5ePHB/snippets.js +++ b/themes/V3/5ePHB/snippets.js @@ -170,7 +170,7 @@ module.exports = [ }, { name : 'Cover Page', - icon : 'fas fa-file-word', + icon : 'fac fa-file-c', gen : CoverPageGen, }, { diff --git a/themes/V3/5ePHB/snippets/coverpage.gen.js b/themes/V3/5ePHB/snippets/coverpage.gen.js index 0fb8ba7a4..5351f5db5 100644 --- a/themes/V3/5ePHB/snippets/coverpage.gen.js +++ b/themes/V3/5ePHB/snippets/coverpage.gen.js @@ -1,55 +1,46 @@ const _ = require('lodash'); +const dedent = require('dedent-tabs').default; const titles = [ - 'The Burning Gallows', - 'The Ring of Nenlast', - 'Below the Blind Tavern', - 'Below the Hungering River', - 'Before Bahamut\'s Land', - 'The Cruel Grave from Within', - 'The Strength of Trade Road', - 'Through The Raven Queen\'s Worlds', - 'Within the Settlement', - 'The Crown from Within', - 'The Merchant Within the Battlefield', - 'Ioun\'s Fading Traveler', - 'The Legion Ingredient', - 'The Explorer Lure', - 'Before the Charming Badlands', - 'The Living Dead Above the Fearful Cage', - 'Vecna\'s Hidden Sage', - 'Bahamut\'s Demonspawn', - 'Across Gruumsh\'s Elemental Chaos', - 'The Blade of Orcus', - 'Beyond Revenge', - 'Brain of Insanity', - 'Breed Battle!, A New Beginning', - 'Evil Lake, A New Beginning', - 'Invasion of the Gigantic Cat, Part II', - 'Kraken War 2020', - 'The Body Whisperers', - 'The Diabolical Tales of the Ape-Women', - 'The Doctor Immortal', - 'The Doctor from Heaven', - 'The Graveyard', - 'Azure Core', - 'Core Battle', - 'Core of Heaven: The Guardian of Amazement', - 'Deadly Amazement III', - 'Dry Chaos IX', - 'Gate Thunder', - 'Guardian: Skies of the Dark Wizard', - 'Lute of Eternity', - 'Mercury\'s Planet: Brave Evolution', - 'Ruby of Atlantis: The Quake of Peace', - 'Sky of Zelda: The Thunder of Force', - 'Vyse\'s Skies', - 'White Greatness III', - 'Yellow Divinity', - 'Zidane\'s Ghost' + 'The Burning Gallows', 'The Ring of Nenlast', + 'Below the Blind Tavern', 'Below the Hungering River', + 'Before Bahamut\'s Land', 'The Cruel Grave from Within', + 'The Strength of Trade Road', 'Through The Raven Queen\'s Worlds', + 'Within the Settlement', 'The Crown from Within', + 'The Merchant Within the Battlefield', 'Ioun\'s Fading Traveler', + 'The Legion Ingredient', 'The Explorer Lure', + 'Before the Charming Badlands', 'Vecna\'s Hidden Sage', + 'The Living Dead Above the Fearful Cage', 'Bahamut\'s Demonspawn', + 'Across Gruumsh\'s Elemental Chaos', 'The Blade of Orcus', + 'Beyond Revenge', 'Brain of Insanity', + 'Breed Battle!, A New Beginning', 'Evil Lake, A New Beginning', + 'Invasion of the Gigantic Cat, Part II', 'Kraken War 2020', + 'The Body Whisperers', 'The Doctor from Heaven', + 'The Diabolical Tales of the Ape-Women', 'The Doctor Immortal', + 'Core of Heaven: Guardian of Amazement', 'The Graveyard', + 'Guardian: Skies of the Dark Wizard', 'Lute of Eternity', + 'Mercury\'s Planet: Brave Evolution', 'Azure Core', + 'Sky of Zelda: The Thunder of Force', 'Core Battle', + 'Ruby of Atlantis: The Quake of Peace', 'Deadly Amazement III', + 'Dry Chaos IX', 'Gate Thunder', + 'Vyse\'s Skies', 'White Greatness III', + 'Yellow Divinity', 'Zidane\'s Ghost' ]; const subtitles = [ + 'Tomb of Shadows', 'Dragon\'s Lair', + 'Lost Caverns', 'The Necromancer', + 'Mystic Forest', 'Cursed Ruins', + 'The Dark Abyss', 'Enchanted Maze', + 'Haunted Castle', 'Sands of Fate', + 'Dragon\'s Hoard', 'Undead Menace', + 'Lost City Ruins', 'Goblin Ambush', + 'Enchanted Forest', 'Darkness Rising', + 'Quest for Glory', 'Ancient Prophecy', + 'Shadowy Depths', 'Mystic Isles' +]; + +const footnote = [ 'In an ominous universe, a botanist opposes terrorism.', 'In a demon-haunted city, in an age of lies and hate, a physicist tries to find an ancient treasure and battles a mob of aliens.', 'In a land of corruption, two cyberneticists and a dungeon delver search for freedom.', @@ -74,51 +65,26 @@ const subtitles = [ 'On a planet of mysticism, three travelers and a fire fighter quest for the ultimate weapon and oppose evil.', 'In a wicked universe, five seers fight lawlessness.', 'In a kingdom of death, in an era of illusion and blood, four colonists search for fame.', - 'In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.', - 'In a cursed empire, five inventors oppose terrorism.', - 'On a crime-ridden planet of conspiracy, a watchman and an artificial intelligence try to find love and oppose lawlessness.', - 'In a forgotten land, a reporter and a spy try to stop the apocalypse.', - 'In a forbidden land of prophecy, a scientist and an archivist oppose a cabal of barbarians intent on stealing the souls of the innocent.', - 'On an infernal world of illusion, a grave robber and a watchman try to find revenge and combat a syndicate of mages intent on stealing the source of all magic.', - 'In a galaxy of dark magic, four fighters seek freedom.', - 'In an empire of deception, six tomb-robbers quest for the ultimate weapon and combat an army of raiders.', - 'In a kingdom of corruption and lost souls, in an age of panic, eight planetologists oppose evil.', - 'In a galaxy of misery and hopelessness, in a time of agony and pain, five planetologists search for vengance.', - 'In a universe of technology and insanity, in a time of sorcery, a computer techician quests for hope.', - 'On a planet of dark magic and barbarism, in an age of horror and blasphemy, seven librarians search for fame.', - 'In an empire of dark magic, in a time of blood and illusions, four monks try to find the ultimate weapon and combat terrorism.', - 'In a forgotten empire of dark magic, six kings try to prevent the destruction of mankind.', - 'In a galaxy of dark magic and horror, in an age of hopelessness, four marines and an outlaw combat evil.', - 'In a mysterious city of illusion, in an age of computerization, a witch-hunter tries to find the ultimate weapon and opposes an evil corporation.', - 'In a damned kingdom of technology, a virtual reality programmer and a fighter seek fame.', - 'In a hellish kingdom, in an age of blasphemy and blasphemy, an astrologer searches for fame.', - 'In a damned world of devils, an alien and a ranger quest for love and oppose a syndicate of demons.', - 'In a cursed galaxy, in a time of pain, seven librarians hope to avert the apocalypse.', - 'In a crime-infested galaxy, in an era of hopelessness and panic, three champions and a grave robber try to solve the ultimate crime.' + 'In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.' ]; - module.exports = ()=>{ - return ` + return dedent` + {{coverPage }} -{{margin-top:225px}} + {{logo ![](/assets/naturalCritLogo.svg)}} -# ${_.sample(titles)} + # ${_.sample(titles)} + ## ${_.sample(subtitles)} + __________ -{{margin-top:25px}} + {{banner HOMEBREW}} -{{wide -##### ${_.sample(subtitles)} -}} + {{footnote + ${_.sample(footnote)} + }} -\\page`; -}; \ No newline at end of file + ![background image](https://i.imgur.com/Mqx8Vf7.png) + + \page`; +}; diff --git a/themes/V3/5ePHB/style.less b/themes/V3/5ePHB/style.less index 09f0dc790..61c9900fe 100644 --- a/themes/V3/5ePHB/style.less +++ b/themes/V3/5ePHB/style.less @@ -624,134 +624,242 @@ body { // * CLASS TABLE // *****************************/ .page .classTable{ - th[colspan]:not([rowspan]) { - white-space : nowrap; +th[colspan]:not([rowspan]) { + white-space : nowrap; +} +&.frame { + margin-top : 0.7cm; + margin-bottom : 0.9cm; + margin-left : -0.1cm; + margin-right : -0.1cm; + width : calc(100% + 0.2cm); + border-collapse : separate; + background-color : white; + border : initial; + border-style : solid; + border-image-outset : 0.4cm 0.3cm; + border-image-repeat : stretch; + border-image-slice : 200; + border-image-source : @frameBorderImage; + border-image-width : 47px; + &.wide:first-child { + margin-top: 0.12cm; } - &.frame { - margin-top : 0.7cm; - margin-bottom : 0.9cm; - margin-left : -0.1cm; - margin-right : -0.1cm; - width : calc(100% + 0.2cm); - border-collapse : separate; - background-color : white; - border : initial; - border-style : solid; - border-image-outset : 0.4cm 0.3cm; - border-image-repeat : stretch; - border-image-slice : 200; - border-image-source : @frameBorderImage; - border-image-width : 47px; - &.wide:first-child { - margin-top: 0.12cm; - } - & + * { - margin-top: 0; - } - } - &.decoration { - position:relative; - } - &.decoration::before { - content :''; - position : absolute; - background-image : @classTableDecoration, - @classTableDecoration; - background-size : contain, contain; - background-repeat : no-repeat, no-repeat; - background-position : top, bottom; - width : 7.75cm; - height : calc(100% + 3.3cm); - top : 50%; - left : 50%; - transform : translateY(-50%) translateX(-50%); - filter : drop-shadow(0px 0px 1px #C8C5C080); - z-index : -1; - } - &.decoration.wide::before { - width : calc(100% + 3.3cm); - height : 7.75cm; - background-position : left, right; - } - h5 + table{ - margin-top : 0.2cm; + & + * { + margin-top: 0; } } +&.decoration { + position:relative; +} +&.decoration::before { + content :''; + position : absolute; + background-image : @classTableDecoration, + @classTableDecoration; + background-size : contain, contain; + background-repeat : no-repeat, no-repeat; + background-position : top, bottom; + width : 7.75cm; + height : calc(100% + 3.3cm); + top : 50%; + left : 50%; + transform : translateY(-50%) translateX(-50%); + filter : drop-shadow(0px 0px 1px #C8C5C080); + z-index : -1; +} +&.decoration.wide::before { + width : calc(100% + 3.3cm); + height : 7.75cm; + background-position : left, right; +} +h5 + table{ + margin-top : 0.2cm; +} +} +//***************************** +// * COVER PAGE +// *****************************/ +.page:has(.coverPage) { + columns : 1; + text-align : center; + &:after { + all: unset; + } + .logo { + position : absolute; + top : 0.5cm; + left : 0; + right : 0; + filter : drop-shadow(0 0 0.075cm black); + img { + height : 2cm; + width : 100%; + } + } + .columnWrapper > p img { + position : absolute; + bottom : 0; + left : 0; + height : 100%; + min-width : 100%; + z-index : -1; + } + h1 { + --shadow-x0 : #000 0px 0px 0.1cm; + --shadow-x1 : var(--shadow-x0), var(--shadow-x0), var(--shadow-x0); + --shadow-x2 : var(--shadow-x1), var(--shadow-x1), var(--shadow-x1); + --shadow-x3 : var(--shadow-x2), var(--shadow-x2), var(--shadow-x2); + text-shadow : var(--shadow-x3), var(--shadow-x3), var(--shadow-x3); + text-transform : uppercase; + font-weight : normal; + display : block; + margin-top : 1.2cm; + margin-bottom : 0; + color : white; + font-family : NodestoCapsCondensed; + font-size : 2.245cm; + line-height : 0.85em; + } + h2 { + --shadow-x0 : #000 0px 0px 2.5px; + --shadow-x1 : var(--shadow-x0), var(--shadow-x0), var(--shadow-x0); + --shadow-x2 : var(--shadow-x1), var(--shadow-x1), var(--shadow-x1); + --shadow-x3 : var(--shadow-x2), var(--shadow-x2), var(--shadow-x2); + text-shadow : var(--shadow-x3), var(--shadow-x3), var(--shadow-x3); + font-family : NodestoCapsCondensed; + font-weight : normal; + font-size : 0.85cm; + letter-spacing : 0.1cm; + color : white; + } + hr { + display : block; + position : relative; + background-image : @horizontalRule; + background-size : 100% 100%; + visibility : visible; + height : 0.5cm; + width : 12cm; + border : none; + margin : auto; + filter : drop-shadow(0 0 3px black); + } + .banner { + filter : drop-shadow(2px 2px 2px #000); + position : absolute; + left : 0; + bottom : 4.2cm; + background-image : url('/assets/coverPageBanner.svg'); + height : 1.7cm; + width : 10.5cm; + color : white; + font-family : NodestoCapsCondensed; + font-weight : normal; + font-size : 1cm; + letter-spacing : 0.014cm; + text-align : left; + padding-left : 1cm; + display : flex; + justify-content : center; + flex-direction : column; + padding-top : 0.1cm; + } + .footnote { + --shadow-x0 : #000 0px 0px 0.05cm; + --shadow-x1 : var(--shadow-x0), var(--shadow-x0), var(--shadow-x0); + --shadow-x2 : var(--shadow-x1), var(--shadow-x1), var(--shadow-x1); + text-shadow : var(--shadow-x2), var(--shadow-x2), var(--shadow-x2); + position : absolute; + text-align : center; + color : white; + font-size : 0.496cm; + bottom : 1.3cm; + left : 0; + right : 0; + margin-left : auto; + margin-right : auto; + width : 70%; + font-family : Overpass; + } +} + + //***************************** // * TABLE OF CONTENTS // *****************************/ .page { - &:has(.toc):after { - display: none; +&:has(.toc):after { + display: none; +} +.toc { +-webkit-column-break-inside : avoid; +page-break-inside : avoid; +break-inside : avoid; + h1 { + text-align : center; + margin-bottom : 0.3cm; } - .toc { - -webkit-column-break-inside : avoid; - page-break-inside : avoid; - break-inside : avoid; - h1 { - text-align : center; - margin-bottom : 0.3cm; - } - a{ - display : inline; - color : inherit; - text-decoration : none; - &:hover{ - text-decoration : underline; - } - } - h4 { - margin-top : 0.2cm; - line-height : 0.4cm; - & + ul li { - line-height: 1.2em; - } - } - ul{ - padding-left : 0; - list-style-type : none; - margin-top : 0; - a { - width : 100%; - display : flex; - flex-flow : row nowrap; - justify-content : space-between; - } - li + li h3 { - margin-top : 0.26cm; - line-height : 1em - } - h3 span:first-child::after { - border : none; - } - span { - display : contents; - &:first-child::after { - content : ""; - bottom : 0.08cm; - flex : 1; - margin-left : 0.08cm; /* Spacing before dot leaders */ - margin-right : 0.16cm; - border-bottom : 0.05cm dotted #000; - margin-bottom : 0.08cm; - } - &:last-child { - display : inline-block; - align-self : flex-end; - font-family : "BookInsanityRemake"; - font-size : 0.34cm; - font-weight : normal; - color : #000; - } - } - ul { /*List indent*/ - margin-left : 1em; - } - } - &.wide{ - .useColumns(0.96, @fillMode: balance); + a{ + display : inline; + color : inherit; + text-decoration : none; + &:hover{ + text-decoration : underline; } } + h4 { + margin-top : 0.2cm; + line-height : 0.4cm; + & + ul li { + line-height: 1.2em; + } + } + ul{ + padding-left : 0; + list-style-type : none; + margin-top : 0; + a { + width : 100%; + display : flex; + flex-flow : row nowrap; + justify-content : space-between; + } + li + li h3 { + margin-top : 0.26cm; + line-height : 1em + } + h3 span:first-child::after { + border : none; + } + span { + display : contents; + &:first-child::after { + content : ""; + bottom : 0.08cm; + flex : 1; + margin-left : 0.08cm; /* Spacing before dot leaders */ + margin-right : 0.16cm; + border-bottom : 0.05cm dotted #000; + margin-bottom : 0.08cm; + } + &:last-child { + display : inline-block; + align-self : flex-end; + font-family : "BookInsanityRemake"; + font-size : 0.34cm; + font-weight : normal; + color : #000; + } + } + ul { /*List indent*/ + margin-left : 1em; + } + } + &.wide{ + .useColumns(0.96, @fillMode: balance); + } +} } //***************************** diff --git a/themes/assets/assets.less b/themes/assets/assets.less index 7df5db0f6..1f61bf89e 100644 --- a/themes/assets/assets.less +++ b/themes/assets/assets.less @@ -10,6 +10,9 @@ @monsterBorderImage : url('/assets/monsterBorderFancy.png'); @codeBorderImage : url('/assets/codeBorder.png'); @classTableDecoration : url('/assets/classTableDecoration.png'); +@naturalCritLogo : url('/assets/naturalCritLogo.svg'); +@coverPageBanner : url('/assets/coverPageBanner.svg'); +@horizontalRule : url('/assets/horizontalRule.svg'); // Watercolor Images @watercolor1 : url('/assets/watercolor/watercolor1.png'); diff --git a/themes/assets/coverPageBanner.svg b/themes/assets/coverPageBanner.svg new file mode 100644 index 000000000..8e7c4acc2 --- /dev/null +++ b/themes/assets/coverPageBanner.svg @@ -0,0 +1 @@ +Asset 2 \ No newline at end of file diff --git a/themes/assets/horizontalRule.svg b/themes/assets/horizontalRule.svg new file mode 100644 index 000000000..9fce47809 --- /dev/null +++ b/themes/assets/horizontalRule.svg @@ -0,0 +1 @@ +Asset 2 \ No newline at end of file diff --git a/themes/assets/naturalCritLogo.svg b/themes/assets/naturalCritLogo.svg new file mode 100644 index 000000000..71cc40a97 --- /dev/null +++ b/themes/assets/naturalCritLogo.svg @@ -0,0 +1 @@ +NaturalCritLogo \ No newline at end of file diff --git a/themes/fonts/5e/Alkalami-Regular.woff2 b/themes/fonts/5e/Alkalami-Regular.woff2 new file mode 100644 index 000000000..4d8b8c23f Binary files /dev/null and b/themes/fonts/5e/Alkalami-Regular.woff2 differ diff --git a/themes/fonts/5e/Nodesto Caps Condensed.woff2 b/themes/fonts/5e/Nodesto Caps Condensed.woff2 index bdb21d4cd..335079b7e 100644 Binary files a/themes/fonts/5e/Nodesto Caps Condensed.woff2 and b/themes/fonts/5e/Nodesto Caps Condensed.woff2 differ diff --git a/themes/fonts/5e/Overpass Medium.woff2 b/themes/fonts/5e/Overpass Medium.woff2 new file mode 100644 index 000000000..74951a813 Binary files /dev/null and b/themes/fonts/5e/Overpass Medium.woff2 differ diff --git a/themes/fonts/5e/fonts.less b/themes/fonts/5e/fonts.less index f5118a7cc..5257dfce4 100644 --- a/themes/fonts/5e/fonts.less +++ b/themes/fonts/5e/fonts.less @@ -106,3 +106,10 @@ font-weight: bold; font-style: italic; } + +@font-face { + font-family: Overpass; + src: url('../../../fonts/5e/Overpass Medium.woff2'); + font-weight: 500; + font-style: normal; +}