More things
This commit is contained in:
parent
8b6db3c9c3
commit
e347409e89
115
client/src/services/ContextMenu.js
Normal file
115
client/src/services/ContextMenu.js
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
// You should hide the context menu when the element that has the
|
||||||
|
// event gets removed
|
||||||
|
|
||||||
|
let margin = -3;
|
||||||
|
|
||||||
|
let cursorX = 0;
|
||||||
|
let cursorY = 0;
|
||||||
|
|
||||||
|
let arrowIcon = "icons/iconoir/regular/nav-arrow-right.svg";
|
||||||
|
|
||||||
|
function ShowContextMenu(){
|
||||||
|
let contextMenu = document.getElementById('context-menu');
|
||||||
|
contextMenu.style.display = "flex";
|
||||||
|
contextMenu.style.top = (cursorY + margin) + "px";
|
||||||
|
contextMenu.style.left = (cursorX + margin) + "px";
|
||||||
|
}
|
||||||
|
|
||||||
|
function HideContextMenu(){
|
||||||
|
let contextMenu = document.getElementById('context-menu');
|
||||||
|
contextMenu.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
function PopulateContext(val){
|
||||||
|
let children = [];
|
||||||
|
val.forEach(element => {
|
||||||
|
let contextMenuElement = document.createElement('div');
|
||||||
|
contextMenuElement.classList.add("context-menu-element");
|
||||||
|
if(element.action)
|
||||||
|
contextMenuElement.addEventListener("click", element.action);
|
||||||
|
|
||||||
|
let spanInfo = document.createElement('span');
|
||||||
|
spanInfo.innerText = element.name;
|
||||||
|
contextMenuElement.appendChild(spanInfo);
|
||||||
|
|
||||||
|
if(element.context){
|
||||||
|
let iconContextElement = document.createElement('img');
|
||||||
|
iconContextElement.src = arrowIcon;
|
||||||
|
contextMenuElement.appendChild(iconContextElement);
|
||||||
|
|
||||||
|
let childContextMenuElement = document.createElement('div');
|
||||||
|
childContextMenuElement.classList.add("context-menu");
|
||||||
|
childContextMenuElement.style.left = "100%";
|
||||||
|
childContextMenuElement.style.top = "0";
|
||||||
|
childContextMenuElement.style.display = "none";
|
||||||
|
|
||||||
|
let childChildren = PopulateContext(element.context);
|
||||||
|
childChildren.forEach((child) => childContextMenuElement.appendChild(child));
|
||||||
|
|
||||||
|
contextMenuElement.addEventListener("mouseenter", () => {
|
||||||
|
childContextMenuElement.style.display = "flex";
|
||||||
|
});
|
||||||
|
|
||||||
|
contextMenuElement.addEventListener("mouseleave", () => {
|
||||||
|
childContextMenuElement.style.display = "none";
|
||||||
|
})
|
||||||
|
|
||||||
|
contextMenuElement.appendChild(childContextMenuElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
children.push(contextMenuElement);
|
||||||
|
});
|
||||||
|
|
||||||
|
return children;
|
||||||
|
}
|
||||||
|
|
||||||
|
function PopulateContextMenu(val){
|
||||||
|
let contextMenu = document.getElementById('context-menu');
|
||||||
|
let children = PopulateContext(val);
|
||||||
|
|
||||||
|
contextMenu.replaceChildren();
|
||||||
|
children.forEach((el) => contextMenu.appendChild(el));
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddContextMenu(element, val){
|
||||||
|
element._dr_context = val;
|
||||||
|
element.addEventListener('contextmenu', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
PopulateContextMenu(val);
|
||||||
|
ShowContextMenu();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function UpdateVisibility(){
|
||||||
|
let contextMenu = document.getElementById('context-menu');
|
||||||
|
let element = document.elementFromPoint(cursorX, cursorY);
|
||||||
|
let mustHide = true;
|
||||||
|
while(element){
|
||||||
|
if(element == contextMenu){
|
||||||
|
mustHide = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
element = element.parentElement;
|
||||||
|
}
|
||||||
|
if(mustHide) HideContextMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
function SetupContextMenu(){
|
||||||
|
HideContextMenu();
|
||||||
|
|
||||||
|
document.addEventListener('mousemove', (e) => {
|
||||||
|
cursorX = e.clientX;
|
||||||
|
cursorY = e.clientY;
|
||||||
|
});
|
||||||
|
|
||||||
|
document.addEventListener('mousedown', UpdateVisibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
SetupContextMenu,
|
||||||
|
AddContextMenu,
|
||||||
|
ShowContextMenu,
|
||||||
|
HideContextMenu
|
||||||
|
};
|
@ -16,20 +16,19 @@ function HideTooltip(){
|
|||||||
tooltip.style.display = "none";
|
tooltip.style.display = "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
function AddTooltip(element, val){
|
function AddTooltip(element, val, data = {}){
|
||||||
element._dr_tooltip = val;
|
element._dr_tooltip = {value: val, ...data};
|
||||||
}
|
}
|
||||||
|
|
||||||
function UpdateVisibilityThread(){
|
function UpdateVisibilityThread(){
|
||||||
let hiding = true;
|
let tooltip = document.getElementById('mouse-tooltip');
|
||||||
document.elementsFromPoint(cursorX, cursorY).forEach(element => {
|
let element = document.elementFromPoint(cursorX, cursorY);
|
||||||
if(element._dr_tooltip){
|
if(element._dr_tooltip){
|
||||||
hiding = false;
|
ShowTooltip();
|
||||||
content.value = element._dr_tooltip;
|
content.value = element._dr_tooltip.value;
|
||||||
}
|
if(element._dr_tooltip.max_width) tooltip.style.maxWidth = element._dr_tooltip.max_width + "px";
|
||||||
});
|
else tooltip.style.maxWidth = "none";
|
||||||
if(hiding) HideTooltip();
|
} else HideTooltip();
|
||||||
else ShowTooltip();
|
|
||||||
|
|
||||||
setTimeout(UpdateVisibilityThread, 0);
|
setTimeout(UpdateVisibilityThread, 0);
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ import Toast from './partials/Toast.vue';
|
|||||||
import { DisplayToast, SetEmitter } from '../services/Dragonroll';
|
import { DisplayToast, SetEmitter } from '../services/Dragonroll';
|
||||||
import GameManager from './managers/GameManager.vue';
|
import GameManager from './managers/GameManager.vue';
|
||||||
import TooltipManager from './managers/TooltipManager.vue';
|
import TooltipManager from './managers/TooltipManager.vue';
|
||||||
|
import ContextMenuManager from './managers/ContextMenuManager.vue';
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@ -18,6 +19,7 @@ import TooltipManager from './managers/TooltipManager.vue';
|
|||||||
<Toast></Toast>
|
<Toast></Toast>
|
||||||
<GameManager></GameManager>
|
<GameManager></GameManager>
|
||||||
<TooltipManager></TooltipManager>
|
<TooltipManager></TooltipManager>
|
||||||
|
<ContextMenuManager></ContextMenuManager>
|
||||||
<WindowManager></WindowManager>
|
<WindowManager></WindowManager>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
70
client/src/views/managers/ContextMenuManager.vue
Normal file
70
client/src/views/managers/ContextMenuManager.vue
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
<script setup>
|
||||||
|
import { onMounted, watch, ref } from 'vue';
|
||||||
|
import { SetupContextMenu } from '../../services/ContextMenu';
|
||||||
|
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
SetupContextMenu();
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div id="context-menu" class="context-menu">
|
||||||
|
<div class="context-menu-element">
|
||||||
|
<span>Hola</span> <img src="icons/iconoir/regular/nav-arrow-right.svg">
|
||||||
|
</div>
|
||||||
|
<div class="context-menu-element">
|
||||||
|
<span>Holaa</span>
|
||||||
|
</div>
|
||||||
|
<div class="context-menu-element">
|
||||||
|
<span>Holaa</span>
|
||||||
|
</div>
|
||||||
|
<div class="context-menu-element">
|
||||||
|
<span>Holaaaaaaa</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.context-menu {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 214748363;
|
||||||
|
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
background-color: var(--tooltip-background);
|
||||||
|
|
||||||
|
-webkit-box-shadow: 0px 0px 5px -2px rgba(0,0,0,0.75);
|
||||||
|
-moz-box-shadow: 0px 0px 5px -2px rgba(0,0,0,0.75);
|
||||||
|
box-shadow: 0px 0px 5px -2px rgba(0,0,0,0.75);
|
||||||
|
|
||||||
|
border: solid 1px var(--color-border);
|
||||||
|
|
||||||
|
.context-menu-element {
|
||||||
|
padding: 3px 5px 3px 5px;
|
||||||
|
cursor: default;
|
||||||
|
user-select: none;
|
||||||
|
transition: background-color 100ms;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
span {
|
||||||
|
flex-grow: 1;
|
||||||
|
padding-right: 20px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
filter: invert(1);
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background-color: var(--color-background-softest);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
@ -1,11 +1,18 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, watch } from 'vue';
|
import { onMounted, watch, ref } from 'vue';
|
||||||
import { GetBackgroundColor, SetupTilemap } from '../../services/Map';
|
import { GetBackgroundColor, SetupTilemap } from '../../services/Map';
|
||||||
|
import { AddContextMenu } from '../../services/ContextMenu';
|
||||||
|
|
||||||
const backgroundColor = GetBackgroundColor();
|
const backgroundColor = GetBackgroundColor();
|
||||||
|
|
||||||
|
const canvas = ref(null);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
SetupTilemap();
|
SetupTilemap();
|
||||||
|
|
||||||
|
AddContextMenu(canvas.value, [
|
||||||
|
{name: "Ping"}
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(backgroundColor, () => {
|
watch(backgroundColor, () => {
|
||||||
@ -16,7 +23,7 @@ watch(backgroundColor, () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<canvas class="tilemap" id="tilemap"></canvas>
|
<canvas class="tilemap" id="tilemap" ref="canvas"></canvas>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
@ -17,8 +17,10 @@ onMounted(() => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div id="mouse-tooltip" class="mouse-tooltip">
|
<div id="mouse-tooltip" class="mouse-tooltip">
|
||||||
|
<div class="document">
|
||||||
<span v-html="contentRef"></span>
|
<span v-html="contentRef"></span>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
@ -34,7 +34,7 @@ onMounted(() => {
|
|||||||
textInput.value.style.height = "1px";
|
textInput.value.style.height = "1px";
|
||||||
textInput.value.style.height = (textInput.value.scrollHeight)+"px";
|
textInput.value.style.height = (textInput.value.scrollHeight)+"px";
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(chat, () => {
|
watch(chat, () => {
|
||||||
@ -58,10 +58,10 @@ watch(chat, () => {
|
|||||||
<textarea ref="textInput" class="chat-input"></textarea>
|
<textarea ref="textInput" class="chat-input"></textarea>
|
||||||
<div class="chat-input-actions">
|
<div class="chat-input-actions">
|
||||||
<div class="chat-input-actions-left">
|
<div class="chat-input-actions-left">
|
||||||
<IconButton icon="icons/iconoir/regular/trash.svg"></IconButton>
|
<IconButton icon="icons/iconoir/regular/trash.svg" tooltip="Clear chat"></IconButton>
|
||||||
</div>
|
</div>
|
||||||
<div class="chat-input-actions-right">
|
<div class="chat-input-actions-right">
|
||||||
<IconButton icon="icons/iconoir/regular/send.svg"></IconButton>
|
<IconButton icon="icons/iconoir/regular/send.svg" tooltip="Send message"></IconButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,16 +1,28 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
const props = defineProps(['icon', 'action', 'size', 'toggled']);
|
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
import { AddTooltip } from '../../../services/Tooltip';
|
||||||
|
const props = defineProps(['icon', 'action', 'size', 'toggled', 'tooltip']);
|
||||||
let icon = props.icon;
|
let icon = props.icon;
|
||||||
let action = props.action;
|
let action = props.action;
|
||||||
|
|
||||||
let size = props.size;
|
let size = props.size;
|
||||||
let toggled = props.toggled;
|
let toggled = props.toggled;
|
||||||
|
let tooltip = props.tooltip;
|
||||||
|
|
||||||
|
const button = ref(null);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if(tooltip){
|
||||||
|
AddTooltip(button.value, tooltip);
|
||||||
|
}
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="icon-button sound-click" :class="size + ' ' + toggled" v-on:click.prevent="action">
|
<div class="icon-button sound-click" :class="size + ' ' + toggled" v-on:click.prevent="action" ref="button">
|
||||||
<img class="icon" draggable="false" :src="icon" :class="size">
|
<img class="icon" draggable="false" :src="icon" :class="size">
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -53,6 +65,7 @@ let toggled = props.toggled;
|
|||||||
.icon {
|
.icon {
|
||||||
height: 24px;
|
height: 24px;
|
||||||
width: 24px;
|
width: 24px;
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
&.big {
|
&.big {
|
||||||
height: 38px;
|
height: 38px;
|
||||||
|
@ -13,6 +13,7 @@ import Api from '@/services/Api.js'
|
|||||||
import useEmitter from '@/services/Emitter';
|
import useEmitter from '@/services/Emitter';
|
||||||
import { ClearWindow, CreateWindow, Windows } from '../../services/Windows';
|
import { ClearWindow, CreateWindow, Windows } from '../../services/Windows';
|
||||||
import { AddTooltip } from '../../services/Tooltip';
|
import { AddTooltip } from '../../services/Tooltip';
|
||||||
|
import { AddContextMenu } from '../../services/ContextMenu';
|
||||||
const emitter = useEmitter();
|
const emitter = useEmitter();
|
||||||
const handle = ref(null);
|
const handle = ref(null);
|
||||||
|
|
||||||
@ -30,28 +31,24 @@ onMounted(() => {
|
|||||||
SetSize(id, {width: 500, height: 540});
|
SetSize(id, {width: 500, height: 540});
|
||||||
ResetPosition(id, "center", emitter);
|
ResetPosition(id, "center", emitter);
|
||||||
|
|
||||||
AddTooltip(campaignButton.value, "<h2>Hey</h2>Hola test");
|
|
||||||
});
|
|
||||||
|
|
||||||
// ???
|
|
||||||
/*
|
/*
|
||||||
function OpenDatabase(){
|
AddTooltip(campaignButton.value, "<h2>Hey</h2>Hola test");
|
||||||
ClearWindow(id);
|
AddContextMenu(campaignButton.value, [
|
||||||
CreateWindow({
|
{name: "Test", action: () => {alert("Test")}},
|
||||||
type: 'db_window',
|
{name: "A", action: () => {alert("A")}},
|
||||||
id: 'db_window',
|
{name: "B", action: () => {alert("B")}},
|
||||||
title: "Database",
|
{name: "Patata", action: () => {alert("Patata")}, context: [
|
||||||
back: () => {
|
{name: "Test 2dsadsadsdsadasdasdsad", action: () => {alert("Test context")}},
|
||||||
ClearWindow('db_window');
|
{name: "A 3", action: () => {alert("A context")}, context: [
|
||||||
CreateWindow({
|
{name: "Test", action: () => {alert("Test")}},
|
||||||
type: 'main_menu',
|
{name: "A", action: () => {alert("A")}},
|
||||||
id: 'main_menu',
|
{name: "B", action: () => {alert("B")}},
|
||||||
title: 'Dragonroll'
|
]},
|
||||||
})
|
{name: "B 5", action: () => {alert("B context")}},
|
||||||
}
|
]},
|
||||||
});
|
])
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
});
|
||||||
|
|
||||||
function OpenCampaigns(){
|
function OpenCampaigns(){
|
||||||
ClearWindow(id);
|
ClearWindow(id);
|
||||||
|
@ -12,6 +12,7 @@ import { AddSound } from '../../../services/Sound';
|
|||||||
import ChatComponent from '../../partials/ChatComponent.vue';
|
import ChatComponent from '../../partials/ChatComponent.vue';
|
||||||
import GameSystem from '@/views/partials/GameSystem.vue'
|
import GameSystem from '@/views/partials/GameSystem.vue'
|
||||||
import { GetModule } from '../../../services/Modules';
|
import { GetModule } from '../../../services/Modules';
|
||||||
|
import { AddTooltip } from '../../../services/Tooltip';
|
||||||
|
|
||||||
const handle = ref(null);
|
const handle = ref(null);
|
||||||
|
|
||||||
@ -21,6 +22,7 @@ const data = props.data;
|
|||||||
const hide_start = ref(false);
|
const hide_start = ref(false);
|
||||||
const hide_chat = ref(false);
|
const hide_chat = ref(false);
|
||||||
const campaign_title = ref(null);
|
const campaign_title = ref(null);
|
||||||
|
const copy_code_button = ref(null);
|
||||||
|
|
||||||
const container = ref(null);
|
const container = ref(null);
|
||||||
|
|
||||||
@ -41,6 +43,8 @@ onMounted(() => {
|
|||||||
AddSound(container.value)
|
AddSound(container.value)
|
||||||
|
|
||||||
campaign_title.value.style.backgroundColor = GetModule(data.campaign.system).color ? GetModule(data.campaign.system).color : "#1f1f1f";
|
campaign_title.value.style.backgroundColor = GetModule(data.campaign.system).color ? GetModule(data.campaign.system).color : "#1f1f1f";
|
||||||
|
|
||||||
|
AddTooltip(copy_code_button.value, "<p>Click this button to copy the invite code of your campaign to the clipboard</p>", {max_width: 300})
|
||||||
});
|
});
|
||||||
|
|
||||||
function CopyCode(){
|
function CopyCode(){
|
||||||
@ -74,7 +78,7 @@ function Exit(){
|
|||||||
<h2>Players</h2>
|
<h2>Players</h2>
|
||||||
<PlayerList :campaign="data.campaign"></PlayerList>
|
<PlayerList :campaign="data.campaign"></PlayerList>
|
||||||
<div class="buttons-row">
|
<div class="buttons-row">
|
||||||
<button class="btn-primary button-row sound-click" v-on:click.prevent="CopyCode">Copy invite code</button>
|
<button class="btn-primary button-row sound-click" v-on:click.prevent="CopyCode" ref="copy_code_button">Copy invite code</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="campaign-preview-column center">
|
<div class="campaign-preview-column center">
|
||||||
|
@ -38,6 +38,7 @@ function comp (s, m, n, f, a) {
|
|||||||
r += Math.floor( Math.random() * f ) + 1;
|
r += Math.floor( Math.random() * f ) + 1;
|
||||||
return r * m + a;
|
return r * m + a;
|
||||||
};
|
};
|
||||||
|
|
||||||
function parse( de ) {
|
function parse( de ) {
|
||||||
return comp.apply( this, de.match(/(?:(\d+)\s*\*\s*)?(\d*)d(\d+)(?:\s*([\+\-]\s*\d+))?/i) );
|
return comp.apply( this, de.match(/(?:(\d+)\s*\*\s*)?(\d*)d(\d+)(?:\s*([\+\-]\s*\d+))?/i) );
|
||||||
}
|
}
|
||||||
@ -82,17 +83,17 @@ onMounted(() => {
|
|||||||
<WindowHandle :window="id" ref="handle"></WindowHandle>
|
<WindowHandle :window="id" ref="handle"></WindowHandle>
|
||||||
|
|
||||||
<div class="horizontal-dice">
|
<div class="horizontal-dice">
|
||||||
<IconButton icon="icons/game-icons/000000/skoll/d4.svg" :action="ThrowD4" size="big"></IconButton>
|
<IconButton icon="icons/game-icons/000000/skoll/d4.svg" :action="ThrowD4" tooltip="Throw d4" size="big"></IconButton>
|
||||||
<IconButton icon="icons/game-icons/000000/delapouite/perspective-dice-six-svg.svg" :action="ThrowD6" size="big"></IconButton>
|
<IconButton icon="icons/game-icons/000000/delapouite/perspective-dice-six-svg.svg" :action="ThrowD6" tooltip="Throw d6" size="big"></IconButton>
|
||||||
<IconButton icon="icons/game-icons/000000/delapouite/dice-eight-faces-eight.svg" :action="ThrowD8" size="big"></IconButton>
|
<IconButton icon="icons/game-icons/000000/delapouite/dice-eight-faces-eight.svg" :action="ThrowD8" tooltip="Throw d8" size="big"></IconButton>
|
||||||
<IconButton icon="icons/game-icons/000000/skoll/d10.svg" :action="ThrowD10" size="big"></IconButton>
|
<IconButton icon="icons/game-icons/000000/skoll/d10.svg" :action="ThrowD10" tooltip="Throw d10" size="big"></IconButton>
|
||||||
<IconButton icon="icons/game-icons/000000/skoll/d12.svg" :action="ThrowD12" size="big"></IconButton>
|
<IconButton icon="icons/game-icons/000000/skoll/d12.svg" :action="ThrowD12" tooltip="Throw d12" size="big"></IconButton>
|
||||||
<IconButton icon="icons/game-icons/000000/delapouite/dice-twenty-faces-twenty.svg" :action="ThrowD20" size="big"></IconButton>
|
<IconButton icon="icons/game-icons/000000/delapouite/dice-twenty-faces-twenty.svg" :action="ThrowD20" tooltip="Throw d20" size="big"></IconButton>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="custom-dice">
|
<div class="custom-dice">
|
||||||
<input type="text" ref="diceField">
|
<input type="text" ref="diceField">
|
||||||
<IconButton icon="icons/game-icons/000000/delapouite/rolling-dices.svg" size="big" :action="ThrowCustomDice"></IconButton>
|
<IconButton icon="icons/game-icons/000000/delapouite/rolling-dices.svg" size="big" :action="ThrowCustomDice" tooltip="Throw"></IconButton>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="roll-result">{{ diceResult }}</div>
|
<div class="roll-result">{{ diceResult }}</div>
|
||||||
|
@ -158,7 +158,7 @@ function ConfigureBookmarks(){
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex-container">
|
<div class="flex-container overflow">
|
||||||
<div class="saving-throws">
|
<div class="saving-throws">
|
||||||
<span class="span-header">Saving Throws</span>
|
<span class="span-header">Saving Throws</span>
|
||||||
<div class="saving-throws-container">
|
<div class="saving-throws-container">
|
||||||
@ -289,20 +289,130 @@ function ConfigureBookmarks(){
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="skill-throws">
|
||||||
|
<span class="span-header">Skills</span>
|
||||||
|
<div class="skill-throws-container">
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Acrobatics (Dex)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Animal Handling (Wis)</span>
|
||||||
|
<span class="skill-throw-modifier">+5</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Arcana (Int)</span>
|
||||||
|
<span class="skill-throw-modifier">+2</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Athletics (Str)</span>
|
||||||
|
<span class="skill-throw-modifier">+3</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Deception (Cha)</span>
|
||||||
|
<span class="skill-throw-modifier">-1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">History (Int)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Insight (Wis)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Intimidation (Cha)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Investigation (Int)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Medicine (Wis)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Nature (Int)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Perception (Wis)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Performance (Cha)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Persuasion (Cha)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Religion (Int)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Sleight of Hand (Dex)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Stealth (Dex)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
<div class="skill-throw">
|
||||||
|
<input type="checkbox" name="str-saving">
|
||||||
|
<span class="skill-throw-class">Survival (Wis)</span>
|
||||||
|
<span class="skill-throw-modifier">+1</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sheet-content" v-show="selectedBookmark == 1">
|
<div class="sheet-content" v-show="selectedBookmark == 1">
|
||||||
Actions
|
<!-- Inventory -->
|
||||||
|
<div class="fixed-container">
|
||||||
|
<div class="weight-container"></div>
|
||||||
|
<div class="money-container"></div>
|
||||||
|
<div class="filter-container"></div>
|
||||||
|
<div class="inventory-container"></div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sheet-content" v-show="selectedBookmark == 2">
|
<div class="sheet-content" v-show="selectedBookmark == 2">
|
||||||
Inventory
|
<div class="classes-container"></div>
|
||||||
|
<div class="features-container"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sheet-content" v-show="selectedBookmark == 3">
|
<div class="sheet-content" v-show="selectedBookmark == 3">
|
||||||
Traits
|
<!-- spells -->
|
||||||
|
<div class="spellcasting-container"></div>
|
||||||
|
<div class="spells-container"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="sheet-content" v-show="selectedBookmark == 4">
|
<div class="sheet-content" v-show="selectedBookmark == 4">
|
||||||
Bio
|
<div class="effects-container"></div>
|
||||||
|
<div class="conditions-container"></div>
|
||||||
|
</div>
|
||||||
|
<div class="sheet-content" v-show="selectedBookmark == 5">
|
||||||
|
<div class="properties-container"></div>
|
||||||
|
<div class="bio-traits-container"></div>
|
||||||
|
<div class="bio-container"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -571,8 +681,7 @@ div.player-info-div {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.two-column-layout {
|
.two-column-layout {
|
||||||
display: grid;
|
display: flex;
|
||||||
grid-template-columns: 1fr 1fr;
|
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
margin-top: 50px;
|
margin-top: 50px;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
@ -582,6 +691,11 @@ div.player-info-div {
|
|||||||
&.border {
|
&.border {
|
||||||
border: 1px solid var(--color-border);
|
border: 1px solid var(--color-border);
|
||||||
background-color: #1b1b1b;
|
background-color: #1b1b1b;
|
||||||
|
/* Change */
|
||||||
|
position: sticky;
|
||||||
|
align-self: flex-start;
|
||||||
|
top: 50px;
|
||||||
|
margin-top: 0px;
|
||||||
}
|
}
|
||||||
margin: auto;
|
margin: auto;
|
||||||
width: 300px;
|
width: 300px;
|
||||||
|
Loading…
Reference in New Issue
Block a user