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 @@
+
+
+
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 }}
-# ${_.sample(titles)}
+ # ${_.sample(titles)}
+ ## ${_.sample(subtitles)}
+ __________
-{{margin-top:25px}}
+ {{banner HOMEBREW}}
-{{wide
-##### ${_.sample(subtitles)}
-}}
+ {{footnote
+ ${_.sample(footnote)}
+ }}
-\\page`;
-};
\ No newline at end of file
+ 
+
+ \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 @@
+
\ 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 @@
+
\ 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 @@
+
\ 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;
+}