forked from GitHub-Mirrors/foundry-sw5e
Beginning of global styling; Full Sidebar restyle
This commit is contained in:
parent
a8c2881a7b
commit
f7d7580b3a
53 changed files with 6671 additions and 1811 deletions
BIN
fonts/OpenSans-Bold.ttf
Normal file
BIN
fonts/OpenSans-Bold.ttf
Normal file
Binary file not shown.
BIN
fonts/OpenSans-BoldItalic.ttf
Normal file
BIN
fonts/OpenSans-BoldItalic.ttf
Normal file
Binary file not shown.
BIN
fonts/OpenSans-Italic.ttf
Normal file
BIN
fonts/OpenSans-Italic.ttf
Normal file
Binary file not shown.
11
gulpfile.js
11
gulpfile.js
|
@ -5,13 +5,18 @@ const less = require('gulp-less');
|
|||
/* Compile LESS
|
||||
/* ----------------------------------------- */
|
||||
|
||||
const SW5E_LESS = ["less/*.less"];
|
||||
const SW5E_LESS = ["less/**/*.less"];
|
||||
function compileLESS() {
|
||||
return gulp.src("less/sw5e.less")
|
||||
return gulp.src("less/original/sw5e.less")
|
||||
.pipe(less())
|
||||
.pipe(gulp.dest("./"))
|
||||
}
|
||||
const css = gulp.series(compileLESS);
|
||||
function compileMORE() {
|
||||
return gulp.src("less/update/sw5e-update.less")
|
||||
.pipe(less())
|
||||
.pipe(gulp.dest("./"))
|
||||
}
|
||||
const css = gulp.series(compileLESS, compileMORE);
|
||||
|
||||
/* ----------------------------------------- */
|
||||
/* Watch Updates
|
||||
|
|
|
@ -579,6 +579,7 @@
|
|||
"SW5E.RollSituationalBonus": "Situational Bonus?",
|
||||
"SW5E.Save": "Save",
|
||||
"SW5E.SheetClassCharacter": "Default Character Sheet",
|
||||
"SW5E.SheetClassCharacterOld": "Old Character Sheet",
|
||||
"SW5E.SheetClassNPC": "Default NPC Sheet",
|
||||
"SW5E.SheetClassVehicle": "Default Vehicle Sheet",
|
||||
"SW5E.SheetClassItem": "Default Item Sheet",
|
||||
|
|
0
less/update/actor.less
Normal file
0
less/update/actor.less
Normal file
107
less/update/components/forms.less
Normal file
107
less/update/components/forms.less
Normal file
|
@ -0,0 +1,107 @@
|
|||
input[type="text"], input[type="number"], input[type="password"], input[type="date"], input[type="time"], select, textarea {
|
||||
border: 1px solid @colorLightGray;
|
||||
border-radius: 4px;
|
||||
color: @colorBlack;
|
||||
transition: all 0.3s;
|
||||
&:hover {
|
||||
border-color: @colorGray;
|
||||
box-shadow: none;
|
||||
}
|
||||
&:focus {
|
||||
border-color: @colorRed;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
input[type=range] {
|
||||
-webkit-appearance: none; /* Hides the slider so that custom slider can be made */
|
||||
width: 100%; /* Specific width is required for Firefox. */
|
||||
background: transparent; /* Otherwise white in Chrome */
|
||||
|
||||
}
|
||||
|
||||
input[type=range]::-webkit-slider-thumb{
|
||||
-webkit-appearance: none;
|
||||
background: @colorRed;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 32px;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-moz-range-thumb{
|
||||
-webkit-appearance: none;
|
||||
background: @colorRed;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 32px;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-ms-thumb {
|
||||
-webkit-appearance: none;
|
||||
background: @colorRed;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 32px;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
input[type=range]::-webkit-slider-runnable-track {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
cursor: pointer;
|
||||
background: @colorLightBlue;
|
||||
border-radius: 4px;
|
||||
border: 1px solid @colorBlue;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]:focus::-webkit-slider-runnable-track {
|
||||
background: @colorBlue;
|
||||
}
|
||||
input[type=range]::-moz-range-track {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
cursor: pointer;
|
||||
background: @colorLightBlue;
|
||||
border-radius: 4px;
|
||||
border: 1px solid @colorBlue;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
cursor: pointer;
|
||||
background: @colorLightBlue;
|
||||
border-radius: 4px;
|
||||
border: 1px solid @colorBlue;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]:focus {
|
||||
outline: none; /* Removes the blue border. You should probably do some kind of focus styling for accessibility reasons though. */
|
||||
}
|
||||
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
|
||||
/* Hides the slider so custom styles can be added */
|
||||
background: transparent;
|
||||
border-color: transparent;
|
||||
color: transparent;
|
||||
}
|
||||
|
||||
button {
|
||||
.openSans(13px, 700);
|
||||
background: @colorRed;
|
||||
color: white;
|
||||
text-align: center;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
&:hover, &:focus {
|
||||
box-shadow: none;
|
||||
background: lighten(@colorRed, 5);
|
||||
}
|
||||
}
|
495
less/update/components/sidebar.less
Normal file
495
less/update/components/sidebar.less
Normal file
|
@ -0,0 +1,495 @@
|
|||
#sidebar {
|
||||
border: none; //1px solid @colorBlue;
|
||||
}
|
||||
|
||||
#sidebar-tabs {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
background: white;
|
||||
.dropShadow1();
|
||||
& > .collapse {
|
||||
color: @colorRed;
|
||||
}
|
||||
.item {
|
||||
font-size: 16px;
|
||||
}
|
||||
.item.active {
|
||||
color: @colorRed;
|
||||
border: none;
|
||||
border-bottom: 3px solid @colorRed;
|
||||
box-shadow: none;
|
||||
background: none;
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------
|
||||
** Chat Tab
|
||||
-----------*/
|
||||
|
||||
#chat-log {
|
||||
.chat-message {
|
||||
background: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 8px;
|
||||
.dropShadow1();
|
||||
& > header {
|
||||
color: @colorRed;
|
||||
border-bottom: 2px solid @colorBlue;
|
||||
margin-bottom: 4px;
|
||||
span {
|
||||
color: @colorBlack;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
.notification-pip {
|
||||
color: @colorBlue;
|
||||
text-shadow: none;
|
||||
|
||||
}
|
||||
|
||||
.sw5e.chat-card {
|
||||
font-size: 13px;
|
||||
|
||||
.card-header {
|
||||
padding: 0;
|
||||
border: none;
|
||||
|
||||
img {
|
||||
flex: 0 0 36px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
flex: 1;
|
||||
margin: 0;
|
||||
line-height: 36px;
|
||||
.russoOne(17px);
|
||||
color: @colorBlack;
|
||||
&:hover {
|
||||
color: @colorBlack;
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-content {
|
||||
margin: 4px 0;
|
||||
|
||||
h3 {
|
||||
font-size: 12px;
|
||||
margin: 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
> * {
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
}
|
||||
|
||||
.card-buttons {
|
||||
margin: 4px 0;
|
||||
|
||||
span {
|
||||
display: block;
|
||||
line-height: 28px;
|
||||
text-align: center;
|
||||
border: 1px solid @colorLightGray;
|
||||
}
|
||||
|
||||
button {
|
||||
.openSans(13px, 700);
|
||||
padding: 4px 0;
|
||||
height: auto;
|
||||
line-height: 1.6;
|
||||
margin: 4px 0;
|
||||
background: @colorRed;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
&:hover, &:focus {
|
||||
background-color: lighten(@colorRed, 5);
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-footer {
|
||||
padding: 4px 0 0;
|
||||
border-top: 1px solid @colorLightBlue;
|
||||
|
||||
span {
|
||||
border-right: 2px groove #FFF;
|
||||
padding: 0 4px 0 0;
|
||||
font-size: 10px;
|
||||
|
||||
&:last-child {
|
||||
border-right: none;
|
||||
padding-right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.dice-roll {
|
||||
|
||||
.dice-formula {
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
.dice-total {
|
||||
background: @colorPaleBlue;
|
||||
border: 1px solid @colorBlue;
|
||||
border-radius: 0;
|
||||
padding: 4px 0;
|
||||
box-shadow: 0 0 12px rgba(@colorBlue,.5);
|
||||
&.success {
|
||||
color: inherit;
|
||||
background: #c7d0c0;
|
||||
border: 1px solid #006c00;
|
||||
}
|
||||
&.failure {
|
||||
color: inherit;
|
||||
background: #ffdddd;
|
||||
border: 1px solid #6e0000;
|
||||
}
|
||||
&.critical {
|
||||
color: @colorGreen;
|
||||
background: @colorPaleGreen;
|
||||
box-shadow: 0 0 12px rgba(@colorGreen,.5);
|
||||
}
|
||||
&.fumble {
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
}
|
||||
#chat-controls {
|
||||
padding-top: 4px;
|
||||
label {
|
||||
color: @colorBlack;
|
||||
}
|
||||
|
||||
}
|
||||
#chat-form textarea {
|
||||
background: white;
|
||||
&:focus {
|
||||
box-shadow: none;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------
|
||||
** Combat Tab
|
||||
-----------*/
|
||||
#combat {
|
||||
#combat-round {
|
||||
color: @colorRed;
|
||||
border-bottom: 2px solid @colorBlue;
|
||||
.encounters {
|
||||
h4 {
|
||||
color: @colorRed;
|
||||
}
|
||||
a {
|
||||
color: @colorGray;
|
||||
&:hover {
|
||||
color: @colorRed;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#combat-tracker {
|
||||
//padding-top: 4px;
|
||||
li.combatant {
|
||||
padding: 4px 0;
|
||||
color: @colorBlack;
|
||||
background: none;
|
||||
&:nth-child(even) {
|
||||
background: rgba(@colorPaleBlue, 0.5);
|
||||
}
|
||||
h4 {
|
||||
color: @colorBlack;
|
||||
text-shadow: none;
|
||||
}
|
||||
.roll {
|
||||
background: none;
|
||||
color: @colorGray;
|
||||
&::before {
|
||||
content: "\f6cf";
|
||||
.fontAwesome();
|
||||
font-size: 28px;
|
||||
}
|
||||
&:hover {
|
||||
color: @colorRed;
|
||||
}
|
||||
}
|
||||
.combatant-control {
|
||||
color: @colorLightGray;
|
||||
text-shadow: none;
|
||||
&.active {
|
||||
color: @colorDarkGray;
|
||||
}
|
||||
}
|
||||
.token-resource {
|
||||
color: @colorGray;
|
||||
border-right: 1px solid @colorLightGray;
|
||||
}
|
||||
.initiative {
|
||||
text-shadow: none;
|
||||
}
|
||||
&.active {
|
||||
color: @colorBlue;
|
||||
.initiative, h4 {
|
||||
color: @colorBlue;
|
||||
}
|
||||
}
|
||||
&.hidden {
|
||||
opacity: 0.5;
|
||||
color: @colorBlack;
|
||||
}
|
||||
}
|
||||
}
|
||||
#combat-controls {
|
||||
padding-top: 0;
|
||||
border-top: 1px solid @colorBlue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
** Folders
|
||||
*/
|
||||
.sidebar-tab {
|
||||
.directory-header {
|
||||
margin-bottom: 4px;
|
||||
.header-search {
|
||||
position: relative;
|
||||
i.fa-search {
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
color: @colorBlue;
|
||||
}
|
||||
input {
|
||||
text-align: left;
|
||||
padding-left: 22px;
|
||||
background: white;
|
||||
&:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.subdirectory {
|
||||
border: none;
|
||||
margin-left: 8px;
|
||||
background: white;
|
||||
min-height: 8px;
|
||||
.folder {
|
||||
border-left: 2px solid rgba(@colorBlack, 0.4);
|
||||
}
|
||||
}
|
||||
.directory-list {
|
||||
padding-bottom: 4px;
|
||||
li + li {
|
||||
border-top: 1px solid @colorBlue;
|
||||
}
|
||||
.folder {
|
||||
& > .folder-header {
|
||||
line-height: default;
|
||||
padding: 0 0 0 8px;
|
||||
position: relative;
|
||||
border: none;
|
||||
background: white;
|
||||
h3 {
|
||||
padding: 8px 4px;
|
||||
background: white;
|
||||
color: @colorBlack;
|
||||
.openSans(13px, 700);
|
||||
line-height: 1.6;
|
||||
& > i {
|
||||
margin-right: 4px;
|
||||
color: @colorBlue;
|
||||
}
|
||||
}
|
||||
a {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 4px;
|
||||
height: 100%;
|
||||
padding: 0 4px;
|
||||
color: @colorLightGray;
|
||||
&:hover {
|
||||
color: @colorRed;
|
||||
}
|
||||
i {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
&.create-folder {
|
||||
right: 28px;
|
||||
}
|
||||
}
|
||||
}
|
||||
&.collapsed > .folder-header {
|
||||
background: white;
|
||||
}
|
||||
& + .entity {
|
||||
border-top: 1px solid @colorBlue;
|
||||
}
|
||||
}
|
||||
.directory-item img {
|
||||
flex: 0 0 32px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
align-self: center;
|
||||
}
|
||||
.actor, .item, .journal, .table,{
|
||||
background: white;
|
||||
border: none;
|
||||
.entity-name {
|
||||
.openSans(13px, 700);
|
||||
color: @colorBlack;
|
||||
}
|
||||
&:nth-child(even) {
|
||||
background: rgba(@colorPaleBlue, 0.3);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#scenes {
|
||||
.subdirectory {
|
||||
border-left: none;
|
||||
}
|
||||
.scene {
|
||||
border: none;
|
||||
border-top: 1px solid @colorBlue;
|
||||
border-left: 4px solid @colorBlue;
|
||||
box-shadow: none;
|
||||
position: relative;
|
||||
height: 128px;
|
||||
//margin-bottom: 4px;
|
||||
& + .scene {
|
||||
margin-top: 4px;
|
||||
}
|
||||
&::after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 99px;
|
||||
position: absolute;
|
||||
top: 28px;
|
||||
left: 0;
|
||||
box-shadow: 0 0 20px @colorBlue inset;
|
||||
}
|
||||
h3 {
|
||||
.openSans(13px, 700);
|
||||
text-align: left;
|
||||
text-shadow: none;
|
||||
padding: 4px 4px 4px 12px;
|
||||
background: white;
|
||||
line-height: 1.6;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#playlists {
|
||||
.directory-list {
|
||||
padding: 0 8px;
|
||||
li.playlist {
|
||||
padding: 8px;
|
||||
border-radius: 4px;
|
||||
background: white;
|
||||
margin-bottom: 8px;
|
||||
border-top: inherit;
|
||||
.dropShadow1();
|
||||
.playlist-header {
|
||||
background: white;
|
||||
color: @colorRed;
|
||||
text-decoration: none;
|
||||
border-bottom: 2px solid @colorBlue;
|
||||
}
|
||||
li.sound {
|
||||
border: none;
|
||||
color: @colorBlack;
|
||||
h4 {
|
||||
.openSans(13px, 400);
|
||||
}
|
||||
|
||||
}
|
||||
a.sound-control {
|
||||
color: @colorRed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#compendium {
|
||||
.compendium-entity {
|
||||
margin: 0 4px;
|
||||
padding: 8px;
|
||||
background: white !important;
|
||||
.dropShadow1();
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
&+ .compendium-entity {
|
||||
margin-top: 4px;
|
||||
}
|
||||
h3 {
|
||||
border: none;
|
||||
color: @colorRed;
|
||||
border-bottom: 2px solid @colorBlue;
|
||||
.russoOne(17px);
|
||||
padding: 0;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
ol.compendium-list {
|
||||
li.compendium-pack {
|
||||
margin: 0;
|
||||
padding: 4px;
|
||||
border: none;
|
||||
&:nth-child(even) {
|
||||
background: rgba(@colorPaleBlue, 0.3);
|
||||
}
|
||||
.pack-title {
|
||||
margin: 0;
|
||||
position: relative;
|
||||
a {
|
||||
.openSans(13px, 700);
|
||||
i {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.status-icons {
|
||||
top: 4px;
|
||||
color: @colorLightGray;
|
||||
font-size: 13px;
|
||||
}
|
||||
}
|
||||
footer.compendium-footer {
|
||||
color: @colorBlack;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#settings {
|
||||
h2 {
|
||||
color: @colorRed;
|
||||
border: none;
|
||||
border-bottom: 2px solid @colorBlue;
|
||||
margin: 0 8px;
|
||||
padding: 0;
|
||||
}
|
||||
#game-details, #settings-game, #settings-documentation, #settings-access {
|
||||
padding: 0 8px;
|
||||
margin: 0 0 8px;
|
||||
color: @colorBlack;
|
||||
}
|
||||
}
|
104
less/update/sw5e-update.less
Normal file
104
less/update/sw5e-update.less
Normal file
|
@ -0,0 +1,104 @@
|
|||
@import "variables.less";
|
||||
|
||||
html {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
*, *:before, *:after {
|
||||
box-sizing: inherit;
|
||||
}
|
||||
// ::-webkit-scrollbar {
|
||||
// width: 6px;
|
||||
// height: 6px;
|
||||
// }
|
||||
::-webkit-scrollbar-track {
|
||||
border: 1px solid @colorBlue;
|
||||
border-radius: 4px;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
outline: none;
|
||||
border-radius: 4px;
|
||||
background: @colorBlue;
|
||||
border: none;
|
||||
}
|
||||
:root {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: @colorBlue @colorPaleBlue;
|
||||
}
|
||||
|
||||
body {
|
||||
.openSans(13px, 400);
|
||||
}
|
||||
|
||||
h1 {
|
||||
.russoOne(34px);
|
||||
}
|
||||
h2 {
|
||||
.russoOne(27px);
|
||||
}
|
||||
h3 {
|
||||
.russoOne(21px);
|
||||
}
|
||||
h4 {
|
||||
.russoOne(17px);
|
||||
}
|
||||
h5, h6 {
|
||||
.russoOne(13px);
|
||||
}
|
||||
|
||||
a {
|
||||
color: @colorRed;
|
||||
text-decoration: none;
|
||||
&:hover, &:active {
|
||||
text-shadow: none;
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
|
||||
.app {
|
||||
background: @sheetBackground;
|
||||
border: none;// 1px solid @colorBlue;
|
||||
.dropShadow1();
|
||||
}
|
||||
|
||||
#context-menu {
|
||||
background: none;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
color: @colorBlack;
|
||||
padding: 0 8px;
|
||||
ol.context-items {
|
||||
background: white;
|
||||
border-radius: 4px;
|
||||
border: 1px solid @colorLightGray;
|
||||
.dropShadow2();
|
||||
li.context-item {
|
||||
&:first-child {
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
&:last-child {
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
i {
|
||||
color: @colorBlue;
|
||||
}
|
||||
&:hover {
|
||||
background: @colorRed;
|
||||
color: white;
|
||||
text-shadow: none;
|
||||
cursor: pointer;
|
||||
i {
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
& + li {
|
||||
border-top: 1px solid @colorPaleGray;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@import "components/forms.less";
|
||||
@import "components/sidebar.less";
|
110
less/update/variables.less
Normal file
110
less/update/variables.less
Normal file
|
@ -0,0 +1,110 @@
|
|||
|
||||
/* ----------------------------------------- */
|
||||
/* Fonts */
|
||||
/* ----------------------------------------- */
|
||||
|
||||
/* russo-one-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Russo One';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/RussoOne.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Russo One';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/RussoOne.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Russo One';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('./fonts/RussoOne.ttf');
|
||||
}
|
||||
.russoOne(@size: 20px) {
|
||||
font-family: 'Russo One';
|
||||
font-size: @size;
|
||||
font-weight: 400;
|
||||
}
|
||||
/* open-sans-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/OpenSans-Regular.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/OpenSans-Italic.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('./fonts/OpenSans-Bold.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('./fonts/OpenSans-BoldItalic.ttf');
|
||||
}
|
||||
.openSans(@size: 13px, @weight: 400) {
|
||||
font-family: 'Open Sans';
|
||||
font-size: @size;
|
||||
font-weight: @weight;
|
||||
}
|
||||
.fontAwesome() {
|
||||
font-family: "Font Awesome 5 Free";
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
font-weight: 900;
|
||||
}
|
||||
|
||||
/* ----------------------------------------- */
|
||||
/* Sheet Styles */
|
||||
/* ----------------------------------------- */
|
||||
|
||||
@colorDark: #191813;
|
||||
@colorFaint: #c9c7b8;
|
||||
@colorBeige: #b5b3a4;
|
||||
@colorTan: #7a7971;
|
||||
@colorOlive: #4b4a44;
|
||||
@colorCrimson: #44191A;
|
||||
@borderGroove: 2px groove #eeede0;
|
||||
//@sheetBackground: url("ui/parchment.jpg") repeat;
|
||||
|
||||
|
||||
//SW5e Colors
|
||||
@colorBlack: #1C1C1C;
|
||||
@colorDarkGray: #363636;
|
||||
@colorGray: #4f4f4f;
|
||||
@colorLightGray: #828282;
|
||||
@colorPaleGray: #D6D6D6;
|
||||
@colorRed: #c40f0f;
|
||||
@colorPaleRed: #FBF4F4;
|
||||
@colorLightRed: #F6E1E1;
|
||||
@colorBlue: #0d99cc;
|
||||
@colorLightBlue: #7ed6f7;
|
||||
@colorPaleBlue: #afc6d6;
|
||||
@colorGreen: #0dce0d;
|
||||
@colorPaleGreen: #bcdcbe;
|
||||
|
||||
@sheetBackground: linear-gradient(90deg, @colorPaleBlue 0%, @colorPaleGray 30%, @colorPaleGray 70%, @colorPaleBlue);
|
||||
|
||||
|
||||
.dropShadow1(){
|
||||
box-shadow: 0 2px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.12), 0 1px 5px 0 rgba(0,0,0,0.2);
|
||||
}
|
||||
.dropShadow2() {
|
||||
box-shadow: 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.3);
|
||||
}
|
||||
.dropShadow3() {
|
||||
box-shadow: 0 8px 17px 2px rgba(0,0,0,0.14), 0 3px 14px 2px rgba(0,0,0,0.12), 0 5px 5px -3px rgba(0,0,0,0.2);
|
||||
}
|
|
@ -43,8 +43,8 @@ export default class ActorSheet5e extends ActorSheet {
|
|||
|
||||
/** @override */
|
||||
get template() {
|
||||
if ( !game.user.isGM && this.actor.limited ) return "systems/sw5e/templates/actors/limited-sheet.html";
|
||||
return `systems/sw5e/templates/actors/${this.actor.data.type}-sheet.html`;
|
||||
if ( !game.user.isGM && this.actor.limited ) return "systems/sw5e/templates/actors/oldActor/limited-sheet.html";
|
||||
return `systems/sw5e/templates/actors/oldActor/${this.actor.data.type}-sheet.html`;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
|
626
module/actor/sheets/newSheet/character.js
Normal file
626
module/actor/sheets/newSheet/character.js
Normal file
|
@ -0,0 +1,626 @@
|
|||
import ActorSheet5e from "../base.js";
|
||||
import Actor5e from "../../entity.js";
|
||||
|
||||
/**
|
||||
* An Actor sheet for player character type actors in the SW5E system.
|
||||
* Extends the base ActorSheet5e class.
|
||||
* @type {ActorSheet5e}
|
||||
*/
|
||||
export default class ActorSheet5eCharacterNew extends ActorSheet5e {
|
||||
|
||||
get template() {
|
||||
if (!game.user.isGM && this.actor.limited) return "systems/sw5e/templates/actors/newActor/limited-sheet.html";
|
||||
return "systems/sw5e/templates/actors/newActor/character-sheet.html";
|
||||
}
|
||||
/**
|
||||
* Define default rendering options for the NPC sheet
|
||||
* @return {Object}
|
||||
*/
|
||||
static get defaultOptions() {
|
||||
|
||||
return mergeObject(super.defaultOptions, {
|
||||
classes: ["swalt", "sw5e", "sheet", "actor", "character"],
|
||||
blockFavTab: true,
|
||||
subTabs: null,
|
||||
width: 800,
|
||||
tabs: [{
|
||||
navSelector: ".root-tabs",
|
||||
contentSelector: ".sheet-body",
|
||||
initial: "attributes"
|
||||
}],
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Add some extra data when rendering the sheet to reduce the amount of logic required within the template.
|
||||
*/
|
||||
getData() {
|
||||
const sheetData = super.getData();
|
||||
|
||||
// Temporary HP
|
||||
let hp = sheetData.data.attributes.hp;
|
||||
if (hp.temp === 0) delete hp.temp;
|
||||
if (hp.tempmax === 0) delete hp.tempmax;
|
||||
|
||||
// Resources
|
||||
sheetData["resources"] = ["primary", "secondary", "tertiary"].reduce((arr, r) => {
|
||||
const res = sheetData.data.resources[r] || {};
|
||||
res.name = r;
|
||||
res.placeholder = game.i18n.localize("SW5E.Resource"+r.titleCase());
|
||||
if (res && res.value === 0) delete res.value;
|
||||
if (res && res.max === 0) delete res.max;
|
||||
return arr.concat([res]);
|
||||
}, []);
|
||||
|
||||
// Experience Tracking
|
||||
sheetData["disableExperience"] = game.settings.get("sw5e", "disableExperienceTracking");
|
||||
sheetData["classLabels"] = this.actor.itemTypes.class.map(c => c.name).join(", ");
|
||||
|
||||
// Return data for rendering
|
||||
return sheetData;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Organize and classify Owned Items for Character sheets
|
||||
* @private
|
||||
*/
|
||||
_prepareItems(data) {
|
||||
|
||||
// Categorize items as inventory, powerbook, features, and classes
|
||||
const inventory = {
|
||||
weapon: { label: "SW5E.ItemTypeWeaponPl", items: [], dataset: {type: "weapon"} },
|
||||
equipment: { label: "SW5E.ItemTypeEquipmentPl", items: [], dataset: {type: "equipment"} },
|
||||
consumable: { label: "SW5E.ItemTypeConsumablePl", items: [], dataset: {type: "consumable"} },
|
||||
tool: { label: "SW5E.ItemTypeToolPl", items: [], dataset: {type: "tool"} },
|
||||
backpack: { label: "SW5E.ItemTypeContainerPl", items: [], dataset: {type: "backpack"} },
|
||||
loot: { label: "SW5E.ItemTypeLootPl", items: [], dataset: {type: "loot"} }
|
||||
};
|
||||
|
||||
// Partition items by category
|
||||
let [items, powers, feats, classes, species, archetypes, classfeatures, backgrounds, lightsaberforms] = data.items.reduce((arr, item) => {
|
||||
|
||||
// Item details
|
||||
item.img = item.img || DEFAULT_TOKEN;
|
||||
item.isStack = Number.isNumeric(item.data.quantity) && (item.data.quantity !== 1);
|
||||
|
||||
// Item usage
|
||||
item.hasUses = item.data.uses && (item.data.uses.max > 0);
|
||||
item.isOnCooldown = item.data.recharge && !!item.data.recharge.value && (item.data.recharge.charged === false);
|
||||
item.isDepleted = item.isOnCooldown && (item.data.uses.per && (item.data.uses.value > 0));
|
||||
item.hasTarget = !!item.data.target && !(["none",""].includes(item.data.target.type));
|
||||
|
||||
// Item toggle state
|
||||
this._prepareItemToggleState(item);
|
||||
|
||||
// Classify items into types
|
||||
if ( item.type === "power" ) arr[1].push(item);
|
||||
else if ( item.type === "feat" ) arr[2].push(item);
|
||||
else if ( item.type === "class" ) arr[3].push(item);
|
||||
else if ( item.type === "species" ) arr[4].push(item);
|
||||
else if ( item.type === "archetype" ) arr[5].push(item);
|
||||
else if ( item.type === "classfeature" ) arr[6].push(item);
|
||||
else if ( item.type === "background" ) arr[7].push(item);
|
||||
else if ( item.type === "lightsaberform" ) arr[8].push(item);
|
||||
else if ( Object.keys(inventory).includes(item.type ) ) arr[0].push(item);
|
||||
return arr;
|
||||
}, [[], [], [], [], [], [], [], [], []]);
|
||||
|
||||
// Apply active item filters
|
||||
items = this._filterItems(items, this._filters.inventory);
|
||||
powers = this._filterItems(powers, this._filters.powerbook);
|
||||
feats = this._filterItems(feats, this._filters.features);
|
||||
|
||||
// Organize items
|
||||
for ( let i of items ) {
|
||||
i.data.quantity = i.data.quantity || 0;
|
||||
i.data.weight = i.data.weight || 0;
|
||||
i.totalWeight = Math.round(i.data.quantity * i.data.weight * 10) / 10;
|
||||
inventory[i.type].items.push(i);
|
||||
}
|
||||
|
||||
// Organize Powerbook and count the number of prepared powers (excluding always, at will, etc...)
|
||||
const powerbook = this._preparePowerbook(data, powers);
|
||||
const nPrepared = powers.filter(s => {
|
||||
return (s.data.level > 0) && (s.data.preparation.mode === "prepared") && s.data.preparation.prepared;
|
||||
}).length;
|
||||
|
||||
// Organize Features
|
||||
const features = {
|
||||
classes: { label: "SW5E.ItemTypeClassPl", items: [], hasActions: false, dataset: {type: "class"}, isClass: true },
|
||||
classfeatures: { label: "SW5E.ItemTypeClassFeats", items: [], hasActions: false, dataset: {type: "classfeature"}, isClassfeature: true },
|
||||
archetype: { label: "SW5E.ItemTypeArchetype", items: [], hasActions: false, dataset: {type: "archetype"}, isArchetype: true },
|
||||
species: { label: "SW5E.ItemTypeSpecies", items: [], hasActions: false, dataset: {type: "species"}, isSpecies: true },
|
||||
background: { label: "SW5E.ItemTypeBackground", items: [], hasActions: false, dataset: {type: "background"}, isBackground: true },
|
||||
lightsaberform: { label: "SW5E.ItemTypeLightsaberForm", items: [], hasActions: false, dataset: {type: "lightsaberform"}, isLightsaberform: true },
|
||||
active: { label: "SW5E.FeatureActive", items: [], hasActions: true, dataset: {type: "feat", "activation.type": "action"} },
|
||||
passive: { label: "SW5E.FeaturePassive", items: [], hasActions: false, dataset: {type: "feat"} }
|
||||
};
|
||||
for ( let f of feats ) {
|
||||
if ( f.data.activation.type ) features.active.items.push(f);
|
||||
else features.passive.items.push(f);
|
||||
}
|
||||
classes.sort((a, b) => b.levels - a.levels);
|
||||
features.classes.items = classes;
|
||||
features.classfeatures.items = classfeatures;
|
||||
features.archetype.items = archetypes;
|
||||
features.species.items = species;
|
||||
features.background.items = backgrounds;
|
||||
features.lightsaberform.items = lightsaberforms;
|
||||
|
||||
// Assign and return
|
||||
data.inventory = Object.values(inventory);
|
||||
data.powerbook = powerbook;
|
||||
data.preparedPowers = nPrepared;
|
||||
data.features = Object.values(features);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* A helper method to establish the displayed preparation state for an item
|
||||
* @param {Item} item
|
||||
* @private
|
||||
*/
|
||||
_prepareItemToggleState(item) {
|
||||
if (item.type === "power") {
|
||||
const isAlways = getProperty(item.data, "preparation.mode") === "always";
|
||||
const isPrepared = getProperty(item.data, "preparation.prepared");
|
||||
item.toggleClass = isPrepared ? "active" : "";
|
||||
if ( isAlways ) item.toggleClass = "fixed";
|
||||
if ( isAlways ) item.toggleTitle = CONFIG.SW5E.powerPreparationModes.always;
|
||||
else if ( isPrepared ) item.toggleTitle = CONFIG.SW5E.powerPreparationModes.prepared;
|
||||
else item.toggleTitle = game.i18n.localize("SW5E.PowerUnprepared");
|
||||
}
|
||||
else {
|
||||
const isActive = getProperty(item.data, "equipped");
|
||||
item.toggleClass = isActive ? "active" : "";
|
||||
item.toggleTitle = game.i18n.localize(isActive ? "SW5E.Equipped" : "SW5E.Unequipped");
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Event Listeners and Handlers
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Activate event listeners using the prepared sheet HTML
|
||||
* @param html {HTML} The prepared HTML object ready to be rendered into the DOM
|
||||
*/
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
if ( !this.options.editable ) return;
|
||||
|
||||
// Inventory Functions
|
||||
html.find(".currency-convert").click(this._onConvertCurrency.bind(this));
|
||||
|
||||
// Item State Toggling
|
||||
html.find('.item-toggle').click(this._onToggleItem.bind(this));
|
||||
|
||||
// Short and Long Rest
|
||||
html.find('.short-rest').click(this._onShortRest.bind(this));
|
||||
html.find('.long-rest').click(this._onLongRest.bind(this));
|
||||
|
||||
// Death saving throws
|
||||
html.find('.death-save').click(this._onDeathSave.bind(this));
|
||||
|
||||
// Send Languages to Chat onClick
|
||||
html.find('[data-options="share-languages"]').click(event => {
|
||||
event.preventDefault();
|
||||
let langs = this.actor.data.data.traits.languages.value.map(l => SW5E.languages[l] || l).join(", ");
|
||||
let custom = this.actor.data.data.traits.languages.custom;
|
||||
if (custom) langs += ", " + custom.replace(/;/g, ",");
|
||||
let content = `
|
||||
<div class="sw5e chat-card item-card" data-acor-id="${this.actor._id}">
|
||||
<header class="card-header flexrow">
|
||||
<img src="${this.actor.data.token.img}" title="" width="36" height="36" style="border: none;"/>
|
||||
<h3>Known Languages</h3>
|
||||
</header>
|
||||
<div class="card-content">${langs}</div>
|
||||
</div>
|
||||
`;
|
||||
|
||||
// Send to Chat
|
||||
let rollWhisper = null;
|
||||
let rollBlind = false;
|
||||
let rollMode = game.settings.get("core", "rollMode");
|
||||
if (["gmroll", "blindroll"].includes(rollMode)) rollWhisper = ChatMessage.getWhisperIDs("GM");
|
||||
if (rollMode === "blindroll") rollBlind = true;
|
||||
ChatMessage.create({
|
||||
user: game.user._id,
|
||||
content: content,
|
||||
speaker: {
|
||||
actor: this.actor._id,
|
||||
token: this.actor.token,
|
||||
alias: this.actor.name
|
||||
},
|
||||
type: CONST.CHAT_MESSAGE_TYPES.OTHER
|
||||
});
|
||||
});
|
||||
|
||||
// Item Delete Confirmation
|
||||
html.find('.item-delete').off("click");
|
||||
html.find('.item-delete').click(event => {
|
||||
let li = $(event.currentTarget).parents('.item');
|
||||
let itemId = li.attr("data-item-id");
|
||||
let item = this.actor.getOwnedItem(itemId);
|
||||
new Dialog({
|
||||
title: `Deleting ${item.data.name}`,
|
||||
content: `<p>Are you sure you want to delete ${item.data.name}?</p>`,
|
||||
buttons: {
|
||||
Yes: {
|
||||
icon: '<i class="fa fa-check"></i>',
|
||||
label: 'Yes',
|
||||
callback: dlg => {
|
||||
this.actor.deleteOwnedItem(itemId);
|
||||
}
|
||||
},
|
||||
cancel: {
|
||||
icon: '<i class="fas fa-times"></i>',
|
||||
label: 'No'
|
||||
},
|
||||
},
|
||||
default: 'cancel'
|
||||
}).render(true);
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Handle rolling a death saving throw for the Character
|
||||
* @param {MouseEvent} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
_onDeathSave(event) {
|
||||
event.preventDefault();
|
||||
return this.actor.rollDeathSave({event: event});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
|
||||
/**
|
||||
* Handle toggling the state of an Owned Item within the Actor
|
||||
* @param {Event} event The triggering click event
|
||||
* @private
|
||||
*/
|
||||
_onToggleItem(event) {
|
||||
event.preventDefault();
|
||||
const itemId = event.currentTarget.closest(".item").dataset.itemId;
|
||||
const item = this.actor.getOwnedItem(itemId);
|
||||
const attr = item.data.type === "power" ? "data.preparation.prepared" : "data.equipped";
|
||||
return item.update({[attr]: !getProperty(item.data, attr)});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Take a short rest, calling the relevant function on the Actor instance
|
||||
* @param {Event} event The triggering click event
|
||||
* @private
|
||||
*/
|
||||
async _onShortRest(event) {
|
||||
event.preventDefault();
|
||||
await this._onSubmit(event);
|
||||
return this.actor.shortRest();
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Take a long rest, calling the relevant function on the Actor instance
|
||||
* @param {Event} event The triggering click event
|
||||
* @private
|
||||
*/
|
||||
async _onLongRest(event) {
|
||||
event.preventDefault();
|
||||
await this._onSubmit(event);
|
||||
return this.actor.longRest();
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/**
|
||||
* Handle mouse click events to convert currency to the highest possible denomination
|
||||
* @param {MouseEvent} event The originating click event
|
||||
* @private
|
||||
*/
|
||||
async _onConvertCurrency(event) {
|
||||
event.preventDefault();
|
||||
return Dialog.confirm({
|
||||
title: `${game.i18n.localize("SW5E.CurrencyConvert")}`,
|
||||
content: `<p>${game.i18n.localize("SW5E.CurrencyConvertHint")}</p>`,
|
||||
yes: () => this.actor.convertCurrency()
|
||||
});
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
/** @override */
|
||||
async _onDropItemCreate(itemData) {
|
||||
|
||||
// Upgrade the number of class levels a character has and add features
|
||||
if ( itemData.type === "class" ) {
|
||||
const cls = this.actor.itemTypes.class.find(c => c.name === itemData.name);
|
||||
const classWasAlreadyPresent = !!cls;
|
||||
|
||||
// Add new features for class level
|
||||
if ( !classWasAlreadyPresent ) {
|
||||
Actor5e.getClassFeatures(itemData).then(features => {
|
||||
this.actor.createEmbeddedEntity("OwnedItem", features);
|
||||
});
|
||||
}
|
||||
|
||||
// If the actor already has the class, increment the level instead of creating a new item
|
||||
// then add new features as long as level increases
|
||||
if ( classWasAlreadyPresent ) {
|
||||
const lvl = cls.data.data.levels;
|
||||
const newLvl = Math.min(lvl + 1, 20 + lvl - this.actor.data.data.details.level);
|
||||
if ( !(lvl === newLvl) ) {
|
||||
cls.update({"data.levels": newLvl});
|
||||
itemData.data.levels = newLvl;
|
||||
Actor5e.getClassFeatures(itemData).then(features => {
|
||||
this.actor.createEmbeddedEntity("OwnedItem", features);
|
||||
});
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
super._onDropItemCreate(itemData);
|
||||
}
|
||||
}
|
||||
|
||||
async function addFavorites(app, html, data) {
|
||||
// Thisfunction is adapted for the SwaltSheet from the Favorites Item
|
||||
// Tab Module created for Foundry VTT - by Felix Müller (Felix#6196 on Discord).
|
||||
// It is licensed under a Creative Commons Attribution 4.0 International License
|
||||
// and can be found at https://github.com/syl3r86/favtab.
|
||||
let favItems = [];
|
||||
let favFeats = [];
|
||||
let favPowers = {
|
||||
0: {
|
||||
isCantrip: true,
|
||||
powers: []
|
||||
},
|
||||
1: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power1.value,
|
||||
max: data.actor.data.powers.power1.max
|
||||
},
|
||||
2: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power2.value,
|
||||
max: data.actor.data.powers.power2.max
|
||||
},
|
||||
3: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power3.value,
|
||||
max: data.actor.data.powers.power3.max
|
||||
},
|
||||
4: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power4.value,
|
||||
max: data.actor.data.powers.power4.max
|
||||
},
|
||||
5: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power5.value,
|
||||
max: data.actor.data.powers.power5.max
|
||||
},
|
||||
6: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power6.value,
|
||||
max: data.actor.data.powers.power6.max
|
||||
},
|
||||
7: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power7.value,
|
||||
max: data.actor.data.powers.power7.max
|
||||
},
|
||||
8: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power8.value,
|
||||
max: data.actor.data.powers.power8.max
|
||||
},
|
||||
9: {
|
||||
powers: [],
|
||||
value: data.actor.data.powers.power9.value,
|
||||
max: data.actor.data.powers.power9.max
|
||||
}
|
||||
}
|
||||
|
||||
let powerCount = 0
|
||||
let items = data.actor.items;
|
||||
for (let item of items) {
|
||||
if (item.type == "class") continue;
|
||||
if (item.flags.favtab === undefined || item.flags.favtab.isFavourite === undefined) {
|
||||
item.flags.favtab = {
|
||||
isFavourite: false
|
||||
};
|
||||
}
|
||||
let isFav = item.flags.favtab.isFavourite;
|
||||
if (app.options.editable) {
|
||||
let favBtn = $(`<a class="item-control item-toggle item-fav ${isFav ? "active" : ""}" data-fav="${isFav}" title="${isFav ? "Remove from Favourites" : "Add to Favourites"}"><i class="fas fa-star"></i></a>`);
|
||||
favBtn.click(ev => {
|
||||
app.actor.getOwnedItem(item._id).update({
|
||||
"flags.favtab.isFavourite": !item.flags.favtab.isFavourite
|
||||
});
|
||||
});
|
||||
html.find(`.item[data-item-id="${item._id}"]`).find('.item-controls').prepend(favBtn);
|
||||
}
|
||||
|
||||
if (isFav) {
|
||||
item.powerComps = "";
|
||||
if (item.data.components) {
|
||||
let comps = item.data.components;
|
||||
let v = (comps.vocal) ? "V" : "";
|
||||
let s = (comps.somatic) ? "S" : "";
|
||||
let m = (comps.material) ? "M" : "";
|
||||
let c = (comps.concentration) ? true : false;
|
||||
let r = (comps.ritual) ? true : false;
|
||||
item.powerComps = `${v}${s}${m}`;
|
||||
item.powerCon = c;
|
||||
item.powerRit = r;
|
||||
}
|
||||
|
||||
item.editable = app.options.editable;
|
||||
switch (item.type) {
|
||||
case 'feat':
|
||||
if (item.flags.favtab.sort === undefined) {
|
||||
item.flags.favtab.sort = (favFeats.count + 1) * 100000; // initial sort key if not present
|
||||
}
|
||||
favFeats.push(item);
|
||||
break;
|
||||
case 'power':
|
||||
if (item.data.preparation.mode) {
|
||||
item.powerPrepMode = ` (${CONFIG.SW5E.powerPreparationModes[item.data.preparation.mode]})`
|
||||
}
|
||||
if (item.data.level) {
|
||||
favPowers[item.data.level].powers.push(item);
|
||||
} else {
|
||||
favPowers[0].powers.push(item);
|
||||
}
|
||||
powerCount++;
|
||||
break;
|
||||
default:
|
||||
if (item.flags.favtab.sort === undefined) {
|
||||
item.flags.favtab.sort = (favItems.count + 1) * 100000; // initial sort key if not present
|
||||
}
|
||||
favItems.push(item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Alter core CSS to fit new button
|
||||
// if (app.options.editable) {
|
||||
// html.find('.powerbook .item-controls').css('flex', '0 0 88px');
|
||||
// html.find('.inventory .item-controls, .features .item-controls').css('flex', '0 0 90px');
|
||||
// html.find('.favourite .item-controls').css('flex', '0 0 22px');
|
||||
// }
|
||||
|
||||
let tabContainer = html.find('.favtabtarget');
|
||||
data.favItems = favItems.length > 0 ? favItems.sort((a, b) => (a.flags.favtab.sort) - (b.flags.favtab.sort)) : false;
|
||||
data.favFeats = favFeats.length > 0 ? favFeats.sort((a, b) => (a.flags.favtab.sort) - (b.flags.favtab.sort)) : false;
|
||||
data.favPowers = powerCount > 0 ? favPowers : false;
|
||||
data.editable = app.options.editable;
|
||||
|
||||
await loadTemplates(['systems/sw5e/templates/actors/newActor/item.hbs']);
|
||||
let favtabHtml = $(await renderTemplate('systems/sw5e/templates/actors/newActor/template.hbs', data));
|
||||
favtabHtml.find('.item-name h4').click(event => app._onItemSummary(event));
|
||||
|
||||
if (app.options.editable) {
|
||||
favtabHtml.find('.item-image').click(ev => app._onItemRoll(ev));
|
||||
let handler = ev => app._onDragItemStart(ev);
|
||||
favtabHtml.find('.item').each((i, li) => {
|
||||
if (li.classList.contains("inventory-header")) return;
|
||||
li.setAttribute("draggable", true);
|
||||
li.addEventListener("dragstart", handler, false);
|
||||
});
|
||||
//favtabHtml.find('.item-toggle').click(event => app._onToggleItem(event));
|
||||
favtabHtml.find('.item-edit').click(ev => {
|
||||
let itemId = $(ev.target).parents('.item')[0].dataset.itemId;
|
||||
app.actor.getOwnedItem(itemId).sheet.render(true);
|
||||
});
|
||||
favtabHtml.find('.item-fav').click(ev => {
|
||||
let itemId = $(ev.target).parents('.item')[0].dataset.itemId;
|
||||
let val = !app.actor.getOwnedItem(itemId).data.flags.favtab.isFavourite
|
||||
app.actor.getOwnedItem(itemId).update({
|
||||
"flags.favtab.isFavourite": val
|
||||
});
|
||||
});
|
||||
|
||||
// Sorting
|
||||
favtabHtml.find('.item').on('drop', ev => {
|
||||
ev.preventDefault();
|
||||
ev.stopPropagation();
|
||||
|
||||
let dropData = JSON.parse(ev.originalEvent.dataTransfer.getData('text/plain'));
|
||||
// if (dropData.actorId !== app.actor.id || dropData.data.type === 'power') return;
|
||||
if (dropData.actorId !== app.actor.id) return;
|
||||
let list = null;
|
||||
if (dropData.data.type === 'feat') list = favFeats;
|
||||
else list = favItems;
|
||||
let dragSource = list.find(i => i._id === dropData.data._id);
|
||||
let siblings = list.filter(i => i._id !== dropData.data._id);
|
||||
let targetId = ev.target.closest('.item').dataset.itemId;
|
||||
let dragTarget = siblings.find(s => s._id === targetId);
|
||||
|
||||
if (dragTarget === undefined) return;
|
||||
const sortUpdates = SortingHelpers.performIntegerSort(dragSource, {
|
||||
target: dragTarget,
|
||||
siblings: siblings,
|
||||
sortKey: 'flags.favtab.sort'
|
||||
});
|
||||
const updateData = sortUpdates.map(u => {
|
||||
const update = u.update;
|
||||
update._id = u.target._id;
|
||||
return update;
|
||||
});
|
||||
app.actor.updateEmbeddedEntity("OwnedItem", updateData);
|
||||
});
|
||||
}
|
||||
tabContainer.append(favtabHtml);
|
||||
|
||||
// try {
|
||||
// if (game.modules.get("betterrolls5e") && game.modules.get("betterrolls5e").active) BetterRolls.addItemContent(app.object, favtabHtml, ".item .item-name h4", ".item-properties", ".item > .rollable div");
|
||||
// }
|
||||
// catch (err) {
|
||||
// // Better Rolls not found!
|
||||
// }
|
||||
Hooks.callAll("renderedSwaltSheet", app, html, data);
|
||||
}
|
||||
async function addSubTabs(app, html, data) {
|
||||
if(data.options.subTabs == null) {
|
||||
//let subTabs = []; //{subgroup: '', target: '', active: false}
|
||||
data.options.subTabs = {};
|
||||
html.find('[data-subgroup-selection] [data-subgroup]').each((idx, el) => {
|
||||
let subgroup = el.getAttribute('data-subgroup');
|
||||
let target = el.getAttribute('data-target');
|
||||
let targetObj = {target: target, active: el.classList.contains("active")}
|
||||
if(data.options.subTabs.hasOwnProperty(subgroup)) {
|
||||
data.options.subTabs[subgroup].push(targetObj);
|
||||
} else {
|
||||
data.options.subTabs[subgroup] = [];
|
||||
data.options.subTabs[subgroup].push(targetObj);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
for(const group in data.options.subTabs) {
|
||||
data.options.subTabs[group].forEach(tab => {
|
||||
if(tab.active) {
|
||||
html.find(`[data-subgroup=${group}][data-target=${tab.target}]`).addClass('active');
|
||||
} else {
|
||||
html.find(`[data-subgroup=${group}][data-target=${tab.target}]`).removeClass('active');
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
html.find('[data-subgroup-selection]').children().on('click', event => {
|
||||
let subgroup = event.target.closest('[data-subgroup]').getAttribute('data-subgroup');
|
||||
let target = event.target.closest('[data-target]').getAttribute('data-target');
|
||||
html.find(`[data-subgroup=${subgroup}]`).removeClass('active');
|
||||
html.find(`[data-subgroup=${subgroup}][data-target=${target}]`).addClass('active');
|
||||
let tabId = data.options.subTabs[subgroup].find(tab => {
|
||||
return tab.target == target
|
||||
});
|
||||
data.options.subTabs[subgroup].map(el => {
|
||||
if(el.target == target) {
|
||||
el.active = true;
|
||||
} else {
|
||||
el.active = false;
|
||||
}
|
||||
return el;
|
||||
})
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
import ActorSheet5e from "./base.js";
|
||||
import Actor5e from "../entity.js";
|
||||
import ActorSheet5e from "../base.js";
|
||||
import Actor5e from "../../entity.js";
|
||||
|
||||
/**
|
||||
* An Actor sheet for player character type actors in the SW5E system.
|
|
@ -1,4 +1,4 @@
|
|||
import ActorSheet5e from "../sheets/base.js";
|
||||
import ActorSheet5e from "../base.js";
|
||||
|
||||
/**
|
||||
* An Actor sheet for NPC type characters in the SW5E system.
|
|
@ -1,4 +1,4 @@
|
|||
import ActorSheet5e from "./base.js";
|
||||
import ActorSheet5e from "../base.js";
|
||||
|
||||
/**
|
||||
* An Actor sheet for Vehicle type actors.
|
|
@ -9,12 +9,22 @@ export const preloadHandlebarsTemplates = async function() {
|
|||
const templatePaths = [
|
||||
|
||||
// Actor Sheet Partials
|
||||
"systems/sw5e/templates/actors/parts/actor-traits.html",
|
||||
"systems/sw5e/templates/actors/parts/actor-inventory.html",
|
||||
"systems/sw5e/templates/actors/parts/actor-features.html",
|
||||
"systems/sw5e/templates/actors/parts/actor-powerbook.html",
|
||||
"systems/sw5e/templates/actors/parts/actor-effects.html",
|
||||
"systems/sw5e/templates/actors/oldActor/parts/actor-traits.html",
|
||||
"systems/sw5e/templates/actors/oldActor/parts/actor-inventory.html",
|
||||
"systems/sw5e/templates/actors/oldActor/parts/actor-features.html",
|
||||
"systems/sw5e/templates/actors/oldActor/parts/actor-powerbook.html",
|
||||
"systems/sw5e/templates/actors/oldActor/parts/actor-effects.html",
|
||||
|
||||
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-biography.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-core.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-features.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-notes.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-powerbook.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-resources.html",
|
||||
"systems/sw5e/templates/actors/newActor/parts/swalt-traits.html",
|
||||
|
||||
// Item Sheet Partials
|
||||
"systems/sw5e/templates/items/parts/item-action.html",
|
||||
"systems/sw5e/templates/items/parts/item-activation.html",
|
||||
|
|
1787
sw5e copy.css
Normal file
1787
sw5e copy.css
Normal file
File diff suppressed because it is too large
Load diff
757
sw5e-update.css
Normal file
757
sw5e-update.css
Normal file
|
@ -0,0 +1,757 @@
|
|||
/* ----------------------------------------- */
|
||||
/* Fonts */
|
||||
/* ----------------------------------------- */
|
||||
/* russo-one-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Russo One';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/RussoOne.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Russo One';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/RussoOne.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Russo One';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('./fonts/RussoOne.ttf');
|
||||
}
|
||||
/* open-sans-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/OpenSans-Regular.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url('./fonts/OpenSans-Italic.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('./fonts/OpenSans-Bold.ttf');
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Open Sans';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('./fonts/OpenSans-BoldItalic.ttf');
|
||||
}
|
||||
/* ----------------------------------------- */
|
||||
/* Sheet Styles */
|
||||
/* ----------------------------------------- */
|
||||
html {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
*,
|
||||
*:before,
|
||||
*:after {
|
||||
box-sizing: inherit;
|
||||
}
|
||||
::-webkit-scrollbar-track {
|
||||
border: 1px solid #0d99cc;
|
||||
border-radius: 4px;
|
||||
}
|
||||
::-webkit-scrollbar-thumb {
|
||||
outline: none;
|
||||
border-radius: 4px;
|
||||
background: #0d99cc;
|
||||
border: none;
|
||||
}
|
||||
:root {
|
||||
scrollbar-width: thin;
|
||||
scrollbar-color: #0d99cc #afc6d6;
|
||||
}
|
||||
body {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h1 {
|
||||
font-family: 'Russo One';
|
||||
font-size: 34px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h2 {
|
||||
font-family: 'Russo One';
|
||||
font-size: 27px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h3 {
|
||||
font-family: 'Russo One';
|
||||
font-size: 21px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h4 {
|
||||
font-family: 'Russo One';
|
||||
font-size: 17px;
|
||||
font-weight: 400;
|
||||
}
|
||||
h5,
|
||||
h6 {
|
||||
font-family: 'Russo One';
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
}
|
||||
a {
|
||||
color: #c40f0f;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover,
|
||||
a:active {
|
||||
text-shadow: none;
|
||||
text-decoration: underline;
|
||||
}
|
||||
.app {
|
||||
background: linear-gradient(90deg, #afc6d6 0%, #D6D6D6 30%, #D6D6D6 70%, #afc6d6);
|
||||
border: none;
|
||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
#context-menu {
|
||||
background: none;
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
color: #1C1C1C;
|
||||
padding: 0 8px;
|
||||
}
|
||||
#context-menu ol.context-items {
|
||||
background: white;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #828282;
|
||||
box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 0 2px 4px -1px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
#context-menu ol.context-items li.context-item:first-child {
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
#context-menu ol.context-items li.context-item:last-child {
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
#context-menu ol.context-items li.context-item i {
|
||||
color: #0d99cc;
|
||||
}
|
||||
#context-menu ol.context-items li.context-item:hover {
|
||||
background: #c40f0f;
|
||||
color: white;
|
||||
text-shadow: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
#context-menu ol.context-items li.context-item:hover i {
|
||||
color: white;
|
||||
}
|
||||
#context-menu ol.context-items li.context-item + li {
|
||||
border-top: 1px solid #D6D6D6;
|
||||
}
|
||||
input[type="text"],
|
||||
input[type="number"],
|
||||
input[type="password"],
|
||||
input[type="date"],
|
||||
input[type="time"],
|
||||
select,
|
||||
textarea {
|
||||
border: 1px solid #828282;
|
||||
border-radius: 4px;
|
||||
color: #1C1C1C;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
input[type="text"]:hover,
|
||||
input[type="number"]:hover,
|
||||
input[type="password"]:hover,
|
||||
input[type="date"]:hover,
|
||||
input[type="time"]:hover,
|
||||
select:hover,
|
||||
textarea:hover {
|
||||
border-color: #4f4f4f;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type="text"]:focus,
|
||||
input[type="number"]:focus,
|
||||
input[type="password"]:focus,
|
||||
input[type="date"]:focus,
|
||||
input[type="time"]:focus,
|
||||
select:focus,
|
||||
textarea:focus {
|
||||
border-color: #c40f0f;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range] {
|
||||
-webkit-appearance: none;
|
||||
/* Hides the slider so that custom slider can be made */
|
||||
width: 100%;
|
||||
/* Specific width is required for Firefox. */
|
||||
background: transparent;
|
||||
/* Otherwise white in Chrome */
|
||||
}
|
||||
input[type=range]::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
background: #c40f0f;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 32px;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-moz-range-thumb {
|
||||
-webkit-appearance: none;
|
||||
background: #c40f0f;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 32px;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-ms-thumb {
|
||||
-webkit-appearance: none;
|
||||
background: #c40f0f;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 32px;
|
||||
cursor: pointer;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-webkit-slider-runnable-track {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
cursor: pointer;
|
||||
background: #7ed6f7;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #0d99cc;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]:focus::-webkit-slider-runnable-track {
|
||||
background: #0d99cc;
|
||||
}
|
||||
input[type=range]::-moz-range-track {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
cursor: pointer;
|
||||
background: #7ed6f7;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #0d99cc;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
height: 6px;
|
||||
cursor: pointer;
|
||||
background: #7ed6f7;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #0d99cc;
|
||||
box-shadow: none;
|
||||
}
|
||||
input[type=range]:focus {
|
||||
outline: none;
|
||||
/* Removes the blue border. You should probably do some kind of focus styling for accessibility reasons though. */
|
||||
}
|
||||
input[type=range]::-ms-track {
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
/* Hides the slider so custom styles can be added */
|
||||
background: transparent;
|
||||
border-color: transparent;
|
||||
color: transparent;
|
||||
}
|
||||
button {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
background: #c40f0f;
|
||||
color: white;
|
||||
text-align: center;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
button:hover,
|
||||
button:focus {
|
||||
box-shadow: none;
|
||||
background: #dc1111;
|
||||
}
|
||||
#sidebar {
|
||||
border: none;
|
||||
}
|
||||
#sidebar-tabs {
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
background: white;
|
||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
#sidebar-tabs > .collapse {
|
||||
color: #c40f0f;
|
||||
}
|
||||
#sidebar-tabs .item {
|
||||
font-size: 16px;
|
||||
}
|
||||
#sidebar-tabs .item.active {
|
||||
color: #c40f0f;
|
||||
border: none;
|
||||
border-bottom: 3px solid #c40f0f;
|
||||
box-shadow: none;
|
||||
background: none;
|
||||
text-shadow: none;
|
||||
}
|
||||
/*-----------
|
||||
** Chat Tab
|
||||
-----------*/
|
||||
#chat-log .chat-message {
|
||||
background: white;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 8px;
|
||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
#chat-log .chat-message > header {
|
||||
color: #c40f0f;
|
||||
border-bottom: 2px solid #0d99cc;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
#chat-log .chat-message > header span {
|
||||
color: #1C1C1C;
|
||||
}
|
||||
.notification-pip {
|
||||
color: #0d99cc;
|
||||
text-shadow: none;
|
||||
}
|
||||
.sw5e.chat-card {
|
||||
font-size: 13px;
|
||||
}
|
||||
.sw5e.chat-card .card-header {
|
||||
padding: 0;
|
||||
border: none;
|
||||
}
|
||||
.sw5e.chat-card .card-header img {
|
||||
flex: 0 0 36px;
|
||||
margin-right: 4px;
|
||||
}
|
||||
.sw5e.chat-card .card-header h3 {
|
||||
flex: 1;
|
||||
margin: 0;
|
||||
line-height: 36px;
|
||||
font-family: 'Russo One';
|
||||
font-size: 17px;
|
||||
font-weight: 400;
|
||||
color: #1C1C1C;
|
||||
}
|
||||
.sw5e.chat-card .card-header h3:hover {
|
||||
color: #1C1C1C;
|
||||
text-shadow: none;
|
||||
}
|
||||
.sw5e.chat-card .card-content {
|
||||
margin: 4px 0;
|
||||
}
|
||||
.sw5e.chat-card .card-content h3 {
|
||||
font-size: 12px;
|
||||
margin: 0;
|
||||
font-weight: bold;
|
||||
}
|
||||
.sw5e.chat-card .card-content > * {
|
||||
-webkit-user-select: text;
|
||||
-moz-user-select: text;
|
||||
-ms-user-select: text;
|
||||
user-select: text;
|
||||
}
|
||||
.sw5e.chat-card .card-buttons {
|
||||
margin: 4px 0;
|
||||
}
|
||||
.sw5e.chat-card .card-buttons span {
|
||||
display: block;
|
||||
line-height: 28px;
|
||||
text-align: center;
|
||||
border: 1px solid #828282;
|
||||
}
|
||||
.sw5e.chat-card .card-buttons button {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
padding: 4px 0;
|
||||
height: auto;
|
||||
line-height: 1.6;
|
||||
margin: 4px 0;
|
||||
background: #c40f0f;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.sw5e.chat-card .card-buttons button:hover,
|
||||
.sw5e.chat-card .card-buttons button:focus {
|
||||
background-color: #dc1111;
|
||||
box-shadow: none;
|
||||
}
|
||||
.sw5e.chat-card .card-footer {
|
||||
padding: 4px 0 0;
|
||||
border-top: 1px solid #7ed6f7;
|
||||
}
|
||||
.sw5e.chat-card .card-footer span {
|
||||
border-right: 2px groove #FFF;
|
||||
padding: 0 4px 0 0;
|
||||
font-size: 10px;
|
||||
}
|
||||
.sw5e.chat-card .card-footer span:last-child {
|
||||
border-right: none;
|
||||
padding-right: 0;
|
||||
}
|
||||
.dice-roll .dice-formula {
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
.dice-roll .dice-total {
|
||||
background: #afc6d6;
|
||||
border: 1px solid #0d99cc;
|
||||
border-radius: 0;
|
||||
padding: 4px 0;
|
||||
box-shadow: 0 0 12px rgba(13, 153, 204, 0.5);
|
||||
}
|
||||
.dice-roll .dice-total.success {
|
||||
color: inherit;
|
||||
background: #c7d0c0;
|
||||
border: 1px solid #006c00;
|
||||
}
|
||||
.dice-roll .dice-total.failure {
|
||||
color: inherit;
|
||||
background: #ffdddd;
|
||||
border: 1px solid #6e0000;
|
||||
}
|
||||
.dice-roll .dice-total.critical {
|
||||
color: #0dce0d;
|
||||
background: #bcdcbe;
|
||||
box-shadow: 0 0 12px rgba(13, 206, 13, 0.5);
|
||||
}
|
||||
.dice-roll .dice-total.fumble {
|
||||
color: red;
|
||||
}
|
||||
#chat-controls {
|
||||
padding-top: 4px;
|
||||
}
|
||||
#chat-controls label {
|
||||
color: #1C1C1C;
|
||||
}
|
||||
#chat-form textarea {
|
||||
background: white;
|
||||
}
|
||||
#chat-form textarea:focus {
|
||||
box-shadow: none;
|
||||
outline: none;
|
||||
}
|
||||
/*-----------
|
||||
** Combat Tab
|
||||
-----------*/
|
||||
#combat #combat-round {
|
||||
color: #c40f0f;
|
||||
border-bottom: 2px solid #0d99cc;
|
||||
}
|
||||
#combat #combat-round .encounters h4 {
|
||||
color: #c40f0f;
|
||||
}
|
||||
#combat #combat-round .encounters a {
|
||||
color: #4f4f4f;
|
||||
}
|
||||
#combat #combat-round .encounters a:hover {
|
||||
color: #c40f0f;
|
||||
}
|
||||
#combat #combat-tracker li.combatant {
|
||||
padding: 4px 0;
|
||||
color: #1C1C1C;
|
||||
background: none;
|
||||
}
|
||||
#combat #combat-tracker li.combatant:nth-child(even) {
|
||||
background: rgba(175, 198, 214, 0.5);
|
||||
}
|
||||
#combat #combat-tracker li.combatant h4 {
|
||||
color: #1C1C1C;
|
||||
text-shadow: none;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .roll {
|
||||
background: none;
|
||||
color: #4f4f4f;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .roll::before {
|
||||
content: "\f6cf";
|
||||
font-family: "Font Awesome 5 Free";
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
font-weight: 900;
|
||||
font-size: 28px;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .roll:hover {
|
||||
color: #c40f0f;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .combatant-control {
|
||||
color: #828282;
|
||||
text-shadow: none;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .combatant-control.active {
|
||||
color: #363636;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .token-resource {
|
||||
color: #4f4f4f;
|
||||
border-right: 1px solid #828282;
|
||||
}
|
||||
#combat #combat-tracker li.combatant .initiative {
|
||||
text-shadow: none;
|
||||
}
|
||||
#combat #combat-tracker li.combatant.active {
|
||||
color: #0d99cc;
|
||||
}
|
||||
#combat #combat-tracker li.combatant.active .initiative,
|
||||
#combat #combat-tracker li.combatant.active h4 {
|
||||
color: #0d99cc;
|
||||
}
|
||||
#combat #combat-tracker li.combatant.hidden {
|
||||
opacity: 0.5;
|
||||
color: #1C1C1C;
|
||||
}
|
||||
#combat #combat-controls {
|
||||
padding-top: 0;
|
||||
border-top: 1px solid #0d99cc;
|
||||
}
|
||||
/*
|
||||
** Folders
|
||||
*/
|
||||
.sidebar-tab .directory-header {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
.sidebar-tab .directory-header .header-search {
|
||||
position: relative;
|
||||
}
|
||||
.sidebar-tab .directory-header .header-search i.fa-search {
|
||||
position: absolute;
|
||||
left: 8px;
|
||||
color: #0d99cc;
|
||||
}
|
||||
.sidebar-tab .directory-header .header-search input {
|
||||
text-align: left;
|
||||
padding-left: 22px;
|
||||
background: white;
|
||||
}
|
||||
.sidebar-tab .directory-header .header-search input:focus {
|
||||
box-shadow: none;
|
||||
}
|
||||
.sidebar-tab .subdirectory {
|
||||
border: none;
|
||||
margin-left: 8px;
|
||||
background: white;
|
||||
min-height: 8px;
|
||||
}
|
||||
.sidebar-tab .subdirectory .folder {
|
||||
border-left: 2px solid rgba(28, 28, 28, 0.4);
|
||||
}
|
||||
.sidebar-tab .directory-list {
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
.sidebar-tab .directory-list li + li {
|
||||
border-top: 1px solid #0d99cc;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header {
|
||||
line-height: default;
|
||||
padding: 0 0 0 8px;
|
||||
position: relative;
|
||||
border: none;
|
||||
background: white;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header h3 {
|
||||
padding: 8px 4px;
|
||||
background: white;
|
||||
color: #1C1C1C;
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
line-height: 1.6;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header h3 > i {
|
||||
margin-right: 4px;
|
||||
color: #0d99cc;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header a {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 4px;
|
||||
height: 100%;
|
||||
padding: 0 4px;
|
||||
color: #828282;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header a:hover {
|
||||
color: #c40f0f;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header a i {
|
||||
margin-top: 12px;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder > .folder-header a.create-folder {
|
||||
right: 28px;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder.collapsed > .folder-header {
|
||||
background: white;
|
||||
}
|
||||
.sidebar-tab .directory-list .folder + .entity {
|
||||
border-top: 1px solid #0d99cc;
|
||||
}
|
||||
.sidebar-tab .directory-list .directory-item img {
|
||||
flex: 0 0 32px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
align-self: center;
|
||||
}
|
||||
.sidebar-tab .directory-list .actor,
|
||||
.sidebar-tab .directory-list .item,
|
||||
.sidebar-tab .directory-list .journal,
|
||||
.sidebar-tab .directory-list .table {
|
||||
background: white;
|
||||
border: none;
|
||||
}
|
||||
.sidebar-tab .directory-list .actor .entity-name,
|
||||
.sidebar-tab .directory-list .item .entity-name,
|
||||
.sidebar-tab .directory-list .journal .entity-name,
|
||||
.sidebar-tab .directory-list .table .entity-name {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
color: #1C1C1C;
|
||||
}
|
||||
.sidebar-tab .directory-list .actor:nth-child(even),
|
||||
.sidebar-tab .directory-list .item:nth-child(even),
|
||||
.sidebar-tab .directory-list .journal:nth-child(even),
|
||||
.sidebar-tab .directory-list .table:nth-child(even) {
|
||||
background: rgba(175, 198, 214, 0.3);
|
||||
}
|
||||
#scenes .subdirectory {
|
||||
border-left: none;
|
||||
}
|
||||
#scenes .scene {
|
||||
border: none;
|
||||
border-top: 1px solid #0d99cc;
|
||||
border-left: 4px solid #0d99cc;
|
||||
box-shadow: none;
|
||||
position: relative;
|
||||
height: 128px;
|
||||
}
|
||||
#scenes .scene + .scene {
|
||||
margin-top: 4px;
|
||||
}
|
||||
#scenes .scene::after {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 99px;
|
||||
position: absolute;
|
||||
top: 28px;
|
||||
left: 0;
|
||||
box-shadow: 0 0 20px #0d99cc inset;
|
||||
}
|
||||
#scenes .scene h3 {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
text-align: left;
|
||||
text-shadow: none;
|
||||
padding: 4px 4px 4px 12px;
|
||||
background: white;
|
||||
line-height: 1.6;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
#playlists .directory-list {
|
||||
padding: 0 8px;
|
||||
}
|
||||
#playlists .directory-list li.playlist {
|
||||
padding: 8px;
|
||||
border-radius: 4px;
|
||||
background: white;
|
||||
margin-bottom: 8px;
|
||||
border-top: inherit;
|
||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
#playlists .directory-list li.playlist .playlist-header {
|
||||
background: white;
|
||||
color: #c40f0f;
|
||||
text-decoration: none;
|
||||
border-bottom: 2px solid #0d99cc;
|
||||
}
|
||||
#playlists .directory-list li.playlist li.sound {
|
||||
border: none;
|
||||
color: #1C1C1C;
|
||||
}
|
||||
#playlists .directory-list li.playlist li.sound h4 {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
}
|
||||
#playlists .directory-list li.playlist a.sound-control {
|
||||
color: #c40f0f;
|
||||
}
|
||||
#compendium .compendium-entity {
|
||||
margin: 0 4px;
|
||||
padding: 8px;
|
||||
background: white !important;
|
||||
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
}
|
||||
#compendium .compendium-entity + .compendium-entity {
|
||||
margin-top: 4px;
|
||||
}
|
||||
#compendium .compendium-entity h3 {
|
||||
border: none;
|
||||
color: #c40f0f;
|
||||
border-bottom: 2px solid #0d99cc;
|
||||
font-family: 'Russo One';
|
||||
font-size: 17px;
|
||||
font-weight: 400;
|
||||
padding: 0;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack {
|
||||
margin: 0;
|
||||
padding: 4px;
|
||||
border: none;
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack:nth-child(even) {
|
||||
background: rgba(175, 198, 214, 0.3);
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack .pack-title {
|
||||
margin: 0;
|
||||
position: relative;
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack .pack-title a {
|
||||
font-family: 'Open Sans';
|
||||
font-size: 13px;
|
||||
font-weight: 700;
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack .pack-title a i {
|
||||
display: none;
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack .pack-title .status-icons {
|
||||
top: 4px;
|
||||
color: #828282;
|
||||
font-size: 13px;
|
||||
}
|
||||
#compendium .compendium-entity ol.compendium-list li.compendium-pack footer.compendium-footer {
|
||||
color: #1C1C1C;
|
||||
}
|
||||
#settings h2 {
|
||||
color: #c40f0f;
|
||||
border: none;
|
||||
border-bottom: 2px solid #0d99cc;
|
||||
margin: 0 8px;
|
||||
padding: 0;
|
||||
}
|
||||
#settings #game-details,
|
||||
#settings #settings-game,
|
||||
#settings #settings-documentation,
|
||||
#settings #settings-access {
|
||||
padding: 0 8px;
|
||||
margin: 0 0 8px;
|
||||
color: #1C1C1C;
|
||||
}
|
42
sw5e.js
42
sw5e.js
|
@ -22,9 +22,10 @@ import Item5e from "./module/item/entity.js";
|
|||
import AbilityTemplate from "./module/pixi/ability-template.js";
|
||||
import AbilityUseDialog from "./module/apps/ability-use-dialog.js";
|
||||
import ActorSheetFlags from "./module/apps/actor-flags.js";
|
||||
import ActorSheet5eCharacter from "./module/actor/sheets/character.js";
|
||||
import ActorSheet5eNPC from "./module/actor/sheets/npc.js";
|
||||
import ActorSheet5eVehicle from "./module/actor/sheets/vehicle.js";
|
||||
import ActorSheet5eCharacter from "./module/actor/sheets/oldSheets/character.js";
|
||||
import ActorSheet5eNPC from "./module/actor/sheets/oldSheets/npc.js";
|
||||
import ActorSheet5eVehicle from "./module/actor/sheets/oldSheets/vehicle.js";
|
||||
import ActorSheet5eCharacterNew from "./module/actor/sheets/newSheet/character.js";
|
||||
import ItemSheet5e from "./module/item/sheet.js";
|
||||
import ShortRestDialog from "./module/apps/short-rest.js";
|
||||
import TraitSelector from "./module/apps/trait-selector.js";
|
||||
|
@ -48,6 +49,7 @@ Hooks.once("init", function() {
|
|||
AbilityUseDialog,
|
||||
ActorSheetFlags,
|
||||
ActorSheet5eCharacter,
|
||||
ActorSheet5eCharacterNew,
|
||||
ActorSheet5eNPC,
|
||||
ActorSheet5eVehicle,
|
||||
ItemSheet5e,
|
||||
|
@ -87,11 +89,16 @@ Hooks.once("init", function() {
|
|||
|
||||
// Register sheet application classes
|
||||
Actors.unregisterSheet("core", ActorSheet);
|
||||
Actors.registerSheet("sw5e", ActorSheet5eCharacter, {
|
||||
Actors.registerSheet("sw5e", ActorSheet5eCharacterNew, {
|
||||
types: ["character"],
|
||||
makeDefault: true,
|
||||
label: "SW5E.SheetClassCharacter"
|
||||
});
|
||||
Actors.registerSheet("sw5e", ActorSheet5eCharacter, {
|
||||
types: ["character"],
|
||||
makeDefault: false,
|
||||
label: "SW5E.SheetClassCharacterOld"
|
||||
});
|
||||
Actors.registerSheet("sw5e", ActorSheet5eNPC, {
|
||||
types: ["npc"],
|
||||
makeDefault: true,
|
||||
|
@ -213,8 +220,33 @@ Hooks.on("getChatLogEntryContext", chat.addChatMessageContextOptions);
|
|||
Hooks.on("renderChatLog", (app, html, data) => Item5e.chatListeners(html));
|
||||
Hooks.on("renderChatPopout", (app, html, data) => Item5e.chatListeners(html));
|
||||
Hooks.on('getActorDirectoryEntryContext', Actor5e.addDirectoryContextOptions);
|
||||
|
||||
Hooks.on("renderSceneDirectory", (app, html, data)=> {
|
||||
//console.log(html.find("header.folder-header"));
|
||||
setFolderBackground(html);
|
||||
});
|
||||
Hooks.on("renderActorDirectory", (app, html, data)=> {
|
||||
setFolderBackground(html);
|
||||
});
|
||||
Hooks.on("renderItemDirectory", (app, html, data)=> {
|
||||
setFolderBackground(html);
|
||||
});
|
||||
Hooks.on("renderJournalDirectory", (app, html, data)=> {
|
||||
setFolderBackground(html);
|
||||
});
|
||||
Hooks.on("renderRollTableDirectory", (app, html, data)=> {
|
||||
setFolderBackground(html);
|
||||
});
|
||||
// TODO I should remove this
|
||||
Handlebars.registerHelper('getProperty', function (data, property) {
|
||||
return getProperty(data, property);
|
||||
});
|
||||
|
||||
|
||||
function setFolderBackground(html) {
|
||||
html.find("header.folder-header").each(function() {
|
||||
let bgColor = $(this).css("background-color");
|
||||
if(bgColor == undefined)
|
||||
bgColor = "rgb(255,255,255)";
|
||||
$(this).closest('li').css("background-color", bgColor);
|
||||
})
|
||||
}
|
|
@ -6,7 +6,7 @@
|
|||
"author": "Dev Team",
|
||||
"scripts": [],
|
||||
"esmodules": ["sw5e.js"],
|
||||
"styles": ["sw5e.css"],
|
||||
"styles": ["sw5e.css", "sw5e-update.css"],
|
||||
"packs": [
|
||||
{
|
||||
"name": "adventuringgear",
|
||||
|
|
144
templates/actors/newActor/character-sheet.html
Normal file
144
templates/actors/newActor/character-sheet.html
Normal file
|
@ -0,0 +1,144 @@
|
|||
<form class="{{cssClass}} swalt-sheet" autocomplete="off">
|
||||
{{!-- Sheet Header --}}
|
||||
<header class="panel">
|
||||
<img class="profile" src="{{actor.img}}" title="{{actor.name}}" data-edit="img" />
|
||||
<h1 class="character-name">
|
||||
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'SW5E.Name' }}" />
|
||||
</h1>
|
||||
<div class="level-experience">
|
||||
<div class="charlevel">
|
||||
{{ localize "SW5E.Level" }} {{data.details.level}} {{classLabels}}
|
||||
</div>
|
||||
{{#unless disableExperience}}
|
||||
<div class="experience">
|
||||
<input name="data.details.xp.value" type="text" value="{{data.details.xp.value}}" data-dtype="Number"
|
||||
placeholder="0" />
|
||||
<span class="sep">/</span>
|
||||
<span class="max">{{data.details.xp.max}}</span>
|
||||
</div>
|
||||
<div class="xpbar">
|
||||
<span class="bar" style="width: {{data.details.xp.pct}}%"></span>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
<div class="summary">
|
||||
<input type="text" name="data.details.species" value="{{data.details.species}}"
|
||||
placeholder="{{ localize 'SW5E.Species' }}" />
|
||||
<input type="text" name="data.details.background" value="{{data.details.background}}"
|
||||
placeholder="{{ localize 'SW5E.Background' }}" />
|
||||
<input type="text" name="data.details.alignment" value="{{data.details.alignment}}"
|
||||
placeholder="{{ localize 'SW5E.Alignment' }}" />
|
||||
<div class="proficiency">
|
||||
Proficiency {{numberFormat data.attributes.prof decimals=0 sign=true}}
|
||||
</div>
|
||||
</div>
|
||||
{{!-- Header Attributes --}}
|
||||
<div class="attributes">
|
||||
{{!-- ARMOR CLASS --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.ArmorClass" }}</h1>
|
||||
<div class="attribute-value">
|
||||
<input class="ac-display" name="data.attributes.ac.value" type="text"
|
||||
value="{{data.attributes.ac.value}}" data-dtype="Number" placeholder="10" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{!-- HIT POINTS --}}
|
||||
<section>
|
||||
<h1>Hit Points</h1>
|
||||
<div class="attribute-value multiple">
|
||||
<input name="data.attributes.hp.value" type="text" value="{{data.attributes.hp.value}}"
|
||||
data-dtype="Number" placeholder="10" class="value-number" />
|
||||
<span class="value-separator">/</span>
|
||||
<input name="data.attributes.hp.max" type="text" value="{{data.attributes.hp.max}}"
|
||||
data-dtype="Number" placeholder="10" class="value-number" />
|
||||
</div>
|
||||
<footer class="attribute-footer hit-points">
|
||||
<input name="data.attributes.hp.temp" type="text" class="temphp" placeholder="+Temp"
|
||||
value="{{data.attributes.hp.temp}}" data-dtype="{{data.attributes.hp.type}}" />
|
||||
<input name="data.attributes.hp.tempmax" type="text" class="temphp" placeholder="+Max"
|
||||
value="{{data.attributes.hp.tempmax}}" data-dtype="{{data.attributes.hp.type}}" />
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
{{!-- HIT DICE / SHORT & LONG REST BUTTONS --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.HitDice" }}</h1>
|
||||
<div class="attribute-value multiple">
|
||||
<span class="value-number">{{data.attributes.hd}}</span>
|
||||
<span class="value-separator">/</span>
|
||||
<span class="value-number">{{data.details.level}}</span>
|
||||
</div>
|
||||
<footer class="attribute-footer hit-dice">
|
||||
<button type="button" class="rest short-rest">{{ localize "SW5E.RestS" }}</button>
|
||||
<button type="button" class="rest long-rest">{{ localize "SW5E.RestL" }}</button>
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
{{!-- INITIATIVE --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.Initiative" }}</h1>
|
||||
<div class="attribute-value">
|
||||
<span class="initiative">{{numberFormat data.attributes.init.total decimals=0 sign=true}}</span>
|
||||
</div>
|
||||
<footer class="attribute-footer initiative">
|
||||
<span>{{ localize "SW5E.Modifier" }}</span>
|
||||
<input name="data.attributes.init.value" type="text" placeholder="0" data-dtype="Number"
|
||||
value="{{numberFormat data.attributes.init.value decimals=0 sign=true}}" />
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
{{!-- SPEED / MOVEMENT TYPES --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.Speed" }}</h1>
|
||||
<div class="attribute-value">
|
||||
<input name="data.attributes.speed.value" type="text" value="{{data.attributes.speed.value}}"
|
||||
placeholder="0" />
|
||||
</div>
|
||||
<footer class="attribute-footer speed">
|
||||
<input type="text" class="speed" name="data.attributes.speed.special"
|
||||
value="{{data.attributes.speed.special}}" placeholder="{{ localize 'SW5E.SpeedSpecial' }}" />
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</header>
|
||||
{{!-- PC Sheet Navigation --}}
|
||||
<nav class="sheet-navigation root-tabs" data-group="primary">
|
||||
<button class="item active" data-tab="attributes">Core</button>
|
||||
<button class="item" data-tab="inventory">{{ localize "SW5E.Inventory" }}</button>
|
||||
<button class="item" data-tab="features">{{ localize "SW5E.Features" }}</button>
|
||||
<button class="item" data-tab="powerbook">{{ localize "SW5E.Powerbook" }}</button>
|
||||
<button class="item" data-tab="biography">{{ localize "SW5E.Biography" }}</button>
|
||||
<button class="item" data-tab="notes">Notes</button>
|
||||
</nav>
|
||||
{{!-- PC Sheet Body --}}
|
||||
<section class="sheet-body">
|
||||
{{!-- Core Tab --}}
|
||||
<section class="tab attributes core" data-group="primary" data-tab="attributes">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-core.html" sections=attributes}}
|
||||
</section>
|
||||
{{!-- Inventory Tab --}}
|
||||
<section class="tab inventory" data-group="primary" data-tab="inventory">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html" sections=inventory}}
|
||||
</section>
|
||||
{{!-- Features Tab --}}
|
||||
<section class="tab features" data-group="primary" data-tab="features">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-features.html" sections=features}}
|
||||
</section>
|
||||
{{!-- Powerbook Tab --}}
|
||||
<section class="tab powerbook" data-group="primary" data-tab="powerbook">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-powerbook.html"}}
|
||||
</section>
|
||||
{{!-- Biography Tab --}}
|
||||
<section class="tab biography" data-group="primary" data-tab="biography">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-biography.html"}}
|
||||
</section>
|
||||
{{!-- Notes Tab --}}
|
||||
<section class="tab notes" data-group="primary" data-tab="notes">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-notes.html"}}
|
||||
</section>
|
||||
</form>
|
137
templates/actors/newActor/expanded-limited-sheet.html
Normal file
137
templates/actors/newActor/expanded-limited-sheet.html
Normal file
|
@ -0,0 +1,137 @@
|
|||
<form class="{{cssClass}} swalt-sheet" autocomplete="off">
|
||||
{{!-- Sheet Header --}}
|
||||
<header class="panel">
|
||||
<img class="profile" src="{{actor.img}}" title="{{actor.name}}" data-edit="img" />
|
||||
<h1 class="character-name">
|
||||
<input name="name" type="text" value="{{actor.name}}" placeholder="{{ localize 'SW5E.Name' }}" />
|
||||
</h1>
|
||||
<div class="level-experience">
|
||||
<div class="charlevel">
|
||||
{{ localize "SW5E.Level" }} {{data.details.level}} {{classLabels}}
|
||||
</div>
|
||||
{{#unless disableExperience}}
|
||||
<div class="experience">
|
||||
<input name="data.details.xp.value" type="text" value="{{data.details.xp.value}}" data-dtype="Number"
|
||||
placeholder="0" />
|
||||
<span class="sep">/</span>
|
||||
<span class="max">{{data.details.xp.max}}</span>
|
||||
</div>
|
||||
<div class="xpbar">
|
||||
<span class="bar" style="width: {{data.details.xp.pct}}%"></span>
|
||||
</div>
|
||||
{{/unless}}
|
||||
</div>
|
||||
<div class="summary">
|
||||
<input type="text" name="data.details.species" value="{{data.details.species}}"
|
||||
placeholder="{{ localize 'SW5E.Species' }}" />
|
||||
<input type="text" name="data.details.background" value="{{data.details.background}}"
|
||||
placeholder="{{ localize 'SW5E.Background' }}" />
|
||||
<input type="text" name="data.details.alignment" value="{{data.details.alignment}}"
|
||||
placeholder="{{ localize 'SW5E.Alignment' }}" />
|
||||
<div class="proficiency">
|
||||
Proficiency {{numberFormat data.attributes.prof decimals=0 sign=true}}
|
||||
</div>
|
||||
</div>
|
||||
{{!-- Header Attributes --}}
|
||||
<div class="attributes">
|
||||
{{!-- ARMOR CLASS --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.ArmorClass" }}</h1>
|
||||
<div class="attribute-value">
|
||||
<input class="ac-display" name="data.attributes.ac.value" type="text"
|
||||
value="{{data.attributes.ac.value}}" data-dtype="Number" placeholder="10" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{!-- HIT POINTS --}}
|
||||
<section>
|
||||
<h1>Hit Points</h1>
|
||||
<div class="attribute-value multiple">
|
||||
<input name="data.attributes.hp.value" type="text" value="{{data.attributes.hp.value}}"
|
||||
data-dtype="Number" placeholder="10" class="value-number" />
|
||||
<span class="value-separator">/</span>
|
||||
<input name="data.attributes.hp.max" type="text" value="{{data.attributes.hp.max}}"
|
||||
data-dtype="Number" placeholder="10" class="value-number" />
|
||||
</div>
|
||||
<footer class="attribute-footer hit-points">
|
||||
<input name="data.attributes.hp.temp" type="text" class="temphp" placeholder="+Temp"
|
||||
value="{{data.attributes.hp.temp}}" data-dtype="{{data.attributes.hp.type}}" />
|
||||
<input name="data.attributes.hp.tempmax" type="text" class="temphp" placeholder="+Max"
|
||||
value="{{data.attributes.hp.tempmax}}" data-dtype="{{data.attributes.hp.type}}" />
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
{{!-- HIT DICE / SHORT & LONG REST BUTTONS --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.HitDice" }}</h1>
|
||||
<div class="attribute-value multiple">
|
||||
<span class="value-number">{{data.attributes.hd}}</span>
|
||||
<span class="value-separator">/</span>
|
||||
<span class="value-number">{{data.details.level}}</span>
|
||||
</div>
|
||||
<footer class="attribute-footer hit-dice">
|
||||
<button type="button" class="rest short-rest">{{ localize "SW5E.RestS" }}</button>
|
||||
<button type="button" class="rest long-rest">{{ localize "SW5E.RestL" }}</button>
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
{{!-- INITIATIVE --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.Initiative" }}</h1>
|
||||
<div class="attribute-value">
|
||||
<span class="initiative">{{numberFormat data.attributes.init.total decimals=0 sign=true}}</span>
|
||||
</div>
|
||||
<footer class="attribute-footer initiative">
|
||||
<span>{{ localize "SW5E.Modifier" }}</span>
|
||||
<input name="data.attributes.init.value" type="text" placeholder="0" data-dtype="Number"
|
||||
value="{{numberFormat data.attributes.init.value decimals=0 sign=true}}" />
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
{{!-- SPEED / MOVEMENT TYPES --}}
|
||||
<section>
|
||||
<h1>{{ localize "SW5E.Speed" }}</h1>
|
||||
<div class="attribute-value">
|
||||
<input name="data.attributes.speed.value" type="text" value="{{data.attributes.speed.value}}"
|
||||
placeholder="0" />
|
||||
</div>
|
||||
<footer class="attribute-footer speed">
|
||||
<input type="text" class="speed" name="data.attributes.speed.special"
|
||||
value="{{data.attributes.speed.special}}" placeholder="{{ localize 'SW5E.SpeedSpecial' }}" />
|
||||
</footer>
|
||||
</section>
|
||||
|
||||
|
||||
</div>
|
||||
</header>
|
||||
{{!-- PC Sheet Navigation --}}
|
||||
<nav class="sheet-navigation root-tabs" data-group="primary">
|
||||
<button class="item active" data-tab="attributes">Core</button>
|
||||
<button class="item" data-tab="inventory">{{ localize "SW5E.Inventory" }}</button>
|
||||
<button class="item" data-tab="features">{{ localize "SW5E.Features" }}</button>
|
||||
<button class="item" data-tab="powerbook">{{ localize "SW5E.Powerbook" }}</button>
|
||||
<button class="item" data-tab="biography">{{ localize "SW5E.Biography" }}</button>
|
||||
</nav>
|
||||
{{!-- PC Sheet Body --}}
|
||||
<section class="sheet-body">
|
||||
{{!-- Core Tab --}}
|
||||
<section class="tab attributes core" data-group="primary" data-tab="attributes">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-core.html" sections=attributes}}
|
||||
</section>
|
||||
{{!-- Inventory Tab --}}
|
||||
<section class="tab inventory" data-group="primary" data-tab="inventory">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-inventory.html" sections=inventory}}
|
||||
</section>
|
||||
{{!-- Features Tab --}}
|
||||
<section class="tab features" data-group="primary" data-tab="features">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-features.html" sections=features}}
|
||||
</section>
|
||||
{{!-- Powerbook Tab --}}
|
||||
<section class="tab powerbook" data-group="primary" data-tab="powerbook">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-powerbook.html"}}
|
||||
</section>
|
||||
{{!-- Biography Tab --}}
|
||||
<section class="tab biography" data-group="primary" data-tab="biography">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-biography.html"}}
|
||||
</section>
|
||||
</form>
|
33
templates/actors/newActor/item.hbs
Normal file
33
templates/actors/newActor/item.hbs
Normal file
|
@ -0,0 +1,33 @@
|
|||
<li class="item group-grid-fav-items" data-item-id="{{item._id}}">
|
||||
<div class="item-name rollable">
|
||||
<div class="item-image" style="background-image: url({{item.img}})"></div>
|
||||
<h4>{{item.name}}</h4>
|
||||
</div>
|
||||
|
||||
<div class="item-detail item-uses">
|
||||
{{#if item.data.uses.max }}
|
||||
{{item.data.uses.value}} / {{item.data.uses.max}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="item-detail item-count">
|
||||
{{#if item.data.quantity}}
|
||||
{{item.data.quantity}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="item-detail item-comps">
|
||||
{{#if item.powerComps}}
|
||||
{{item.powerComps}}
|
||||
{{#if item.powerCon}}<i class='fas fa-copyright'></i>{{/if}}
|
||||
{{#if item.powerRit}}<i class='fas fa-registered'></i>{{/if}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="item-detail item-controls">
|
||||
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
||||
<a class="item-control item-fav" title="Remove"><i class="fas fa-sign-out-alt"></i></a>
|
||||
</div>
|
||||
</li>
|
27
templates/actors/newActor/limited-sheet.html
Normal file
27
templates/actors/newActor/limited-sheet.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
<form class="{{cssClass}} swalt-sheet limited" autocomplete="off">
|
||||
<!-- HEADER -->
|
||||
<header class="panel">
|
||||
<img class="profile" src="{{actor.img}}" title="{{actor.name}}" data-edit="img" />
|
||||
<h1 class="character-name">
|
||||
{{actor.name}}
|
||||
</h1>
|
||||
</header>
|
||||
|
||||
<!-- BODY -->
|
||||
<section class="sheet-body">
|
||||
<div class="tab biography active">
|
||||
<div class="panel">
|
||||
<section class="additional-info">
|
||||
<h1 class="section-titles">Description</h1>
|
||||
{{editor content=data.details.description.value target="data.details.description.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
<section>
|
||||
<h1 class="section-titles">Background</h1>
|
||||
{{editor content=data.details.biography.value target="data.details.biography.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
|
22
templates/actors/newActor/parts/swalt-biography.html
Normal file
22
templates/actors/newActor/parts/swalt-biography.html
Normal file
|
@ -0,0 +1,22 @@
|
|||
<div class="panel additional-info">
|
||||
<section><h1 class="section-titles biopage">Personality Traits</h1>
|
||||
{{editor content=data.details.trait target="data.details.trait" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
<section><h1 class="section-titles biopage">Ideals</h1>
|
||||
{{editor content=data.details.ideal target="data.details.ideal" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
<section><h1 class="section-titles biopage">Bonds</h1>
|
||||
{{editor content=data.details.bond target="data.details.bond" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
<section><h1 class="section-titles biopage">Flaws</h1>
|
||||
{{editor content=data.details.flaw target="data.details.flaw" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
</div>
|
||||
<div class="panel background">
|
||||
<section><h1 class="section-titles biopage">Description</h1>
|
||||
{{editor content=data.details.description.value target="data.details.description.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
<section><h1 class="section-titles">Background</h1>
|
||||
{{editor content=data.details.biography.value target="data.details.biography.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
</div>
|
56
templates/actors/newActor/parts/swalt-core.html
Normal file
56
templates/actors/newActor/parts/swalt-core.html
Normal file
|
@ -0,0 +1,56 @@
|
|||
<section class="panel abilities">
|
||||
{{!-- Ability Scores --}}
|
||||
<section class="scores">
|
||||
<h1>Ability Scores</h1>
|
||||
<ol>
|
||||
{{#each data.abilities as |ability id|}}
|
||||
<li class="ability {{#if ability.proficient}}proficient{{/if}}" data-ability="{{id}}">
|
||||
<h2 class="ability-name rollable">{{ability.label}}</h4>
|
||||
<input class="ability-score" name="data.abilities.{{id}}.value" type="text"
|
||||
value="{{ability.value}}" data-dtype="Number" placeholder="10" />
|
||||
<div class="ability-modifiers">
|
||||
<span class="ability-mod"
|
||||
title="Modifier">{{numberFormat ability.mod decimals=0 sign=true}}</span>
|
||||
<input type="hidden" name="data.abilities.{{id}}.proficient"
|
||||
value="{{ability.proficient}}" data-dtype="Number" />
|
||||
<button class="proficiency-toggle ability-proficiency"
|
||||
title="Proficiency">{{{ability.icon}}}</button>
|
||||
<span class="ability-save"
|
||||
title="Saving Throw">{{numberFormat ability.save decimals=0 sign=true}}</span>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</section>
|
||||
{{!-- Skills --}}
|
||||
<section class="skills">
|
||||
<h1>Skills</h1>
|
||||
<ol>
|
||||
{{#each data.skills as |skill s|}}
|
||||
<li class="skill {{#if skill.value}}proficient{{/if}}" data-skill="{{s}}">
|
||||
<input type="hidden" name="data.skills.{{s}}.value" value="{{skill.value}}"
|
||||
data-dtype="Number" />
|
||||
<button class="proficiency-toggle skill-proficiency"
|
||||
title="{{skill.hover}}">{{{skill.icon}}}</button>
|
||||
<span class="skill-name rollable">{{skill.label}}</span>
|
||||
<span class="skill-ability">{{skill.ability}}</span>
|
||||
<span class="skill-mod">{{numberFormat skill.total decimals=0 sign=true}}</span>
|
||||
{{!-- <input class="skill-bonus" name="data.skills.{{s}}.bonus" type="text" value="{{numberFormat skill.bonus decimals=0 sign=true}}" data-dtype="Number" placeholder="0" title="Misc. Modifier"/> --}}
|
||||
{{!-- <span class="skill-passive">({{skill.passive}})</span> --}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</section>
|
||||
</section>
|
||||
<section class="panel traits-resources">
|
||||
<nav class="core-tabs tab-list" data-subgroup-selection>
|
||||
<button type="button" class="item active" data-subgroup="coreattributes" data-target="traits">Traits</button>
|
||||
<button type="button" class="item" data-subgroup="coreattributes" data-target="resources">Resources</button>
|
||||
</nav>
|
||||
<div class="tab core-traits active" data-subgroup="coreattributes" data-target="traits">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-traits.html"}}
|
||||
</div>
|
||||
<div class="tab core-resources" data-subgroup="coreattributes" data-target="resources">
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/swalt-resources.html"}}
|
||||
</div>
|
||||
</section>
|
80
templates/actors/newActor/parts/swalt-features.html
Normal file
80
templates/actors/newActor/parts/swalt-features.html
Normal file
|
@ -0,0 +1,80 @@
|
|||
<div class="panel">
|
||||
|
||||
|
||||
<ul class="filter-list" data-filter="features">
|
||||
<li class="filter-title">{{localize "SW5E.Filter"}}</li>
|
||||
<li class="filter-item" data-filter="action">{{localize "SW5E.Action"}}</li>
|
||||
<li class="filter-item" data-filter="bonus">{{localize "SW5E.BonusAction"}}</li>
|
||||
<li class="filter-item" data-filter="reaction">{{localize "SW5E.Reaction"}}</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<ol class="group-list">
|
||||
{{#each sections as |section sid|}}
|
||||
<li>
|
||||
<div class="group-list-title group-grid-features">
|
||||
<div class="title">
|
||||
|
||||
<h3 class="item-name">{{localize section.label}}</h3>
|
||||
{{#if ../owner}}
|
||||
<a class="item-control item-create" title="{{localize 'SW5E.FeatureAdd'}}"
|
||||
{{#each section.dataset as |v k|}}data-{{k}}="{{v}}" {{/each}}>
|
||||
<i class="fas fa-plus"></i> {{localize "SW5E.Add"}}
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if section.hasActions}}
|
||||
<div class="item-detail item-uses">{{localize "SW5E.Uses"}}</div>
|
||||
<div class="item-detail item-action">{{localize "SW5E.Usage"}}</div>
|
||||
{{/if}}
|
||||
|
||||
|
||||
</div>
|
||||
<ol class="item-list">
|
||||
{{#each section.items as |item iid|}}
|
||||
<li class="item group-grid-features {{#if isDepleted}}depleted{{/if}}" data-item-id="{{item._id}}">
|
||||
<div class="item-name rollable">
|
||||
<div class="item-image" style="background-image: url({{item.img}})"></div>
|
||||
<h4>{{item.name}}</h4>
|
||||
</div>
|
||||
|
||||
{{#if section.hasActions}}
|
||||
<div class="item-detail item-uses">
|
||||
{{#if item.isOnCooldown}}
|
||||
<a class="item-recharge rollable">{{item.labels.recharge}}</a>
|
||||
{{else if item.data.recharge.value}}
|
||||
{{localize "SW5E.Charged"}}
|
||||
|
||||
{{else if item.hasUses}}
|
||||
<input type="text" value="{{item.data.uses.value}}" placeholder="0" />/<span>{{item.data.uses.max}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="item-detail item-action">
|
||||
{{#if item.data.activation.type }}
|
||||
{{item.labels.activation}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{else if section.isClass}}
|
||||
<div class="item-detail player-class">
|
||||
{{item.data.subclass}}
|
||||
</div>
|
||||
<div class="item-detail player-class-levels">
|
||||
Level {{item.data.levels}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if ../../owner}}
|
||||
<div class="item-controls item-detail">
|
||||
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</div>
|
112
templates/actors/newActor/parts/swalt-inventory.html
Normal file
112
templates/actors/newActor/parts/swalt-inventory.html
Normal file
|
@ -0,0 +1,112 @@
|
|||
<section class="panel">
|
||||
{{#if isCharacter }}
|
||||
<div class="currency-encumbrance">
|
||||
|
||||
<label class="currency">
|
||||
{{localize "SW5E.Currency"}}
|
||||
{{#each data.currency as |v k|}}
|
||||
<input type="text" name="data.currency.{{k}}" value="{{v}}" data-dtype="Number" />
|
||||
{{/each}}
|
||||
</label>
|
||||
{{#with data.attributes.encumbrance}}
|
||||
<div class="encumbrance-wrapper" title="Encumbrance">
|
||||
<div class="encumbrance {{#if encumbered}}encumbered{{/if}}">
|
||||
<span class="encumbrance-bar" style="width:{{pct}}%"></span>
|
||||
|
||||
<i class="encumbrance-breakpoint encumbrance-33 arrow-up"></i>
|
||||
<i class="encumbrance-breakpoint encumbrance-33 arrow-down"></i>
|
||||
<i class="encumbrance-breakpoint encumbrance-66 arrow-up"></i>
|
||||
<i class="encumbrance-breakpoint encumbrance-66 arrow-down"></i>
|
||||
</div>
|
||||
<span class="encumbrance-label">{{value}} / {{max}}</span>
|
||||
</div>
|
||||
{{/with}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<ul class="filter-list" data-filter="inventory">
|
||||
<li class="filter-title">{{localize "SW5E.Filter"}}</li>
|
||||
<li class="filter-item" data-filter="action">{{localize "SW5E.Action"}}</li>
|
||||
<li class="filter-item" data-filter="bonus">{{localize "SW5E.BonusAction"}}</li>
|
||||
<li class="filter-item" data-filter="reaction">{{localize "SW5E.Reaction"}}</li>
|
||||
<li class="filter-item" data-filter="equipped">{{localize "SW5E.Equipped"}}</li>
|
||||
</ul>
|
||||
|
||||
<div class="group-list-header group-grid-inventory">
|
||||
<div> </div>
|
||||
{{#if isCharacter}}
|
||||
<div class="item-detail item-weight">{{localize "SW5E.Weight"}}</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="item-detail item-uses">{{localize "SW5E.Charges"}}</div>
|
||||
<div class="item-detail item-action">{{localize "SW5E.Usage"}}</div>
|
||||
<div class="item-detail"></div>
|
||||
</div>
|
||||
<ol class="group-list">
|
||||
{{#each sections as |section sid|}}
|
||||
<li>
|
||||
<div class="group-list-title">
|
||||
<h3 class="item-name">{{localize section.label}}</h3>
|
||||
|
||||
{{#if ../owner}}
|
||||
<a class="item-control item-create" title='{{localize "SW5E.ItemCreate"}}'
|
||||
{{#each section.dataset as |v k|}}data-{{k}}="{{v}}" {{/each}}>
|
||||
<i class="fas fa-plus"></i> {{localize "SW5E.Add"}}
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
<ol class="group-items">
|
||||
{{#each section.items as |item iid|}}
|
||||
<li class="item group-grid-inventory" data-item-id="{{item._id}}">
|
||||
<div class="item-name rollable">
|
||||
<div class="item-image" style="background-image: url({{item.img}})"></div>
|
||||
<h4>
|
||||
{{item.name~}}
|
||||
{{~#if item.isStack}} ({{item.data.quantity}}){{/if}}
|
||||
{{~#if item.data.attuned}} <i class="fas fa-sun attuned"
|
||||
title={{localize "SW5E.Attuned"}}></i>{{/if}}
|
||||
</h4>
|
||||
</div>
|
||||
|
||||
{{#if ../../isCharacter}}
|
||||
<div class="item-detail item-weight">
|
||||
{{#if item.totalWeight}}
|
||||
{{ item.totalWeight }} {{localize "SW5E.AbbreviationLbs"}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
<div class="item-detail item-uses">
|
||||
{{#if item.hasUses }}
|
||||
<input type="text" value="{{item.data.uses.value}}" placeholder="0" />
|
||||
/<span style="padding-left: 8px;">{{item.data.uses.max}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="item-detail item-action">
|
||||
{{#if item.data.activation.type }}
|
||||
{{item.labels.activation}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
{{#if ../../owner}}
|
||||
<div class="item-detail item-controls">
|
||||
<a class="item-control item-toggle {{item.toggleClass}}" title='{{item.toggleTitle}}'>
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
</a>
|
||||
<a class="item-control item-edit" title='{{localize "SW5E.ItemEdit"}}'><i
|
||||
class="fas fa-edit"></i></a>
|
||||
<a class="item-control item-delete" title='{{localize "SW5E.ItemDelete"}}'><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
</section>
|
33
templates/actors/newActor/parts/swalt-notes.html
Normal file
33
templates/actors/newActor/parts/swalt-notes.html
Normal file
|
@ -0,0 +1,33 @@
|
|||
<div class="panel">
|
||||
<section class="background">
|
||||
<input type="text" name="data.details.notesname" value="{{data.details.notesname}}"
|
||||
placeholder="Personal Journal" />
|
||||
|
||||
{{editor content=data.details.notes.value target="data.details.notes.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
<section>
|
||||
<input type="text" name="data.details.notes1name" value="{{data.details.notes1name}}"
|
||||
placeholder="Additional Notes" />
|
||||
{{editor content=data.details.notes1.value target="data.details.notes1.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<input type="text" name="data.details.notes2name" value="{{data.details.notes2name}}"
|
||||
placeholder="Additional Notes" />
|
||||
{{editor content=data.details.notes2.value target="data.details.notes2.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<input type="text" name="data.details.notes3name" value="{{data.details.notes3name}}"
|
||||
placeholder="Additional Notes" />
|
||||
{{editor content=data.details.notes3.value target="data.details.notes3.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<input type="text" name="data.details.notes4name" value="{{data.details.notes4name}}"
|
||||
placeholder="Additional Notes" />
|
||||
{{editor content=data.details.notes4.value target="data.details.notes4.value" button=true owner=owner editable=editable}}
|
||||
</section>
|
||||
|
||||
</section>
|
||||
</div>
|
135
templates/actors/newActor/parts/swalt-powerbook.html
Normal file
135
templates/actors/newActor/parts/swalt-powerbook.html
Normal file
|
@ -0,0 +1,135 @@
|
|||
<section class="panel">
|
||||
<div class="powercasting-ability">
|
||||
<label>{{localize "SW5E.PowerAbility"}}
|
||||
<select name="data.attributes.powercasting" data-type="String">
|
||||
{{#select data.attributes.powercasting}}
|
||||
<option value="">{{localize "SW5E.None"}}</option>
|
||||
{{#each data.abilities as |abl a|}}
|
||||
<option value="{{a}}">{{abl.label}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
</select>
|
||||
</label>
|
||||
{{#if isNPC}}
|
||||
<label>{{localize "SW5E.PowercasterLevel"}}
|
||||
<input class="powercasting-level" type="text" name="data.details.powerLevel" value="{{data.details.powerLevel}}"
|
||||
data-dtype="Number" placeholder="0" />
|
||||
</label>
|
||||
{{/if}}
|
||||
<h3 class="power-dc">{{localize "SW5E.PowerDC"}} <span>{{data.attributes.powerdc}}</span></h3>
|
||||
</div>
|
||||
|
||||
<ul class="filter-list" data-filter="powerbook">
|
||||
<li class="filter-title">{{localize "SW5E.Filter"}}</li>
|
||||
<li class="filter-item" data-filter="action">{{localize "SW5E.Action"}}</li>
|
||||
<li class="filter-item" data-filter="bonus">{{localize "SW5E.BonusAction"}}</li>
|
||||
<li class="filter-item" data-filter="reaction">{{localize "SW5E.Reaction"}}</li>
|
||||
<li class="filter-item" data-filter="concentration">{{localize "SW5E.AbbreviationConc"}}</li>
|
||||
<li class="filter-item" data-filter="ritual">{{localize "SW5E.Ritual"}}</li>
|
||||
<li class="filter-item" data-filter="prepared">{{localize "SW5E.Prepared"}}{{#if preparedPowers}}
|
||||
({{preparedPowers}}){{/if}}</li>
|
||||
</ul>
|
||||
|
||||
<div class="group-list-header group-grid-powers">
|
||||
<div></div>
|
||||
<div class="item-detail item-uses"></div>
|
||||
<div class="item-detail item-school">{{localize "SW5E.PowerSchool"}}</div>
|
||||
<div class="item-detail item-action">{{localize "SW5E.PowerUsage"}}</div>
|
||||
<div class="item-detail item-target">{{localize "SW5E.PowerTarget"}}</div>
|
||||
|
||||
</div>
|
||||
<ol class="group-list">
|
||||
{{#each powerbook as |section|}}
|
||||
<li>
|
||||
<div class="group-list-title group-grid-powers">
|
||||
<div class="item-name">
|
||||
<h3>{{section.label}}</h3>
|
||||
{{#if section.canCreate}}
|
||||
<a class="item-control item-create" title="{{localize 'SW5E.PowerCreate'}}"
|
||||
{{#each section.dataset as |v k|}}data-{{k}}="{{v}}" {{/each}}>
|
||||
<i class="fas fa-plus"></i> {{localize "SW5E.Add"}}
|
||||
</a>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<div class="item-detail item-uses">
|
||||
{{#if section.usesSlots}}
|
||||
<input type="text" name="data.powers.{{section.prop}}.value" value="{{section.uses}}" placeholder="0"
|
||||
data-dtype="Number" />
|
||||
/
|
||||
<span data-level="{{section.prop}}" data-slots="{{section.slots}}">
|
||||
{{{section.slots}}}
|
||||
{{#if ../editable}}
|
||||
<a class="slot-max-override" title="{{localize 'SW5E.PowerProgOverride'}}">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
{{/if}}
|
||||
{{ else }}
|
||||
{{{section.uses}}} / {{{section.slots}}}
|
||||
{{/if}}
|
||||
</div>
|
||||
</div>
|
||||
<ol class="item-list">
|
||||
{{#each section.powers as |item i|}}
|
||||
<li class="item group-grid-powers" data-item-id="{{item._id}}">
|
||||
<div class="item-name rollable">
|
||||
<div class="item-image" style="background-image: url({{item.img}})"></div>
|
||||
<h4>{{item.name}}</h4>
|
||||
</div>
|
||||
|
||||
<div class="item-detail item-uses">
|
||||
{{#if item.data.uses.per }}
|
||||
Uses {{item.data.uses.value}} / {{item.data.uses.max}}
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
<!-- <div class="power-comps">
|
||||
{{#each labels.components}}
|
||||
<span class="power-component {{this}}">{{this}}</span>
|
||||
{{/each}}
|
||||
</div> -->
|
||||
<div class="item-detail item-school">{{labels.school}}</div>
|
||||
<div class="item-detail item-action">{{labels.activation}}</div>
|
||||
<div class="item-detail item-target" title="{{localize 'SW5E.Range'}}: {{labels.range}}">
|
||||
{{#if labels.target}}
|
||||
{{labels.target}}
|
||||
{{else}}None
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
|
||||
{{#if ../../owner}}
|
||||
<div class="item-detail item-controls">
|
||||
{{#if section.canPrepare}}
|
||||
<a class="item-control item-toggle {{item.toggleClass}}" title="{{item.toggleTitle}}"><i
|
||||
class="fas fa-check-circle"></i></a>
|
||||
{{/if}}
|
||||
<a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
|
||||
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
{{/if}}
|
||||
</li>
|
||||
{{/each}}
|
||||
</ol>
|
||||
</li>
|
||||
{{else}}
|
||||
{{#if owner}}
|
||||
{{#if filters.powerbook.size}}
|
||||
<li class="item flexrow">
|
||||
<p class="notes">{{localize "SW5E.FilterNoPowers"}}</p>
|
||||
</li>
|
||||
{{else}}
|
||||
<li class="item flexrow inventory-header powerbook-header powerbook-empty">
|
||||
<div class="item-controls">
|
||||
<a class="item-control item-create" title="{{localize 'SW5E.PowerCreate'}}" data-type="power"
|
||||
data-level="{{lvl}}"><i class="fas fa-plus"></i> {{localize "SW5E.PowerAdd"}}</a>
|
||||
</div>
|
||||
</li>
|
||||
<li class="item flexrow">
|
||||
<p class="notes">{{localize "SW5E.NoPowerLevels"}}</p>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
{{/each}}
|
||||
</ol>
|
||||
</section>
|
65
templates/actors/newActor/parts/swalt-resources.html
Normal file
65
templates/actors/newActor/parts/swalt-resources.html
Normal file
|
@ -0,0 +1,65 @@
|
|||
{{!-- Resources, Counters, & Favorites --}}
|
||||
<section class="resources">
|
||||
<section class="resource-items">
|
||||
{{#each resources as |res|}}
|
||||
<div class="resource">
|
||||
<h1>
|
||||
<input name="data.resources.{{res.name}}.label" type="text" value="{{res.label}}"
|
||||
placeholder="{{res.placeholder}}" />
|
||||
</h1>
|
||||
<div class="attribute-value">
|
||||
<input name="data.resources.{{res.name}}.value" type="text" value="{{res.value}}" data-dtype="Number"
|
||||
placeholder="0" class="value-number" />
|
||||
<span class="value-separator">/</span>
|
||||
<input name="data.resources.{{res.name}}.max" type="text" value="{{res.max}}" data-dtype="Number"
|
||||
placeholder="0" class="value-number" />
|
||||
</div>
|
||||
<footer class="attribute-footer">
|
||||
<label class="recharge checkbox">
|
||||
{{ localize "SW5E.AbbreviationSR" }} <input name="data.resources.{{res.name}}.sr" type="checkbox"
|
||||
{{checked res.sr}} />
|
||||
</label>
|
||||
<label class="recharge checkbox">
|
||||
{{ localize "SW5E.AbbreviationLR" }} <input name="data.resources.{{res.name}}.lr" type="checkbox"
|
||||
{{checked res.lr}} />
|
||||
</label>
|
||||
</footer>
|
||||
</div>
|
||||
{{/each}}
|
||||
</section>
|
||||
<section class="counters">
|
||||
<div class="counter">
|
||||
<h4 class="death-save rollable">{{ localize "SW5E.DeathSave" }}</h4>
|
||||
<div class="counter-value">
|
||||
<div class="death-success">
|
||||
<i class="fas fa-check"></i>
|
||||
<input type="text" name="data.attributes.death.success" data-dtype="Number" placeholder="0"
|
||||
value="{{data.attributes.death.success}}" />
|
||||
</div>
|
||||
<div class="death-fail">
|
||||
<i class="fas fa-times"></i>
|
||||
<input type="text" name="data.attributes.death.failure" data-dtype="Number" placeholder="0"
|
||||
value="{{data.attributes.death.failure}}" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="counter">
|
||||
<h4>{{ localize "SW5E.Exhaustion" }}</h4>
|
||||
<div class="counter-value">
|
||||
<input type="text" name="data.attributes.exhaustion" data-dtype="Number" placeholder="0"
|
||||
value="{{data.attributes.exhaustion}}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="counter">
|
||||
<h4>{{ localize "SW5E.Inspiration" }}</h4>
|
||||
<div class="counter-value">
|
||||
<input type="checkbox" name="data.attributes.inspiration" data-dtype="Boolean"
|
||||
{{checked data.attributes.inspiration}} />
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="favorites">
|
||||
<h1>Favorites</h1>
|
||||
<div class="favtabtarget"></div>
|
||||
</section>
|
||||
</section>
|
118
templates/actors/newActor/parts/swalt-traits.html
Normal file
118
templates/actors/newActor/parts/swalt-traits.html
Normal file
|
@ -0,0 +1,118 @@
|
|||
<section class="traits">
|
||||
<label>
|
||||
{{localize "SW5E.Size"}}
|
||||
<select class="actor-size" name="data.traits.size">
|
||||
{{#select data.traits.size}}
|
||||
{{#each config.actorSizes as |label size|}}
|
||||
<option value="{{size}}">{{label}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
</select>
|
||||
</label>
|
||||
<label class="{{#unless data.traits.senses}}inactive{{/unless}}">
|
||||
{{#unless isVehicle}}
|
||||
{{localize "SW5E.Senses"}}
|
||||
<input type="text" name="data.traits.senses" value="{{data.traits.senses}}"
|
||||
placeholder="{{ localize 'SW5E.None' }}" />
|
||||
{{/unless}}
|
||||
</label>
|
||||
<div class="languages">
|
||||
<label data-options="share-languages" class="languages">{{localize "SW5E.Languages"}}</label>
|
||||
<a class="trait-selector" data-options="languages" data-target="data.traits.languages">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.languages.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<label>{{localize "SW5E.DamImm"}}</label>
|
||||
<a class="trait-selector" data-options="damageResistanceTypes" data-target="data.traits.di">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.di.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<label>{{localize "SW5E.DamRes"}}</label>
|
||||
<a class="trait-selector" data-options="damageResistanceTypes" data-target="data.traits.dr">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.dr.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<label>{{localize "SW5E.DamVuln"}}</label>
|
||||
<a class="trait-selector" data-options="damageResistanceTypes" data-target="data.traits.dv">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.dv.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>{{localize "SW5E.ConImm"}}</label>
|
||||
<a class="trait-selector" data-options="conditionTypes" data-target="data.traits.ci">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.ci.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>{{#if isCharacter}}
|
||||
<div>
|
||||
<label>{{localize "SW5E.TraitWeaponProf"}}</label>
|
||||
<a class="trait-selector" data-options="weaponProficiencies" data-target="data.traits.weaponProf">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.weaponProf.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
<div>
|
||||
<label>{{localize "SW5E.TraitArmorProf"}}</label>
|
||||
<a class="trait-selector" data-options="armorProficiencies" data-target="data.traits.armorProf">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.armorProf.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label>{{localize "SW5E.TraitToolProf"}}</label>
|
||||
<a class="trait-selector" data-options="toolProficiencies" data-target="data.traits.toolProf">
|
||||
<i class="fas fa-edit"></i>
|
||||
</a>
|
||||
<ul class="traits-list">
|
||||
{{#each data.traits.toolProf.selected as |v k|}}
|
||||
<li>{{v}}</li>
|
||||
{{/each}}
|
||||
</ul>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#unless isVehicle}}
|
||||
<div>
|
||||
<label>{{localize "SW5E.SpecialTraits"}}</label>
|
||||
<a class="configure-flags"><i class="fas fa-cog"></i></a>
|
||||
</div>
|
||||
{{/unless}}
|
||||
<ul class="passives"></ul>
|
||||
</section>
|
67
templates/actors/newActor/template.hbs
Normal file
67
templates/actors/newActor/template.hbs
Normal file
|
@ -0,0 +1,67 @@
|
|||
{{#if favItems}}
|
||||
<ol class="group-list ">
|
||||
<li>
|
||||
<div class="group-list-title group-grid-fav-items">
|
||||
<h3 class="item-name">Items</h3>
|
||||
<div class="item-detail item-uses">Charges</div>
|
||||
<div class="item-detail item-quantity">Qty</div>
|
||||
<div class="item-detail item-comps"></div>
|
||||
<div class="item-detail item-controls"></div>
|
||||
</div>
|
||||
|
||||
<ol class="item-list">
|
||||
{{#each favItems as |item id|}}
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/item.hbs" item=item}}
|
||||
{{/each}}
|
||||
</ol>
|
||||
</li>
|
||||
{{#if favFeats}}
|
||||
<li>
|
||||
<div class="group-list-title group-grid-fav-items">
|
||||
<h3 class="item-name">Features & Feats</h3>
|
||||
<div class="item-detail item-uses">Uses</div>
|
||||
<div class="item-detail item-quantity"></div>
|
||||
<div class="item-detail item-comps"></div>
|
||||
<div class="item-detail item-controls"></div>
|
||||
</div>
|
||||
|
||||
<ol class="item-list">
|
||||
{{#each favFeats as |feat lvl|}}
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/item.hbs" item=feat}}
|
||||
{{/each}}
|
||||
</ol>
|
||||
</li>
|
||||
{{/if}}
|
||||
{{#if favPowers}}
|
||||
{{#each favPowers as |section lvl|}}
|
||||
{{#if section.powers}}
|
||||
{{#if lvl}}
|
||||
<li>
|
||||
<div class="group-list-title group-grid-fav-items">
|
||||
<h3 class="item-name">
|
||||
{{#if section.isCantrip}}At-Will Powers{{else}}Level {{lvl}} Powers{{/if}}
|
||||
</h3>
|
||||
|
||||
<div class="item-detail item-uses">
|
||||
{{#if section.isCantrip}}
|
||||
{{else}}
|
||||
{{section.value}}
|
||||
/
|
||||
{{section.max}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="item-detail item-quantity"></div>
|
||||
<div class="item-detail item-comps"></div>
|
||||
<div class="item-detail item-controls"></div>
|
||||
</div>
|
||||
<ol class="item-list">
|
||||
{{#each section.powers as |power id|}}
|
||||
{{> "systems/sw5e/templates/actors/newActor/parts/item.hbs" item=power}}
|
||||
{{/each}}
|
||||
</ol>
|
||||
</li>
|
||||
{{/if}}{{/if}}
|
||||
{{/each}}
|
||||
{{/if}}
|
||||
</ol>
|
||||
{{/if}}
|
|
@ -210,28 +210,28 @@
|
|||
</div>
|
||||
|
||||
{{!-- Traits --}}
|
||||
{{> "systems/sw5e/templates/actors/parts/actor-traits.html"}}
|
||||
{{> "systems/sw5e/templates/actors/oldActor/parts/actor-traits.html"}}
|
||||
</section>
|
||||
</div>
|
||||
|
||||
{{!-- Inventory Tab --}}
|
||||
<div class="tab inventory flexcol" data-group="primary" data-tab="inventory">
|
||||
{{> "systems/sw5e/templates/actors/parts/actor-inventory.html" sections=inventory}}
|
||||
{{> "systems/sw5e/templates/actors/oldActor/parts/actor-inventory.html" sections=inventory}}
|
||||
</div>
|
||||
|
||||
{{!-- Features Tab --}}
|
||||
<div class="tab features flexcol" data-group="primary" data-tab="features">
|
||||
{{> "systems/sw5e/templates/actors/parts/actor-features.html" sections=features}}
|
||||
{{> "systems/sw5e/templates/actors/oldActor/parts/actor-features.html" sections=features}}
|
||||
</div>
|
||||
|
||||
{{!-- Powerbook Tab --}}
|
||||
<div class="tab powerbook flexcol" data-group="primary" data-tab="powerbook">
|
||||
{{> "systems/sw5e/templates/actors/parts/actor-powerbook.html"}}
|
||||
{{> "systems/sw5e/templates/actors/oldActor/parts/actor-powerbook.html"}}
|
||||
</div>
|
||||
|
||||
{{!-- Effects Tab --}}
|
||||
<div class="tab effects flexcol" data-group="primary" data-tab="effects">
|
||||
{{> "systems/sw5e/templates/actors/parts/actor-effects.html"}}
|
||||
{{> "systems/sw5e/templates/actors/oldActor/parts/actor-effects.html"}}
|
||||
</div>
|
||||
|
||||
{{!-- Biography Tab --}}
|
11
templates/app-window.html
Normal file
11
templates/app-window.html
Normal file
|
@ -0,0 +1,11 @@
|
|||
<div id="{{id}}" class="app window-app {{classes}} this-is-my-custom-window" data-appid="{{appId}}">
|
||||
<header class="window-header flexrow">
|
||||
<h4 class="window-title">{{title}}</h4>
|
||||
{{#each headerButtons}}
|
||||
<a class="header-button {{this.class}}"><i class="{{this.icon}}"></i></a>
|
||||
{{/each}}
|
||||
</header>
|
||||
|
||||
<section class="window-content">
|
||||
</section>
|
||||
</div>
|
Loading…
Add table
Add a link
Reference in a new issue