drakosfire commited on
Commit
760ff9a
1 Parent(s): c7d9eea

LLM dictionary to text and back to dictionary for inventory, html templates

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. __pycache__/app.cpython-310.pyc +0 -0
  2. __pycache__/process_text.cpython-310.pyc +0 -0
  3. __pycache__/store_helper.cpython-310.pyc +0 -0
  4. app.py +138 -32
  5. dependencies/5ePHBstyle.css +20 -0
  6. dependencies/all.css +5 -0
  7. dependencies/bundle.css +0 -0
  8. dependencies/css.css +288 -0
  9. dependencies/homebrewery -cssPaths +8 -0
  10. dependencies/homebrewery-docker.txt +1 -0
  11. dependencies/phb.standalone.css +0 -0
  12. dependencies/style.css +615 -0
  13. dependencies/themes/Legacy/5ePHB/settings.json +5 -0
  14. dependencies/themes/Legacy/5ePHB/snippets.js +327 -0
  15. dependencies/themes/Legacy/5ePHB/snippets/classfeature.gen.js +52 -0
  16. dependencies/themes/Legacy/5ePHB/snippets/classtable.gen.js +114 -0
  17. dependencies/themes/Legacy/5ePHB/snippets/coverpage.gen.js +117 -0
  18. dependencies/themes/Legacy/5ePHB/snippets/fullclass.gen.js +43 -0
  19. dependencies/themes/Legacy/5ePHB/snippets/magic.gen.js +91 -0
  20. dependencies/themes/Legacy/5ePHB/snippets/monsterblock.gen.js +200 -0
  21. dependencies/themes/Legacy/5ePHB/snippets/tableOfContents.gen.js +72 -0
  22. dependencies/themes/Legacy/5ePHB/style.less +501 -0
  23. dependencies/themes/V3/5eDMG/dropdownPreview.png +3 -0
  24. dependencies/themes/V3/5eDMG/dropdownTexture.png +3 -0
  25. dependencies/themes/V3/5eDMG/settings.json +6 -0
  26. dependencies/themes/V3/5eDMG/snippets.js +4 -0
  27. dependencies/themes/V3/5eDMG/style.less +43 -0
  28. dependencies/themes/V3/5ePHB/dropdownPreview.png +3 -0
  29. dependencies/themes/V3/5ePHB/dropdownTexture.png +3 -0
  30. dependencies/themes/V3/5ePHB/settings.json +6 -0
  31. dependencies/themes/V3/5ePHB/snippets.js +327 -0
  32. dependencies/themes/V3/5ePHB/snippets/classfeature.gen.js +49 -0
  33. dependencies/themes/V3/5ePHB/snippets/classtable.gen.js +138 -0
  34. dependencies/themes/V3/5ePHB/snippets/coverpage.gen.js +156 -0
  35. dependencies/themes/V3/5ePHB/snippets/fullclass.gen.js +43 -0
  36. dependencies/themes/V3/5ePHB/snippets/index.gen.js +85 -0
  37. dependencies/themes/V3/5ePHB/snippets/magic.gen.js +109 -0
  38. dependencies/themes/V3/5ePHB/snippets/monsterblock.gen.js +184 -0
  39. dependencies/themes/V3/5ePHB/snippets/quote.gen.js +51 -0
  40. dependencies/themes/V3/5ePHB/snippets/script.gen.js +48 -0
  41. dependencies/themes/V3/5ePHB/snippets/tableOfContents.gen.js +86 -0
  42. dependencies/themes/V3/5ePHB/snippets/watercolor.gen.js +5 -0
  43. dependencies/themes/V3/5ePHB/style.less +942 -0
  44. dependencies/themes/V3/Blank/dropdownPreview.png +3 -0
  45. dependencies/themes/V3/Blank/dropdownTexture.png +3 -0
  46. dependencies/themes/V3/Blank/settings.json +6 -0
  47. dependencies/themes/V3/Blank/snippets.js +444 -0
  48. dependencies/themes/V3/Blank/snippets/footer.gen.js +17 -0
  49. dependencies/themes/V3/Blank/snippets/imageMask.gen.js +46 -0
  50. dependencies/themes/V3/Blank/snippets/watercolor.gen.js +5 -0
__pycache__/app.cpython-310.pyc CHANGED
Binary files a/__pycache__/app.cpython-310.pyc and b/__pycache__/app.cpython-310.pyc differ
 
__pycache__/process_text.cpython-310.pyc ADDED
Binary file (2.21 kB). View file
 
__pycache__/store_helper.cpython-310.pyc CHANGED
Binary files a/__pycache__/store_helper.cpython-310.pyc and b/__pycache__/store_helper.cpython-310.pyc differ
 
app.py CHANGED
@@ -4,6 +4,7 @@ import utilities as u
4
  import os
5
  import ctypes
6
  import store_helper as sh
 
7
 
8
 
9
  # This is a fix for the way that python doesn't release system memory back to the OS and it was leading to locking up the system
@@ -26,63 +27,168 @@ gr.set_static_paths(paths=list_of_static_dir)
26
 
27
  with gr.Blocks() as demo:
28
  # Functions and State Variables
29
- store_description= gr.State()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  specialties_description = gr.State()
31
 
 
 
 
 
 
 
 
 
 
32
  def gen_store_desc(user_description):
33
-
34
  llm_output = sh.call_llm_and_cleanup(user_description)
35
- #user_monster = sh.convert_to_dict(llm_output)
36
- #user_monster = llm_output
37
- #keys_list = list(user_monster)
38
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
 
40
  #Return each State variable twice, once to the variable and once to the textbox
41
- return [llm_output,llm_output]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
 
43
- def gen_store_specialties(store_description):
44
-
45
- llm_output = sh.call_llm_and_cleanup(store_description, specialties=True)
46
- #user_monster = sh.convert_to_dict(llm_output)
47
- #user_monster = llm_output
48
- #keys_list = list(user_monster)
49
-
50
 
51
  #Return each State variable twice, once to the variable and once to the textbox
52
- return [llm_output,llm_output]
 
 
 
 
 
 
53
 
54
- #Function to dynamically render textbox if it has text.
55
  def update_visibility(textbox):
56
  if not textbox:
57
  return gr.update(visible=False)
58
  return gr.update(visible=True)
59
  with gr.Tab("Store"):
60
- user_store_description = gr.Textbox(label = "Step 1 : What are the core qualities of the store?",
61
  lines = 1, placeholder=f"Ex : A trade shop with a female ogre merchant, basic trade goods and travel supplies, has a secret basement for smuggling.",
62
  elem_id= "custom-textbox")
63
  desc_gen = gr.Button(value = "Click to Generate Description")
64
- store_description_output = gr.Textbox(label = 'Description', lines = 2, interactive=True, visible=True)
 
 
 
 
65
  store_description_output.change(fn=update_visibility,
66
  inputs=[store_description_output],
67
  outputs=[store_description_output])
68
- desc_gen.click(fn = gen_store_desc, inputs = [user_store_description],
69
- outputs= [store_description, store_description_output
70
- ])
 
 
 
 
 
 
 
 
 
 
 
 
71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  image_path_list= u.absolute_path("./folder_with_images")
73
 
74
- with gr.Tab("Inventory"):
75
- user_store_description = gr.Textbox(label = "Step 1 : What are the core qualities of the store?",
76
- lines = 1, placeholder=f"Ex : A trade shop with a female ogre merchant, basic trade goods and travel supplies, has a secret basement for smuggling.",
77
- elem_id= "custom-textbox")
78
- desc_gen = gr.Button(value = "Click to Generate Description")
79
- store_description_output = gr.Textbox(label = 'Description', lines = 2, interactive=True, visible=True)
80
- store_description_output.change(fn=update_visibility,
81
- inputs=[store_description_output],
82
- outputs=[store_description_output])
83
- desc_gen.click(fn = gen_store_desc, inputs = [user_store_description],
84
- outputs= [store_description, store_description_output
 
 
 
85
  ])
 
86
 
87
  image_path_list= u.absolute_path("./folder_with_images")
88
  if __name__ == "__main__":
 
4
  import os
5
  import ctypes
6
  import store_helper as sh
7
+ import process_text
8
 
9
 
10
  # This is a fix for the way that python doesn't release system memory back to the OS and it was leading to locking up the system
 
27
 
28
  with gr.Blocks() as demo:
29
  # Functions and State Variables
30
+ store= gr.State()
31
+ store_name = gr.State()
32
+ store_description = gr.State()
33
+ store_reputation = gr.State()
34
+ store_backstory = gr.State()
35
+ store_sd_prompt = gr.State()
36
+ store_location = gr.State()
37
+ store_type = gr.State()
38
+ store_size = gr.State()
39
+ store_owner = gr.State()
40
+ store_employees = gr.State()
41
+ store_hours = gr.State()
42
+ store_services = gr.State()
43
+ store_specialties = gr.State()
44
+ notable_customers = gr.State()
45
+ store_quests = gr.State()
46
+ store_rumors = gr.State()
47
+ store_inventory = gr.State()
48
+ store_inventory_dict = gr.State()
49
+
50
  specialties_description = gr.State()
51
 
52
+ def check_and_process_contents(item):
53
+ if item:
54
+ if len(item) > 0:
55
+ store_value = item
56
+ # if type(store_value) == list:
57
+ store_value = process_text.format_qualities(store_value)
58
+ else : store_value = ""
59
+ return store_value
60
+
61
  def gen_store_desc(user_description):
 
62
  llm_output = sh.call_llm_and_cleanup(user_description)
63
+ store_dict = sh.convert_to_dict(llm_output)
64
+ # Key List for checking is speciufic keys are present before running parsing functions
65
+ keys_list = list(llm_output)
66
+ store_name_value = store_dict['store_name']
67
+ store_description_value = store_dict['description']
68
+ store_reputation_value = store_dict['reputation']
69
+ store_backstory_value = store_dict['backstory']
70
+ store_sd_prompt_value = store_dict['store_sd_prompt']
71
+ store_type_value = store_dict['type']
72
+ store_size_value = store_dict['size']
73
+ store_location_value = check_and_process_contents(store_dict['location'])
74
+ store_owner_value = check_and_process_contents(store_dict['owners'])
75
+ store_employees_value = check_and_process_contents(store_dict['employees'])
76
+ store_hours_value = store_dict['store_hours']
77
+ store_services_value = check_and_process_contents(store_dict['services'])
78
+ store_specialties_value = check_and_process_contents(store_dict['specialties'])
79
+ notable_customers_value = check_and_process_contents(store_dict['notable_customers'])
80
+ store_quests_value = check_and_process_contents(store_dict['related_quests'])
81
+ store_rumors_value = check_and_process_contents(store_dict['rumors'])
82
+
83
 
84
  #Return each State variable twice, once to the variable and once to the textbox
85
+ return [store_name_value, store_name_value,
86
+ store_description_value, store_description_value,
87
+ store_reputation_value, store_reputation_value,
88
+ store_backstory_value, store_backstory_value,
89
+ store_sd_prompt_value, store_sd_prompt_value,
90
+ store_type_value, store_type_value,
91
+ store_size_value, store_size_value,
92
+ store_location_value, store_location_value,
93
+ store_owner_value, store_owner_value,
94
+ store_employees_value,store_employees_value,
95
+ notable_customers_value, notable_customers_value,
96
+ store_hours_value, store_hours_value,
97
+ store_services_value, store_services_value,
98
+ store_specialties_value, store_specialties_value,
99
+ store_quests_value, store_quests_value,
100
+ store_rumors_value, store_rumors_value
101
+ ]
102
 
103
+ def gen_store_inventory(store_name, store_type, store_size, store_owner, store_reputation):
104
+ inventory_description = f"{store_name}, {store_type} {store_size} {store_owner} {store_reputation}"
105
+ inventory_dict = sh.call_llm_and_cleanup(inventory_description, inventory=True)
106
+ inventory_dict = sh.convert_to_dict(inventory_dict)
107
+ if inventory_dict['inventory']:
108
+ store_inventory_value = inventory_dict['inventory']
109
+ store_inventory_value = process_text.format_inventory(store_inventory_value)
110
 
111
  #Return each State variable twice, once to the variable and once to the textbox
112
+ return [store_inventory_value,store_inventory_value
113
+ ]
114
+
115
+ def inventory_to_dict(inventory):
116
+ inventory_dict = process_text.parse_text_to_inventory(inventory)
117
+ inventory_dict = sh.convert_to_dict(inventory_dict)
118
+ return inventory_dict, inventory_dict
119
 
120
+ #Function to dynamically render textbox if it has text.
121
  def update_visibility(textbox):
122
  if not textbox:
123
  return gr.update(visible=False)
124
  return gr.update(visible=True)
125
  with gr.Tab("Store"):
126
+ user_store_dict = gr.Textbox(label = "Step 1 : What are the core qualities of the store?",
127
  lines = 1, placeholder=f"Ex : A trade shop with a female ogre merchant, basic trade goods and travel supplies, has a secret basement for smuggling.",
128
  elem_id= "custom-textbox")
129
  desc_gen = gr.Button(value = "Click to Generate Description")
130
+ store_name_output = gr.Textbox(label = "Store Name", lines = 1, interactive = True, visible = False)
131
+ store_name_output.change(fn=update_visibility,
132
+ inputs=[store_name_output],
133
+ outputs=[store_name_output])
134
+ store_description_output = gr.Textbox(label = "Store Description", lines = 1, interactive = True, visible = True)
135
  store_description_output.change(fn=update_visibility,
136
  inputs=[store_description_output],
137
  outputs=[store_description_output])
138
+ store_reputation_output = gr.Textbox(label = "Store Reputation", lines = 1, interactive = True, visible = True)
139
+ store_backstory_output = gr.Textbox(label = "Store Backstory", lines = 1, interactive = True, visible = True)
140
+ store_sd_prompt_output = gr.Textbox(label = "Store Image Prompt", lines = 1, interactive = True, visible = True)
141
+ store_type_output = gr.Textbox(label = "Store Type", lines = 1, interactive = True, visible = True)
142
+ store_size_output = gr.Textbox(label = "Store Size", lines = 1, interactive = True, visible = True)
143
+ store_location_output = gr.Textbox(label = "Store Location", lines = 1, interactive = True, visible = True)
144
+ store_owner_output = gr.Textbox(label = "Owners", lines = 1, interactive = True, visible = True)
145
+ store_employees_output = gr.Textbox(label = "Employees", lines = 1, interactive = True, visible = True)
146
+ notable_customers_output = gr.Textbox(label = "Notable Customers", lines = 1, interactive = True, visible = True)
147
+ store_hours_output = gr.Textbox(label = "Hours", lines = 1, interactive = True, visible = True)
148
+ store_services_output = gr.Textbox(label = "Services", lines = 1, interactive = True, visible = True)
149
+ store_specialties_output = gr.Textbox(label = "Specialties", lines = 1, interactive = True, visible = True)
150
+ store_quests_output = gr.Textbox(label = "Quests", lines = 1, interactive = True, visible = True)
151
+ store_rumors_output = gr.Textbox(label = "Rumors", lines = 1, interactive = True, visible = True)
152
+
153
 
154
+ desc_gen.click(fn = gen_store_desc, inputs = [user_store_dict],
155
+ outputs= [
156
+ store_name, store_name_output,
157
+ store_description, store_description_output,
158
+ store_reputation, store_reputation_output,
159
+ store_backstory, store_backstory_output,
160
+ store_sd_prompt,store_sd_prompt_output,
161
+ store_type, store_type_output,
162
+ store_size, store_size_output,
163
+ store_location, store_location_output,
164
+ store_owner, store_owner_output,
165
+ store_employees, store_employees_output,
166
+ notable_customers, notable_customers_output,
167
+ store_hours, store_hours_output,
168
+ store_services,store_services_output,
169
+ store_specialties,store_specialties_output,
170
+ store_quests, store_quests_output,
171
+ store_rumors, store_rumors_output
172
+ ])
173
+
174
  image_path_list= u.absolute_path("./folder_with_images")
175
 
176
+ with gr.Tab("Inventory"):
177
+ inv_gen = gr.Button(value = "Click to Generate Inventory")
178
+ store_inventory_output = gr.Textbox(label = 'Inventory', lines = 16, interactive=True, visible=True)
179
+ store_inventory_output.change(fn=update_visibility,
180
+ inputs=[store_inventory_output],
181
+ outputs=[store_inventory_output])
182
+ inv_gen.click(fn = gen_store_inventory, inputs = [store_name, store_type, store_size, store_owner, store_reputation],
183
+ outputs= [store_inventory, store_inventory_output
184
+ ])
185
+ dict_gen = gr.Button(value = "Click to convert test to data object")
186
+ store_inventory_dict_output = gr.Textbox(label = 'Inventory', lines = 16, interactive=True, visible=True)
187
+
188
+ dict_gen.click(fn = inventory_to_dict, inputs = [store_inventory_output],
189
+ outputs= [store_inventory_dict, store_inventory_dict_output
190
  ])
191
+
192
 
193
  image_path_list= u.absolute_path("./folder_with_images")
194
  if __name__ == "__main__":
