Working on the spells panel, which resulted in a lot of weird structural changes that aren't *really* functional yet

This commit is contained in:
Oliver-Akins 2024-01-07 22:27:26 -07:00
parent 227029ffcd
commit dfc51a5899
31 changed files with 499 additions and 84 deletions

View file

@ -49,10 +49,6 @@
.dotdungeon > .window-content select :disabled, .dotdungeon > .window-content select:hover :disabled { .dotdungeon > .window-content select :disabled, .dotdungeon > .window-content select:hover :disabled {
cursor: default; cursor: default;
} }
.dotdungeon > .window-content .debug-data {
opacity: 60%;
font-family: sans-serif;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon { .dotdungeon.dotdungeon.dotdungeon.dotdungeon {
container-type: size; container-type: size;
@ -61,17 +57,40 @@
padding: 0; padding: 0;
background: #f2f2f2; background: #f2f2f2;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon button { .dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content .debug-data {
opacity: 60%;
font-family: sans-serif;
word-break: break-all;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button {
border-radius: 4px; border-radius: 4px;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon button.primary { .dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.primary {
background: #00aa00; background: #00aa00;
color: black; color: black;
padding: 5px 7px; padding: 4px 8px;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon button.primary:hover { .dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.primary:hover {
background: #008800; background: #008800;
color: white; color: white;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.danger {
background: red;
color: white;
padding: 4px 8px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.danger:hover {
background: #cc0000;
color: white;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.reduced-padding {
padding: 2px 4px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.equal-padding {
padding: 4px 4px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.equal-padding.reduced-padding {
padding: 2px 2px;
}
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/generic.scss%22,%22../styles/mixins/_foundry.scss%22,%22../styles/_vars.scss%22,%22../styles/mixins/_partials.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAIQ;AAKP;EACC;;AAED;EACC;;AAGD;ECfA;EACA;EACA;EDeC,aEhBW;EFiBX;;AAGD;EACC;;AAGD;ECzBA;EACA;EACA;EDyBC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;EGpCD;EACA;EACA;EACA;EACA;EACA,aDLW;;ACOX;AAAA;AAAA;AAAA;AAAA;EAEC;;AH+BD;EACC;;AAEA;EACC;;AAIF;EACC;EACA,aElDU;;;AFuDZ;EACC;;AAEA;EACC;EACA,YE1DW;;AF6DZ;EACC;;AAEA;EACC,YE9Dc;EF+Dd,OErDe;EFsDf;;AACA;EACC,YE7DiB;EF8DjB,OEpDkB%22,%22file%22:%22generic.css%22%7D */ /*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/generic.scss%22,%22../styles/mixins/_foundry.scss%22,%22../styles/_vars.scss%22,%22../styles/mixins/_partials.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAIQ;AAKP;EACC;;AAED;EACC;;AAGD;ECfA;EACA;EACA;EDeC,aEhBW;EFiBX;;AAGD;EACC;;AAGD;ECzBA;EACA;EACA;EDyBC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;EGpCD;EACA;EACA;EACA;EACA;EACA,aDLW;;ACOX;AAAA;AAAA;AAAA;AAAA;EAEC;;AH+BD;EACC;;AAEA;EACC;;;AAMH;EACC;;AAEA;EACC;EACA,YErDW;;AFuDX;EACC;EACA,aE3DS;EF4DT;;AAGD;EACC;;AAEA;EACC,YE9Da;EF+Db,OErDc;EFsDd;;AACA;EACC,YE7DgB;EF8DhB,OEpDiB;;AFwDnB;EACC,YEpDY;EFqDZ,OElDa;EFmDb;;AACA;EACC,YEvDe;EFwDf,OErDgB;;AFyDlB;EACC;;AAID;EACC;;AACA;EACC%22,%22file%22:%22generic.css%22%7D */

30
.styles/icons.css Normal file
View file

@ -0,0 +1,30 @@
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--12 {
height: 12px;
width: 12px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--16 {
height: 16px;
width: 16px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--20 {
height: 20px;
width: 20px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--24 {
height: 24px;
width: 24px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--28 {
height: 28px;
width: 28px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--32 {
height: 32px;
width: 32px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--36 {
height: 36px;
width: 36px;
}
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/icons.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAOG;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA%22,%22file%22:%22icons.css%22%7D */

View file

@ -49,10 +49,6 @@
.dotdungeon > .window-content select :disabled, .dotdungeon > .window-content select:hover :disabled { .dotdungeon > .window-content select :disabled, .dotdungeon > .window-content select:hover :disabled {
cursor: default; cursor: default;
} }
.dotdungeon > .window-content .debug-data {
opacity: 60%;
font-family: sans-serif;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon { .dotdungeon.dotdungeon.dotdungeon.dotdungeon {
container-type: size; container-type: size;
@ -61,18 +57,70 @@
padding: 0; padding: 0;
background: #f2f2f2; background: #f2f2f2;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon button { .dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content .debug-data {
opacity: 60%;
font-family: sans-serif;
word-break: break-all;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button {
border-radius: 4px; border-radius: 4px;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon button.primary { .dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.primary {
background: #00aa00; background: #00aa00;
color: black; color: black;
padding: 5px 7px; padding: 4px 8px;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon button.primary:hover { .dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.primary:hover {
background: #008800; background: #008800;
color: white; color: white;
} }
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.danger {
background: red;
color: white;
padding: 4px 8px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.danger:hover {
background: #cc0000;
color: white;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.reduced-padding {
padding: 2px 4px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.equal-padding {
padding: 4px 4px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon > .window-content button.equal-padding.reduced-padding {
padding: 2px 2px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--12 {
height: 12px;
width: 12px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--16 {
height: 16px;
width: 16px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--20 {
height: 20px;
width: 20px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--24 {
height: 24px;
width: 24px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--28 {
height: 28px;
width: 28px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--32 {
height: 32px;
width: 32px;
}
.dotdungeon.dotdungeon.dotdungeon.dotdungeon .icon--36 {
height: 36px;
width: 36px;
}
.dotdungeon .stat { .dotdungeon .stat {
display: flex; display: flex;
@ -146,6 +194,18 @@
padding: 4px; padding: 4px;
gap: 4px; gap: 4px;
} }
.dotdungeon .actor--pc details {
border-radius: 4px;
background-color: rgba(0, 0, 0, 0.2);
padding: 4px;
margin-bottom: 8px;
}
.dotdungeon .actor--pc details summary {
cursor: pointer;
}
.dotdungeon .actor--pc details[open] .expanded-rotate {
transform: rotate(90deg);
}
.dotdungeon .actor--pc .panel--profile { .dotdungeon .actor--pc .panel--profile {
grid-area: profile; grid-area: profile;
} }
@ -366,4 +426,17 @@
resize: vertical; resize: vertical;
} }
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/generic.scss%22,%22../styles/mixins/_foundry.scss%22,%22../styles/_vars.scss%22,%22../styles/mixins/_partials.scss%22,%22../styles/sheets/partials/stat.scss%22,%22../styles/sheets/partials/skill.scss%22,%22../styles/sheets/partials/panel.scss%22,%22../styles/mixins/_breakpoints.scss%22,%22../styles/sheets/actor/mvp.scss%22,%22../styles/sheets/actor/sync/basic.scss%22,%22../styles/sheets/items/aspect.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAIQ;AAKP;EACC;;AAED;EACC;;AAGD;ECfA;EACA;EACA;EDeC,aEhBW;EFiBX;;AAGD;EACC;;AAGD;ECzBA;EACA;EACA;EDyBC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;EGpCD;EACA;EACA;EACA;EACA;EACA,aDLW;;ACOX;AAAA;AAAA;AAAA;AAAA;EAEC;;AH+BD;EACC;;AAEA;EACC;;AAIF;EACC;EACA,aElDU;;;AFuDZ;EACC;;AAEA;EACC;EACA,YE1DW;;AF6DZ;EACC;;AAEA;EACC,YE9Dc;EF+Dd,OErDe;EFsDf;;AACA;EACC,YE7DiB;EF8DjB,OEpDkB;;;AEvBtB;EACC;EACA;EACA;;ACHD;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;;ACdH;EACC;EACA;EAEA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;ELlBD;EACA;EACA;EKkBE;EACA;EACA,aJrBU;EIsBV;;AAGD;EAEC,QADO;EAEP,OAFO;EAGP;;AAIF;EACC;;;AC7BD;EDkCA;IACC;IACA;;;AExCF;EACC;EACA,qBACC;EASD;EACA,oBACC;EAGD;EACA;;AAGC;EACC;;AACA;EACC;EACA;;AAGD;EACC;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAED;EACC;EACA;;AAED;EACC;;AAGD;EACC;EACA;EACA;;AAGD;AAAA;AAAA;EAGC;EACA;;AAGD;EACC;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;EACC;;AAIF;EACC;EACA;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGF;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAIH;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAED;EACC;;AAED;EACC;;AAED;EACC;;;AD1LF;ECkMC;IACC;IACA;IACA,qBACC;;EAkBC;IACC;;EAKD;IACC;IACA;;;AD1NL;ECoOC;IACC;IACA;IACA,qBACC;;EAeC;IACC;;;AC5PL;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;;AAGD;EACC;EACA;;AAMA;EACC;EACA;;;AFlBH;EE4BG;IACC;IACA;;;ACzCL;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA%22,%22file%22:%22root.css%22%7D */ .dotdungeon .item--spell {
padding: 4px;
}
.dotdungeon .item--spell input[type=text] {
font-size: 1.5em;
height: 1.5em;
width: 100%;
}
.dotdungeon .item--spell textarea {
width: 100%;
resize: vertical;
}
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../styles/generic.scss%22,%22../styles/mixins/_foundry.scss%22,%22../styles/_vars.scss%22,%22../styles/mixins/_partials.scss%22,%22../styles/icons.scss%22,%22../styles/sheets/partials/stat.scss%22,%22../styles/sheets/partials/skill.scss%22,%22../styles/sheets/partials/panel.scss%22,%22../styles/mixins/_breakpoints.scss%22,%22../styles/sheets/actor/mvp.scss%22,%22../styles/sheets/actor/sync/basic.scss%22,%22../styles/sheets/items/aspect.scss%22,%22../styles/sheets/items/spell.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAIQ;AAKP;EACC;;AAED;EACC;;AAGD;ECfA;EACA;EACA;EDeC,aEhBW;EFiBX;;AAGD;EACC;;AAGD;ECzBA;EACA;EACA;EDyBC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;EGpCD;EACA;EACA;EACA;EACA;EACA,aDLW;;ACOX;AAAA;AAAA;AAAA;AAAA;EAEC;;AH+BD;EACC;;AAEA;EACC;;;AAMH;EACC;;AAEA;EACC;EACA,YErDW;;AFuDX;EACC;EACA,aE3DS;EF4DT;;AAGD;EACC;;AAEA;EACC,YE9Da;EF+Db,OErDc;EFsDd;;AACA;EACC,YE7DgB;EF8DhB,OEpDiB;;AFwDnB;EACC,YEpDY;EFqDZ,OElDa;EFmDb;;AACA;EACC,YEvDe;EFwDf,OErDgB;;AFyDlB;EACC;;AAID;EACC;;AACA;EACC;;;AI1FF;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;AAFD;EACC;EACA;;;ACTJ;EACC;EACA;EACA;;ACHD;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;;ACdH;EACC;EACA;EAEA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;ENlBD;EACA;EACA;EMkBE;EACA;EACA,aLrBU;EKsBV;;AAGD;EAEC,QADO;EAEP,OAFO;EAGP;;AAIF;EACC;;;AC7BD;EDkCA;IACC;IACA;;;AExCF;EACC;EACA,qBACC;EASD;EACA,oBACC;EAGD;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIA;EACC;;AAMF;EACC;;AACA;EACC;EACA;;AAGD;EACC;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAED;EACC;EACA;;AAED;EACC;;AAGD;EACC;EACA;EACA;;AAGD;AAAA;AAAA;EAGC;EACA;;AAGD;EACC;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;EACC;;AAIF;EACC;EACA;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGF;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAIH;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAED;EACC;;AAED;EACC;;AAED;EACC;;;AD3MF;ECmNC;IACC;IACA;IACA,qBACC;;EAkBC;IACC;;EAKD;IACC;IACA;;;AD3OL;ECqPC;IACC;IACA;IACA,qBACC;;EAeC;IACC;;;AC7QL;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;;AAGD;EACC;EACA;;AAMA;EACC;EACA;;;AFlBH;EE4BG;IACC;IACA;;;ACzCL;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;;;ACXF;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA%22,%22file%22:%22root.css%22%7D */

View file

@ -6,6 +6,18 @@
padding: 4px; padding: 4px;
gap: 4px; gap: 4px;
} }
.dotdungeon .actor--pc details {
border-radius: 4px;
background-color: rgba(0, 0, 0, 0.2);
padding: 4px;
margin-bottom: 8px;
}
.dotdungeon .actor--pc details summary {
cursor: pointer;
}
.dotdungeon .actor--pc details[open] .expanded-rotate {
transform: rotate(90deg);
}
.dotdungeon .actor--pc .panel--profile { .dotdungeon .actor--pc .panel--profile {
grid-area: profile; grid-area: profile;
} }
@ -183,4 +195,4 @@
} }
} }
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../../../styles/sheets/actor/mvp.scss%22,%22../../../styles/mixins/_breakpoints.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAGA;EACC;EACA,qBACC;EASD;EACA,oBACC;EAGD;EACA;;AAGC;EACC;;AACA;EACC;EACA;;AAGD;EACC;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAED;EACC;EACA;;AAED;EACC;;AAGD;EACC;EACA;EACA;;AAGD;AAAA;AAAA;EAGC;EACA;;AAGD;EACC;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;EACC;;AAIF;EACC;EACA;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGF;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAIH;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAED;EACC;;AAED;EACC;;AAED;EACC;;;AC1LF;EDkMC;IACC;IACA;IACA,qBACC;;EAkBC;IACC;;EAKD;IACC;IACA;;;AC1NL;EDoOC;IACC;IACA;IACA,qBACC;;EAeC;IACC%22,%22file%22:%22mvp.css%22%7D */ /*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../../../styles/sheets/actor/mvp.scss%22,%22../../../styles/mixins/_breakpoints.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAGA;EACC;EACA,qBACC;EASD;EACA,oBACC;EAGD;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIA;EACC;;AAMF;EACC;;AACA;EACC;EACA;;AAGD;EACC;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAED;EACC;EACA;;AAED;EACC;;AAGD;EACC;EACA;EACA;;AAGD;AAAA;AAAA;EAGC;EACA;;AAGD;EACC;;AAGF;EACC;;AAEA;EACC;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;EACC;;AAIF;EACC;EACA;;AAGF;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGF;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAIH;EACC;;AACA;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAIH;EACC;;AAED;EACC;;AAED;EACC;;AAED;EACC;;;AC3MF;EDmNC;IACC;IACA;IACA,qBACC;;EAkBC;IACC;;EAKD;IACC;IACA;;;AC3OL;EDqPC;IACC;IACA;IACA,qBACC;;EAeC;IACC%22,%22file%22:%22mvp.css%22%7D */

View file

@ -0,0 +1,14 @@
.dotdungeon .item--spell {
padding: 4px;
}
.dotdungeon .item--spell input[type=text] {
font-size: 1.5em;
height: 1.5em;
width: 100%;
}
.dotdungeon .item--spell textarea {
width: 100%;
resize: vertical;
}
/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../../../styles/sheets/items/spell.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEA;EACC;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA%22,%22file%22:%22spell.css%22%7D */

View file

@ -74,7 +74,8 @@
"SyncSheet": { "SyncSheet": {
"basic": "Theme: Basic" "basic": "Theme: Basic"
}, },
"AspectSheet": "Aspect Sheet" "AspectSheet": "Aspect Sheet",
"SpellSheet": "Spell Sheet"
}, },
"actor": { "actor": {
"pc": { "pc": {
@ -184,6 +185,16 @@
"duration": "Duration (seconds)", "duration": "Duration (seconds)",
"description": "Description", "description": "Description",
"send-to-chat": "Send Aspect to Chat" "send-to-chat": "Send Aspect to Chat"
},
"spell": {
"name.placeholder": "Name...",
"cost.label": "Cost",
"description.label": "Description",
"aria": {
"name": "The spell's name",
"cost": "The amount of bytes it takes to cast the spell",
"description": "The details of the spell"
}
} }
}, },
"notification": { "notification": {

View file

@ -1,9 +1,22 @@
export const DOTDUNGEON = {}; const statDice = [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ];
DOTDUNGEON.statDice = [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; const trainingLevels = [``, `locked`, `+2`, `+4`];
DOTDUNGEON.trainingLevels = [``, `locked`, `+2`, `+4`]; const damageTypes = [ `slashing`, `piercing`, `smashing`, `gun`, `neon`, `shadow`, `solar` ];
DOTDUNGEON.damageTypes = [ `slashing`, `piercing`, `smashing`, `gun`, `neon`, `shadow`, `solar` ]; const ammoTypes = [`quivers`, `mags`, `cells`];
DOTDUNGEON.ammoTypes = [`quivers`, `mags`, `cells`]; const skills = {
build: [ "defense", "magic", "melee", "platforming", "strength", ],
meta: [ "alchemy", "arcanum", "dreams", "lore", "navigation", ],
presence: [ "animal_handling", "perception", "sneak", "speech", "vibes", ],
hands: [ "accuracy", "crafting", "engineering", "explosives", "piloting", ]
};
export default {
statDice,
trainingLevels,
damageTypes,
ammoTypes,
skills,
};

View file

@ -14,6 +14,11 @@ export class ActorHandler extends Actor {
return this.actorTypes[this.type]; return this.actorTypes[this.type];
}; };
updateEmbeddedDocument($event) {
if (!this.fn?.updateEmbeddedDocument) return;
this.fn.updateEmbeddedDocument.bind(this)($event);
};
createCustomSpell() { createCustomSpell() {
if (!this.fn?.createCustomSpell) return; if (!this.fn?.createCustomSpell) return;
this.fn.createCustomSpell.bind(this)(); this.fn.createCustomSpell.bind(this)();

View file

@ -7,4 +7,10 @@ export class PlayerActor {
description: ``, description: ``,
}; };
}; };
static async updateEmbeddedDocument($event) {
let data = $event.target.dataset;
let item = await fromUuid(data.embeddedId);
item?.update({ [data.embeddedUpdate]: $event.target.value });
};
}; };

View file

@ -1,26 +1,27 @@
// Data Models // Data Models
import { DescribedItemData } from "./module/models/Item/DescribedItemData.mjs"; import { AspectItemData } from "./models/AspectItemData.mjs";
import { AspectItemData } from "./module/models/AspectItemData.mjs"; import { SpellItemData } from "./models/Item/Spell.mjs";
import { PlayerData } from "./module/models/PlayerData.mjs"; import { PlayerData } from "./models/PlayerData.mjs";
import { SyncData } from "./module/models/SyncData.mjs"; import { SyncData } from "./models/SyncData.mjs";
// Main Documents // Main Documents
import { ActorHandler } from "./module/documents/Actor/Handler.mjs"; import { ActorHandler } from "./documents/Actor/Handler.mjs";
// Character Sheets // Character Sheets
import { AspectSheet } from "./module/sheets/AspectSheet.mjs"; import { SpellSheet } from "./sheets/SpellSheet.mjs";
import { PlayerSheet } from "./module/sheets/PlayerSheet.mjs"; import { AspectSheet } from "./sheets/AspectSheet.mjs";
import { BasicSyncSheet } from "./module/sheets/SyncVariations/BasicSyncSheet.mjs"; import { PlayerSheet } from "./sheets/PlayerSheet.mjs";
import { BasicSyncSheet } from "./sheets/SyncVariations/BasicSyncSheet.mjs";
// Utility imports // Utility imports
import * as hbs from "./module/handlebars.mjs"; import * as hbs from "./handlebars.mjs";
// Non-Setup hooks // Non-Setup hooks
import "./module/hooks/hotReload.mjs"; import "./hooks/hotReload.mjs";
// Misc Imports // Misc Imports
import loadSettings from "./module/settings/index.mjs"; import loadSettings from "./settings/index.mjs";
import { DOTDUNGEON } from "./module/config.mjs"; import DOTDUNGEON from "./config.mjs";
Hooks.once(`init`, () => { Hooks.once(`init`, () => {
@ -31,7 +32,7 @@ Hooks.once(`init`, () => {
CONFIG.Actor.dataModels.player = PlayerData; CONFIG.Actor.dataModels.player = PlayerData;
CONFIG.Actor.dataModels.sync = SyncData; CONFIG.Actor.dataModels.sync = SyncData;
CONFIG.Item.dataModels.aspect = AspectItemData; CONFIG.Item.dataModels.aspect = AspectItemData;
CONFIG.Item.dataModels.spell = DescribedItemData; CONFIG.Item.dataModels.spell = SpellItemData;
CONFIG.Actor.documentClass = ActorHandler; CONFIG.Actor.documentClass = ActorHandler;
CONFIG.DOTDUNGEON = DOTDUNGEON; CONFIG.DOTDUNGEON = DOTDUNGEON;
@ -53,6 +54,11 @@ Hooks.once(`init`, () => {
types: ["aspect"], types: ["aspect"],
label: "dotdungeon.sheet-names.AspectSheet" label: "dotdungeon.sheet-names.AspectSheet"
}); });
Items.registerSheet("dotdungeon", SpellSheet, {
makeDefault: true,
types: ["spell"],
label: "dotdungeon.sheet-names.SpellSheet"
});
hbs.registerHandlebarsHelpers(); hbs.registerHandlebarsHelpers();
hbs.preloadHandlebarsTemplates(); hbs.preloadHandlebarsTemplates();

View file

@ -7,5 +7,6 @@
* @returns {"open"|null} The HTML insertion indicating the details is expanded * @returns {"open"|null} The HTML insertion indicating the details is expanded
*/ */
export function detailsExpanded(expanded, collapseId) { export function detailsExpanded(expanded, collapseId) {
console.log(`.dungeon |`, collapseId, expanded)
return expanded.has(collapseId) ? "open" : null; return expanded.has(collapseId) ? "open" : null;
}; };

View file

@ -1 +1,10 @@
export function schemaOptions() {}; export function schemaOptions(document, schemaPath) {
let splitPath = schemaPath.split(`.`);
let tempLocation = document.schema.fields.system;
for (const part of splitPath) {
tempLocation = tempLocation[part].fields
}
return CONFIG.Actor.dataModels.player.schema.fields.weapon.fields.mainHand.fields.damage.options.options;
};

View file

@ -2,11 +2,6 @@ export class CommonItemData extends foundry.abstract.DataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;
return { return {
name: new fields.StringField({
initial: ``,
blank: true,
trim: true,
}),
cost: new fields.NumberField({ cost: new fields.NumberField({
initial: null, initial: null,
nullable: true, nullable: true,

View file

@ -0,0 +1,22 @@
import { DescribedItemData } from "./DescribedItemData.mjs";
import DOTDUNGEON from "../../config.mjs";
export class SpellItemData extends DescribedItemData {
static defineSchema() {
const fields = foundry.data.fields;
return mergeObject(super.defineSchema(), {
skill: new fields.StringField({
initial: ``,
blank: true,
trim: true,
options() {
let skills = [ `` ];
for (const group in DOTDUNGEON.skills) {
skills.push(...skills[group]);
};
return skills;
},
}),
});
};
};

View file

@ -20,7 +20,7 @@ export class AspectSheet extends ItemSheet {
console.debug(`.dungeon | Adding event listeners for Item: ${this.id}`); console.debug(`.dungeon | Adding event listeners for Item: ${this.id}`);
}; };
getData() { async getData() {
const ctx = {}; const ctx = {};
const item = this.item.toObject(false); const item = this.item.toObject(false);
@ -29,10 +29,6 @@ export class AspectSheet extends ItemSheet {
ctx.system = item.system; ctx.system = item.system;
ctx.flags = item.flags; ctx.flags = item.flags;
console.groupCollapsed(`AspectSheet.getData`);
console.log(`ctx`, ctx);
console.log(`item`, item);
console.groupEnd();
return ctx; return ctx;
}; };
}; };

View file

@ -1,3 +1,6 @@
import DOTDUNGEON from "../config.mjs";
import { preloadIcons } from "../handlebars.mjs";
export class GenericActorSheet extends ActorSheet { export class GenericActorSheet extends ActorSheet {
_expanded = new Set(); _expanded = new Set();
@ -8,8 +11,8 @@ export class GenericActorSheet extends ActorSheet {
`resourcesOrSupplies`, `resourcesOrSupplies`,
]; ];
getData() { async getData() {
const ctx = super.getData(); const ctx = {};
// Send all of the settings that sheets need into their context // Send all of the settings that sheets need into their context
ctx.settings = {}; ctx.settings = {};
@ -24,6 +27,10 @@ export class GenericActorSheet extends ActorSheet {
idp: this.actor.uuid, idp: this.actor.uuid,
}; };
ctx.actor = this.actor;
ctx.config = DOTDUNGEON;
ctx.icons = await preloadIcons();
return ctx; return ctx;
}; };

View file

@ -0,0 +1,42 @@
import { preloadIcons } from "../handlebars.mjs";
export class GenericItemSheet extends ItemSheet {
_expanded = new Set();
#propogatedSettings = [
`devMode`,
`showAvatarOnSheet`,
`playersCanChangeGroup`,
`resourcesOrSupplies`,
];
activateListeners(html) {
super.activateListeners(html);
if (this.document.isEmbedded) return;
if (!this.isEditable) return;
console.debug(`.dungeon | Adding event listeners for Generic Item: ${this.id}`);
};
async getData() {
const ctx = {};
const item = this.item.toObject(false);
// Send all of the settings that sheets need into their context
ctx.settings = {};
for (const setting of this.#propogatedSettings) {
ctx.settings[setting] = game.settings.get(`dotdungeon`, setting);
};
ctx.isGM = game.users.current.hasRole(CONST.USER_ROLES.ASSISTANT);
ctx.meta = {
expanded: this._expanded,
idp: this.actor.uuid,
};
ctx.icons = await preloadIcons();
return ctx;
};
};

View file

@ -20,23 +20,23 @@ export class PlayerSheet extends GenericActorSheet {
console.debug(`.dungeon | Adding event listeners for Actor: ${this.id}`); console.debug(`.dungeon | Adding event listeners for Actor: ${this.id}`);
html.find(`.add-spell`).on(`click`, this.actor.createCustomSpell.bind(this.actor)); html.find(`.add-spell`).on(`click`, this.actor.createCustomSpell.bind(this.actor));
html.find(`[data-embedded-update]`)
.on(`change`, this.actor.updateEmbeddedDocument.bind(this.actor));
}; };
getData() { async getData() {
const ctx = super.getData(); const ctx = await super.getData();
const actor = this.actor.toObject(false); const actor = this.actor.toObject(false);
ctx.system = actor.system; ctx.system = actor.system;
ctx.flags = actor.flags; ctx.flags = actor.flags;
ctx.items = this.actor.itemTypes;
ctx.computed = { ctx.computed = {
canChangeGroup: ctx.settings.playersCanChangeGroup || ctx.isGM, canChangeGroup: ctx.settings.playersCanChangeGroup || ctx.isGM,
}; };
console.groupCollapsed(`PlayerSheet.getData`); console.log(ctx)
console.log(`ctx`, ctx);
console.log(`actor`, actor);
console.groupEnd();
return ctx; return ctx;
}; };
}; };

View file

@ -0,0 +1,36 @@
import { GenericItemSheet } from "./GenericItemSheet.mjs";
export class SpellSheet extends GenericItemSheet {
static get defaultOptions() {
let opts = mergeObject(
super.defaultOptions,
{
template: `systems/dotdungeon/templates/items/spell.hbs`,
width: 280,
height: 340,
}
);
opts.classes.push(`dotdungeon`);
return opts;
};
activateListeners(html) {
super.activateListeners(html);
if (this.document.isEmbedded) return;
if (!this.isEditable) return;
console.debug(`.dungeon | Adding event listeners for Generic Item: ${this.id}`);
};
async getData() {
const ctx = {};
const item = this.item.toObject(false);
ctx.name = super.name;
ctx.item = item;
ctx.system = item.system;
ctx.flags = item.flags;
return ctx;
};
};

View file

@ -16,8 +16,8 @@ export class AbstractSyncSheet extends GenericActorSheet {
return opts; return opts;
}; };
getData() { async getData() {
const ctx = super.getData(); const ctx = await super.getData();
const actor = this.actor.toObject(false); const actor = this.actor.toObject(false);
ctx.system = actor.system; ctx.system = actor.system;

View file

@ -24,4 +24,10 @@ $text-on-primary-l20: black;
$text-on-primary-d20: white; $text-on-primary-d20: white;
$text-on-primary-d40: white; $text-on-primary-d40: white;
$text-on-primary-d60: white; $text-on-primary-d60: white;
$text-on-primary-d80: white; $text-on-primary-d80: white;
$colour-danger: red;
$colour-danger-d20: color.scale($colour-danger, $lightness: -20%);
$text-on-danger: white;
$text-on-danger-d20: white;

View file

@ -61,6 +61,7 @@
.debug-data { .debug-data {
opacity: 60%; opacity: 60%;
font-family: $body-font; font-family: $body-font;
word-break: break-all;
} }
button { button {
@ -69,12 +70,35 @@
&.primary { &.primary {
background: $colour-primary; background: $colour-primary;
color: $text-on-primary; color: $text-on-primary;
padding: 5px 7px; padding: 4px 8px;
&:hover { &:hover {
background: $colour-primary-d20; background: $colour-primary-d20;
color: $text-on-primary-d20; color: $text-on-primary-d20;
} }
} }
&.danger {
background: $colour-danger;
color: $text-on-danger;
padding: 4px 8px;
&:hover {
background: $colour-danger-d20;
color: $text-on-danger-d20;
}
}
&.reduced-padding {
padding: 2px 4px;
}
&.equal-padding {
padding: 4px 4px;
&.reduced-padding {
padding: 2px 2px;
}
}
} }
} }
} }

14
styles/icons.scss Normal file
View file

@ -0,0 +1,14 @@
$iconSizes: 12, 16, 20, 24, 28, 32, 36;
.dotdungeon.dotdungeon.dotdungeon.dotdungeon {
.icon {
// The various icon sizes
@each $size in $iconSizes {
&--#{$size} {
height: #{$size}px;
width: #{$size}px;
};
}
}
}

View file

@ -3,6 +3,7 @@
@use "./vars.scss" as *; @use "./vars.scss" as *;
@use "./generic.scss"; @use "./generic.scss";
@use "./icons.scss";
@use "./sheets/partials/stat.scss"; @use "./sheets/partials/stat.scss";
@use "./sheets/partials/skill.scss"; @use "./sheets/partials/skill.scss";
@ -10,4 +11,5 @@
@use "./sheets/actor/mvp.scss"; @use "./sheets/actor/mvp.scss";
@use "./sheets/actor/sync/basic.scss"; @use "./sheets/actor/sync/basic.scss";
@use "./sheets/items/aspect.scss"; @use "./sheets/items/aspect.scss";
@use "./sheets/items/spell.scss";

View file

@ -21,6 +21,23 @@
padding: 4px; padding: 4px;
gap: 4px; gap: 4px;
details {
border-radius: 4px;
background-color: rgba(0,0,0, 0.2);
padding: 4px;
margin-bottom: 8px;
summary {
cursor: pointer;
}
&[open] {
.expanded-rotate {
transform: rotate(90deg);
}
}
}
.panel { .panel {
&--profile { &--profile {
grid-area: profile; grid-area: profile;

View file

@ -0,0 +1,16 @@
@use "../../vars" as *;
.dotdungeon .item--spell {
padding: 4px;
input[type=text] {
font-size: 1.5em;
height: 1.5em;
width: 100%;
}
textarea {
width: 100%;
resize: vertical;
}
}

View file

@ -16,7 +16,7 @@
], ],
"url": "https://github.com/Oliver-Akins/foundry.dungeon", "url": "https://github.com/Oliver-Akins/foundry.dungeon",
"esmodules": [ "esmodules": [
"dotdungeon.mjs" "module/dotdungeon.mjs"
], ],
"styles": [ "styles": [
".styles/root.css" ".styles/root.css"

View file

@ -1,35 +1,44 @@
{{#> dotdungeon.panel class="spells" title="dotdungeon.actor.pc.panel.spells"}} {{#> dotdungeon.panel class="spells" title="dotdungeon.actor.pc.panel.spells"}}
{{#each system.spells as | spell |}} {{#each items.spell as | spell |}}
<details {{dd-expanded ../meta.expanded @key}}> <details {{dd-expanded ../meta.expanded spell.uuid}}>
<summary data-collapse-id="{{@key}}"> <summary data-collapse-id="{{spell.uuid}}">
{{spell.name}} (Cost: {{spell.cost}}) <span class="flex-grow" style="flex-grow: 1">
{{spell.name}}
{{#if spell.system.cost }}
(Cost: {{spell.system.cost}})
{{/if}}
</span>
</summary> </summary>
<div class="spell"> <div class="spell">
<div class="spell__name"> <div class="spell__name">
<label for="{{meta.idp}}-{{@key}}-name">Name</label> <label for="{{spell.uuid}}-name">Name</label>
<input <input
type="text" type="text"
id="{{meta.idp}}-{{@key}}-name" id="{{spell.uuid}}-name"
name="system.spells.{{@key}}.name"
value="{{spell.name}}" value="{{spell.name}}"
data-embedded-update="name"
data-embedded-id="{{spell.uuid}}"
> >
</div> </div>
<div class="spell__cost"> <div class="spell__cost">
<label for="{{meta.idp}}-{{@key}}-cost"></label> <label for="{{spell.uuid}}-cost">Cost</label>
<input <input
type="text" type="text"
id="{{meta.idp}}-{{@key}}-cost" id="{{spell.uuid}}-cost"
name="system.spells.{{@key}}.cost" value="{{spell.system.cost}}"
value="{{spell.cost}}" data-embedded-update="system.cost"
data-embedded-id="{{spell.uuid}}"
> >
</div> </div>
<div class="spell__description"> <div class="spell__description">
{{spell.description}} <label for="{{spell.uuid}}-description"></label>
</div> <textarea
<div class="flex-row flex-end"> id="{{spell.uuid}}-description"
<button> data-embedded-update="system.description"
Delete data-embedded-id="{{spell.uuid}}"
</button> >{{spell.system.description}}</textarea>
</div> </div>
</div> </div>
</details> </details>
@ -37,10 +46,9 @@
<p> <p>
You have no spells yet! You have no spells yet!
</p> </p>
<div class="debug-data">
{{dd-stringify system.spells}}
</div>
{{/each}} {{/each}}
<div class="flex-row"> <div class="flex-row">
<button <button
class="primary add-spell" class="primary add-spell"

View file

@ -55,6 +55,11 @@
<pre><code>{{dd-stringify CONFIG}}</code></pre> <pre><code>{{dd-stringify CONFIG}}</code></pre>
</div> </div>
<hr> <hr>
<div>
Items:
<pre><code>{{dd-stringify items}}</code></pre>
</div>
<hr>
<div> <div>
System: System:
<pre><code>{{dd-stringify system}}</code></pre> <pre><code>{{dd-stringify system}}</code></pre>

View file

@ -15,7 +15,6 @@
name="system.deactivateAfter" name="system.deactivateAfter"
value="{{system.deactivateAfter}}" value="{{system.deactivateAfter}}"
> >
{{dd-toFriendlyDuration system.deactivateAfter}}
</label> </label>
<label> <label>
{{localize "dotdungeon.item.aspect.description"}}: {{localize "dotdungeon.item.aspect.description"}}:

27
templates/items/spell.hbs Normal file
View file

@ -0,0 +1,27 @@
<form autocomplete="off" class="item--spell">
<h2>
<input
type="text"
placeholder="{{localize "dotdungeon.item.spell.name.placeholder"}}"
name="name"
value="{{item.name}}"
aria-label="{{localize "dotdungeon.item.spell.aria.name"}}"
>
</h2>
<label>
{{localize "dotdungeon.item.spell.cost.label"}}
<input
type="number"
name="system.cost"
value="{{system.cost}}"
aria-label="{{localize "dotdungeon.item.spell.aria.cost"}}"
>
</label>
<label>
{{localize "dotdungeon.item.spell.description.label"}}:
<textarea
name="system.description"
aria-description="{{localize "dotdungeon.item.spell.aria.description"}}"
>{{system.description}}</textarea>
</label>
</form>