diff --git a/assets/chat/csq-strip-long.png b/assets/chat/csq-strip-long.png new file mode 100644 index 00000000..8fd0b405 Binary files /dev/null and b/assets/chat/csq-strip-long.png differ diff --git a/assets/chat/csq-strip.png b/assets/chat/csq-strip.png new file mode 100644 index 00000000..ac929137 Binary files /dev/null and b/assets/chat/csq-strip.png differ diff --git a/assets/fonts/Beaufort/Beaufort B.otf b/assets/fonts/Beaufort/Beaufort B.otf new file mode 100644 index 00000000..fc65f62d Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort B.otf differ diff --git a/assets/fonts/Beaufort/Beaufort Bi.otf b/assets/fonts/Beaufort/Beaufort Bi.otf new file mode 100644 index 00000000..4780d4eb Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort Bi.otf differ diff --git a/assets/fonts/Beaufort/Beaufort L.otf b/assets/fonts/Beaufort/Beaufort L.otf new file mode 100644 index 00000000..93abecaf Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort L.otf differ diff --git a/assets/fonts/Beaufort/Beaufort Li.otf b/assets/fonts/Beaufort/Beaufort Li.otf new file mode 100644 index 00000000..1096cf3b Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort Li.otf differ diff --git a/assets/fonts/Beaufort/Beaufort M.otf b/assets/fonts/Beaufort/Beaufort M.otf new file mode 100644 index 00000000..200fd9dc Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort M.otf differ diff --git a/assets/fonts/Beaufort/Beaufort Mi.otf b/assets/fonts/Beaufort/Beaufort Mi.otf new file mode 100644 index 00000000..751b397f Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort Mi.otf differ diff --git a/assets/fonts/Beaufort/Beaufort S.otf b/assets/fonts/Beaufort/Beaufort S.otf new file mode 100644 index 00000000..b478440b Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort S.otf differ diff --git a/assets/fonts/Beaufort/Beaufort Si.otf b/assets/fonts/Beaufort/Beaufort Si.otf new file mode 100644 index 00000000..3243f06c Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort Si.otf differ diff --git a/assets/fonts/Beaufort/Beaufort i.otf b/assets/fonts/Beaufort/Beaufort i.otf new file mode 100644 index 00000000..73257c4c Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort i.otf differ diff --git a/assets/fonts/Beaufort/Beaufort.otf b/assets/fonts/Beaufort/Beaufort.otf new file mode 100644 index 00000000..fdba0e21 Binary files /dev/null and b/assets/fonts/Beaufort/Beaufort.otf differ diff --git a/assets/fonts/Spiegel/Spiegel B.otf b/assets/fonts/Spiegel/Spiegel B.otf new file mode 100644 index 00000000..eaac72bf Binary files /dev/null and b/assets/fonts/Spiegel/Spiegel B.otf differ diff --git a/assets/fonts/Spiegel/Spiegel Bi.otf b/assets/fonts/Spiegel/Spiegel Bi.otf new file mode 100644 index 00000000..0e7af576 Binary files /dev/null and b/assets/fonts/Spiegel/Spiegel Bi.otf differ diff --git a/assets/fonts/Spiegel/Spiegel S.otf b/assets/fonts/Spiegel/Spiegel S.otf new file mode 100644 index 00000000..082dcb21 Binary files /dev/null and b/assets/fonts/Spiegel/Spiegel S.otf differ diff --git a/assets/fonts/Spiegel/Spiegel Si.otf b/assets/fonts/Spiegel/Spiegel Si.otf new file mode 100644 index 00000000..27b652fe Binary files /dev/null and b/assets/fonts/Spiegel/Spiegel Si.otf differ diff --git a/assets/fonts/Spiegel/Spiegel i.otf b/assets/fonts/Spiegel/Spiegel i.otf new file mode 100644 index 00000000..516392a1 Binary files /dev/null and b/assets/fonts/Spiegel/Spiegel i.otf differ diff --git a/assets/fonts/Spiegel/Spiegel.otf b/assets/fonts/Spiegel/Spiegel.otf new file mode 100644 index 00000000..ef5c2b9b Binary files /dev/null and b/assets/fonts/Spiegel/Spiegel.otf differ diff --git a/assets/icons/consequence-icons/accept-complication-major.svg b/assets/icons/consequence-icons/accept-complication-major.svg new file mode 100644 index 00000000..f6149a73 --- /dev/null +++ b/assets/icons/consequence-icons/accept-complication-major.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-complication-minor.svg b/assets/icons/consequence-icons/accept-complication-minor.svg new file mode 100644 index 00000000..c2956890 --- /dev/null +++ b/assets/icons/consequence-icons/accept-complication-minor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-complication-severe.svg b/assets/icons/consequence-icons/accept-complication-severe.svg new file mode 100644 index 00000000..d23af841 --- /dev/null +++ b/assets/icons/consequence-icons/accept-complication-severe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-insight-1.svg b/assets/icons/consequence-icons/accept-harm-insight-1.svg new file mode 100644 index 00000000..621cf47c --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-insight-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-insight-2.svg b/assets/icons/consequence-icons/accept-harm-insight-2.svg new file mode 100644 index 00000000..7c9084e3 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-insight-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-insight-3.svg b/assets/icons/consequence-icons/accept-harm-insight-3.svg new file mode 100644 index 00000000..94906c01 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-insight-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-insight-4.svg b/assets/icons/consequence-icons/accept-harm-insight-4.svg new file mode 100644 index 00000000..a3ba0618 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-insight-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-prowess-1.svg b/assets/icons/consequence-icons/accept-harm-prowess-1.svg new file mode 100644 index 00000000..91bb1c66 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-prowess-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-prowess-2.svg b/assets/icons/consequence-icons/accept-harm-prowess-2.svg new file mode 100644 index 00000000..ed442d94 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-prowess-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-prowess-3.svg b/assets/icons/consequence-icons/accept-harm-prowess-3.svg new file mode 100644 index 00000000..08260892 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-prowess-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-prowess-4.svg b/assets/icons/consequence-icons/accept-harm-prowess-4.svg new file mode 100644 index 00000000..d5535475 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-prowess-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-resolve-1.svg b/assets/icons/consequence-icons/accept-harm-resolve-1.svg new file mode 100644 index 00000000..49f8485a --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-resolve-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-resolve-2.svg b/assets/icons/consequence-icons/accept-harm-resolve-2.svg new file mode 100644 index 00000000..e118d451 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-resolve-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-resolve-3.svg b/assets/icons/consequence-icons/accept-harm-resolve-3.svg new file mode 100644 index 00000000..cde11332 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-resolve-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-harm-resolve-4.svg b/assets/icons/consequence-icons/accept-harm-resolve-4.svg new file mode 100644 index 00000000..2d6b3cd6 --- /dev/null +++ b/assets/icons/consequence-icons/accept-harm-resolve-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-lost-opportunity.svg b/assets/icons/consequence-icons/accept-lost-opportunity.svg new file mode 100644 index 00000000..a6e68f88 --- /dev/null +++ b/assets/icons/consequence-icons/accept-lost-opportunity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-reduced-effect.svg b/assets/icons/consequence-icons/accept-reduced-effect.svg new file mode 100644 index 00000000..79193427 --- /dev/null +++ b/assets/icons/consequence-icons/accept-reduced-effect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/accept-worse-position.svg b/assets/icons/consequence-icons/accept-worse-position.svg new file mode 100644 index 00000000..d6b1b79d --- /dev/null +++ b/assets/icons/consequence-icons/accept-worse-position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-complication-major.svg b/assets/icons/consequence-icons/base-complication-major.svg new file mode 100644 index 00000000..6cfb9a00 --- /dev/null +++ b/assets/icons/consequence-icons/base-complication-major.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-complication-minor.svg b/assets/icons/consequence-icons/base-complication-minor.svg new file mode 100644 index 00000000..df5b4f82 --- /dev/null +++ b/assets/icons/consequence-icons/base-complication-minor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-complication-severe.svg b/assets/icons/consequence-icons/base-complication-severe.svg new file mode 100644 index 00000000..e3ebcded --- /dev/null +++ b/assets/icons/consequence-icons/base-complication-severe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-insight-1.svg b/assets/icons/consequence-icons/base-harm-insight-1.svg new file mode 100644 index 00000000..71eba616 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-insight-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-insight-2.svg b/assets/icons/consequence-icons/base-harm-insight-2.svg new file mode 100644 index 00000000..1b426b42 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-insight-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-insight-3.svg b/assets/icons/consequence-icons/base-harm-insight-3.svg new file mode 100644 index 00000000..4cac22cf --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-insight-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-insight-4.svg b/assets/icons/consequence-icons/base-harm-insight-4.svg new file mode 100644 index 00000000..b0561b1c --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-insight-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-prowess-1.svg b/assets/icons/consequence-icons/base-harm-prowess-1.svg new file mode 100644 index 00000000..31ec5f89 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-prowess-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-prowess-2.svg b/assets/icons/consequence-icons/base-harm-prowess-2.svg new file mode 100644 index 00000000..f5e6f9ae --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-prowess-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-prowess-3.svg b/assets/icons/consequence-icons/base-harm-prowess-3.svg new file mode 100644 index 00000000..f32d2abc --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-prowess-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-prowess-4.svg b/assets/icons/consequence-icons/base-harm-prowess-4.svg new file mode 100644 index 00000000..371aa287 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-prowess-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-resolve-1.svg b/assets/icons/consequence-icons/base-harm-resolve-1.svg new file mode 100644 index 00000000..41f3ff68 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-resolve-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-resolve-2.svg b/assets/icons/consequence-icons/base-harm-resolve-2.svg new file mode 100644 index 00000000..37392515 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-resolve-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-resolve-3.svg b/assets/icons/consequence-icons/base-harm-resolve-3.svg new file mode 100644 index 00000000..5574afb1 --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-resolve-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-harm-resolve-4.svg b/assets/icons/consequence-icons/base-harm-resolve-4.svg new file mode 100644 index 00000000..5310259d --- /dev/null +++ b/assets/icons/consequence-icons/base-harm-resolve-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-lost-opportunity.svg b/assets/icons/consequence-icons/base-lost-opportunity.svg new file mode 100644 index 00000000..3f82d79b --- /dev/null +++ b/assets/icons/consequence-icons/base-lost-opportunity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-reduced-effect.svg b/assets/icons/consequence-icons/base-reduced-effect.svg new file mode 100644 index 00000000..8c6ce439 --- /dev/null +++ b/assets/icons/consequence-icons/base-reduced-effect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/base-worse-position.svg b/assets/icons/consequence-icons/base-worse-position.svg new file mode 100644 index 00000000..f8ecb832 --- /dev/null +++ b/assets/icons/consequence-icons/base-worse-position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-complication-major.svg b/assets/icons/consequence-icons/resist-complication-major.svg new file mode 100644 index 00000000..291d3320 --- /dev/null +++ b/assets/icons/consequence-icons/resist-complication-major.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-complication-minor.svg b/assets/icons/consequence-icons/resist-complication-minor.svg new file mode 100644 index 00000000..30b79851 --- /dev/null +++ b/assets/icons/consequence-icons/resist-complication-minor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-complication-severe.svg b/assets/icons/consequence-icons/resist-complication-severe.svg new file mode 100644 index 00000000..0957cf80 --- /dev/null +++ b/assets/icons/consequence-icons/resist-complication-severe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-insight-1.svg b/assets/icons/consequence-icons/resist-harm-insight-1.svg new file mode 100644 index 00000000..e3649ac5 --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-insight-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-insight-2.svg b/assets/icons/consequence-icons/resist-harm-insight-2.svg new file mode 100644 index 00000000..735daeaa --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-insight-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-insight-3.svg b/assets/icons/consequence-icons/resist-harm-insight-3.svg new file mode 100644 index 00000000..d4c1b2fc --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-insight-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-insight-4.svg b/assets/icons/consequence-icons/resist-harm-insight-4.svg new file mode 100644 index 00000000..6f0a2220 --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-insight-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-prowess-1.svg b/assets/icons/consequence-icons/resist-harm-prowess-1.svg new file mode 100644 index 00000000..65fc1d22 --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-prowess-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-prowess-2.svg b/assets/icons/consequence-icons/resist-harm-prowess-2.svg new file mode 100644 index 00000000..55da1919 --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-prowess-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-prowess-3.svg b/assets/icons/consequence-icons/resist-harm-prowess-3.svg new file mode 100644 index 00000000..feeae5ff --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-prowess-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-prowess-4.svg b/assets/icons/consequence-icons/resist-harm-prowess-4.svg new file mode 100644 index 00000000..9aa34f87 --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-prowess-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-resolve-1.svg b/assets/icons/consequence-icons/resist-harm-resolve-1.svg new file mode 100644 index 00000000..53ed0a0f --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-resolve-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-resolve-2.svg b/assets/icons/consequence-icons/resist-harm-resolve-2.svg new file mode 100644 index 00000000..4c8f7777 --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-resolve-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-resolve-3.svg b/assets/icons/consequence-icons/resist-harm-resolve-3.svg new file mode 100644 index 00000000..c0df3e9f --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-resolve-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-harm-resolve-4.svg b/assets/icons/consequence-icons/resist-harm-resolve-4.svg new file mode 100644 index 00000000..174ddaec --- /dev/null +++ b/assets/icons/consequence-icons/resist-harm-resolve-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-lost-opportunity.svg b/assets/icons/consequence-icons/resist-lost-opportunity.svg new file mode 100644 index 00000000..cadfd9fe --- /dev/null +++ b/assets/icons/consequence-icons/resist-lost-opportunity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-reduced-effect.svg b/assets/icons/consequence-icons/resist-reduced-effect.svg new file mode 100644 index 00000000..7e8a4a15 --- /dev/null +++ b/assets/icons/consequence-icons/resist-reduced-effect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/resist-worse-position.svg b/assets/icons/consequence-icons/resist-worse-position.svg new file mode 100644 index 00000000..0f45043b --- /dev/null +++ b/assets/icons/consequence-icons/resist-worse-position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-complication-major.svg b/assets/icons/consequence-icons/special-complication-major.svg new file mode 100644 index 00000000..dad77b86 --- /dev/null +++ b/assets/icons/consequence-icons/special-complication-major.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-complication-minor.svg b/assets/icons/consequence-icons/special-complication-minor.svg new file mode 100644 index 00000000..366f967b --- /dev/null +++ b/assets/icons/consequence-icons/special-complication-minor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-complication-severe.svg b/assets/icons/consequence-icons/special-complication-severe.svg new file mode 100644 index 00000000..04bf1a54 --- /dev/null +++ b/assets/icons/consequence-icons/special-complication-severe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-insight-1.svg b/assets/icons/consequence-icons/special-harm-insight-1.svg new file mode 100644 index 00000000..11b5096e --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-insight-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-insight-2.svg b/assets/icons/consequence-icons/special-harm-insight-2.svg new file mode 100644 index 00000000..c41117d5 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-insight-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-insight-3.svg b/assets/icons/consequence-icons/special-harm-insight-3.svg new file mode 100644 index 00000000..43b6a98f --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-insight-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-insight-4.svg b/assets/icons/consequence-icons/special-harm-insight-4.svg new file mode 100644 index 00000000..6456f135 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-insight-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-prowess-1.svg b/assets/icons/consequence-icons/special-harm-prowess-1.svg new file mode 100644 index 00000000..778901f9 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-prowess-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-prowess-2.svg b/assets/icons/consequence-icons/special-harm-prowess-2.svg new file mode 100644 index 00000000..d60447a9 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-prowess-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-prowess-3.svg b/assets/icons/consequence-icons/special-harm-prowess-3.svg new file mode 100644 index 00000000..25adf7ab --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-prowess-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-prowess-4.svg b/assets/icons/consequence-icons/special-harm-prowess-4.svg new file mode 100644 index 00000000..9a6c0a6a --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-prowess-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-resolve-1.svg b/assets/icons/consequence-icons/special-harm-resolve-1.svg new file mode 100644 index 00000000..55f1e5a7 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-resolve-1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-resolve-2.svg b/assets/icons/consequence-icons/special-harm-resolve-2.svg new file mode 100644 index 00000000..13f36679 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-resolve-2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-resolve-3.svg b/assets/icons/consequence-icons/special-harm-resolve-3.svg new file mode 100644 index 00000000..9814629b --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-resolve-3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-harm-resolve-4.svg b/assets/icons/consequence-icons/special-harm-resolve-4.svg new file mode 100644 index 00000000..eda66f41 --- /dev/null +++ b/assets/icons/consequence-icons/special-harm-resolve-4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-lost-opportunity.svg b/assets/icons/consequence-icons/special-lost-opportunity.svg new file mode 100644 index 00000000..1d1f8852 --- /dev/null +++ b/assets/icons/consequence-icons/special-lost-opportunity.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-reduced-effect.svg b/assets/icons/consequence-icons/special-reduced-effect.svg new file mode 100644 index 00000000..cae85b8e --- /dev/null +++ b/assets/icons/consequence-icons/special-reduced-effect.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/consequence-icons/special-worse-position.svg b/assets/icons/consequence-icons/special-worse-position.svg new file mode 100644 index 00000000..3274a13a --- /dev/null +++ b/assets/icons/consequence-icons/special-worse-position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/css/fonts.min.css b/css/fonts.min.css index b15b6b51..a727f436 100644 --- a/css/fonts.min.css +++ b/css/fonts.min.css @@ -299,4 +299,64 @@ font-family: "UglyQua"; src: url("../assets/fonts/UglyQua/UglyQua i.ttf") format("truetype"); font-style: italic; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort B.otf") format("opentype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Bi.otf") format("opentype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort S.otf") format("opentype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Si.otf") format("opentype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort M.otf") format("opentype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Mi.otf") format("opentype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort L.otf") format("opentype"); + font-style: normal; + font-weight: light; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Li.otf") format("opentype"); + font-style: italic; + font-weight: light; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort.otf") format("opentype"); + font-style: normal; + font-weight: normal; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort i.otf") format("opentype"); + font-style: italic; + font-weight: normal; } \ No newline at end of file diff --git a/css/style.min.css b/css/style.min.css index 3966dd68..1788f130 100644 --- a/css/style.min.css +++ b/css/style.min.css @@ -613,6 +613,66 @@ template { src: url("../assets/fonts/UglyQua/UglyQua i.ttf") format("truetype"); font-style: italic; } +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort B.otf") format("opentype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Bi.otf") format("opentype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort S.otf") format("opentype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Si.otf") format("opentype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort M.otf") format("opentype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Mi.otf") format("opentype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort L.otf") format("opentype"); + font-style: normal; + font-weight: light; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Li.otf") format("opentype"); + font-style: italic; + font-weight: light; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort.otf") format("opentype"); + font-style: normal; + font-weight: normal; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort i.otf") format("opentype"); + font-style: italic; + font-weight: normal; +} :root, * { scrollbar-color: var(--blades-white) var(--blades-black); @@ -861,26 +921,28 @@ template { --blades-color-negative: var(--blades-red-bright); --blades-color-positive: var(--blades-gold-bright); --font-primary: "Minion Pro", serif; + --font-primary: "Beaufort", serif; --font-primary-smallcaps: var(--font-primary); - --font-primary-small: "Minion Pro Caption"; - --font-primary-narrow: "Minion Pro Cond"; - --font-primary-small-narrow: "Minion Pro Caption Cond"; - --font-primary-alt: "Historical FellType"; - --font-primary-alt-smallcaps: "Historical FellType SC"; - --font-emphasis: "Kirsty"; - --font-emphasis-smallcaps: var(--font-emphasis); - --font-emphasis-alt: "Ravenscroft"; - --font-emphasis-alt-smallcaps: var(--font-emphasis-alt); - --font-emphasis-narrow: "Fjalla One"; + --font-primary-small: "Minion Pro Caption", serif; + --font-primary-narrow: "Minion Pro Cond", serif; + --font-primary-small-narrow: "Minion Pro Caption Cond", serif; + --font-primary-alt: "Historical FellType", serif; + --font-primary-alt-smallcaps: "Historical FellType SC", serif; + --font-emphasis: "Kirsty", serif; + --font-emphasis-smallcaps: "Kirsty", serif; + --font-emphasis-alt: "Ravenscroft", serif; + --font-emphasis-alt-smallcaps: var(--font-emphasis-alt), serif; + --font-emphasis-narrow: "Oswald", sans-serif; + --font-emphasis-narrower: "Fjalla One", sans-serif; --font-mono: "Pragmata", monospace; --font-mono-smallcaps: var(--font-mono); - --font-decorative: "UglyQua"; - --font-decorative-alt: "IM FELL Double Pica"; - --font-decorative-alt-smallcaps: "IM FELL Double Pica SC"; - --font-handwritten: "PWSignaturetwo"; - --font-awesome: "Font Awesome 6 Pro"; - --font-awesome-alt: "Font Awesome 6 Brands"; - --font-awesome-duotone: "Font Awesome 6 Duotone"; + --font-decorative: "UglyQua", serif; + --font-decorative-alt: "IM FELL Double Pica", serif; + --font-decorative-alt-smallcaps: "IM FELL Double Pica SC", serif; + --font-handwritten: "PWSignaturetwo", serif; + --font-awesome: "Font Awesome 6 Pro", sans-serif; + --font-awesome-alt: "Font Awesome 6 Brands", sans-serif; + --font-awesome-duotone: "Font Awesome 6 Duotone", sans-serif; --line-height-expanded: 1.4; --line-height-primary: 1.2; --line-height-compact: 1; @@ -1441,7 +1503,7 @@ template { } :root .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root * .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 0.3125rem 0 0; @@ -1861,7 +1923,7 @@ template { :root .comp.consequence-display-container, :root * .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -1944,6 +2006,18 @@ template { --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +:root .comp.consequence-display-container .consequence-bg-image, +:root * .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} :root .comp.consequence-display-container .consequence-interaction-pad, :root * .comp.consequence-display-container .consequence-interaction-pad { display: none; @@ -1974,8 +2048,8 @@ template { :root .comp.consequence-display-container .consequence-icon-container, :root * .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -1989,22 +2063,23 @@ template { :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle, :root * .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root * .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -2035,7 +2110,7 @@ template { } :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root * .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -2064,7 +2139,7 @@ template { display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, :root * .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg { @@ -2082,11 +2157,15 @@ template { :root * .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +:root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root * .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root * .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -2121,7 +2200,7 @@ template { } :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root * .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, :root * .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg { @@ -2159,7 +2238,7 @@ template { top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -2183,11 +2262,12 @@ template { padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } :root .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, :root * .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence { @@ -2226,7 +2306,7 @@ template { :root * .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -2263,12 +2343,12 @@ template { } :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root * .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root * .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name, @@ -2299,7 +2379,7 @@ template { font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } :root .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, :root * .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name { @@ -2486,7 +2566,7 @@ template { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -2665,7 +2745,7 @@ template { } :root body.vtt.game.system-eunos-blades #pause figcaption { text-shadow: 1px 1px 3px #000, 1px 1px 3px #000, 1px 1px 3px #000, 0px 0px 5px #000; - font-family: Kirsty, serif !important; + font-family: var(--font-emphasis), serif !important; line-height: 2rem; padding: 0 25%; } @@ -2840,7 +2920,7 @@ template { font-size: 1.25rem; line-height: 1; margin-top: -0.0625rem; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; transform-origin: center center; transform: scaleY(0.75); } @@ -3242,7 +3322,7 @@ template { font-weight: bold; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 0.3125rem 0 0; @@ -3586,7 +3666,7 @@ template { } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -3665,6 +3745,17 @@ template { --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +:root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-interaction-pad { display: none; display: block; @@ -3689,8 +3780,8 @@ template { } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -3702,21 +3793,22 @@ template { } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -3740,7 +3832,7 @@ template { transform-origin: 50% 50%; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -3763,7 +3855,7 @@ template { display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg { position: absolute; @@ -3778,10 +3870,13 @@ template { :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-resist-button-bg, :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +:root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -3811,7 +3906,7 @@ template { transform: skewX(45deg); } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg { right: -7px; @@ -3844,7 +3939,7 @@ template { top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -3866,11 +3961,12 @@ template { padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence { text-shadow: none; @@ -3903,7 +3999,7 @@ template { :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -3935,11 +4031,11 @@ template { filter: brightness(1.5) drop-shadow(0 0 4px black); } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name { @@ -3964,7 +4060,7 @@ template { font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } :root body.vtt.game.system-eunos-blades #clocks-overlay .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name { flex-grow: 1; @@ -4113,7 +4209,7 @@ template { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -4401,7 +4497,7 @@ template { } :root body.vtt.game.system-eunos-blades #clocks-overlay .clock-key:not(.active-key) .key-label { color: var(--blades-white); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 2.5rem; top: unset; width: 200px; @@ -4427,7 +4523,7 @@ template { } :root body.vtt.game.system-eunos-blades #clocks-overlay .clock-key .clock-label-container .clock-label .short-label { font-size: 2.5rem; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-shadow: 0 0 15px var(--blades-black-dark), 0 0 15px var(--blades-black-dark), 0 0 15px var(--blades-black-dark), 0 0 15px var(--blades-black-dark); } :root body.vtt.game.system-eunos-blades #clocks-overlay .clock-key .clock-label-container .clock-label.clock-active .short-label { @@ -4938,7 +5034,6 @@ template { } :root body.vtt.game.system-eunos-blades #sidebar { overflow: visible; - --font-primary: "Minion Pro", serif; } :root body.vtt.game.system-eunos-blades #sidebar #blades-push-notifications { height: auto; @@ -4983,7 +5078,7 @@ template { } :root body.vtt.game.system-eunos-blades #sidebar #blades-push-notifications .push-notice .header { width: 100%; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); text-align: left; @@ -5354,7 +5449,7 @@ template { font-size: 1.25rem; line-height: 1; margin-top: -0.0625rem; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; transform-origin: center center; transform: scaleY(0.75); } @@ -6140,7 +6235,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root body.vtt.game.system-eunos-blades #hotbar .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root body.vtt.game.system-eunos-blades #players .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 0.3125rem 0 0; @@ -6788,7 +6883,7 @@ template { :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -6883,6 +6978,21 @@ template { --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +:root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-interaction-pad, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-interaction-pad, :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-interaction-pad, @@ -6931,8 +7041,8 @@ template { :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-icon-container, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -6952,25 +7062,26 @@ template { :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -7022,7 +7133,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -7069,7 +7180,7 @@ template { display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, @@ -7096,6 +7207,13 @@ template { :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +:root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, @@ -7103,7 +7221,7 @@ template { :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -7153,7 +7271,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, @@ -7206,7 +7324,7 @@ template { top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -7236,11 +7354,12 @@ template { padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, @@ -7297,7 +7416,7 @@ template { :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -7349,7 +7468,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, @@ -7357,7 +7476,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root body.vtt.game.system-eunos-blades #hotbar .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root body.vtt.game.system-eunos-blades #players .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name, @@ -7406,7 +7525,7 @@ template { font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } :root body.vtt.game.system-eunos-blades #interface .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, :root body.vtt.game.system-eunos-blades #controls .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, @@ -7707,7 +7826,7 @@ template { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -8286,7 +8405,7 @@ template { font-size: 1.25rem; line-height: 1; margin-top: -0.0625rem; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; transform-origin: center center; transform: scaleY(0.75); } @@ -9072,7 +9191,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root body.vtt.game.system-eunos-blades #players #chat .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 0.3125rem 0 0; @@ -9720,7 +9839,7 @@ template { :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -9815,6 +9934,21 @@ template { --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +:root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-bg-image, +:root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-interaction-pad, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-interaction-pad, :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-interaction-pad, @@ -9863,8 +9997,8 @@ template { :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-icon-container, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -9884,25 +10018,26 @@ template { :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -9954,7 +10089,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -10001,7 +10136,7 @@ template { display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, @@ -10028,6 +10163,13 @@ template { :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +:root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, +:root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, @@ -10035,7 +10177,7 @@ template { :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -10085,7 +10227,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, @@ -10138,7 +10280,7 @@ template { top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -10168,11 +10310,12 @@ template { padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, @@ -10229,7 +10372,7 @@ template { :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -10281,7 +10424,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, @@ -10289,7 +10432,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root body.vtt.game.system-eunos-blades #hotbar #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root body.vtt.game.system-eunos-blades #players #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name, @@ -10338,7 +10481,7 @@ template { font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } :root body.vtt.game.system-eunos-blades #interface #chat .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, :root body.vtt.game.system-eunos-blades #controls #chat .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, @@ -10639,7 +10782,7 @@ template { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -11039,7 +11182,7 @@ template { height: var(--nc-size); width: var(--nc-size); font-weight: bold; - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); font-size: var(--nc-font-size); text-align: center; border-radius: var(--nc-border-radius); @@ -11579,7 +11722,7 @@ template { :root body.vtt.game.system-eunos-blades #players #chat .player-character-summary-panel .pc-summary section.pc-summary-header .pc-summary-heritage { grid-area: heritage; font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; line-height: 20px; text-align: right; @@ -11622,7 +11765,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label, :root body.vtt.game.system-eunos-blades #hotbar #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label, :root body.vtt.game.system-eunos-blades #players #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white); @@ -11632,7 +11775,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span, :root body.vtt.game.system-eunos-blades #hotbar #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span, :root body.vtt.game.system-eunos-blades #players #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white-bright); @@ -11655,7 +11798,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label, :root body.vtt.game.system-eunos-blades #hotbar #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label, :root body.vtt.game.system-eunos-blades #players #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-grey-bright); @@ -11667,7 +11810,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span, :root body.vtt.game.system-eunos-blades #hotbar #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span, :root body.vtt.game.system-eunos-blades #players #chat .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-white-bright); @@ -11836,7 +11979,7 @@ template { :root body.vtt.game.system-eunos-blades #players #chat .player-character-summary-panel .pc-summary section.pc-summary-maluses .pc-summary-trauma-container .pc-summary-trauma { color: var(--blades-red-bright); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-size: 12px; text-transform: uppercase; text-align: center; @@ -12228,7 +12371,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i), :root body.vtt.game.system-eunos-blades #hotbar #chat .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i), :root body.vtt.game.system-eunos-blades #players #chat .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i) { - font-family: "Minion Pro Cond", serif; + font-family: var(--font-primary-narrow); } :root body.vtt.game.system-eunos-blades #interface #chat .randomizer-panel .randomizer-container .randomizer-list .randomizer-item textarea, :root body.vtt.game.system-eunos-blades #controls #chat .randomizer-panel .randomizer-container .randomizer-list .randomizer-item textarea, @@ -12292,8 +12435,7 @@ template { :root body.vtt.game.system-eunos-blades #hotbar #chat *, :root body.vtt.game.system-eunos-blades #players #chat, :root body.vtt.game.system-eunos-blades #players #chat * { - --font-primary: "Minion Pro"; - --font-heading: "Kirsty"; + --font-heading: var(--font-emphasis); --font-weight-heading: normal; --text-shadow-heading: none; --line-height-heading: 1.2; @@ -12303,7 +12445,27 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .chat-message, :root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message, :root body.vtt.game.system-eunos-blades #players #chat .chat-message { - background: var(--blades-black); + --bg-controlled: var(--blades-grey-bright); + --bg-risky: var(--blades-black-dark); + --bg-desperate: var(--blades-red-darkest); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message:last-child, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message:last-child, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message:last-child, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message:last-child, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message:last-child { + --bg-controlled: url("../assets/animations/chat/roll-position-controlled.webp"); + --bg-risky: url("../assets/animations/chat/roll-position-risky.webp"); + --bg-desperate: url("../assets/animations/chat/roll-position-desperate.webp"); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message { + background: var(--blades-black-dark); + overflow: hidden; + position: relative; } :root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-header, :root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-header, @@ -12337,7 +12499,7 @@ template { :root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .chat-message-bg.roll-position-risky, :root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .chat-message-bg.roll-position-risky, :root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .chat-message-bg.roll-position-risky { - background-image: url("../assets/animations/chat/roll-position-risky.webp"); + background: var(--bg-risky); background-size: cover; } :root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll, @@ -12372,28 +12534,63 @@ template { font-size: 32px; color: var(--blades-gold); } -:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-states, -:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-states, -:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-states, -:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-states, -:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-states { +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container { justify-content: space-between; - padding: 0 20px; -} -:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-states .roll-state-container, -:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-states .roll-state-container, -:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-states .roll-state-container, -:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-states .roll-state-container, -:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-states .roll-state-container { - flex-basis: 30%; - flex-grow: 0; - flex-shrink: 0; + padding: 0 10px; + align-items: center; + margin: 5px 0 10px 0; + background: var(--background-color); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-critical, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-critical, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-critical, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-critical, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-critical { + --background-color: var(--blades-gold-bright); + --label-color: var(--blades-black); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-success, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-success, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-success, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-success, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-success { + --background-color: var(--blades-white-bright); + --label-color: var(--blades-black); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-partial, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-partial, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-partial, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-partial, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-partial { + --background-color: var(--blades-black); + --label-color: var(--blades-white); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-fail, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-fail, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-fail, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-fail, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container.roll-result-fail { + --background-color: var(--blades-red-darkest); + --label-color: var(--blades-red-bright); +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container { + flex-basis: 10%; + flex-grow: 0.3; + flex-shrink: 1; } -:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-states h4.roll-state-label, -:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-states h4.roll-state-label, -:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-states h4.roll-state-label, -:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-states h4.roll-state-label, -:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-states h4.roll-state-label { +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h4.roll-state-label, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h4.roll-state-label, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h4.roll-state-label, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h4.roll-state-label, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h4.roll-state-label { font-family: var(--font-primary); font-size: 12px; display: block; @@ -12402,32 +12599,43 @@ template { white-space: nowrap; color: var(--blades-grey); margin-top: -4px; + text-shadow: var(--text-shadow-dark); } -:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-states h3.roll-state, -:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-states h3.roll-state, -:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-states h3.roll-state, -:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-states h3.roll-state, -:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-states h3.roll-state { +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h3.roll-state, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h3.roll-state, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h3.roll-state, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h3.roll-state, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-state-container h3.roll-state { white-space: nowrap; + text-shadow: var(--text-shadow-dark); } -:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position, -:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position, -:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position, -:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position, -:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position { - text-align: right; - font-family: var(--font-primary); +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label { + background: none; + box-shadow: none; + color: var(--label-color); + white-space: nowrap; + margin: 0; + padding: 0; } -:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position .position-text, -:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position .position-text, -:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position .position-text, -:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position .position-text, -:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll h2.chat-header.roll-position .position-text { - margin: 0 15px; - transform-origin: 50% 50%; - scale: 1.5; - display: inline-block; - font-family: var(--font-emphasis); +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-top-label, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-top-label, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-top-label, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-top-label, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-top-label { + font-size: 26px; + line-height: 26px; +} +:root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-bottom-label, +:root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-bottom-label, +:root body.vtt.game.system-eunos-blades #navigation #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-bottom-label, +:root body.vtt.game.system-eunos-blades #hotbar #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-bottom-label, +:root body.vtt.game.system-eunos-blades #players #chat .chat-message .message-content .blades-roll .roll-outcome-container .roll-result-container .roll-result-label.roll-result-bottom-label { + font-size: 14px; + font-family: var(--font-emphasis-narrow); } :root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .dice-roll-strip, :root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .dice-roll-strip, @@ -12442,7 +12650,7 @@ template { align-items: stretch; justify-content: center; gap: 10px; - margin: 10px 0; + margin: 5px 0; } :root body.vtt.game.system-eunos-blades #interface #chat .chat-message .message-content .blades-roll .dice-roll-strip .blades-die, :root body.vtt.game.system-eunos-blades #controls #chat .chat-message .message-content .blades-roll .dice-roll-strip .blades-die, @@ -12765,7 +12973,7 @@ template { font-size: 1.25rem; line-height: 1; margin-top: -0.0625rem; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; transform-origin: center center; transform: scaleY(0.75); } @@ -13167,7 +13375,7 @@ template { font-weight: bold; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 0.3125rem 0 0; @@ -13511,7 +13719,7 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -13590,6 +13798,17 @@ template { --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +:root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-interaction-pad { display: none; display: block; @@ -13614,8 +13833,8 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -13627,21 +13846,22 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -13665,7 +13885,7 @@ template { transform-origin: 50% 50%; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -13688,7 +13908,7 @@ template { display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg { position: absolute; @@ -13703,10 +13923,13 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-resist-button-bg, :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +:root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -13736,7 +13959,7 @@ template { transform: skewX(45deg); } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg { right: -7px; @@ -13769,7 +13992,7 @@ template { top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -13791,11 +14014,12 @@ template { padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence { text-shadow: none; @@ -13828,7 +14052,7 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -13860,11 +14084,11 @@ template { filter: brightness(1.5) drop-shadow(0 0 4px black); } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name { @@ -13889,7 +14113,7 @@ template { font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } :root body.vtt.game.system-eunos-blades .app.window-app .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name { flex-grow: 1; @@ -14038,7 +14262,7 @@ template { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -14298,7 +14522,7 @@ template { height: var(--nc-size); width: var(--nc-size); font-weight: bold; - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); font-size: var(--nc-font-size); text-align: center; border-radius: var(--nc-border-radius); @@ -14590,7 +14814,7 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app .player-character-summary-panel .pc-summary section.pc-summary-header .pc-summary-heritage { grid-area: heritage; font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; line-height: 20px; text-align: right; @@ -14617,13 +14841,13 @@ template { margin-top: 5px; } :root body.vtt.game.system-eunos-blades .app.window-app .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white); } :root body.vtt.game.system-eunos-blades .app.window-app .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white-bright); @@ -14638,7 +14862,7 @@ template { flex-direction: row; } :root body.vtt.game.system-eunos-blades .app.window-app .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-grey-bright); @@ -14646,7 +14870,7 @@ template { text-align: right; } :root body.vtt.game.system-eunos-blades .app.window-app .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-white-bright); @@ -14747,7 +14971,7 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app .player-character-summary-panel .pc-summary section.pc-summary-maluses .pc-summary-trauma-container .pc-summary-trauma { color: var(--blades-red-bright); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-size: 12px; text-transform: uppercase; text-align: center; @@ -14983,7 +15207,7 @@ template { box-shadow: none; } :root body.vtt.game.system-eunos-blades .app.window-app .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i) { - font-family: "Minion Pro Cond", serif; + font-family: var(--font-primary-narrow); } :root body.vtt.game.system-eunos-blades .app.window-app .randomizer-panel .randomizer-container .randomizer-list .randomizer-item textarea { resize: none; @@ -16219,7 +16443,7 @@ template { height: var(--nc-size); width: var(--nc-size); font-weight: bold; - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); font-size: var(--nc-font-size); text-align: center; border-radius: var(--nc-border-radius); @@ -16511,7 +16735,7 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .player-character-summary-panel .pc-summary section.pc-summary-header .pc-summary-heritage { grid-area: heritage; font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; line-height: 20px; text-align: right; @@ -16538,13 +16762,13 @@ template { margin-top: 5px; } :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white); } :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white-bright); @@ -16559,7 +16783,7 @@ template { flex-direction: row; } :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-grey-bright); @@ -16567,7 +16791,7 @@ template { text-align: right; } :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-white-bright); @@ -16668,7 +16892,7 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .player-character-summary-panel .pc-summary section.pc-summary-maluses .pc-summary-trauma-container .pc-summary-trauma { color: var(--blades-red-bright); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-size: 12px; text-transform: uppercase; text-align: center; @@ -16904,7 +17128,7 @@ template { box-shadow: none; } :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i) { - font-family: "Minion Pro Cond", serif; + font-family: var(--font-primary-narrow); } :root body.vtt.game.system-eunos-blades .app.window-app.sheet .window-content form .randomizer-panel .randomizer-container .randomizer-list .randomizer-item textarea { resize: none; @@ -16974,7 +17198,7 @@ template { width: 100%; background-color: rgb(255, 255, 0); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; text-align: center; font-size: 0.875rem; color: var(--blades-black); @@ -18107,7 +18331,7 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.actor.npc .window-content form .comp-randomizer-field .randomizer-input { background: var(--blades-grey); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-indent: 5px; line-height: 2rem; } @@ -18318,7 +18542,7 @@ template { border-radius: 0px; box-shadow: none; /* Font & Text */ - font-family: var(--font-emphasis-narrow); + font-family: var(--font-emphasis-narrower); font-size: var(--name-size); font-weight: bold; text-align: center; @@ -18423,7 +18647,7 @@ template { color: var(--blades-white); border-radius: 7px; outline: 1px outset var(--blades-white); - font-family: var(--font-emphasis-narrow); + font-family: var(--font-emphasis-narrower); font-size: 0.875rem; line-height: 1.25rem; text-align: center; @@ -18929,7 +19153,7 @@ template { border-radius: 0px; box-shadow: none; /* Font & Text */ - font-family: var(--font-emphasis-narrow); + font-family: var(--font-emphasis-narrower); font-size: var(--name-size); font-weight: bold; text-align: center; @@ -19034,7 +19258,7 @@ template { color: var(--blades-white); border-radius: 7px; outline: 1px outset var(--blades-white); - font-family: var(--font-emphasis-narrow); + font-family: var(--font-emphasis-narrower); font-size: 0.875rem; line-height: 1.25rem; text-align: center; @@ -19127,7 +19351,7 @@ template { line-height: 20px; font-style: italic; font-size: 0.875rem; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; white-space: nowrap; width: 100%; @@ -19414,7 +19638,7 @@ template { position: unset; } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.dialog .window-content .consequence-section .roll-consequence-row .blades-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.active-effect-sheet { min-width: 600px; @@ -19604,7 +19828,7 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .roll-sheet-sub-block.roll-effects-block.inactive-mod-block .roll-mod-container .roll-mod-label .roll-mod-text { font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; margin: 0 10px 0 0; color: var(--blades-white); @@ -19631,8 +19855,8 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .roll-sheet-sub-block .roll-mod-container { --roll-mod-size: 30px; - --label-font: Kirsty; - --sidestring-font: Oswald; + --label-font: var(--font-emphasis); + --sidestring-font: var(--font-emphasis-narrow); --glow-animation: anim-glow-gold; --roll-mod-bright-color: var(--blades-gold-bright); --roll-mod-med-color: var(--blades-gold); @@ -19651,7 +19875,7 @@ template { --roll-mod-dark-color: var(--blades-red-darkest); } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .roll-sheet-sub-block .roll-mod-container.roll-mod-ability .roll-mod-label .roll-mod-text:last-of-type, :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .roll-sheet-sub-block .roll-mod-container.roll-mod-harm .roll-mod-label .roll-mod-text:last-of-type { - --label-font: Oswald; + --label-font: var(--font-emphasis-narrow); font-weight: bold; } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .roll-sheet-sub-block .roll-mod-container.status-hidden { @@ -19859,7 +20083,7 @@ template { line-height: var(--roll-mod-size); } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .roll-sheet-sub-block .roll-mod-container .roll-mod-label .roll-mod-text.roll-mod-sidestring { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); margin-left: 5px; text-transform: uppercase; font-size: 14px; @@ -20590,7 +20814,7 @@ template { :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .window-content form .sheet-root .full-root .full-root-container.split-root-right section.sheet-main.factor-controls .factor-control-row .roll-num-container.factor-spacer { height: var(--spread-size, 30px); width: var(--spread-size, 30px); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: calc(var(--spread-size, 30px) - 2px); border: 1px var(--roll-factor-inactive-border-style, solid) var(--roll-factor-inactive-border); @@ -20970,7 +21194,7 @@ template { } :root body.vtt.game.system-eunos-blades .app.window-app.sheet.roll-collab .window-content form .sheet-root .roll-num-container .num-spread-label { position: absolute; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; left: 0%; top: calc(100% + 1px); diff --git a/css/tinymce/content.min.css b/css/tinymce/content.min.css index 847f80bc..48f34d4f 100644 --- a/css/tinymce/content.min.css +++ b/css/tinymce/content.min.css @@ -227,26 +227,28 @@ html, :root { --blades-color-negative: var(--blades-red-bright); --blades-color-positive: var(--blades-gold-bright); --font-primary: "Minion Pro", serif; + --font-primary: "Beaufort", serif; --font-primary-smallcaps: var(--font-primary); - --font-primary-small: "Minion Pro Caption"; - --font-primary-narrow: "Minion Pro Cond"; - --font-primary-small-narrow: "Minion Pro Caption Cond"; - --font-primary-alt: "Historical FellType"; - --font-primary-alt-smallcaps: "Historical FellType SC"; - --font-emphasis: "Kirsty"; - --font-emphasis-smallcaps: var(--font-emphasis); - --font-emphasis-alt: "Ravenscroft"; - --font-emphasis-alt-smallcaps: var(--font-emphasis-alt); - --font-emphasis-narrow: "Fjalla One"; + --font-primary-small: "Minion Pro Caption", serif; + --font-primary-narrow: "Minion Pro Cond", serif; + --font-primary-small-narrow: "Minion Pro Caption Cond", serif; + --font-primary-alt: "Historical FellType", serif; + --font-primary-alt-smallcaps: "Historical FellType SC", serif; + --font-emphasis: "Kirsty", serif; + --font-emphasis-smallcaps: "Kirsty", serif; + --font-emphasis-alt: "Ravenscroft", serif; + --font-emphasis-alt-smallcaps: var(--font-emphasis-alt), serif; + --font-emphasis-narrow: "Oswald", sans-serif; + --font-emphasis-narrower: "Fjalla One", sans-serif; --font-mono: "Pragmata", monospace; --font-mono-smallcaps: var(--font-mono); - --font-decorative: "UglyQua"; - --font-decorative-alt: "IM FELL Double Pica"; - --font-decorative-alt-smallcaps: "IM FELL Double Pica SC"; - --font-handwritten: "PWSignaturetwo"; - --font-awesome: "Font Awesome 6 Pro"; - --font-awesome-alt: "Font Awesome 6 Brands"; - --font-awesome-duotone: "Font Awesome 6 Duotone"; + --font-decorative: "UglyQua", serif; + --font-decorative-alt: "IM FELL Double Pica", serif; + --font-decorative-alt-smallcaps: "IM FELL Double Pica SC", serif; + --font-handwritten: "PWSignaturetwo", serif; + --font-awesome: "Font Awesome 6 Pro", sans-serif; + --font-awesome-alt: "Font Awesome 6 Brands", sans-serif; + --font-awesome-duotone: "Font Awesome 6 Duotone", sans-serif; --line-height-expanded: 1.4; --line-height-primary: 1.2; --line-height-compact: 1; @@ -720,7 +722,7 @@ html .comp.comp-horizontal.comp-desc-trait .comp-body .dotline .dotline-label, : font-weight: bold; } html .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 toRem(5px) 0 0; @@ -1064,7 +1066,7 @@ html .comp.controls-container .controls-panel.active .controls-list li:hover > a } html .comp.consequence-display-container, :root .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -1143,6 +1145,17 @@ html .comp.consequence-display-container .special-armor-consequence, :root .comp --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +html .comp.consequence-display-container .consequence-bg-image, :root .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} html .comp.consequence-display-container .consequence-interaction-pad, :root .comp.consequence-display-container .consequence-interaction-pad { display: none; display: block; @@ -1167,8 +1180,8 @@ html .comp.consequence-display-container .consequence-interaction-pad.special-ar } html .comp.consequence-display-container .consequence-icon-container, :root .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -1180,21 +1193,22 @@ html .comp.consequence-display-container .consequence-icon-container:hover, :roo } html .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle, :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } html .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -1218,7 +1232,7 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc transform-origin: 50% 50%; } html .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -1241,7 +1255,7 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg { position: absolute; @@ -1256,10 +1270,13 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-resist-button-bg, html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-resist-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -1289,7 +1306,7 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc transform: skewX(45deg); } html .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } html .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg { right: -7px; @@ -1322,7 +1339,7 @@ html .comp.consequence-display-container .consequence-type-container .consequenc top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -1344,11 +1361,12 @@ html .comp.consequence-display-container .consequence-name-container .consequenc padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } html .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, :root .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence { text-shadow: none; @@ -1381,7 +1399,7 @@ html .comp.consequence-display-container .consequence-footer-container .conseque html .comp.consequence-display-container .consequence-footer-container .consequence-footer-message, :root .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -1413,11 +1431,11 @@ html .comp.consequence-display-container .roll-consequence-row .roll-consequence filter: brightness(1.5) drop-shadow(0 0 4px black); } html .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } html .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } html .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name, :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name { @@ -1443,7 +1461,7 @@ html .comp.consequence-display-container .roll-consequence-row .consequence-resi font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } html .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, :root .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name { flex-grow: 1; @@ -1592,7 +1610,7 @@ html .dotline .advance-button, :root .dotline .advance-button { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -1935,7 +1953,7 @@ html .window-header .close i, :root .window-header .close i { font-size: 1.25rem; line-height: 1; margin-top: -0.0625rem; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; transform-origin: center center; transform: scaleY(0.75); } @@ -2337,7 +2355,7 @@ html .comp.comp-horizontal.comp-desc-trait .comp-body .dotline .dotline-label, : font-weight: bold; } html .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text, :root .comp.comp-horizontal.comp-desc-trait .comp-body .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 0.3125rem 0 0; @@ -2681,7 +2699,7 @@ html .comp.controls-container .controls-panel.active .controls-list li:hover > a } html .comp.consequence-display-container, :root .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); --csq-button-size-mult: 0.33; @@ -2760,6 +2778,17 @@ html .comp.consequence-display-container .special-armor-consequence, :root .comp --csq-type-color: var(--blades-blue-dark); --csq-name-color: var(--blades-blue-bright); } +html .comp.consequence-display-container .consequence-bg-image, :root .comp.consequence-display-container .consequence-bg-image { + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: 808.2px; + min-width: 808.2px; + z-index: -1; + left: -10px; +} html .comp.consequence-display-container .consequence-interaction-pad, :root .comp.consequence-display-container .consequence-interaction-pad { display: none; display: block; @@ -2784,8 +2813,8 @@ html .comp.consequence-display-container .consequence-interaction-pad.special-ar } html .comp.consequence-display-container .consequence-icon-container, :root .comp.consequence-display-container .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + height: var(--container-height); + max-width: var(--container-height); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -2797,21 +2826,22 @@ html .comp.consequence-display-container .consequence-icon-container:hover, :roo } html .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle, :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle { position: absolute; - translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; } html .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg, :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -2835,7 +2865,7 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc transform-origin: 50% 50%; } html .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence, :root .comp.consequence-display-container .consequence-icon-container .consequence-icon-circle.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; } @@ -2858,7 +2888,7 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; } html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg { position: absolute; @@ -2873,10 +2903,13 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-resist-button-bg, html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-resist-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { transform-origin: 100% 50%; } +html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-bg.consequence-special-armor-button-bg { + width: calc(100% + 32px); +} html .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -2906,7 +2939,7 @@ html .comp.consequence-display-container .consequence-icon-container .consequenc transform: skewX(45deg); } html .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container { - left: 140%; + left: 105%; } html .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg, :root .comp.consequence-display-container .consequence-icon-container .consequence-button-container.consequence-accept-button-container .consequence-button-bg { right: -7px; @@ -2939,7 +2972,7 @@ html .comp.consequence-display-container .consequence-type-container .consequenc top: 0; transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -2961,11 +2994,12 @@ html .comp.consequence-display-container .consequence-name-container .consequenc padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; } html .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence, :root .comp.consequence-display-container .consequence-name-container .consequence-name.resist-consequence { text-shadow: none; @@ -2998,7 +3032,7 @@ html .comp.consequence-display-container .consequence-footer-container .conseque html .comp.consequence-display-container .consequence-footer-container .consequence-footer-message, :root .comp.consequence-display-container .consequence-footer-container .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -3030,11 +3064,11 @@ html .comp.consequence-display-container .roll-consequence-row .roll-consequence filter: brightness(1.5) drop-shadow(0 0 4px black); } html .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select, :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } html .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select, :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } html .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name, :root .comp.consequence-display-container .roll-consequence-row .roll-consequence-entry-row .consequence-name { @@ -3060,7 +3094,7 @@ html .comp.consequence-display-container .roll-consequence-row .consequence-resi font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } html .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name, :root .comp.consequence-display-container .roll-consequence-row .consequence-resist-options-container .consequence-resist-option .consequence-name { flex-grow: 1; @@ -3209,7 +3243,7 @@ html .dotline .advance-button, :root .dotline .advance-button { position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; @@ -3479,7 +3513,7 @@ html .number-circle, :root .number-circle { height: var(--nc-size); width: var(--nc-size); font-weight: bold; - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); font-size: var(--nc-font-size); text-align: center; border-radius: var(--nc-border-radius); @@ -3771,7 +3805,7 @@ html .player-character-summary-panel .pc-summary section.pc-summary-header .pc-s html .player-character-summary-panel .pc-summary section.pc-summary-header .pc-summary-heritage, :root .player-character-summary-panel .pc-summary section.pc-summary-header .pc-summary-heritage { grid-area: heritage; font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; line-height: 20px; text-align: right; @@ -3798,13 +3832,13 @@ html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc- margin-top: 5px; } html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label, :root .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white); } html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span, :root .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-attribute span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.75rem; line-height: 0.75rem; color: var(--blades-white-bright); @@ -3819,7 +3853,7 @@ html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc- flex-direction: row; } html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label, :root .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-grey-bright); @@ -3827,7 +3861,7 @@ html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc- text-align: right; } html .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span, :root .player-character-summary-panel .pc-summary section.pc-summary-actions .pc-summary-action span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 0.625rem; line-height: 0.625rem; color: var(--blades-white-bright); @@ -3928,7 +3962,7 @@ html .player-character-summary-panel .pc-summary section.pc-summary-maluses .pc- html .player-character-summary-panel .pc-summary section.pc-summary-maluses .pc-summary-trauma-container .pc-summary-trauma, :root .player-character-summary-panel .pc-summary section.pc-summary-maluses .pc-summary-trauma-container .pc-summary-trauma { color: var(--blades-red-bright); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-size: 12px; text-transform: uppercase; text-align: center; @@ -4167,7 +4201,7 @@ html .randomizer-panel .randomizer-container .randomizer-list .randomizer-item:n box-shadow: none; } html .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i), :root .randomizer-panel .randomizer-container .randomizer-list .randomizer-item *:not(i) { - font-family: "Minion Pro Cond", serif; + font-family: var(--font-primary-narrow); } html .randomizer-panel .randomizer-container .randomizer-list .randomizer-item textarea, :root .randomizer-panel .randomizer-container .randomizer-list .randomizer-item textarea { resize: none; diff --git a/css/tinymce/fonts.min.css b/css/tinymce/fonts.min.css index b15b6b51..a727f436 100644 --- a/css/tinymce/fonts.min.css +++ b/css/tinymce/fonts.min.css @@ -299,4 +299,64 @@ font-family: "UglyQua"; src: url("../assets/fonts/UglyQua/UglyQua i.ttf") format("truetype"); font-style: italic; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort B.otf") format("opentype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Bi.otf") format("opentype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort S.otf") format("opentype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Si.otf") format("opentype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort M.otf") format("opentype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Mi.otf") format("opentype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort L.otf") format("opentype"); + font-style: normal; + font-weight: light; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Li.otf") format("opentype"); + font-style: italic; + font-weight: light; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort.otf") format("opentype"); + font-style: normal; + font-weight: normal; +} +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort i.otf") format("opentype"); + font-style: italic; + font-weight: normal; } \ No newline at end of file diff --git a/module/BladesChat.js b/module/BladesChat.js index cf8d0910..17cff433 100644 --- a/module/BladesChat.js +++ b/module/BladesChat.js @@ -67,6 +67,10 @@ class BladesChat extends ChatMessage { const template = `systems/eunos-blades/templates/chat/roll-result-${U.lCase(rollInst.rollType)}-roll.hbs`; /*~ @@DOUBLE-BLANK@@ ~*/ const templateData = rollInst; + templateData.rollFlags = { ...rollInst.flagData }; + /*~ @@DOUBLE-BLANK@@ ~*/ + eLog.checkLog3("bladesRoll", "ConstructRollOutput Data", { rollInst, templateData }); + /*~ @@DOUBLE-BLANK@@ ~*/ if (rollInst.rollResult) { templateData.rollResultDescription = C.RollResultDescriptions[rollInst.finalPosition][rollInst.rollResult]; } diff --git a/module/blades.js b/module/blades.js index 6ae9ad02..73ffe4d8 100644 --- a/module/blades.js +++ b/module/blades.js @@ -77,27 +77,6 @@ class GlobalGetter { attribute: AttributeTrait.prowess, attributeVal: 3, name: "Broken Leg", - resistOptions: { - 0: { - name: "Sprained Ankle", - isSelected: true, - type: ConsequenceType.ProwessHarm1, - icon: C.ConsequenceIcons[ConsequenceType.ProwessHarm1], - typeDisplay: C.ConsequenceDisplay[ConsequenceType.ProwessHarm1] - }, - 1: { - name: "Bruised Leg", - isSelected: false, - type: ConsequenceType.ProwessHarm1, - icon: C.ConsequenceIcons[ConsequenceType.ProwessHarm1] - }, - 2: { - name: "Fractured Foot", - isSelected: false, - type: ConsequenceType.ProwessHarm1, - icon: C.ConsequenceIcons[ConsequenceType.ProwessHarm1] - } - }, resistedTo: { name: "Sprained Ankle", isSelected: true, @@ -121,56 +100,24 @@ class GlobalGetter { attribute: AttributeTrait.insight, attributeVal: 4, name: "You Lose Your Footing", - /* "resistOptions": { - "0": { - "name": "Stumble", - "isSelected": false - }, - "1": { - "name": "Trip", - "isSelected": false - }, - "2": { - "name": "", - "type": "None", - "isSelected": true - } - }, */ resistedTo: { name: "", type: ConsequenceType.None, isSelected: true }, - icon: "main", + icon: C.ConsequenceIcons[ConsequenceType.ReducedEffect], typeDisplay: "Reduced Effect" }, 2: { type: ConsequenceType.ResolveHarm1, attribute: AttributeTrait.resolve, name: "Traumatic Flashbacks", - resistOptions: { - 0: { - name: "", - type: ConsequenceType.None, - isSelected: true - }, - 1: { - name: "", - type: ConsequenceType.None, - isSelected: false - }, - 2: { - name: "", - type: ConsequenceType.None, - isSelected: false - } - }, resistedTo: { name: "", type: ConsequenceType.None, isSelected: true }, - icon: "spikes|eyeball|iris", + icon: C.ConsequenceIcons[ConsequenceType.ResolveHarm1], typeDisplay: "Level 1 Harm (Lesser)", attributeVal: 4 } @@ -181,96 +128,39 @@ class GlobalGetter { attribute: AttributeTrait.resolve, attributeVal: 4, name: "Time To Regroup", - resistOptions: { - 0: { - name: "Time to Rest and Recuperate", - isSelected: false - }, - 1: { - name: "Time to Reflect and Reevaluate", - isSelected: false - }, - 2: { - name: "Time to Reorganize and Strategize", - isSelected: false - } - }, resistedTo: { name: "", type: ConsequenceType.None, isSelected: true }, - icon: "horizon|boot|ice", + icon: C.ConsequenceIcons[ConsequenceType.WorsePosition], typeDisplay: "Worse Position" }, 1: { type: ConsequenceType.ComplicationMajor, attribute: AttributeTrait.prowess, name: "Your pick snaps off inside the lock.", - resistOptions: { - 0: { - name: "Lock remains intact but jammed", - isSelected: false, - type: ConsequenceType.ComplicationMinor, - icon: "main" - }, - 1: { - name: "Pick breaks, but lock is still pickable", - isSelected: true, - type: ConsequenceType.ComplicationMinor, - icon: "main", - typeDisplay: "Minor Complication" - }, - 2: { - name: "You manage to extract the broken pick from the lock.", - isSelected: false, - type: ConsequenceType.ComplicationMinor, - icon: "main" - } - }, resistedTo: { name: "Pick breaks, but lock is still pickable", isSelected: true, type: ConsequenceType.ComplicationMinor, - icon: "main", + icon: C.ConsequenceIcons[ConsequenceType.ComplicationMinor], typeDisplay: "Minor Complication" }, attributeVal: 3, - icon: "main", + icon: C.ConsequenceIcons[ConsequenceType.ComplicationMajor], typeDisplay: "Major Complication" }, 2: { type: ConsequenceType.InsightHarm2, attribute: AttributeTrait.insight, name: "Completely Misled", - resistOptions: { - 0: { - name: "Partially Misinformed", - isSelected: false, - type: ConsequenceType.InsightHarm1, - icon: "eye|iris", - typeDisplay: "Level 1 Harm (Lesser)" - }, - 1: { - name: "Confused by Deception", - isSelected: true, - type: ConsequenceType.InsightHarm1, - icon: "eye|iris", - typeDisplay: "Level 1 Harm (Lesser)" - }, - 2: { - name: "Given Partially Incorrect Information", - isSelected: false, - type: ConsequenceType.InsightHarm1, - icon: "eye|iris" - } - }, resistedTo: { name: "Confused by Deception", isSelected: true, type: ConsequenceType.InsightHarm1, typeDisplay: "Level 1 Harm (Lesser)", - icon: "eye|iris" + icon: C.ConsequenceIcons[ConsequenceType.InsightHarm1] }, specialArmorTo: { name: "Sprained Ankle", @@ -280,7 +170,7 @@ class GlobalGetter { icon: C.ConsequenceIcons[ConsequenceType.InsightHarm1], typeDisplay: "Level 1 Harm (Lesser)" }, - icon: "eye|iris", + icon: C.ConsequenceIcons[ConsequenceType.InsightHarm2], typeDisplay: "Level 2 Harm (Moderate)", attributeVal: 4 } @@ -402,6 +292,7 @@ Hooks.once("init", async () => { BladesClockKeeperSheet.Initialize(), BladesPushAlert.Initialize(), BladesRoll.Initialize(), + BladesChat.Initialize(), preloadHandlebarsTemplates() ]); /*~ @@DOUBLE-BLANK@@ ~*/ diff --git a/module/core/constants.js b/module/core/constants.js index ac645884..74481145 100644 --- a/module/core/constants.js +++ b/module/core/constants.js @@ -521,24 +521,24 @@ const C = { [ConsequenceType.None]: "None" }, ConsequenceIcons: { - [ConsequenceType.ReducedEffect]: "main", - [ConsequenceType.ComplicationMinor]: "main", - [ConsequenceType.ComplicationMajor]: "main", - [ConsequenceType.ComplicationSerious]: "main", - [ConsequenceType.LostOpportunity]: "main", - [ConsequenceType.WorsePosition]: "horizon|boot|ice", - [ConsequenceType.InsightHarm1]: "eye|iris", - [ConsequenceType.InsightHarm2]: "eye|iris", - [ConsequenceType.InsightHarm3]: "eye|iris", - [ConsequenceType.InsightHarm4]: "eye|iris", - [ConsequenceType.ProwessHarm1]: "scar", - [ConsequenceType.ProwessHarm2]: "scarTissue", - [ConsequenceType.ProwessHarm3]: "scar|scarTissue", - [ConsequenceType.ProwessHarm4]: "scar|scarTissue|welts", - [ConsequenceType.ResolveHarm1]: "spikes|eyeball|iris", - [ConsequenceType.ResolveHarm2]: "spikes|eyeball|iris", - [ConsequenceType.ResolveHarm3]: "spikes|eyeball|iris", - [ConsequenceType.ResolveHarm4]: "spikes|eyeball|iris", + [ConsequenceType.ReducedEffect]: "reduced-effect", + [ConsequenceType.ComplicationMinor]: "complication-minor", + [ConsequenceType.ComplicationMajor]: "complication-major", + [ConsequenceType.ComplicationSerious]: "complication-serious", + [ConsequenceType.LostOpportunity]: "lost-opportunity", + [ConsequenceType.WorsePosition]: "worse-position", + [ConsequenceType.InsightHarm1]: "harm-insight-1", + [ConsequenceType.InsightHarm2]: "harm-insight-2", + [ConsequenceType.InsightHarm3]: "harm-insight-3", + [ConsequenceType.InsightHarm4]: "harm-insight-4", + [ConsequenceType.ProwessHarm1]: "harm-prowess-1", + [ConsequenceType.ProwessHarm2]: "harm-prowess-2", + [ConsequenceType.ProwessHarm3]: "harm-prowess-3", + [ConsequenceType.ProwessHarm4]: "harm-prowess-4", + [ConsequenceType.ResolveHarm1]: "harm-resolve-1", + [ConsequenceType.ResolveHarm2]: "harm-resolve-2", + [ConsequenceType.ResolveHarm3]: "harm-resolve-3", + [ConsequenceType.ResolveHarm4]: "harm-resolve-4", [ConsequenceType.None]: "" }, RollResultDescriptions: { @@ -559,7 +559,7 @@ const C = { [RollResult.success]: "You fully succeed from a desperate position!", [RollResult.partial]: "You partially succeed from a desperate position!", [RollResult.fail]: "You fail from a desperate position!" - }, + } }, // Colors: { diff --git a/module/core/gsap.js b/module/core/gsap.js index 52f4963f..1cfa8071 100644 --- a/module/core/gsap.js +++ b/module/core/gsap.js @@ -11,56 +11,64 @@ const gsapEffects = { csqEnter: { effect: (csqContainer, config) => { const csqRoot = U.gsap.utils.selector(csqContainer); - // eLog.checkLog3("gsap", "gsapEffects.consequenceEnter -> THIS", {this: this, csqRoot}); + // ELog.checkLog3("gsap", "gsapEffects.consequenceEnter -> THIS", {this: this, csqRoot}); const csqIconCircle = csqRoot(".consequence-icon-circle.base-consequence"); const csqBaseElems = csqRoot(".base-consequence:not(.consequence-icon-circle)"); const csqAcceptElems = csqRoot(".accept-consequence:not(.consequence-icon-circle):not(.consequence-button-container)"); /*~ @@DOUBLE-BLANK@@ ~*/ - const tl = U.gsap.timeline({ paused: true }); + const tl = U.gsap.timeline({ paused: true, defaults: { overwrite: "auto" } }); /*~ @@DOUBLE-BLANK@@ ~*/ // Fade out base-consequence components - tl.fromTo(csqBaseElems, { - opacity: 1 - }, { - opacity: 0, - duration: config.duration / 3, - ease: "none" - }, 0); + if (csqBaseElems.length > 0) { + tl.fromTo(csqBaseElems, { + opacity: 1 + }, { + opacity: 0, + duration: config.duration / 3, + ease: "none" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Fade in accept-consequence components - tl.fromTo(csqAcceptElems, { - opacity: 0 - }, { - opacity: 1, - duration: config.duration / 3, - ease: "none" - }, 0); + if (csqAcceptElems.length > 0) { + tl.fromTo(csqAcceptElems, { + opacity: 0 + }, { + opacity: 1, + duration: config.duration / 3, + ease: "none" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Brighten the entire container slightly - tl.fromTo(csqContainer, { - filter: "brightness(1)" - }, { - filter: `brightness(${config.brightness})`, - duration: config.duration / 3, - ease: "none" - }, 0); + if (csqContainer) { + tl.fromTo(csqContainer, { + filter: "brightness(1)" + }, { + filter: `brightness(${config.brightness})`, + duration: config.duration / 3, + ease: "none" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Enlarge the icon circle, add stroke - tl.fromTo(csqIconCircle, { - xPercent: -50, - yPercent: -50, - scale: 0.75, - outlineColor: C.Colors.dBLACK, - outlineWidth: 0 - }, { - xPercent: -50, - yPercent: -50, - scale: 0.85, - outlineColor: C.Colors.GREY, - outlineWidth: 1, - duration: 0.55, - ease: "sine.out" - }, 0); + if (csqIconCircle.length > 0) { + tl.fromTo(csqIconCircle, { + // xPercent: -50, + // yPercent: -50, + scale: 0.75, + outlineColor: C.Colors.dBLACK, + outlineWidth: 0 + }, { + // xPercent: -50, + // yPercent: -50, + scale: 0.85, + outlineColor: C.Colors.GREY, + outlineWidth: 1, + duration: 0.55, + ease: "sine.out" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ return tl; }, @@ -76,68 +84,90 @@ const gsapEffects = { csqClickIcon: { effect: (csqIconContainer, config) => { const csqRoot = U.gsap.utils.selector(csqIconContainer); + const csqBackgroundImg = U.gsap.utils.selector($(csqIconContainer).parent())(".consequence-bg-image"); const csqInteractionPads = csqRoot(".consequence-interaction-pad"); const csqIconCircleBase = csqRoot(".consequence-icon-circle.base-consequence"); const csqIconCircleAccept = csqRoot(".consequence-icon-circle.accept-consequence"); const csqButtonContainers = csqRoot(".consequence-button-container"); /*~ @@DOUBLE-BLANK@@ ~*/ - const tl = U.gsap.timeline({ paused: true }); + const tl = U.gsap.timeline({ paused: true, defaults: { overwrite: "auto" } }); /*~ @@DOUBLE-BLANK@@ ~*/ // Initialize interaction pads to display: none if (csqInteractionPads.length) { tl.set(csqInteractionPads, { display: "none" }); } /*~ @@DOUBLE-BLANK@@ ~*/ + // Slide out the background + if (csqBackgroundImg.length) { + tl.fromTo(csqBackgroundImg, { + xPercent: -100, + yPercent: -50 + }, { + xPercent: -60, + yPercent: -50, + duration: 0.5, + ease: "back" + }, 0); + } + /*~ @@DOUBLE-BLANK@@ ~*/ // Fade out the base consequence icon circle - tl.fromTo(csqIconCircleBase, { - opacity: 1 - }, { - opacity: 0, - duration: 0.25, - ease: "none" - }, 0); + if (csqIconCircleBase.length > 0) { + tl.fromTo(csqIconCircleBase, { + opacity: 1 + }, { + opacity: 0, + duration: 0.25, + ease: "none" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Fade in the accept consequence icon circle, enlarging the stroke - tl.fromTo(csqIconCircleAccept, { - opacity: 0, - xPercent: -50, - yPercent: -50, - scale: 0.85 - }, { - opacity: 1, - xPercent: -50, - yPercent: -50, - duration: 0.15, - ease: "sine" - }, 0); - /*~ @@DOUBLE-BLANK@@ ~*/ - tl.fromTo(csqIconCircleAccept, { - outlineWidth: 1, - xPercent: -50, - yPercent: -50, - scale: 0.85 - }, { - scale: 1, - xPercent: -50, - yPercent: -50, - outlineWidth: 2, - duration: 0.25, - ease: "sine" - }, 0.175); + if (csqIconCircleAccept.length > 0) { + tl.fromTo(csqIconCircleAccept, { + opacity: 0, + // xPercent: -50, + // yPercent: -50, + scale: 0.85 + }, { + opacity: 1, + // xPercent: -50, + // yPercent: -50, + duration: 0.15, + ease: "sine" + }, 0); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + if (csqIconCircleAccept.length > 0) { + tl.fromTo(csqIconCircleAccept, { + outlineWidth: 1, + // xPercent: -50, + // yPercent: -50, + scale: 0.85 + }, { + scale: 1, + // xPercent: -50, + // yPercent: -50, + outlineWidth: 2, + duration: 0.25, + ease: "sine" + }, 0.175); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Scale and fade in the button containers - tl.fromTo(csqButtonContainers, { - scale: config.scale, - opacity: 0, - filter: "blur(25px)" - }, { - scale: 1, - opacity: 1, - filter: "blur(0px)", - stagger: config.stagger, - duration: config.duration, - ease: `${config.ease}.inOut(${config.easeStrength})` - }, 0); + if (csqButtonContainers.length > 0) { + tl.fromTo(csqButtonContainers, { + scale: config.scale, + opacity: 0, + filter: "blur(25px)" + }, { + scale: 1, + opacity: 1, + filter: "blur(0px)", + stagger: config.stagger, + duration: config.duration, + ease: `${config.ease}.inOut(${config.easeStrength})` + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Finally, toggle on interaction pads if (csqInteractionPads.length) { @@ -165,69 +195,79 @@ const gsapEffects = { const buttonIcon = buttonRoot(".button-icon i"); const buttonLabel = buttonRoot(".consequence-button-label"); /*~ @@DOUBLE-BLANK@@ ~*/ - const tl = U.gsap.timeline({ paused: true }); + const tl = U.gsap.timeline({ paused: true, defaults: { overwrite: "auto" } }); /*~ @@DOUBLE-BLANK@@ ~*/ // Turn type line white - tl.fromTo(typeLine, { - color: C.Colors.RED - }, { - color: C.Colors.WHITE, - duration: 0.5, - ease: "sine.inOut" - }, 0); + if (typeLine.length > 0) { + tl.fromTo(typeLine, { + color: C.Colors.RED + }, { + color: C.Colors.WHITE, + duration: 0.5, + ease: "sine.inOut" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide type line background out from under icon - tl.fromTo(typeLineBg, { - x: 5, - scaleX: 0, - color: C.Colors.RED, - skewX: 0 - }, { - scaleX: 1, - skewX: -45, - color: C.Colors.RED, - duration: 0.5, - ease: "back.out" - }, 0); + if (typeLineBg.length > 0) { + tl.fromTo(typeLineBg, { + x: 5, + scaleX: 0, + color: C.Colors.RED, + skewX: 0 + }, { + scaleX: 1, + skewX: -45, + color: C.Colors.RED, + duration: 0.5, + ease: "back.out" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide accept button background out from under icon - tl.fromTo(buttonBg, { - scaleX: 0, - color: C.Colors.RED, - skewX: 0 - }, { - x: 0, - scaleX: 1, - skewX: -45, - color: C.Colors.RED, - duration: 0.25, - ease: "back.out" - }, 0); + if (buttonBg.length > 0) { + tl.fromTo(buttonBg, { + scaleX: 0, + color: C.Colors.RED, + skewX: 0 + }, { + x: 0, + scaleX: 1, + skewX: -45, + color: C.Colors.RED, + duration: 0.25, + ease: "back.out" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Turn button icon black and scale - tl.fromTo(buttonIcon, { - color: C.Colors.GREY, - opacity: 0.75, - scale: 1 - }, { - color: C.Colors.dBLACK, - scale: 1.25, - opacity: 1, - duration: 0.5, - ease: "sine" - }, 0); + if (buttonIcon.length > 0) { + tl.fromTo(buttonIcon, { + color: C.Colors.GREY, + opacity: 0.75, + scale: 1 + }, { + color: C.Colors.dBLACK, + scale: 1.25, + opacity: 1, + duration: 0.5, + ease: "sine" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Turn button label black, add letter-spacing, bold - tl.fromTo(buttonLabel, { - color: C.Colors.GREY, - fontWeight: 400, - scale: 1 - }, { - color: C.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, 0); + if (buttonLabel.length > 0) { + tl.fromTo(buttonLabel, { + color: C.Colors.GREY, + fontWeight: 400, + scale: 1 + }, { + color: C.Colors.dBLACK, + fontWeight: 800, + duration: 0.75, + ease: "sine" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ return tl; }, @@ -253,17 +293,19 @@ const gsapEffects = { const buttonIcon = buttonRoot(".button-icon i"); const buttonLabel = buttonRoot(".consequence-button-label"); /*~ @@DOUBLE-BLANK@@ ~*/ - const tl = U.gsap.timeline({ paused: true }); + const tl = U.gsap.timeline({ paused: true, defaults: { overwrite: "auto" } }); /*~ @@DOUBLE-BLANK@@ ~*/ // Fade out all accept elems and special armor elems - tl.to([...acceptElems, ...specialArmorElems], { - opacity: 0, - duration: 0.25, - ease: "sine.out" - }); - /*~ @@DOUBLE-BLANK@@ ~*/ - if (typeLine.length) { - // Slide out .consequence-type.resist-consequence from left + if ([...acceptElems, ...specialArmorElems].length > 0) { + tl.to([...acceptElems, ...specialArmorElems], { + opacity: 0, + duration: 0.25, + ease: "sine.out" + }); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + // Slide out .consequence-type.resist-consequence from left + if (typeLine.length > 0) { tl.fromTo(typeLine, { x: -15, scaleX: 0, @@ -280,86 +322,100 @@ const gsapEffects = { } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide out .consequence-resist-button-bg from right - tl.fromTo(buttonBg, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (buttonBg.length > 0) { + tl.fromTo(buttonBg, { + scaleX: 0, + skewX: 0, + opacity: 1 + }, { + scaleX: 1, + skewX: -45, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide out .consequence-footer-bg.resist-consequence from left - tl.fromTo(footerBg, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (footerBg.length > 0) { + tl.fromTo(footerBg, { + scaleX: 0, + skewX: 0, + opacity: 1 + }, { + scaleX: 1, + skewX: -45, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide out .consequence-resist-attribute from left - tl.fromTo(attrElem, { - scaleX: 0, - opacity: 1 - }, { - scaleX: 1, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (attrElem.length > 0) { + tl.fromTo(attrElem, { + scaleX: 0, + opacity: 1 + }, { + scaleX: 1, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide out .consequence-name.resist-consequence from left - tl.fromTo(resistCsqName, { - scaleX: 0, - opacity: 1 - }, { - scaleX: 1, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (resistCsqName.length > 0) { + tl.fromTo(resistCsqName, { + scaleX: 0, + opacity: 1 + }, { + scaleX: 1, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Fade in .consequence-icon-circle.resist-consequence - tl.fromTo(iconCircle, { - opacity: 0 - }, { - opacity: 1, - duration: 0.5, - ease: "back.out" - }, 0); + if (iconCircle.length > 0) { + tl.fromTo(iconCircle, { + opacity: 0 + }, { + opacity: 1, + duration: 0.5, + ease: "back.out" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Turn button icon black and scale - tl.fromTo(buttonIcon, { - color: C.Colors.GREY, - opacity: 0.75, - scale: 1 - }, { - color: C.Colors.dBLACK, - scale: 1.25, - opacity: 1, - duration: 0.5, - ease: "sine" - }, 0); + if (buttonIcon.length > 0) { + tl.fromTo(buttonIcon, { + color: C.Colors.GREY, + opacity: 0.75, + scale: 1 + }, { + color: C.Colors.dBLACK, + scale: 1.25, + opacity: 1, + duration: 0.5, + ease: "sine" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ // Turn button label black, bold - tl.fromTo(buttonLabel, { - color: C.Colors.GREY, - fontWeight: 400, - scale: 1 - }, { - color: C.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, 0); + if (buttonLabel.length > 0) { + tl.fromTo(buttonLabel, { + color: C.Colors.GREY, + fontWeight: 400, + scale: 1 + }, { + color: C.Colors.dBLACK, + fontWeight: 800, + duration: 0.75, + ease: "sine" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ return tl; }, @@ -379,23 +435,19 @@ const gsapEffects = { const specialArmorCsqName = csqRoot(".consequence-name.special-armor-consequence"); const iconCircle = csqRoot(".consequence-icon-circle.special-armor-consequence"); /*~ @@DOUBLE-BLANK@@ ~*/ - const buttonRoot = U.gsap.utils.selector(csqRoot(".consequence-button-container.consequence-special-armor-button-container")); - /*~ @@DOUBLE-BLANK@@ ~*/ - const buttonBg = buttonRoot(".consequence-button-bg"); - const buttonIcon = buttonRoot(".button-icon i"); - const buttonLabel = buttonRoot(".consequence-button-label"); - /*~ @@DOUBLE-BLANK@@ ~*/ - const tl = U.gsap.timeline({ paused: true }); + const tl = U.gsap.timeline({ paused: true, defaults: { overwrite: "auto" } }); /*~ @@DOUBLE-BLANK@@ ~*/ // Fade out all accept elems and resist elems - tl.to([...acceptElems, ...resistElems], { - opacity: 0, - duration: 0.25, - ease: "sine.out" - }); - /*~ @@DOUBLE-BLANK@@ ~*/ - if (typeLine) { - // Slide out .consequence-type.special-armor-consequence from left + if ([...acceptElems, ...resistElems].length > 0) { + tl.to([...acceptElems, ...resistElems], { + opacity: 0, + duration: 0.25, + ease: "sine.out" + }); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + // Slide out .consequence-type.special-armor-consequence from left + if (typeLine.length > 0) { tl.fromTo(typeLine, { x: -15, scaleX: 0, @@ -411,21 +463,8 @@ const gsapEffects = { }, 0); } /*~ @@DOUBLE-BLANK@@ ~*/ - // Slide out .consequence-special-armor-button-bg from right - tl.fromTo(buttonBg, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); - /*~ @@DOUBLE-BLANK@@ ~*/ - if (footerBg) { - // Slide out .consequence-footer-bg.special-armor-consequence from left + // Slide out .consequence-footer-bg.special-armor-consequence from left + if (footerBg.length > 0) { tl.fromTo(footerBg, { scaleX: 0, skewX: 0, @@ -440,7 +479,7 @@ const gsapEffects = { } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide out .consequence-special-armor-message from left - if (footerMsg) { + if (footerMsg.length > 0) { tl.fromTo(footerMsg, { scaleX: 0, opacity: 1 @@ -453,7 +492,7 @@ const gsapEffects = { } /*~ @@DOUBLE-BLANK@@ ~*/ // Slide out .consequence-name.special-armor-consequence from left - if (specialArmorCsqName) { + if (specialArmorCsqName.length > 0) { tl.fromTo(specialArmorCsqName, { scaleX: 0, opacity: 1 @@ -466,38 +505,68 @@ const gsapEffects = { } /*~ @@DOUBLE-BLANK@@ ~*/ // Fade in .consequence-icon-circle.special-armor-consequence - tl.fromTo(iconCircle, { - opacity: 0 - }, { - opacity: 1, - duration: 0.5, - ease: "back.out" - }, 0); - /*~ @@DOUBLE-BLANK@@ ~*/ - // Turn button icon black and scale - tl.fromTo(buttonIcon, { - color: C.Colors.GREY, - opacity: 0.75, - scale: 1 - }, { - color: C.Colors.dBLACK, - scale: 1.25, - opacity: 1, - duration: 0.5, - ease: "sine" - }, 0); + if (iconCircle.length > 0) { + tl.fromTo(iconCircle, { + opacity: 0 + }, { + opacity: 1, + duration: 0.5, + ease: "back.out" + }, 0); + } /*~ @@DOUBLE-BLANK@@ ~*/ - // Turn button label black, bold - tl.fromTo(buttonLabel, { - color: C.Colors.GREY, - fontWeight: 400, - scale: 1 - }, { - color: C.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, 0); + if (csqRoot(".consequence-button-container.consequence-special-armor-button-container").length > 0) { + const buttonRoot = U.gsap.utils.selector(csqRoot(".consequence-button-container.consequence-special-armor-button-container")); + const [buttonBg, buttonIcon, buttonLabel] = [ + buttonRoot(".consequence-button-bg"), + buttonRoot(".button-icon i"), + buttonRoot(".consequence-button-label") + ]; + /*~ @@DOUBLE-BLANK@@ ~*/ + // Slide out .consequence-special-armor-button-bg from right + if (buttonBg.length > 0) { + tl.fromTo(buttonBg, { + scaleX: 0, + skewX: 0, + opacity: 1 + }, { + scaleX: 1, + skewX: -45, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + // Turn button icon black and scale + if (buttonIcon.length > 0) { + tl.fromTo(buttonIcon, { + color: C.Colors.GREY, + opacity: 0.75, + scale: 1 + }, { + color: C.Colors.dBLACK, + scale: 1.25, + opacity: 1, + duration: 0.5, + ease: "sine" + }, 0); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + // Turn button label black, bold + if (buttonLabel.length > 0) { + tl.fromTo(buttonLabel, { + color: C.Colors.GREY, + fontWeight: 400, + scale: 1 + }, { + color: C.Colors.dBLACK, + fontWeight: 800, + duration: 0.75, + ease: "sine" + }, 0); + } + } /*~ @@DOUBLE-BLANK@@ ~*/ return tl; }, @@ -610,7 +679,7 @@ const gsapEffects = { }, hoverTooltip: { effect: (tooltip, config) => { - const tl = U.gsap.timeline({ paused: true }); + const tl = U.gsap.timeline({ paused: true, defaults: { overwrite: "auto" } }); if (!tooltip) { return tl; } diff --git a/module/core/helpers.js b/module/core/helpers.js index 19205338..5ff846b1 100644 --- a/module/core/helpers.js +++ b/module/core/helpers.js @@ -1,7 +1,5 @@ // #region ▮▮▮▮▮▮▮ IMPORTS ▮▮▮▮▮▮▮ ~ import U from "./utilities.js"; -/*~ @@DOUBLE-BLANK@@ ~*/ -import { SVGDATA } from "./constants.js"; // #endregion ▮▮▮▮[IMPORTS]▮▮▮▮ /*~ @@DOUBLE-BLANK@@ ~*/ // #region ░░░░░░░[Templates]░░░░ Preload Partials, Components & Overlay Templates ░░░░░░░ ~ @@ -196,19 +194,7 @@ const handlebarHelpers = { }, compileSvg(...args) { const [svgDotKey, svgPaths] = args; - const svgData = getProperty(SVGDATA, svgDotKey); - eLog.checkLog3("compileSvg", { svgDotKey, svgPaths, svgData }); - if (!svgData) { - return ""; - } - const { viewBox, paths, classes } = svgData; - return [ - ``, - ...svgPaths - .split("|") - .map((path) => ``), - "" - ].join("\n"); + return U.getSvgCode(svgDotKey, svgPaths); }, eLog(...args) { args.pop(); diff --git a/module/core/utilities.js b/module/core/utilities.js index 18c7b4a2..c42927d1 100644 --- a/module/core/utilities.js +++ b/module/core/utilities.js @@ -1,5 +1,5 @@ // #region ▮▮▮▮▮▮▮ IMPORTS ▮▮▮▮▮▮▮ ~ -import C from "./constants.js"; +import C, { SVGDATA } from "./constants.js"; // eslint-disable-next-line import/no-unresolved import { gsap } from "/scripts/greensock/esm/all.js"; // #endregion ▮▮▮▮ IMPORTS ▮▮▮▮ @@ -963,55 +963,43 @@ const objClean = (data, remVals = [undefined, null, "", {}, []]) => { return data; }; /*~ @@DOUBLE-BLANK@@ ~*/ -/** - * - * @param items - * @param key - */ -export function toDict(items, key) { - const dict = {}; - const mappedItems = items - .map((data) => { - let { iData } = data; - if (!iData) { - iData = data; - } - const prefix = iData.linkName || iData.sourceItem?.name ? `>${iData.type.charAt(0)}>` : ""; - const newKey = `${prefix}${iData[key]}`; - return [newKey, iData]; - }) - .sort(([a], [b]) => a.localeCompare(b)); - mappedItems.forEach(([newKey, iData]) => { - if (newKey in dict) { - newKey = indexString(newKey); - } - dict[newKey] = iData; - }); - // @ts-expect-error Oh it definitely does. - return dict; - /*~ @@DOUBLE-BLANK@@ ~*/ - /** - * Given a string that could have an index suffix, returns the string with - * the suffix incremented by one, or set to one if no suffix exists. - * @param {string} str - */ - function indexString(str) { - if (/_\d+$/.test(str)) { - const [curIndex, ...subStr] = [...str.split(/_/)].reverse(); - return [ - ...[...subStr].reverse(), - parseInt(curIndex, 10) + 1 - ].join("_"); - } - return `${str}_1`; - } -} // Given an object and a predicate function, returns array of two objects: // one with entries that pass, one with entries that fail. const partition = (obj, predicate = () => true) => [ objFilter(obj, predicate), objFilter(obj, (v, k) => !predicate(v, k)) ]; +/*~ @@DOUBLE-BLANK@@ ~*/ +/** + * Zips two arrays into an object. + * + * @template T - The type of the keys. + * @template U - The type of the values. + * @param {T[]} keys - The array of keys. + * @param {U[]} values - The array of values. + * @returns {Record} - The resulting object. + * @throws {Error} - Throws an error if the arrays are not of equal length, if the keys are not unique, or if the keys are not of a type that can be used as object keys. + */ +const zip = (keys, values) => { + // Check that the arrays are of equal length + if (keys.length !== values.length) { + throw new Error("The arrays must be of equal length."); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + // Check that the keys are unique + if (new Set(keys).size !== keys.length) { + throw new Error("The keys must be unique."); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + // Zip the arrays into an object + const result = {}; + keys.forEach((key, i) => { + result[key] = values[i]; + }); + /*~ @@DOUBLE-BLANK@@ ~*/ + return result; +}; +/*~ @@DOUBLE-BLANK@@ ~*/ /** * An object-equivalent Array.map() function, which accepts mapping functions to transform both keys and values. * If only one function is provided, it's assumed to be mapping the values and will receive (v, k) args. @@ -1366,6 +1354,48 @@ const withLog = (fn) => { /*~ @@DOUBLE-BLANK@@ ~*/ // #region ████████ HTML: Parsing HTML Code, Manipulating DOM Objects ████████ ~ /*~ @@DOUBLE-BLANK@@ ~*/ +const getSvgCode = (svgDotKey, svgPathKeys) => { + const svgData = getProperty(SVGDATA, svgDotKey); + // eLog.checkLog3("compileSvg", {svgDotKey, svgPaths, svgData}); + if (!svgData) { + return ""; + } + const { viewBox, paths, classes } = svgData; + svgPathKeys ??= Object.keys(paths).join("|"); + if (typeof svgPathKeys === "string") { + svgPathKeys = svgPathKeys.split("|"); + } + return [ + ``, + ...svgPathKeys + .map((path) => ``), + "" + ].join("\n"); +}; +/*~ @@DOUBLE-BLANK@@ ~*/ +const getSvgPaths = (svgDotKey, svgPathKeys) => { + const svgData = getProperty(SVGDATA, svgDotKey); + if (!svgData) { + return {}; + } + const { paths, classes } = svgData; + svgPathKeys ??= Object.keys(paths); + if (typeof svgPathKeys === "string") { + svgPathKeys = svgPathKeys.split("|"); + } + /*~ @@DOUBLE-BLANK@@ ~*/ + const returnData = {}; + /*~ @@DOUBLE-BLANK@@ ~*/ + for (const pathKey of svgPathKeys) { + returnData[pathKey] = { + class: classes?.[pathKey] ?? "", + d: paths[pathKey] ?? "" + }; + } + /*~ @@DOUBLE-BLANK@@ ~*/ + return returnData; +}; +/*~ @@DOUBLE-BLANK@@ ~*/ // #region ░░░░░░░[GreenSock]░░░░ Wrappers for GreenSock Functions ░░░░░░░ ~ const set = (targets, vars) => gsap.set(targets, vars); /** @@ -1386,6 +1416,20 @@ function get(target, property, unit) { } /*~ @@DOUBLE-BLANK@@ ~*/ const getGSAngleDelta = (startAngle, endAngle) => signNum(roundNum(getAngleDelta(startAngle, endAngle), 2)).replace(/^(.)/, "$1="); +/*~ @@DOUBLE-BLANK@@ ~*/ +// const Animate = { +// Timeline: { +// to: (tl: gsap.core.Timeline, targets: gsap.TweenTarget[], vars: gsap.TweenVars, position: any) => { +// if (targets.length === 0) { +/*~ @@DOUBLE-BLANK@@ ~*/ +// } +// } +// } (tl: gsap.core.Timeline, ) +// } +/*~ @@DOUBLE-BLANK@@ ~*/ +// const to = (targets: gsap.TweenTarget[], vars: gsap.TweenVars): gsap.core.Tween => { +// gsap. +// } // #endregion ░░░░[GreenSock]░░░░ /*~ @@DOUBLE-BLANK@@ ~*/ // #region ░░░░░░░[SVG]░░░░ SVG Generation & Manipulation ░░░░░░░ ~ @@ -1453,10 +1497,7 @@ const getRGBString = (red, green, blue, alpha) => { return null; }; const getHEXString = (red, green, blue) => { - /** - * - * @param c - */ + /*~ @@DOUBLE-BLANK@@ ~*/ function componentToHex(c) { const hex = c.toString(16); return hex.length === 1 ? `0${hex}` : hex; @@ -1695,7 +1736,7 @@ export default { subGroup, shuffle, /*~ @@DOUBLE-BLANK@@ ~*/ // ████████ OBJECTS: Manipulation of Simple Key/Val Objects ████████ - remove, replace, partition, + remove, replace, partition, zip, objClean, objSize, objMap, objFindKey, objFilter, objForEach, objCompact, objClone, objMerge, objDiff, objExpand, objFlatten, objNullify, objFreezeProps, @@ -1704,6 +1745,8 @@ export default { getDynamicFunc, withLog, /*~ @@DOUBLE-BLANK@@ ~*/ // ████████ HTML: Parsing HTML Code, Manipulating DOM Objects ████████ + getSvgCode, getSvgPaths, + /*~ @@DOUBLE-BLANK@@ ~*/ // ░░░░░░░ GreenSock ░░░░░░░ gsap, get, set, getGSAngleDelta, /*~ @@DOUBLE-BLANK@@ ~*/ @@ -1720,6 +1763,7 @@ export default { /*~ @@DOUBLE-BLANK@@ ~*/ // EVENT HANDLERS EventHandlers, + /*~ @@DOUBLE-BLANK@@ ~*/ // ░░░░░░░ SYSTEM: System-Specific Functions (Requires Configuration of System ID in constants.js) ░░░░░░░ isDocID, loc, getSetting, getTemplatePath, displayImageSelector /*~ @@DOUBLE-BLANK@@ ~*/ diff --git a/package-lock.json b/package-lock.json index 12c5bf6c..6181544a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "devDependencies": { "@es-joy/jsdoccomment": "^0.41.0", "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", + "@stylistic/eslint-plugin": "^1.3.1", "@tsconfig/node16": "^1.0.3", "@types/jquery": "^3.5.27", "@types/node": "^18.11.4", @@ -3063,6 +3064,177 @@ "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==", "dev": true }, + "node_modules/@stylistic/eslint-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-1.3.1.tgz", + "integrity": "sha512-XDcQRvtiOkQwabDbshIMlq1XLK+D55ZDaI+MVMRpRKIc3wZIHaD3vplisRUhzTVsVRNHPNen1RbF8ue+5M8YcA==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "1.3.1", + "@stylistic/eslint-plugin-jsx": "1.3.1", + "@stylistic/eslint-plugin-ts": "1.3.1" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@stylistic/eslint-plugin-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-1.3.1.tgz", + "integrity": "sha512-oS89pWtsPmku8EBEwCI1Oz7ctTvCXd2z/WWSmXchOxajrfnFckcxAmttrLMLTRMXrpx6qNfkOss/ivUVUK/d+A==", + "dev": true, + "dependencies": { + "acorn": "^8.11.2", + "escape-string-regexp": "^4.0.0", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "graphemer": "^1.4.0" + } + }, + "node_modules/@stylistic/eslint-plugin-js/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@stylistic/eslint-plugin-jsx": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-1.3.1.tgz", + "integrity": "sha512-yq+sQHsYm6IaBsER7k2bEjdHGMGJhq4RdC1OUMPreyYz9hrPO5JMn2yyeHz4dPRvmmBguTBsrLfmrKPIZdGN6A==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "^1.3.1", + "estraverse": "^5.3.0" + } + }, + "node_modules/@stylistic/eslint-plugin-jsx/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-1.3.1.tgz", + "integrity": "sha512-reMbcxgHOICBKJwMgWIUl6ZdRpSKjG/CHrfXIWlEODGU1np9afO7Mqf4UcxtD0F/FAbrqsEZTLlt5EaH7OBgAw==", + "dev": true, + "dependencies": { + "@stylistic/eslint-plugin-js": "1.3.1", + "@typescript-eslint/utils": "^6.11.0", + "graphemer": "^1.4.0" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/scope-manager": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.11.0.tgz", + "integrity": "sha512-0A8KoVvIURG4uhxAdjSaxy8RdRE//HztaZdG8KiHLP8WOXSk0vlF7Pvogv+vlJA5Rnjj/wDcFENvDaHb+gKd1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/types": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.11.0.tgz", + "integrity": "sha512-ZbEzuD4DwEJxwPqhv3QULlRj8KYTAnNsXxmfuUXFCxZmO6CF2gM/y+ugBSAQhrqaJL3M+oe4owdWunaHM6beqA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.11.0.tgz", + "integrity": "sha512-Aezzv1o2tWJwvZhedzvD5Yv7+Lpu1by/U1LZ5gLc4tCx8jUmuSCMioPFRjliN/6SJIvY6HpTtJIWubKuYYYesQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/visitor-keys": "6.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/utils": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.11.0.tgz", + "integrity": "sha512-p23ibf68fxoZy605dc0dQAEoUsoiNoP3MD9WQGiHLDuTSOuqoTsa4oAy+h3KDkTcxbbfOtUjb9h3Ta0gT4ug2g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.11.0", + "@typescript-eslint/types": "6.11.0", + "@typescript-eslint/typescript-estree": "6.11.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@stylistic/eslint-plugin-ts/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.11.0.tgz", + "integrity": "sha512-+SUN/W7WjBr05uRxPggJPSzyB8zUpaYo2hByKasWbqr3PM8AXfZt8UHdNpBS1v9SA62qnSSMF3380SwDqqprgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.11.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -13682,6 +13854,18 @@ "node": ">=8" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", diff --git a/package.json b/package.json index 30be749c..7c5e69a7 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "devDependencies": { "@es-joy/jsdoccomment": "^0.41.0", "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", + "@stylistic/eslint-plugin": "^1.3.1", "@tsconfig/node16": "^1.0.3", "@types/jquery": "^3.5.27", "@types/node": "^18.11.4", diff --git a/scss/chat/_chat.scss b/scss/chat/_chat.scss index 13efcec1..25c1fce9 100644 --- a/scss/chat/_chat.scss +++ b/scss/chat/_chat.scss @@ -1,6 +1,22 @@ .chat-message { + --bg-controlled: var(--blades-grey-bright); + --bg-risky: var(--blades-black-dark); + --bg-desperate: var(--blades-red-darkest); +} + +.chat-message:last-child { + --bg-controlled: url("../assets/animations/chat/roll-position-controlled.webp"); + --bg-risky: url("../assets/animations/chat/roll-position-risky.webp"); + --bg-desperate: url("../assets/animations/chat/roll-position-desperate.webp"); +} + + +.chat-message { + background: var(--blades-black-dark); + overflow: hidden; + position: relative; + - background: var(--blades-black); .message-header { position: relative; z-index: 1; @@ -21,7 +37,7 @@ z-index: 0; &.roll-position-risky { - background-image: url("../assets/animations/chat/roll-position-risky.webp"); + background: var(--bg-risky); background-size: cover; } } @@ -48,49 +64,98 @@ color: var(--blades-gold); } - .roll-states { + .roll-outcome-container { justify-content: space-between; - padding: 0 20px; + padding: 0 10px; + align-items: center; + margin: 5px 0 10px 0; - .roll-state-container { - flex-basis: 30%; - flex-grow: 0; - flex-shrink: 0; + &.roll-result-critical { + --background-color: var(--blades-gold-bright); + --label-color: var(--blades-black); + } + &.roll-result-success { + --background-color: var(--blades-white-bright); + --label-color: var(--blades-black); + } + &.roll-result-partial { + --background-color: var(--blades-black); + --label-color: var(--blades-white); + } + &.roll-result-fail { + --background-color: var(--blades-red-darkest); + --label-color: var(--blades-red-bright); } - h4.roll-state-label { - font-family: var(--font-primary); - // border-bottom: 1px solid white; - font-size: 12px; - display: block; - width: 100%; - text-align: center; - white-space: nowrap; - color: var(--blades-grey); - margin-top: -4px; + background: var(--background-color); + + .roll-state-container { + flex-basis: 10%; + flex-grow: 0.3; + flex-shrink: 1; + + h4.roll-state-label { + font-family: var(--font-primary); + // border-bottom: 1px solid white; + font-size: 12px; + display: block; + width: 100%; + text-align: center; + white-space: nowrap; + color: var(--blades-grey); + margin-top: -4px; + text-shadow: var(--text-shadow-dark); + } + + h3.roll-state { + white-space: nowrap; + text-shadow: var(--text-shadow-dark); + } } - h3.roll-state { - white-space: nowrap; + .roll-result-container { + .roll-result-label { + background: none; + box-shadow: none; + color: var(--label-color); + white-space: nowrap; + margin: 0; + padding: 0; + + &.roll-result-top-label { + font-size: 26px; + line-height: 26px; + } + &.roll-result-bottom-label { + font-size: 14px; + font-family: var(--font-emphasis-narrow); + + } + &.roll-result-main-label { + + } + } } + + } - h2.chat-header.roll-position { - text-align: right; - font-family: var(--font-primary); + // h2.chat-header.roll-position { + // text-align: right; + // font-family: var(--font-primary); - .position-text { - margin: 0 15px; - transform-origin: 50% 50%; - scale: 1.5; - display: inline-block; - font-family: var(--font-emphasis); + // .position-text { + // margin: 0 15px; + // transform-origin: 50% 50%; + // scale: 1.5; + // display: inline-block; + // font-family: var(--font-emphasis); - &.position-text-controlled {} - &.position-text-risky {} - &.position-text-desperate { } - } - } + // &.position-text-controlled {} + // &.position-text-risky {} + // &.position-text-desperate { } + // } + // } .dice-roll-strip { display: flex; @@ -101,7 +166,7 @@ align-items: stretch; justify-content: center; gap: 10px; - margin: 10px 0; + margin: 5px 0; .blades-die { display: block; diff --git a/scss/components/_clocks-overlay.scss b/scss/components/_clocks-overlay.scss index 1e3d4e3e..acc755c6 100644 --- a/scss/components/_clocks-overlay.scss +++ b/scss/components/_clocks-overlay.scss @@ -165,7 +165,7 @@ $label-positions: ( &:not(.active-key) { .key-label { color: var(--blades-white); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: toRem(40px); top: unset; width: 200px; @@ -191,7 +191,7 @@ $label-positions: ( // width: 100%; .short-label { font-size: toRem(40px); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-shadow: 0 0 15px var(--blades-black-dark), 0 0 15px var(--blades-black-dark), diff --git a/scss/components/_comps.scss b/scss/components/_comps.scss index 60c6f5b7..158d0f2b 100644 --- a/scss/components/_comps.scss +++ b/scss/components/_comps.scss @@ -446,7 +446,7 @@ } .comp-body-text { - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); hyphens: auto; text-align: justify; padding: 0 toRem(5px) 0 0; @@ -833,7 +833,7 @@ // } .comp.consequence-display-container { --container-height: 40px; - --container-left-shift: 70px; + --container-left-shift: 40px; --csq-icon-bg-color: var(--blades-black-dark); --csq-type-bg: var(--csq-icon-dark); @@ -924,6 +924,19 @@ --csq-name-color: var(--blades-blue-bright); } + .consequence-bg-image { + // background: rgba(0, 255, 255, 0.25); + position: absolute; + height: 500%; + top: 80%; + transform: translate(-100%, -50%); + transform-origin: 0% 50%; + width: calc(200px * 4.041); + min-width: calc(200px * 4.041); + z-index: -1; + left: -10px; + } + .consequence-interaction-pad { display: none; display: block; @@ -953,8 +966,9 @@ .consequence-icon-container { position: relative; - height: calc(var(--container-height) * 0.75); - max-width: calc(var(--container-height) * 0.75); + + height: var(--container-height); // calc(var(--container-height) * 0.75); + max-width: var(--container-height); // calc(var(--container-height) * 0.75); background: transparent; left: var(--container-left-shift); z-index: 1; @@ -967,21 +981,29 @@ .consequence-icon-circle { position: absolute; - translate: -50% -50%; + // transform: translate(-50%, -50%); + // translate: -50% -50%; transform-origin: 100% 0%; - top: calc(var(--container-height) * 0.5); - left: calc(var(--container-height) * 0.5); + // top: calc(var(--container-height) * 0.5); + // left: calc(var(--container-height) * 0.5); border-radius: 50%; height: var(--container-height); width: var(--container-height); outline: 1px solid var(--csq-icon-med); background: var(--csq-icon-bg-color); - display: flex; - justify-content: center; - align-items: center; + // display: flex; + // justify-content: center; + // align-items: center; z-index: 1; + top: 0px; + left: 0px; + overflow: hidden; svg { + position: absolute; + transform: translate(-50%, -50%); + top: 50%; + left: 50%; height: 80%; width: 80%; display: block; @@ -997,7 +1019,7 @@ } &.base-consequence { - scale: 0.75; + transform: scale(0.75); animation: icon-glow 2s ease infinite; pointer-events: auto; @@ -1026,7 +1048,7 @@ display: flex; flex-direction: row; flex-wrap: nowrap; - bottom: -10px; + bottom: 0px; .consequence-button-bg { position: absolute; @@ -1042,12 +1064,16 @@ &.consequence-special-armor-button-bg { transform-origin: 100% 50%; } + + &.consequence-special-armor-button-bg { + width: calc(100% + 32px) + } } .consequence-button-label { position: relative; z-index: 1; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: 14px; color: var(--blades-grey); @@ -1086,7 +1112,7 @@ } } &.consequence-accept-button-container { - left: 140%; + left: 105%; .consequence-button-bg { right: -7px; @@ -1125,7 +1151,7 @@ // left: calc(var(--container-height) + var(--container-left-shift) - 75px); transform-origin: 0% 50%; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; text-align: right; font-size: 10px; @@ -1149,12 +1175,13 @@ padding: 0 5px 0 35px; font-size: 14px; line-height: 17px; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-variant: small-caps; transform-origin: 0% 50%; // text-shadow: var(--text-shadow-dark); color: var(--csq-icon-bright); font-style: italic; + white-space: nowrap; &.resist-consequence { // color: var(--blades-black-dark); @@ -1194,7 +1221,7 @@ .consequence-footer-message { position: absolute; white-space: nowrap; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); font-size: 10px; @@ -1231,12 +1258,12 @@ filter: brightness(1.5) drop-shadow(0 0 4px black); } .roll-consequence-type-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 150px; } .roll-consequence-attribute-select { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); flex-basis: 95px; } .consequence-name { @@ -1263,7 +1290,7 @@ font-size: 10px; line-height: 10px; max-height: 14px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); } .consequence-name { diff --git a/scss/components/_dotlines.scss b/scss/components/_dotlines.scss index 60f96fdb..68cf8b58 100644 --- a/scss/components/_dotlines.scss +++ b/scss/components/_dotlines.scss @@ -108,7 +108,7 @@ position: absolute; cursor: pointer; pointer-events: auto; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; font-size: 16px; font-weight: bold; diff --git a/scss/components/_push-notifications.scss b/scss/components/_push-notifications.scss index 6cf3f18a..34b7dad8 100644 --- a/scss/components/_push-notifications.scss +++ b/scss/components/_push-notifications.scss @@ -1,8 +1,6 @@ & { overflow: visible; - --font-primary: "Minion Pro", serif; - #blades-push-notifications { height: auto; width: 300px; @@ -47,7 +45,7 @@ .header { width: 100%; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-weight: bold; color: var(--blades-black-dark); text-align: left; diff --git a/scss/components/_turf-block.scss b/scss/components/_turf-block.scss index 4a4a2fd6..b34841fd 100644 --- a/scss/components/_turf-block.scss +++ b/scss/components/_turf-block.scss @@ -113,7 +113,7 @@ box-shadow: none; /* Font & Text */ - font-family: var(--font-emphasis-narrow); + font-family: var(--font-emphasis-narrower); font-size: var(--name-size); font-weight: bold; text-align: center; @@ -252,7 +252,7 @@ border-radius: 7px; outline: 1px outset var(--blades-white); - font-family: var(--font-emphasis-narrow); + font-family: var(--font-emphasis-narrower); font-size: toRem(14px); line-height: toRem(20px); text-align: center; diff --git a/scss/core/_app.scss b/scss/core/_app.scss index 885327cf..3dba4812 100644 --- a/scss/core/_app.scss +++ b/scss/core/_app.scss @@ -97,7 +97,7 @@ // .tab-selector { // color: var(--blades-black); // padding: 0 toRem(5px); - // font-family: Kirsty; + // font-family: var(--font-emphasis); // line-height: toRem(20px); // transition: 0.25s; // white-space: nowrap; diff --git a/scss/core/_globals.scss b/scss/core/_globals.scss index 49274237..92b26403 100644 --- a/scss/core/_globals.scss +++ b/scss/core/_globals.scss @@ -119,7 +119,7 @@ height: var(--nc-size); width: var(--nc-size); font-weight: bold; - font-family: "Minion Pro Caption Cond", serif; + font-family: var(--font-primary-small-narrow); font-size: var(--nc-font-size); text-align: center; border-radius: var(--nc-border-radius); @@ -447,7 +447,7 @@ .pc-summary-heritage { grid-area: heritage; font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; line-height: 20px; text-align: right; @@ -475,13 +475,13 @@ margin-top: 5px; } label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: toRem(12px); line-height: toRem(12px); color: var(--blades-white); } span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: toRem(12px); line-height: toRem(12px); color: var(--blades-white-bright); @@ -497,7 +497,7 @@ display: flex; flex-direction: row; label { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: toRem(10px); line-height: toRem(10px); color: var(--blades-grey-bright); @@ -505,7 +505,7 @@ text-align: right; } span { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: toRem(10px); line-height: toRem(10px); color: var(--blades-white-bright); @@ -619,7 +619,7 @@ .pc-summary-trauma { color: var(--blades-red-bright); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; font-size: 12px; text-transform: uppercase; text-align: center; @@ -902,7 +902,7 @@ } } - *:not(i) { font-family: "Minion Pro Cond", serif } + *:not(i) { font-family: var(--font-primary-narrow) } textarea { resize: none; diff --git a/scss/core/_reset.scss b/scss/core/_reset.scss index 4a6f966c..120b6670 100644 --- a/scss/core/_reset.scss +++ b/scss/core/_reset.scss @@ -172,7 +172,7 @@ line-height: 1; margin-top: toRem(-1px); - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; transform-origin: center center; transform: scaleY(0.75); &::before { diff --git a/scss/core/_vars.scss b/scss/core/_vars.scss index a72569c6..91798a12 100644 --- a/scss/core/_vars.scss +++ b/scss/core/_vars.scss @@ -286,32 +286,34 @@ $isCompactLayout: true; // #region ░░░░░░░[Style Components]░░░░: Defining Components; Do Not USE Outside of Vars.scss ░░░░░░░ --font-primary: "Minion Pro", serif; // "Signika", sans-serif; + --font-primary: "Beaufort", serif; --font-primary-smallcaps: var(--font-primary); - --font-primary-small: "Minion Pro Caption"; - --font-primary-narrow: "Minion Pro Cond"; - --font-primary-small-narrow: "Minion Pro Caption Cond"; + --font-primary-small: "Minion Pro Caption", serif; + --font-primary-narrow: "Minion Pro Cond", serif; + --font-primary-small-narrow: "Minion Pro Caption Cond", serif; - --font-primary-alt: "Historical FellType"; - --font-primary-alt-smallcaps: "Historical FellType SC"; + --font-primary-alt: "Historical FellType", serif; + --font-primary-alt-smallcaps: "Historical FellType SC", serif; - --font-emphasis: "Kirsty"; - --font-emphasis-smallcaps: var(--font-emphasis); - --font-emphasis-alt: "Ravenscroft"; - --font-emphasis-alt-smallcaps: var(--font-emphasis-alt); - --font-emphasis-narrow: "Fjalla One"; + --font-emphasis: "Kirsty", serif; + --font-emphasis-smallcaps: "Kirsty", serif; + --font-emphasis-alt: "Ravenscroft", serif; + --font-emphasis-alt-smallcaps: var(--font-emphasis-alt), serif; + --font-emphasis-narrow: "Oswald", sans-serif; + --font-emphasis-narrower: "Fjalla One", sans-serif; --font-mono: "Pragmata", monospace; // monospace; --font-mono-smallcaps: var(--font-mono); - --font-decorative: "UglyQua"; - --font-decorative-alt: "IM FELL Double Pica"; - --font-decorative-alt-smallcaps: "IM FELL Double Pica SC"; + --font-decorative: "UglyQua", serif; + --font-decorative-alt: "IM FELL Double Pica", serif; + --font-decorative-alt-smallcaps: "IM FELL Double Pica SC", serif; - --font-handwritten: "PWSignaturetwo"; + --font-handwritten: "PWSignaturetwo", serif; - --font-awesome: "Font Awesome 6 Pro"; - --font-awesome-alt: "Font Awesome 6 Brands"; - --font-awesome-duotone: "Font Awesome 6 Duotone"; + --font-awesome: "Font Awesome 6 Pro", sans-serif; + --font-awesome-alt: "Font Awesome 6 Brands", sans-serif; + --font-awesome-duotone: "Font Awesome 6 Duotone", sans-serif; --line-height-expanded: 1.4; --line-height-primary: 1.2; diff --git a/scss/dialog/_dialogs.scss b/scss/dialog/_dialogs.scss index 4d41d6b7..4ea5bdb2 100644 --- a/scss/dialog/_dialogs.scss +++ b/scss/dialog/_dialogs.scss @@ -234,7 +234,7 @@ .button-icon { position: unset } - .blades-select { font-family: Oswald, sans-serif } + .blades-select { font-family: var(--font-emphasis-narrow) } } } diff --git a/scss/fonts.scss b/scss/fonts.scss index 96b4ffcb..caab271c 100644 --- a/scss/fonts.scss +++ b/scss/fonts.scss @@ -339,4 +339,74 @@ font-family: "UglyQua"; src: url("../assets/fonts/UglyQua/UglyQua i.ttf") format("truetype"); font-style: italic; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort B.otf") format("opentype"); + font-style: normal; + font-weight: 700; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Bi.otf") format("opentype"); + font-style: italic; + font-weight: 700; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort S.otf") format("opentype"); + font-style: normal; + font-weight: 600; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Si.otf") format("opentype"); + font-style: italic; + font-weight: 600; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort M.otf") format("opentype"); + font-style: normal; + font-weight: 500; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Mi.otf") format("opentype"); + font-style: italic; + font-weight: 500; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort L.otf") format("opentype"); + font-style: normal; + font-weight: light; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort Li.otf") format("opentype"); + font-style: italic; + font-weight: light; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort.otf") format("opentype"); + font-style: normal; + font-weight: normal; +} + +@font-face { + font-family: "Beaufort"; + src: url("../assets/fonts/Beaufort/Beaufort i.otf") format("opentype"); + font-style: italic; + font-weight: normal; } \ No newline at end of file diff --git a/scss/sheets/_cohort-sheet.scss b/scss/sheets/_cohort-sheet.scss index ef601d83..85a73c72 100644 --- a/scss/sheets/_cohort-sheet.scss +++ b/scss/sheets/_cohort-sheet.scss @@ -64,7 +64,7 @@ line-height: 20px; font-style: italic; font-size: toRem(14px); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-align: center; white-space: nowrap; width: 100%; diff --git a/scss/sheets/_npc-sheet.scss b/scss/sheets/_npc-sheet.scss index 34eb189a..83fa62a1 100644 --- a/scss/sheets/_npc-sheet.scss +++ b/scss/sheets/_npc-sheet.scss @@ -237,7 +237,7 @@ .randomizer-input { background: var(--blades-grey); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-indent: 5px; line-height: 2rem; diff --git a/scss/sheets/_roll-collab-sheet.scss b/scss/sheets/_roll-collab-sheet.scss index 133d22f8..fa235d03 100644 --- a/scss/sheets/_roll-collab-sheet.scss +++ b/scss/sheets/_roll-collab-sheet.scss @@ -190,7 +190,7 @@ .roll-mod-text { font-size: 10px; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); text-transform: uppercase; margin: 0 10px 0 0; color: var(--blades-white); @@ -236,8 +236,8 @@ .roll-mod-container { --roll-mod-size: 30px; - --label-font: Kirsty; - --sidestring-font: Oswald; + --label-font: var(--font-emphasis); + --sidestring-font: var(--font-emphasis-narrow); --glow-animation: anim-glow-gold; --roll-mod-bright-color: var(--blades-gold-bright); @@ -256,7 +256,7 @@ .roll-mod-label { .roll-mod-text:last-of-type { - --label-font: Oswald; + --label-font: var(--font-emphasis-narrow); font-weight: bold; } } @@ -526,14 +526,13 @@ display: block; // text-align: center; font-family: var(--label-font); - // font-family: "Oswald"; // font-variant: small-caps; margin-left: 15px; line-height: var(--roll-mod-size); // margin-top: 2px; &.roll-mod-sidestring { - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); margin-left: 5px; text-transform: uppercase; font-size: 14px; @@ -1486,7 +1485,7 @@ .roll-num-container.factor-spacer { height: var(--spread-size, 30px); width: var(--spread-size, 30px); - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; line-height: calc(var(--spread-size, 30px) - 2px); border: 1px var(--roll-factor-inactive-border-style, solid) var(--roll-factor-inactive-border); @@ -1803,7 +1802,7 @@ .num-spread-label { position: absolute; - font-family: Oswald, sans-serif; + font-family: var(--font-emphasis-narrow); font-size: 10px; // transform: -50% 0%; left: 0%; diff --git a/scss/sheets/_sheets.scss b/scss/sheets/_sheets.scss index 68c329be..ee62bb07 100644 --- a/scss/sheets/_sheets.scss +++ b/scss/sheets/_sheets.scss @@ -72,7 +72,7 @@ width: 100%; background-color: rgb(255, 255, 0); font-weight: bold; - font-family: Kirsty, serif; + font-family: var(--font-emphasis), serif; text-align: center; font-size: toRem(14px); color: var(--blades-black); diff --git a/scss/style.scss b/scss/style.scss index 1c0bb192..5376da8d 100644 --- a/scss/style.scss +++ b/scss/style.scss @@ -52,7 +52,7 @@ figcaption { text-shadow: 1px 1px 3px #000, 1px 1px 3px #000, 1px 1px 3px #000, 0px 0px 5px #000; - font-family: Kirsty, serif !important; + font-family: var(--font-emphasis), serif !important; line-height: 2rem; padding: 0 25%; } @@ -93,8 +93,7 @@ &, * { - --font-primary: "Minion Pro"; - --font-heading: "Kirsty"; + --font-heading: var(--font-emphasis); --font-weight-heading: normal; --text-shadow-heading: none; --line-height-heading: 1.2; diff --git a/templates/chat/roll-result-action-roll.hbs b/templates/chat/roll-result-action-roll.hbs index 7c515888..10bc9402 100644 --- a/templates/chat/roll-result-action-roll.hbs +++ b/templates/chat/roll-result-action-roll.hbs @@ -1,3 +1,5 @@ +{{log ">> THIS >>" this}} +
@@ -15,33 +17,47 @@ {{/if}} - {{!-- Position & Effect --}} -
+ {{!-- Dice Rolls --}} +
{{{dieValsHTML}}}
+ + {{!-- Position / Result / Effect --}} +
+ + {{!-- Position --}}

{{case "title" finalPosition}}

Position

+ + {{!-- Result --}} +
+ {{#if (test rollResult "==" "critical")}} +

Critical

+

Success!

+ {{else if (test rollResult "==" "success")}} +

Success!

+ {{else if (test rollResult "==" "partial")}} +

Success

+

with Consequences:

+ {{else if (test rollResult "==" "fail")}} +

Fail

+ {{/if}} +
+ + {{!-- Effect --}}

{{case "title" finalEffect}}

Effect

-
- {{!-- Dice Rolls --}} -
{{{dieValsHTML}}}
- - {{!-- Roll Result --}} -

{{case "upper" rollResult}}

- - {{!-- Roll Result Description --}} -

{{rollResultDescription}}

+
{{!-- Consequences --}} {{#if (test rollResult "==" "partial")}}
- {{log "ConsequenceContainer" this}} - {{#with (lookup flagData.consequenceData finalPosition) as |csqData|}} + {{#with (lookup rollFlags.consequenceData finalPosition) as |csqData|}} {{#each csqData.partial as |cData cIndex|}} + {{eLog "ConsequenceContainer" cIndex csqData cData}} {{#if cData.resistedTo}} {{> "systems/eunos-blades/templates/components/consequence.hbs" cData isResistanceVisible=true }} @@ -52,7 +68,7 @@ {{/if}} {{#if (test rollResult "==" "fail")}}
- {{#with (lookup flagData.consequenceData finalPosition) as |csqData|}} + {{#with (lookup rollFlags.consequenceData finalPosition) as |csqData|}} {{#each csqData.fail as |cData cIndex|}} {{#if cData.resistedTo}} {{> "systems/eunos-blades/templates/components/consequence.hbs" cData diff --git a/templates/components/consequence.hbs b/templates/components/consequence.hbs index 6a71a9e6..e040ec38 100644 --- a/templates/components/consequence.hbs +++ b/templates/components/consequence.hbs @@ -7,26 +7,33 @@ data-resist-name="{{resistedTo.name}}" data-resist-type="{{resistedTo.type}}" > + {{#unless isMinimal}} + + {{/unless}} +
{{#if specialArmorTo}}
{{/if}} -
-
- {{{compileSvg type icon}}} + {{eLog "ICON DATA" icon}} +
- {{{compileSvg type icon}}} +
- {{{compileSvg resistedTo.type resistedTo.icon}}} + {{#if resistedTo.icon}} + + {{/if}}
{{#if specialArmorTo}}
- {{{compileSvg specialArmorTo.type specialArmorTo.icon}}} + {{#if specialArmorTo.icon}} + + {{/if}}
{{/if}} diff --git a/templates/parts/dialog-consequence-block.hbs b/templates/parts/dialog-consequence-block.hbs index 1ce79e5b..ea5cfdbf 100644 --- a/templates/parts/dialog-consequence-block.hbs +++ b/templates/parts/dialog-consequence-block.hbs @@ -54,8 +54,8 @@ isToggled=cData.canArmorB activeClass="fa-sharp fa-solid fa-shield" inactiveClass="fa-sharp fa-solid fa-shield-halved" - targetFlagKey= }} + {{/if}}
{{!-- AI Options --}}
diff --git a/templates/roll/partials/roll-collab-action-gm.hbs b/templates/roll/partials/roll-collab-action-gm.hbs index c6f24bb9..8c0b824d 100644 --- a/templates/roll/partials/roll-collab-action-gm.hbs +++ b/templates/roll/partials/roll-collab-action-gm.hbs @@ -241,7 +241,6 @@

On Partial Success:

{{#each csqData.partial as |cData cIndex|}} - {{eLog "Partial cData" cData}} {{#if cData.resistedTo}} {{> "systems/eunos-blades/templates/components/consequence.hbs" cData isResistanceVisible=true }} diff --git a/ts/BladesChat.ts b/ts/BladesChat.ts index 2b7388ac..64c0296a 100644 --- a/ts/BladesChat.ts +++ b/ts/BladesChat.ts @@ -11,7 +11,7 @@ import {ApplyTooltipListeners, ApplyConsequenceListeners} from "./core/gsap"; import BladesDialog from "./BladesDialog"; */ import U from "./core/utilities"; -import C, {BladesActorType, BladesItemType, RollType} from "./core/constants"; +import C, {BladesActorType, BladesItemType, RollType, RollResult} from "./core/constants"; import {BladesPC, BladesCrew} from "./documents/BladesActorProxy"; import {BladesItem} from "./documents/BladesItemProxy"; import {ApplyTooltipListeners, ApplyConsequenceListeners} from "./core/gsap"; @@ -66,7 +66,12 @@ class BladesChat extends ChatMessage { const template = `systems/eunos-blades/templates/chat/roll-result-${U.lCase(rollInst.rollType)}-roll.hbs`; - const templateData: BladesRoll & {rollResultDescription?: string} = rollInst; + const templateData: BladesRoll & { + rollResultDescription?: string, rollFlags?: BladesRoll.FlagData} = rollInst; + templateData.rollFlags = {...rollInst.flagData}; + + eLog.checkLog3("bladesRoll", "ConstructRollOutput Data", {rollInst, templateData}); + if (rollInst.rollResult) { templateData.rollResultDescription = C.RollResultDescriptions[rollInst.finalPosition][rollInst.rollResult]; } diff --git a/ts/blades.ts b/ts/blades.ts index 6e5a717f..21e2eea7 100644 --- a/ts/blades.ts +++ b/ts/blades.ts @@ -76,27 +76,6 @@ class GlobalGetter { attribute: AttributeTrait.prowess, attributeVal: 3, name: "Broken Leg", - resistOptions: { - 0: { - name: "Sprained Ankle", - isSelected: true, - type: ConsequenceType.ProwessHarm1, - icon: C.ConsequenceIcons[ConsequenceType.ProwessHarm1], - typeDisplay: C.ConsequenceDisplay[ConsequenceType.ProwessHarm1] - }, - 1: { - name: "Bruised Leg", - isSelected: false, - type: ConsequenceType.ProwessHarm1, - icon: C.ConsequenceIcons[ConsequenceType.ProwessHarm1] - }, - 2: { - name: "Fractured Foot", - isSelected: false, - type: ConsequenceType.ProwessHarm1, - icon: C.ConsequenceIcons[ConsequenceType.ProwessHarm1] - } - }, resistedTo: { name: "Sprained Ankle", isSelected: true, @@ -120,56 +99,24 @@ class GlobalGetter { attribute: AttributeTrait.insight, attributeVal: 4, name: "You Lose Your Footing", - /* "resistOptions": { - "0": { - "name": "Stumble", - "isSelected": false - }, - "1": { - "name": "Trip", - "isSelected": false - }, - "2": { - "name": "", - "type": "None", - "isSelected": true - } - }, */ resistedTo: { name: "", type: ConsequenceType.None, isSelected: true }, - icon: "main", + icon: C.ConsequenceIcons[ConsequenceType.ReducedEffect], typeDisplay: "Reduced Effect" }, 2: { type: ConsequenceType.ResolveHarm1, attribute: AttributeTrait.resolve, name: "Traumatic Flashbacks", - resistOptions: { - 0: { - name: "", - type: ConsequenceType.None, - isSelected: true - }, - 1: { - name: "", - type: ConsequenceType.None, - isSelected: false - }, - 2: { - name: "", - type: ConsequenceType.None, - isSelected: false - } - }, resistedTo: { name: "", type: ConsequenceType.None, isSelected: true }, - icon: "spikes|eyeball|iris", + icon: C.ConsequenceIcons[ConsequenceType.ResolveHarm1], typeDisplay: "Level 1 Harm (Lesser)", attributeVal: 4 } @@ -180,96 +127,39 @@ class GlobalGetter { attribute: AttributeTrait.resolve, attributeVal: 4, name: "Time To Regroup", - resistOptions: { - 0: { - name: "Time to Rest and Recuperate", - isSelected: false - }, - 1: { - name: "Time to Reflect and Reevaluate", - isSelected: false - }, - 2: { - name: "Time to Reorganize and Strategize", - isSelected: false - } - }, resistedTo: { name: "", type: ConsequenceType.None, isSelected: true }, - icon: "horizon|boot|ice", + icon: C.ConsequenceIcons[ConsequenceType.WorsePosition], typeDisplay: "Worse Position" }, 1: { type: ConsequenceType.ComplicationMajor, attribute: AttributeTrait.prowess, name: "Your pick snaps off inside the lock.", - resistOptions: { - 0: { - name: "Lock remains intact but jammed", - isSelected: false, - type: ConsequenceType.ComplicationMinor, - icon: "main" - }, - 1: { - name: "Pick breaks, but lock is still pickable", - isSelected: true, - type: ConsequenceType.ComplicationMinor, - icon: "main", - typeDisplay: "Minor Complication" - }, - 2: { - name: "You manage to extract the broken pick from the lock.", - isSelected: false, - type: ConsequenceType.ComplicationMinor, - icon: "main" - } - }, resistedTo: { name: "Pick breaks, but lock is still pickable", isSelected: true, type: ConsequenceType.ComplicationMinor, - icon: "main", + icon: C.ConsequenceIcons[ConsequenceType.ComplicationMinor], typeDisplay: "Minor Complication" }, attributeVal: 3, - icon: "main", + icon: C.ConsequenceIcons[ConsequenceType.ComplicationMajor], typeDisplay: "Major Complication" }, 2: { type: ConsequenceType.InsightHarm2, attribute: AttributeTrait.insight, name: "Completely Misled", - resistOptions: { - 0: { - name: "Partially Misinformed", - isSelected: false, - type: ConsequenceType.InsightHarm1, - icon: "eye|iris", - typeDisplay: "Level 1 Harm (Lesser)" - }, - 1: { - name: "Confused by Deception", - isSelected: true, - type: ConsequenceType.InsightHarm1, - icon: "eye|iris", - typeDisplay: "Level 1 Harm (Lesser)" - }, - 2: { - name: "Given Partially Incorrect Information", - isSelected: false, - type: ConsequenceType.InsightHarm1, - icon: "eye|iris" - } - }, resistedTo: { name: "Confused by Deception", isSelected: true, type: ConsequenceType.InsightHarm1, typeDisplay: "Level 1 Harm (Lesser)", - icon: "eye|iris" + icon: C.ConsequenceIcons[ConsequenceType.InsightHarm1] }, specialArmorTo: { name: "Sprained Ankle", @@ -279,7 +169,7 @@ class GlobalGetter { icon: C.ConsequenceIcons[ConsequenceType.InsightHarm1], typeDisplay: "Level 1 Harm (Lesser)" }, - icon: "eye|iris", + icon: C.ConsequenceIcons[ConsequenceType.InsightHarm2], typeDisplay: "Level 2 Harm (Moderate)", attributeVal: 4 } @@ -403,6 +293,7 @@ Hooks.once("init", async () => { BladesClockKeeperSheet.Initialize(), BladesPushAlert.Initialize(), BladesRoll.Initialize(), + BladesChat.Initialize(), preloadHandlebarsTemplates() ]); diff --git a/ts/core/constants.ts b/ts/core/constants.ts index a97a52b5..95e13890 100644 --- a/ts/core/constants.ts +++ b/ts/core/constants.ts @@ -484,24 +484,24 @@ const C = { [ConsequenceType.None]: "None" }, ConsequenceIcons: { - [ConsequenceType.ReducedEffect]: "main", - [ConsequenceType.ComplicationMinor]: "main", - [ConsequenceType.ComplicationMajor]: "main", - [ConsequenceType.ComplicationSerious]: "main", - [ConsequenceType.LostOpportunity]: "main", - [ConsequenceType.WorsePosition]: "horizon|boot|ice", - [ConsequenceType.InsightHarm1]: "eye|iris", - [ConsequenceType.InsightHarm2]: "eye|iris", - [ConsequenceType.InsightHarm3]: "eye|iris", - [ConsequenceType.InsightHarm4]: "eye|iris", - [ConsequenceType.ProwessHarm1]: "scar", - [ConsequenceType.ProwessHarm2]: "scarTissue", - [ConsequenceType.ProwessHarm3]: "scar|scarTissue", - [ConsequenceType.ProwessHarm4]: "scar|scarTissue|welts", - [ConsequenceType.ResolveHarm1]: "spikes|eyeball|iris", - [ConsequenceType.ResolveHarm2]: "spikes|eyeball|iris", - [ConsequenceType.ResolveHarm3]: "spikes|eyeball|iris", - [ConsequenceType.ResolveHarm4]: "spikes|eyeball|iris", + [ConsequenceType.ReducedEffect]: "reduced-effect", + [ConsequenceType.ComplicationMinor]: "complication-minor", + [ConsequenceType.ComplicationMajor]: "complication-major", + [ConsequenceType.ComplicationSerious]: "complication-serious", + [ConsequenceType.LostOpportunity]: "lost-opportunity", + [ConsequenceType.WorsePosition]: "worse-position", + [ConsequenceType.InsightHarm1]: "harm-insight-1", + [ConsequenceType.InsightHarm2]: "harm-insight-2", + [ConsequenceType.InsightHarm3]: "harm-insight-3", + [ConsequenceType.InsightHarm4]: "harm-insight-4", + [ConsequenceType.ProwessHarm1]: "harm-prowess-1", + [ConsequenceType.ProwessHarm2]: "harm-prowess-2", + [ConsequenceType.ProwessHarm3]: "harm-prowess-3", + [ConsequenceType.ProwessHarm4]: "harm-prowess-4", + [ConsequenceType.ResolveHarm1]: "harm-resolve-1", + [ConsequenceType.ResolveHarm2]: "harm-resolve-2", + [ConsequenceType.ResolveHarm3]: "harm-resolve-3", + [ConsequenceType.ResolveHarm4]: "harm-resolve-4", [ConsequenceType.None]: "" }, RollResultDescriptions: { diff --git a/ts/core/gsap.ts b/ts/core/gsap.ts index b8e4fe76..307cf010 100644 --- a/ts/core/gsap.ts +++ b/ts/core/gsap.ts @@ -27,51 +27,59 @@ const gsapEffects: Record = { const csqBaseElems = csqRoot(".base-consequence:not(.consequence-icon-circle)"); const csqAcceptElems = csqRoot(".accept-consequence:not(.consequence-icon-circle):not(.consequence-button-container)"); - const tl = U.gsap.timeline({paused: true}); + const tl = U.gsap.timeline({paused: true, defaults: { overwrite: "auto" }}); // Fade out base-consequence components - tl.fromTo(csqBaseElems, { - opacity: 1 - }, { - opacity: 0, - duration: config.duration / 3, - ease: "none" - }, 0); + if (csqBaseElems.length > 0) { + tl.fromTo(csqBaseElems, { + opacity: 1 + }, { + opacity: 0, + duration: config.duration / 3, + ease: "none" + }, 0); + } // Fade in accept-consequence components - tl.fromTo(csqAcceptElems, { - opacity: 0 - }, { - opacity: 1, - duration: config.duration / 3, - ease: "none" - }, 0); + if (csqAcceptElems.length > 0) { + tl.fromTo(csqAcceptElems, { + opacity: 0 + }, { + opacity: 1, + duration: config.duration / 3, + ease: "none" + }, 0); + } // Brighten the entire container slightly - tl.fromTo(csqContainer, { - filter: "brightness(1)" - }, { - filter: `brightness(${config.brightness})`, - duration: config.duration / 3, - ease: "none" - }, 0); + if (csqContainer) { + tl.fromTo(csqContainer, { + filter: "brightness(1)" + }, { + filter: `brightness(${config.brightness})`, + duration: config.duration / 3, + ease: "none" + }, 0); + } // Enlarge the icon circle, add stroke - tl.fromTo(csqIconCircle, { - xPercent: -50, - yPercent: -50, - scale: 0.75, - outlineColor: C.Colors.dBLACK, - outlineWidth: 0 - }, { - xPercent: -50, - yPercent: -50, - scale: 0.85, - outlineColor: C.Colors.GREY, - outlineWidth: 1, - duration: 0.55, - ease: "sine.out" - }, 0); + if (csqIconCircle.length > 0) { + tl.fromTo(csqIconCircle, { + // xPercent: -50, + // yPercent: -50, + scale: 0.75, + outlineColor: C.Colors.dBLACK, + outlineWidth: 0 + }, { + // xPercent: -50, + // yPercent: -50, + scale: 0.85, + outlineColor: C.Colors.GREY, + outlineWidth: 1, + duration: 0.55, + ease: "sine.out" + }, 0); + } return tl; }, @@ -87,68 +95,90 @@ const gsapEffects: Record = { csqClickIcon: { effect: (csqIconContainer: HTMLElement, config) => { const csqRoot = U.gsap.utils.selector(csqIconContainer); + const csqBackgroundImg = U.gsap.utils.selector($(csqIconContainer).parent())(".consequence-bg-image"); const csqInteractionPads = csqRoot(".consequence-interaction-pad"); const csqIconCircleBase = csqRoot(".consequence-icon-circle.base-consequence"); const csqIconCircleAccept = csqRoot(".consequence-icon-circle.accept-consequence"); const csqButtonContainers = csqRoot(".consequence-button-container"); - const tl = U.gsap.timeline({paused: true}); + const tl = U.gsap.timeline({paused: true, defaults: { overwrite: "auto" }}); // Initialize interaction pads to display: none if (csqInteractionPads.length) { tl.set(csqInteractionPads, {display: "none"}); } + // Slide out the background + if (csqBackgroundImg.length) { + tl.fromTo(csqBackgroundImg, { + xPercent: -100, + yPercent: -50 + }, { + xPercent: -60, + yPercent: -50, + duration: 0.5, + ease: "back" + }, 0); + } + // Fade out the base consequence icon circle - tl.fromTo(csqIconCircleBase, { - opacity: 1 - }, { - opacity: 0, - duration: 0.25, - ease: "none" - }, 0); + if (csqIconCircleBase.length > 0) { + tl.fromTo(csqIconCircleBase, { + opacity: 1 + }, { + opacity: 0, + duration: 0.25, + ease: "none" + }, 0); + } // Fade in the accept consequence icon circle, enlarging the stroke - tl.fromTo(csqIconCircleAccept, { - opacity: 0, - xPercent: -50, - yPercent: -50, - scale: 0.85 - }, { - opacity: 1, - xPercent: -50, - yPercent: -50, - duration: 0.15, - ease: "sine" - }, 0); - - tl.fromTo(csqIconCircleAccept, { - outlineWidth: 1, - xPercent: -50, - yPercent: -50, - scale: 0.85 - }, { - scale: 1, - xPercent: -50, - yPercent: -50, - outlineWidth: 2, - duration: 0.25, - ease: "sine" - }, 0.175); + if (csqIconCircleAccept.length > 0) { + tl.fromTo(csqIconCircleAccept, { + opacity: 0, + // xPercent: -50, + // yPercent: -50, + scale: 0.85 + }, { + opacity: 1, + // xPercent: -50, + // yPercent: -50, + duration: 0.15, + ease: "sine" + }, 0); + } + + if (csqIconCircleAccept.length > 0) { + tl.fromTo(csqIconCircleAccept, { + outlineWidth: 1, + // xPercent: -50, + // yPercent: -50, + scale: 0.85 + }, { + scale: 1, + // xPercent: -50, + // yPercent: -50, + outlineWidth: 2, + duration: 0.25, + ease: "sine" + }, 0.175); + } // Scale and fade in the button containers - tl.fromTo(csqButtonContainers, { - scale: config.scale, - opacity: 0, - filter: "blur(25px)" - }, { - scale: 1, - opacity: 1, - filter: "blur(0px)", - stagger: config.stagger, - duration: config.duration, - ease: `${config.ease}.inOut(${config.easeStrength})` - }, 0); + if (csqButtonContainers.length > 0) { + tl.fromTo(csqButtonContainers, { + scale: config.scale, + opacity: 0, + filter: "blur(25px)" + }, { + scale: 1, + opacity: 1, + filter: "blur(0px)", + stagger: config.stagger, + duration: config.duration, + ease: `${config.ease}.inOut(${config.easeStrength})` + }, 0); + } // Finally, toggle on interaction pads if (csqInteractionPads.length) { @@ -176,75 +206,85 @@ const gsapEffects: Record = { const buttonIcon = buttonRoot(".button-icon i"); const buttonLabel = buttonRoot(".consequence-button-label"); - const tl = U.gsap.timeline({paused: true}); + const tl = U.gsap.timeline({paused: true, defaults: { overwrite: "auto" }}); // Turn type line white - tl.fromTo(typeLine, - { - color: C.Colors.RED - }, - { - color: C.Colors.WHITE, - duration: 0.5, - ease: "sine.inOut" - }, 0); + if (typeLine.length > 0) { + tl.fromTo(typeLine, + { + color: C.Colors.RED + }, + { + color: C.Colors.WHITE, + duration: 0.5, + ease: "sine.inOut" + }, 0); + } // Slide type line background out from under icon - tl.fromTo(typeLineBg, { - x: 5, - scaleX: 0, - color: C.Colors.RED, - skewX: 0 - }, { - scaleX: 1, - skewX: -45, - color: C.Colors.RED, - duration: 0.5, - ease: "back.out" - }, 0); + if (typeLineBg.length > 0) { + tl.fromTo(typeLineBg, { + x: 5, + scaleX: 0, + color: C.Colors.RED, + skewX: 0 + }, { + scaleX: 1, + skewX: -45, + color: C.Colors.RED, + duration: 0.5, + ease: "back.out" + }, 0); + } // Slide accept button background out from under icon - tl.fromTo(buttonBg, { - scaleX: 0, - color: C.Colors.RED, - skewX: 0 - }, { - x: 0, - scaleX: 1, - skewX: -45, - color: C.Colors.RED, - duration: 0.25, - ease: "back.out" - }, 0); + if (buttonBg.length > 0) { + tl.fromTo(buttonBg, { + scaleX: 0, + color: C.Colors.RED, + skewX: 0 + }, { + x: 0, + scaleX: 1, + skewX: -45, + color: C.Colors.RED, + duration: 0.25, + ease: "back.out" + }, 0); + } // Turn button icon black and scale - tl.fromTo(buttonIcon, - { - color: C.Colors.GREY, - opacity: 0.75, - scale: 1 - }, - { - color: C.Colors.dBLACK, - scale: 1.25, - opacity: 1, - duration: 0.5, - ease: "sine" - }, 0); + if (buttonIcon.length > 0) { + tl.fromTo(buttonIcon, + { + color: C.Colors.GREY, + opacity: 0.75, + scale: 1 + }, + { + color: C.Colors.dBLACK, + scale: 1.25, + opacity: 1, + duration: 0.5, + ease: "sine" + }, 0); + } // Turn button label black, add letter-spacing, bold - tl.fromTo(buttonLabel, - { - color: C.Colors.GREY, - fontWeight: 400, - scale: 1 - }, - { - color: C.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, 0); + if (buttonLabel.length > 0) { + tl.fromTo(buttonLabel, + { + color: C.Colors.GREY, + fontWeight: 400, + scale: 1 + }, + { + color: C.Colors.dBLACK, + fontWeight: 800, + duration: 0.75, + ease: "sine" + }, 0); + } return tl; }, @@ -270,17 +310,19 @@ const gsapEffects: Record = { const buttonIcon = buttonRoot(".button-icon i"); const buttonLabel = buttonRoot(".consequence-button-label"); - const tl = U.gsap.timeline({paused: true}); + const tl = U.gsap.timeline({paused: true, defaults: { overwrite: "auto" }}); // Fade out all accept elems and special armor elems - tl.to([...acceptElems, ...specialArmorElems], { - opacity: 0, - duration: 0.25, - ease: "sine.out" - }); + if ([...acceptElems, ...specialArmorElems].length > 0) { + tl.to([...acceptElems, ...specialArmorElems], { + opacity: 0, + duration: 0.25, + ease: "sine.out" + }); + } - if (typeLine.length) { - // Slide out .consequence-type.resist-consequence from left + // Slide out .consequence-type.resist-consequence from left + if (typeLine.length > 0) { tl.fromTo(typeLine, { x: -15, scaleX: 0, @@ -297,90 +339,104 @@ const gsapEffects: Record = { } // Slide out .consequence-resist-button-bg from right - tl.fromTo(buttonBg, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (buttonBg.length > 0) { + tl.fromTo(buttonBg, { + scaleX: 0, + skewX: 0, + opacity: 1 + }, { + scaleX: 1, + skewX: -45, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } // Slide out .consequence-footer-bg.resist-consequence from left - tl.fromTo(footerBg, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (footerBg.length > 0) { + tl.fromTo(footerBg, { + scaleX: 0, + skewX: 0, + opacity: 1 + }, { + scaleX: 1, + skewX: -45, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } // Slide out .consequence-resist-attribute from left - tl.fromTo(attrElem, { - scaleX: 0, - opacity: 1 - }, { - scaleX: 1, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (attrElem.length > 0) { + tl.fromTo(attrElem, { + scaleX: 0, + opacity: 1 + }, { + scaleX: 1, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } // Slide out .consequence-name.resist-consequence from left - tl.fromTo(resistCsqName, { - scaleX: 0, - opacity: 1 - }, { - scaleX: 1, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); + if (resistCsqName.length > 0) { + tl.fromTo(resistCsqName, { + scaleX: 0, + opacity: 1 + }, { + scaleX: 1, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } // Fade in .consequence-icon-circle.resist-consequence - tl.fromTo(iconCircle, { - opacity: 0 - }, { - opacity: 1, - duration: 0.5, - ease: "back.out" - }, 0); - - // Turn button icon black and scale - tl.fromTo(buttonIcon, - { - color: C.Colors.GREY, - opacity: 0.75, - scale: 1 - }, - { - color: C.Colors.dBLACK, - scale: 1.25, + if (iconCircle.length > 0) { + tl.fromTo(iconCircle, { + opacity: 0 + }, { opacity: 1, duration: 0.5, - ease: "sine" + ease: "back.out" }, 0); + } + + // Turn button icon black and scale + if (buttonIcon.length > 0) { + tl.fromTo(buttonIcon, + { + color: C.Colors.GREY, + opacity: 0.75, + scale: 1 + }, + { + color: C.Colors.dBLACK, + scale: 1.25, + opacity: 1, + duration: 0.5, + ease: "sine" + }, 0); + } // Turn button label black, bold - tl.fromTo(buttonLabel, - { - color: C.Colors.GREY, - fontWeight: 400, - scale: 1 - }, - { - color: C.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, 0); + if (buttonLabel.length > 0) { + tl.fromTo(buttonLabel, + { + color: C.Colors.GREY, + fontWeight: 400, + scale: 1 + }, + { + color: C.Colors.dBLACK, + fontWeight: 800, + duration: 0.75, + ease: "sine" + }, 0); + } return tl; }, @@ -400,23 +456,20 @@ const gsapEffects: Record = { const specialArmorCsqName = csqRoot(".consequence-name.special-armor-consequence"); const iconCircle = csqRoot(".consequence-icon-circle.special-armor-consequence"); - const buttonRoot = U.gsap.utils.selector(csqRoot(".consequence-button-container.consequence-special-armor-button-container")); - - const buttonBg = buttonRoot(".consequence-button-bg"); - const buttonIcon = buttonRoot(".button-icon i"); - const buttonLabel = buttonRoot(".consequence-button-label"); - const tl = U.gsap.timeline({paused: true}); + const tl = U.gsap.timeline({paused: true, defaults: { overwrite: "auto" }}); // Fade out all accept elems and resist elems - tl.to([...acceptElems, ...resistElems], { - opacity: 0, - duration: 0.25, - ease: "sine.out" - }); + if ([...acceptElems, ...resistElems].length > 0) { + tl.to([...acceptElems, ...resistElems], { + opacity: 0, + duration: 0.25, + ease: "sine.out" + }); + } - if (typeLine) { - // Slide out .consequence-type.special-armor-consequence from left + // Slide out .consequence-type.special-armor-consequence from left + if (typeLine.length > 0) { tl.fromTo(typeLine, { x: -15, scaleX: 0, @@ -432,21 +485,8 @@ const gsapEffects: Record = { }, 0); } - // Slide out .consequence-special-armor-button-bg from right - tl.fromTo(buttonBg, { - scaleX: 0, - skewX: 0, - opacity: 1 - }, { - scaleX: 1, - skewX: -45, - opacity: 1, - duration: 0.5, - ease: "back.inOut" - }, 0); - - if (footerBg) { - // Slide out .consequence-footer-bg.special-armor-consequence from left + // Slide out .consequence-footer-bg.special-armor-consequence from left + if (footerBg.length > 0) { tl.fromTo(footerBg, { scaleX: 0, skewX: 0, @@ -461,7 +501,7 @@ const gsapEffects: Record = { } // Slide out .consequence-special-armor-message from left - if (footerMsg) { + if (footerMsg.length > 0) { tl.fromTo(footerMsg, { scaleX: 0, opacity: 1 @@ -474,7 +514,7 @@ const gsapEffects: Record = { } // Slide out .consequence-name.special-armor-consequence from left - if (specialArmorCsqName) { + if (specialArmorCsqName.length > 0) { tl.fromTo(specialArmorCsqName, { scaleX: 0, opacity: 1 @@ -487,42 +527,73 @@ const gsapEffects: Record = { } // Fade in .consequence-icon-circle.special-armor-consequence - tl.fromTo(iconCircle, { - opacity: 0 - }, { - opacity: 1, - duration: 0.5, - ease: "back.out" - }, 0); - - // Turn button icon black and scale - tl.fromTo(buttonIcon, - { - color: C.Colors.GREY, - opacity: 0.75, - scale: 1 - }, - { - color: C.Colors.dBLACK, - scale: 1.25, + if (iconCircle.length > 0) { + tl.fromTo(iconCircle, { + opacity: 0 + }, { opacity: 1, duration: 0.5, - ease: "sine" + ease: "back.out" }, 0); + } - // Turn button label black, bold - tl.fromTo(buttonLabel, - { - color: C.Colors.GREY, - fontWeight: 400, - scale: 1 - }, - { - color: C.Colors.dBLACK, - fontWeight: 800, - duration: 0.75, - ease: "sine" - }, 0); + + if (csqRoot(".consequence-button-container.consequence-special-armor-button-container").length > 0) { + const buttonRoot = U.gsap.utils.selector(csqRoot(".consequence-button-container.consequence-special-armor-button-container")); + const [buttonBg, buttonIcon, buttonLabel] = [ + buttonRoot(".consequence-button-bg"), + buttonRoot(".button-icon i"), + buttonRoot(".consequence-button-label") + ]; + + // Slide out .consequence-special-armor-button-bg from right + if (buttonBg.length > 0) { + tl.fromTo(buttonBg, { + scaleX: 0, + skewX: 0, + opacity: 1 + }, { + scaleX: 1, + skewX: -45, + opacity: 1, + duration: 0.5, + ease: "back.inOut" + }, 0); + } + + // Turn button icon black and scale + if (buttonIcon.length > 0) { + tl.fromTo(buttonIcon, + { + color: C.Colors.GREY, + opacity: 0.75, + scale: 1 + }, + { + color: C.Colors.dBLACK, + scale: 1.25, + opacity: 1, + duration: 0.5, + ease: "sine" + }, 0); + } + + // Turn button label black, bold + if (buttonLabel.length > 0) { + tl.fromTo(buttonLabel, + { + color: C.Colors.GREY, + fontWeight: 400, + scale: 1 + }, + { + color: C.Colors.dBLACK, + fontWeight: 800, + duration: 0.75, + ease: "sine" + }, 0); + } + } return tl; }, @@ -655,7 +726,7 @@ const gsapEffects: Record = { }, hoverTooltip: { effect: (tooltip, config) => { - const tl = U.gsap.timeline({paused: true}); + const tl = U.gsap.timeline({paused: true, defaults: { overwrite: "auto" }}); if (!tooltip) { return tl; } // Tooltip = $(tooltip); diff --git a/ts/core/helpers.ts b/ts/core/helpers.ts index e6a05b8b..0bfcbbbc 100644 --- a/ts/core/helpers.ts +++ b/ts/core/helpers.ts @@ -1,7 +1,5 @@ // #region ▮▮▮▮▮▮▮ IMPORTS ▮▮▮▮▮▮▮ ~ import U from "./utilities"; - -import {HbsSvgData, SVGDATA} from "./constants"; // #endregion ▮▮▮▮[IMPORTS]▮▮▮▮ // #region ░░░░░░░[Templates]░░░░ Preload Partials, Components & Overlay Templates ░░░░░░░ ~ @@ -164,17 +162,7 @@ const handlebarHelpers: Record = { }, compileSvg(...args): string { const [svgDotKey, svgPaths]: [string, string] = args as [string, string]; - const svgData = getProperty(SVGDATA, svgDotKey) as HbsSvgData|undefined; - eLog.checkLog3("compileSvg", {svgDotKey, svgPaths, svgData}); - if (!svgData) { return ""; } - const {viewBox, paths, classes} = svgData; - return [ - ``, - ...svgPaths - .split("|") - .map((path) => ``), - "" - ].join("\n"); + return U.getSvgCode(svgDotKey, svgPaths); }, eLog(...args) { args.pop(); diff --git a/ts/core/utilities.ts b/ts/core/utilities.ts index f5ec97a5..4e955626 100644 --- a/ts/core/utilities.ts +++ b/ts/core/utilities.ts @@ -1,5 +1,5 @@ // #region ▮▮▮▮▮▮▮ IMPORTS ▮▮▮▮▮▮▮ ~ -import C from "./constants"; +import C, {SVGDATA, HbsSvgData} from "./constants"; // eslint-disable-next-line import/no-unresolved import {gsap} from "gsap/all"; // #endregion ▮▮▮▮ IMPORTS ▮▮▮▮ @@ -925,58 +925,43 @@ const objClean = (data: T, remVals: UncleanValues[] = [undefined, null, "", { return data; }; - -/** - * - * @param items - * @param key - */ -export function toDict< - T extends List, - K extends string & KeyOf, - V extends ValOf ->(items: T[], key: K): V extends key ? Record : never { - const dict = {} as Record; - const mappedItems = items - .map((data) => { - let {iData} = data; - if (!iData) {iData = data;} - const prefix = iData.linkName || iData.sourceItem?.name ? `>${iData.type.charAt(0)}>` : ""; - const newKey = `${prefix}${iData[key]}`; - return [newKey, iData]; - }) - .sort(([a], [b]) => a.localeCompare(b)) as Array<[string, T]>; - mappedItems.forEach(([newKey, iData]: [string, T]) => { - if (newKey in dict) { - newKey = indexString(newKey) as V; - } - dict[newKey as KeyOf] = iData; - }); - // @ts-expect-error Oh it definitely does. - return dict; - - /** - * Given a string that could have an index suffix, returns the string with - * the suffix incremented by one, or set to one if no suffix exists. - * @param {string} str - */ - function indexString(str: string) { - if (/_\d+$/.test(str)) { - const [curIndex, ...subStr] = [...str.split(/_/)].reverse(); - return [ - ...[...subStr].reverse(), - parseInt(curIndex, 10) + 1 - ].join("_"); - } - return `${str}_1`; - } -} // Given an object and a predicate function, returns array of two objects: // one with entries that pass, one with entries that fail. const partition = (obj: Type[], predicate: testFunc = () => true): [Type[], Type[]] => [ objFilter(obj, predicate), objFilter(obj, (v: unknown, k: string | number | undefined) => !predicate(v, k)) ]; + +/** + * Zips two arrays into an object. + * + * @template T - The type of the keys. + * @template U - The type of the values. + * @param {T[]} keys - The array of keys. + * @param {U[]} values - The array of values. + * @returns {Record} - The resulting object. + * @throws {Error} - Throws an error if the arrays are not of equal length, if the keys are not unique, or if the keys are not of a type that can be used as object keys. + */ +const zip = (keys: T[], values: U[]): Record => { + // Check that the arrays are of equal length + if (keys.length !== values.length) { + throw new Error("The arrays must be of equal length."); + } + + // Check that the keys are unique + if (new Set(keys).size !== keys.length) { + throw new Error("The keys must be unique."); + } + + // Zip the arrays into an object + const result = {} as Record; + keys.forEach((key, i) => { + result[key] = values[i]; + }); + + return result; +}; + /** * An object-equivalent Array.map() function, which accepts mapping functions to transform both keys and values. * If only one function is provided, it's assumed to be mapping the values and will receive (v, k) args. @@ -1350,6 +1335,44 @@ const withLog = (fn: (...args: unknown[]) => unknown) => { // #region ████████ HTML: Parsing HTML Code, Manipulating DOM Objects ████████ ~ +const getSvgCode = (svgDotKey: string, svgPathKeys?: string|string[]) => { + const svgData = getProperty(SVGDATA, svgDotKey) as HbsSvgData|undefined; + // eLog.checkLog3("compileSvg", {svgDotKey, svgPaths, svgData}); + if (!svgData) { return ""; } + const {viewBox, paths, classes} = svgData; + svgPathKeys ??= Object.keys(paths).join("|"); + if (typeof svgPathKeys === "string") { + svgPathKeys = svgPathKeys.split("|"); + } + return [ + ``, + ...svgPathKeys + .map((path) => ``), + "" + ].join("\n"); +}; + +const getSvgPaths = (svgDotKey: string, svgPathKeys?: string|string[]): Record => { + const svgData = getProperty(SVGDATA, svgDotKey) as HbsSvgData|undefined; + if (!svgData) { return {}; } + const {paths, classes} = svgData; + svgPathKeys ??= Object.keys(paths); + if (typeof svgPathKeys === "string") { + svgPathKeys = svgPathKeys.split("|"); + } + + const returnData: Record = {}; + + for (const pathKey of svgPathKeys) { + returnData[pathKey] = { + class: classes?.[pathKey] ?? "", + d: paths[pathKey] ?? "" + }; + } + + return returnData; +}; + // #region ░░░░░░░[GreenSock]░░░░ Wrappers for GreenSock Functions ░░░░░░░ ~ const set = (targets: gsap.TweenTarget, vars: gsap.TweenVars): gsap.core.Tween => gsap.set(targets, vars); function get(target: gsap.TweenTarget, property: keyof gsap.CSSProperties & string, unit: string): number; @@ -1372,6 +1395,20 @@ function get(target: gsap.TweenTarget, property: keyof gsap.CSSProperties & stri } const getGSAngleDelta = (startAngle: number, endAngle: number) => signNum(roundNum(getAngleDelta(startAngle, endAngle), 2)).replace(/^(.)/, "$1="); + +// const Animate = { +// Timeline: { +// to: (tl: gsap.core.Timeline, targets: gsap.TweenTarget[], vars: gsap.TweenVars, position: any) => { +// if (targets.length === 0) { + +// } +// } +// } (tl: gsap.core.Timeline, ) +// } + +// const to = (targets: gsap.TweenTarget[], vars: gsap.TweenVars): gsap.core.Tween => { +// gsap. +// } // #endregion ░░░░[GreenSock]░░░░ // #region ░░░░░░░[SVG]░░░░ SVG Generation & Manipulation ░░░░░░░ ~ @@ -1442,10 +1479,7 @@ const getRGBString = (red: string | number, green?: number, blue?: number, alpha return null; }; const getHEXString = (red: string | number, green?: number, blue?: number): HEXColor | null => { - /** - * - * @param c - */ + function componentToHex(c: string | number): string { const hex = c.toString(16); return hex.length === 1 ? `0${hex}` : hex; @@ -1683,7 +1717,7 @@ export default { subGroup, shuffle, // ████████ OBJECTS: Manipulation of Simple Key/Val Objects ████████ - remove, replace, partition, + remove, replace, partition, zip, objClean, objSize, objMap, objFindKey, objFilter, objForEach, objCompact, objClone, objMerge, objDiff, objExpand, objFlatten, objNullify, objFreezeProps, @@ -1692,8 +1726,10 @@ export default { getDynamicFunc, withLog, // ████████ HTML: Parsing HTML Code, Manipulating DOM Objects ████████ + getSvgCode, getSvgPaths, + // ░░░░░░░ GreenSock ░░░░░░░ - gsap, get, set, getGSAngleDelta, + gsap, get, set, getGSAngleDelta, /* to, from, fromTo, */ getRawCirclePath, drawCirclePath, @@ -1708,6 +1744,7 @@ export default { // EVENT HANDLERS EventHandlers, + // ░░░░░░░ SYSTEM: System-Specific Functions (Requires Configuration of System ID in constants.js) ░░░░░░░ isDocID, loc, getSetting, getTemplatePath, displayImageSelector