dependencies/5ePHBstyle.css ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity.woff2');font-weight:normal;font-style:normal}@font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity Bold.woff2');font-weight:bold;font-style:normal}@font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity Italic.woff2');font-weight:normal;font-style:italic}@font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity Bold Italic.woff2');font-weight:bold;font-style:italic}@font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans.woff2');font-weight:normal;font-style:normal}@font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans Bold.woff2');font-weight:bold;font-style:normal}@font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans Italic.woff2');font-weight:normal;font-style:italic}@font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans Bold Italic.woff2');font-weight:bold;font-style:italic}@font-face{font-family:ScalySansSmallCapsRemake;src:url('./themes/fonts/5e/Scaly Sans Caps.woff2');font-weight:normal;font-style:normal}@font-face{font-family:WalterTurncoat;src:url('./themes/fonts/5e/WalterTurncoat-Regular.woff2');font-weight:normal;font-style:normal}@font-face{font-family:MrEavesRemake;src:url('./themes/fonts/5e/Mr Eaves Small Caps.woff2');font-weight:normal;font-style:normal}@font-face{font-family:SolberaImitationRemake;src:url('./themes/fonts/5e/Solbera Imitation Tweak.woff2');font-weight:normal;font-style:normal}@font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed.woff2');font-weight:normal;font-style:normal}@font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed Bold.woff2');font-weight:bold;font-style:normal}@font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed Italic.woff2');font-weight:normal;font-style:italic}@font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed Bold Italic.woff2');font-weight:bold;font-style:italic}@font-face{font-family:NodestoCapsWide;src:url('./themes/fonts/5e/Nodesto Caps Wide.woff2');font-weight:normal;font-style:normal}@font-face{font-family:Overpass;src:url('./themes/fonts/5e/Overpass Medium.woff2');font-weight:500;font-style:normal}@font-face{font-family:Davek;src:url('./themes/fonts/5e/Davek.woff2');font-weight:500;font-style:normal}@font-face{font-family:Iokharic;src:url('./themes/fonts/5e/Iokharic.woff2');font-weight:500;font-style:normal}@font-face{font-family:Rellanic;src:url('./themes/fonts/5e/Rellanic.woff2');font-weight:500;font-style:normal}:root{--HB_Color_Background:#EEE5CE;--HB_Color_Accent:#E0E5C1;--HB_Color_HeaderUnderline:#C0AD6A;--HB_Color_HorizontalRule:#9C2B1B;--HB_Color_HeaderText:#58180D;--HB_Color_MonsterStatBackground:#F2E5B5;--HB_Color_CaptionText:#766649;--HB_Color_WatercolorStain:#BBAD82;--HB_Color_Footnotes:#C9AD6A}@page{margin:0}body{counter-reset:phb-page-numbers}*{-webkit-print-color-adjust:exact}.columnWrapper{column-gap:inherit;max-height:100%;column-span:all;columns:inherit}.page{column-count:2;column-fill:auto;column-gap:.9cm;column-width:8cm;-webkit-column-count:2;-moz-column-count:2;-webkit-column-width:8cm;-moz-column-width:8cm;-webkit-column-gap:.9cm;-moz-column-gap:.9cm;position:relative;z-index:15;box-sizing:border-box;width:215.9mm;height:279.4mm;padding:1.4cm 1.9cm 1.7cm;overflow:hidden;font-family:"BookInsanityRemake";font-size:.34cm;counter-increment:phb-page-numbers;background-color:var(--HB_Color_Background);background-image:url('./themes/assets/parchmentBackground.jpg');text-rendering:optimizeLegibility;page-break-before:always;page-break-after:always}.page p{display:block;line-height:1.25em;overflow-wrap:break-word}.page p+*{margin-top:.325cm}.page p+p{margin-top:0}.page ul{padding-left:1.4em;margin-bottom:.8em;line-height:1.25em;list-style-position:outside;list-style-type:disc}.page ol{padding-left:1.4em;margin-bottom:.8em;line-height:1.25em;list-style-position:outside;list-style-type:decimal}.page p+p,.page ul+p,.page ol+p{text-indent:1em}.page img{z-index:-1}.page strong{font-weight:bold;letter-spacing:-0.02em}.page em{font-style:italic}.page sup{font-size:smaller;line-height:0;vertical-align:super}.page sub{font-size:smaller;line-height:0;vertical-align:sub}.page h1,.page h2,.page h3,.page h4{font-family:"MrEavesRemake";font-weight:800;color:var(--HB_Color_HeaderText)}.page h1{margin-bottom:.18cm;column-span:all;font-size:.89cm;line-height:1em;-webkit-column-span:all;-moz-column-span:all}.page h1+p::first-letter{float:left;padding-bottom:2px;padding-left:40px;margin-top:-0.3cm;margin-bottom:-20px;margin-left:-40px;font-family:"SolberaImitationRemake";font-size:3.5cm;line-height:1em;color:rgba(0,0,0,0);background-image:linear-gradient(-45deg, #322814, #998250, #322814);-webkit-background-clip:text;background-clip:text}.page h1+p::first-line{font-variant:small-caps}.page h2{font-size:.75cm;line-height:.988em}.page h3{font-size:.575cm;line-height:.995em;border-bottom:2px solid var(--HB_Color_HeaderUnderline)}.page h3+*{margin-top:.17cm}.page *+h3{margin-top:.155cm}.page h4{font-size:.458cm;line-height:.971em}.page h4+*{margin-top:.09cm}.page *+h4{margin-top:.235cm}.page h5{font-family:"ScalySansSmallCapsRemake";font-size:.423cm;font-weight:900;line-height:.951em}.page h5+*{margin-top:.2cm}.page table{font-family:"ScalySansRemake";font-size:.318cm;line-height:1.2em;width:100%;line-height:16px}.page table p,.page table dl,.page table ul,.page table ol{line-height:1.2em}.page table ul,.page table ol{padding-left:1em}.page table em{font-style:italic}.page table strong{font-weight:800;letter-spacing:-0.02em}.page table h5+*{margin-top:.1cm}.page table+*{margin-top:.325cm}.page table thead{display:table-row-group;font-weight:800}.page table thead th{padding:0 1.5px;vertical-align:bottom}.page table tbody tr td{padding:0 1.5px}.page table tbody tr:nth-child(odd){background-color:var(--HB_Color_Accent)}.page .quote>p{font-style:italic;line-height:.54cm}.page .quote>p:first-child::first-line{font-size:.38cm;font-style:normal;font-variant:small-caps}.page .quote p+.attribution{margin-top:0}.page .quote .attribution{display:block;font-style:normal;line-height:.54cm;text-align:right}.page .quote .attribution::before{margin-right:.2em;content:'---'}.page .quote+*{margin-top:.54cm}.page .note{font-family:"ScalySansRemake";font-size:.318cm;line-height:1.2em;padding:.13cm .16cm;background-color:var(--HB_Color_Accent);border-style:solid;border-width:1px;border-image:url('../dependencies/themes/assets/noteBorder.png') 12 stretch;border-image-width:11px;border-image-outset:9px 0px;box-shadow:1px 4px 14px #888888}.page .note p,.page .note dl,.page .note ul,.page .note ol{line-height:1.2em}.page .note ul,.page .note ol{padding-left:1em}.page .note em{font-style:italic}.page .note strong{font-weight:800;letter-spacing:-0.02em}.page .note h5+*{margin-top:.1cm}.page :where(.page .note){margin-top:9px}.page .note+*{margin-top:.45cm}.page .note h5{font-size:.375cm}.page .note p{display:block;padding-bottom:0px}.page .note :last-child{margin-bottom:0}.page .descriptive{font-family:"ScalySansRemake";font-size:.318cm;line-height:1.2em;padding:.1em;background-color:#FAF7EA;border-style:solid;border-width:7px;border-image:url('themes/assets/descriptiveBorder.png') 12 stretch;border-image-outset:4px;box-shadow:0 0 6px #FAF7EA}.page .descriptive p,.page .descriptive dl,.page .descriptive ul,.page .descriptive ol{line-height:1.2em}.page .descriptive ul,.page .descriptive ol{padding-left:1em}.page .descriptive em{font-style:italic}.page .descriptive strong{font-weight:800;letter-spacing:-0.02em}.page .descriptive h5+*{margin-top:.1cm}.page :where(.page .descriptive){margin-top:4px}.page .descriptive+*{margin-top:.45cm}.page .descriptive h5{font-size:.375cm}.page .descriptive p{display:block;padding-bottom:0px;line-height:1.5em}.page .descriptive :last-child{margin-bottom:0}.page .artist{position:absolute;width:auto;font-family:"WalterTurncoat";font-size:.27cm;color:var(--HB_Color_CaptionText);text-align:center}.page .artist p,.page .artist p+p{margin:unset;line-height:1em;text-indent:unset}.page .artist h5{font-family:"WalterTurncoat";font-size:1.3em}.page .artist a{color:inherit;text-decoration:unset}.page .artist a:hover{text-decoration:underline}.page .watermark{position:absolute;top:0;left:0;z-index:500;display:grid !important;place-items:center;justify-content:center;width:100%;height:100%;font-size:120px;color:black;text-transform:uppercase;mix-blend-mode:overlay;opacity:30%;transform:rotate(-45deg)}.page .watermark p{margin-bottom:none}.page [class*='watercolor']{position:absolute;z-index:-2;width:2000px;height:2000px;background-color:var(--HB_Color_WatercolorStain);background-size:cover;-webkit-mask-image:var(--wc);-webkit-mask-size:contain;-webkit-mask-repeat:no-repeat;mask-image:var(--wc);mask-size:contain;mask-repeat:no-repeat;--wc:url('/assets/watercolor/watercolor1.png')}.page .watercolor1{--wc:url('/assets/watercolor/watercolor1.png')}.page .watercolor2{--wc:url('/assets/watercolor/watercolor2.png')}.page .watercolor3{--wc:url('/assets/watercolor/watercolor3.png')}.page .watercolor4{--wc:url('/assets/watercolor/watercolor4.png')}.page .watercolor5{--wc:url('/assets/watercolor/watercolor5.png')}.page .watercolor6{--wc:url('/assets/watercolor/watercolor6.png')}.page .watercolor7{--wc:url('/assets/watercolor/watercolor7.png')}.page .watercolor8{--wc:url('/assets/watercolor/watercolor8.png')}.page .watercolor9{--wc:url('/assets/watercolor/watercolor9.png')}.page .watercolor10{--wc:url('/assets/watercolor/watercolor10.png')}.page .watercolor11{--wc:url('/assets/watercolor/watercolor11.png')}.page .watercolor12{--wc:url('/assets/watercolor/watercolor12.png')}.page .monster{font-family:"ScalySansRemake";font-size:.318cm;line-height:1.2em;position:relative;padding:0px;margin-bottom:.325cm}.page .monster p,.page .monster dl,.page .monster ul,.page .monster ol{line-height:1.2em}.page .monster ul,.page .monster ol{padding-left:1em}.page .monster em{font-style:italic}.page .monster strong{font-weight:800;letter-spacing:-0.02em}.page .monster h5+*{margin-top:.1cm}.page .monster.frame{width:calc(100% + .32cm);padding:4px 2px;margin-right:-0.16cm;margin-left:-0.16cm;background-color:var(--HB_Color_MonsterStatBackground);background-image:url('./themes/assets/parchmentBackgroundGrayscale.jpg');background-attachment:fixed;background-blend-mode:overlay;border-style:solid;border-width:7px 6px;border-image:url('./themes/assets/monsterBorderFancy.png') 14 round;border-image-outset:0px 2px;box-shadow:1px 4px 14px #888888}.page .monster h2{margin:0;font-size:.62cm;line-height:1em}.page .monster h2+p{margin-bottom:0;font-size:.304cm}.page .monster h3{padding-bottom:.05cm;font-family:"ScalySansRemake";font-weight:800;font-variant:small-caps;border-bottom:2px solid var(--HB_Color_HeaderText)}.page .monster hr{height:6px;margin:.12cm 0;visibility:visible;background-image:url('./themes/assets/redTriangle.png');background-size:100% 100%;border:none}.page .monster hr~:is(dl,p){color:var(--HB_Color_HeaderText)}.page .monster hr:last-of-type~:is(dl,p){color:inherit}.page .monster hr:last-of-type+*{margin-top:.325cm}.page .monster hr+table:first-of-type{margin:0;column-span:none;color:var(--HB_Color_HeaderText);background-color:transparent;border-style:none;border-image:none;-webkit-column-span:none}.page .monster hr+table:first-of-type tr{background-color:transparent}.page .monster hr+table:first-of-type td,.page .monster hr+table:first-of-type th{padding:0px}.page .monster :last-child{margin-bottom:0}.page .monster.wide{column-count:2;column-fill:balance;column-gap:.9cm;column-width:7.68cm;-webkit-column-count:2;-moz-column-count:2;-webkit-column-width:7.68cm;-moz-column-width:7.68cm;-webkit-column-gap:.9cm;-moz-column-gap:.9cm}.page:after{position:absolute;bottom:0px;left:0px;z-index:100;width:100%;height:50px;content:'';background-image:url('./themes/assets/PHB_footerAccent.png');background-size:cover}.page:nth-child(even)::after{transform:scaleX(-1)}.page:nth-child(even) .pageNumber{left:2px}.page:nth-child(even) .footnote{left:80px;text-align:left}.page .pageNumber{position:absolute;right:2px;bottom:22px;width:50px;font-size:.9em;color:var(--HB_Color_Footnotes);text-align:center;text-indent:0}.page .pageNumber.auto::after{content:counter(phb-page-numbers)}.page .footnote{position:absolute;right:80px;bottom:32px;z-index:150;width:200px;font-size:.8em;color:var(--HB_Color_Footnotes);text-align:right}.page code{padding:0px 4px;font-family:'Courier New',"Courier",monospace;font-size:.325;color:#58180D;overflow-wrap:break-word;white-space:pre-wrap;background-color:#FAF7EA;border-radius:4px}.page pre code{display:inline-block;width:100%;padding:.15cm;margin-bottom:2px;border-style:solid;border-width:1px;border-radius:12px;border-image:url('/assets/codeBorder.png') 26 stretch;border-image-width:10px;border-image-outset:2px}.page :where(.page pre code){margin-top:2px}.page pre code+*{margin-top:.325cm}.page hr{margin:0px;visibility:hidden}.page .columnSplit{visibility:hidden;-webkit-column-break-after:always;break-after:always;-moz-column-break-after:always}.page blockquote,.page table{z-index:15;-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid}.page table+p{text-indent:1em}.page ul ul,.page ol ol,.page ul ol,.page ol ul{margin-bottom:0px;margin-left:1.5em}.page li{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid}.page .spellList{font-family:"ScalySansRemake";font-size:.318cm;line-height:1.2em;column-count:2}.page .spellList p,.page .spellList dl,.page .spellList ul,.page .spellList ol{line-height:1.2em}.page .spellList ul,.page .spellList ol{padding-left:1em}.page .spellList em{font-style:italic}.page .spellList strong{font-weight:800;letter-spacing:-0.02em}.page .spellList h5+*{margin-top:.1cm}.page .spellList ul+h5{margin-top:15px}.page .spellList p,.page .spellList ul{font-size:.352cm;line-height:1.265em}.page .spellList ul{padding-left:1em;margin-bottom:.5em;text-indent:-1em;list-style-type:none;-webkit-column-break-inside:auto;page-break-inside:auto;break-inside:auto}.page .spellList.wide{column-count:4}
2
+ .page .classTable th[colspan]:not([rowspan]){white-space:nowrap}
3
+ .page .classTable.frame{width:calc(100% + .2cm);
4
+ margin-top:.7cm;
5
+ margin-right:-0.1cm;
6
+ margin-bottom:.9cm;
7
+ margin-left:-0.1cm;
8
+ border-collapse:separate;
9
+ background-color:white;
10
+ border:initial;
11
+ border-style:solid;
12
+ border-image-source:url('../dependencies/themes/assets/frameBorder.png');
13
+ border-image-slice:200;
14
+ border-image-width:47px;
15
+ border-image-outset:.4cm .3cm;
16
+ border-image-repeat:stretch}
17
+ .page.classTable.frame.wide:first-child{margin-top:.12cm}
18
+ .page .classTable.frame+*{margin-top:0}
19
+ .page .classTable.decoration{position:relative}
20
+ .page .classTable.decoration::before{position:absolute;top:50%;left:50%;z-index:-1;width:7.75cm;height:calc(100% + 3.3cm);content:'';background-image:url('../../dependencies/assets/classTableDecoration.png'),url('/assets/classTableDecoration.png');filter:drop-shadow(0 0 1px #C8C5C080);background-repeat:no-repeat,no-repeat;background-position:top, bottom;background-size:contain, contain;transform:translateY(-50%) translateX(-50%)}.page .classTable.decoration.wide::before{width:calc(100% + 3.3cm);height:7.75cm;background-position:left, right}.page .classTable h5+table{margin-top:.2cm}.page:has(.frontCover){columns:1;text-align:center}.page:has(.frontCover)::after{all:unset}.page:has(.frontCover) h1{margin-top:1.2cm;margin-bottom:0;font-family:"NodestoCapsCondensed";font-size:2.245cm;font-weight:normal;line-height:.85em;color:white;text-shadow:unset;text-transform:uppercase;filter:drop-shadow(0 0 1.5px black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)}.page:has(.frontCover) h2{font-family:"NodestoCapsCondensed";font-size:.85cm;font-weight:normal;color:white;letter-spacing:.1cm;filter:drop-shadow(0 0 1px black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)}.page:has(.frontCover) hr{position:relative;display:block;width:12cm;height:.5cm;margin:auto;visibility:visible;background-image:url('/assets/horizontalRule.svg');filter:drop-shadow(0 0 3px black);background-size:100% 100%;border:none}.page:has(.frontCover) .banner{position:absolute;bottom:4.2cm;left:0;display:flex;flex-direction:column;justify-content:center;width:10.5cm;height:1.7cm;padding-top:.1cm;padding-left:1cm;font-family:"NodestoCapsCondensed";font-size:1cm;font-weight:normal;color:white;text-align:left;letter-spacing:.014cm;background-image:url('/assets/coverPageBanner.svg');filter:drop-shadow(2px 2px 2px black)}.page:has(.frontCover) .footnote{position:absolute;right:0;bottom:1.3cm;left:0;width:70%;margin-right:auto;margin-left:auto;font-family:"Overpass";font-size:.496cm;color:white;text-align:center;filter:drop-shadow(0 0 .7px black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)}.page:has(.frontCover) .logo{position:absolute;top:.5cm;right:0;left:0;filter:drop-shadow(0 0 .075cm black)}.page:has(.frontCover) .logo img{width:100%;height:2cm}.page:has(.insideCover){columns:1;text-align:center}.page:has(.insideCover)::after{all:unset}.page:has(.insideCover) h1{margin-top:1.2cm;margin-bottom:0;font-family:"NodestoCapsCondensed";font-size:2.1cm;font-weight:normal;line-height:.85em;text-transform:uppercase}.page:has(.insideCover) h2{font-family:"NodestoCapsCondensed";font-size:.85cm;font-weight:normal;letter-spacing:.5cm}.page:has(.insideCover) hr{position:relative;display:block;width:12cm;height:.5cm;margin:auto;visibility:visible;background-image:url('/assets/horizontalRule.svg');background-size:100% 100%;border:none}.page:has(.insideCover) .logo{position:absolute;right:0;bottom:1cm;left:0;height:2cm}.page:has(.insideCover) .logo img{width:100%;height:2cm}.page:has(.backCover){padding:2.25cm 1.3cm 2cm 1.3cm;color:#FFFFFF;columns:1}.page:has(.backCover)::after{all:unset}.page:has(.backCover) .columnWrapper{width:7.6cm}.page:has(.backCover) .backCover{position:absolute;inset:0;z-index:-1;width:11cm;background-image:url('/assets/backCover.png');background-repeat:no-repeat;background-size:contain}.page:has(.backCover) .blank{height:1.4em}.page:has(.backCover) h1{margin-bottom:.3cm;font-family:"NodestoCapsCondensed";font-size:1.35cm;line-height:.95em;color:#ED1C24;text-align:center}.page:has(.backCover) h1+p::first-line,.page:has(.backCover) h1+p::first-letter{all:unset}.page:has(.backCover) img{position:absolute;top:0px;z-index:-2;height:100%}.page:has(.backCover) hr{width:4.5cm;height:.53cm;margin-top:1.1cm;margin-right:auto;margin-left:auto;visibility:visible;background-image:url('/assets/horizontalRule.svg');background-size:100% 100%;border:none}.page:has(.backCover) p{font-family:"Overpass";font-size:.332cm;line-height:1.5em}.page:has(.backCover) hr+p{margin-top:.6cm;text-align:center}.page:has(.backCover) .logo{position:absolute;bottom:2cm;left:1.2cm;z-index:0;width:7.6cm;height:1.5cm}.page:has(.backCover) .logo img{position:relative;z-index:0;width:100%;height:1.5cm}.page:has(.backCover) .logo p{position:relative;width:100%;font-family:"NodestoCapsWide";font-size:.4cm;line-height:1em;color:#FFFFFF;text-align:center;text-indent:0;letter-spacing:.08em}.page:has(.partCover){padding-top:0;text-align:center;columns:1}.page:has(.partCover) .partCover{position:absolute;top:0;left:0;width:100%;height:6cm;background-image:url('/assets/partCoverHeaderPHB.png');background-repeat:no-repeat;background-size:100%}.page:has(.partCover) h1{position:relative;margin-top:.4cm;font-family:"NodestoCapsCondensed";font-size:2.3cm;text-align:center;text-transform:uppercase}.page:has(.partCover) h2{position:relative;margin-top:-0.7em;margin-right:auto;margin-left:auto;font-family:"Overpass";font-size:.45cm;line-height:1.1em}.page:has(.toc)::after{display:none}.page .toc{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid}.page .toc h1{margin-bottom:.3cm;text-align:center}.page .toc a{display:inline;color:inherit;text-decoration:none}.page .toc a:hover{text-decoration:underline}.page .toc h4{margin-top:.2cm;line-height:.4cm}.page .toc h4+ul li{line-height:1.2em}.page .toc ul{padding-left:0;margin-top:0;list-style-type:none}.page .toc ul a{display:flex;flex-flow:row nowrap;justify-content:space-between;width:100%}.page .toc ul li+li h3{margin-top:.26cm;line-height:1em}.page .toc ul h3 span:first-child::after{border:none}.page .toc ul span{display:contents}.page .toc ul span:first-child::after{bottom:.08cm;flex:1;margin-right:.16cm;margin-bottom:.08cm;margin-left:.08cm;content:'';border-bottom:.05cm dotted #000000}.page .toc ul span:last-child{display:inline-block;align-self:flex-end;font-family:'BookInsanityRemake';font-size:.34cm;font-weight:normal;color:#000000}.page .toc ul ul{margin-left:1em}.page .toc.wide{column-count:2;column-fill:balance;column-gap:.9cm;column-width:7.68cm;-webkit-column-count:2;-moz-column-count:2;-webkit-column-width:7.68cm;-moz-column-width:7.68cm;-webkit-column-gap:.9cm;-moz-column-gap:.9cm}.page dl{padding-left:1em;line-height:1.25em;white-space:pre-line}.page dl+*{margin-top:.28cm}.page dl+*{margin-top:.17cm}.page p+dl{margin-top:.17cm}.page dt{display:inline;margin-right:5px;margin-left:-1em}.page dd{display:inline;margin-left:0px;text-indent:0px}.page .wide{margin-bottom:.325cm}.page h1+*{margin-top:0}.page .runeTable{margin-block:.7cm}.page .runeTable table{font-family:inherit}.page .runeTable table tbody tr{background:unset}.page .runeTable table th,.page .runeTable table td{width:1.3cm;height:1.3cm;font-weight:normal;text-transform:uppercase;vertical-align:middle;outline:1px solid #000000}.page .runeTable table th{font-family:"BookInsanityRemake";font-size:.45cm}.page .runeTable table td{font-size:.7cm}.page .runeTable.frame{border:initial;border-style:solid;border-image-source:url('/assets/scriptBorder.png');border-image-slice:170;border-image-width:1.4cm;border-image-outset:.45cm .35cm .4cm .4cm;border-image-repeat:stretch}.page .index{font-size:.218cm}.page .index ul ul{margin:0}.page .index ul{padding-left:0;text-indent:0;list-style-type:none}.page .index>ul>li{padding-left:1.5em;text-indent:-1.5em}
dependencies/all.css ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ /*!
2
+ * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com
3
+ * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4
+ */
5
+ .fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.fab,.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900}
dependencies/bundle.css ADDED
The diff for this file is too large to render. See raw diff
 
dependencies/css.css ADDED
@@ -0,0 +1,288 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* cyrillic-ext */
2
+ @font-face {
3
+ font-family: 'Open Sans';
4
+ font-style: normal;
5
+ font-weight: 300;
6
+ font-stretch: 100%;
7
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');
8
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
9
+ }
10
+ /* cyrillic */
11
+ @font-face {
12
+ font-family: 'Open Sans';
13
+ font-style: normal;
14
+ font-weight: 300;
15
+ font-stretch: 100%;
16
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');
17
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
18
+ }
19
+ /* greek-ext */
20
+ @font-face {
21
+ font-family: 'Open Sans';
22
+ font-style: normal;
23
+ font-weight: 300;
24
+ font-stretch: 100%;
25
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');
26
+ unicode-range: U+1F00-1FFF;
27
+ }
28
+ /* greek */
29
+ @font-face {
30
+ font-family: 'Open Sans';
31
+ font-style: normal;
32
+ font-weight: 300;
33
+ font-stretch: 100%;
34
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');
35
+ unicode-range: U+0370-03FF;
36
+ }
37
+ /* hebrew */
38
+ @font-face {
39
+ font-family: 'Open Sans';
40
+ font-style: normal;
41
+ font-weight: 300;
42
+ font-stretch: 100%;
43
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');
44
+ unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
45
+ }
46
+ /* vietnamese */
47
+ @font-face {
48
+ font-family: 'Open Sans';
49
+ font-style: normal;
50
+ font-weight: 300;
51
+ font-stretch: 100%;
52
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');
53
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
54
+ }
55
+ /* latin-ext */
56
+ @font-face {
57
+ font-family: 'Open Sans';
58
+ font-style: normal;
59
+ font-weight: 300;
60
+ font-stretch: 100%;
61
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');
62
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
63
+ }
64
+ /* latin */
65
+ @font-face {
66
+ font-family: 'Open Sans';
67
+ font-style: normal;
68
+ font-weight: 300;
69
+ font-stretch: 100%;
70
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');
71
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
72
+ }
73
+ /* cyrillic-ext */
74
+ @font-face {
75
+ font-family: 'Open Sans';
76
+ font-style: normal;
77
+ font-weight: 400;
78
+ font-stretch: 100%;
79
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');
80
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
81
+ }
82
+ /* cyrillic */
83
+ @font-face {
84
+ font-family: 'Open Sans';
85
+ font-style: normal;
86
+ font-weight: 400;
87
+ font-stretch: 100%;
88
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');
89
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
90
+ }
91
+ /* greek-ext */
92
+ @font-face {
93
+ font-family: 'Open Sans';
94
+ font-style: normal;
95
+ font-weight: 400;
96
+ font-stretch: 100%;
97
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');
98
+ unicode-range: U+1F00-1FFF;
99
+ }
100
+ /* greek */
101
+ @font-face {
102
+ font-family: 'Open Sans';
103
+ font-style: normal;
104
+ font-weight: 400;
105
+ font-stretch: 100%;
106
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');
107
+ unicode-range: U+0370-03FF;
108
+ }
109
+ /* hebrew */
110
+ @font-face {
111
+ font-family: 'Open Sans';
112
+ font-style: normal;
113
+ font-weight: 400;
114
+ font-stretch: 100%;
115
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');
116
+ unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
117
+ }
118
+ /* vietnamese */
119
+ @font-face {
120
+ font-family: 'Open Sans';
121
+ font-style: normal;
122
+ font-weight: 400;
123
+ font-stretch: 100%;
124
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');
125
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
126
+ }
127
+ /* latin-ext */
128
+ @font-face {
129
+ font-family: 'Open Sans';
130
+ font-style: normal;
131
+ font-weight: 400;
132
+ font-stretch: 100%;
133
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');
134
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
135
+ }
136
+ /* latin */
137
+ @font-face {
138
+ font-family: 'Open Sans';
139
+ font-style: normal;
140
+ font-weight: 400;
141
+ font-stretch: 100%;
142
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');
143
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
144
+ }
145
+ /* cyrillic-ext */
146
+ @font-face {
147
+ font-family: 'Open Sans';
148
+ font-style: normal;
149
+ font-weight: 600;
150
+ font-stretch: 100%;
151
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');
152
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
153
+ }
154
+ /* cyrillic */
155
+ @font-face {
156
+ font-family: 'Open Sans';
157
+ font-style: normal;
158
+ font-weight: 600;
159
+ font-stretch: 100%;
160
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');
161
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
162
+ }
163
+ /* greek-ext */
164
+ @font-face {
165
+ font-family: 'Open Sans';
166
+ font-style: normal;
167
+ font-weight: 600;
168
+ font-stretch: 100%;
169
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');
170
+ unicode-range: U+1F00-1FFF;
171
+ }
172
+ /* greek */
173
+ @font-face {
174
+ font-family: 'Open Sans';
175
+ font-style: normal;
176
+ font-weight: 600;
177
+ font-stretch: 100%;
178
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');
179
+ unicode-range: U+0370-03FF;
180
+ }
181
+ /* hebrew */
182
+ @font-face {
183
+ font-family: 'Open Sans';
184
+ font-style: normal;
185
+ font-weight: 600;
186
+ font-stretch: 100%;
187
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');
188
+ unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
189
+ }
190
+ /* vietnamese */
191
+ @font-face {
192
+ font-family: 'Open Sans';
193
+ font-style: normal;
194
+ font-weight: 600;
195
+ font-stretch: 100%;
196
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');
197
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
198
+ }
199
+ /* latin-ext */
200
+ @font-face {
201
+ font-family: 'Open Sans';
202
+ font-style: normal;
203
+ font-weight: 600;
204
+ font-stretch: 100%;
205
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');
206
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
207
+ }
208
+ /* latin */
209
+ @font-face {
210
+ font-family: 'Open Sans';
211
+ font-style: normal;
212
+ font-weight: 600;
213
+ font-stretch: 100%;
214
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');
215
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
216
+ }
217
+ /* cyrillic-ext */
218
+ @font-face {
219
+ font-family: 'Open Sans';
220
+ font-style: normal;
221
+ font-weight: 700;
222
+ font-stretch: 100%;
223
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2');
224
+ unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
225
+ }
226
+ /* cyrillic */
227
+ @font-face {
228
+ font-family: 'Open Sans';
229
+ font-style: normal;
230
+ font-weight: 700;
231
+ font-stretch: 100%;
232
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2');
233
+ unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
234
+ }
235
+ /* greek-ext */
236
+ @font-face {
237
+ font-family: 'Open Sans';
238
+ font-style: normal;
239
+ font-weight: 700;
240
+ font-stretch: 100%;
241
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2');
242
+ unicode-range: U+1F00-1FFF;
243
+ }
244
+ /* greek */
245
+ @font-face {
246
+ font-family: 'Open Sans';
247
+ font-style: normal;
248
+ font-weight: 700;
249
+ font-stretch: 100%;
250
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2');
251
+ unicode-range: U+0370-03FF;
252
+ }
253
+ /* hebrew */
254
+ @font-face {
255
+ font-family: 'Open Sans';
256
+ font-style: normal;
257
+ font-weight: 700;
258
+ font-stretch: 100%;
259
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2');
260
+ unicode-range: U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F;
261
+ }
262
+ /* vietnamese */
263
+ @font-face {
264
+ font-family: 'Open Sans';
265
+ font-style: normal;
266
+ font-weight: 700;
267
+ font-stretch: 100%;
268
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2');
269
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
270
+ }
271
+ /* latin-ext */
272
+ @font-face {
273
+ font-family: 'Open Sans';
274
+ font-style: normal;
275
+ font-weight: 700;
276
+ font-stretch: 100%;
277
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2');
278
+ unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
279
+ }
280
+ /* latin */
281
+ @font-face {
282
+ font-family: 'Open Sans';
283
+ font-style: normal;
284
+ font-weight: 700;
285
+ font-stretch: 100%;
286
+ src: url(https://fonts.gstatic.com/s/opensans/v36/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2');
287
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
288
+ }
dependencies/homebrewery -cssPaths ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <link href="C:\AI\StatBlockGenerator\experiments\homebrewery\all.css" rel="stylesheet" />
2
+ <link href="C:\AI\StatBlockGenerator\experiments\homebrewery\css.css?family=Open+Sans:400,300,600,700" rel="stylesheet" type="text/css" />
3
+ <link href='C:\AI\StatBlockGenerator\experiments\homebrewery\bundle.css' rel='stylesheet' />
4
+ <link rel="icon" href="C:\AI\StatBlockGenerator\experiments\homebrewery\favicon.ico" type="image/x-icon" />
5
+ <link href='C:\AI\StatBlockGenerator\experiments\homebrewery\style.css' rel='stylesheet' />
6
+ <link href='C:\AI\StatBlockGenerator\experiments\homebrewery\5ePHBstyle.css' rel='stylesheet' />
7
+
8
+ <img class=" " style="width:325px; mix-blend-mode:multiply;" src="C:\AI\StatBlockGenerator\output\20231021-21\20231021-214854 [] Chocolate kiss of doom.png" alt="Chocolate Kiss of Doom">
dependencies/homebrewery-docker.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ docker run -it --rm -v ${PWD}:/app homebrewery node cli/process.js --input /app/my-brew.md --output /app/my-brew.html --renderer v3 --overwrite
dependencies/phb.standalone.css ADDED
The diff for this file is too large to render. See raw diff
 
dependencies/style.css ADDED
@@ -0,0 +1,615 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity.woff2');font-weight:normal;font-style:normal}
2
+ @font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity Bold.woff2');font-weight:bold;font-style:normal}
3
+ @font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity Italic.woff2');font-weight:normal;font-style:italic}
4
+ @font-face{font-family:BookInsanityRemake;src:url('./themes/fonts/5e/Bookinsanity Bold Italic.woff2');font-weight:bold;font-style:italic}
5
+ @font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans.woff2');font-weight:normal;font-style:normal}@font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans Bold.woff2');font-weight:bold;font-style:normal}
6
+ @font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans Italic.woff2');font-weight:normal;font-style:italic}
7
+ @font-face{font-family:ScalySansRemake;src:url('./themes/fonts/5e/Scaly Sans Bold Italic.woff2');font-weight:bold;font-style:italic}
8
+ @font-face{font-family:ScalySansSmallCapsRemake;src:url('./themes/fonts/5e/Scaly Sans Caps.woff2');font-weight:normal;font-style:normal}
9
+ @font-face{font-family:WalterTurncoat;src:url('./themes/fonts/5e/WalterTurncoat-Regular.woff2');font-weight:normal;font-style:normal}
10
+ @font-face{font-family:MrEavesRemake;src:url('./themes/fonts/5e/Mr Eaves Small Caps.woff2');font-weight:normal;font-style:normal}
11
+ @font-face{font-family:SolberaImitationRemake;src:url('./themes/fonts/5e/Solbera Imitation Tweak.woff2');font-weight:normal;font-style:normal}
12
+ @font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed.woff2');font-weight:normal;font-style:normal}
13
+ @font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed Bold.woff2');font-weight:bold;font-style:normal}
14
+ @font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed Italic.woff2');font-weight:normal;font-style:italic}
15
+ @font-face{font-family:NodestoCapsCondensed;src:url('./themes/fonts/5e/Nodesto Caps Condensed Bold Italic.woff2');font-weight:bold;font-style:italic}
16
+ @font-face{font-family:NodestoCapsWide;src:url('./themes/fonts/5e/Nodesto Caps Wide.woff2');font-weight:normal;font-style:normal}
17
+ @font-face{font-family:Overpass;src:url('./themes/fonts/5e/Overpass Medium.woff2');font-weight:500;font-style:normal}@font-face{font-family:Davek;src:url('./themes/fonts/5e/Davek.woff2');font-weight:500;font-style:normal}
18
+ @font-face{font-family:Iokharic;src:url('./themes/fonts/5e/Iokharic.woff2');font-weight:500;font-style:normal}
19
+ @font-face{font-family:Rellanic;src:url('./themes/fonts/5e/Rellanic.woff2');font-weight:500;font-style:normal}:root{--HB_Color_Background:#FFFFFF;--HB_Color_WatercolorStain:#000000}
20
+ @page {
21
+ margin: 0;
22
+ }
23
+
24
+ body {
25
+ counter-reset: phb-page-numbers;
26
+ }
27
+
28
+ * {
29
+ -webkit-print-color-adjust: exact;
30
+ }
31
+
32
+ .page .block {
33
+ break-inside: avoid;
34
+ display: inline-block;
35
+ width: 100%;
36
+ }
37
+
38
+ .page .block img {
39
+ z-index: 0;
40
+ }
41
+
42
+ .page .inline-block {
43
+ display: inline-block;
44
+ text-indent: initial;
45
+ }
46
+
47
+ .columnWrapper {
48
+ max-height: 100%;
49
+ column-span: all;
50
+ columns: inherit;
51
+ column-gap: inherit;
52
+ column-fill: inherit;
53
+ }
54
+
55
+ .page {
56
+ column-fill: auto;
57
+ column-count: 2;
58
+ height: 279.4mm;
59
+ width: 215.9mm;
60
+ padding: 1.4cm 1.9cm 1.7cm;
61
+ counter-increment: phb-page-numbers;
62
+ background-color: var(--HB_Color_Background);
63
+ position: relative;
64
+ z-index: 15;
65
+ box-sizing: border-box;
66
+ overflow: hidden;
67
+ text-rendering: optimizeLegibility;
68
+ page-break-before: always;
69
+ page-break-after: always;
70
+ contain: size;
71
+ }
72
+
73
+ .page p {
74
+ overflow-wrap: break-word;
75
+ display: block;
76
+ }
77
+
78
+ .page strong {
79
+ font-weight: bold;
80
+ }
81
+
82
+ .page em {
83
+ font-style: italic;
84
+ }
85
+
86
+ .page sup {
87
+ vertical-align: super;
88
+ font-size: smaller;
89
+ line-height: 0;
90
+ }
91
+
92
+ .page sub {
93
+ vertical-align: sub;
94
+ font-size: smaller;
95
+ line-height: 0;
96
+ }
97
+
98
+ .page ul {
99
+ list-style-position: outside;
100
+ list-style-type: disc;
101
+ padding-left: 1.4em;
102
+ }
103
+
104
+ .page ol {
105
+ list-style-position: outside;
106
+ list-style-type: decimal;
107
+ padding-left: 1.4em;
108
+ }
109
+
110
+ .page img {
111
+ z-index: -1;
112
+ }
113
+
114
+ .page h1,
115
+ .page h2,
116
+ .page h3,
117
+ .page h4,
118
+ .page h5,
119
+ .page h6 {
120
+ font-weight: bold;
121
+ line-height: 1.2em;
122
+ }
123
+
124
+ .page h1 {
125
+ font-size: 2em;
126
+ }
127
+
128
+ .page h2 {
129
+ font-size: 1.5em;
130
+ }
131
+
132
+ .page h3 {
133
+ font-size: 1.17em;
134
+ }
135
+
136
+ .page h4 {
137
+ font-size: 1em;
138
+ }
139
+
140
+ .page h5 {
141
+ font-size: 0.83em;
142
+ }
143
+
144
+ .page table {
145
+ width: 100%;
146
+ }
147
+
148
+ .page table thead {
149
+ display: table-row-group;
150
+ font-weight: bold;
151
+ }
152
+
153
+ .page div:not(.columnWrapper) > table + table {
154
+ margin-top: 0;
155
+ }
156
+ .page .classTable th[colspan]:not([rowspan]) {
157
+ white-space: nowrap;
158
+ }
159
+ .page .classTable.frame {
160
+ width: calc(100% + .2cm);
161
+ margin-top: .7cm;
162
+ margin-right: -0.1cm;
163
+ margin-bottom: .9cm;
164
+ margin-left: -0.1cm;
165
+ border-collapse: separate;
166
+ background-color: white;
167
+ border: initial;
168
+ border-style: solid;
169
+ border-image-source: url('../../dependencies/assets/frameBorder.png');
170
+ border-image-slice: 200;
171
+ border-image-width: 47px;
172
+ border-image-outset: .4cm .3cm;
173
+ border-image-repeat: stretch;
174
+ }
175
+
176
+ .page code {
177
+ font-family: "Courier New", Courier, monospace;
178
+ white-space: pre-wrap;
179
+ overflow-wrap: break-word;
180
+ }
181
+
182
+ .page pre code {
183
+ width: 100%;
184
+ display: inline-block;
185
+ }
186
+
187
+ .page .columnSplit {
188
+ visibility: hidden;
189
+ -webkit-column-break-after: always;
190
+ break-after: always;
191
+ -moz-column-break-after: always;
192
+ margin-top: 0;
193
+ }
194
+
195
+ .page .columnSplit + * {
196
+ margin-top: 0;
197
+ }
198
+
199
+ .page blockquote,
200
+ .page table {
201
+ z-index: 15;
202
+ -webkit-column-break-inside: avoid;
203
+ page-break-inside: avoid;
204
+ break-inside: avoid;
205
+ }
206
+
207
+
208
+ .page ul ul,
209
+ .page ol ol,
210
+ .page ul ol,
211
+ .page ol ul {
212
+ margin-bottom: 0px;
213
+ margin-left: 1.5em;
214
+ }
215
+
216
+ .page li {
217
+ -webkit-column-break-inside: avoid;
218
+ page-break-inside: avoid;
219
+ break-inside: avoid;
220
+ }
221
+
222
+ .page .watermark {
223
+ display: grid !important;
224
+ place-items: center;
225
+ justify-content: center;
226
+ position: absolute;
227
+ margin: 0;
228
+ top: 0;
229
+ left: 0;
230
+ width: 100%;
231
+ height: 100%;
232
+ font-size: 120px;
233
+ text-transform: uppercase;
234
+ mix-blend-mode: overlay;
235
+ opacity: 30%;
236
+ transform: rotate(-45deg);
237
+ z-index: 500;
238
+ }
239
+
240
+ .page .watermark p {
241
+ margin-bottom: none;
242
+ }
243
+
244
+ .page [class*="watercolor"] {
245
+ position: absolute;
246
+ width: 2000px;
247
+ height: 2000px;
248
+ -webkit-mask-image: var(--wc);
249
+ -webkit-mask-size: contain;
250
+ -webkit-mask-repeat: no-repeat;
251
+ mask-image: var(--wc);
252
+ mask-size: contain;
253
+ mask-repeat: no-repeat;
254
+ background-size: cover;
255
+ background-color: var(--HB_Color_WatercolorStain);
256
+ --wc: url('/assets/watercolor/watercolor1.png');
257
+ z-index: -2;
258
+ }
259
+
260
+ .page .watercolor1 {
261
+ --wc: url('/assets/watercolor/watercolor1.png');
262
+ }
263
+
264
+ .page .watercolor2 {
265
+ --wc: url('/assets/watercolor/watercolor2.png');
266
+ }
267
+
268
+ .page .watercolor3 {
269
+ --wc: url('/assets/watercolor/watercolor3.png');
270
+ }
271
+
272
+ .page .watercolor4 {
273
+ --wc: url('/assets/watercolor/watercolor4.png');
274
+ }
275
+
276
+ .page .watercolor5 {
277
+ --wc: url('/assets/watercolor/watercolor5.png');
278
+ }
279
+
280
+ .page .watercolor6 {
281
+ --wc: url('/assets/watercolor/watercolor6.png');
282
+ }
283
+
284
+ .page .watercolor7 {
285
+ --wc: url('/assets/watercolor/watercolor7.png');
286
+ }
287
+
288
+ .page .watercolor8 {
289
+ --wc: url('/assets/watercolor/watercolor8.png');
290
+ }
291
+
292
+ .page .watercolor9 {
293
+ --wc: url('/assets/watercolor/watercolor9.png');
294
+ }
295
+
296
+ .page .watercolor10 {
297
+ --wc: url('/assets/watercolor/watercolor10.png');
298
+ }
299
+
300
+ .page .watercolor11 {
301
+ --wc: url('/assets/watercolor/watercolor11.png');
302
+ }
303
+
304
+ .page .watercolor12 {
305
+ --wc: url('/assets/watercolor/watercolor12.png');
306
+ }
307
+
308
+ .page [class*="imageMask"] {
309
+ position: absolute;
310
+ height: 200%;
311
+ width: 200%;
312
+ left: 50%;
313
+ bottom: 50%;
314
+ --rotation: 0;
315
+ --revealer: none;
316
+ --checkerboard: none;
317
+ --scaleX: 1;
318
+ --scaleY: 1;
319
+ -webkit-mask-image: var(--wc), var(--revealer);
320
+ -webkit-mask-repeat: repeat-x;
321
+ -webkit-mask-size: 50%;
322
+ -webkit-mask-position: 50% calc(50% - var(--offset));
323
+ mask-image: var(--wc);
324
+ mask-repeat: repeat-x;
325
+ mask-size: 50%;
326
+ mask-position: 50% calc(50% - var(--offset));
327
+ background-image: var(--checkerboard);
328
+ background-size: 20px;
329
+ z-index: -1;
330
+ transform: translateY(50%) translateX(-50%) rotate(calc(1deg * var(--rotation))) scaleX(var(--scaleX)) scaleY(var(--scaleY));
331
+ }
332
+
333
+ .page [class*="imageMask"] > p:has(img) {
334
+ position: absolute;
335
+ width: 50%;
336
+ height: 50%;
337
+ bottom: 50%;
338
+ left: 50%;
339
+ transform: translateX(-50%) translateY(50%) rotate(calc(-1deg * var(--rotation))) scaleX(calc(1 / var(--scaleX))) scaleY(calc(1 / var(--scaleY)));
340
+ }
341
+
342
+ .page [class*="imageMask"] img {
343
+ position: absolute;
344
+ display: block;
345
+ bottom: 0;
346
+ }
347
+
348
+ .page [class*="imageMask"].bottom {
349
+ --rotation: 0;
350
+ }
351
+
352
+ .page [class*="imageMask"].bottom img {
353
+ bottom: 0;
354
+ }
355
+
356
+ .page [class*="imageMask"].top {
357
+ --rotation: 180;
358
+ }
359
+
360
+ .page [class*="imageMask"].top img {
361
+ top: 0;
362
+ }
363
+
364
+ .page [class*="imageMask"].left {
365
+ --rotation: 90;
366
+ }
367
+
368
+ .page [class*="imageMask"].left img {
369
+ left: 0;
370
+ }
371
+
372
+ .page [class*="imageMask"].right {
373
+ --rotation: -90;
374
+ }
375
+
376
+ .page [class*="imageMask"].right img {
377
+ right: 0;
378
+ }
379
+
380
+ .page [class*="imageMask"].revealImage {
381
+ --revealer: linear-gradient(0deg, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0.2));
382
+ --checkerboard: url(/assets/waterColorMasks/missingImage.png);
383
+ }
384
+
385
+ .page .imageMaskEdge1 {
386
+ --wc: url(/assets/waterColorMasks/edge/0001.webp);
387
+ }
388
+
389
+ .page .imageMaskEdge2 {
390
+ --wc: url(/assets/waterColorMasks/edge/0002.webp);
391
+ }
392
+
393
+ .page .imageMaskEdge3 {
394
+ --wc: url(/assets/waterColorMasks/edge/0003.webp);
395
+ }
396
+
397
+ .page .imageMaskEdge4 {
398
+ --wc: url(/assets/waterColorMasks/edge/0004.webp);
399
+ }
400
+
401
+ .page .imageMaskEdge5 {
402
+ --wc: url(/assets/waterColorMasks/edge/0005.webp);
403
+ }
404
+
405
+ .page .imageMaskEdge6 {
406
+ --wc: url(/assets/waterColorMasks/edge/0006.webp);
407
+ }
408
+
409
+ .page .imageMaskEdge7 {
410
+ --wc: url(/assets/waterColorMasks/edge/0007.webp);
411
+ }
412
+
413
+ .page .imageMaskEdge8 {
414
+ --wc: url(/assets/waterColorMasks/edge/0008.webp);
415
+ }
416
+
417
+ .page .imageMaskEdge9 {
418
+ --wc: url(/assets/waterColorMasks/edge/0009.webp);
419
+ }
420
+
421
+ .page .imageMaskEdge10 {
422
+ --wc: url(/assets/waterColorMasks/edge/0010.webp);
423
+ }
424
+
425
+ .page .imageMaskEdge11 {
426
+ --wc: url(/assets/waterColorMasks/edge/0011.webp);
427
+ }
428
+
429
+ .page .imageMaskEdge12 {
430
+ --wc: url(/assets/waterColorMasks/edge/0012.webp);
431
+ }
432
+
433
+ .page .imageMaskCorner1 {
434
+ --wc: url(/assets/waterColorMasks/corner/0001.webp);
435
+ }
436
+
437
+ .page .imageMaskCorner2 {
438
+ --wc: url(/assets/waterColorMasks/corner/0002.webp);
439
+ }
440
+
441
+ .page .imageMaskCorner3 {
442
+ --wc: url(/assets/waterColorMasks/corner/0003.webp);
443
+ }
444
+
445
+ .page .imageMaskCorner4 {
446
+ --wc: url(/assets/waterColorMasks/corner/0004.webp);
447
+ }
448
+
449
+ .page .imageMaskCorner5 {
450
+ --wc: url(/assets/waterColorMasks/corner/0005.webp);
451
+ }
452
+
453
+ .page .imageMaskCorner6 {
454
+ --wc: url(/assets/waterColorMasks/corner/0006.webp);
455
+ }
456
+
457
+ .page .imageMaskCorner7 {
458
+ --wc: url(/assets/waterColorMasks/corner/0007.webp);
459
+ }
460
+
461
+ .page .imageMaskCorner8 {
462
+ --wc: url(/assets/waterColorMasks/corner/0008.webp);
463
+ }
464
+
465
+ .page .imageMaskCorner9 {
466
+ --wc: url(/assets/waterColorMasks/corner/0009.webp);
467
+ }
468
+
469
+ .page .imageMaskCorner10 {
470
+ --wc: url(/assets/waterColorMasks/corner/0010.webp);
471
+ }
472
+
473
+ .page .imageMaskCorner11 {
474
+ --wc: url(/assets/waterColorMasks/corner/0011.webp);
475
+ }
476
+
477
+ .page .imageMaskCorner12 {
478
+ --wc: url(/assets/waterColorMasks/corner/0012.webp);
479
+ }
480
+
481
+ .page .imageMaskCorner13 {
482
+ --wc: url(/assets/waterColorMasks/corner/0013.webp);
483
+ }
484
+
485
+ .page .imageMaskCorner14 {
486
+ --wc: url(/assets/waterColorMasks/corner/0014.webp);
487
+ }
488
+
489
+ .page .imageMaskCorner15 {
490
+ --wc: url(/assets/waterColorMasks/corner/0015.webp);
491
+ }
492
+
493
+ .page .imageMaskCorner16 {
494
+ --wc: url(/assets/waterColorMasks/corner/0016.webp);
495
+ }
496
+
497
+ .page .imageMaskCorner17 {
498
+ --wc: url(/assets/waterColorMasks/corner/0017.webp);
499
+ }
500
+
501
+ .page .imageMaskCorner18 {
502
+ --wc: url(/assets/waterColorMasks/corner/0018.webp);
503
+ }
504
+
505
+ .page .imageMaskCorner19 {
506
+ --wc: url(/assets/waterColorMasks/corner/0019.webp);
507
+ }
508
+
509
+ .page .imageMaskCorner20 {
510
+ --wc: url(/assets/waterColorMasks/corner/0020.webp);
511
+ }
512
+
513
+ .page .imageMaskCorner21 {
514
+ --wc: url(/assets/waterColorMasks/corner/0021.webp);
515
+ }
516
+
517
+ .page .imageMaskCorner22 {
518
+ --wc: url(/assets/waterColorMasks/corner/0022.webp);
519
+ }
520
+
521
+ .page .imageMaskCorner23 {
522
+ --wc: url(/assets/waterColorMasks/corner/0023.webp);
523
+ }
524
+
525
+ .page .imageMaskCorner24 {
526
+ --wc: url(/assets/waterColorMasks/corner/0024.webp);
527
+ }
528
+
529
+ .page .imageMaskCorner25 {
530
+ --wc: url(/assets/waterColorMasks/corner/0025.webp);
531
+ }
532
+
533
+ .page .imageMaskCorner26 {
534
+ --wc: url(/assets/waterColorMasks/corner/0026.webp);
535
+ }
536
+
537
+ .page .imageMaskCorner27 {
538
+ --wc: url(/assets/waterColorMasks/corner/0027.webp);
539
+ }
540
+
541
+ .page .imageMaskCorner28 {
542
+ --wc: url(/assets/waterColorMasks/corner/0028.webp);
543
+ }
544
+
545
+ .page .imageMaskCorner29 {
546
+ --wc: url(/assets/waterColorMasks/corner/0029.webp);
547
+ }
548
+
549
+ .page .imageMaskCorner30 {
550
+ --wc: url(/assets/waterColorMasks/corner/0030.webp);
551
+ }
552
+
553
+ .page .imageMaskCorner31 {
554
+ --wc: url(/assets/waterColorMasks/corner/0031.webp);
555
+ }
556
+
557
+ .page .imageMaskCorner32 {
558
+ --wc: url(/assets/waterColorMasks/corner/0032.webp);
559
+ }
560
+
561
+ .page .imageMaskCorner33 {
562
+ --wc: url(/assets/waterColorMasks/corner/0033.webp);
563
+ }
564
+
565
+ .page .imageMaskCorner34 {
566
+ --wc: url(/assets/waterColorMasks/corner/0034.webp);
567
+ }
568
+
569
+ .page .imageMaskCorner35 {
570
+ --wc: url(/assets/waterColorMasks/corner/0035.webp);
571
+ }
572
+
573
+ .page .imageMaskCorner36 {
574
+ --wc: url(/assets/waterColorMasks/corner/0036.webp);
575
+ }
576
+
577
+ .page .imageMaskCorner37 {
578
+ --wc: url(/assets/waterColorMasks/corner/0037.webp);
579
+ }
580
+
581
+ .page dl {
582
+ padding-left: 1em;
583
+ white-space: normal;
584
+ }
585
+
586
+ .page dt {
587
+ display: inline;
588
+ margin-right: 0.5ch;
589
+ margin-left: -1em;
590
+ }
591
+
592
+ .page dd {
593
+ display: inline;
594
+ margin-left: 0;
595
+ text-indent: 0;
596
+ }
597
+
598
+ .page .blank {
599
+ height: 1em;
600
+ margin-top: 0;
601
+ }
602
+
603
+ .page .blank + * {
604
+ margin-top: 0;
605
+ }
606
+
607
+ .page .wide {
608
+ column-span: all;
609
+ display: block;
610
+ margin-bottom: 1em;
611
+ }
612
+
613
+ .page .wide + * {
614
+ margin-top: 0;
615
+ }
dependencies/themes/Legacy/5ePHB/settings.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "name" : "5e PHB",
3
+ "renderer" : "legacy",
4
+ "baseTheme" : false
5
+ }
dependencies/themes/Legacy/5ePHB/snippets.js ADDED
@@ -0,0 +1,327 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable max-lines */
2
+
3
+ const MagicGen = require('./snippets/magic.gen.js');
4
+ const ClassTableGen = require('./snippets/classtable.gen.js');
5
+ const MonsterBlockGen = require('./snippets/monsterblock.gen.js');
6
+ const ClassFeatureGen = require('./snippets/classfeature.gen.js');
7
+ const CoverPageGen = require('./snippets/coverpage.gen.js');
8
+ const TableOfContentsGen = require('./snippets/tableOfContents.gen.js');
9
+ const dedent = require('dedent-tabs').default;
10
+
11
+ module.exports = [
12
+
13
+ {
14
+ groupName : 'Text Editor',
15
+ icon : 'fas fa-pencil-alt',
16
+ view : 'text',
17
+ snippets : [
18
+ {
19
+ name : 'Column Break',
20
+ icon : 'fas fa-columns',
21
+ gen : '```\n```\n\n'
22
+ },
23
+ {
24
+ name : 'New Page',
25
+ icon : 'fas fa-file-alt',
26
+ gen : '\\page\n\n'
27
+ },
28
+ {
29
+ name : 'Vertical Spacing',
30
+ icon : 'fas fa-arrows-alt-v',
31
+ gen : '<div style=\'margin-top:140px\'></div>\n\n'
32
+ },
33
+ {
34
+ name : 'Wide Block',
35
+ icon : 'fas fa-arrows-alt-h',
36
+ gen : '<div class=\'wide\'>\nEverything in here will be extra wide. Tables, text, everything! Beware though, CSS columns can behave a bit weird sometimes.\n</div>\n'
37
+ },
38
+ {
39
+ name : 'Image',
40
+ icon : 'fas fa-image',
41
+ gen : [
42
+ '<img ',
43
+ ' src=\'https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg\' ',
44
+ ' style=\'width:325px\' />',
45
+ 'Credit: Kyounghwan Kim'
46
+ ].join('\n')
47
+ },
48
+ {
49
+ name : 'Background Image',
50
+ icon : 'fas fa-tree',
51
+ gen : [
52
+ '<img ',
53
+ ' src=\'http://i.imgur.com/hMna6G0.png\' ',
54
+ ' style=\'position:absolute; top:50px; right:30px; width:280px\' />'
55
+ ].join('\n')
56
+ },
57
+
58
+ {
59
+ name : 'Page Number',
60
+ icon : 'fas fa-bookmark',
61
+ gen : '<div class=\'pageNumber\'>1</div>\n<div class=\'footnote\'>PART 1 | FANCINESS</div>\n\n'
62
+ },
63
+
64
+ {
65
+ name : 'Auto-incrementing Page Number',
66
+ icon : 'fas fa-sort-numeric-down',
67
+ gen : '<div class=\'pageNumber auto\'></div>\n'
68
+ },
69
+
70
+ {
71
+ name : 'Link to page',
72
+ icon : 'fas fa-link',
73
+ gen : '[Click here](#p3) to go to page 3\n'
74
+ },
75
+
76
+ {
77
+ name : 'Table of Contents',
78
+ icon : 'fas fa-book',
79
+ gen : TableOfContentsGen
80
+ },
81
+ {
82
+ name : 'Add Comment',
83
+ icon : 'fas fa-code',
84
+ gen : '<!-- This is a comment that will not be rendered into your brew. Hotkey (Ctrl/Cmd + /). -->'
85
+ }
86
+ ]
87
+ },
88
+
89
+
90
+ {
91
+ groupName : 'Style Editor',
92
+ icon : 'fas fa-pencil-alt',
93
+ view : 'style',
94
+ snippets : [
95
+ {
96
+ name : 'Remove Drop Cap',
97
+ icon : 'fas fa-remove-format',
98
+ gen : dedent`/* Removes Drop Caps */
99
+ .phb h1+p:first-letter {
100
+ all: unset;
101
+ }\n\n`
102
+ },
103
+ {
104
+ name : 'Tweak Drop Cap',
105
+ icon : 'fas fa-sliders-h',
106
+ gen : dedent`/* Drop Cap Settings */
107
+ .phb h1 + p::first-letter {
108
+ float: left;
109
+ font-family: Solberry;
110
+ font-size: 10em;
111
+ color: #222;
112
+ line-height: .8em;
113
+ }\n\n`
114
+ },
115
+ {
116
+ name : 'Add Comment',
117
+ icon : 'fas fa-code',
118
+ gen : '/* This is a comment that will not be rendered into your brew. */'
119
+ }
120
+ ]
121
+ },
122
+
123
+
124
+ /************************* PHB ********************/
125
+
126
+ {
127
+ groupName : 'PHB',
128
+ icon : 'fas fa-book',
129
+ view : 'text',
130
+ snippets : [
131
+ {
132
+ name : 'Spell',
133
+ icon : 'fas fa-magic',
134
+ gen : MagicGen.spell,
135
+ },
136
+ {
137
+ name : 'Spell List',
138
+ icon : 'fas fa-list',
139
+ gen : MagicGen.spellList,
140
+ },
141
+ {
142
+ name : 'Class Feature',
143
+ icon : 'fas fa-trophy',
144
+ gen : ClassFeatureGen,
145
+ },
146
+ {
147
+ name : 'Note',
148
+ icon : 'fas fa-sticky-note',
149
+ gen : function(){
150
+ return [
151
+ '> ##### Time to Drop Knowledge',
152
+ '> Use notes to point out some interesting information. ',
153
+ '> ',
154
+ '> **Tables and lists** both work within a note.'
155
+ ].join('\n');
156
+ },
157
+ },
158
+ {
159
+ name : 'Descriptive Text Box',
160
+ icon : 'far fa-sticky-note',
161
+ gen : function(){
162
+ return [
163
+ '<div class=\'descriptive\'>',
164
+ '##### Time to Drop Knowledge',
165
+ 'Use notes to point out some interesting information. ',
166
+ '',
167
+ '**Tables and lists** both work within a note.',
168
+ '</div>'
169
+ ].join('\n');
170
+ },
171
+ },
172
+ {
173
+ name : 'Monster Stat Block',
174
+ icon : 'fas fa-bug',
175
+ gen : MonsterBlockGen.half,
176
+ },
177
+ {
178
+ name : 'Wide Monster Stat Block',
179
+ icon : 'fas fa-paw',
180
+ gen : MonsterBlockGen.full,
181
+ },
182
+ {
183
+ name : 'Cover Page',
184
+ icon : 'far fa-file-word',
185
+ gen : CoverPageGen,
186
+ },
187
+ {
188
+ name : 'Artist Credit',
189
+ icon : 'fas fa-signature',
190
+ gen : '<div class=\'artist\' style=\'top:90px;right:30px;\'>\n' +
191
+ '##### Starry Night\n' +
192
+ '[Van Gogh](https://www.vangoghmuseum.nl/en)\n' +
193
+ '</div>\n'
194
+ },
195
+ ]
196
+ },
197
+
198
+
199
+
200
+ /********************* TABLES *********************/
201
+
202
+ {
203
+ groupName : 'Tables',
204
+ icon : 'fas fa-table',
205
+ view : 'text',
206
+ snippets : [
207
+ {
208
+ name : 'Class Table',
209
+ icon : 'fas fa-table',
210
+ gen : ClassTableGen.full,
211
+ },
212
+ {
213
+ name : 'Half Class Table',
214
+ icon : 'fas fa-list-alt',
215
+ gen : ClassTableGen.half,
216
+ },
217
+ {
218
+ name : 'Table',
219
+ icon : 'fas fa-th-list',
220
+ gen : function(){
221
+ return [
222
+ '##### Cookie Tastiness',
223
+ '| Tastiness | Cookie Type |',
224
+ '|:----:|:-------------|',
225
+ '| -5 | Raisin |',
226
+ '| 8th | Chocolate Chip |',
227
+ '| 11th | 2 or lower |',
228
+ '| 14th | 3 or lower |',
229
+ '| 17th | 4 or lower |\n\n',
230
+ ].join('\n');
231
+ },
232
+ },
233
+ {
234
+ name : 'Wide Table',
235
+ icon : 'fas fa-list',
236
+ gen : function(){
237
+ return [
238
+ '<div class=\'wide\'>',
239
+ '##### Cookie Tastiness',
240
+ '| Tastiness | Cookie Type |',
241
+ '|:----:|:-------------|',
242
+ '| -5 | Raisin |',
243
+ '| 8th | Chocolate Chip |',
244
+ '| 11th | 2 or lower |',
245
+ '| 14th | 3 or lower |',
246
+ '| 17th | 4 or lower |',
247
+ '</div>\n\n'
248
+ ].join('\n');
249
+ },
250
+ },
251
+ {
252
+ name : 'Split Table',
253
+ icon : 'fas fa-th-large',
254
+ gen : dedent`\n
255
+ <div style='column-count:2'>
256
+ | d10 | Damage Type |
257
+ |:---:|:------------|
258
+ | 1 | Acid |
259
+ | 2 | Cold |
260
+ | 3 | Fire |
261
+ | 4 | Force |
262
+ | 5 | Lightning |
263
+
264
+ | d10 | Damage Type |
265
+ |:---:|:------------|
266
+ | 6 | Necrotic |
267
+ | 7 | Poison |
268
+ | 8 | Psychic |
269
+ | 9 | Radiant |
270
+ | 10 | Thunder |
271
+ </div>
272
+ \n`
273
+ }
274
+ ]
275
+ },
276
+
277
+
278
+
279
+
280
+ /**************** PRINT *************/
281
+
282
+ {
283
+ groupName : 'Print',
284
+ icon : 'fas fa-print',
285
+ view : 'style',
286
+ snippets : [
287
+ {
288
+ name : 'A4 Page Size',
289
+ icon : 'far fa-file',
290
+ gen : ['/* A4 Page Size */',
291
+ '.phb {',
292
+ ' width : 210mm;',
293
+ ' height : 296.8mm;',
294
+ '}'
295
+ ].join('\n')
296
+ },
297
+ {
298
+ name : 'Square Page Size',
299
+ icon : 'far fa-file',
300
+ gen : ['/* Square Page Size */',
301
+ '.phb {',
302
+ ' width : 125mm;',
303
+ ' height : 125mm;',
304
+ ' padding : 12.5mm;',
305
+ ' columns : unset;',
306
+ '}',
307
+ ''
308
+ ].join('\n')
309
+ },
310
+ {
311
+ name : 'Ink Friendly',
312
+ icon : 'fas fa-tint',
313
+ gen : dedent`
314
+ /* Ink Friendly */
315
+ .phb, .phb blockquote, .phb hr+blockquote {
316
+ background : white;
317
+ box-shadow : 0px 0px 3px;
318
+ }
319
+
320
+ .phb img {
321
+ visibility : hidden;
322
+ }`
323
+ },
324
+ ]
325
+ },
326
+
327
+ ];
dependencies/themes/Legacy/5ePHB/snippets/classfeature.gen.js ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ module.exports = function(classname){
4
+
5
+ classname = _.sample(['archivist', 'fancyman', 'linguist', 'fletcher',
6
+ 'notary', 'berserker-typist', 'fishmongerer', 'manicurist', 'haberdasher', 'concierge']);
7
+
8
+ classname = classname.toLowerCase();
9
+
10
+ const hitDie = _.sample([4, 6, 8, 10, 12]);
11
+ const spellSkill = _.sample(['Wisdom', 'Charisma', 'Intelligence']);
12
+
13
+ const abilityList = ['Strength', 'Dexerity', 'Constitution', 'Wisdom', 'Charisma', 'Intelligence'];
14
+ const skillList = ['Acrobatics ', 'Animal Handling', 'Arcana', 'Athletics', 'Deception', 'History', 'Insight', 'Intimidation', 'Investigation', 'Medicine', 'Nature', 'Perception', 'Performance', 'Persuasion', 'Religion', 'Sleight of Hand', 'Stealth', 'Survival'];
15
+
16
+
17
+ return [
18
+ '## Class Features',
19
+ `As a ${classname}, you gain the following class features`,
20
+ '#### Hit Points',
21
+ '___',
22
+ `- **Hit Dice:** 1d${hitDie} per ${classname} level`,
23
+ `- **Hit Points at 1st Level:** ${hitDie} + your Constitution modifier`,
24
+ `- **Hit Points at Higher Levels:** 1d${hitDie} (or ${hitDie/2 + 1}) + your Constitution modifier per ${classname} level after 1st`,
25
+ '',
26
+ '#### Proficiencies',
27
+ '___',
28
+ `- **Armor:** ${_.sampleSize(['Light armor', 'Medium armor', 'Heavy armor', 'Shields'], _.random(0, 3)).join(', ') || 'None'}`,
29
+ `- **Weapons:** ${_.sampleSize(['Squeegee', 'Rubber Chicken', 'Simple weapons', 'Martial weapons'], _.random(0, 2)).join(', ') || 'None'}`,
30
+ `- **Tools:** ${_.sampleSize(['Artisan\'s tools', 'one musical instrument', 'Thieves\' tools'], _.random(0, 2)).join(', ') || 'None'}`,
31
+ '',
32
+ '___',
33
+ `- **Saving Throws:** ${_.sampleSize(abilityList, 2).join(', ')}`,
34
+ `- **Skills:** Choose two from ${_.sampleSize(skillList, _.random(4, 6)).join(', ')}`,
35
+ '',
36
+ '#### Spellcasting Ability',
37
+ '',
38
+ `<div style=text-align:center>`,
39
+ '___',
40
+ `- **Spell save DC** = ${_.sample([6, 8, 10])} + your proficiency bonus + your ${spellSkill} modifier`,
41
+ '',
42
+ `- **Spell attack modifier** = your proficiency bonus + your ${spellSkill} modifier`,
43
+ `</div>`,
44
+ '',
45
+ '#### Equipment',
46
+ 'You start with the following equipment, in addition to the equipment granted by your background:',
47
+ '- *(a)* a martial weapon and a shield or *(b)* two martial weapons',
48
+ '- *(a)* five javelins or *(b)* any simple melee weapon',
49
+ `- ${_.sample(['10 lint fluffs', '1 button', 'a cherished lost sock'])}`,
50
+ '\n\n\n'
51
+ ].join('\n');
52
+ };
dependencies/themes/Legacy/5ePHB/snippets/classtable.gen.js ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const features = [
4
+ 'Astrological Botany',
5
+ 'Astrological Chemistry',
6
+ 'Biochemical Sorcery',
7
+ 'Civil Alchemy',
8
+ 'Consecrated Biochemistry',
9
+ 'Demonic Anthropology',
10
+ 'Divinatory Mineralogy',
11
+ 'Genetic Banishing',
12
+ 'Hermetic Geography',
13
+ 'Immunological Incantations',
14
+ 'Nuclear Illusionism',
15
+ 'Ritual Astronomy',
16
+ 'Seismological Divination',
17
+ 'Spiritual Biochemistry',
18
+ 'Statistical Occultism',
19
+ 'Police Necromancer',
20
+ 'Sixgun Poisoner',
21
+ 'Pharmaceutical Gunslinger',
22
+ 'Infernal Banker',
23
+ 'Spell Analyst',
24
+ 'Gunslinger Corruptor',
25
+ 'Torque Interfacer',
26
+ 'Exo Interfacer',
27
+ 'Gunpowder Torturer',
28
+ 'Orbital Gravedigger',
29
+ 'Phased Linguist',
30
+ 'Mathematical Pharmacist',
31
+ 'Plasma Outlaw',
32
+ 'Malefic Chemist',
33
+ 'Police Cultist'
34
+ ];
35
+
36
+ const classnames = ['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
37
+ 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge'];
38
+
39
+ const levels = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th', '10th', '11th', '12th', '13th', '14th', '15th', '16th', '17th', '18th', '19th', '20th'];
40
+
41
+ const profBonus = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6];
42
+
43
+ const getFeature = (level)=>{
44
+ let res = [];
45
+ if(_.includes([4, 6, 8, 12, 14, 16, 19], level+1)){
46
+ res = ['Ability Score Improvement'];
47
+ }
48
+ res = _.union(res, _.sampleSize(features, _.sample([0, 1, 1, 1, 1, 1])));
49
+ if(!res.length) return '─';
50
+ return res.join(', ');
51
+ };
52
+
53
+ module.exports = {
54
+ full : function(){
55
+ const classname = _.sample(classnames);
56
+
57
+ const maxes = [4, 3, 3, 3, 3, 2, 2, 1, 1];
58
+ const drawSlots = function(Slots){
59
+ let slots = Number(Slots);
60
+ return _.times(9, function(i){
61
+ const max = maxes[i];
62
+ if(slots < 1) return '—';
63
+ const res = _.min([max, slots]);
64
+ slots -= res;
65
+ return res;
66
+ }).join(' | ');
67
+ };
68
+
69
+
70
+ let cantrips = 3;
71
+ let spells = 1;
72
+ let slots = 2;
73
+ return `<div class='classTable wide'>\n##### The ${classname}\n` +
74
+ `| Level | Proficiency Bonus | Features | Cantrips Known | Spells Known | 1st | 2nd | 3rd | 4th | 5th | 6th | 7th | 8th | 9th |\n`+
75
+ `|:---:|:---:|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n${
76
+ _.map(levels, function(levelName, level){
77
+ const res = [
78
+ levelName,
79
+ `+${profBonus[level]}`,
80
+ getFeature(level),
81
+ cantrips,
82
+ spells,
83
+ drawSlots(slots)
84
+ ].join(' | ');
85
+
86
+ cantrips += _.random(0, 1);
87
+ spells += _.random(0, 1);
88
+ slots += _.random(0, 2);
89
+
90
+ return `| ${res} |`;
91
+ }).join('\n')}\n</div>\n\n`;
92
+ },
93
+
94
+ half : function(){
95
+ const classname = _.sample(classnames);
96
+
97
+ let featureScore = 1;
98
+ return `<div class='classTable'>\n##### The ${classname}\n` +
99
+ `| Level | Proficiency Bonus | Features | ${_.sample(features)}|\n` +
100
+ `|:---:|:---:|:---|:---:|\n${
101
+ _.map(levels, function(levelName, level){
102
+ const res = [
103
+ levelName,
104
+ `+${profBonus[level]}`,
105
+ getFeature(level),
106
+ `+${featureScore}`
107
+ ].join(' | ');
108
+
109
+ featureScore += _.random(0, 1);
110
+
111
+ return `| ${res} |`;
112
+ }).join('\n')}\n</div>\n\n`;
113
+ }
114
+ };
dependencies/themes/Legacy/5ePHB/snippets/coverpage.gen.js ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const titles = [
4
+ 'The Burning Gallows',
5
+ 'The Ring of Nenlast',
6
+ 'Below the Blind Tavern',
7
+ 'Below the Hungering River',
8
+ 'Before Bahamut\'s Land',
9
+ 'The Cruel Grave from Within',
10
+ 'The Strength of Trade Road',
11
+ 'Through The Raven Queen\'s Worlds',
12
+ 'Within the Settlement',
13
+ 'The Crown from Within',
14
+ 'The Merchant Within the Battlefield',
15
+ 'Ioun\'s Fading Traveler',
16
+ 'The Legion Ingredient',
17
+ 'The Explorer Lure',
18
+ 'Before the Charming Badlands',
19
+ 'The Living Dead Above the Fearful Cage',
20
+ 'Vecna\'s Hidden Sage',
21
+ 'Bahamut\'s Demonspawn',
22
+ 'Across Gruumsh\'s Elemental Chaos',
23
+ 'The Blade of Orcus',
24
+ 'Beyond Revenge',
25
+ 'Brain of Insanity',
26
+ 'Breed Battle!, A New Beginning',
27
+ 'Evil Lake, A New Beginning',
28
+ 'Invasion of the Gigantic Cat, Part II',
29
+ 'Kraken War 2020',
30
+ 'The Body Whisperers',
31
+ 'The Diabolical Tales of the Ape-Women',
32
+ 'The Doctor Immortal',
33
+ 'The Doctor from Heaven',
34
+ 'The Graveyard',
35
+ 'Azure Core',
36
+ 'Core Battle',
37
+ 'Core of Heaven: The Guardian of Amazement',
38
+ 'Deadly Amazement III',
39
+ 'Dry Chaos IX',
40
+ 'Gate Thunder',
41
+ 'Guardian: Skies of the Dark Wizard',
42
+ 'Lute of Eternity',
43
+ 'Mercury\'s Planet: Brave Evolution',
44
+ 'Ruby of Atlantis: The Quake of Peace',
45
+ 'Sky of Zelda: The Thunder of Force',
46
+ 'Vyse\'s Skies',
47
+ 'White Greatness III',
48
+ 'Yellow Divinity',
49
+ 'Zidane\'s Ghost'
50
+ ];
51
+
52
+ const subtitles = [
53
+ 'In an ominous universe, a botanist opposes terrorism.',
54
+ '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.',
55
+ 'In a land of corruption, two cyberneticists and a dungeon delver search for freedom.',
56
+ 'In an evil empire of horror, two rangers battle the forces of hell.',
57
+ 'In a lost city, in an age of sorcery, a librarian quests for revenge.',
58
+ 'In a universe of illusions and danger, three time travellers and an adventurer search for justice.',
59
+ 'In a forgotten universe of barbarism, in an era of terror and mysticism, a virtual reality programmer and a spy try to find vengance and battle crime.',
60
+ 'In a universe of demons, in an era of insanity and ghosts, three bodyguards and a bodyguard try to find vengance.',
61
+ 'In a kingdom of corruption and battle, seven artificial intelligences try to save the last living fertile woman.',
62
+ 'In a universe of virutal reality and agony, in an age of ghosts and ghosts, a fortune-teller and a wanderer try to avert the apocalypse.',
63
+ 'In a crime-infested kingdom, three martial artists quest for the truth and oppose evil.',
64
+ 'In a terrifying universe of lost souls, in an era of lost souls, eight dancers fight evil.',
65
+ 'In a galaxy of confusion and insanity, three martial artists and a duke battle a mob of psychics.',
66
+ 'In an amazing kingdom, a wizard and a secretary hope to prevent the destruction of mankind.',
67
+ 'In a kingdom of deception, a reporter searches for fame.',
68
+ 'In a hellish empire, a swordswoman and a duke try to find the ultimate weapon and battle a conspiracy.',
69
+ 'In an evil galaxy of illusion, in a time of technology and misery, seven psychiatrists battle crime.',
70
+ 'In a dark city of confusion, three swordswomen and a singer battle lawlessness.',
71
+ 'In an ominous empire, in an age of hate, two philosophers and a student try to find justice and battle a mob of mages intent on stealing the souls of the innocent.',
72
+ 'In a kingdom of panic, six adventurers oppose lawlessness.',
73
+ 'In a land of dreams and hopelessness, three hackers and a cyborg search for justice.',
74
+ 'On a planet of mysticism, three travelers and a fire fighter quest for the ultimate weapon and oppose evil.',
75
+ 'In a wicked universe, five seers fight lawlessness.',
76
+ 'In a kingdom of death, in an era of illusion and blood, four colonists search for fame.',
77
+ 'In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.',
78
+ 'In a cursed empire, five inventors oppose terrorism.',
79
+ 'On a crime-ridden planet of conspiracy, a watchman and an artificial intelligence try to find love and oppose lawlessness.',
80
+ 'In a forgotten land, a reporter and a spy try to stop the apocalypse.',
81
+ 'In a forbidden land of prophecy, a scientist and an archivist oppose a cabal of barbarians intent on stealing the souls of the innocent.',
82
+ '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.',
83
+ 'In a galaxy of dark magic, four fighters seek freedom.',
84
+ 'In an empire of deception, six tomb-robbers quest for the ultimate weapon and combat an army of raiders.',
85
+ 'In a kingdom of corruption and lost souls, in an age of panic, eight planetologists oppose evil.',
86
+ 'In a galaxy of misery and hopelessness, in a time of agony and pain, five planetologists search for vengance.',
87
+ 'In a universe of technology and insanity, in a time of sorcery, a computer techician quests for hope.',
88
+ 'On a planet of dark magic and barbarism, in an age of horror and blasphemy, seven librarians search for fame.',
89
+ 'In an empire of dark magic, in a time of blood and illusions, four monks try to find the ultimate weapon and combat terrorism.',
90
+ 'In a forgotten empire of dark magic, six kings try to prevent the destruction of mankind.',
91
+ 'In a galaxy of dark magic and horror, in an age of hopelessness, four marines and an outlaw combat evil.',
92
+ '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.',
93
+ 'In a damned kingdom of technology, a virtual reality programmer and a fighter seek fame.',
94
+ 'In a hellish kingdom, in an age of blasphemy and blasphemy, an astrologer searches for fame.',
95
+ 'In a damned world of devils, an alien and a ranger quest for love and oppose a syndicate of demons.',
96
+ 'In a cursed galaxy, in a time of pain, seven librarians hope to avert the apocalypse.',
97
+ 'In a crime-infested galaxy, in an era of hopelessness and panic, three champions and a grave robber try to solve the ultimate crime.'
98
+ ];
99
+
100
+
101
+ module.exports = ()=>{
102
+ return `<style>
103
+ .phb#p1{ text-align:center; }
104
+ .phb#p1:after{ display:none; }
105
+ </style>
106
+
107
+ <div style='margin-top:450px;'></div>
108
+
109
+ # ${_.sample(titles)}
110
+
111
+ <div style='margin-top:25px'></div>
112
+ <div class='wide'>
113
+ ##### ${_.sample(subtitles)}
114
+ </div>
115
+
116
+ \\page`;
117
+ };
dependencies/themes/Legacy/5ePHB/snippets/fullclass.gen.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const ClassFeatureGen = require('./classfeature.gen.js');
4
+
5
+ const ClassTableGen = require('./classtable.gen.js');
6
+
7
+ module.exports = function(){
8
+
9
+ const classname = _.sample(['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
10
+ 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge']);
11
+
12
+
13
+ const image = _.sample(_.map([
14
+ 'http://orig01.deviantart.net/4682/f/2007/099/f/c/bard_stick_figure_by_wrpigeek.png',
15
+ 'http://img07.deviantart.net/a3c9/i/2007/099/3/a/archer_stick_figure_by_wrpigeek.png',
16
+ 'http://pre04.deviantart.net/d596/th/pre/f/2007/099/5/2/adventurer_stick_figure_by_wrpigeek.png',
17
+ 'http://img13.deviantart.net/d501/i/2007/099/d/4/black_mage_stick_figure_by_wrpigeek.png',
18
+ 'http://img09.deviantart.net/5cf3/i/2007/099/d/d/dark_knight_stick_figure_by_wrpigeek.png',
19
+ 'http://pre01.deviantart.net/7a34/th/pre/f/2007/099/6/3/monk_stick_figure_by_wrpigeek.png',
20
+ 'http://img11.deviantart.net/5dcc/i/2007/099/d/1/mystic_knight_stick_figure_by_wrpigeek.png',
21
+ 'http://pre08.deviantart.net/ad45/th/pre/f/2007/099/a/0/thief_stick_figure_by_wrpigeek.png',
22
+ ], function(url){
23
+ return `<img src = '${url}' style='max-width:8cm;max-height:25cm' />`;
24
+ }));
25
+
26
+
27
+ return `${[
28
+ image,
29
+ '',
30
+ '```',
31
+ '```',
32
+ '<div style=\'margin-top:240px\'></div>\n\n',
33
+ `## ${classname}`,
34
+ 'Cool intro stuff will go here',
35
+
36
+ '\\page',
37
+ ClassTableGen(classname),
38
+ ClassFeatureGen(classname),
39
+
40
+
41
+
42
+ ].join('\n')}\n\n\n`;
43
+ };
dependencies/themes/Legacy/5ePHB/snippets/magic.gen.js ADDED
@@ -0,0 +1,91 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const spellNames = [
4
+ 'Astral Rite of Acne',
5
+ 'Create Acne',
6
+ 'Cursed Ramen Erruption',
7
+ 'Dark Chant of the Dentists',
8
+ 'Erruption of Immaturity',
9
+ 'Flaming Disc of Inconvenience',
10
+ 'Heal Bad Hygene',
11
+ 'Heavenly Transfiguration of the Cream Devil',
12
+ 'Hellish Cage of Mucus',
13
+ 'Irritate Peanut Butter Fairy',
14
+ 'Luminous Erruption of Tea',
15
+ 'Mystic Spell of the Poser',
16
+ 'Sorcerous Enchantment of the Chimneysweep',
17
+ 'Steak Sauce Ray',
18
+ 'Talk to Groupie',
19
+ 'Astonishing Chant of Chocolate',
20
+ 'Astounding Pasta Puddle',
21
+ 'Ball of Annoyance',
22
+ 'Cage of Yarn',
23
+ 'Control Noodles Elemental',
24
+ 'Create Nervousness',
25
+ 'Cure Baldness',
26
+ 'Cursed Ritual of Bad Hair',
27
+ 'Dispell Piles in Dentist',
28
+ 'Eliminate Florists',
29
+ 'Illusionary Transfiguration of the Babysitter',
30
+ 'Necromantic Armor of Salad Dressing',
31
+ 'Occult Transfiguration of Foot Fetish',
32
+ 'Protection from Mucus Giant',
33
+ 'Tinsel Blast',
34
+ 'Alchemical Evocation of the Goths',
35
+ 'Call Fangirl',
36
+ 'Divine Spell of Crossdressing',
37
+ 'Dominate Ramen Giant',
38
+ 'Eliminate Vindictiveness in Gym Teacher',
39
+ 'Extra-Planar Spell of Irritation',
40
+ 'Induce Whining in Babysitter',
41
+ 'Invoke Complaining',
42
+ 'Magical Enchantment of Arrogance',
43
+ 'Occult Globe of Salad Dressing',
44
+ 'Overwhelming Enchantment of the Chocolate Fairy',
45
+ 'Sorcerous Dandruff Globe',
46
+ 'Spiritual Invocation of the Costumers',
47
+ 'Ultimate Rite of the Confetti Angel',
48
+ 'Ultimate Ritual of Mouthwash',
49
+ ];
50
+
51
+ module.exports = {
52
+
53
+ spellList : function(){
54
+ const levels = ['Cantrips (0 Level)', '1st Level', '2nd Level', '3rd Level', '4th Level', '5th Level', '6th Level', '7th Level', '8th Level', '9th Level'];
55
+
56
+ const content = _.map(levels, (level)=>{
57
+ const spells = _.map(_.sampleSize(spellNames, _.random(5, 15)), (spell)=>{
58
+ return `- ${spell}`;
59
+ }).join('\n');
60
+ return `##### ${level} \n${spells} \n`;
61
+ }).join('\n');
62
+
63
+ return `<div class='spellList'>\n${content}\n</div>`;
64
+ },
65
+
66
+ spell : function(){
67
+ const level = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th'];
68
+ const spellSchools = ['abjuration', 'conjuration', 'divination', 'enchantment', 'evocation', 'illusion', 'necromancy', 'transmutation'];
69
+
70
+
71
+ let components = _.sampleSize(['V', 'S', 'M'], _.random(1, 3)).join(', ');
72
+ if(components.indexOf('M') !== -1){
73
+ components += ` (${_.sampleSize(['a small doll', 'a crushed button worth at least 1cp', 'discarded gum wrapper'], _.random(1, 3)).join(', ')})`;
74
+ }
75
+
76
+ return [
77
+ `#### ${_.sample(spellNames)}`,
78
+ `*${_.sample(level)}-level ${_.sample(spellSchools)}*`,
79
+ '___',
80
+ '- **Casting Time:** 1 action',
81
+ `- **Range:** ${_.sample(['Self', 'Touch', '30 feet', '60 feet'])}`,
82
+ `- **Components:** ${components}`,
83
+ `- **Duration:** ${_.sample(['Until dispelled', '1 round', 'Instantaneous', 'Concentration, up to 10 minutes', '1 hour'])}`,
84
+ '',
85
+ 'A flame, equivalent in brightness to a torch, springs from an object that you touch. ',
86
+ 'The effect look like a regular flame, but it creates no heat and doesn\'t use oxygen. ',
87
+ 'A *continual flame* can be covered or hidden but not smothered or quenched.',
88
+ '\n\n\n'
89
+ ].join('\n');
90
+ }
91
+ };
dependencies/themes/Legacy/5ePHB/snippets/monsterblock.gen.js ADDED
@@ -0,0 +1,200 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const genList = function(list, max){
4
+ return _.sampleSize(list, _.random(0, max)).join(', ') || 'None';
5
+ };
6
+
7
+ const getMonsterName = function(){
8
+ return _.sample([
9
+ 'All-devouring Baseball Imp',
10
+ 'All-devouring Gumdrop Wraith',
11
+ 'Chocolate Hydra',
12
+ 'Devouring Peacock',
13
+ 'Economy-sized Colossus of the Lemonade Stand',
14
+ 'Ghost Pigeon',
15
+ 'Gibbering Duck',
16
+ 'Sparklemuffin Peacock Spider',
17
+ 'Gum Elemental',
18
+ 'Illiterate Construct of the Candy Store',
19
+ 'Ineffable Chihuahua',
20
+ 'Irritating Death Hamster',
21
+ 'Irritating Gold Mouse',
22
+ 'Juggernaut Snail',
23
+ 'Juggernaut of the Sock Drawer',
24
+ 'Koala of the Cosmos',
25
+ 'Mad Koala of the West',
26
+ 'Milk Djinni of the Lemonade Stand',
27
+ 'Mind Ferret',
28
+ 'Mystic Salt Spider',
29
+ 'Necrotic Halitosis Angel',
30
+ 'Pinstriped Famine Sheep',
31
+ 'Ritalin Leech',
32
+ 'Shocker Kangaroo',
33
+ 'Stellar Tennis Juggernaut',
34
+ 'Wailing Quail of the Sun',
35
+ 'Angel Pigeon',
36
+ 'Anime Sphinx',
37
+ 'Bored Avalanche Sheep of the Wasteland',
38
+ 'Devouring Nougat Sphinx of the Sock Drawer',
39
+ 'Djinni of the Footlocker',
40
+ 'Ectoplasmic Jazz Devil',
41
+ 'Flatuent Angel',
42
+ 'Gelatinous Duck of the Dream-Lands',
43
+ 'Gelatinous Mouse',
44
+ 'Golem of the Footlocker',
45
+ 'Lich Wombat',
46
+ 'Mechanical Sloth of the Past',
47
+ 'Milkshake Succubus',
48
+ 'Puffy Bone Peacock of the East',
49
+ 'Rainbow Manatee',
50
+ 'Rune Parrot',
51
+ 'Sand Cow',
52
+ 'Sinister Vanilla Dragon',
53
+ 'Snail of the North',
54
+ 'Spider of the Sewer',
55
+ 'Stellar Sawdust Leech',
56
+ 'Storm Anteater of Hell',
57
+ 'Stupid Spirit of the Brewery',
58
+ 'Time Kangaroo',
59
+ 'Tomb Poodle',
60
+ ]);
61
+ };
62
+
63
+ const getType = function(){
64
+ return `${_.sample(['Tiny', 'Small', 'Medium', 'Large', 'Gargantuan', 'Stupidly vast'])} ${_.sample(['beast', 'fiend', 'annoyance', 'guy', 'cutie'])}`;
65
+ };
66
+
67
+ const getAlignment = function(){
68
+ return _.sample([
69
+ 'annoying evil',
70
+ 'chaotic gossipy',
71
+ 'chaotic sloppy',
72
+ 'depressed neutral',
73
+ 'lawful bogus',
74
+ 'lawful coy',
75
+ 'manic-depressive evil',
76
+ 'narrow-minded neutral',
77
+ 'neutral annoying',
78
+ 'neutral ignorant',
79
+ 'oedpipal neutral',
80
+ 'silly neutral',
81
+ 'unoriginal neutral',
82
+ 'weird neutral',
83
+ 'wordy evil',
84
+ 'unaligned'
85
+ ]);
86
+ };
87
+
88
+ const getStats = function(){
89
+ return `>|${_.times(6, function(){
90
+ const num = _.random(1, 20);
91
+ const mod = Math.ceil(num/2 - 5);
92
+ return `${num} (${mod >= 0 ? `+${mod}` : mod})`;
93
+ }).join('|')}|`;
94
+ };
95
+
96
+ const genAbilities = function(){
97
+ return _.sample([
98
+ '> ***Pack Tactics.*** These guys work together. Like super well, you don\'t even know.',
99
+ '> ***Fowl Appearance.*** While the creature remains motionless, it is indistinguishable from a normal chicken.',
100
+ '> ***Onion Stench.*** Any creatures within 5 feet of this thing develops an irrational craving for onion rings.',
101
+ '> ***Enormous Nose.*** This creature gains advantage on any check involving putting things in its nose.',
102
+ '> ***Sassiness.*** When questioned, this creature will talk back instead of answering.',
103
+ '> ***Big Jerk.*** Thinks he is just *waaaay* better than you.',
104
+ ]);
105
+ };
106
+
107
+ const genAction = function(){
108
+ const name = _.sample([
109
+ 'Abdominal Drop',
110
+ 'Airplane Hammer',
111
+ 'Atomic Death Throw',
112
+ 'Bulldog Rake',
113
+ 'Corkscrew Strike',
114
+ 'Crossed Splash',
115
+ 'Crossface Suplex',
116
+ 'DDT Powerbomb',
117
+ 'Dual Cobra Wristlock',
118
+ 'Dual Throw',
119
+ 'Elbow Hold',
120
+ 'Gory Body Sweep',
121
+ 'Heel Jawbreaker',
122
+ 'Jumping Driver',
123
+ 'Open Chin Choke',
124
+ 'Scorpion Flurry',
125
+ 'Somersault Stump Fists',
126
+ 'Suffering Wringer',
127
+ 'Super Hip Submission',
128
+ 'Super Spin',
129
+ 'Team Elbow',
130
+ 'Team Foot',
131
+ 'Tilt-a-whirl Chin Sleeper',
132
+ 'Tilt-a-whirl Eye Takedown',
133
+ 'Turnbuckle Roll'
134
+ ]);
135
+
136
+ return `> ***${name}.*** *Melee Weapon Attack:* +4 to hit, reach 5ft., one target. *Hit* 5 (1d6 + 2) `;
137
+ };
138
+
139
+
140
+ module.exports = {
141
+
142
+ full : function(){
143
+ return `${[
144
+ '___',
145
+ '___',
146
+ `> ## ${getMonsterName()}`,
147
+ `>*${getType()}, ${getAlignment()}*`,
148
+ '> ___',
149
+ `> - **Armor Class** ${_.random(10, 20)}`,
150
+ `> - **Hit Points** ${_.random(1, 150)}(1d4 + 5)`,
151
+ `> - **Speed** ${_.random(0, 50)}ft.`,
152
+ '>___',
153
+ '>|STR|DEX|CON|INT|WIS|CHA|',
154
+ '>|:---:|:---:|:---:|:---:|:---:|:---:|',
155
+ getStats(),
156
+ '>___',
157
+ `> - **Condition Immunities** ${genList(['groggy', 'swagged', 'weak-kneed', 'buzzed', 'groovy', 'melancholy', 'drunk'], 3)}`,
158
+ `> - **Senses** passive Perception ${_.random(3, 20)}`,
159
+ `> - **Languages** ${genList(['Common', 'Pottymouth', 'Gibberish', 'Latin', 'Jive'], 2)}`,
160
+ `> - **Challenge** ${_.random(0, 15)} (${_.random(10, 10000)} XP)`,
161
+ '> ___',
162
+ _.times(_.random(3, 6), function(){
163
+ return genAbilities();
164
+ }).join('\n>\n'),
165
+ '> ### Actions',
166
+ _.times(_.random(4, 6), function(){
167
+ return genAction();
168
+ }).join('\n>\n'),
169
+ ].join('\n')}\n\n\n`;
170
+ },
171
+
172
+ half : function(){
173
+ return `${[
174
+ '___',
175
+ `> ## ${getMonsterName()}`,
176
+ `>*${getType()}, ${getAlignment()}*`,
177
+ '> ___',
178
+ `> - **Armor Class** ${_.random(10, 20)}`,
179
+ `> - **Hit Points** ${_.random(1, 150)}(1d4 + 5)`,
180
+ `> - **Speed** ${_.random(0, 50)}ft.`,
181
+ '>___',
182
+ '>|STR|DEX|CON|INT|WIS|CHA|',
183
+ '>|:---:|:---:|:---:|:---:|:---:|:---:|',
184
+ getStats(),
185
+ '>___',
186
+ `> - **Condition Immunities** ${genList(['groggy', 'swagged', 'weak-kneed', 'buzzed', 'groovy', 'melancholy', 'drunk'], 3)}`,
187
+ `> - **Senses** passive Perception ${_.random(3, 20)}`,
188
+ `> - **Languages** ${genList(['Common', 'Pottymouth', 'Gibberish', 'Latin', 'Jive'], 2)}`,
189
+ `> - **Challenge** ${_.random(0, 15)} (${_.random(10, 10000)} XP)`,
190
+ '> ___',
191
+ _.times(_.random(2, 3), function(){
192
+ return genAbilities();
193
+ }).join('\n>\n'),
194
+ '> ### Actions',
195
+ _.times(_.random(1, 2), function(){
196
+ return genAction();
197
+ }).join('\n>\n'),
198
+ ].join('\n')}\n\n\n`;
199
+ }
200
+ };
dependencies/themes/Legacy/5ePHB/snippets/tableOfContents.gen.js ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const getTOC = (pages)=>{
4
+ const add1 = (title, page)=>{
5
+ res.push({
6
+ title : title,
7
+ page : page + 1,
8
+ children : []
9
+ });
10
+ };
11
+ const add2 = (title, page)=>{
12
+ if(!_.last(res)) add1('', page);
13
+ _.last(res).children.push({
14
+ title : title,
15
+ page : page + 1,
16
+ children : []
17
+ });
18
+ };
19
+ const add3 = (title, page)=>{
20
+ if(!_.last(res)) add1('', page);
21
+ if(!_.last(_.last(res).children)) add2('', page);
22
+ _.last(_.last(res).children).children.push({
23
+ title : title,
24
+ page : page + 1,
25
+ children : []
26
+ });
27
+ };
28
+
29
+ const res = [];
30
+ _.each(pages, (page, pageNum)=>{
31
+ const lines = page.split('\n');
32
+ _.each(lines, (line)=>{
33
+ if(_.startsWith(line, '# ')){
34
+ const title = line.replace('# ', '');
35
+ add1(title, pageNum);
36
+ }
37
+ if(_.startsWith(line, '## ')){
38
+ const title = line.replace('## ', '');
39
+ add2(title, pageNum);
40
+ }
41
+ if(_.startsWith(line, '### ')){
42
+ const title = line.replace('### ', '');
43
+ add3(title, pageNum);
44
+ }
45
+ });
46
+ });
47
+ return res;
48
+ };
49
+
50
+ module.exports = function(props){
51
+ const pages = props.brew.text.split('\\page');
52
+ const TOC = getTOC(pages);
53
+ const markdown = _.reduce(TOC, (r, g1, idx1)=>{
54
+ r.push(`- **[${idx1 + 1} ${g1.title}](#p${g1.page})**`);
55
+ if(g1.children.length){
56
+ _.each(g1.children, (g2, idx2)=>{
57
+ r.push(` - [${idx1 + 1}.${idx2 + 1} ${g2.title}](#p${g2.page})`);
58
+ if(g2.children.length){
59
+ _.each(g2.children, (g3, idx3)=>{
60
+ r.push(` - [${idx1 + 1}.${idx2 + 1}.${idx3 + 1} ${g3.title}](#p${g3.page})`);
61
+ });
62
+ }
63
+ });
64
+ }
65
+ return r;
66
+ }, []).join('\n');
67
+
68
+ return `<div class='toc'>
69
+ ##### Table Of Contents
70
+ ${markdown}
71
+ </div>\n`;
72
+ };
dependencies/themes/Legacy/5ePHB/style.less ADDED
@@ -0,0 +1,501 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import (less) './themes/fonts/5e legacy/fonts.less';
2
+ @import (less) './themes/assets/assets.less';
3
+ @import (less) './themes/phb.depricated.less';
4
+ //Colors
5
+ @background : #EEE5CE; // Light parchment
6
+ @noteGreen : #e0e5c1; // Pastel green
7
+ @headerUnderline : #c9ad6a; // Gold
8
+ @horizontalRule : #9c2b1b; // Maroon
9
+ @headerText : #58180D; // Dark maroon
10
+ @monsterStatBackground : #FDF1DC; // Lighter parchment
11
+ @captionText : #766649; // Brown
12
+ @page { margin: 0; }
13
+ body {
14
+ counter-reset : phb-page-numbers;
15
+ }
16
+ *{
17
+ -webkit-print-color-adjust : exact;
18
+ }
19
+ .useSansSerif(){
20
+ font-family : ScalySans;
21
+ em{
22
+ font-family : ScalySans;
23
+ font-style : italic;
24
+ }
25
+ strong{
26
+ font-family : ScalySans;
27
+ font-weight : 800;
28
+ letter-spacing : -0.02em;
29
+ }
30
+ }
31
+ .useColumns(@multiplier : 1){
32
+ column-count : 2;
33
+ column-fill : auto;
34
+ column-gap : 1cm;
35
+ column-width : 8cm * @multiplier;
36
+ -webkit-column-count : 2;
37
+ -moz-column-count : 2;
38
+ -webkit-column-width : 8cm * @multiplier;
39
+ -moz-column-width : 8cm * @multiplier;
40
+ -webkit-column-gap : 1cm;
41
+ -moz-column-gap : 1cm;
42
+ }
43
+ .phb, .page{
44
+ .useColumns();
45
+ counter-increment : phb-page-numbers;
46
+ position : relative;
47
+ z-index : 15;
48
+ box-sizing : border-box;
49
+ overflow : hidden;
50
+ height : 279.4mm;
51
+ width : 215.9mm;
52
+ padding : 1.0cm 1.7cm;
53
+ padding-bottom : 1.5cm;
54
+ background-color : @background;
55
+ background-image : @backgroundImage;
56
+ font-family : BookSanity;
57
+ font-size : 0.317cm;
58
+ text-rendering : optimizeLegibility;
59
+ page-break-before : always;
60
+ page-break-after : always;
61
+ contain : size;
62
+ }
63
+
64
+ .phb{
65
+ //*****************************
66
+ // * BASE
67
+ // *****************************/
68
+ p{
69
+ padding-bottom : 0.8em;
70
+ line-height : 1.269em;
71
+ &+p{
72
+ margin-top : -0.8em;
73
+ }
74
+ }
75
+ ul{
76
+ margin-bottom : 0.8em;
77
+ padding-left : 1.4em;
78
+ line-height : 1.269em;
79
+ list-style-position : outside;
80
+ list-style-type : disc;
81
+ }
82
+ ol{
83
+ margin-bottom : 0.8em;
84
+ padding-left : 1.4em;
85
+ line-height : 1.269em;
86
+ list-style-position : outside;
87
+ list-style-type : decimal;
88
+ }
89
+ //Indents after p or lists
90
+ p+p, ul+p, ol+p{
91
+ text-indent : 1em;
92
+ }
93
+ img{
94
+ z-index : -1;
95
+ }
96
+ strong{
97
+ font-weight : bold;
98
+ letter-spacing : 0.03em;
99
+ }
100
+ em{
101
+ font-style : italic;
102
+ }
103
+ sup{
104
+ vertical-align : super;
105
+ font-size : smaller;
106
+ line-height : 0;
107
+ }
108
+ sub{
109
+ vertical-align : sub;
110
+ font-size : smaller;
111
+ line-height : 0;
112
+ }
113
+ //*****************************
114
+ // * HEADERS
115
+ // *****************************/
116
+ h1,h2,h3,h4{
117
+ margin-top : 0.2em;
118
+ margin-bottom : 0.2em;
119
+ font-family : MrJeeves;
120
+ font-weight : 800;
121
+ color : @headerText;
122
+ }
123
+ h1{
124
+ column-span : all;
125
+ font-size : 0.987cm;
126
+ -webkit-column-span : all;
127
+ -moz-column-span : all;
128
+ &+p::first-letter{
129
+ float : left;
130
+ font-family : Solberry;
131
+ font-size : 10em;
132
+ color : #222;
133
+ line-height : 0.795em;
134
+ }
135
+ }
136
+ h2{
137
+ font-size : 0.705cm;
138
+ }
139
+ h3{
140
+ font-size : 0.529cm;
141
+ border-bottom : 2px solid @headerUnderline;
142
+ }
143
+ h4{
144
+ margin-bottom : 0.00em;
145
+ font-size : 0.458cm;
146
+ }
147
+ h5{
148
+ margin-bottom : 0.2em;
149
+ font-family : ScalySansSmallCaps;
150
+ font-size : 0.423cm;
151
+ font-weight : 900;
152
+ }
153
+ //*****************************
154
+ // * TABLE
155
+ // *****************************/
156
+ table{
157
+ .useSansSerif();
158
+ width : 100%;
159
+ margin-bottom : 1em;
160
+ font-size : 10pt;
161
+ thead{
162
+ display: table-row-group;
163
+ font-weight : 800;
164
+ th{
165
+ vertical-align : bottom;
166
+ padding-bottom : 0.3em;
167
+ padding-right : 0.1em;
168
+ padding-left : 0.1em;
169
+ }
170
+ }
171
+ tbody{
172
+ tr{
173
+ td{
174
+ padding : 0.3em 0.1em;
175
+ }
176
+ &:nth-child(odd){
177
+ background-color : @noteGreen;
178
+ }
179
+ }
180
+ }
181
+ }
182
+ //*****************************
183
+ // * NOTE
184
+ // *****************************/
185
+ blockquote{
186
+ .useSansSerif();
187
+ box-sizing : border-box;
188
+ margin-bottom : 1em;
189
+ padding : 5px 10px;
190
+ background-color : @noteGreen;
191
+ border-style : solid;
192
+ border-width : 11px;
193
+ border-image : @noteBorderImage 11;
194
+ border-image-outset : 9px 0px;
195
+ box-shadow : 1px 4px 14px #888;
196
+ p, ul{
197
+ font-size : 0.352cm;
198
+ line-height : 1.083em;
199
+ }
200
+ }
201
+ //If a note starts a column, give it space at the top to render border
202
+ pre+blockquote, h2+blockquote, h3+blockquote, h4+blockquote, h5+blockquote {
203
+ margin-top : 13px;
204
+ }
205
+ //*****************************
206
+ // * MONSTER STAT BLOCK
207
+ // *****************************/
208
+ hr+blockquote{
209
+ position : relative;
210
+ padding-top : 15px;
211
+ background-color : @monsterStatBackground;
212
+ border-style : solid;
213
+ border-width : 10px;
214
+ border-image : @monsterBorderImageLegacy 10;
215
+ h2{
216
+ margin-top : -8px;
217
+ margin-bottom : 0px;
218
+ &+p{
219
+ padding-bottom : 0px;
220
+ }
221
+ }
222
+ h3{
223
+ font-family : ScalySans;
224
+ font-weight : 400;
225
+ border-bottom : 1px solid @headerText;
226
+ }
227
+ hr+ul{
228
+ color : @headerText;
229
+ }
230
+ ul{
231
+ .useSansSerif();
232
+ padding-left : 1em;
233
+ font-size : 0.352cm;
234
+ }
235
+ // Monster Ability table
236
+ hr+table{
237
+ margin : 0;
238
+ background-color : transparent;
239
+ border-style : none;
240
+ border-image : none;
241
+ tbody{
242
+ tr:nth-child(odd), tr:nth-child(even){
243
+ background-color : transparent;
244
+ }
245
+ }
246
+ }
247
+ table{
248
+ color : @headerText;
249
+ }
250
+ p+p{
251
+ margin-top : 0em;
252
+ padding-bottom : 0.5em;
253
+ text-indent : 0em;
254
+ }
255
+ //Triangle dividers
256
+ hr{
257
+ visibility : visible;
258
+ height : 6px;
259
+ margin : 4px 0px;
260
+ background-image : @redTriangleImage;
261
+ background-size : 100% 100%;
262
+ border : none;
263
+ }
264
+ }
265
+ //Full Width
266
+ hr+hr+blockquote{
267
+ .useColumns(0.96);
268
+ column-fill : balance;
269
+ }
270
+ //*****************************
271
+ // * FOOTER
272
+ // *****************************/
273
+ &:after{
274
+ content : "";
275
+ position : absolute;
276
+ bottom : 0px;
277
+ left : 0px;
278
+ z-index : 100;
279
+ height : 50px;
280
+ width : 100%;
281
+ background-image : @footerAccentImage;
282
+ background-size : cover;
283
+ }
284
+ &:nth-child(even){
285
+ &:after{
286
+ transform : scaleX(-1);
287
+ }
288
+ .pageNumber{
289
+ left : 2px;
290
+ }
291
+ .footnote{
292
+ left : 80px;
293
+ text-align : left;
294
+ }
295
+ }
296
+ .pageNumber{
297
+ position : absolute;
298
+ right : 2px;
299
+ bottom : 22px;
300
+ width : 50px;
301
+ font-size : 0.9em;
302
+ color : #c9ad6a;
303
+ text-align : center;
304
+ &.auto::after {
305
+ content : counter(phb-page-numbers);
306
+ }
307
+ }
308
+ .footnote{
309
+ position : absolute;
310
+ right : 80px;
311
+ bottom : 32px;
312
+ z-index : 150;
313
+ width : 200px;
314
+ font-size : 0.8em;
315
+ color : #c9ad6a;
316
+ text-align : right;
317
+ }
318
+ //*****************************
319
+ // * EXTRAS
320
+ // *****************************/
321
+ hr{
322
+ visibility : hidden;
323
+ margin : 0px;
324
+ }
325
+ //Modified unorder list, used in spells
326
+ hr+ul{
327
+ margin-bottom : 0.5em;
328
+ padding-left : 1em;
329
+ text-indent : -1em;
330
+ list-style-type : none;
331
+ }
332
+ //Column Break
333
+ pre, code{
334
+ visibility : hidden;
335
+ -webkit-column-break-after : always;
336
+ break-after : always;
337
+ -moz-column-break-after : always;
338
+ }
339
+ //Avoid breaking up
340
+ p,blockquote,table{
341
+ z-index : 15;
342
+ -webkit-column-break-inside : avoid;
343
+ page-break-inside : avoid;
344
+ break-inside : avoid;
345
+ }
346
+ //Better spacing for spell blocks
347
+ h4+p+hr+ul{
348
+ margin-top : -0.5em
349
+ }
350
+ //Text indent right after table
351
+ table+p{
352
+ text-indent : 1em;
353
+ }
354
+ // Nested lists
355
+ ul ul,ol ol,ul ol,ol ul{
356
+ margin-bottom : 0px;
357
+ margin-left : 1.5em;
358
+ }
359
+ li{
360
+ -webkit-column-break-inside : avoid;
361
+ page-break-inside : avoid;
362
+ break-inside : avoid;
363
+ }
364
+ }
365
+ //*****************************
366
+ // * SPELL LIST
367
+ // *****************************/
368
+ .phb .spellList{
369
+ .useSansSerif();
370
+ column-count : 4;
371
+ column-span : all;
372
+ -webkit-column-span : all;
373
+ -moz-column-span : all;
374
+ ul+h5{
375
+ margin-top : 15px;
376
+ }
377
+ p, ul{
378
+ font-size : 0.352cm;
379
+ line-height : 1.263em;
380
+ }
381
+ ul{
382
+ margin-bottom : 0.5em;
383
+ padding-left : 1em;
384
+ text-indent : -1em;
385
+ list-style-type : none;
386
+ -webkit-column-break-inside : auto;
387
+ page-break-inside : auto;
388
+ break-inside : auto;
389
+ }
390
+ }
391
+ //*****************************
392
+ // * WIDE
393
+ // *****************************/
394
+ .phb .wide{
395
+ column-span : all;
396
+ -webkit-column-span : all;
397
+ -moz-column-span : all;
398
+ }
399
+ //*****************************
400
+ // * CLASS TABLE
401
+ // *****************************/
402
+ .phb .classTable{
403
+ margin-top : 25px;
404
+ margin-bottom : 40px;
405
+ border-collapse : separate;
406
+ background-color : white;
407
+ border : initial;
408
+ border-style : solid;
409
+ border-image-outset : 25px 17px;
410
+ border-image-repeat : stretch;
411
+ border-image-slice : 150 200 150 200;
412
+ border-image-source : @frameBorderImage;
413
+ border-image-width : 47px;
414
+ h5{
415
+ margin-bottom : 10px;
416
+ }
417
+ }
418
+ //************************************
419
+ // * DESCRIPTIVE TEXT BOX
420
+ // ************************************/
421
+ .phb .descriptive{
422
+ margin-bottom : 1em;
423
+ background-color : #faf7ea;
424
+ font-family : ScalySans;
425
+ border-style : solid;
426
+ border-width : 7px;
427
+ border-image : @descriptiveBoxImage 12 stretch;
428
+ border-image-outset : 4px;
429
+ box-shadow : 0px 0px 6px #faf7ea;
430
+ p{
431
+ display : block;
432
+ padding-bottom : 0px;
433
+ line-height : 1.47em;
434
+ }
435
+ p + p {
436
+ padding-top : .8em;
437
+ }
438
+ em {
439
+ font-family : ScalySans;
440
+ font-style : italic;
441
+ }
442
+ strong {
443
+ font-family : ScalySans;
444
+ font-weight : 800;
445
+ letter-spacing : -0.02em;
446
+ }
447
+ }
448
+ .phb pre+.descriptive{
449
+ margin-top : 8px;
450
+ }
451
+
452
+ //*****************************
453
+ // * ARTIST CREDIT BLOCK
454
+ // *****************************/
455
+ .phb {
456
+ .artist {
457
+ position : absolute;
458
+ text-align : center;
459
+ font-family : WalterTurncoat;
460
+ font-size : 0.27cm;
461
+ color : @captionText;
462
+ p, p + p {
463
+ margin : unset;
464
+ text-indent : unset;
465
+ line-height : 0.941em;
466
+ }
467
+ h5 {
468
+ font-size : 1.3em;
469
+ font-family : WalterTurncoat;
470
+ }
471
+ a{
472
+ color : inherit;
473
+ text-decoration : unset;
474
+ &:hover {
475
+ text-decoration : underline;
476
+ }
477
+ }
478
+ }
479
+ }
480
+ //*****************************
481
+ // * TABLE OF CONTENTS
482
+ // *****************************/
483
+ .phb .toc{
484
+ -webkit-column-break-inside : avoid;
485
+ page-break-inside : avoid;
486
+ break-inside : avoid;
487
+ a{
488
+ color : black;
489
+ text-decoration : none;
490
+ &:hover{
491
+ text-decoration : underline;
492
+ }
493
+ }
494
+ ul{
495
+ padding-left : 0;
496
+ list-style-type : none;
497
+ }
498
+ &>ul>li{
499
+ margin-bottom : 10px;
500
+ }
501
+ }
dependencies/themes/V3/5eDMG/dropdownPreview.png ADDED

