[Feature] Manual Character Editing (#490)

* Initial

* Added Character-Settings

* Finalized Character-Settings

* Hide CharacterSetup if any part is done manually

* Fixed class/subclass drag-drop

* Fixed relinking of Features from items created on Character

* Adding features on CharacterItems now adds them on the Character and relinks

* Made suggested items inactive in the Class sheet if rendered from inside a Character

* Added hope to CharacterSetting

* add style to textarea element, add spellcasting and domain class into char sheet and move rest buttons to another place

* Fixed characterCreation experience description

---------

Co-authored-by: moliloo <dev.murilobrito@gmail.com>
This commit is contained in:
WBHarry 2025-08-01 17:16:35 +02:00 committed by GitHub
parent 263dfa69ae
commit e1d8f8784a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
49 changed files with 1205 additions and 386 deletions

View file

@ -263,24 +263,36 @@
gap: 8px;
.experience-container {
position: relative;
display: flex;
align-items: center;
flex-direction: column;
gap: 5px;
.experience-description {
border-color: light-dark(@dark-blue, @golden);
padding-right: 24px;
}
.experience-value {
position: absolute;
right: 0;
width: 22px;
border-left: 1px solid light-dark(@dark-blue, @golden);
height: 100%;
.experience-inner-container {
position: relative;
display: flex;
align-items: center;
justify-content: center;
.experience-description {
border-color: light-dark(@dark-blue, @golden);
padding-right: 24px;
}
.experience-value {
position: absolute;
right: 0;
width: 22px;
border-left: 1px solid light-dark(@dark-blue, @golden);
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
textarea {
width: 100%;
resize: none;
border-color: light-dark(@dark-blue, @golden);
}
}
}

View file

@ -24,3 +24,5 @@
@import './dice-roll/roll-selection.less';
@import './damage-reduction/damage-reduction-container.less';
@import './damage-reduction/sheets.less';
@import './multiclass-choice/sheet.less';

View file

@ -104,4 +104,10 @@
}
}
}
.levelup-footer {
display: flex;
gap: 8px;
margin-top: 8px;
}
}

View file

@ -0,0 +1,76 @@
.theme-light .daggerheart.dh-style.dialog.multiclass-choice {
.multiclass-container .domain-choice-container button label {
background-image: url(../assets/parchments/dh-parchment-light.png);
}
}
.daggerheart.dh-style.dialog.multiclass-choice {
.multiclass-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
.multiclass-explanation {
margin-top: 0;
font-style: italic;
}
.multiclass-domains-container {
display: flex;
gap: 16px;
.domain-choice-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
button {
position: relative;
display: flex;
justify-content: center;
width: 120px;
height: 120px;
background: light-dark(@dark-blue-10, @golden-10);
color: light-dark(@dark-blue, @golden);
&.selected {
background: light-dark(@dark-blue-40, @golden-40);
}
label {
position: absolute;
top: 4px;
font-family: @font-body;
border-radius: 6px;
border: 2px solid;
padding: 0 2px;
background-image: url(../assets/parchments/dh-parchment-dark.png);
color: light-dark(@dark, @beige);
}
}
.domain-description {
width: 240px;
display: flex;
flex-wrap: wrap;
font-style: italic;
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
padding: 4px 4px;
}
}
}
footer {
width: 100%;
display: flex;
gap: 8px;
button {
flex: 1;
}
}
}
}

View file

