Compare commits

...

5 Commits

Author SHA1 Message Date
f1c16da7e4 several changes that were necessary in conjunction with the design revamp 2023-09-12 15:55:38 +02:00
4906f82e4c several changes that were in conjunction with design revamp 2023-09-12 15:55:05 +02:00
d90cff7832 Complete design revamp with focus on
- responsiveness: breakpoints at 500 and 1000px
- lightweight: importing necessary Bootstrap CSS components only
- color-friendliness: blue/gold instead of blue/pink
- consistency across different browsers
- ease of use: widely using bs sass variables for styles
2023-09-12 15:48:23 +02:00
29b6409f97 changed start_url to "/" 2023-09-12 15:48:03 +02:00
5b547ec244 updated 2023-09-12 15:47:55 +02:00
5 changed files with 409 additions and 317 deletions

44
TODO.md
View File

@ -75,34 +75,42 @@
- x add modal geht bei enter key nicht zu -> liegt daran, dass ich nicht mehr .modal("hide") verwende
- ich könnt's umstellen, aber will ich das?
- nicht mehr aktuell
### open
- dafür sorgen, dass lange Namen nicht das Design sprengen -> https://www.design-fluide.com/09-12-2018/how-to-break-long-words-in-an-html-or-css-table/
- Design
- im Chromium sind die Slider für Damage im #combatant-modal ungestylet
- augmented-ui Fallstricke:
- --aug-[b|t|][l|r|] fkt. nur sicher mit Werten in px; em, rem, % etc. fkt. idR nicht
- --aug-border-* fkt. nicht mit Wert 0, es muss 0px sein
- x dafür sorgen, dass lange Namen nicht das Design sprengen -> https://www.design-fluide.com/09-12-2018/how-to-break-long-words-in-an-html-or-css-table/
- x (Re)Design
- table anders aufteilen (cell width) (zB ist INI zu breit)
- Seite für größere Screens anpassen (Schrift, Buttons, Icons skalieren)
- Breakpoints: 600px, 1200px
- Elementbreite begrenzen
- Tabellenbreite begrenzen (mit Containerbreite immer ~95%)
- viewport width <= 600px: 100%
- viewport width > 600px: (100-x/24)% mit x = vWidth-600px
- viewport widht > 1200: 75%
- nicht px benutzen, sondern vw/vh/vmin/vmax -> muss aber schauen, ob FF4And das unterstützt
- clamp(minsize, relsize, maxsize)
- auch mgl.: calc(0.75em + 1vw) (macht den Vergrößerungseffekt für große Viewports irrelevant)
- make color scheme friendly for people with red green bindness (Felix)
- slightly restyle elements
- navbar: augmented-ui br clipping is too wide
- x table: table row clipping not working -> liegt an td { clip-path: none; }
- footer: smaller
- x use variables for repeating CSS values (box-shadow, text-shadow, button size etc.)
- augmented-ui Fallstricke:
- --aug-[b|t|][l|r|] fkt. nur sicher mit Werten in px; em, rem, % etc. fkt. idR nicht
- --aug-border-* fkt. nicht mit Wert 0, es muss 0px sein
- x Design im Chromium checken (zB damage slider #combatant-modal)
- -moz-… mit -webkit-… ergänzen
- x make color scheme friendly for people with red green bindness (Felix)
- see here: https://venngage.com/tools/accessible-color-palette-generator
- Favicon nicht vergessen!!
- tests
- weiß: ghostwhite, white, lightgrey
- Kandidaten
- gelb: gold, yellow, orange
- grün: lawngreen, lime, greenyellow
- rot: orangered, red, darkred
- im FP3T Tor Browser kann ich rauszoomen, bis ich die ganzen damage monitors und action menus sehe -> verhindern!
### open
- color scheme beim Favicon anpassen
- im FP3T Tor Browser kann ich rauszoomen, bis ich die ganzen damage monitors und action menus sehe -> verhindern!
- action-menu und damage-monitor sliden jetzt nicht mehr rein, sondern bleiben an Ort und Stelle
- das sollte die Sache verhindern
- warum fkt. das Ganze nicht als Webapp?
@ -120,8 +128,6 @@
- Seite als Web App auf FF4And installable machen
- mal sehen …
- Seite auch mal im Chrome checken
- -moz-… mit -webkit-… ergänzen
- Animationen? Transitions?
- deployment: dist/* soll direkt auf hermes hochgeladen werden
- x warum sind im dist/-Folder immer zwei Versionen der gleichen Datei? -> lag an parcel-reporter-static-file-copy

View File

@ -1,7 +1,7 @@
{
"name": "Shadowrun 2e Ini Tracker",
"short_name": "sr2ini",
"start_url": "https://unterdemradar.de/sr2ini",
"start_url": "/",
"description": "A simple Initiative tracker for Shadowrun 2e",
"orientation": "portrait",
"icons": [

View File

@ -1,18 +1,83 @@
/*$fg: deeppink; // #ff1493
$fg-bright: lightpink; // #ffb6c1
$fg-dark: #b3005f;*/
/* ***********************
* Non-bootstrap variables
************************* */
$fg: gold;
$fg-bright: yellow;
$fg-dark: orange;
// old fg-colors: deeppink, lightpink, #b3005f;
$bg: cyan; // #00ffff
$bg-bright: lightcyan; // #e0ffff
$bg-dark: darkcyan; // #008b8b
$html-font-size: 14px;
/* ******************************
* Overriding Bootstrap variables
******************************** */
@import "../../node_modules/bootstrap/scss/functions";
// fonts
@font-face {
font-family: "Electrolize";
src: local("Electrolize"), url("../img/Electrolize-Regular.ttf") format("truetype"), url("https://fonts.googleapis.com/css2?family=Electrolize&display=swap");
}
$font-family-base: "Electrolize";
// colors
$warning: $bg;
$danger: $fg;
// <input>
$input-bg: transparent;
$input-color: $fg;
$input-font-size: 1rem !important;
$input-focus-box-shadow: 0 0 .25rem $bg-bright, 0 0 .5rem $bg, 0 0 1rem $bg-dark !important;
// <input type="text/number">
$input-group-addon-color: $bg;
$input-group-addon-bg: transparent;
$input-group-addon-border-color: none;
// <input type="range">
$form-range-track-height: .2rem;
$form-range-track-bg: $bg;
$form-range-track-box-shadow: none;
$form-range-thumb-width: .25rem;
$form-range-thumb-height: 1rem;
$form-range-thumb-bg: $fg;
$form-range-thumb-border: none;
$form-range-thumb-box-shadow: none;
$form-range-thumb-focus-box-shadow: 0 0 .5rem $fg-bright, 0 0 1rem $fg, 0 0 2rem $fg-dark;
// <input> validation
$form-feedback-valid-color: $warning;
$form-feedback-icon-valid: none;
$form-feedback-icon-invalid: none;
// more bootstrap stylesheets
//@import "../../node_modules/bootstrap/scss/bootstrap";
@import "../../node_modules/bootstrap/scss/variables";
@import "../../node_modules/bootstrap/scss/variables-dark";
@import "../../node_modules/bootstrap/scss/maps";
@import "../../node_modules/bootstrap/scss/mixins";
@import "../../node_modules/bootstrap/scss/root";
@import "../../node_modules/bootstrap/scss/containers";
@import "../../node_modules/bootstrap/scss/navbar";
@import "../../node_modules/bootstrap/scss/tables";
@import "../../node_modules/bootstrap/scss/modal";
@import "../../node_modules/bootstrap/scss/forms";
@import "../../node_modules/bootstrap/scss/utilities";
@import "../../node_modules/bootstrap/scss/badge";
@import "../../node_modules/bootstrap/scss/reboot";
/* ******
* Mixins
******** */
@mixin aug() {
--aug-b: 5px;
@ -25,25 +90,64 @@ $bg-dark: darkcyan; // #008b8b
}
@mixin border() {
--aug-border-all: 2px;
--aug-border-all: .1rem;
--aug-border-bg: cyan; // variables don't work in this specific instance
--aug-border-opacity: .5;
}
@mixin inlay() {
--aug-inlay-bg: rgba(0, 0, 0, .5);
--aug-inlay-y: 10%;
--aug-inlay-x: .12em;
--aug-inlay-y: .12em;
}
@mixin button() {
background: transparent;
border: 1px solid $bg;
border-radius: 1px;
box-shadow: 0 0 2px $bg-bright, 0 0 4px $bg, 0 0 8px $bg-dark;
color: $fg;
padding-inline: 0px;
/* *******************
* Responsive styles
********************* */
@media (width <= 500px) {
html {
font-size: $html-font-size;
}
.container {
min-width: 100vw;
max-width: 100vw;
}
.table-responsive { max-width: calc(100% - .8rem); }
}
@media (500px < width < 1000px) {
html {
font-size: calc(100vw / (500px / $html-font-size));
}
.container {
$calc-width: calc(100vw / 2 + 250px);
min-width: $calc-width;
max-width: $calc-width;
}
}
@media (1000px <= width) {
html {
font-size: calc($html-font-size * 2);
}
.container {
min-width: 75vw;
max-width: 75vw;
}
}
/* *****************
* Basic styles
******************* */
html {
font-family: 'Electrolize', sans-serif;
height: 100%;
@ -58,23 +162,60 @@ body {
background-repeat: no-repeat;
background-position: center center;
background-size: cover;
}
.svg-icons { display: none; }
.icon { fill: $fg; }
.sr2-button:focus-visible {
border: 1px solid $bg !important;
box-shadow: 0 0 4px $bg-bright, 0 0 8px $bg, 0 0 16px $bg-dark !important;
outline: none;
margin: .2rem;
}
.container {
padding: 4px;
padding: .2rem;
position: relative;
}
button { font-family: Electrolize; }
button:focus {
filter: brightness(150%) !important;
outline: none;
}
.sr2-button {
background: transparent;
border: .07rem solid $bg;
border-radius: .07rem;
box-shadow: 0 0 .15rem $bg-bright, 0 0 .3rem $bg, 0 0 .6rem $bg-dark;
color: $fg;
font-size: 1rem;
margin-left: .2rem;
margin-right: .2rem;
padding-inline: 0px;
svg {
fill: $fg;
height: 93%;
width: 93%;
vertical-align: unset;
}
&:focus {
border: .1rem solid $bg !important;
box-shadow: 0 0 .3rem $bg-bright, 0 0 .6rem $bg, 0 0 1.2rem $bg-dark !important;
}
&:disabled {
box-shadow: none;
border-color: $bg-dark;
svg { fill: $fg-dark; }
}
}
.display-none { display: none; }
/* *****************
* Header styles
******************* */
header.navbar {
@include border;
@include inlay;
@ -87,34 +228,35 @@ header.navbar {
--aug-r: 7px;
--aug-tl: 7px;
--aug-tr: 7px;
padding-right: .6rem;;
padding-left: calc(15px + 1rem);
padding-right: 15px;
.navbar-brand {
color: $bg;
text-shadow: 0 0 3px, 0 0 6px, 0 0 12px, 0 0 24px;
font-size: 140%;
text-shadow: 0 0 .25rem, 0 0 .5rem, 0 0 .75rem, 0 0 1rem;
}
nav { justify-content: flex-end !important; }
button {
@include button;
height: 38px;
margin-left: 3px;
margin-right: 3px;
width: 38px;
svg {
width: 32px;
height: 32px;
fill: $fg;
}
height: 2rem;
width: 2rem;
}
}
.table-responsive { margin-bottom: 1px; }
/* *****************
* Table styles
******************* */
.table-responsive { overflow: visible !important; }
#combatants-table {
margin-top: .5rem;
border-collapse: collapse !important;
margin-bottom: .1rem;
margin-top: .4rem;
tr {
@include aug;
@ -125,18 +267,10 @@ header.navbar {
--aug-border-right: 0px;
}
.combatant-row {
clip-path: none;
vertical-align: middle !important;
}
tr:last-of-type td,
tr:last-of-type th { --aug-border-bottom: 2px; }
th:not(:first-of-type) { text-align: center; }
.th-ini { min-width: 3rem; }
.th-dice-and-rea { min-width: 3.75rem; }
.th-actions { min-width: 6.5rem; }
.combatant-row { clip-path: none; }
th,
td {
@ -147,6 +281,7 @@ header.navbar {
--aug-border-bottom: 0px;
--aug-border-right: 0px;
background: none !important;
vertical-align: middle !important;
}
th {
@ -154,116 +289,97 @@ header.navbar {
text-transform: uppercase;
}
.th-name {
padding-left: .75rem !important;
text-align: left;
width: 100%;
}
.th-ini {
min-width: 4rem;
}
.th-dice-and-rea { min-width: 3rem; }
.th-actions {
min-width: min-content;
--aug-border-right: 2px;
}
td {
clip-path: none;
color: $fg;
font-weight: bold;
}
th:first-of-type,
td:first-of-type {
padding-left: 1rem !important;
}
th:last-of-type,
td:last-of-type {
--aug-border-right: 2px;
padding-right: .75rem;
}
tr:last-of-type td,
tr:last-of-type th {
--aug-border-bottom: 2px;
}
.combatant-actions {
display: flex;
justify-content: flex-end;
}
text-align: center;
.sr2-button {
@include button;
height: 24px;
margin-left: 3px;
margin-right: 3px;
width: 24px;
svg,
.icon {
bottom: 3px;
height: 16px;
position: relative;
width: 16px;
}
&:disabled {
box-shadow: none;
border-color: $bg-dark;
.icon { fill: $fg-dark; }
height: 1.3rem;
width: 1.3rem;
}
}
.combatant-ini {
padding-right: 1rem !important;
text-align: center;
}
.combatant-name {
padding-left: .6rem !important;
text-align: left;
.combatant-dice-and-rea { text-align: center; }
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.combatant-dice::before { content: attr(data-combatant-dice); }
.combatant-rea::before { content: attr(data-combatant-rea); }
.combatant-actions {
--aug-border-right: 2px;
display: flex;
min-width: 5rem;
}
.actions-menu {
display: flex;
flex-flow: column;
padding: 6px;
padding: .2rem;
button {
@include button;
height: 24px;
margin: 4px;
width: 24px;
.sr2-button {
margin-bottom: .2rem;
margin-top: .2rem;
}
}
}
.max-ini td {
text-shadow: 0 0 .15em $fg;
text-shadow: 0 0 .15rem $fg;
}
.zero-ini td {
color: $fg-dark !important;
color: $fg-dark;
.icon { fill: $fg-dark !important; }
svg { fill: $fg-dark; }
}
.ko-or-dead td {
background-color: rgba(0, 0, 0, .5);
color: $fg-dark !important;
text-decoration: line-through .1em $fg;
color: $fg-dark;
text-decoration: line-through .1rem $fg;
.icon { fill: $fg-dark !important; }
.sr2-button svg { fill: $fg-dark; }
}
.badge.bg-warning {
background: radial-gradient(circle at center, $bg, $bg-dark);
bottom: .2rem;
color: black;
bottom: -4px;
left: 12px;
width: 20px;
left: .2rem;
position: absolute;
}
.badge.bg-danger {
background: radial-gradient(circle at center, $fg, $fg-dark);
color: black;
left: 12px;
top: 12px;
width: 20px;
left: .2rem;
position: absolute;
top: .3rem;
}
.damage-dropdown,
@ -279,8 +395,8 @@ header.navbar {
--aug-inlay-bg: rgba(0, 0, 0, .5);
--aug-border-opacity: .75;
padding-top: 10px;
padding-bottom: 10px;
padding-top: .7remx;
padding-bottom: .7rem;
position: absolute;
z-index: 200;
@ -297,20 +413,24 @@ header.navbar {
.seen {
visibility: visible;
opacity: 100%;
}
}
.damage-monitor {
padding: .5rem;
button {
border: none;
border-radius: 0;
font-size: smaller;
height: 24px;
margin: 0px 2px;
width: 24px;
font-family: Electrolize;
font-size: .9rem;
font-weight: bold;
height: 1.5rem !important;
margin: 0rem .15rem;
width: 1.5rem !important;
&:focus-visible {
filter: brightness(150%) !important;
outline: none;
svg {
height: 100%;
width: 100%;
}
}
@ -322,75 +442,36 @@ header.navbar {
.damage-stun.active {
background: radial-gradient(circle at center, $bg-bright, $bg);
box-shadow: 0 0 3px $bg-bright, 0 0 6px $bg, 0 0 12px $bg-dark;
box-shadow: 0 0 .25rem $bg-bright, 0 0 .5rem $bg, 0 0 1rem $bg-dark;
}
.damage-physical {
background: radial-gradient(circle at center, $fg, $fg-dark);
border-radius: 50%;;
border-radius: 50%; // circle, not square
box-shadow: none;
transition: background .5s, box-shadow .5s;
&:focus-visible { outline: $fg !important; }
}
.damage-physical.active {
background: radial-gradient(circle at center, $fg-bright, $fg);
box-shadow: 0 0 3px $fg-bright, 0 0 6px $fg, 0 0 12px $fg-dark;
}
svg {
height: 16px;
width: 16px;
box-shadow: 0 0 .25rem $fg-bright, 0 0 .5rem $fg, 0 0 1rem $fg-dark;
}
}
.footer-container {
bottom: 0px;
left: 0px;
position: fixed;
right: 0px;
}
footer {
@include aug;
@include inlay;
--aug-border-all: 2px !important;
--aug-border-bg: cyan !important; // vars don't work here
--aug-border-opacity: .5 !important;
--aug-inlay-bg: rgba(0, 0, 0, .75) !important;
--aug-tl: 10px;
--aug-tr: 10px;
height: 2.5em;
p {
color: $bg;
font-size: xx-small;
margin: .25rem;
padding-top: .65em;
text-align: center;
user-select: auto;
a {
color: $fg;
text-decoration: none;
}
}
}
/* *****************
* Modal styles
******************* */
.sr2-modal {
@include border;
@include aug;
color: $bg;
font-family: Electrolize !important;
pointer-events: auto;
button { @include button; }
.modal-header {
@include inlay;
@include border;
@ -399,7 +480,7 @@ footer {
border-bottom: none;
text-transform: uppercase;
button { width: 30px; }
button { width: 2.5rem; }
}
.modal-body {
@ -416,10 +497,16 @@ footer {
--aug-inlay-top: 0;
border-top: none;
button { width: 4rem; }
button {
width: 5rem;
margin: .3rem;
}
}
label { margin: 0; }
label {
margin: 0;
margin-left: calc(100% / 22 + 1rem);
}
.label-swap {
display: flex;
@ -431,97 +518,99 @@ footer {
}
.range-group { margin-top: 1rem; }
input {
background-color: transparent;
color: $fg;
margin: .3em;
user-select: text;
width: 98%; // 100% is inexplicably too long on the right hand side
&::selection {
background-color: $fg;
color: black;
}
&:focus {
background-color: transparent;
color: $fg;
&[type="number"]::-webkit-inner-spin-button,
&[type="number"]::-webkit-outer-spin-button {
appearance: none;
}
&:focus-visible {
background-color: transparent;
color: $fg;
}
&:focus:invalid { box-shadow: 0 0 .25rem $fg-bright, 0 0 .5rem $fg, 0 0 1rem $fg-dark !important; }
&:not([type=range]):valid {
background-image: none !important;
border: 1px solid $bg !important ;
}
&:invalid {
background-image: none !important;
border: 1px solid $fg;
box-shadow: 0 0 3px $fg-bright, 0 0 6px $fg, 0 0 12px $fg-dark;
}
&[type=number]::-webkit-inner-spin-button,
&[type=number]::-webkit-outer-spin-button {
-webkit-appearance: none;
margin: 0;
}
&[type=number] {
-moz-appearance: textfield;
appearance: textfield;
margin: 0;
}
&[type=range] {
// -webkit-appearance: none;
margin-left: calc(4.5% - 2px);
width: 91%;
&[type="range"] {
box-shadow: none !important;
margin-left: calc(100% / 22 - .15rem);
width: calc(100% / 11 * 10 + .3rem);
+ datalist {
display: block;
border-collapse: collapse;
display: table;
table-layout: fixed;
width: 100%;
option {
display: inline-block;
margin: 0;
display: table-cell;
text-align: center;
width: 9%;
}
}
}
}
&::-moz-range-track {
border: 1px;
border-radius: 1px;
height: 2px;
}
#combatant-modal-dice { margin-right: 0; }
&::-moz-range-thumb {
height: 20px;
width: 4px;
}
}
}
#combatant-modal-rea { margin-left: 0; }
.input-group-text {
background-color: transparent;
border: none;
color: $fg;
padding: .25rem;
}
hr {
border-top: 2px solid $bg;
opacity: .5;
}
}
#combatant-modal-stun {
&::-moz-range-track { background-color: $bg-dark; }
&::-moz-range-thumb { background-color: $bg; }
}
#combatant-modal-physical {
&::-moz-range-track { background-color: $fg-dark; }
&::-moz-range-thumb { background-color: $fg; }
/* *****************
* Footer styles
******************* */
.footer-container {
bottom: 0px;
left: 0px;
position: fixed;
right: 0px;
}
footer {
@include aug;
@include inlay;
--aug-border-all: .1rem !important;
--aug-border-bg: cyan !important; // vars don't work here
--aug-border-opacity: .5 !important;
--aug-inlay-bg: rgba(0, 0, 0, .75) !important;
--aug-tl: .7rem;
--aug-tr: .7rem;
p {
color: $bg;
font-size: x-small;
margin: .15em;
padding: .25rem;
text-align: center;
user-select: text;
-webkit-user-select: text;
a {
color: $fg;
text-decoration: none;
}
&::selection,
a::selection {
background-color: $fg;
color: black;
}
}
}

View File

@ -12,7 +12,7 @@
<link rel="manifest" href="/icons/sr2ini.webmanifest">
<link type="text/css" rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.css" >
<!-- <link type="text/css" rel="stylesheet" href="../node_modules/bootstrap/dist/css/bootstrap.css" > -->
<link type="text/css" rel="stylesheet" href="../node_modules/augmented-ui/augmented-ui.css">
<link type="text/css" rel="stylesheet" href="css/sr2ini.scss">
@ -47,11 +47,11 @@
<main class="table-responsive overflow-visible">
<table class="table table-sm table-borderless" id="combatants-table">
<thead>
<tr data-augmented-ui="tl-2-clip-y r-clip-y">
<th class="col th-name" data-augmented-ui="tl-2-clip-y both" title="Name">Name</th>
<th class="col-2 th-ini" data-augmented-ui="both" title="Initiative">Ini</th>
<th class="col-2 th-dice-and-rea" data-augmented-ui="both" title="Initiative Dice and Reaction">D+R</th>
<th class="col-3 th-actions" data-augmented-ui="r-clip-y both" title="Actions">Actions</th>
<tr data-augmented-ui="tl-clip-y tr-clip-y">
<th class="th-name" data-augmented-ui="tl-clip-y both" title="Name" scope="col">Name</th>
<th class="th-ini" data-augmented-ui="both" title="Initiative" scope="col">Ini</th>
<th class="th-dice-and-rea" data-augmented-ui="both" title="Initiative Dice and Reaction" scope="col">D+R</th>
<th class="th-actions" data-augmented-ui="tr-clip-y both" title="Actions" scope="col">Actions</th>
</tr>
</thead>
<tbody>
@ -62,10 +62,10 @@
<!-- confirm modal -->
<div class="modal fade" id="confirm-modal" tabindex="-2" role="dialog">
<div class="modal-dialog modal-sm" role="document">
<div class="modal-dialog modal-lg" role="document">
<div class="sr2-modal" data-augmented-ui="tl-2-clip-x tr-clip-y bl-clip-y br-2-clip-x b-scoop-x border">
<div class="modal-header" data-augmented-ui="inlay">
<h5 class="modal-title">Start New Round</h5>
<h2 class="modal-title">Start New Round</h2>
<button type="button" class="sr2-button" data-bs-dismiss="modal" aria-label="Close">&#10006;</button>
</div>
<div class="modal-body" data-augmented-ui="inlay">
@ -74,7 +74,7 @@
<div class="modal-footer" data-augmented-ui="inlay">
<button type="button" class="sr2-button" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="sr2-button" id="confirm-modal-new-round-ok-button" data-bs-dismiss="modal">OK</button>
<button type="submit" class="sr2-button d-none" id="confirm-modal-remove-combatant-ok-button" data-bs-dismiss="modal">OK</button>
<button type="submit" class="sr2-button display-none" id="confirm-modal-remove-combatant-ok-button" data-bs-dismiss="modal">OK</button>
</div>
</div>
</div>
@ -82,34 +82,33 @@
<!-- combatant modal (add & edit) -->
<div class="modal fade" id="combatant-modal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-sm" role="document">
<div class="modal-dialog modal-lg" role="document">
<div class="sr2-modal" data-augmented-ui="tl-2-clip-x tr-clip-y bl-clip-y br-2-clip-x b-scoop-x border">
<div class="modal-header" data-augmented-ui="inlay">
<h5 class="modal-title">Add New Combatant</h5>
<h2 class="modal-title">Add New Combatant</h2>
<button type="button" class="sr2-button" data-bs-dismiss="modal" aria-label="Close">&#10006;</button>
</div>
<div class="modal-body" data-augmented-ui="inlay">
<form id="combatant-form" name="combatant-modal-form" class="was-validated" onsubmit="return false;">
<div class="my-2">
<div>
<input type="text" maxlength="40" class="form-control form-control-sm" id="combatant-modal-name" form="combatant-form" placeholder="Name" required>
</div>
<div class="input-group input-group-sm my-2">
<div class="input-group input-group-sm">
<input type="number" min="1" max="5" class="form-control form-control-sm" id="combatant-modal-dice" form="combatant-form" placeholder="Dice">
<span class="input-group-text">D+</span>
<input type="number" min="0" max="30" class="form-control form-control-sm" id="combatant-modal-rea" form="combatant-form" placeholder="REA">
<span class="input-group-text">&nbsp;&nbsp;&nbsp;</span>
<input type="number" min="0" max="55" class="form-control form-control-sm" id="combatant-modal-ini" form="combatant-form" placeholder="Ini">
</div>
<div class="my-2">
<label for="combatant-modal-stun" class="form-label">Stun Damage <span id="combatant-modal-penalty-stun"></span></label>
<input type="range" class="form-range" min="0" max="10" value="0" id="combatant-modal-stun" list="damage">
<datalist id="damage">
<option>-</option><option>L</option><option>.</option><option>M</option><option>.</option><option>.</option><option>S</option><option>.</option><option>.</option><option>.</option><option>D</option>
<div class="range-group">
<label for="combatant-modal-stun" class="form-label">Stun damage <span id="combatant-modal-penalty-stun"></span></label>
<input type="range" class="form-range" min="0" max="10" value="0" id="combatant-modal-stun" list="damage-level">
<datalist id="damage-level">
<option>0</option><option>L</option><option>.</option><option>M</option><option>.</option><option>.</option><option>S</option><option>.</option><option>.</option><option>.</option><option>D</option>
</datalist>
<div class="label-swap">
<label for="combatant-modal-physical" class="form-label">Physical Damage <span id="combatant-modal-penalty-physical"></span></label>
<input type="range" class="form-range" min="0" max="10" value="0" id="combatant-modal-physical" list="damage">
<label for="combatant-modal-physical" class="form-label">Physical damage <span id="combatant-modal-penalty-physical"></span></label>
<input type="range" class="form-range" min="0" max="10" value="0" id="combatant-modal-physical" list="damage-level">
</div>
</div>
</form>
@ -118,14 +117,14 @@
<button type="button" class="sr2-button" id="combatant-modal-cancel-button" data-bs-dismiss="modal">Cancel</button>
<button type="submit" class="sr2-button" id="combatant-modal-add-apply-button">Apply</button>
<button type="submit" class="sr2-button" id="combatant-modal-add-ok-button" >OK</button>
<button type="submit" class="sr2-button d-none" id="combatant-modal-edit-ok-button" >OK</button>
<button type="submit" class="sr2-button display-none" id="combatant-modal-edit-ok-button" >OK</button>
</div>
</div>
</div>
</div>
<!-- SVG icon <symbol> definitions (for later <use>)-->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" class="d-none">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" class="display-none">
<defs>
<!-- add combatant -->
<symbol id="add" >
@ -192,8 +191,8 @@
</svg>
<!-- footer -->
<div class="footer-container">
<footer data-augmented-ui="tl-2-clip-x tr-2-clip-x both">
<div class="footer-container container">
<footer data-augmented-ui="tl-clip br-clip both">
<p>code & design by <a href="#" tabindex="-1" title="Eclipse">Eclipse</a> | background by <a href="https://www.deviantart.com/xxaries1970xx" tabindex="-1" title="xxAries1970xx on DeviantArt">xxAries1970xx</a></p>
</footer>
</div>

View File

@ -31,21 +31,21 @@ const DAMAGE_PENALTY = [0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4];
const DAMAGE_NIVEAU = ["", "L", "M", "S", "D"];
const COMBATANT_TABLE_ROW = [
'<tr class="combatant-row" data-true-ini="" data-augmented-ui="tl-scoop bl-clip-y tr-clip-y br-scoop">\n',
'<td class="combatant-name" title="Combatant\'s name" data-bs-toggle="modal" data-bs-target="#combatant-modal" data-augmented-ui="tl-scoop bl-clip-y both"></td>\n',
'<tr class="combatant-row" data-true-ini="">\n',
'<td class="combatant-name" title="Combatant\'s name" data-bs-toggle="modal" data-bs-target="#combatant-modal" data-augmented-ui="both"></td>\n',
'<td class="combatant-ini" title="Effective initiative (w/ wound penalties)" data-bs-toggle="modal" data-bs-target="#combatant-modal" data-augmented-ui="both"></td>\n',
'<td class="combatant-dice-and-rea" title="Iniative dice and reaction" data-bs-toggle="modal" data-bs-target="#combatant-modal" data-augmented-ui="both"><span class="combatant-dice"></span>D+<span class="combatant-rea"></span></td>\n',
'<td class="combatant-actions" data-augmented-ui="tr-clip-y br-scoop both">\n',
'<button type="button" class="sr2-button act-button" title="Act and reduce ini by 10"><svg viewbox="0 0 512 512" class="icon"><use href="#act" /></svg></button>\n',
'<td class="combatant-actions" data-augmented-ui="both">\n',
'<button type="button" class="sr2-button act-button" title="Act and reduce ini by 10"><svg viewbox="0 0 512 512"><use href="#act" /></svg></button>\n',
'<div class="damage-dropdown">\n',
'<button type="button" class="sr2-button damage-button" title="Take damage"><svg viewbox="0 0 512 512" class="icon"><use href="#take-damage" /></svg></button>\n',
'<button type="button" class="sr2-button damage-button" title="Take damage"><svg viewbox="0 0 512 512"><use href="#take-damage" /></svg></button>\n',
'</div>\n',
'<div class="actions-dropdown">\n',
'<button type="button" class="sr2-button actions-button" title="More actions"><svg viewbox="0 0 512 512" class="icon"><use href="#more-actions" /</svg></button>\n',
'<button type="button" class="sr2-button actions-button" title="More actions"><svg viewbox="0 0 512 512"><use href="#more-actions" /</svg></button>\n',
'<div class="actions-menu" data-augmented-ui="tl-scoop bl-clip-y tr-clip-y br-scoop both">\n',
'<button type="button" class="sr2-button edit-button" title="Edit combatant" data-bs-toggle="modal" data-bs-target="#combatant-modal" tabindex="-1"><svg viewbox="0 0 512 512" class="icon"><use href="#edit" /></svg></button>\n',
'<button type="button" class="sr2-button clone-button" title="Clone combatant" data-bs-toggle="modal" data-bs-target="#combatant-modal" tabindex="-1"><svg viewbox="0 0 512 512" class="icon"><use href="#clone" /></svg></button>\n',
'<button type="button" class="sr2-button remove-button" title="Remove combatant" data-bs-toggle="modal" data-bs-target="#confirm-modal" tabindex="-1"><svg viewbox="0 0 512 512" class="icon"><use href="#delete" /></svg></button>\n',
'<button type="button" class="sr2-button edit-button" title="Edit combatant" data-bs-toggle="modal" data-bs-target="#combatant-modal" tabindex="-1"><svg viewbox="0 0 512 512"><use href="#edit" /></svg></button>\n',
'<button type="button" class="sr2-button clone-button" title="Clone combatant" data-bs-toggle="modal" data-bs-target="#combatant-modal" tabindex="-1"><svg viewbox="0 0 512 512"><use href="#clone" /></svg></button>\n',
'<button type="button" class="sr2-button remove-button" title="Remove combatant" data-bs-toggle="modal" data-bs-target="#confirm-modal" tabindex="-1"><svg viewbox="0 0 512 512"><use href="#delete" /></svg></button>\n',
'</div>\n',
'</div>\n',
'</td>\n',
@ -67,8 +67,8 @@ const DAMAGE_MONITOR_HTML = [
'</table>\n',
'</div>'].join("");
const STUN_BADGE_HTML = '<sup><span class="badge bg-warning position-absolute translate-middle stun-badge" title="Stun damage niveau"></span></sup>';
const PHYSICAL_BADGE_HTML = '<sub><span class="badge bg-danger position-absolute translate-middle physical-badge" title="Physical damage niveau"></span></sub>';
const STUN_BADGE_HTML = '<sup><span class="badge bg-warning translate-middle stun-badge" title="Stun damage niveau"></span></sup>';
const PHYSICAL_BADGE_HTML = '<sub><span class="badge bg-danger translate-middle physical-badge" title="Physical damage niveau"></span></sub>';
/*
@ -148,8 +148,8 @@ function handleActButtonClick(event) {
function handleAddButtonClick(event) {
// restyle modal
$("#combatant-modal .modal-title").text("Add Combatant");
$("#combatant-modal-add-ok-button, #combatant-modal-add-apply-button").removeClass("d-none");
$("#combatant-modal-edit-ok-button").addClass("d-none");
$("#combatant-modal-add-ok-button, #combatant-modal-add-apply-button").removeClass("display-none");
$("#combatant-modal-edit-ok-button").addClass("display-none");
// set default values
$("#combatant-modal-name").val("Goon 1");
$("#combatant-modal-dice").val("2");
@ -173,8 +173,8 @@ function handleCloneButtonClick(event) {
$tr.find(".actions-menu").removeClass("seen");
// restyle modal
$("#combatant-modal .modal-title").text("Clone Combatant");
$("#combatant-modal-add-ok-button, #combatant-modal-add-apply-button").removeClass("d-none");
$("#combatant-modal-edit-ok-button").addClass("d-none");
$("#combatant-modal-add-ok-button, #combatant-modal-add-apply-button").removeClass("display-none");
$("#combatant-modal-edit-ok-button").addClass("display-none");
// populate modal with values from row
$("#combatant-modal-name").val($tr.find(".combatant-name").text());
$("#combatant-modal-dice").val($tr.find(".combatant-dice").attr("data-combatant-dice"));
@ -252,8 +252,8 @@ function handleEditButtonClick(event) {
let $tr = $(event.target).parents(".combatant-row");
// restyle modal
$("#combatant-modal .modal-title").text("Edit Combatant");
$("#combatant-modal-edit-ok-button").removeClass("d-none");
$("#combatant-modal-add-ok-button, #combatant-modal-add-apply-button").addClass("d-none");
$("#combatant-modal-edit-ok-button").removeClass("display-none");
$("#combatant-modal-add-ok-button, #combatant-modal-add-apply-button").addClass("display-none");
// populate modal with values from row
$("#combatant-modal-name").val($tr.find(".combatant-name").text());
$("#combatant-modal-dice").val($tr.find(".combatant-dice").attr("data-combatant-dice"));
@ -291,8 +291,8 @@ function handleMoreActionsButtonClick(event) {
function handleNewRoundButtonClick(event) {
// restyle modal
$("#confirm-modal .modal-title").text("Start new Round");
$("#confirm-modal-new-round-ok-button").removeClass("d-none");
$("#confirm-modal-remove-combatant-ok-button").addClass("d-none");
$("#confirm-modal-new-round-ok-button").removeClass("display-none");
$("#confirm-modal-remove-combatant-ok-button").addClass("display-none");
// add handler for enter key
$("#confirm-modal").off("keydown");
$("#confirm-modal").on("keydown", (e) => {
@ -307,8 +307,8 @@ function handleNewRoundButtonClick(event) {
function handleRemoveButtonClick(event) {
// restyle modal
$("#confirm-modal .modal-title").text("Remove Combatant");
$("#confirm-modal-remove-combatant-ok-button").removeClass("d-none");
$("#confirm-modal-new-round-ok-button").addClass("d-none");
$("#confirm-modal-remove-combatant-ok-button").removeClass("display-none");
$("#confirm-modal-new-round-ok-button").addClass("display-none");
// mark which row is being removed
$("#confirm-modal").data("row", $(".combatant-row").index($(event.target).parents(".combatant-row"))); // here it's okay to use .data() b/c HTML/CSS does not care about this value
// add handler for enter key
@ -555,5 +555,3 @@ $(document).ready(function () {
});
addTestCombatant();
});
//module.exports = { rollForInitiative, validateCombatant, whoGoesFirst, getEffectiveIni };