Git LFS Details

  • SHA256: 29a769c51aaa2fa411a29dc73563513549cebfb839c29d713eb781baf2665d07
  • Pointer size: 131 Bytes
  • Size of remote file: 588 kB
dependencies/themes/V3/5eDMG/dropdownTexture.png ADDED

Git LFS Details

  • SHA256: 7962607d070ca5a5530b816d174d28750b9e4a752a455c231cd65a1fa6ecbc5c
  • Pointer size: 129 Bytes
  • Size of remote file: 6.03 kB
dependencies/themes/V3/5eDMG/settings.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "name" : "5e DMG",
3
+ "renderer" : "V3",
4
+ "baseTheme" : "5ePHB",
5
+ "baseSnippets" : "5ePHB"
6
+ }
dependencies/themes/V3/5eDMG/snippets.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ /* eslint-disable max-lines */
2
+
3
+ module.exports = [
4
+ ];
dependencies/themes/V3/5eDMG/style.less ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import (less) './themes/assets/assets.less';
2
+
3
+ :root {
4
+ //Colors
5
+ --HB_Color_Accent : #EBCEC3; // Salmon
6
+ --HB_Color_Footnotes : #5C5C5C; // Dark gray
7
+ }
8
+
9
+ .page {
10
+ background-image : url(/assets/DMG_background.png);
11
+ background-size : cover;
12
+
13
+ /*TABLES WITHIN NOTES*/
14
+ .note table tbody tr:nth-child(odd) {
15
+ background:#fff;
16
+ }
17
+
18
+ /*DROP CAP*/
19
+ h1 + p::first-letter {
20
+ background-image: unset;
21
+ color:black;
22
+ }
23
+
24
+ .quote p:first-child::first-line {
25
+ all: unset;
26
+ }
27
+
28
+ &:after {
29
+ background-image : url(/assets/DMG_footerAccent.png);
30
+ height: 58px;
31
+ }
32
+
33
+ .footnote {
34
+ bottom : 40px;
35
+ }
36
+ }
37
+
38
+ .page:has(.partCover) {
39
+
40
+ .partCover {
41
+ background-image: @partCoverHeaderDMG;
42
+ }
43
+ }
dependencies/themes/V3/5ePHB/dropdownPreview.png ADDED