@ -5,22 +5,26 @@
border: 1px solid light-dark(@dark-blue, @golden);
input[type='text'],
input[type='number'] {
input[type='number'],
textarea {
background: light-dark(transparent, transparent);
border-radius: 6px;
box-shadow: 0 4px 30px @soft-shadow;
backdrop-filter: blur(9.5px);
-webkit-backdrop-filter: blur(9.5px);
outline: none;
outline: 2px solid transparent;
color: light-dark(@dark-blue, @golden);
border: 1px solid light-dark(@dark, @beige);
transition: all 0.3s ease;
&::placeholder {
color: light-dark(@dark-40, @beige-50);
}
&:hover,
&:hover[type='text'],
&:hover[type='number'],
&:focus,
&:focus[type='text'],
&:focus[type='number'] {
background: light-dark(@soft-shadow, @semi-transparent-dark-blue);
@ -70,6 +74,13 @@
}
}
textarea {
color: light-dark(@dark, @beige);
font-family: @font-body;
scrollbar-width: thin;
scrollbar-color: light-dark(@dark-blue, @golden) transparent;
}
button {
background: light-dark(transparent, @golden);
border: 1px solid light-dark(@dark-blue, @dark-blue);
@ -206,6 +217,10 @@
}
}
&.inactive {
opacity: 0.5;
}
&.fit-height {
height: 95%;
}

View file

@ -12,18 +12,33 @@
.experience-list {
display: flex;
flex-direction: column;
gap: 10px;
gap: 15px;
}
.experience-item {
.experience-item {
display: flex;
flex-direction: column;
gap: 5px;
.experience-inner-item {
display: grid;
grid-template-columns: 3fr 1fr 30px;
align-items: center;
gap: 5px;
&.no-controls {
grid-template-columns: 3fr 1fr;
}
a {
text-align: center;
}
}
textarea {
width: 100%;
resize: none;
}
}
}
}

View file

@ -0,0 +1,36 @@
.application.daggerheart.dh-style.dialog {
.tab.details {
.traits-inner-container {
width: 100%;
display: flex;
align-items: center;
justify-content: space-evenly;
gap: 8px;
.trait-container {
width: 60px;
height: 60px;
background: url(../assets/svg/trait-shield.svg) no-repeat;
display: flex;
flex-direction: column;
align-items: center;
div {
filter: drop-shadow(0 0 3px black);
text-shadow: 0 0 3px black;
font-family: @font-body;
font-size: 12px;
}
input {
text-align: center;
width: 32px;
height: 24px;
position: relative;
top: 2px;
padding: 0;
}
}
}
}
}

View file

@ -2,6 +2,7 @@
@import './adversary-settings/sheet.less';
@import './adversary-settings/experiences.less';
@import './adversary-settings/features.less';
@import './character-settings/sheet.less';
@import './environment-settings/features.less';
@import './environment-settings/adversaries.less';

View file

