Main/resources/[tools]/kq_outfitbag2/html/index.html
2025-06-07 08:51:21 +02:00

524 lines
14 KiB
HTML

<head>
<script src="js/jquery.js"></script>
</head>
<body>
<div id="preview-label" class="preview">
<h2 id="locale-preview">PREVIEW</h2>
</div>
<div class="outfit-bag">
<span id="amount" class="amount"></span>
<div class="main-container">
<div id="outfits" class="bag-container">
</div>
<div class="bag-buttons">
<div id="save-outfit" class="btn">
<span id="locale-save-outfit">SAVE CURRENT OUTFIT</span>
</div>
</div>
<div id="public-toggle" class="public-toggle">
<div id="make-public" class="public-toggle-icon">
<img src="img/lock.png">
</div>
<div id="make-private" class="public-toggle-icon">
<img src="img/unlock.png">
</div>
</div>
</div>
</div>
</body>
<script>
$(document).ready(function () {
let amount = 0;
let maxAmount = 10;
let owned = true;
let isPublic = false;
let allowSharing = false;
let currentModel = 0;
$('body').hide();
window.addEventListener('message', ({data}) => {
if (data.event === 'show') {
owned = data.owned;
if (data.state) {
currentModel = data.currentModel;
setOutfits(data.outfits);
refreshAmount();
updatePublicState(data.isPublic);
if (owned && allowSharing) {
$('#public-toggle').show();
} else {
$('#public-toggle').hide();
}
$('body').fadeIn(150);
} else {
$('body').fadeOut(150);
}
}
if (data.event === 'set') {
setOutfits(data.outfits);
}
if (data.event === 'update-public') {
updatePublicState(data.isPublic);
}
if (data.event === 'config') {
maxAmount = data.maxAmount;
allowSharing = data.allowSharing;
defineHoverColors(data.colors);
setLocale(data.locale);
if (!data.previewEnabled) {
$('#preview-label').hide();
}
}
if (data.event === 'clear') {
$('#outfits').html('');
amount = 0;
refreshAmount();
}
});
function setLocale(localeData) {
$('#locale-save-outfit').html(localeData.save);
$('#locale-preview').html(localeData.preview);
}
function updatePublicState(newState) {
isPublic = newState;
$('.public-toggle-icon').hide();
if (isPublic) {
$('#make-private').show();
} else {
$('#make-public').show();
}
}
function defineHoverColors(colors) {
const primary = colors.primary;
const secondary = colors.secondary;
const colorString = 'rgb(' + primary.r + ', ' + primary.g + ', ' + primary.b + ')';
const colorStringAlt = 'rgb(' + secondary.r + ', ' + secondary.g + ', ' + secondary.b + ')';
$(document).on('mouseover', '.btn', (function() {
$(this).find('span').css('text-shadow', colorStringAlt + ' 0 0 30px, ' + colorString + ' 0 0 20px, ' + colorStringAlt + ' 40px 0 30px, ' + colorString + ' -40px 0 50px');
}));
$(document).on('mouseout', '.btn', (function() {
$(this).find('span').css('text-shadow', 'none');
}));
}
function setOutfits(outfits) {
$('#outfits').html('');
amount = 0;
if (outfits && outfits.length) {
outfits.forEach((outfit) => {
appendOutfit(outfit);
})
}
}
function appendOutfit(data) {
amount++;
let extraOptions = '';
if (owned) {
extraOptions = `
<div class="options">
<div class="option delete-btn"></div>
</div>
`;
}
const html = `
<div class="outfit ` + (currentModel !== data.model ? 'disabled' : '') + `" outfitId="` + data.id + `">
<div class="btn open-outfit">
<span>` + data.name + `</span>
</div>
<div class="inner">
<div class="options">
<div class="option apply style-full" option="full"></div>
<div class="option apply style-bottom" option="bottom"></div>
<div class="option apply style-torso" option="top"></div>
<div class="option apply style-head" option="head"></div>
</div>
` + extraOptions + `
</div>
</div>`;
$('#outfits').append(html);
refreshAmount();
}
function refreshAmount() {
if (owned) {
$('#amount').html(amount + '/' + maxAmount);
} else {
$('#amount').html('');
}
if (amount < maxAmount && owned) {
$('#save-outfit').show();
$('.bag-container').css('height', '53vh');
} else {
$('#save-outfit').hide();
$('.bag-container').css('height', '63vh');
}
}
$(document).on('click', '.open-outfit', function () {
const $parent = $(this).parent();
const id = $parent.attr('outfitId');
if ($parent.hasClass('disabled')) {
console.log('disabled');
fetch(`https://${GetParentResourceName()}/PreviewOutfit`, {
method: 'POST',
body: JSON.stringify({
id,
})
});
return;
}
playUnfold();
$('.outfit').each(function () {
if (!$(this).is($parent)) {
$(this).removeClass('open');
}
});
if ($parent.hasClass('open')) {
$parent.removeClass('open');
} else {
$parent.addClass('open');
fetch(`https://${GetParentResourceName()}/PreviewOutfit`, {
method: 'POST',
body: JSON.stringify({
id,
})
});
}
});
$(document).on('click', '.apply', function () {
playClick();
const id = $(this).closest('.outfit').attr('outfitId');
fetch(`https://${GetParentResourceName()}/ApplyOutfit`, {
method: 'POST',
body: JSON.stringify({
id,
type: $(this).attr('option'),
})
});
});
$(document).on('click', '#save-outfit', function () {
playClick();
fetch(`https://${GetParentResourceName()}/SaveOutfit`, {
method: 'POST',
});
});
$(document).on('click', '.delete-btn', function () {
playClick();
const $outfit = $(this).closest('.outfit');
const id = $outfit.attr('outfitId');
$outfit.css('opacity', '1%');
fetch(`https://${GetParentResourceName()}/DeleteOutfit`, {
method: 'POST',
body: JSON.stringify({
id
})
})
})
$(document).on('click', '#public-toggle', function () {
playClick();
fetch(`https://${GetParentResourceName()}/TogglePublicState`, {
method: 'POST',
body: JSON.stringify({
newState: !isPublic,
})
})
})
document.addEventListener('keyup', logKey);
function logKey(e) {
if (e.key === 'Escape' || e.key === 'Backspace' || e.key === 'e' || e.key === ' ') {
fetch(`https://${GetParentResourceName()}/CloseBag`, {
method: 'POST',
})
}
}
fetch(`https://${GetParentResourceName()}/UILoaded`, {
method: 'POST',
});
const clickSound = new Audio('sounds/click.mp3');
clickSound.volume = 0.5;
function playClick() {
clickSound.play();
}
const unfoldSound = new Audio('sounds/unfold.mp3');
unfoldSound.volume = 0.3;
function playUnfold() {
unfoldSound.play();
}
});
</script>
<style>
@font-face {
font-family: Barlow;
src: url('fonts/barlow.ttf') format('truetype');
}
body {
font-family: Barlow, sans-serif !important;
font-weight: bold;
user-select: none;
display: none;
}
.hidden {
display: none;
}
.preview {
position: absolute;
color: white;
font-size: 2rem;
top: 15vh;
left: 4.5vw;
width: 23vw;
text-align: center;
}
.outfit-bag {
background-image: url('img/outfitbag.png');
background-size: contain;
background-repeat: no-repeat;
background-position: 4vh;
width: 58vh;
height: 88vh;
right: 5vh;
top: 5vh;
position: absolute;
}
.outfit {
position: relative;
transition-duration: 0.25s;
}
.outfit.open .inner {
height: 4vh;
padding: 0.5vh;
}
.outfit .inner {
display: flex;
height: 0;
background-color: rgba(255, 255, 255, 0.3);
justify-content: space-between;
padding: 0;
transition-duration: 0.2s;
backdrop-filter: blur(4px);
overflow: hidden;
}
.outfit .inner .options {
display: flex;
gap: 1vh;
align-items: center;
}
.outfit.disabled {
opacity: 40%;
}
.options .option {
width: 4vh;
height: 4vh;
}
.main-container {
padding: 15vh 11vh 2vh 17.5vh;
}
.bag-container {
display: flex;
flex-direction: column;
color: white;
gap: 4px;
overflow-y: auto;
overflow-x: hidden;
}
.bag-buttons {
margin-top: 1vh;
width: 100%;
}
.btn {
color: white;
height: 2.5vh;
background: rgb(193, 193, 193);
background: linear-gradient(90deg, rgba(119, 119, 119, 0.25) 0%, rgba(255, 255, 255, 0.25) 50%, rgba(119, 119, 119, 0.25) 100%);
padding: 1.5vh;
transition-duration: 0.2s;
cursor: pointer;
line-height: 2.5vh;
text-align: center;
font-size: 2.5vh;
backdrop-filter: blur(4px);
}
.btn span {
transition-duration: 0.2s;
text-transform: uppercase;
font-weight: lighter;
}
.public-toggle {
opacity: 60%;
position: absolute;
bottom: 15vh;
left: 14vh;
transition-duration: 0.2s;
cursor: pointer;
}
.public-toggle:hover {
opacity: 90%;
}
.public-toggle img {
width: 2.5vh;
height: 2.5vh;
}
.outfit.open .btn {
box-shadow: black 0 1px 2px;
}
.outfit .btn {
height: 1.5vh;
line-height: 1.5vh;
}
.delete-btn {
float: right;
color: white;
filter: saturate(0%) brightness(500%);
background-image: url('img/trash.png');
height: 2.5vh !important;
width: 2.5vh !important;
transition-duration: 0.2s;
}
.delete-btn:hover {
filter: saturate(100%);
}
.option.style-full {
background-image: url('img/full.png');
}
.option.style-torso {
background-image: url('img/torso.png');
}
.option.style-bottom {
background-image: url('img/bottom.png');
}
.option.style-head {
background-image: url('img/head.png');
}
.option {
cursor: pointer;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
transition-duration: 0.15s;
}
.option:hover {
transform: scale(1.1);
}
.btn:hover {
background-color: rgba(255, 255, 255, 0.3);
}
.btn:active {
background-color: rgba(255, 255, 255, 0.5);
}
.amount {
color: #606060;
position: absolute;
right: 24vh;
top: 13vh;
font-size: 1.4vh;
z-index: 1000;
}
.model-span {
position: absolute;
left: 2vh;
top: 1.4vh;
color: #606060;
line-height: 2.5vh;
font-size: 1.25vh;
pointer-events: none;
}
/* width */
::-webkit-scrollbar {
width: 0;
}
/* Track */
::-webkit-scrollbar-track {
display: none;
}
/* Handle */
::-webkit-scrollbar-thumb {
display: none;
}
</style>