Git LFS Details

  • SHA256: 8b51680151a19921a1e76fbcd3ddd34ae4cac463fabec368915c90d8565ae333
  • Pointer size: 131 Bytes
  • Size of remote file: 801 kB
dependencies/themes/V3/5ePHB/dropdownTexture.png ADDED

Git LFS Details

  • SHA256: 6e0572193d68d6aa54b9d3e882e069a70c5cbd3aa567117d6b8922eda659f52d
  • Pointer size: 130 Bytes
  • Size of remote file: 10.4 kB
dependencies/themes/V3/5ePHB/settings.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "name" : "5e PHB",
3
+ "renderer" : "V3",
4
+ "baseTheme" : false,
5
+ "baseSnippets" : false
6
+ }
dependencies/themes/V3/5ePHB/snippets.js ADDED
@@ -0,0 +1,327 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable max-lines */
2
+
3
+ const MagicGen = require('./snippets/magic.gen.js');
4
+ const ClassTableGen = require('./snippets/classtable.gen.js');
5
+ const MonsterBlockGen = require('./snippets/monsterblock.gen.js');
6
+ const scriptGen = require('./snippets/script.gen.js');
7
+ const ClassFeatureGen = require('./snippets/classfeature.gen.js');
8
+ const CoverPageGen = require('./snippets/coverpage.gen.js');
9
+ const TableOfContentsGen = require('./snippets/tableOfContents.gen.js');
10
+ const indexGen = require('./snippets/index.gen.js');
11
+ const QuoteGen = require('./snippets/quote.gen.js');
12
+ const dedent = require('dedent-tabs').default;
13
+
14
+
15
+
16
+ module.exports = [
17
+
18
+ {
19
+ groupName : 'Text Editor',
20
+ icon : 'fas fa-pencil-alt',
21
+ view : 'text',
22
+ snippets : [
23
+ {
24
+ name : 'Table of Contents',
25
+ icon : 'fas fa-book',
26
+ gen : TableOfContentsGen
27
+ },
28
+ {
29
+ name : 'Index',
30
+ icon : 'fas fa-bars',
31
+ gen : indexGen,
32
+ experimental : true
33
+ }
34
+ ]
35
+ },
36
+ {
37
+ groupName : 'Style Editor',
38
+ icon : 'fas fa-pencil-alt',
39
+ view : 'style',
40
+ snippets : [
41
+ {
42
+ name : 'Remove Drop Cap',
43
+ icon : 'fas fa-remove-format',
44
+ gen : dedent`/* Removes Drop Caps */
45
+ .page h1+p:first-letter {
46
+ all: unset;
47
+ }\n\n
48
+ /* Removes Small-Caps in first line */
49
+ .page h1+p:first-line {
50
+ all: unset;
51
+ }`
52
+ },
53
+ {
54
+ name : 'Tweak Drop Cap',
55
+ icon : 'fas fa-sliders-h',
56
+ gen : dedent`/* Drop Cap settings */
57
+ .page h1 + p::first-letter {
58
+ font-family: SolberaImitationRemake;
59
+ font-size: 3.5cm;
60
+ background-image: linear-gradient(-45deg, #322814, #998250, #322814);
61
+ line-height: 1em;
62
+ }\n\n`
63
+ }
64
+ ]
65
+ },
66
+
67
+ /*********************** IMAGES *******************/
68
+ {
69
+ groupName : 'Images',
70
+ icon : 'fas fa-images',
71
+ view : 'text',
72
+ snippets : [
73
+ {
74
+ name : 'Image',
75
+ icon : 'fas fa-image',
76
+ gen : dedent`
77
+ ![cat warrior](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:325px,mix-blend-mode:multiply}
78
+
79
+ {{artist,position:relative,top:-230px,left:10px,margin-bottom:-30px
80
+ ##### Cat Warrior
81
+ [Kyoung Hwan Kim](https://www.artstation.com/tahra)
82
+ }}`
83
+ },
84
+ {
85
+ name : 'Background Image',
86
+ icon : 'fas fa-tree',
87
+ gen : dedent`
88
+ ![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,top:50px,right:30px,width:280px}
89
+
90
+ {{artist,top:80px,right:30px
91
+ ##### Homebrew Mug
92
+ [naturalcrit](https://homebrew.naturalcrit.com)
93
+ }}`
94
+ },
95
+ {
96
+ name : 'Watermark',
97
+ icon : 'fas fa-id-card',
98
+ gen : dedent`
99
+ {{watermark Homebrewery}}\n`
100
+ },
101
+ ]
102
+ },
103
+
104
+
105
+ /************************* PHB ********************/
106
+
107
+ {
108
+ groupName : 'PHB',
109
+ icon : 'fas fa-book',
110
+ view : 'text',
111
+ snippets : [
112
+ {
113
+ name : 'Spell',
114
+ icon : 'fas fa-magic',
115
+ gen : MagicGen.spell,
116
+ },
117
+ {
118
+ name : 'Spell List',
119
+ icon : 'fas fa-scroll',
120
+ gen : MagicGen.spellList,
121
+ },
122
+ {
123
+ name : 'Class Feature',
124
+ icon : 'fas fa-mask',
125
+ gen : ClassFeatureGen,
126
+ },
127
+ {
128
+ name : 'Quote',
129
+ icon : 'fas fa-quote-right',
130
+ gen : QuoteGen,
131
+ },
132
+ {
133
+ name : 'Note',
134
+ icon : 'fas fa-sticky-note',
135
+ gen : function(){
136
+ return dedent`
137
+ {{note
138
+ ##### Time to Drop Knowledge
139
+ Use notes to point out some interesting information.
140
+
141
+ **Tables and lists** both work within a note.
142
+ }}
143
+ \n`;
144
+ },
145
+ },
146
+ {
147
+ name : 'Descriptive Text Box',
148
+ icon : 'fas fa-comment-alt',
149
+ gen : function(){
150
+ return dedent`
151
+ {{descriptive
152
+ ##### Time to Drop Knowledge
153
+ Use descriptive boxes to highlight text that should be read aloud.
154
+
155
+ **Tables and lists** both work within a descriptive box.
156
+ }}
157
+ \n`;
158
+ },
159
+ },
160
+ {
161
+ name : 'Monster Stat Block (unframed)',
162
+ icon : 'fas fa-paw',
163
+ gen : MonsterBlockGen.monster('monster', 2),
164
+ },
165
+ {
166
+ name : 'Monster Stat Block',
167
+ icon : 'fas fa-spider',
168
+ gen : MonsterBlockGen.monster('monster,frame', 2),
169
+ },
170
+ {
171
+ name : 'Wide Monster Stat Block',
172
+ icon : 'fas fa-dragon',
173
+ gen : MonsterBlockGen.monster('monster,frame,wide', 4),
174
+ },
175
+ {
176
+ name : 'Front Cover Page',
177
+ icon : 'fac book-front-cover',
178
+ gen : CoverPageGen.front,
179
+ experimental : true
180
+ },
181
+ {
182
+ name : 'Inside Cover Page',
183
+ icon : 'fac book-inside-cover',
184
+ gen : CoverPageGen.inside,
185
+ experimental : true
186
+ },
187
+ {
188
+ name : 'Part Cover Page',
189
+ icon : 'fac book-part-cover',
190
+ gen : CoverPageGen.part,
191
+ experimental : true
192
+ },
193
+ {
194
+ name : 'Back Cover Page',
195
+ icon : 'fac book-back-cover',
196
+ gen : CoverPageGen.back,
197
+ experimental : true
198
+ },
199
+ {
200
+ name : 'Magic Item',
201
+ icon : 'fas fa-hat-wizard',
202
+ gen : MagicGen.item,
203
+ },
204
+ {
205
+ name : 'Artist Credit',
206
+ icon : 'fas fa-signature',
207
+ gen : function(){
208
+ return dedent`
209
+ {{artist,top:90px,right:30px
210
+ ##### Starry Night
211
+ [Van Gogh](https://www.vangoghmuseum.nl/en)
212
+ }}
213
+ \n`;
214
+ },
215
+ }
216
+ ]
217
+ },
218
+
219
+
220
+
221
+ /********************* TABLES *********************/
222
+
223
+ {
224
+ groupName : 'Tables',
225
+ icon : 'fas fa-table',
226
+ view : 'text',
227
+ snippets : [
228
+ {
229
+ name : 'Class Tables',
230
+ icon : 'fas fa-table',
231
+ gen : ClassTableGen.full('classTable,frame,decoration,wide'),
232
+ subsnippets : [
233
+ {
234
+ name : 'Martial Class Table',
235
+ icon : 'fas fa-table',
236
+ gen : ClassTableGen.non('classTable,frame,decoration'),
237
+ },
238
+ {
239
+ name : 'Martial Class Table (unframed)',
240
+ icon : 'fas fa-border-none',
241
+ gen : ClassTableGen.non('classTable'),
242
+ },
243
+ {
244
+ name : 'Full Caster Class Table',
245
+ icon : 'fas fa-table',
246
+ gen : ClassTableGen.full('classTable,frame,decoration,wide'),
247
+ },
248
+ {
249
+ name : 'Full Caster Class Table (unframed)',
250
+ icon : 'fas fa-border-none',
251
+ gen : ClassTableGen.full('classTable,wide'),
252
+ },
253
+ {
254
+ name : 'Half Caster Class Table',
255
+ icon : 'fas fa-list-alt',
256
+ gen : ClassTableGen.half('classTable,frame,decoration,wide'),
257
+ },
258
+ {
259
+ name : 'Half Caster Class Table (unframed)',
260
+ icon : 'fas fa-border-none',
261
+ gen : ClassTableGen.half('classTable,wide'),
262
+ },
263
+ {
264
+ name : 'Third Caster Spell Table',
265
+ icon : 'fas fa-border-all',
266
+ gen : ClassTableGen.third('classTable,frame,decoration'),
267
+ },
268
+ {
269
+ name : 'Third Caster Spell Table (unframed)',
270
+ icon : 'fas fa-border-none',
271
+ gen : ClassTableGen.third('classTable'),
272
+ }
273
+ ]
274
+ },
275
+ {
276
+ name : 'Rune Table',
277
+ icon : 'fas fa-language',
278
+ gen : scriptGen.dwarvish,
279
+ experimental : true,
280
+ subsnippets : [
281
+ {
282
+ name : 'Dwarvish',
283
+ icon : 'fac davek',
284
+ gen : scriptGen.dwarvish,
285
+ },
286
+ {
287
+ name : 'Elvish',
288
+ icon : 'fac rellanic',
289
+ gen : scriptGen.elvish,
290
+ },
291
+ {
292
+ name : 'Draconic',
293
+ icon : 'fac iokharic',
294
+ gen : scriptGen.draconic,
295
+ },
296
+ ]
297
+ },
298
+ ]
299
+ },
300
+
301
+
302
+
303
+
304
+ /**************** PAGE *************/
305
+
306
+ {
307
+ groupName : 'Print',
308
+ icon : 'fas fa-print',
309
+ view : 'style',
310
+ snippets : [
311
+ {
312
+ name : 'Ink Friendly',
313
+ icon : 'fas fa-tint',
314
+ gen : dedent`
315
+ /* Ink Friendly */
316
+ *:is(.page,.monster,.note,.descriptive) {
317
+ background : white !important;
318
+ filter : drop-shadow(0px 0px 3px #888) !important;
319
+ }
320
+
321
+ .page img {
322
+ visibility : hidden;
323
+ }\n\n`
324
+ },
325
+ ]
326
+ }
327
+ ];
dependencies/themes/V3/5ePHB/snippets/classfeature.gen.js ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ module.exports = function(classname){
5
+
6
+ classname = _.sample(['archivist', 'fancyman', 'linguist', 'fletcher',
7
+ 'notary', 'berserker-typist', 'fishmongerer', 'manicurist', 'haberdasher', 'concierge']);
8
+
9
+ classname = classname.toLowerCase();
10
+
11
+ const hitDie = _.sample([4, 6, 8, 10, 12]);
12
+ const spellSkill = _.sample(['Wisdom', 'Charisma', 'Intelligence']);
13
+
14
+ const abilityList = ['Strength', 'Dexerity', 'Constitution', 'Wisdom', 'Charisma', 'Intelligence'];
15
+ const skillList = ['Acrobatics', 'Animal Handling', 'Arcana', 'Athletics', 'Deception', 'History', 'Insight', 'Intimidation', 'Investigation', 'Medicine', 'Nature', 'Perception', 'Performance', 'Persuasion', 'Religion', 'Sleight of Hand', 'Stealth', 'Survival'];
16
+
17
+
18
+ return dedent`
19
+ ## Class Features
20
+
21
+ As a ${classname}, you gain the following class features
22
+
23
+ #### Hit Points
24
+ **Hit Dice:** :: 1d${hitDie} per ${classname} level
25
+ **Hit Points at 1st Level:** :: ${hitDie} + your Constitution modifier
26
+ **Hit Points at Higher Levels:** :: 1d${hitDie} (or ${hitDie/2 + 1}) + your Constitution modifier per ${classname} level after 1st
27
+
28
+ #### Proficiencies
29
+ **Armor:** :: ${_.sampleSize(['Light armor', 'Medium armor', 'Heavy armor', 'Shields'], _.random(0, 3)).join(', ') || 'None'}
30
+ **Weapons:** :: ${_.sampleSize(['Squeegee', 'Rubber Chicken', 'Simple weapons', 'Martial weapons'], _.random(0, 2)).join(', ') || 'None'}
31
+ **Tools:** :: ${_.sampleSize(['Artisan\'s tools', 'one musical instrument', 'Thieves\' tools'], _.random(0, 2)).join(', ') || 'None'}
32
+
33
+ **Saving Throws:** :: ${_.sampleSize(abilityList, 2).join(', ')}
34
+ **Skills:** :: Choose two from ${_.sampleSize(skillList, _.random(4, 6)).join(', ')}
35
+
36
+ #### Spellcasting Ability
37
+ {{text-align:center
38
+ **Spell save DC**:: = ${_.sample([6, 8, 10])} + your proficiency bonus + your ${spellSkill} modifier
39
+
40
+ **Spell attack modifier**:: = your proficiency bonus + your ${spellSkill} modifier
41
+ }}
42
+
43
+ #### Equipment
44
+ You start with the following equipment, in addition to the equipment granted by your background:
45
+ - (*a*) a martial weapon and a shield or (*b*) two martial weapons
46
+ - (*a*) five javelins or (*b*) any simple melee weapon
47
+ - ${_.sample(['10 lint fluffs', '1 button', 'a cherished lost sock'])}
48
+ `;
49
+ };
dependencies/themes/V3/5ePHB/snippets/classtable.gen.js ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ const features = [
5
+ 'Astrological Botany', 'Biochemical Sorcery', 'Civil Divination',
6
+ 'Consecrated Augury', 'Demonic Anthropology', 'Divinatory Mineralogy',
7
+ 'Exo Interfacer', 'Genetic Banishing', 'Gunpowder Torturer',
8
+ 'Gunslinger Corruptor', 'Hermetic Geography', 'Immunological Cultist',
9
+ 'Malefic Chemist', 'Mathematical Pharmacy', 'Nuclear Biochemistry',
10
+ 'Orbital Gravedigger', 'Pharmaceutical Outlaw', 'Phased Linguist',
11
+ 'Plasma Gunslinger', 'Police Necromancer', 'Ritual Astronomy',
12
+ 'Sixgun Poisoner', 'Seismological Alchemy', 'Spiritual Illusionism',
13
+ 'Statistical Occultism', 'Spell Analyst', 'Torque Interfacer'
14
+ ].map((f)=>_.padEnd(f, 21)); // Pad to equal length of 21 chars long
15
+
16
+ const classnames = [
17
+ 'Ackerman', 'Berserker-Typist', 'Concierge', 'Fishmonger',
18
+ 'Haberdasher', 'Manicurist', 'Netrunner', 'Weirkeeper'
19
+ ];
20
+
21
+ module.exports = {
22
+ non : function(snippetClasses){
23
+ return dedent`
24
+ {{${snippetClasses}
25
+ ##### The ${_.sample(classnames)}
26
+ | Level | Proficiency Bonus | Features | ${_.sample(features)} |
27
+ |:-----:|:-----------------:|:---------|:---------------------:|
28
+ | 1st | +2 | ${_.sample(features)} | 2 |
29
+ | 2nd | +2 | ${_.sample(features)} | 2 |
30
+ | 3rd | +2 | ${_.sample(features)} | 3 |
31
+ | 4th | +2 | ${_.sample(features)} | 3 |
32
+ | 5th | +3 | ${_.sample(features)} | 3 |
33
+ | 6th | +3 | ${_.sample(features)} | 4 |
34
+ | 7th | +3 | ${_.sample(features)} | 4 |
35
+ | 8th | +3 | ${_.sample(features)} | 4 |
36
+ | 9th | +4 | ${_.sample(features)} | 4 |
37
+ | 10th | +4 | ${_.sample(features)} | 4 |
38
+ | 11th | +4 | ${_.sample(features)} | 4 |
39
+ | 12th | +4 | ${_.sample(features)} | 5 |
40
+ | 13th | +5 | ${_.sample(features)} | 5 |
41
+ | 14th | +5 | ${_.sample(features)} | 5 |
42
+ | 15th | +5 | ${_.sample(features)} | 5 |
43
+ | 16th | +5 | ${_.sample(features)} | 5 |
44
+ | 17th | +6 | ${_.sample(features)} | 6 |
45
+ | 18th | +6 | ${_.sample(features)} | 6 |
46
+ | 19th | +6 | ${_.sample(features)} | 6 |
47
+ | 20th | +6 | ${_.sample(features)} | unlimited |
48
+ }}\n\n`;
49
+ },
50
+
51
+ full : function(snippetClasses){
52
+ return dedent`
53
+ {{${snippetClasses}
54
+ ##### The ${_.sample(classnames)}
55
+ | Level | Proficiency | Features | Cantrips | --- Spell Slots Per Spell Level ---|||||||||
56
+ | ^| Bonus ^| ^| Known ^|1st |2nd |3rd |4th |5th |6th |7th |8th |9th |
57
+ |:-----:|:-----------:|:-------------|:--------:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
58
+ | 1st | +2 | ${_.sample(features)} | 2 | 2 | — | — | — | — | — | — | — | — |
59
+ | 2nd | +2 | ${_.sample(features)} | 2 | 3 | — | — | — | — | — | — | — | — |
60
+ | 3rd | +2 | ${_.sample(features)} | 2 | 4 | 2 | — | — | — | — | — | — | — |
61
+ | 4th | +2 | ${_.sample(features)} | 3 | 4 | 3 | — | — | — | — | — | — | — |
62
+ | 5th | +3 | ${_.sample(features)} | 3 | 4 | 3 | 2 | — | — | — | — | — | — |
63
+ | 6th | +3 | ${_.sample(features)} | 3 | 4 | 3 | 3 | — | — | — | — | — | — |
64
+ | 7th | +3 | ${_.sample(features)} | 3 | 4 | 3 | 3 | 1 | — | — | — | — | — |
65
+ | 8th | +3 | ${_.sample(features)} | 3 | 4 | 3 | 3 | 2 | — | — | — | — | — |
66
+ | 9th | +4 | ${_.sample(features)} | 3 | 4 | 3 | 3 | 2 | 1 | — | — | — | — |
67
+ | 10th | +4 | ${_.sample(features)} | 3 | 4 | 3 | 3 | 2 | 1 | — | — | — | — |
68
+ | 11th | +4 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | — | — | — |
69
+ | 12th | +4 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | — | — | — |
70
+ | 13th | +5 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | 1 | — | — |
71
+ | 14th | +5 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | 1 | — | — |
72
+ | 15th | +5 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | 1 | 1 | — |
73
+ | 16th | +5 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | 1 | 1 | — |
74
+ | 17th | +6 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 2 | 1 | 1 | 1 | 1 | 1 |
75
+ | 18th | +6 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 3 | 1 | 1 | 1 | 1 | 1 |
76
+ | 19th | +6 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 3 | 2 | 2 | 1 | 1 | 1 |
77
+ | 20th | +6 | ${_.sample(features)} | 4 | 4 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 1 |
78
+ }}\n\n`;
79
+ },
80
+
81
+ half : function(snippetClasses){
82
+ return dedent`
83
+ {{${snippetClasses}
84
+ ##### The ${_.sample(classnames)}
85
+ | Level | Proficiency | Features | Spells |--- Spell Slots Per Spell Level ---|||||
86
+ | ^| Bonus ^| ^| Known ^| 1st | 2nd | 3rd | 4th | 5th |
87
+ |:-----:|:-----------:|:-------------|:------:|:-----:|:-----:|:-----:|:-----:|:-----:|
88
+ | 1st | +2 | ${_.sample(features)} | — | — | — | — | — | — |
89
+ | 2nd | +2 | ${_.sample(features)} | 2 | 2 | — | — | — | — |
90
+ | 3rd | +2 | ${_.sample(features)} | 3 | 3 | — | — | — | — |
91
+ | 4th | +2 | ${_.sample(features)} | 3 | 3 | — | — | — | — |
92
+ | 5th | +3 | ${_.sample(features)} | 4 | 4 | 2 | — | — | — |
93
+ | 6th | +3 | ${_.sample(features)} | 4 | 4 | 2 | — | — | — |
94
+ | 7th | +3 | ${_.sample(features)} | 5 | 4 | 3 | — | — | — |
95
+ | 8th | +3 | ${_.sample(features)} | 5 | 4 | 3 | — | — | — |
96
+ | 9th | +4 | ${_.sample(features)} | 6 | 4 | 3 | 2 | — | — |
97
+ | 10th | +4 | ${_.sample(features)} | 6 | 4 | 3 | 2 | — | — |
98
+ | 11th | +4 | ${_.sample(features)} | 7 | 4 | 3 | 3 | — | — |
99
+ | 12th | +4 | ${_.sample(features)} | 7 | 4 | 3 | 3 | — | — |
100
+ | 13th | +5 | ${_.sample(features)} | 8 | 4 | 3 | 3 | 1 | — |
101
+ | 14th | +5 | ${_.sample(features)} | 8 | 4 | 3 | 3 | 1 | — |
102
+ | 15th | +5 | ${_.sample(features)} | 9 | 4 | 3 | 3 | 2 | — |
103
+ | 16th | +5 | ${_.sample(features)} | 9 | 4 | 3 | 3 | 2 | — |
104
+ | 17th | +6 | ${_.sample(features)} | 10 | 4 | 3 | 3 | 3 | 1 |
105
+ | 18th | +6 | ${_.sample(features)} | 10 | 4 | 3 | 3 | 3 | 1 |
106
+ | 19th | +6 | ${_.sample(features)} | 11 | 4 | 3 | 3 | 3 | 2 |
107
+ | 20th | +6 | ${_.sample(features)} | 11 | 4 | 3 | 3 | 3 | 2 |
108
+ }}\n\n`;
109
+ },
110
+
111
+ third : function(snippetClasses){
112
+ return dedent`
113
+ {{${snippetClasses}
114
+ ##### ${_.sample(classnames)} Spellcasting
115
+ | Level | Cantrips | Spells |--- Spells Slots per Spell Level ---||||
116
+ | ^| Known ^| Known ^| 1st | 2nd | 3rd | 4th |
117
+ |:-----:|:--------:|:------:|:-------:|:-------:|:-------:|:-------:|
118
+ | 3rd | 2 | 3 | 2 | — | — | — |
119
+ | 4th | 2 | 4 | 3 | — | — | — |
120
+ | 5th | 2 | 4 | 3 | — | — | — |
121
+ | 6th | 2 | 4 | 3 | — | — | — |
122
+ | 7th | 2 | 5 | 4 | 2 | — | — |
123
+ | 8th | 2 | 6 | 4 | 2 | — | — |
124
+ | 9th | 2 | 6 | 4 | 2 | — | — |
125
+ | 10th | 3 | 7 | 4 | 3 | — | — |
126
+ | 11th | 3 | 8 | 4 | 3 | — | — |
127
+ | 12th | 3 | 8 | 4 | 3 | — | — |
128
+ | 13th | 3 | 9 | 4 | 3 | 2 | — |
129
+ | 14th | 3 | 10 | 4 | 3 | 2 | — |
130
+ | 15th | 3 | 10 | 4 | 3 | 2 | — |
131
+ | 16th | 3 | 11 | 4 | 3 | 3 | — |
132
+ | 17th | 3 | 11 | 4 | 3 | 3 | — |
133
+ | 18th | 3 | 11 | 4 | 3 | 3 | — |
134
+ | 19th | 3 | 12 | 4 | 3 | 3 | 1 |
135
+ | 20th | 3 | 13 | 4 | 3 | 3 | 1 |
136
+ }}\n\n`;
137
+ }
138
+ };
dependencies/themes/V3/5ePHB/snippets/coverpage.gen.js ADDED
@@ -0,0 +1,156 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ const titles = [
5
+ 'The Burning Gallows', 'The Ring of Nenlast',
6
+ 'Below the Blind Tavern', 'Below the Hungering River',
7
+ 'Before Bahamut\'s Land', 'The Cruel Grave from Within',
8
+ 'The Strength of Trade Road', 'Through The Raven Queen\'s Worlds',
9
+ 'Within the Settlement', 'The Crown from Within',
10
+ 'The Merchant Within the Battlefield', 'Ioun\'s Fading Traveler',
11
+ 'The Legion Ingredient', 'The Explorer Lure',
12
+ 'Before the Charming Badlands', 'Vecna\'s Hidden Sage',
13
+ 'The Living Dead Above the Fearful Cage', 'Bahamut\'s Demonspawn',
14
+ 'Across Gruumsh\'s Elemental Chaos', 'The Blade of Orcus',
15
+ 'Beyond Revenge', 'Brain of Insanity',
16
+ 'A New Beginning', 'Evil Lake of the Merfolk',
17
+ 'Invasion of the Gigantic Cat, Part II', 'Kraken War 2020',
18
+ 'The Body Whisperers', 'The Doctor from Heaven',
19
+ 'The Diabolical Tales of the Ape-Women', 'The Doctor Immortal',
20
+ 'Core of Heaven: Guardian of Amazement', 'The Graveyard',
21
+ 'Guardian: Skies of the Dark Wizard', 'Lute of Eternity',
22
+ 'Mercury\'s Planet: Brave Evolution', 'Azure Core',
23
+ 'Sky of Zelda: The Thunder of Force', 'Core Battle',
24
+ 'Ruby of Atlantis: The Quake of Peace', 'Deadly Amazement III',
25
+ 'Dry Chaos IX', 'Gate Thunder',
26
+ 'Vyse\'s Skies', 'Blue Greatness III',
27
+ 'Yellow Divinity', 'Zidane\'s Ghost'
28
+ ];
29
+
30
+ const subtitles = [
31
+ 'Tomb of Shadows', 'Dragon\'s Lair',
32
+ 'Lost Caverns', 'The Necromancer',
33
+ 'Mystic Forest', 'Cursed Ruins',
34
+ 'The Dark Abyss', 'Enchanted Maze',
35
+ 'Haunted Castle', 'Sands of Fate',
36
+ 'Dragon\'s Hoard', 'Undead Menace',
37
+ 'Lost City Ruins', 'Goblin Ambush',
38
+ 'Enchanted Forest', 'Darkness Rising',
39
+ 'Quest for Glory', 'Ancient Prophecy',
40
+ 'Shadowy Depths', 'Mystic Isles'
41
+ ];
42
+
43
+ const footnote = [
44
+ 'In an ominous universe, a botanist opposes terrorism.',
45
+ '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.',
46
+ 'In a land of corruption, two cyberneticists and a dungeon delver search for freedom.',
47
+ 'In an evil empire of horror, two rangers battle the forces of hell.',
48
+ 'In a lost city, in an age of sorcery, a librarian quests for revenge.',
49
+ 'In a universe of illusions and danger, three time travellers and an adventurer search for justice.',
50
+ 'In a forgotten universe of barbarism, in an era of terror and mysticism, a virtual reality programmer and a spy try to find vengance and battle crime.',
51
+ 'In a universe of demons, in an era of insanity and ghosts, three bodyguards and a bodyguard try to find vengance.',
52
+ 'In a kingdom of corruption and battle, seven artificial intelligences try to save the last living fertile woman.',
53
+ 'In a universe of virutal reality and agony, in an age of ghosts and ghosts, a fortune-teller and a wanderer try to avert the apocalypse.',
54
+ 'In a crime-infested kingdom, three martial artists quest for the truth and oppose evil.',
55
+ 'In a terrifying universe of lost souls, in an era of lost souls, eight dancers fight evil.',
56
+ 'In a galaxy of confusion and insanity, three martial artists and a duke battle a mob of psychics.',
57
+ 'In an amazing kingdom, a wizard and a secretary hope to prevent the destruction of mankind.',
58
+ 'In a kingdom of deception, a reporter searches for fame.',
59
+ 'In a hellish empire, a swordswoman and a duke try to find the ultimate weapon and battle a conspiracy.',
60
+ 'In an evil galaxy of illusion, in a time of technology and misery, seven psychiatrists battle crime.',
61
+ 'In a dark city of confusion, three swordswomen and a singer battle lawlessness.',
62
+ 'In an ominous empire, in an age of hate, two philosophers and a student try to find justice and battle a mob of mages intent on stealing the souls of the innocent.',
63
+ 'In a kingdom of panic, six adventurers oppose lawlessness.',
64
+ 'In a land of dreams and hopelessness, three hackers and a cyborg search for justice.',
65
+ 'On a planet of mysticism, three travelers and a fire fighter quest for the ultimate weapon and oppose evil.',
66
+ 'In a wicked universe, five seers fight lawlessness.',
67
+ 'In a kingdom of death, in an era of illusion and blood, four colonists search for fame.',
68
+ 'In an amazing kingdom, in an age of sorcery and lost souls, eight space pirates quest for freedom.'
69
+ ];
70
+
71
+ const coverText = [
72
+ '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.',
73
+ '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.',
74
+ '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.',
75
+ '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.',
76
+ '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.',
77
+ '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.',
78
+ '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.'
79
+ ];
80
+
81
+ module.exports = {
82
+
83
+ front : function() {
84
+ return dedent`
85
+ {{frontCover}}
86
+
87
+ {{logo ![](/assets/naturalCritLogoRed.svg)}}
88
+
89
+ # ${_.sample(titles)}
90
+ ## ${_.sample(subtitles)}
91
+ ___
92
+
93
+ {{banner HOMEBREW}}
94
+
95
+ {{footnote
96
+ ${_.sample(footnote)}
97
+ }}
98
+
99
+ ![background image](https://i.imgur.com/IwHRrbF.jpg){position:absolute,bottom:0,left:0,height:100%}
100
+
101
+ \page`;
102
+ },
103
+
104
+ inside : function() {
105
+ return dedent`
106
+ {{insideCover}}
107
+
108
+ # ${_.sample(titles)}
109
+ ## ${_.sample(subtitles)}
110
+ ___
111
+
112
+ {{imageMaskCenter${_.random(1, 16)},--offsetX:0%,--offsetY:0%,--rotation:0
113
+ ![background image](https://i.imgur.com/IsfUnFR.jpg){position:absolute,bottom:0,left:0,height:100%}
114
+ }}
115
+
116
+ {{logo ![](/assets/naturalCritLogoRed.svg)}}
117
+
118
+ \page`;
119
+ },
120
+
121
+ part : function() {
122
+ return dedent`
123
+ {{partCover}}
124
+
125
+ # PART X
126
+ ## ${_.sample(subtitles)}
127
+
128
+ {{imageMaskEdge${_.random(1, 8)},--offset:10cm,--rotation:180
129
+ ![Background image](https://i.imgur.com/9TU96xY.jpg){position:absolute,bottom:0,left:0,height:100%}
130
+ }}
131
+
132
+ \page`;
133
+ },
134
+
135
+ back : function() {
136
+ return dedent`
137
+ {{backCover}}
138
+
139
+ # ${_.sample(subtitles)}
140
+
141
+ ${_.sampleSize(coverText, 3).join('\n:\n')}
142
+ ___
143
+
144
+ For use with any fantasy roleplaying ruleset. Play the best game of your life!
145
+
146
+ ![background image](https://i.imgur.com/MJ4YHu7.jpg){position:absolute,bottom:0,left:0,height:100%}
147
+
148
+ {{logo
149
+ ![](/assets/naturalCritLogoWhite.svg)
150
+
151
+ Homebrewery.Naturalcrit.com
152
+ }}
153
+
154
+ \page`;
155
+ }
156
+ };
dependencies/themes/V3/5ePHB/snippets/fullclass.gen.js ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const ClassFeatureGen = require('./classfeature.gen.js');
4
+
5
+ const ClassTableGen = require('./classtable.gen.js');
6
+
7
+ module.exports = function(){
8
+
9
+ const classname = _.sample(['Archivist', 'Fancyman', 'Linguist', 'Fletcher',
10
+ 'Notary', 'Berserker-Typist', 'Fishmongerer', 'Manicurist', 'Haberdasher', 'Concierge']);
11
+
12
+
13
+ const image = _.sample(_.map([
14
+ 'http://orig01.deviantart.net/4682/f/2007/099/f/c/bard_stick_figure_by_wrpigeek.png',
15
+ 'http://img07.deviantart.net/a3c9/i/2007/099/3/a/archer_stick_figure_by_wrpigeek.png',
16
+ 'http://pre04.deviantart.net/d596/th/pre/f/2007/099/5/2/adventurer_stick_figure_by_wrpigeek.png',
17
+ 'http://img13.deviantart.net/d501/i/2007/099/d/4/black_mage_stick_figure_by_wrpigeek.png',
18
+ 'http://img09.deviantart.net/5cf3/i/2007/099/d/d/dark_knight_stick_figure_by_wrpigeek.png',
19
+ 'http://pre01.deviantart.net/7a34/th/pre/f/2007/099/6/3/monk_stick_figure_by_wrpigeek.png',
20
+ 'http://img11.deviantart.net/5dcc/i/2007/099/d/1/mystic_knight_stick_figure_by_wrpigeek.png',
21
+ 'http://pre08.deviantart.net/ad45/th/pre/f/2007/099/a/0/thief_stick_figure_by_wrpigeek.png',
22
+ ], function(url){
23
+ return `<img src = '${url}' style='max-width:8cm;max-height:25cm' />`;
24
+ }));
25
+
26
+
27
+ return `${[
28
+ image,
29
+ '',
30
+ '```',
31
+ '```',
32
+ '<div style=\'margin-top:240px\'></div>\n\n',
33
+ `## ${classname}`,
34
+ 'Cool intro stuff will go here',
35
+
36
+ '\\page',
37
+ ClassTableGen(classname),
38
+ ClassFeatureGen(classname),
39
+
40
+
41
+
42
+ ].join('\n')}\n\n\n`;
43
+ };
dependencies/themes/V3/5ePHB/snippets/index.gen.js ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const dedent = require('dedent-tabs').default;
2
+
3
+ module.exports = ()=>{
4
+ return dedent`
5
+ {{index,wide,columns:5;
6
+ ##### Index
7
+ - Ankhesh-Bort
8
+ - city map, 7
9
+ - city watch, 12
10
+ - guilds, 19
11
+ - Cheese
12
+ - types of cheese, 8
13
+ - cheese-related magic, 14
14
+ - cheese-related quests, 26-27
15
+ - Death
16
+ - appearance, 10
17
+ - personality, 13
18
+ - hobbies, 23
19
+ - Elves
20
+ - types of elves, 15
21
+ - elvish magic, 24
22
+ - elvish curses, 28
23
+ - Footnotes
24
+ - types of footnotes, 16-17
25
+ - footnote rules, 20-21
26
+ - footnote humor, 29-30
27
+ - Gods
28
+ - types of gods, 12
29
+ - godly interventions, 25
30
+ - godly conflicts, 31
31
+ - Heroes
32
+ - class features, 11-12
33
+ - heroic deeds, 26-27
34
+ - Inns
35
+ - types of inns, 9
36
+ - inn amenities, 18
37
+ - Jokes
38
+ - types of jokes, 11-12
39
+ - joke delivery, 25
40
+ - Knives
41
+ - types of knives, 16-17
42
+ - knife skills, 22-23
43
+ - knife fights, 28-29
44
+ - Luggage
45
+ - appearance, 10
46
+ - personality, 13
47
+ - abilities, 23
48
+ - Magic
49
+ - types of magic, 15
50
+ - magic rules, 24
51
+ - magic mishaps, 28
52
+ - Socks
53
+ - types of socks, 9
54
+ - sock-related magic (yes, really), 15
55
+ - sock-related quests (no, really), 26
56
+ - Trolls
57
+ - appearance and biology, 11
58
+ - culture and language, 18
59
+ - troll rights and activism, 31
60
+ - Unknown University
61
+ - history and architecture, 12
62
+ - faculty and staff, 20
63
+ - courses and exams, 33
64
+ - Vampires
65
+ - types and origins, 13
66
+ - vampiric powers and weaknesses, 21
67
+ - vampiric etiquette and politics, 34
68
+ - Witches
69
+ - types and traditions, 14
70
+ - witchcraft and headology, 22
71
+ - witch trials and tribulations, 35
72
+ - Xylophones
73
+ - musical instruments or weapons?, 15
74
+ - xylophone-related magic and lore, 23
75
+ - xylophone-related quests and puzzles, 36
76
+ - Yetis
77
+ - appearance and behavior, 16
78
+ - yeti philosophy and religion, 24
79
+ - yeti encounters and stories, 37
80
+ - Zombies
81
+ - types and causes, 17
82
+ - zombie rights and duties, 25
83
+ - zombie survival and prevention, 38
84
+ }}`;
85
+ };
dependencies/themes/V3/5ePHB/snippets/magic.gen.js ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ const spellNames = [
4
+ 'Astral Rite of Acne',
5
+ 'Create Acne',
6
+ 'Cursed Ramen Erruption',
7
+ 'Dark Chant of the Dentists',
8
+ 'Erruption of Immaturity',
9
+ 'Flaming Disc of Inconvenience',
10
+ 'Heal Bad Hygene',
11
+ 'Heavenly Transfiguration of the Cream Devil',
12
+ 'Hellish Cage of Mucus',
13
+ 'Irritate Peanut Butter Fairy',
14
+ 'Luminous Erruption of Tea',
15
+ 'Mystic Spell of the Poser',
16
+ 'Sorcerous Enchantment of the Chimneysweep',
17
+ 'Steak Sauce Ray',
18
+ 'Talk to Groupie',
19
+ 'Astonishing Chant of Chocolate',
20
+ 'Astounding Pasta Puddle',
21
+ 'Ball of Annoyance',
22
+ 'Cage of Yarn',
23
+ 'Control Noodles Elemental',
24
+ 'Create Nervousness',
25
+ 'Cure Baldness',
26
+ 'Cursed Ritual of Bad Hair',
27
+ 'Dispell Piles in Dentist',
28
+ 'Eliminate Florists',
29
+ 'Illusionary Transfiguration of the Babysitter',
30
+ 'Necromantic Armor of Salad Dressing',
31
+ 'Occult Transfiguration of Foot Fetish',
32
+ 'Protection from Mucus Giant',
33
+ 'Tinsel Blast',
34
+ 'Alchemical Evocation of the Goths',
35
+ 'Call Fangirl',
36
+ 'Divine Spell of Crossdressing',
37
+ 'Dominate Ramen Giant',
38
+ 'Eliminate Vindictiveness in Gym Teacher',
39
+ 'Extra-Planar Spell of Irritation',
40
+ 'Induce Whining in Babysitter',
41
+ 'Invoke Complaining',
42
+ 'Magical Enchantment of Arrogance',
43
+ 'Occult Globe of Salad Dressing',
44
+ 'Overwhelming Enchantment of the Chocolate Fairy',
45
+ 'Sorcerous Dandruff Globe',
46
+ 'Spiritual Invocation of the Costumers',
47
+ 'Ultimate Rite of the Confetti Angel',
48
+ 'Ultimate Ritual of Mouthwash',
49
+ ];
50
+ const itemNames = [
51
+ 'Doorknob of Niceness',
52
+ 'Paper Armor of Folding',
53
+ 'Mixtape of Sadness',
54
+ 'Staff of Endless Confetti',
55
+ ];
56
+
57
+ module.exports = {
58
+
59
+ spellList : function(){
60
+ const levels = ['Cantrips (0 Level)', '1st Level', '2nd Level', '3rd Level', '4th Level', '5th Level', '6th Level', '7th Level', '8th Level', '9th Level'];
61
+
62
+ const content = _.map(levels, (level)=>{
63
+ const spells = _.map(_.sampleSize(spellNames, _.random(4, 10)), (spell)=>{
64
+ return `- ${spell}`;
65
+ }).join('\n');
66
+ return `##### ${level} \n${spells} \n`;
67
+ }).join('\n');
68
+
69
+ return `{{spellList,wide\n${content}\n}}`;
70
+ },
71
+
72
+ spell : function(){
73
+ const level = ['1st', '2nd', '3rd', '4th', '5th', '6th', '7th', '8th', '9th'];
74
+ const spellSchools = ['abjuration', 'conjuration', 'divination', 'enchantment', 'evocation', 'illusion', 'necromancy', 'transmutation'];
75
+
76
+
77
+ let components = _.sampleSize(['V', 'S', 'M'], _.random(1, 3)).join(', ');
78
+ if(components.indexOf('M') !== -1){
79
+ components += ` (${_.sampleSize(['a small doll', 'a crushed button worth at least 1cp', 'discarded gum wrapper'], _.random(1, 3)).join(', ')})`;
80
+ }
81
+
82
+ return [
83
+ `#### ${_.sample(spellNames)}`,
84
+ `*${_.sample(level)}-level ${_.sample(spellSchools)}*`,
85
+ '',
86
+ '**Casting Time:** :: 1 action',
87
+ `**Range:** :: ${_.sample(['Self', 'Touch', '30 feet', '60 feet'])}`,
88
+ `**Components:** :: ${components}`,
89
+ `**Duration:** :: ${_.sample(['Until dispelled', '1 round', 'Instantaneous', 'Concentration, up to 10 minutes', '1 hour'])}`,
90
+ '',
91
+ 'A flame, equivalent in brightness to a torch, springs from an object that you touch. ',
92
+ 'The effect look like a regular flame, but it creates no heat and doesn\'t use oxygen. ',
93
+ 'A *continual flame* can be covered or hidden but not smothered or quenched.',
94
+ '\n\n\n'
95
+ ].join('\n');
96
+ },
97
+
98
+ item : function() {
99
+ return [
100
+ `#### ${_.sample(itemNames)}`,
101
+ `*${_.sample(['Wondrous item', 'Armor', 'Weapon'])}, ${_.sample(['Common', 'Uncommon', 'Rare', 'Very Rare', 'Legendary', 'Artifact'])} (requires attunement)*`,
102
+ `:`,
103
+ `This knob is pretty nice. When attached to a door, it allows a user to`,
104
+ `open that door with the strength of the nearest animal. For example, if`,
105
+ `there is a cow nearby, the user will have the "strength of a cow" while`,
106
+ `opening this door.`
107
+ ].join('\n');
108
+ }
109
+ };
dependencies/themes/V3/5ePHB/snippets/monsterblock.gen.js ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ const genList = function(list, max){
5
+ return _.sampleSize(list, _.random(0, max)).join(', ') || 'None';
6
+ };
7
+
8
+ const getMonsterName = function(){
9
+ return _.sample([
10
+ 'All-devouring Baseball Imp',
11
+ 'All-devouring Gumdrop Wraith',
12
+ 'Chocolate Hydra',
13
+ 'Devouring Peacock',
14
+ 'Economy-sized Colossus of the Lemonade Stand',
15
+ 'Ghost Pigeon',
16
+ 'Gibbering Duck',
17
+ 'Sparklemuffin Peacock Spider',
18
+ 'Gum Elemental',
19
+ 'Illiterate Construct of the Candy Store',
20
+ 'Ineffable Chihuahua',
21
+ 'Irritating Death Hamster',
22
+ 'Irritating Gold Mouse',
23
+ 'Juggernaut Snail',
24
+ 'Juggernaut of the Sock Drawer',
25
+ 'Koala of the Cosmos',
26
+ 'Mad Koala of the West',
27
+ 'Milk Djinni of the Lemonade Stand',
28
+ 'Mind Ferret',
29
+ 'Mystic Salt Spider',
30
+ 'Necrotic Halitosis Angel',
31
+ 'Pinstriped Famine Sheep',
32
+ 'Ritalin Leech',
33
+ 'Shocker Kangaroo',
34
+ 'Stellar Tennis Juggernaut',
35
+ 'Wailing Quail of the Sun',
36
+ 'Angel Pigeon',
37
+ 'Anime Sphinx',
38
+ 'Bored Avalanche Sheep of the Wasteland',
39
+ 'Devouring Nougat Sphinx of the Sock Drawer',
40
+ 'Djinni of the Footlocker',
41
+ 'Ectoplasmic Jazz Devil',
42
+ 'Flatuent Angel',
43
+ 'Gelatinous Duck of the Dream-Lands',
44
+ 'Gelatinous Mouse',
45
+ 'Golem of the Footlocker',
46
+ 'Lich Wombat',
47
+ 'Mechanical Sloth of the Past',
48
+ 'Milkshake Succubus',
49
+ 'Puffy Bone Peacock of the East',
50
+ 'Rainbow Manatee',
51
+ 'Rune Parrot',
52
+ 'Sand Cow',
53
+ 'Sinister Vanilla Dragon',
54
+ 'Snail of the North',
55
+ 'Spider of the Sewer',
56
+ 'Stellar Sawdust Leech',
57
+ 'Storm Anteater of Hell',
58
+ 'Stupid Spirit of the Brewery',
59
+ 'Time Kangaroo',
60
+ 'Tomb Poodle',
61
+ ]);
62
+ };
63
+
64
+ const getType = function(){
65
+ return `${_.sample(['Tiny', 'Small', 'Medium', 'Large', 'Gargantuan', 'Stupidly vast'])} ${_.sample(['beast', 'fiend', 'annoyance', 'guy', 'cutie'])}`;
66
+ };
67
+
68
+ const getAlignment = function(){
69
+ return _.sample([
70
+ 'annoying evil',
71
+ 'chaotic gossipy',
72
+ 'chaotic sloppy',
73
+ 'depressed neutral',
74
+ 'lawful bogus',
75
+ 'lawful coy',
76
+ 'manic-depressive evil',
77
+ 'narrow-minded neutral',
78
+ 'neutral annoying',
79
+ 'neutral ignorant',
80
+ 'oedpipal neutral',
81
+ 'silly neutral',
82
+ 'unoriginal neutral',
83
+ 'weird neutral',
84
+ 'wordy evil',
85
+ 'unaligned'
86
+ ]);
87
+ };
88
+
89
+ const getStats = function(){
90
+ return `|${_.times(6, function(){
91
+ const num = _.random(1, 20);
92
+ const mod = Math.ceil(num/2 - 5);
93
+ return `${num} (${mod >= 0 ? `+${mod}` : mod})`;
94
+ }).join('|')}|`;
95
+ };
96
+
97
+ const genAbilities = function(){
98
+ return _.sample([
99
+ '***Pack Tactics.*** These guys work together like peanut butter and jelly.',
100
+ '***Fowl Appearance.*** While the creature remains motionless, it is indistinguishable from a normal chicken.',
101
+ '***Onion Stench.*** Any creatures within 5 feet of this thing develops an irrational craving for onion rings.',
102
+ '***Enormous Nose.*** This creature gains advantage on any check involving putting things in its nose.',
103
+ '***Sassiness.*** When questioned, this creature will talk back instead of answering.',
104
+ '***Big Jerk.*** Whenever this creature makes an attack, it starts telling you how much cooler it is than you.',
105
+ ]);
106
+ };
107
+
108
+ const genLongAbilities = function(){
109
+ return _.sample([
110
+ dedent`***Pack Tactics.*** These guys work together like peanut butter and jelly. Jelly and peanut butter.
111
+
112
+ When one of these guys attacks, the target is covered with, well, peanut butter and jelly.`,
113
+ dedent`***Hangriness.*** This creature is angry, and hungry. It will refuse to do anything with you until its hunger is satisfied.
114
+
115
+ When in visual contact with this creature, you must purchase an extra order of fries, even if they say they aren't hungry.`,
116
+ dedent`***Full of Detergent.*** This creature has swallowed an entire bottle of dish detergent and is actually having a pretty good time.
117
+
118
+ While walking near this creature, you must make a dexterity check or become "a soapy mess" for three hours, after which your skin will get all dry and itchy.`
119
+ ]);
120
+ };
121
+
122
+ const genAction = function(){
123
+ const name = _.sample([
124
+ 'Abdominal Drop',
125
+ 'Airplane Hammer',
126
+ 'Atomic Death Throw',
127
+ 'Bulldog Rake',
128
+ 'Corkscrew Strike',
129
+ 'Crossed Splash',
130
+ 'Crossface Suplex',
131
+ 'DDT Powerbomb',
132
+ 'Dual Cobra Wristlock',
133
+ 'Dual Throw',
134
+ 'Elbow Hold',
135
+ 'Gory Body Sweep',
136
+ 'Heel Jawbreaker',
137
+ 'Jumping Driver',
138
+ 'Open Chin Choke',
139
+ 'Scorpion Flurry',
140
+ 'Somersault Stump Fists',
141
+ 'Suffering Wringer',
142
+ 'Super Hip Submission',
143
+ 'Super Spin',
144
+ 'Team Elbow',
145
+ 'Team Foot',
146
+ 'Tilt-a-whirl Chin Sleeper',
147
+ 'Tilt-a-whirl Eye Takedown',
148
+ 'Turnbuckle Roll'
149
+ ]);
150
+
151
+ return `***${name}.*** *Melee Weapon Attack:* +4 to hit, reach 5ft., one target. *Hit* 5 (1d6 + 2) `;
152
+ };
153
+
154
+
155
+ module.exports = {
156
+
157
+ monster : function(classes, genLines){
158
+ return dedent`
159
+ {{${classes}
160
+ ## ${getMonsterName()}
161
+ *${getType()}, ${getAlignment()}*
162
+ ___
163
+ **Armor Class** :: ${_.random(10, 20)} (chain mail, shield)
164
+ **Hit Points** :: ${_.random(1, 150)}(1d4 + 5)
165
+ **Speed** :: ${_.random(0, 50)}ft.
166
+ ___
167
+ | STR | DEX | CON | INT | WIS | CHA |
168
+ |:-----:|:-----:|:-----:|:-----:|:-----:|:-----:|
169
+ ${getStats()}
170
+ ___
171
+ **Condition Immunities** :: ${genList(['groggy', 'swagged', 'weak-kneed', 'buzzed', 'groovy', 'melancholy', 'drunk'], 3)}
172
+ **Senses** :: darkvision 60 ft., passive Perception ${_.random(3, 20)}
173
+ **Languages** :: ${genList(['Common', 'Pottymouth', 'Gibberish', 'Latin', 'Jive'], 2)}
174
+ **Challenge** :: ${_.random(0, 15)} (${_.random(10, 10000)} XP)
175
+ ___
176
+ ${_.times(_.random(genLines, genLines + 2), function(){return genAbilities();}).join('\n:\n')}
177
+ :
178
+ ${genLongAbilities()}
179
+ ### Actions
180
+ ${_.times(_.random(genLines, genLines + 2), function(){return genAction();}).join('\n:\n')}
181
+ }}
182
+ \n`;
183
+ }
184
+ };
dependencies/themes/V3/5ePHB/snippets/quote.gen.js ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require("lodash");
2
+
3
+ const quotes = [
4
+ "The sword glinted in the dim light, its edges keen and deadly. As the adventurer reached for it, he couldn't help but feel a surge of excitement mixed with fear. This was no ordinary blade.",
5
+ "The dragon's roar shook the ground beneath their feet, and the brave knight stood tall, his sword at the ready. He knew that this would be the battle of his life, but he was determined to emerge victorious.",
6
+ "The wizard's laboratory was a sight to behold, filled with bubbling cauldrons, ancient tomes, and strange artifacts from distant lands. As the apprentice gazed around in wonder, she knew that she was about to embark on a journey unlike any other.",
7
+ "The tavern was packed with rowdy patrons, their voices raised in song and laughter. The bard took center stage, strumming his lute and launching into a tale of adventure and heroism that had the crowd hanging on his every word.",
8
+ "The thief crept through the shadows, his eyes scanning the room for any sign of danger. He knew that one false move could mean the difference between success and failure, and he was determined to come out on top.",
9
+ "The elf queen stood atop her castle walls, surveying the kingdom below with a mix of pride and sadness. She knew that the coming war would be brutal, but she was determined to protect her people at all costs.",
10
+ "The necromancer's tower loomed in the distance, its dark spires piercing the sky. As the adventurers approached, they could feel the chill of death emanating from within",
11
+ "The ranger moved through the forest like a shadow, his senses attuned to every sound and movement around him. He knew that danger lurked behind every tree, but he was ready for whatever came his way.",
12
+ "The paladin knelt before the altar, his hands clasped in prayer. He knew that his faith would be tested in the days ahead, but he was ready to face whatever trials lay in store for him.",
13
+ "The druid communed with the spirits of nature, his mind merging with the trees, the animals, and the very earth itself. He knew that his power came with a great responsibility, and he was determined to use it for the greater good.",
14
+ ];
15
+
16
+ const authors = [
17
+ "Unknown",
18
+ "James Wyatt",
19
+ "Eolande Blackwood",
20
+ "Ragnar Ironheart",
21
+ "Lyra Nightshade",
22
+ "Valtorius Darkstar",
23
+ "Isadora Fireheart",
24
+ "Theron Shadowbane",
25
+ "Lirien Starweaver",
26
+ "Drogathar Bonecrusher",
27
+ "Kaelen Frostblade",
28
+ ];
29
+
30
+ const books = [
31
+ "The Blade of Destiny",
32
+ "Dragonfire and Steel",
33
+ "The Bard's Tale",
34
+ "Darkness Rising",
35
+ "The Sacred Quest",
36
+ "Shadows in the Forest",
37
+ "The Starweaver Chronicles",
38
+ "Beneath the Bones",
39
+ "Moonlit Magic",
40
+ "Frost and Fury",
41
+
42
+ ];
43
+ module.exports = () => {
44
+ return `
45
+ {{quote
46
+ ${_.sample(quotes)}
47
+
48
+ {{attribution ${_.sample(authors)}, *${_.sample(books)}*}}
49
+ }}
50
+ \n`;
51
+ };
dependencies/themes/V3/5ePHB/snippets/script.gen.js ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ module.exports = {
5
+ dwarvish : ()=>{
6
+ return dedent `##### Dwarvish Runes: Sample Alphabet
7
+ {{runeTable,wide,frame,font-family:Davek
8
+ | a | b | c | d | e | f | g | h | i | j | k | l | m |
9
+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
10
+ | a | b | c | d | e | f | g | h | i | j | k | l | m |
11
+ :
12
+ | n | o | p | q | r | s | t | u | v | w | x | y | z |
13
+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
14
+ | n | o | p | q | r | s | t | u | v | w | x | y | z |
15
+ }}\n\n`;
16
+ },
17
+ elvish : ()=>{
18
+ return dedent `##### Elvish Runes: Sample Alphabet
19
+ {{runeTable,wide,frame,font-family:Rellanic
20
+ | a | b | c | d | e | f | g | h | i | j | k | l | m |
21
+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
22
+ | a | b | c | d | e | f | g | h | i | j | k | l | m |
23
+ :
24
+ | n | o | p | q | r | s | t | u | v | w | x | y | z |
25
+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
26
+ | n | o | p | q | r | s | t | u | v | w | x | y | z |
27
+ }}\n\n`;
28
+ },
29
+ draconic : ()=>{
30
+ return dedent `##### Draconic Runes: Sample Alphabet
31
+ {{runeTable,wide,frame,font-family:Iokharic
32
+ | a | b | c | d | e | f | g | h | i | j | k | l | m |
33
+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
34
+ | a | b | c | d | e | f | g | h | i | j | k | l | m |
35
+ :
36
+ | n | o | p | q | r | s | t | u | v | w | x | y | z |
37
+ |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
38
+ | n | o | p | q | r | s | t | u | v | w | x | y | z |
39
+ }}\n\n`;
40
+ }
41
+
42
+
43
+ };
44
+
45
+
46
+ ()=>{
47
+
48
+ };
dependencies/themes/V3/5ePHB/snippets/tableOfContents.gen.js ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ const getTOC = (pages)=>{
5
+ const add1 = (title, page)=>{
6
+ res.push({
7
+ title : title,
8
+ page : page + 1,
9
+ children : []
10
+ });
11
+ };
12
+ const add2 = (title, page)=>{
13
+ if(!_.last(res)) add1(null, page);
14
+ _.last(res).children.push({
15
+ title : title,
16
+ page : page + 1,
17
+ children : []
18
+ });
19
+ };
20
+ const add3 = (title, page)=>{
21
+ if(!_.last(res)) add1(null, page);
22
+ if(!_.last(_.last(res).children)) add2(null, page);
23
+ _.last(_.last(res).children).children.push({
24
+ title : title,
25
+ page : page + 1,
26
+ children : []
27
+ });
28
+ };
29
+
30
+ const res = [];
31
+ _.each(pages, (page, pageNum)=>{
32
+ if(!page.includes("{{frontCover}}") && !page.includes("{{insideCover}}") && !page.includes("{{partCover}}") && !page.includes("{{backCover}}")) {
33
+ const lines = page.split('\n');
34
+ _.each(lines, (line)=>{
35
+ if(_.startsWith(line, '# ')){
36
+ const title = line.replace('# ', '');
37
+ add1(title, pageNum);
38
+ }
39
+ if(_.startsWith(line, '## ')){
40
+ const title = line.replace('## ', '');
41
+ add2(title, pageNum);
42
+ }
43
+ if(_.startsWith(line, '### ')){
44
+ const title = line.replace('### ', '');
45
+ add3(title, pageNum);
46
+ }
47
+ });
48
+ }
49
+ });
50
+ return res;
51
+ };
52
+
53
+ module.exports = function(props){
54
+ const pages = props.brew.text.split('\\page');
55
+ const TOC = getTOC(pages);
56
+ const markdown = _.reduce(TOC, (r, g1, idx1)=>{
57
+ if(g1.title !== null) {
58
+ r.push(`- ### [{{ ${g1.title}}}{{ ${g1.page}}}](#p${g1.page})`);
59
+ }
60
+ if(g1.children.length){
61
+ _.each(g1.children, (g2, idx2)=>{
62
+ if(g2.title !== null) {
63
+ r.push(` - #### [{{ ${g2.title}}}{{ ${g2.page}}}](#p${g2.page})`);
64
+ }
65
+ if(g2.children.length){
66
+ _.each(g2.children, (g3, idx3)=>{
67
+ if(g2.title !== null) {
68
+ r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`);
69
+ } else { // Don't over-indent if no level-2 parent entry
70
+ r.push(` - [{{ ${g3.title}}}{{ ${g3.page}}}](#p${g3.page})`);
71
+ }
72
+ });
73
+ }
74
+ });
75
+ }
76
+ return r;
77
+ }, []).join('\n');
78
+
79
+ return dedent`
80
+ {{toc,wide
81
+ # Table Of Contents
82
+
83
+ ${markdown}
84
+ }}
85
+ \n`;
86
+ };
dependencies/themes/V3/5ePHB/snippets/watercolor.gen.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ module.exports = ()=>{
4
+ return `{{watercolor${_.random(1, 12)},top:20px,left:30px,width:300px,background-color:#BBAD82,opacity:80%}}\n\n`;
5
+ };
dependencies/themes/V3/5ePHB/style.less ADDED
@@ -0,0 +1,942 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @import (less) './themes/fonts/5e/fonts.less';
2
+ @import (less) './themes/assets/assets.less';
3
+ @import (less) './themes/fonts/icon fonts/font-icons.less';
4
+
5
+ :root {
6
+ //Colors
7
+ --HB_Color_Background : #EEE5CE; // Light parchment
8
+ --HB_Color_Accent : #E0E5C1; // Pastel green
9
+ --HB_Color_HeaderUnderline : #C0AD6A; // Gold
10
+ --HB_Color_HorizontalRule : #9C2B1B; // Maroon
11
+ --HB_Color_HeaderText : #58180D; // Dark Maroon
12
+ --HB_Color_MonsterStatBackground : #F2E5B5; // Light orange parchment
13
+ --HB_Color_CaptionText : #766649; // Brown
14
+ --HB_Color_WatercolorStain : #BBAD82; // Light brown
15
+ --HB_Color_Footnotes : #C9AD6A; // Gold
16
+ }
17
+
18
+ .useSansSerif() {
19
+ font-family : 'ScalySansRemake';
20
+ font-size : 0.318cm;
21
+ line-height : 1.2em;
22
+ p,dl,ul,ol { line-height : 1.2em; }
23
+ ul, ol { padding-left : 1em; }
24
+ em { font-style : italic; }
25
+ strong {
26
+ font-weight : 800;
27
+ letter-spacing : -0.02em;
28
+ }
29
+ h5 + * { margin-top : 0.1cm; }
30
+ }
31
+ .useColumns(@multiplier : 1, @fillMode: auto) {
32
+ column-count : 2;
33
+ column-fill : @fillMode;
34
+ column-gap : 0.9cm;
35
+ column-width : 8cm * @multiplier;
36
+ -webkit-column-count : 2;
37
+ -moz-column-count : 2;
38
+ -webkit-column-width : 8cm * @multiplier;
39
+ -moz-column-width : 8cm * @multiplier;
40
+ -webkit-column-gap : 0.9cm;
41
+ -moz-column-gap : 0.9cm;
42
+ }
43
+ .page {
44
+ .useColumns();
45
+ font-family : 'BookInsanityRemake';
46
+ font-size : 0.34cm;
47
+ background-image : @backgroundImage;
48
+ }
49
+ // *****************************
50
+ // * BASE
51
+ // *****************************/
52
+
53
+ .page {
54
+ p {
55
+ line-height : 1.25em;
56
+ & + * { margin-top : 0.325cm; } //TODO: MAKE ALL MARGINS TOP-ONLY. USE * + * STYLE SELECTORS
57
+ & + p { margin-top : 0; }
58
+ }
59
+ ul {
60
+ padding-left : 1.4em;
61
+ margin-bottom : 0.8em;
62
+ line-height : 1.25em;
63
+ }
64
+ ol {
65
+ padding-left : 1.4em;
66
+ margin-bottom : 0.8em;
67
+ line-height : 1.25em;
68
+ }
69
+ //Indents after p or lists
70
+ p + p, ul + p, ol + p { text-indent : 1em; }
71
+ img { z-index : -1; }
72
+ strong {
73
+ font-weight : bold;
74
+ letter-spacing : -0.02em;
75
+ }
76
+ // *****************************
77
+ // * HEADERS
78
+ // *****************************/
79
+ h1,h2,h3,h4 {
80
+ font-family : 'MrEavesRemake';
81
+ color : var(--HB_Color_HeaderText);
82
+ }
83
+ h1 {
84
+ margin-bottom : 0.18cm; //Margin-bottom only because this is WIDE
85
+ column-span : all;
86
+ font-size : 0.89cm;
87
+ line-height : 1em;
88
+ -webkit-column-span : all;
89
+ -moz-column-span : all;
90
+ & + p::first-letter {
91
+ float : left;
92
+ padding-bottom : 2px;
93
+ padding-left : 40px; //Allow background color to extend into margins
94
+ margin-top : -0.3cm;
95
+ margin-bottom : -20px;
96
+ margin-left : -40px;
97
+ font-family : 'SolberaImitationRemake';
98
+ font-size : 3.5cm;
99
+ line-height : 1em;
100
+ color : rgba(0, 0, 0, 0);
101
+ background-image : linear-gradient(-45deg, #322814, #998250, #322814);
102
+ -webkit-background-clip : text;
103
+ background-clip : text;
104
+ }
105
+ & + p::first-line { font-variant : small-caps; }
106
+ }
107
+ h2 {
108
+ //margin-top : 0px; //Font is misaligned. Shift up slightly
109
+ //margin-bottom : 0.05cm;
110
+ font-size : 0.75cm;
111
+ line-height : 0.988em; //Font is misaligned. Shift up slightly
112
+ }
113
+ h3 {
114
+ //margin-top : -0.1cm; //Font is misaligned. Shift up slightly
115
+ //margin-bottom : 0.1cm;
116
+ font-size : 0.575cm;;
117
+ line-height : 0.995em; //Font is misaligned. Shift up slightly
118
+ border-bottom : 2px solid var(--HB_Color_HeaderUnderline);
119
+ & + * { margin-top : 0.17cm; }
120
+ }
121
+ * + h3 {
122
+ margin-top : 0.155cm; //(0.325 - 0.17)
123
+ }
124
+ h4 {
125
+ //margin-top : -0.02cm; //Font is misaligned. Shift up slightly
126
+ //margin-bottom : 0.02cm;
127
+ font-size : 0.458cm;
128
+ line-height : 0.971em; //Font is misaligned. Shift up slightly
129
+ & + * { margin-top : 0.09cm; }
130
+ }
131
+ * + h4 {
132
+ margin-top : 0.235cm; //(0.325 - 0.09)
133
+ }
134
+ h5 {
135
+ //margin-top : -0.02cm; //Font is misaligned. Shift up slightly
136
+ //margin-bottom : 0.02cm;
137
+ font-family : 'ScalySansSmallCapsRemake';
138
+ font-size : 0.423cm;
139
+ line-height : 0.951em; //Font is misaligned. Shift up slightly
140
+ & + * { margin-top : 0.2cm; }
141
+ }
142
+ // *****************************
143
+ // * TABLE
144
+ // *****************************/
145
+ table {
146
+ .useSansSerif();
147
+ line-height : 16px;
148
+ & + * { margin-top : 0.325cm; }
149
+ thead {
150
+ display : table-row-group;
151
+ font-weight : 800;
152
+ th {
153
+ //padding : 0.14em 0.4em;
154
+ padding : 0px 1.5px; // Both of these are temporary, just to force
155
+ vertical-align : bottom;
156
+ //line-height : 16px; // PDF to render at same height until Chrome 108
157
+ }
158
+ }
159
+ tbody {
160
+ tr {
161
+ td {
162
+ //padding : 0.14em 0.4em;
163
+ padding : 0px 1.5px; // Both of these are temporary, just to force
164
+ //line-height : 16px; // PDF to render at same height until Chrome 108
165
+ }
166
+ &:nth-child(odd) { background-color : var(--HB_Color_Accent); }
167
+ }
168
+ }
169
+ }
170
+ // *****************************
171
+ // * QUOTE
172
+ // *****************************/
173
+ .quote {
174
+
175
+ & > p {
176
+ font-style : italic;
177
+ line-height : 0.54cm;
178
+
179
+ &:first-child::first-line {
180
+ font-size : 0.38cm;
181
+ font-style : normal;
182
+ font-variant : small-caps;
183
+ }
184
+ }
185
+
186
+ p + .attribution { margin-top : 0; }
187
+
188
+ .attribution {
189
+ display : block;
190
+ font-style : normal;
191
+ line-height : 0.54cm;
192
+ text-align : right;
193
+
194
+ &::before {
195
+ margin-right : 0.2em;
196
+ content : '---';
197
+ }
198
+ }
199
+
200
+ & + * { margin-top : 0.54cm; }
201
+
202
+ }
203
+
204
+ // *****************************
205
+ // * NOTE
206
+ // *****************************/
207
+ .note {
208
+ .useSansSerif();
209
+ padding : 0.13cm 0.16cm;
210
+ background-color : var(--HB_Color_Accent);
211
+ border-style : solid;
212
+ border-width : 1px;
213
+ border-image : @noteBorderImage 12 stretch;
214
+ border-image-width : 11px;
215
+ border-image-outset : 9px 0px;
216
+ box-shadow : 1px 4px 14px #888888;
217
+ .page :where(&) {
218
+ margin-top : 9px; //Prevent top border getting cut off on colbreak
219
+ }
220
+ & + * { margin-top : 0.45cm; }
221
+ h5 { font-size : 0.375cm; }
222
+ p {
223
+ display : block;
224
+ padding-bottom : 0px;
225
+ }
226
+ :last-child { margin-bottom : 0; }
227
+ }
228
+ // ************************************
229
+ // * DESCRIPTIVE TEXT BOX
230
+ // ************************************/
231
+ .descriptive {
232
+ .useSansSerif();
233
+ padding : 0.1em;
234
+ background-color : #FAF7EA;
235
+ border-style : solid;
236
+ border-width : 7px;
237
+ border-image : @descriptiveBoxImage 12 stretch;
238
+ border-image-outset : 4px;
239
+ box-shadow : 0 0 6px #FAF7EA;
240
+ .page :where(&) {
241
+ margin-top : 4px; //Prevent top border getting cut off on colbreak
242
+ }
243
+ & + * { margin-top : 0.45cm; }
244
+ h5 { font-size : 0.375cm; }
245
+ p {
246
+ display : block;
247
+ padding-bottom : 0px;
248
+ line-height : 1.5em;
249
+ }
250
+ :last-child { margin-bottom : 0; }
251
+ }
252
+ // *****************************
253
+ // * Images Snippets
254
+ // *****************************/
255
+
256
+ /* Arist Credit */
257
+ .artist {
258
+ position : absolute;
259
+ width : auto;
260
+ font-family : 'WalterTurncoat';
261
+ font-size : 0.27cm;
262
+ color : var(--HB_Color_CaptionText);
263
+ text-align : center;
264
+ p, p + p {
265
+ margin : unset;
266
+ line-height : 1em;
267
+ text-indent : unset;
268
+ }
269
+ h5 {
270
+ font-family : 'WalterTurncoat';
271
+ font-size : 1.3em;
272
+ }
273
+ a {
274
+ color : inherit;
275
+ text-decoration : unset;
276
+ &:hover { text-decoration : underline; }
277
+ }
278
+ }
279
+
280
+ /* Watermark */
281
+ .watermark { color : black; }
282
+
283
+ /* Watercolor */
284
+
285
+ .watercolor1 { --wc : @watercolor1; }
286
+ .watercolor2 { --wc : @watercolor2; }
287
+ .watercolor3 { --wc : @watercolor3; }
288
+ .watercolor4 { --wc : @watercolor4; }
289
+ .watercolor5 { --wc : @watercolor5; }
290
+ .watercolor6 { --wc : @watercolor6; }
291
+ .watercolor7 { --wc : @watercolor7; }
292
+ .watercolor8 { --wc : @watercolor8; }
293
+ .watercolor9 { --wc : @watercolor9; }
294
+ .watercolor10 { --wc : @watercolor10; }
295
+ .watercolor11 { --wc : @watercolor11; }
296
+ .watercolor12 { --wc : @watercolor12; }
297
+
298
+ // *****************************
299
+ // * MONSTER STAT BLOCK
300
+ // *****************************/
301
+ .monster {
302
+ .useSansSerif();
303
+ &.frame {
304
+ width : calc(100% + 0.32cm);
305
+ padding : 4px 2px;
306
+ margin-right : -0.16cm;
307
+ margin-left : -0.16cm;
308
+ background-color : var(--HB_Color_MonsterStatBackground);
309
+ background-image : @monsterBlockBackground;
310
+ background-attachment : unset;
311
+ background-blend-mode : overlay;
312
+ border-style : solid;
313
+ border-width : 7px 6px;
314
+ border-image : @monsterBorderImage 14 round;
315
+ border-image-outset : 0px 2px;
316
+ box-shadow : 1px 4px 14px #888888;
317
+ }
318
+
319
+ position : relative;
320
+ padding : 0px;
321
+ margin-bottom : 0.325cm;
322
+
323
+ //Headers
324
+ h2 {
325
+ margin : 0;
326
+ font-size : 0.62cm;
327
+ line-height : 1em;
328
+ & + p {
329
+ margin-bottom : 0;
330
+ font-size : 0.304cm; //Monster size and type subtext
331
+ }
332
+ }
333
+ h3 {
334
+ font-family : 'ScalySansSmallCapsRemake';
335
+ font-size : 0.45cm;
336
+ border-bottom : 1.5px solid var(--HB_Color_HeaderText);
337
+ }
338
+
339
+ //Triangle dividers
340
+ hr {
341
+ height : 6px;
342
+ margin : 0.12cm 0cm;
343
+ visibility : visible;
344
+ background-image : @redTriangleImage;
345
+ background-size : 100% 100%;
346
+ border : none;
347
+ }
348
+
349
+ //Attribute Lists - All text between HRs is red
350
+ hr ~ :is(dl,p) { color : var(--HB_Color_HeaderText); }
351
+ hr:last-of-type {
352
+ & ~ :is(dl,p) {
353
+ color : inherit; // After the HRs, reset text to black
354
+ }
355
+ & + * {
356
+ margin-top : 0.325cm; // Space after last HR
357
+ }
358
+ }
359
+
360
+ // Monster Ability table
361
+ hr + table:first-of-type {
362
+ margin : 0;
363
+ column-span : none;
364
+ color : var(--HB_Color_HeaderText);
365
+ background-color : transparent;
366
+ border-style : none;
367
+ border-image : none;
368
+ -webkit-column-span : none;
369
+ tr { background-color : transparent; }
370
+ td,th { padding : 0px; }
371
+ }
372
+ //indent fix after bulleted lists
373
+ :is(ul,ol) + p { text-indent : 0; }
374
+
375
+ :last-child { margin-bottom : 0; }
376
+ }
377
+
378
+ //Full Width
379
+ .monster.wide {
380
+ .useColumns(0.96, @fillMode: balance);
381
+ }
382
+
383
+ // *****************************
384
+ // * FOOTER
385
+ // *****************************/
386
+ &::after {
387
+ position : absolute;
388
+ bottom : 0px;
389
+ left : 0px;
390
+ z-index : 100;
391
+ width : 100%;
392
+ height : 50px;
393
+ content : '';
394
+ background-image : @footerAccentImage;
395
+ background-size : cover;
396
+ }
397
+ &:nth-child(even) {
398
+ &::after { transform : scaleX(-1); }
399
+ .pageNumber { left : 2px; }
400
+ .footnote {
401
+ left : 80px;
402
+ text-align : left;
403
+ }
404
+ }
405
+ .pageNumber {
406
+ position : absolute;
407
+ right : 2px;
408
+ bottom : 22px;
409
+ width : 50px;
410
+ font-size : 0.9em;
411
+ color : var(--HB_Color_Footnotes);
412
+ text-align : center;
413
+ text-indent : 0;
414
+ &.auto::after { content : counter(phb-page-numbers); }
415
+ }
416
+ .footnote {
417
+ position : absolute;
418
+ right : 80px;
419
+ bottom : 32px;
420
+ z-index : 150;
421
+ width : 200px;
422
+ font-size : 0.8em;
423
+ color : var(--HB_Color_Footnotes);
424
+ text-align : right;
425
+ }
426
+ // ************************************
427
+ // * CODE BLOCKS
428
+ // ************************************/
429
+ code {
430
+ padding : 0px 4px;
431
+ font-size : 0.325cm;
432
+ color : #58180D;
433
+ background-color : #FAF7EA;
434
+ border-radius : 4px;
435
+ }
436
+
437
+ pre code {
438
+ padding : 0.15cm;
439
+ margin-bottom : 2px;
440
+ border-style : solid;
441
+ border-width : 1px;
442
+ border-radius : 12px;
443
+ border-image : @codeBorderImage 26 stretch;
444
+ border-image-width : 10px;
445
+ border-image-outset : 2px;
446
+ .page :where(&) {
447
+ margin-top : 2px; //Prevent top border getting cut off on colbreak
448
+ }
449
+ & + * { margin-top : 0.325cm; }
450
+ }
451
+ // *****************************
452
+ // * EXTRAS
453
+ // *****************************/
454
+ hr {
455
+ margin : 0px;
456
+ visibility : hidden;
457
+ }
458
+ //Text indent right after table
459
+ table + p { text-indent : 1em; }
460
+ // Nested lists
461
+ ul ul,ol ol,ul ol,ol ul {
462
+ margin-bottom : 0px;
463
+ margin-left : 1.5em;
464
+ }
465
+ }
466
+ // *****************************
467
+ // * SPELL LIST
468
+ // *****************************/
469
+ .page .spellList {
470
+ .useSansSerif();
471
+ column-count : 2;
472
+ ul + h5 { margin-top : 15px; }
473
+ p, ul {
474
+ font-size : 0.352cm;
475
+ line-height : 1.265em;
476
+ }
477
+ ul {
478
+ padding-left : 1em;
479
+ margin-bottom : 0.5em;
480
+ text-indent : -1em;
481
+ list-style-type : none;
482
+ -webkit-column-break-inside : auto;
483
+ page-break-inside : auto;
484
+ break-inside : auto;
485
+ }
486
+ &.wide { column-count : 4; }
487
+ }
488
+
489
+ // *****************************
490
+ // * CLASS TABLE
491
+ // *****************************/
492
+ .page .classTable {
493
+ th[colspan]:not([rowspan]) { white-space : nowrap; }
494
+ &.frame {
495
+ width : calc(100% + 0.2cm);
496
+ margin-top : 0.7cm;
497
+ margin-right : -0.1cm;
498
+ margin-bottom : 0.9cm;
499
+ margin-left : -0.1cm;
500
+ border-collapse : separate;
501
+ background-color : white;
502
+ border : initial;
503
+ border-style : solid;
504
+ border-image-source : @frameBorderImage;
505
+ border-image-slice : 200;
506
+ border-image-width : 47px;
507
+ border-image-outset : 0.4cm 0.3cm;
508
+ border-image-repeat : stretch;
509
+ &.wide:first-child { margin-top : 0.12cm; }
510
+ & + * { margin-top : 0; }
511
+ }
512
+ &.decoration { position : relative; }
513
+ &.decoration::before {
514
+ position : absolute;
515
+ top : 50%;
516
+ left : 50%;
517
+ z-index : -1;
518
+ width : 7.75cm;
519
+ height : calc(100% + 3.3cm);
520
+ content : '';
521
+ background-image : @classTableDecoration,
522
+ @classTableDecoration;
523
+ filter : drop-shadow(0px 0px 1px #C8C5C080);
524
+ background-repeat : no-repeat, no-repeat;
525
+ background-position : top, bottom;
526
+ background-size : contain, contain;
527
+ transform : translateY(-50%) translateX(-50%);
528
+ }
529
+ &.decoration.wide::before {
530
+ width : calc(100% + 3.3cm);
531
+ height : 7.75cm;
532
+ background-position : left, right;
533
+ }
534
+ h5 + table { margin-top : 0.2cm; }
535
+ }
536
+ // *****************************
537
+ // * FRONT COVER PAGE
538
+ // *****************************/
539
+ .page:has(.frontCover) {
540
+ columns : 1;
541
+ text-align : center;
542
+ &::after { all : unset; }
543
+ h1 {
544
+ margin-top : 1.2cm;
545
+ margin-bottom : 0;
546
+ font-family : 'NodestoCapsCondensed';
547
+ font-size : 2.245cm;
548
+ font-weight : normal;
549
+ line-height : 0.85em;
550
+ color : white;
551
+ text-shadow : unset;
552
+ text-transform : uppercase;
553
+ filter : drop-shadow(0 0 1.5px black) drop-shadow(0 0 0 black)
554
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)
555
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)
556
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black);
557
+ }
558
+ h2 {
559
+ font-family : 'NodestoCapsCondensed';
560
+ font-size : 0.85cm;
561
+ font-weight : normal;
562
+ color : white;
563
+ letter-spacing : 0.1cm;
564
+ filter : drop-shadow(0 0 1px black) drop-shadow(0 0 0 black)
565
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)
566
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)
567
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black);
568
+ }
569
+ hr {
570
+ position : relative;
571
+ display : block;
572
+ width : 12cm;
573
+ height : 0.5cm;
574
+ margin : auto;
575
+ visibility : visible;
576
+ background-image : @horizontalRule;
577
+ filter : drop-shadow(0 0 3px black);
578
+ background-size : 100% 100%;
579
+ border : none;
580
+ }
581
+ .banner {
582
+ position : absolute;
583
+ bottom : 4.2cm;
584
+ left : 0;
585
+ display : flex;
586
+ flex-direction : column;
587
+ justify-content : center;
588
+ width : 10.5cm;
589
+ height : 1.7cm;
590
+ padding-top : 0.1cm;
591
+ padding-left : 1cm;
592
+ font-family : 'NodestoCapsCondensed';
593
+ font-size : 1cm;
594
+ font-weight : normal;
595
+ color : white;
596
+ text-align : left;
597
+ letter-spacing : 0.014cm;
598
+ background-image : url('/assets/coverPageBanner.svg');
599
+ filter : drop-shadow(2px 2px 2px black);
600
+ }
601
+ .footnote {
602
+ position : absolute;
603
+ right : 0;
604
+ bottom : 1.3cm;
605
+ left : 0;
606
+ width : 70%;
607
+ margin-right : auto;
608
+ margin-left : auto;
609
+ font-family : 'Overpass';
610
+ font-size : 0.496cm;
611
+ color : white;
612
+ text-align : center;
613
+ filter : drop-shadow(0 0 0.7px black) drop-shadow(0 0 0 black)
614
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)
615
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black)
616
+ drop-shadow(0 0 0 black) drop-shadow(0 0 0 black);
617
+ }
618
+ .logo {
619
+ position : absolute;
620
+ top : 0.5cm;
621
+ right : 0;
622
+ left : 0;
623
+ filter : drop-shadow(0 0 0.075cm black);
624
+ img {
625
+ width : 100%;
626
+ height : 2cm;
627
+ }
628
+ }
629
+ }
630
+ // *****************************
631
+ // * INSIDE COVER PAGE
632
+ // *****************************/
633
+ .page:has(.insideCover) {
634
+ columns : 1;
635
+ text-align : center;
636
+ &::after { all : unset; }
637
+ h1 {
638
+ margin-top : 1.2cm;
639
+ margin-bottom : 0;
640
+ font-family : 'NodestoCapsCondensed';
641
+ font-size : 2.1cm;
642
+ font-weight : normal;
643
+ line-height : 0.85em;
644
+ text-transform : uppercase;
645
+ }
646
+ h2 {
647
+ font-family : 'NodestoCapsCondensed';
648
+ font-size : 0.85cm;
649
+ font-weight : normal;
650
+ letter-spacing : 0.5cm;
651
+ }
652
+ hr {
653
+ position : relative;
654
+ display : block;
655
+ width : 12cm;
656
+ height : 0.5cm;
657
+ margin : auto;
658
+ visibility : visible;
659
+ background-image : @horizontalRule;
660
+ background-size : 100% 100%;
661
+ border : none;
662
+ }
663
+ .logo {
664
+ position : absolute;
665
+ right : 0;
666
+ bottom : 1cm;
667
+ left : 0;
668
+ height : 2cm;
669
+ img {
670
+ width : 100%;
671
+ height : 2cm;
672
+ }
673
+ }
674
+ }
675
+ // *****************************
676
+ // * BACK COVER
677
+ // *****************************/
678
+ .page:has(.backCover) {
679
+ padding : 2.25cm 1.3cm 2cm 1.3cm;
680
+ color : #FFFFFF;
681
+ columns : 1;
682
+ &::after { all : unset; }
683
+ .columnWrapper { width : 7.6cm; }
684
+ .backCover {
685
+ position : absolute;
686
+ inset : 0;
687
+ z-index : -1;
688
+ width : 11cm;
689
+ background-image : @backCover;
690
+ background-repeat : no-repeat;
691
+ background-size : contain;
692
+ }
693
+ .blank { height : 1.4em; }
694
+ h1 {
695
+ margin-bottom : 0.3cm;
696
+ font-family : 'NodestoCapsCondensed';
697
+ font-size : 1.35cm;
698
+ line-height : 0.95em;
699
+ color : #ED1C24;
700
+ text-align : center;
701
+ }
702
+ h1 + p::first-line,
703
+ h1 + p::first-letter { all : unset; }
704
+ img {
705
+ position : absolute;
706
+ top : 0px;
707
+ z-index : -2;
708
+ height : 100%;
709
+ }
710
+ hr {
711
+ width : 4.5cm;
712
+ height : 0.53cm;
713
+ margin-top : 1.1cm;
714
+ margin-right : auto;
715
+ margin-left : auto;
716
+ visibility : visible;
717
+ background-image : @horizontalRule;
718
+ background-size : 100% 100%;
719
+ border : none;
720
+ }
721
+ p {
722
+ font-family : 'Overpass';
723
+ font-size : 0.332cm;
724
+ line-height : 1.5em;
725
+ }
726
+ hr + p {
727
+ margin-top : 0.6cm;
728
+ text-align : center;
729
+ }
730
+ .logo {
731
+ position : absolute;
732
+ bottom : 2cm;
733
+ left : 1.2cm;
734
+ z-index : 0;
735
+ width : 7.6cm;
736
+ height : 1.5cm;
737
+ img {
738
+ position : relative;
739
+ z-index : 0;
740
+ width : 100%;
741
+ height : 1.5cm;
742
+ }
743
+ p {
744
+ position : relative;
745
+ width : 100%;
746
+ font-family : 'NodestoCapsWide';
747
+ font-size : 0.4cm;
748
+ line-height : 1em;
749
+ color : #FFFFFF;
750
+ text-align : center;
751
+ text-indent : 0;
752
+ letter-spacing : 0.08em;
753
+ }
754
+ }
755
+ }
756
+
757
+ // *****************************
758
+ // * PART COVER
759
+ // *****************************/
760
+ .page:has(.partCover) {
761
+ padding-top : 0;
762
+ text-align : center;
763
+ columns : 1;
764
+
765
+ .partCover {
766
+ position : absolute;
767
+ top : 0;
768
+ left : 0;
769
+ width : 100%;
770
+ height : 6cm;
771
+ background-image : @partCoverHeaderPHB;
772
+ background-repeat : no-repeat;
773
+ background-size : 100%;
774
+ }
775
+
776
+ h1 {
777
+ position : relative;
778
+ margin-top : 0.4cm;
779
+ font-family : 'NodestoCapsCondensed';
780
+ font-size : 2.3cm;
781
+ text-align : center;
782
+ text-transform : uppercase;
783
+ }
784
+
785
+ h2 {
786
+ position : relative;
787
+ margin-top : -0.7em;
788
+ margin-right : auto;
789
+ margin-left : auto;
790
+ font-family : 'Overpass';
791
+ font-size : 0.45cm;
792
+ line-height : 1.1em;
793
+ }
794
+ }
795
+
796
+ // *****************************
797
+ // * TABLE OF CONTENTS
798
+ // *****************************/
799
+ .page {
800
+ &:has(.toc)::after { display : none; }
801
+ .toc {
802
+ -webkit-column-break-inside : avoid;
803
+ page-break-inside : avoid;
804
+ break-inside : avoid;
805
+ h1 {
806
+ margin-bottom : 0.3cm;
807
+ text-align : center;
808
+ }
809
+ a {
810
+ display : inline;
811
+ color : inherit;
812
+ text-decoration : none;
813
+ &:hover { text-decoration : underline; }
814
+ }
815
+ h4 {
816
+ margin-top : 0.2cm;
817
+ line-height : 0.4cm;
818
+ & + ul li { line-height : 1.2em; }
819
+ }
820
+ ul {
821
+ padding-left : 0;
822
+ margin-top : 0;
823
+ list-style-type : none;
824
+ a {
825
+ display : flex;
826
+ flex-flow : row nowrap;
827
+ justify-content : space-between;
828
+ width : 100%;
829
+ }
830
+ li + li h3 {
831
+ margin-top : 0.26cm;
832
+ line-height : 1em;
833
+ }
834
+ h3 span:first-child::after { border : none; }
835
+ span {
836
+ display : contents;
837
+ &:first-child::after {
838
+ bottom : 0.08cm;
839
+ flex : 1;
840
+ margin-right : 0.16cm;
841
+ margin-bottom : 0.08cm;
842
+ margin-left : 0.08cm; /* Spacing before dot leaders */
843
+ content : '';
844
+ border-bottom : 0.05cm dotted #000000;
845
+ }
846
+ &:last-child {
847
+ display : inline-block;
848
+ align-self : flex-end;
849
+ font-family : 'BookInsanityRemake';
850
+ font-size : 0.34cm;
851
+ font-weight : normal;
852
+ color : #000000;
853
+ }
854
+ }
855
+ ul { /* List indent */
856
+ margin-left : 1em;
857
+ }
858
+ }
859
+ &.wide {
860
+ .useColumns(0.96, @fillMode: balance);
861
+ }
862
+ }
863
+ }
864
+
865
+ // *****************************
866
+ // * DEFINITION LISTS
867
+ // *****************************/
868
+ .page {
869
+ dl {
870
+ line-height : 1.25em;
871
+ & + * { margin-top : 0.17cm; }
872
+ }
873
+ p + dl { margin-top : 0.17cm; }
874
+ dt {
875
+ margin-right : 5px;
876
+ margin-left : -1em;
877
+ }
878
+ }
879
+
880
+ // *****************************
881
+ // * WIDE
882
+ // *****************************/
883
+ .page .wide { margin-bottom : 0.325cm; }
884
+
885
+ .page h1 + * { margin-top : 0; }
886
+
887
+ //*****************************
888
+ // * RUNE TABLE
889
+ // *****************************/
890
+ .page {
891
+ .runeTable {
892
+ margin-block : 0.7cm;
893
+ table {
894
+ font-family : inherit;
895
+ tbody tr { background : unset; }
896
+ th, td {
897
+ width : 1.3cm;
898
+ height : 1.3cm;
899
+ font-weight : normal;
900
+ text-transform : uppercase;
901
+ vertical-align : middle;
902
+ outline : 1px solid #000000;
903
+ }
904
+ th {
905
+ font-family : 'BookInsanityRemake';
906
+ font-size : 0.45cm;
907
+ }
908
+ td { font-size : 0.7cm; }
909
+ }
910
+
911
+ &.frame {
912
+ border : initial;
913
+ border-style : solid;
914
+ border-image-source : @scriptBorder;
915
+ border-image-slice : 170;
916
+ border-image-width : 1.4cm;
917
+ border-image-outset : 0.45cm 0.35cm 0.4cm 0.4cm;
918
+ border-image-repeat : stretch;
919
+ }
920
+ }
921
+ }
922
+ // *****************************
923
+ // * INDEX
924
+ // *****************************/
925
+ .page {
926
+ .index {
927
+ font-size : 0.218cm;
928
+
929
+ ul ul { margin : 0; }
930
+
931
+ ul {
932
+ padding-left : 0;
933
+ text-indent : 0;
934
+ list-style-type : none;
935
+ }
936
+
937
+ & > ul > li {
938
+ padding-left : 1.5em;
939
+ text-indent : -1.5em;
940
+ }
941
+ }
942
+ }
dependencies/themes/V3/Blank/dropdownPreview.png ADDED