@ -4,12 +4,24 @@
// Theme header backgrounds
.appTheme({
.character-header-sheet .trait {
background: url(../assets/svg/trait-shield.svg) no-repeat;
.character-header-sheet {
.trait {
background: url(../assets/svg/trait-shield.svg) no-repeat;
}
.character-row .domains-section img {
filter: invert(88%) sepia(98%) saturate(1784%) hue-rotate(311deg) brightness(104%) contrast(91%);
}
}
}, {
.character-header-sheet .trait {
.character-header-sheet {
.trait {
background: url('../assets/svg/trait-shield-light.svg') no-repeat;
}
.character-row .domains-section img {
filter: invert(87%) sepia(15%) saturate(343%) hue-rotate(333deg) brightness(110%) contrast(87%);
}
}
});
@ -88,6 +100,11 @@
font-size: 12px;
color: light-dark(@dark-blue, @golden);
.missing-header-feature {
opacity: 0.5;
text-decoration: line-through;
}
span {
padding: 3px;
border-radius: 3px;
@ -107,14 +124,27 @@
.character-row {
display: flex;
gap: 20px;
align-items: center;
justify-content: space-between;
padding: 0;
margin-bottom: 15px;
.hope-section {
margin-right: 20px;
}
.downtime-section {
display: flex;
align-items: center;
gap: 2px;
margin-left: auto;
button {
flex: 1;
}
}
.hope-section,
.threshold-section {
.domains-section {
position: relative;
display: flex;
gap: 10px;
@ -132,21 +162,24 @@
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
&.threshold-value {
color: light-dark(@dark, @beige);
}
}
.threshold-legend {
position: absolute;
bottom: -21px;
color: light-dark(@golden, @dark-blue);
background-color: light-dark(@dark-blue, @golden);
padding: 3px;
justify-self: anchor-center;
border-radius: 0 0 3px 3px;
text-transform: capitalize;
.domain {
display: flex;
align-items: center;
gap: 5px;
.label {
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
}
img {
height: 20px;
width: 20px;
}
}
.hope-value {
@ -193,14 +226,5 @@
}
}
}
.character-downtime-container {
display: flex;
gap: 2px;
button {
flex: 1;
}
}
}
}

View file

@ -18,6 +18,7 @@
}
.character-header-sheet {
position: relative;
grid-row: 1;
grid-column: 2;
}

View file

@ -55,6 +55,62 @@
}
}
}
.icons-list {
position: absolute;
display: flex;
flex-direction: column;
gap: 5px;
align-items: end;
justify-content: center;
top: 45px;
right: 10px;
.spellcast-icon {
display: flex;
align-items: center;
justify-content: end;
text-align: center;
padding-right: 8px;
max-width: 50px;
height: 50px;
font-size: 1.2rem;
background: light-dark(@dark-blue-60, @dark-golden-80);
backdrop-filter: blur(8px);
border: 4px double light-dark(@beige, @golden);
color: light-dark(@beige, @golden);
border-radius: 999px;
transition: all 0.3s ease;
.spellcast-label {
font-size: 14px;
opacity: 0;
margin-right: 0.3rem;
transition: all 0.3s ease;
}
i {
height: 24px;
width: 24px;
align-content: center;
margin-right: 3px;
}
&:not(.no-label):hover {
max-width: 300px;
padding: 0 10px;
border-radius: 60px;
.spellcast-label {
opacity: 1;
}
i {
margin-right: 0px;
}
}
}
}
}
.info-section {
@ -62,12 +118,13 @@
display: flex;
flex-direction: column;
top: -20px;
gap: 30px;
gap: 10px;
margin-bottom: -16px;
.resources-section {
display: flex;
justify-content: space-evenly;
margin-bottom: 20px;
.status-bar {
display: flex;
@ -345,6 +402,32 @@
}
}
}
.threshold-section {
position: relative;
display: flex;
align-self: center;
gap: 10px;
background-color: light-dark(transparent, @dark-blue);
color: light-dark(@dark-blue, @golden);
padding: 5px 10px;
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
align-items: center;
width: fit-content;
height: 30px;
h4 {
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
color: light-dark(@dark-blue, @golden);
&.threshold-value {
color: light-dark(@dark, @beige);
}
}
}
}
.items-sidebar-list {
@ -360,7 +443,7 @@
.shortcut-items-section {
overflow-y: hidden;
max-height: 56%;
padding-top: 16px;
padding-top: 10px;
padding-bottom: 20px;
mask-image: linear-gradient(0deg, transparent 0%, black 5%, black 95%, transparent 100%);
@ -393,35 +476,24 @@
.experience-row {
display: flex;
gap: 5px;
width: 250px;
align-items: center;
justify-content: space-between;
input[type='text'] {
height: 32px;
width: 180px;
border: 1px solid transparent;
outline: 2px solid transparent;
.experience-value {
height: 25px;
width: 35px;
font-size: 14px;
font-family: @font-body;
transition: all 0.3s ease;
color: light-dark(@dark, @beige);
&:hover {
outline: 2px solid light-dark(@dark, @beige);
}
align-content: center;
text-align: center;
margin-right: 5px;
}
}
.experience-value {
height: 25px;
width: 35px;
font-size: 14px;
font-family: @font-body;
color: light-dark(@dark, @beige);
align-content: center;
text-align: center;
.controls {
margin-left: auto;
}
}
}
}