Git LFS Details

  • SHA256: 0b4faf94b42a2a8e046a32cd34bff62fceeb3ac2dd024e835472b0bd82b066cd
  • Pointer size: 131 Bytes
  • Size of remote file: 142 kB
dependencies/themes/V3/Blank/dropdownTexture.png ADDED

Git LFS Details

  • SHA256: 1fb22c87f97f12a55195d8986c5ad97914fc7d9197a7f23b52a1198fe8b1aef0
  • Pointer size: 128 Bytes
  • Size of remote file: 236 Bytes
dependencies/themes/V3/Blank/settings.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "name" : "Blank",
3
+ "renderer" : "V3",
4
+ "baseTheme" : false,
5
+ "baseSnippets" : false
6
+ }
dependencies/themes/V3/Blank/snippets.js ADDED
@@ -0,0 +1,444 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* eslint-disable max-lines */
2
+
3
+ const WatercolorGen = require('./snippets/watercolor.gen.js');
4
+ const ImageMaskGen = require('./snippets/imageMask.gen.js');
5
+ const FooterGen = require('./snippets/footer.gen.js');
6
+ const dedent = require('dedent-tabs').default;
7
+
8
+ module.exports = [
9
+
10
+ {
11
+ groupName : 'Text Editor',
12
+ icon : 'fas fa-pencil-alt',
13
+ view : 'text',
14
+ snippets : [
15
+ {
16
+ name : 'Column Break',
17
+ icon : 'fas fa-columns',
18
+ gen : '\n\\column\n'
19
+ },
20
+ {
21
+ name : 'New Page',
22
+ icon : 'fas fa-file-alt',
23
+ gen : '\n\\page\n'
24
+ },
25
+ {
26
+ name : 'Page Number',
27
+ icon : 'fas fa-bookmark',
28
+ gen : '{{pageNumber 1}}\n'
29
+ },
30
+ {
31
+ name : 'Auto-incrementing Page Number',
32
+ icon : 'fas fa-sort-numeric-down',
33
+ gen : '{{pageNumber,auto}}\n'
34
+ },
35
+ {
36
+ name : 'Footer',
37
+ icon : 'fas fa-shoe-prints',
38
+ gen : FooterGen.createFooterFunc(),
39
+ subsnippets : [
40
+ {
41
+ name : 'Footer from H1',
42
+ icon : 'fas fa-dice-one',
43
+ gen : FooterGen.createFooterFunc(1)
44
+ },
45
+ {
46
+ name : 'Footer from H2',
47
+ icon : 'fas fa-dice-two',
48
+ gen : FooterGen.createFooterFunc(2)
49
+ },
50
+ {
51
+ name : 'Footer from H3',
52
+ icon : 'fas fa-dice-three',
53
+ gen : FooterGen.createFooterFunc(3)
54
+ },
55
+ {
56
+ name : 'Footer from H4',
57
+ icon : 'fas fa-dice-four',
58
+ gen : FooterGen.createFooterFunc(4)
59
+ },
60
+ {
61
+ name : 'Footer from H5',
62
+ icon : 'fas fa-dice-five',
63
+ gen : FooterGen.createFooterFunc(5)
64
+ },
65
+ {
66
+ name : 'Footer from H6',
67
+ icon : 'fas fa-dice-six',
68
+ gen : FooterGen.createFooterFunc(6)
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ name : 'Vertical Spacing',
74
+ icon : 'fas fa-arrows-alt-v',
75
+ gen : '\n::::\n'
76
+ },
77
+ {
78
+ name : 'Horizontal Spacing',
79
+ icon : 'fas fa-arrows-alt-h',
80
+ gen : ' {{width:100px}} '
81
+ },
82
+ {
83
+ name : 'Wide Block',
84
+ icon : 'fas fa-window-maximize',
85
+ gen : dedent`\n
86
+ {{wide
87
+ Everything in here will be extra wide. Tables, text, everything!
88
+ Beware though, CSS columns can behave a bit weird sometimes. You may
89
+ have to manually place column breaks with \`\column\` to make the
90
+ surrounding text flow with this wide block the way you want.
91
+ }}
92
+ \n`
93
+ },
94
+ {
95
+ name : 'QR Code',
96
+ icon : 'fas fa-qrcode',
97
+ gen : (brew)=>{
98
+ return `![]` +
99
+ `(https://api.qrserver.com/v1/create-qr-code/?data=` +
100
+ `https://homebrewery.naturalcrit.com${brew.shareId ? `/share/${brew.shareId}` : ''}` +
101
+ `&amp;size=100x100) {width:100px;mix-blend-mode:multiply}`;
102
+ }
103
+ },
104
+ {
105
+ name : 'Link to page',
106
+ icon : 'fas fa-link',
107
+ gen : '[Click here](#p3) to go to page 3\n'
108
+ },
109
+ {
110
+ name : 'Add Comment',
111
+ icon : 'fas fa-code',
112
+ gen : '<!-- This is a comment that will not be rendered into your brew. Hotkey (Ctrl/Cmd + /). -->'
113
+ },
114
+ {
115
+ name : 'Homebrewery Credit',
116
+ icon : 'fas fa-dice-d20',
117
+ gen : function(){
118
+ return dedent`
119
+ {{homebreweryCredits
120
+ Made With
121
+
122
+ {{homebreweryIcon}}
123
+
124
+ The Homebrewery
125
+ [Homebrewery.Naturalcrit.com](https://homebrewery.naturalcrit.com)
126
+ }}\n\n`;
127
+ },
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ groupName : 'Style Editor',
133
+ icon : 'fas fa-pencil-alt',
134
+ view : 'style',
135
+ snippets : [
136
+ {
137
+ name : 'Add Comment',
138
+ icon : 'fas fa-code',
139
+ gen : '/* This is a comment that will not be rendered into your brew. */'
140
+ },
141
+ ]
142
+ },
143
+
144
+ /*********************** IMAGES *******************/
145
+ {
146
+ groupName : 'Images',
147
+ icon : 'fas fa-images',
148
+ view : 'text',
149
+ snippets : [
150
+ {
151
+ name : 'Image',
152
+ icon : 'fas fa-image',
153
+ gen : dedent`
154
+ ![cat warrior](https://s-media-cache-ak0.pinimg.com/736x/4a/81/79/4a8179462cfdf39054a418efd4cb743e.jpg) {width:325px,mix-blend-mode:multiply}`
155
+ },
156
+ {
157
+ name : 'Background Image',
158
+ icon : 'fas fa-tree',
159
+ gen : dedent`
160
+ ![homebrew mug](http://i.imgur.com/hMna6G0.png) {position:absolute,top:50px,right:30px,width:280px}`
161
+ },
162
+ {
163
+ name : 'Watercolor Splatter',
164
+ icon : 'fas fa-fill-drip',
165
+ gen : WatercolorGen,
166
+ },
167
+ {
168
+ name : 'Watercolor Center',
169
+ icon : 'fac mask-center',
170
+ gen : ImageMaskGen.center,
171
+ experimental : true,
172
+ },
173
+ {
174
+ name : 'Watercolor Edge',
175
+ icon : 'fac mask-edge',
176
+ gen : ImageMaskGen.edge('bottom'),
177
+ experimental : true,
178
+ subsnippets : [
179
+ {
180
+ name : 'Top',
181
+ icon : 'fac position-top',
182
+ gen : ImageMaskGen.edge('top'),
183
+ },
184
+ {
185
+ name : 'Right',
186
+ icon : 'fac position-right',
187
+ gen : ImageMaskGen.edge('right'),
188
+ },
189
+ {
190
+ name : 'Bottom',
191
+ icon : 'fac position-bottom',
192
+ gen : ImageMaskGen.edge('bottom'),
193
+ },
194
+ {
195
+ name : 'Left',
196
+ icon : 'fac position-left',
197
+ gen : ImageMaskGen.edge('left'),
198
+ },
199
+ ]
200
+ },
201
+ {
202
+ name : 'Watercolor Corner',
203
+ icon : 'fac mask-corner',
204
+ gen : ImageMaskGen.corner,
205
+ experimental : true,
206
+ subsnippets : [
207
+ {
208
+ name : 'Top-Left',
209
+ icon : 'fac position-top-left',
210
+ gen : ImageMaskGen.corner('top', 'left'),
211
+ },
212
+ {
213
+ name : 'Top-Right',
214
+ icon : 'fac position-top-right',
215
+ gen : ImageMaskGen.corner('top', 'right'),
216
+ },
217
+ {
218
+ name : 'Bottom-Left',
219
+ icon : 'fac position-bottom-left',
220
+ gen : ImageMaskGen.corner('bottom', 'left'),
221
+ },
222
+ {
223
+ name : 'Bottom-Right',
224
+ icon : 'fac position-bottom-right',
225
+ gen : ImageMaskGen.corner('bottom', 'right'),
226
+ }
227
+ ]
228
+ },
229
+ {
230
+ name : 'Watermark',
231
+ icon : 'fas fa-id-card',
232
+ gen : dedent`
233
+ {{watermark Homebrewery}}\n`
234
+ },
235
+ ]
236
+ },
237
+
238
+ /********************* TABLES *********************/
239
+
240
+ {
241
+ groupName : 'Tables',
242
+ icon : 'fas fa-table',
243
+ view : 'text',
244
+ snippets : [
245
+ {
246
+ name : 'Table',
247
+ icon : 'fas fa-th-list',
248
+ gen : function(){
249
+ return dedent`
250
+ ##### Character Advancement
251
+ | Experience Points | Level | Proficiency Bonus |
252
+ |:------------------|:-----:|:-----------------:|
253
+ | 0 | 1 | +2 |
254
+ | 300 | 2 | +2 |
255
+ | 900 | 3 | +2 |
256
+ | 2,700 | 4 | +2 |
257
+ | 6,500 | 5 | +3 |
258
+ | 14,000 | 6 | +3 |
259
+ \n`;
260
+ }
261
+ },
262
+ {
263
+ name : 'Wide Table',
264
+ icon : 'fas fa-list',
265
+ gen : function(){
266
+ return dedent`
267
+ {{wide
268
+ ##### Weapons
269
+ | Name | Cost | Damage | Weight | Properties |
270
+ |:------------------------|:-----:|:----------------|--------:|:-----------|
271
+ | *Simple Melee Weapons* | | | | |
272
+ | &emsp; Club | 1 sp | 1d4 bludgeoning | 2 lb. | Light |
273
+ | &emsp; Dagger | 2 gp | 1d4 piercing | 1 lb. | Finesse |
274
+ | &emsp; Spear | 1 gp | 1d6 piercing | 3 lb. | Thrown |
275
+ | *Simple Ranged Weapons* | | | | |
276
+ | &emsp; Dart | 5 cp | 1d4 piercig | 1/4 lb. | Finesse |
277
+ | &emsp; Shortbow | 25 gp | 1d6 piercing | 2 lb. | Ammunition |
278
+ | &emsp; Sling | 1 sp | 1d4 bludgeoning | &mdash; | Ammunition |
279
+ }}
280
+ \n`;
281
+ }
282
+ },
283
+ {
284
+ name : 'Split Table',
285
+ icon : 'fas fa-th-large',
286
+ gen : function(){
287
+ return dedent`
288
+ ##### Typical Difficulty Classes
289
+ {{column-count:2
290
+ | Task Difficulty | DC |
291
+ |:----------------|:--:|
292
+ | Very easy | 5 |
293
+ | Easy | 10 |
294
+ | Medium | 15 |
295
+
296
+ | Task Difficulty | DC |
297
+ |:------------------|:--:|
298
+ | Hard | 20 |
299
+ | Very hard | 25 |
300
+ | Nearly impossible | 30 |
301
+ }}
302
+ \n`;
303
+ }
304
+ }
305
+ ]
306
+ },
307
+ /**************** FONTS *************/
308
+ {
309
+ groupName : 'Fonts',
310
+ icon : 'fas fa-keyboard',
311
+ view : 'text',
312
+ snippets : [
313
+ {
314
+ name : 'Open Sans',
315
+ icon : 'font OpenSans',
316
+ gen : dedent`{{font-family:OpenSans Dummy Text}}`
317
+ },
318
+ {
319
+ name : 'Code Bold',
320
+ icon : 'font CodeBold',
321
+ gen : dedent`{{font-family:CodeBold Dummy Text}}`
322
+ },
323
+ {
324
+ name : 'Code Light',
325
+ icon : 'font CodeLight',
326
+ gen : dedent`{{font-family:CodeLight Dummy Text}}`
327
+ },
328
+ {
329
+ name : 'Scaly Sans Remake',
330
+ icon : 'font ScalySansRemake',
331
+ gen : dedent`{{font-family:ScalySansRemake Dummy Text}}`
332
+ },
333
+ {
334
+ name : 'Book Insanity Remake',
335
+ icon : 'font BookInsanityRemake',
336
+ gen : dedent`{{font-family:BookInsanityRemake Dummy Text}}`
337
+ },
338
+ {
339
+ name : 'Mr Eaves Remake',
340
+ icon : 'font MrEavesRemake',
341
+ gen : dedent`{{font-family:MrEavesRemake Dummy Text}}`
342
+ },
343
+ {
344
+ name: 'Solbera Imitation Remake',
345
+ icon: 'font SolberaImitationRemake',
346
+ gen: dedent`{{font-family:SolberaImitationRemake Dummy Text}}`
347
+ },
348
+ {
349
+ name: 'Scaly Sans Small Caps Remake',
350
+ icon: 'font ScalySansSmallCapsRemake',
351
+ gen: dedent`{{font-family:ScalySansSmallCapsRemake Dummy Text}}`
352
+ },
353
+ {
354
+ name: 'Walter Turncoat',
355
+ icon: 'font WalterTurncoat',
356
+ gen: dedent`{{font-family:WalterTurncoat Dummy Text}}`
357
+ },
358
+ {
359
+ name: 'Lato',
360
+ icon: 'font Lato',
361
+ gen: dedent`{{font-family:Lato Dummy Text}}`
362
+ },
363
+ {
364
+ name: 'Courier',
365
+ icon: 'font Courier',
366
+ gen: dedent`{{font-family:Courier Dummy Text}}`
367
+ },
368
+ {
369
+ name: 'Nodesto Caps Condensed',
370
+ icon: 'font NodestoCapsCondensed',
371
+ gen: dedent`{{font-family:NodestoCapsCondensed Dummy Text}}`
372
+ },
373
+ {
374
+ name: 'Overpass',
375
+ icon: 'font Overpass',
376
+ gen: dedent`{{font-family:Overpass Dummy Text}}`
377
+ },
378
+ {
379
+ name: 'Davek',
380
+ icon: 'font Davek',
381
+ gen: dedent`{{font-family:Davek Dummy Text}}`
382
+ },
383
+ {
384
+ name: 'Iokharic',
385
+ icon: 'font Iokharic',
386
+ gen: dedent`{{font-family:Iokharic Dummy Text}}`
387
+ },
388
+ {
389
+ name: 'Rellanic',
390
+ icon: 'font Rellanic',
391
+ gen: dedent`{{font-family:Rellanic Dummy Text}}`
392
+ },
393
+ {
394
+ name: 'Times New Roman',
395
+ icon: 'font TimesNewRoman',
396
+ gen: dedent`{{font-family:"Times New Roman" Dummy Text}}`
397
+ }
398
+ ]
399
+ },
400
+
401
+ /**************** PAGE *************/
402
+
403
+ {
404
+ groupName : 'Print',
405
+ icon : 'fas fa-print',
406
+ view : 'style',
407
+ snippets : [
408
+ {
409
+ name : 'A4 Page Size',
410
+ icon : 'far fa-file',
411
+ gen : dedent`/* A4 Page Size */
412
+ .page{
413
+ width : 210mm;
414
+ height : 296.8mm;
415
+ }\n\n`
416
+ },
417
+ {
418
+ name : 'Square Page Size',
419
+ icon : 'far fa-file',
420
+ gen : dedent`/* Square Page Size */
421
+ .page {
422
+ width : 125mm;
423
+ height : 125mm;
424
+ padding : 12.5mm;
425
+ columns : unset;
426
+ }\n\n`
427
+ },
428
+ {
429
+ name : 'Ink Friendly',
430
+ icon : 'fas fa-tint',
431
+ gen : dedent`
432
+ /* Ink Friendly */
433
+ *:is(.page) {
434
+ background : white !important;
435
+ filter : drop-shadow(0px 0px 3px #888) !important;
436
+ }
437
+
438
+ .page img {
439
+ visibility : hidden;
440
+ }\n\n`
441
+ },
442
+ ]
443
+ }
444
+ ];
dependencies/themes/V3/Blank/snippets/footer.gen.js ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const Markdown = require('../../../../shared/naturalcrit/markdown.js');
2
+
3
+ module.exports = {
4
+ createFooterFunc : function(headerSize=1){
5
+ return (props)=>{
6
+ const cursorPos = props.cursorPos;
7
+
8
+ const markdownText = props.brew.text.split('\n').slice(0, cursorPos.line).join('\n');
9
+ const markdownTokens = Markdown.marked.lexer(markdownText);
10
+ const headerToken = markdownTokens.findLast((lexerToken)=>{ return lexerToken.type === 'heading' && lexerToken.depth === headerSize; });
11
+ const headerText = headerToken?.tokens.map((token)=>{ return token.text; }).join('');
12
+ const outputText = headerText || 'PART 1 | SECTION NAME';
13
+
14
+ return `\n{{footnote ${outputText}}}\n`;
15
+ };
16
+ }
17
+ };
dependencies/themes/V3/Blank/snippets/imageMask.gen.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+ const dedent = require('dedent-tabs').default;
3
+
4
+ module.exports = {
5
+ center : ()=>{
6
+ return dedent`
7
+ {{imageMaskCenter${_.random(1, 16)},--offsetX:0%,--offsetY:0%,--rotation:0
8
+ ![](https://i.imgur.com/GZfjDWV.png){height:100%}
9
+ }}
10
+ <!-- Use --offsetX to shift the mask left or right (can use cm instead of %)
11
+ Use --offsetY to shift the mask up or down
12
+ Use --rotation to set rotation angle in degrees. -->\n\n`;
13
+ },
14
+
15
+ edge : (side = 'bottom')=>{
16
+ const rotation = {
17
+ 'bottom' : 0,
18
+ 'top' : 180,
19
+ 'left' : 90,
20
+ 'right' : 270
21
+ }[side];
22
+ return dedent`
23
+ {{imageMaskEdge${_.random(1, 8)},--offset:0%,--rotation:${rotation}
24
+ ![](https://i.imgur.com/GZfjDWV.png){height:100%}
25
+ }}
26
+ <!-- Use --offset to shift the mask away from page center (can use cm instead of %)
27
+ Use --rotation to set rotation angle in degrees. -->\n\n`;
28
+ },
29
+
30
+ corner : (y = 'top', x = 'left')=>{
31
+ const offsetX = (x == 'left' ? '-50%' : '50%');
32
+ const offsetY = (y == 'top' ? '50%' : '-50%');
33
+ return dedent`
34
+ {{imageMaskCorner${_.random(1, 37)},--offsetX:${offsetX},--offsetY:${offsetY},--rotation:0
35
+ ![](https://i.imgur.com/GZfjDWV.png){height:100%}
36
+ }}
37
+ <!-- Use --offsetX to shift the mask left or right (can use cm instead of %)
38
+ Use --offsetY to shift the mask up or down
39
+ Use --rotation to set rotation angle in degrees. -->\n\n`;
40
+ }
41
+
42
+ };
43
+
44
+ ()=>{
45
+
46
+ };
dependencies/themes/V3/Blank/snippets/watercolor.gen.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ const _ = require('lodash');
2
+
3
+ module.exports = ()=>{
4
+ return `{{watercolor${_.random(1, 12)},top:20px,left:30px,width:300px,background-color:#BBAD82,opacity:80%}}\n\n`;
5
+ };