Compare commits

..

124 Commits

Author SHA1 Message Date
Stefan Zermatten
4c617332f2 Bumped version 2022-12-05 11:17:47 +02:00
Stefan Zermatten
03b623d898 Merge branch 'develop' 2022-12-05 11:17:13 +02:00
Stefan Zermatten
a0744e5af3 Improved printing on some browsers 2022-12-05 11:14:22 +02:00
Stefan Zermatten
b92d2ecf05 fixes #307 Github link on new home page dead 2022-12-05 10:27:51 +02:00
Stefan Zermatten
aabcdac242 Re-added column layout hacks to stop chrome crashing 2022-12-05 10:18:05 +02:00
Stefan Zermatten
9fbeb0c06f Fixed type in character delete dialog 2022-12-05 10:07:32 +02:00
Stefan Zermatten
c058f3eab4 Stopped spell list cards animating on prepare 2022-12-03 12:17:20 +02:00
Stefan Zermatten
0a2d4cf97b Fixed hiding rest btn w/out events breaks statsTab 2022-12-03 12:16:26 +02:00
Stefan Zermatten
7151e1bb4e Merge remote-tracking branch 'origin/master' into version-2 2022-12-02 14:50:53 +02:00
Stefan Zermatten
b088a2d433 Bumped version 2022-12-02 09:44:44 +02:00
Stefan Zermatten
8aa5ee81d5 Merge branch 'version-2-dev' into version-2 2022-12-02 09:43:10 +02:00
Stefan Zermatten
ef26153bb2 Improved [redacted], added routes and navigation 2022-12-01 13:28:33 +02:00
Stefan Zermatten
77597e8056 Updated static pages, home, about, sign-in 2022-11-30 15:37:28 +02:00
Stefan Zermatten
ee1b876259 Bumped version 2022-11-29 14:53:23 +02:00
Stefan Zermatten
12fbca5c78 Merge branch 'version-2-dev' into version-2 2022-11-29 14:53:01 +02:00
Stefan Zermatten
da6fb55ca0 Fixed automated tab navs. going to the wrong tab 2022-11-29 14:52:22 +02:00
Stefan Zermatten
8551e318c2 Demoted features tab back in tab order 2022-11-29 14:35:27 +02:00
Stefan Zermatten
f175cffab8 Bumped version 2022-11-29 14:27:53 +02:00
Stefan Zermatten
2bca582af6 Merge branch 'version-2-dev' into version-2 2022-11-29 14:26:59 +02:00
Stefan Zermatten
5815c7ca34 Padded character list to reveal add folder button
It was hiding behind FAB
2022-11-29 14:10:28 +02:00
Stefan Zermatten
c237162475 Fixed sidebar party closing on route change 2022-11-29 14:05:24 +02:00
Stefan Zermatten
e87772c2a3 Fixed folder groupStats behaviour when !groupStats 2022-11-29 12:06:27 +02:00
Stefan Zermatten
704314a7eb Udpated npm packages 2022-11-29 11:48:28 +02:00
Stefan Zermatten
7ffd0bf61d Fixed menus in dialogs in firefox
Also improved look of scrollbars incl. dark mode
2022-11-29 11:48:20 +02:00
Stefan Zermatten
69b3ba781d Disabled tabletop routing for now 2022-11-28 23:41:10 +02:00
Stefan Zermatten
bf8eb52a96 bumped number of writers limit from 20 to 32 2022-11-28 16:54:21 +02:00
Stefan Zermatten
684d672028 Removed column layout hacks
Fixes drag fallbacks not being in front of cards
Might fix flashy shit on ios
2022-11-28 15:40:47 +02:00
Stefan Zermatten
fb98544ae1 Fixed drag and drop on Firefox 2022-11-28 15:39:47 +02:00
Stefan Zermatten
ec8b9c209c fixed rests on actions with undefined usesUsed 2022-11-28 14:50:41 +02:00
Stefan Zermatten
bee90a7a80 Fixed rests on attributes with undefined damage 2022-11-28 14:49:38 +02:00
Stefan Zermatten
04c9c4cfc2 Fixed bug where updates on sliders weren't debounced 2022-11-19 22:39:35 +02:00
Stefan Zermatten
cc915410da Fixed query hitting mongo with too much regex 2022-10-25 19:00:02 +02:00
Stefan Zermatten
a5b4b20324 Added link to V2 2022-10-11 14:08:33 +02:00
Stefan Zermatten
c48cc20fb9 Added limits to character strings, migration to remove image data urls from character pictures 2021-08-10 10:44:24 +02:00
Stefan Zermatten
c0b031f2b5 Updated packages 2021-07-17 14:41:51 +02:00
Stefan Zermatten
c6b633613c Removed all patreon based restrictions 2021-07-17 14:10:06 +02:00
Stefan Zermatten
03b7f1037e Patreon access is now granted by tier instead of price paid 2021-01-28 12:20:01 +02:00
Stefan Zermatten
d99c44fdeb Added disconnection notice and smart disconnect 2020-10-06 13:16:04 +02:00
Stefan Zermatten
1e8549323b Merge branch 'master' of https://github.com/ThaumRystra/DiceCloud 2020-10-06 09:57:50 +02:00
Stefan Zermatten
49a83b487a Drastically increased frequency of old document cleanup to prevent large spikes in oplog 2020-10-06 09:57:24 +02:00
Stefan Zermatten
a072d23097 Added bcrypt back 2020-09-28 11:13:03 +02:00
Stefan Zermatten
ffb78c59b3 Merge branch 'master' of https://github.com/ThaumRystra/DiceCloud1 2020-09-28 11:06:05 +02:00
Stefan Zermatten
1f663bf4b4 Updated packages and meteor version 2020-09-28 11:02:35 +02:00
Stefan Zermatten
f58a035209 Fixed github link 2020-09-28 10:38:08 +02:00
Stefan Zermatten
3fdb9f79bd Fixed routes forcing a page refresh on navigation 2020-09-28 10:37:53 +02:00
Thaum Rystra
311bbfa58c Fixed tier required to view libraries: now $3 2020-05-18 12:31:39 +02:00
Thaum Rystra
d1126596c4 Added specific node and npm versions for the hosting provider 2020-04-25 11:49:15 +02:00
Thaum Rystra
bb6125f84c removed fibres from package.json because it breaks the build 2020-04-25 11:44:16 +02:00
Thaum Rystra
2d489f119d Updated dependencies 2020-04-25 11:41:55 +02:00
Thaum Rystra
3ab73f62bf Fix: drag and drop 2020-04-25 11:17:42 +02:00
Stefan Zermatten
8b30c7b6d0 Updated packages and dependencies 2020-02-18 10:44:17 +02:00
Stefan Zermatten
4a6fa304b3 Add user management methods for admins 2019-09-02 13:55:37 +02:00
Stefan Zermatten
fabb884831 Fixed issue with Link Generation to connect patreon account 2019-05-10 10:03:01 +02:00
Stefan Zermatten
2a703900ee Hotfix subscribed libraries not showing up in add item from library dialog 2019-05-09 09:19:45 +02:00
Stefan Zermatten
0789e4d759 Merge branch 'hotfix-item-libraries' 2019-05-07 09:26:12 +02:00
Stefan Zermatten
39c91f58e4 Swapped weight and value in library item dialog to be consistent with the inventory 2019-05-07 09:25:06 +02:00
Stefan Zermatten
c84342b21a Fixed styling of item library dialog on small screens 2019-05-07 09:19:12 +02:00
Stefan Zermatten
0373feb2ea Fixed issue where effects in libraries would appear editable to subscribers 2019-05-07 09:18:53 +02:00
Stefan Zermatten
0b11595657 Fixed an issue where adding items from libraries didn't get all their properties 2019-05-06 15:55:45 +02:00
Stefan Zermatten
e7f3f669dd Fixed an issue where users without user profiles would fail to load their libraries 2019-05-06 15:12:54 +02:00
Stefan Zermatten
8d969bd447 Merge branch 'feature-library-ui' 2019-05-06 14:55:15 +02:00
Stefan Zermatten
b3aeaf06ea Fixed an error when deleting categories from library items without any settings 2019-05-06 14:54:30 +02:00
Stefan Zermatten
85e3b0724a Added a skip button to the new user experience 2019-05-06 14:51:58 +02:00
Stefan Zermatten
81a3ede86e Substantially improved item libraries UI, locked behind Patreon tier 5 2019-05-06 14:51:48 +02:00
Stefan Zermatten
d4864dda5f Fixed error on no meteor.settings file, updated meteor 2019-05-03 13:41:49 +02:00
Stefan Zermatten
5ce1b6aff8 closes #210
closes #211
2019-04-03 10:16:24 +02:00
Stefan Zermatten
41731212ef Added application performance monitoring 2019-03-07 14:53:52 +02:00
Stefan Zermatten
ef9867d409 Merge branch 'feature-patreon-accounts' 2019-03-07 13:47:32 +02:00
Stefan Zermatten
721300700e Fixed capitalization error 2019-03-07 13:46:56 +02:00
Stefan Zermatten
bc6dfbe498 Fixed stray quotation mark 2019-03-07 13:45:38 +02:00
Stefan Zermatten
0a22073d67 Added library link for $5 patrons 2019-03-07 13:44:35 +02:00
Stefan Zermatten
857213f157 Improved Patreon linking 2019-03-07 13:35:31 +02:00
Stefan Zermatten
b3371fca53 Added fetching User data from patreon and writing it to the DiceCloud user database 2019-03-06 17:05:44 +02:00
Stefan Zermatten
3fbb006783 Added Patreon notification badge for new patreon posts 2019-02-21 11:51:46 +02:00
Stefan Zermatten
2253672f43 Merge pull request #202 from mommothazaz123/master
Add multiple new API endpoints
2019-02-21 10:58:19 +02:00
Andrew Zhu
ed6d557f8a Merge branch 'master' into master 2019-02-12 13:51:20 -08:00
Andrew Zhu
4d642b56bb use direct insert, add schema check 2019-02-12 13:51:39 -08:00
Stefan Zermatten
436c5bb785 Fixed bug in view permission causing 500 errors for Avrae 2019-02-12 09:53:29 +02:00
Stefan Zermatten
8489ef5ec0 Fixed restoring characters not working correctly for sub documents 2019-02-11 13:04:14 +02:00
Stefan Zermatten
c9710bdb09 Fixed restored characters not belonging to the user restoring them 2019-02-11 12:10:04 +02:00
Stefan Zermatten
26784f11b6 Merge branch 'feature-backup-restore' 2019-02-11 12:01:52 +02:00
Stefan Zermatten
23d43f7d43 Added character restore functionality 2019-02-11 11:58:45 +02:00
Stefan Zermatten
1ebb0d2527 Got character copying working 2019-02-11 11:11:51 +02:00
Stefan Zermatten
9d86cb8bee Added the copy character method 2019-02-11 10:21:11 +02:00
Stefan Zermatten
3343f8a813 Allowed canViewCharacter to take in a character instead of a charId to save a database read 2019-02-11 10:17:43 +02:00
Stefan Zermatten
0260824c2f Made gave backup and restore the ability to change ids for all docs 2019-02-11 10:09:18 +02:00
Stefan Zermatten
66ee3ff808 Merge remote-tracking branch 'origin/master' into feature-backup-restore 2019-02-11 09:45:05 +02:00
Andrew Zhu
cb71f6d380 move everything to Meteor methods 2019-02-07 22:05:24 -08:00
Andrew Zhu
2f04d9ec1c remove server check overrides 2019-02-07 15:45:45 -08:00
Andrew Zhu
40c54524a7 add delete character endpoint 2019-02-05 15:46:06 -08:00
Andrew Zhu
b890a3b11e add feature, effect, prof, class insert 2019-02-05 15:21:32 -08:00
Andrew Zhu
c9242a95f3 add createCharacter, transferCharacter endpoints 2019-02-05 15:14:11 -08:00
Andrew Zhu
fedda62c7c add endpoint to add spells 2019-02-05 13:59:55 -08:00
Andrew Zhu
612575d0e6 add skeletons, ratelimits for endpoints 2019-02-05 13:14:09 -08:00
Andrew Zhu
d1d22c0d89 formatting, add helper func for POST endpoints 2019-02-05 13:09:56 -08:00
Andrew Zhu
b94f5ebb4b add getUserId API endpoint 2019-02-05 13:08:28 -08:00
Stefan Zermatten
3f32535666 fixed link to dicecloud repo 2019-01-31 10:11:32 +02:00
Stefan Zermatten
4ea02c4fbb Fixed hidden link to localhost 2019-01-31 10:10:56 +02:00
Stefan Zermatten
b052e8dd19 Update README.md 2019-01-31 10:09:19 +02:00
Stefan Zermatten
e2822b9f22 added naive backup restore 2019-01-28 11:35:56 +02:00
Stefan Zermatten
c46b836985 Merge pull request #192 from Frogvall/master
Updated heat metal according to SRD/PHB
2018-11-14 10:14:19 +02:00
Frogvall
65d1bac0dc Updated heat metal according to SRD/PHB 2018-11-14 06:40:22 +01:00
Stefan Zermatten
fcae3056de Merge branch 'bugfix-67' 2018-11-13 12:57:28 +02:00
Stefan Zermatten
7d364c80c0 Added hotfix to fix password button until the relevant package can be updated, fixes #67 2018-11-13 12:57:02 +02:00
Stefan Zermatten
0ff6c08abd Merge branch 'bugfix-150' 2018-11-13 12:01:52 +02:00
Stefan Zermatten
1c95336843 Spell slot bubbles are limited to 10, overflow is shown numerically
fixes #150
2018-11-13 12:01:40 +02:00
Stefan Zermatten
b36720511b Merge branch 'bugfix-155' 2018-11-13 10:39:26 +02:00
Stefan Zermatten
261220fdd5 Fixes #155, buffs can now only be applied if you have write access
refactored applying buffs to be a method, not a client side operation. You can now only applied if you have write access to the receiving character.
2018-11-13 10:39:14 +02:00
Stefan Zermatten
64edc52cca Merge branch 'bugfix-170' 2018-11-13 10:08:08 +02:00
Stefan Zermatten
56f1bd2829 Fixes #170 and maybe some other more subtle problems regarding soft removes not cascading properly, orphaning objects 2018-11-13 10:07:55 +02:00
Stefan Zermatten
3b669fd2f9 Merge branch 'bugfix-177' 2018-11-13 09:32:24 +02:00
Stefan Zermatten
933878e158 fixes #177 2018-11-13 09:31:57 +02:00
Stefan Zermatten
0e6ca56316 Merge branch 'bugfix-191' 2018-11-13 09:28:06 +02:00
Stefan Zermatten
6599fe1ef8 fixes #191 2018-11-13 09:26:36 +02:00
Stefan Zermatten
f39baf43a1 Merge branch 'bugfix-187' 2018-11-13 08:59:34 +02:00
Stefan Zermatten
96f4e35e25 fixes #187 2018-11-13 08:58:42 +02:00
Stefan Zermatten
e17dbf6601 Upgrade to meteor 1.8 2018-10-10 14:28:48 +02:00
Stefan Zermatten
3f81d419f7 updated meteor 2018-10-10 14:00:46 +02:00
Stefan Zermatten
1c00f5aa04 Hotfix iOS sign in issues (maybe) 2018-10-04 10:05:02 +02:00
Stefan Zermatten
f5a32cb50a Cobbled together some semblance of an item library UI 2018-10-02 15:43:10 +02:00
Stefan Zermatten
f4d3368fb4 Updated cron job to clean database of soft removed documents 2018-09-25 10:58:01 +02:00
Stefan Zermatten
1de9fb558a Merge pull request #182 from mommothazaz123/patch-1
fix error in Characters.deny()
2018-09-14 10:06:43 +02:00
Andrew Zhu
06ffc94b4c fix error in Characters.deny()
Renamed `docs` to `doc`, since `doc.owner` was undefined.
2018-09-07 14:07:55 -07:00
Stefan Zermatten
74c6a423ee Allowed owners to give their characters to new owners, no UI yet. 2018-08-28 09:59:10 +02:00
49 changed files with 618 additions and 330 deletions

View File

@@ -83,13 +83,13 @@ export function resetProperties(creatureId, resetFilter, actionContext) {
const attributeFilter = {
...filter,
type: 'attribute',
damage: { $ne: 0 },
damage: { $nin: [0, undefined] },
}
CreatureProperties.find(attributeFilter).forEach(prop => {
damagePropertyWork({
prop,
operation: 'increment',
value: -prop.damage,
value: -prop.damage ?? 0,
actionContext,
logFunction(increment) {
actionContext.addLog({
@@ -105,7 +105,7 @@ export function resetProperties(creatureId, resetFilter, actionContext) {
type: {
$in: ['action', 'spell']
},
usesUsed: { $ne: 0 },
usesUsed: { $nin: [0, undefined] },
};
CreatureProperties.find(actionFilter, {
fields: { name: 1, usesUsed: 1 }

View File

@@ -39,9 +39,6 @@ export default {
.column-layout>div,
.column-layout>span>div {
/*
Table and width set because firefox does not support break-inside: avoid
*/
display: table;
table-layout: fixed;
width: 100%;

View File

@@ -2,8 +2,8 @@
<v-icon
class="handle"
v-bind="$attrs"
@click.stop="() => { }"
@touchstart.native.stop="() => { }"
@click.native="e => { }"
@touchstart.native.stop="e => { }"
@touchend.native="portalEvent"
>
mdi-drag

View File

@@ -218,30 +218,30 @@ export default {
},
methods: {
changeShowTreeTab(value) {
let currentTab = this.$store.getters.tabNameById(this.model._id);
if (!value && currentTab === 'tree') {
this.$store.commit(
'setTabForCharacterSheet',
{ id: this.model._id, tab: 'build' }
);
}
this.$emit('change', {
path: ['settings', 'showTreeTab'],
value: !!value
});
let currentTab = this.$store.getters.tabById(this.model._id);
if (!value && currentTab === 5) {
this.$store.commit(
'setTabForCharacterSheet',
{ id: this.model._id, tab: 4 }
);
}
},
changeHideSpellsTab(value) {
let currentTab = this.$store.getters.tabNameById(this.model._id);
if (!value && currentTab === 'spells') {
this.$store.commit(
'setTabForCharacterSheet',
{ id: this.model._id, tab: 'actions' }
);
}
this.$emit('change', {
path: ['settings', 'hideSpellsTab'],
value: !value
});
let currentTab = this.$store.getters.tabById(this.model._id);
if (!value && currentTab === 3) {
this.$store.commit(
'setTabForCharacterSheet',
{ id: this.model._id, tab: 4 }
);
}
},
allUserLibrariesChange(value, ack) {
toggleAllUserLibraries.call({

View File

@@ -195,7 +195,7 @@ export default {
} else {
this.$store.commit(
'setTabForCharacterSheet',
{id: creatureId, tab: 5}
{id: creatureId, tab: 'build'}
);
this.$emit('pop', creatureId);
defer(() => {

View File

@@ -5,7 +5,7 @@
</v-toolbar-title>
<div>
<p v-if="name">
Type "{{ name }}" to permanenetly delete the character
Type "{{ name }}" to permanently delete the character
</p>
<v-text-field
v-if="name"

View File

@@ -47,9 +47,6 @@
<v-tab-item>
<stats-tab :creature-id="creatureId" />
</v-tab-item>
<v-tab-item>
<features-tab :creature-id="creatureId" />
</v-tab-item>
<v-tab-item>
<actions-tab :creature-id="creatureId" />
</v-tab-item>
@@ -59,6 +56,9 @@
<v-tab-item>
<inventory-tab :creature-id="creatureId" />
</v-tab-item>
<v-tab-item>
<features-tab :creature-id="creatureId" />
</v-tab-item>
<v-tab-item>
<character-tab :creature-id="creatureId" />
</v-tab-item>
@@ -96,10 +96,6 @@
<span>Stats</span>
<v-icon>mdi-chart-box</v-icon>
</v-btn>
<v-btn>
<span>Features</span>
<v-icon>mdi-text</v-icon>
</v-btn>
<v-btn>
<span>Actions</span>
<v-icon>mdi-lightning-bolt</v-icon>
@@ -112,6 +108,10 @@
<span>Inventory</span>
<v-icon>mdi-cube</v-icon>
</v-btn>
<v-btn>
<span>Features</span>
<v-icon>mdi-text</v-icon>
</v-btn>
<v-btn>
<span>Journal</span>
<v-icon>mdi-book-open-variant</v-icon>

View File

@@ -39,27 +39,45 @@
<v-icon>mdi-dots-vertical</v-icon>
</v-btn>
</template>
<v-list v-if="editPermission">
<v-list-item @click="deleteCharacter">
<v-list>
<v-list-item :to="printUrl">
<v-list-item-title>
<v-icon>mdi-delete</v-icon> Delete
<v-icon left>
mdi-printer
</v-icon> Print
</v-list-item-title>
</v-list-item>
<v-list-item @click="showCharacterForm">
<template v-if="editPermission">
<v-list-item @click="deleteCharacter">
<v-list-item-title>
<v-icon left>
mdi-delete
</v-icon> Delete
</v-list-item-title>
</v-list-item>
<v-list-item @click="showCharacterForm">
<v-list-item-title>
<v-icon left>
mdi-pencil
</v-icon> Edit details
</v-list-item-title>
</v-list-item>
<v-list-item @click="showShareDialog">
<v-list-item-title>
<v-icon left>
mdi-share-variant
</v-icon> Sharing
</v-list-item-title>
</v-list-item>
</template>
<v-list-item
v-else
@click="unshareWithMe"
>
<v-list-item-title>
<v-icon>mdi-pencil</v-icon> Edit details
</v-list-item-title>
</v-list-item>
<v-list-item @click="showShareDialog">
<v-list-item-title>
<v-icon>mdi-share-variant</v-icon> Sharing
</v-list-item-title>
</v-list-item>
</v-list>
<v-list v-else>
<v-list-item @click="unshareWithMe">
<v-list-item-title>
<v-icon>mdi-delete</v-icon> Unshare with me
<v-icon left>
mdi-delete
</v-icon> Unshare with me
</v-list-item-title>
</v-list-item>
</v-list>
@@ -101,9 +119,6 @@
<v-tab>
Stats
</v-tab>
<v-tab>
Features
</v-tab>
<v-tab>
Actions
</v-tab>
@@ -113,6 +128,9 @@
<v-tab>
Inventory
</v-tab>
<v-tab>
Features
</v-tab>
<v-tab>
Journal
</v-tab>
@@ -144,6 +162,7 @@ import isDarkColor from '/imports/client/ui/utility/isDarkColor.js';
import CharacterSheetFab from '/imports/client/ui/creature/character/CharacterSheetFab.vue';
import getThemeColor from '/imports/client/ui/utility/getThemeColor.js';
import SharedIcon from '/imports/client/ui/components/SharedIcon.vue';
import getCreatureUrlName from '/imports/api/creature/creatures/getCreatureUrlName.js';
export default {
components: {
@@ -167,6 +186,9 @@ export default {
isDark() {
return isDarkColor(this.toolbarColor);
},
printUrl() {
return `/print-character/${this.creature._id}/${getCreatureUrlName(this.creature)}`;
},
},
methods: {
...mapMutations([

View File

@@ -61,6 +61,7 @@ export default {
const folderIds = CreatureProperties.find({
'ancestors.id': this.creatureId,
type: 'folder',
groupStats: true,
hideStatsGroup: true,
removed: { $ne: true },
inactive: { $ne: true },

View File

@@ -59,6 +59,7 @@ export default {
const folderIds = CreatureProperties.find({
'ancestors.id': this.creatureId,
type: 'folder',
groupStats: true,
hideStatsGroup: true,
removed: { $ne: true },
inactive: { $ne: true },

View File

@@ -145,6 +145,7 @@ export default {
return CreatureProperties.find({
'ancestors.id': this.creatureId,
type: 'folder',
groupStats: true,
hideStatsGroup: true,
removed: { $ne: true },
inactive: { $ne: true },

View File

@@ -63,6 +63,7 @@ export default {
const folderIds = CreatureProperties.find({
'ancestors.id': this.creatureId,
type: 'folder',
groupStats: true,
hideStatsGroup: true,
removed: { $ne: true },
inactive: { $ne: true },

View File

@@ -81,6 +81,7 @@ export default {
return CreatureProperties.find({
'ancestors.id': this.creatureId,
type: 'folder',
groupStats: true,
hideStatsGroup: true,
removed: { $ne: true },
inactive: { $ne: true },

View File

@@ -28,7 +28,7 @@
@remove="softRemove"
/>
<div
v-if="!creature.settings.hideRestButtons || (properties.action.event && properties.action.event.length)"
v-if="!creature.settings.hideRestButtons || (properties.action && properties.action.event && properties.action.event.length)"
class="character-buttons"
>
<v-card>
@@ -427,10 +427,10 @@ const propertyHandlers = {
folder(prop) {
let skipChildren;
let propPath = null;
if (prop.hideStatsGroup) {
if (prop.groupStats && prop.hideStatsGroup) {
skipChildren = true;
}
if (prop.tab === 'stats') {
if (prop.groupStats && prop.tab === 'stats') {
propPath = ['folder', prop.location]
}
return { skipChildren, propPath }

View File

@@ -32,7 +32,7 @@
light
>
<div class="page pa-3">
<div class="px-3 d-flex align-center">
<div class="title-block px-3 d-flex align-center">
<div class="logo-background" />
<div class="creature-name mr-3">
{{ creature.name }}
@@ -42,7 +42,7 @@
{{ creature.alignment }} {{ background }}
</div>
<dir v-if="race || creature.gender">
{{ race }} {{ creature.gender }}
{{ creature.gender }} {{ race }}
</dir>
<div v-if="level && classes && classes.length === 1">
Level {{ level }} {{ classes[0].name }}
@@ -236,9 +236,33 @@ export default {
color: black;
font-size: 11pt;
}
.character-sheet-printed * {
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
cursor: unset !important;
}
.page {
padding: 4px;
}
.character-sheet-printed .column-layout, .character-sheet-printed .column-layout.wide-columns {
position:relative;
width: 100%;
widows: 0;
orphans: 0;
-webkit-column-fill: balance-all;
column-fill: balance-all;
}
.character-sheet-printed .column-layout>div {
position:relative;
}
.character-sheet-printed .column-layout > div > * {
page-break-inside: avoid;
}
.character-sheet-printed .inactive {
opacity: 1 !important;
}
@@ -253,8 +277,6 @@ export default {
background-image: url(/crown-dice-logo-cropped-transparent.png);
background-size: contain;
background-position: 0 center;
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
}
.character-sheet-printed .v-divider {
@@ -265,39 +287,26 @@ export default {
.character-sheet-printed .double-border {
position: relative;
padding: 11px 10px;
page-break-inside: avoid;
}
.character-sheet-printed .double-border::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-image-source: url(/images/print/doubleLineImageBorder.png);
border-image-slice: 110 126 fill;
border-image-width: 16px;
border-image-repeat: stretch;
box-sizing: content-box;
z-index: -1;
}
.character-sheet-printed .octagon-border {
position: relative;
padding: 4px 20px;
page-break-inside: avoid;
}
.character-sheet-printed .octagon-border::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-image: url(/images/print/octagonBorder.png) 124 118 fill;
border-image-width: 22px;
z-index: -1;
}
.character-sheet-printed .span-all {
page-break-after: avoid;
break-after: avoid;
}
.span-all + div {
page-break-before: avoid;
break-before: avoid;
}
.character-sheet-printed .stats .label {
@@ -326,10 +335,32 @@ export default {
}
}
@media print {
header {
display: none !important;
@page {
size: auto;
margin: 8mm 8mm 8mm 8mm;
}
nav {
body {
margin: 0;
}
.character-sheet-printed .page {
width: 100%;
padding: 0 !important;
}
.character-sheet-printed .column-layout {
padding: 4px 0 !important;
}
.character-sheet-printed .title-block {
padding-left: 0 !important;
padding-right: 4px !important;
}
.v-main, .v-application, .v-application--wrap, .character-sheet-printed {
display: block !important;
background-color: white !important;
}
html {
background-color: white !important;
}
header, nav, .v-snack, .dialog-stack {
display: none !important;
}
.v-main {

View File

@@ -0,0 +1,97 @@
<template>
<v-app-bar
app
class="character-sheet-printed-toolbar"
:color="toolbarColor"
:dark="isDark"
:light="!isDark"
clipped-right
:extended="$vuetify.breakpoint.smAndUp"
:tabs="$vuetify.breakpoint.smAndUp"
dense
>
<v-app-bar-nav-icon @click="toggleDrawer" />
<v-btn
icon
:to="characterUrl"
>
<v-icon>mdi-arrow-left</v-icon>
</v-btn>
<v-toolbar-title>
<v-fade-transition mode="out-in">
<div :key="$store.state.pageTitle">
{{ $store.state.pageTitle }}
</div>
</v-fade-transition>
</v-toolbar-title>
<v-spacer />
<div
slot="extension"
style="width: 100%"
>
<v-btn
class="print-fab"
color="accent"
elevation="4"
fab
@click="print"
>
<v-icon>mdi-printer</v-icon>
</v-btn>
</div>
</v-app-bar>
</template>
<script lang="js">
import Creatures from '/imports/api/creature/creatures/Creatures.js';
import { mapMutations } from 'vuex';
import isDarkColor from '/imports/client/ui/utility/isDarkColor.js';
import getThemeColor from '/imports/client/ui/utility/getThemeColor.js';
import getCreatureUrlName from '/imports/api/creature/creatures/getCreatureUrlName.js';
export default {
inject: {
context: { default: {} }
},
computed: {
creatureId() {
return this.$route.params.id;
},
toolbarColor() {
if (this.creature && this.creature.color) {
return this.creature.color;
} else {
return getThemeColor('secondary');
}
},
isDark() {
return isDarkColor(this.toolbarColor);
},
characterUrl() {
if (!this.creature) return;
return `/character/${this.creature._id}/${getCreatureUrlName(this.creature)}`;
},
},
methods: {
...mapMutations([
'toggleDrawer',
]),
print() {
print();
},
},
meteor: {
creature() {
return Creatures.findOne(this.creatureId);
},
},
}
</script>
<style scoped>
.print-fab {
position: absolute;
bottom: -24px;
right: 24px;
}
</style>

View File

@@ -1,7 +1,6 @@
<template lang="html">
<div
class="inventory"
style="page-break-before: always;"
>
<column-layout wide-columns>
<div class="span-all">
@@ -62,7 +61,7 @@
>
<div
:key="container._id"
class="span-all container-header"
class="span-all"
>
<printed-container
class="octagon-border"
@@ -232,22 +231,6 @@ export default {
</script>
<style lang="css" scoped>
.octagon-border {
position: relative;
padding: 4px 20px;
page-break-inside: avoid;
}
.octagon-border::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border-image: url(/images/print/octagonBorder.png) 124 118 fill;
border-image-width: 22px;
z-index: -1;
}
.label {
font-size: 14pt;
@@ -262,9 +245,4 @@ export default {
.inventory-stat > .v-icon {
margin-right: 8px;
}
.container-header {
page-break-after: avoid;
page-break-inside: avoid;
}
</style>

View File

@@ -1,7 +1,6 @@
<template lang="html">
<div
class="spells"
style="page-break-before: always;"
>
<column-layout wide-columns>
<div class="span-all">

View File

@@ -2,97 +2,104 @@
<div class="stats">
<column-layout>
<div
v-if="abilities.length"
class="ability-scores"
v-for="ability in abilities"
:key="ability._id"
>
<div class="layout flex column">
<div
v-for="ability in abilities"
:key="ability._id"
class="ability"
>
<div class="score">
<div class="double-border top big-number">
<template v-if="creature.settings.swapScoresAndMods">
{{ ability.total }}
</template>
<template v-else>
{{ numberToSignedString(ability.modifier) }}
</template>
</div>
<div class="bottom">
<template v-if="creature.settings.swapScoresAndMods">
{{ numberToSignedString(ability.modifier) }}
</template>
<template v-else>
{{ ability.total }}
</template>
</div>
<div
class="ability"
>
<div class="score">
<div class="double-border top big-number">
<template v-if="creature.settings.swapScoresAndMods">
{{ ability.total }}
</template>
<template v-else>
{{ numberToSignedString(ability.modifier) }}
</template>
</div>
<div class="double-border name label">
{{ ability.name }}
<div class="bottom">
<template v-if="creature.settings.swapScoresAndMods">
{{ numberToSignedString(ability.modifier) }}
</template>
<template v-else>
{{ ability.total }}
</template>
</div>
</div>
<div class="double-border name label">
{{ ability.name }}
</div>
</div>
</div>
<div
v-for="toggle in toggles"
:key="toggle._id"
class="number-label"
>
<div class="box double-border" />
<div class="label double-border">
{{ toggle.name }}
<div
class="number-label"
>
<div class="box double-border" />
<div class="label double-border">
{{ toggle.name }}
</div>
</div>
</div>
<div
v-for="stat in stats"
:key="stat._id"
class="number-label"
:class="stat.variableName == 'armor' && 'shield-number-label'"
>
<div
:class="stat.variableName == 'armor' ? 'shield-border' : 'octagon-border'"
class="number big-number"
class="number-label"
:class="stat.variableName == 'armor' && 'shield-number-label'"
>
{{ stat.value }}
</div>
<div class="label double-border">
{{ stat.name }}
<div
:class="stat.variableName == 'armor' ? 'shield-border' : 'octagon-border'"
class="number big-number"
>
{{ stat.value }}
</div>
<div class="label double-border">
{{ stat.name }}
</div>
</div>
</div>
<div
v-for="modifier in modifiers"
:key="modifier._id"
class="number-label"
>
<div class="number octagon-border big-number">
{{ numberToSignedString(modifier.value) }}
</div>
<div class="label double-border">
{{ modifier.name }}
<div
class="number-label"
>
<div class="number octagon-border big-number">
{{ numberToSignedString(modifier.value) }}
</div>
<div class="label double-border">
{{ modifier.name }}
</div>
</div>
</div>
<div
v-for="check in checks"
:key="check._id"
class="number-label"
>
<div class="number octagon-border big-number">
{{ numberToSignedString(check.value) }}
</div>
<div class="label double-border">
{{ check.name }}
<div
class="number-label"
>
<div class="number octagon-border big-number">
{{ numberToSignedString(check.value) }}
</div>
<div class="label double-border">
{{ check.name }}
</div>
</div>
</div>
<div
v-for="healthBar in healthBars"
:key="healthBar._id"
class="m-2"
>
<div class="double-border">
<div class="label">
@@ -115,7 +122,6 @@
</div>
<div
v-if="hitDice.length"
class="hit-dice m-2"
>
<div class="double-border">
<div>
@@ -528,21 +534,10 @@ export default {
position: relative;
aspect-ratio: 0.87;
padding: 12px;
}
.shield-border::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: url(/images/print/shieldBorder.png);
print-color-adjust: exact;
-webkit-print-color-adjust: exact;
background-size: contain;
background-position: center;
background-repeat: no-repeat;
z-index: -1;
}
.shield-number-label {
align-items: center !important;
@@ -571,23 +566,13 @@ export default {
font-size: 10pt;
position: relative;
padding: 0 16px;
z-index: 2;
}
.ability .bottom::before {
content: "";
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
border: solid white;
border-image-source: url(/images/print/upwardPointingBorder.png);
border-image-slice: 0 85 fill;
border-image-width: 0 16px;
border-image-outset: 0px 0px;
border-image-repeat: stretch;
box-sizing: content-box;
z-index: -1;
z-index: 2;
}
.ability .name {
margin-top: 10px;

View File

@@ -1,5 +1,5 @@
<template>
<div class="container">
<div class="inventory-container">
<div class="d-flex justify-center">
<property-icon
class="ml-2"

View File

@@ -1,5 +1,5 @@
<template lang="html">
<v-list-item-content style="min-height: 60px;">
<v-list-item-content :style="dense ? undefined : 'min-height: 60px;'">
<v-list-item-title class="d-flex align-center">
<div
v-if="!renaming"

View File

@@ -1,6 +1,8 @@
<template lang="html">
<v-list
expand
:nav="nav"
:dense="dense"
class="creature-folder-list"
>
<creature-list
@@ -14,7 +16,7 @@
v-for="folder in folders"
:key="folder._id"
v-model="openFolders[folder._id]"
group="folder"
:dense="dense"
>
<template #activator>
<creature-folder-header
@@ -60,6 +62,7 @@ export default {
default: undefined,
},
dense: Boolean,
nav: Boolean,
},
data(){return{
openFolders: {},

View File

@@ -5,10 +5,12 @@
<v-list-item
v-bind="$attrs"
:class="isSelected && 'primary--text v-list-item--active'"
:dense="dense"
v-on="selection ? { click() {$emit('click')} } : {}"
>
<v-list-item-avatar
:color="isSelected ? 'red darken-1' : model.color || 'grey'"
:size="dense ? 30 : undefined"
class="white--text"
style="transition: background 0.3s;"
>

View File

@@ -63,21 +63,14 @@
},
watch: {
dialogs(newDialogs) {
let el = document.documentElement;
const el = document.documentElement;
if (newDialogs.length) {
this.top = el.scrollTop;
if (el.scrollHeight > el.clientHeight){
el.style.position = 'fixed';
el.style.top = `${-this.top}px`;
el.style.left = 0;
el.style.right = 0;
el.style.overflowY = 'scroll';
el.style.overflowY = 'hidden';
el.scrollTop = this.top;
}
} else {
el.style.position = null;
el.style.top = null;
el.style.left = null;
el.style.right = null;
el.style.overflowY = null;
el.scrollTop = this.top;
}

View File

@@ -11,7 +11,10 @@
Sign in
</v-btn>
</v-layout>
<v-list>
<v-list
nav
class="links"
>
<v-list-item v-if="signedIn">
<v-list-item-content>
<v-list-item-title>
@@ -39,6 +42,7 @@
:key="i"
:to="link.to"
:href="link.href"
:target="link.href ? '_blank': undefined"
>
<v-list-item-action>
<v-icon>{{ link.icon }}</v-icon>
@@ -91,7 +95,7 @@ export default {
let isLoggedIn = !!Meteor.userId();
let links = [
{ title: 'Home', icon: 'mdi-home', to: '/' },
{ title: 'Characters', icon: 'mdi-account-group', to: '/characterList', requireLogin: true },
{ title: 'Characters', icon: 'mdi-account-group', to: '/character-list', requireLogin: true },
{ title: 'Library', icon: 'mdi-library-shelves', to: '/library', requireLogin: true },
//{title: 'Tabletops', icon: 'api', to: '/tabletops', requireLogin: true},
//{title: 'Friends', icon: 'people', to: '/friends', requireLogin: true},
@@ -100,7 +104,7 @@ export default {
{ title: 'About', icon: 'mdi-sign-text', to: '/about' },
{ title: 'Documentation', icon: 'mdi-book-open-variant', to: '/docs' },
{ title: 'Patreon', icon: 'mdi-patreon', href: 'https://www.patreon.com/dicecloud' },
{ title: 'Github', icon: 'mdi-github', href: 'https://github.com/ThaumRystra/DiceCloud/tree/version-2' },
{ title: 'Github', icon: 'mdi-github', href: 'https://github.com/ThaumRystra/DiceCloud/' },
];
return links.filter(link => !link.requireLogin || isLoggedIn);
},
@@ -138,3 +142,9 @@ export default {
},
};
</script>
<style scoped>
.links .v-list-item:not(:last-child):not(:only-child) {
margin-bottom: 4px;
}
</style>

View File

@@ -2,8 +2,8 @@
<div>
<section>
<v-parallax
src="/images/paper-dice-crown-with-candy.png"
height="400"
src="/images/paper-dice-crown.webp"
height="300"
>
<v-layout
column
@@ -12,7 +12,7 @@
class="white--text"
>
<p
class="white--text ma-2 text-h5 text-center"
class="white--text ma-2 text-center"
style="max-width: 1200px;"
>
DiceCloud is a single-developer project started in 2014 with the aim of

View File

@@ -4,7 +4,10 @@
style="height: 100%"
>
<v-container>
<v-row justify="center">
<v-row
justify="center"
class="mb-16"
>
<v-col
cols="12"
xl="8"

View File

@@ -1,29 +1,75 @@
<template>
<div
class="content layout column justify-space-between"
class="home content layout column justify-space-between"
style="min-height: 100%;"
>
<section
class="py-12 px-4"
>
<v-row
align="end"
justify="center"
class="mb-8"
>
<v-col
class="text-center"
cols="12"
>
<h1 class="text-h4 mb-4">
Free, Auditable, real-time character tracking for 5th edition
</h1>
<h4 class="subheading">
Spend less time shuffling paper, and more time playing the game
</h4>
</v-col>
</v-row>
<v-layout
v-if="!signedIn"
align-center
justify-center
>
<v-btn
color="accent"
rounded
large
to="/register"
class="mr-4"
>
Register
</v-btn>
<v-btn
color="accent"
rounded
outlined
large
to="/sign-in"
>
Sign In
</v-btn>
</v-layout>
<v-layout
v-else
align-center
justify-center
>
<v-btn
color="accent"
rounded
large
to="/character-list"
class="mr-4"
>
My Characters
</v-btn>
</v-layout>
</section>
<section>
<v-parallax
src="/images/paper-dice-crown.png"
src="/images/crown-dice-on-ipad.webp"
height="300"
>
<v-layout
column
align-center
justify-center
class="white--text"
>
<h1 class="white--text mb-2 text-h4 text-center">
DiceCloud - Free, Auditable, real-time character tracking for 5th edition
</h1>
<div class="subheading mb-3 text-center">
Spend less time shuffling paper, and more time playing the game
</div>
</v-layout>
</v-parallax>
/>
</section>
<section class="text-center">
<section class="text-center py-8 px-4">
<v-layout
wrap
justify-space-around
@@ -43,7 +89,7 @@
Free, open source, community funded
</h3>
<p>
DiceCloud is free to use. Its hosting is funded via Patreon,
DiceCloud is free to use, funded via Patreon,
and the source code is available on Github under a GPL license.
</p>
</v-layout>
@@ -58,11 +104,11 @@
mdi-ballot-outline
</v-icon>
<h3 class="mb-2">
Character sheets optimised for one ruleset
Custom everything
</h3>
<p>
By having a narrrow scope, DiceCloud can be the best at what it
does: being a fully automated character tracker
Add new ability scores, skills, health-bars, and stats to your character.
The entire sheet is under your control.
</p>
</v-layout>
<v-layout
@@ -76,31 +122,37 @@
mdi-file-tree-outline
</v-icon>
<h3 class="mb-2">
Inventory manager
Advanced Character Engine
</h3>
<p>
Equiping items changes your characters stats automatically.
Characters are computed in real-time based on their equipment,
features, and buffs.
</p>
</v-layout>
</v-layout>
</section>
<section
v-if="!signedIn"
class="ma-5"
>
<v-layout
align-center
justify-space-around
>
<v-btn
color="accent"
rounded
large
to="/sign-in"
<section class="pa-8">
<v-row>
<v-col
v-for="(card, index) in highlightCards"
:key="index"
v-bind="cols"
>
Sign In
</v-btn>
</v-layout>
<v-card
tile
:elevation="0"
>
<v-img
class="white--text align-end"
:src="'/images/screenshots/' + card.img"
gradient="to bottom, rgba(0,0,0,0), rgba(0,0,0,.5)"
height="360px"
>
<v-card-title v-text="card.text" />
</v-img>
</v-card>
</v-col>
</v-row>
</section>
<section class="text-center grey darken-3 white--text pa-5">
<h1>
@@ -120,11 +172,16 @@
]"
:key="btn.name"
:href="btn.link"
text
outlined
large
color="primary"
dark
>
{{ btn.name }}
<v-icon
right
>
mdi-open-in-new
</v-icon>
</v-btn>
</v-layout>
</section>
@@ -133,6 +190,25 @@
<script lang="js">
export default {
data() {return {
cols: {
cols: 12,
sm: 6,
md: 4,
lg: 3,
xl: 2,
},
highlightCards: [
{ text: 'Automated actions', img: 'actions.webp' },
{ text: 'Auditable stats', img: 'auditable.webp' },
{ text: 'Dice rolling', img: 'automated-dice-rolls.webp' },
{ text: 'Hackable character builder', img: 'build-system.webp' },
{ text: 'Drag and drop inventory manager', img: 'inventory.webp' },
{ text: 'Custom libraries of content', img: 'libraries-of-content.webp' },
{ text: 'Discord webhooks', img: 'send-to-discord.webp' },
{ text: 'Printed character sheets', img: 'printing.webp' },
],
}},
meteor: {
signedIn() {
return Meteor.userId();
@@ -145,4 +221,7 @@ export default {
.selling-points>* {
max-width: 400px;
}
.dark-gradient {
background: linear-gradient(0deg, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0) 100%);
}
</style>

View File

@@ -39,7 +39,10 @@
>
Reset Password
</v-btn>
<div class="error--text">
<div
v-if="error"
class="error--text"
>
{{ error }}
</div>
<v-layout>
@@ -59,6 +62,13 @@
Register
</v-btn>
</v-layout>
<div class="text-caption mt-4 px-4">
<p>
DiceCloud Version 2 requires a new account to use.
</p><p>
Version 1 is still available at <a href="https://v1.dicecloud.com">v1.dicecloud.com</a>
</p>
</div>
</v-layout>
</v-form>
<v-divider class="ma-4" />

View File

@@ -5,11 +5,21 @@
@toolbarclick="clickSpellList(model._id)"
>
<template slot="toolbar">
<v-toolbar-title>
<v-toolbar-title
v-if="!preparingSpells"
>
{{ model.name }}
</v-toolbar-title>
<v-spacer v-if="!preparingSpells && preparedError" />
<v-toolbar-title
v-if="preparingSpells || preparedError"
:class="{'error--text' : preparedError}"
>
{{ numPrepared }}/{{ model.maxPrepared.value }} spells prepared
</v-toolbar-title>
<v-spacer />
<v-menu
v-if="!preparingSpells"
bottom
left
transition="slide-y-transition"
@@ -33,22 +43,29 @@
/>
</v-list>
</v-menu>
</template>
<v-expand-transition>
<v-card-text
v-if="preparedError || preparingSpells"
:class="{'error--text' : preparedError}"
class="pb-0"
<v-btn
v-else
icon
@click.stop="preparingSpells = false"
>
<div v-if="model.maxPrepared && model.maxPrepared.value">
{{ numPrepared }}/{{ model.maxPrepared.value }} spells prepared
</div>
<v-switch
v-model="preparingSpells"
label="Change prepared spells"
/>
</v-card-text>
</v-expand-transition>
<v-icon>mdi-check</v-icon>
</v-btn>
</template>
<!-- Disabled because it changes the height of the card
<v-card-text
v-if="preparedError || preparingSpells"
:class="{'error--text' : preparedError}"
class="pb-0"
>
<div v-if="model.maxPrepared && model.maxPrepared.value">
{{ numPrepared }}/{{ model.maxPrepared.value }} spells prepared
</div>
<v-switch
v-model="preparingSpells"
label="Change prepared spells"
/>
</v-card-text>
-->
<spell-list
:spells="spells"
:parent-ref="{id: model._id, collection: 'creatureProperties'}"

View File

@@ -13,6 +13,7 @@ const CharacterSheetPage = () => import('/imports/client/ui/pages/CharacterSheet
const CharacterSheetToolbar = () => import('/imports/client/ui/creature/character/CharacterSheetToolbar.vue');
const CharacterSheetRightDrawer = () => import('/imports/client/ui/creature/character/CharacterSheetRightDrawer.vue');
const CharacterSheetPrinted = () => import('/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrinted.vue');
const CharacterSheetPrintedToolbar = () => import('/imports/client/ui/creature/character/printedCharacterSheet/CharacterSheetPrintedToolbar.vue');
const SignIn = () => import('/imports/client/ui/pages/SignIn.vue');
const Register = () => import('/imports/client/ui/pages/Register.vue');
const IconAdmin = () => import('/imports/client/ui/icons/IconAdmin.vue');
@@ -185,11 +186,14 @@ RouterFactory.configure(router => {
alias: '/print-character/:id/:urlName',
components: {
default: CharacterSheetPrinted,
toolbar: CharacterSheetPrintedToolbar,
},
meta: {
title: 'Print Character Sheet',
},
}, {
},
/* Not ready for prime time <3
{
path: '/tabletops',
name: 'tabletops',
component: Tabletops,
@@ -203,7 +207,9 @@ RouterFactory.configure(router => {
rightDrawer: TabletopRightDrawer,
},
beforeEnter: ensureLoggedIn,
}, {
},
*/
{
path: '/friends',
components: {
default: NotImplemented,

View File

@@ -0,0 +1,37 @@
html {
--scrollbarBG: #f0f0f0;
--thumbBG: #cdcdcd;
scrollbar-gutter: stable;
background-color: var(--scrollbarBG);
}
html:has(#app.theme--dark) {
--scrollbarBG: #212121;
--thumbBG: #404040;
}
#app.theme--dark {
--scrollbarBG: #212121;
--thumbBG: #404040;
}
* {
scrollbar-width: thin;
scrollbar-color: var(--thumbBG) var(--scrollbarBG);
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background-color: var(--scrollbarBG);
}
::-webkit-scrollbar-thumb {
background-color: var(--thumbBG);
}
::-webkit-scrollbar-corner {
background-color: rgba(0, 0, 0, 0);
}

View File

@@ -1,3 +1,4 @@
import './body.css';
import './cardColors.css';
import './cardTitles.css';
import './centeredInputs.css';

View File

@@ -2,8 +2,8 @@ import Vue from 'vue';
import Vuex from 'vuex';
import dialogStackStore from '/imports/client/ui/dialogStack/dialogStackStore.js';
import Creatures from '/imports/api/creature/creatures/Creatures.js';
const tabs = ['stats', 'features', 'actions', 'spells', 'inventory', 'journal', 'build', 'tree'];
const tabsWithoutSpells = ['stats', 'features', 'actions', 'inventory', 'journal', 'build', 'tree'];
const tabs = ['stats', 'actions', 'spells', 'inventory', 'features', 'journal', 'build', 'tree'];
const tabsWithoutSpells = ['stats', 'actions', 'inventory', 'features', 'journal', 'build', 'tree'];
Vue.use(Vuex);
const store = new Vuex.Store({
@@ -50,6 +50,19 @@ const store = new Vuex.Store({
document.title = value;
},
setTabForCharacterSheet(state, { tab, id }) {
// Convert tab names to tab numbers
if (typeof tab === 'string') {
const creature = Creatures.findOne(id);
if (creature?.settings?.hideSpellsTab) {
tab = tabsWithoutSpells.indexOf(tab);
} else {
tab = tabs.indexOf(tab);
}
if (!(tab > -1)) {
throw 'Could not find requested tab';
}
console.log('resolved: ', tab);
}
Vue.set(state.characterSheetTabs, id, tab);
},
setShowDetailsDialog(state, value) {

View File

@@ -30,7 +30,7 @@ const STORAGE_LIMITS = Object.freeze({
rollCount: 64,
statsToTarget: 64,
tagCount: 64,
writersCount: 20,
writersCount: 32,
libraryCollectionCount: 32,
pointBuyRowsCount: 32,
});

114
app/package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "dicecloud",
"version": "2.0.43",
"version": "2.0.45",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -56,11 +56,11 @@
"dev": true
},
"@babel/runtime": {
"version": "7.20.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz",
"integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==",
"version": "7.20.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz",
"integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==",
"requires": {
"regenerator-runtime": "^0.13.10"
"regenerator-runtime": "^0.13.11"
}
},
"@chenfengyuan/vue-countdown": {
@@ -185,14 +185,14 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.43.0.tgz",
"integrity": "sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz",
"integrity": "sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==",
"dev": true,
"requires": {
"@typescript-eslint/scope-manager": "5.43.0",
"@typescript-eslint/type-utils": "5.43.0",
"@typescript-eslint/utils": "5.43.0",
"@typescript-eslint/scope-manager": "5.44.0",
"@typescript-eslint/type-utils": "5.44.0",
"@typescript-eslint/utils": "5.44.0",
"debug": "^4.3.4",
"ignore": "^5.2.0",
"natural-compare-lite": "^1.4.0",
@@ -222,14 +222,14 @@
}
},
"@typescript-eslint/parser": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.43.0.tgz",
"integrity": "sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.44.0.tgz",
"integrity": "sha512-H7LCqbZnKqkkgQHaKLGC6KUjt3pjJDx8ETDqmwncyb6PuoigYajyAwBGz08VU/l86dZWZgI4zm5k2VaKqayYyA==",
"dev": true,
"requires": {
"@typescript-eslint/scope-manager": "5.43.0",
"@typescript-eslint/types": "5.43.0",
"@typescript-eslint/typescript-estree": "5.43.0",
"@typescript-eslint/scope-manager": "5.44.0",
"@typescript-eslint/types": "5.44.0",
"@typescript-eslint/typescript-estree": "5.44.0",
"debug": "^4.3.4"
},
"dependencies": {
@@ -245,23 +245,23 @@
}
},
"@typescript-eslint/scope-manager": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.43.0.tgz",
"integrity": "sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz",
"integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.43.0",
"@typescript-eslint/visitor-keys": "5.43.0"
"@typescript-eslint/types": "5.44.0",
"@typescript-eslint/visitor-keys": "5.44.0"
}
},
"@typescript-eslint/type-utils": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.43.0.tgz",
"integrity": "sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz",
"integrity": "sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==",
"dev": true,
"requires": {
"@typescript-eslint/typescript-estree": "5.43.0",
"@typescript-eslint/utils": "5.43.0",
"@typescript-eslint/typescript-estree": "5.44.0",
"@typescript-eslint/utils": "5.44.0",
"debug": "^4.3.4",
"tsutils": "^3.21.0"
},
@@ -278,19 +278,19 @@
}
},
"@typescript-eslint/types": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.43.0.tgz",
"integrity": "sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz",
"integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.43.0.tgz",
"integrity": "sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz",
"integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.43.0",
"@typescript-eslint/visitor-keys": "5.43.0",
"@typescript-eslint/types": "5.44.0",
"@typescript-eslint/visitor-keys": "5.44.0",
"debug": "^4.3.4",
"globby": "^11.1.0",
"is-glob": "^4.0.3",
@@ -319,16 +319,16 @@
}
},
"@typescript-eslint/utils": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.43.0.tgz",
"integrity": "sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.44.0.tgz",
"integrity": "sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.9",
"@types/semver": "^7.3.12",
"@typescript-eslint/scope-manager": "5.43.0",
"@typescript-eslint/types": "5.43.0",
"@typescript-eslint/typescript-estree": "5.43.0",
"@typescript-eslint/scope-manager": "5.44.0",
"@typescript-eslint/types": "5.44.0",
"@typescript-eslint/typescript-estree": "5.44.0",
"eslint-scope": "^5.1.1",
"eslint-utils": "^3.0.0",
"semver": "^7.3.7"
@@ -355,12 +355,12 @@
}
},
"@typescript-eslint/visitor-keys": {
"version": "5.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.43.0.tgz",
"integrity": "sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==",
"version": "5.44.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz",
"integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==",
"dev": true,
"requires": {
"@typescript-eslint/types": "5.43.0",
"@typescript-eslint/types": "5.44.0",
"eslint-visitor-keys": "^3.3.0"
},
"dependencies": {
@@ -530,9 +530,9 @@
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw=="
},
"aws-sdk": {
"version": "2.1258.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1258.0.tgz",
"integrity": "sha512-siqNFXlhJZVN1BizPZebJViFXtTUPgcA+yLfHKl2eC4Ied7kE7spOjZmAzpuiGUTzFagk1oWCaJ1Hit4llIoGg==",
"version": "2.1262.0",
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1262.0.tgz",
"integrity": "sha512-XbaK/XUIxwLEBnHANhJ0RTZtiU288lFRj5FllSihQ5Kb0fibKyW8kJFPsY+NzzDezLH5D3WdGbTKb9fycn5TbA==",
"requires": {
"buffer": "4.9.2",
"events": "1.1.1",
@@ -1575,9 +1575,9 @@
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
},
"ignore": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz",
"integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA=="
},
"ignore-styles": {
"version": "5.0.1",
@@ -1850,9 +1850,9 @@
}
},
"marked": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.2.2.tgz",
"integrity": "sha512-JjBTFTAvuTgANXx82a5vzK9JLSMoV6V3LBVn4Uhdso6t7vXrGx7g1Cd2r6NYSsxrYbQGFCMqBDhFHyK5q2UvcQ=="
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz",
"integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw=="
},
"merge2": {
"version": "1.4.1",
@@ -3018,9 +3018,9 @@
}
},
"regenerator-runtime": {
"version": "0.13.10",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz",
"integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw=="
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"regexpp": {
"version": "3.2.0",

View File

@@ -1,6 +1,6 @@
{
"name": "dicecloud",
"version": "2.0.46",
"version": "2.0.51",
"description": "Unofficial Online Realtime D&D 5e App",
"license": "GPL-3.0",
"repository": {
@@ -20,10 +20,10 @@
"npm": "6.13.x"
},
"dependencies": {
"@babel/runtime": "^7.20.1",
"@babel/runtime": "^7.20.6",
"@chenfengyuan/vue-countdown": "^1.1.5",
"@tozd/vue-observer-utils": "^0.5.0",
"aws-sdk": "^2.1258.0",
"aws-sdk": "^2.1262.0",
"bcrypt": "^5.1.0",
"chroma-js": "^2.4.2",
"css-box-shadow": "^1.0.0-3",
@@ -31,10 +31,10 @@
"ddp-rate-limiter-mixin": "^1.1.10",
"discord.js": "^12.5.3",
"dompurify": "^2.4.1",
"ignore": "^5.2.0",
"ignore": "^5.2.1",
"ignore-styles": "^5.0.1",
"lodash": "^4.17.20",
"marked": "^4.2.2",
"marked": "^4.2.3",
"meteor-node-stubs": "^1.2.5",
"minify-css-string": "^1.0.0",
"moo": "^0.5.2",
@@ -58,8 +58,8 @@
"vuex": "^3.1.3"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.43.0",
"@typescript-eslint/parser": "^5.43.0",
"@typescript-eslint/eslint-plugin": "^5.44.0",
"@typescript-eslint/parser": "^5.44.0",
"@vue/compiler-dom": "^3.2.45",
"chai": "^4.3.7",
"eslint": "^7.32.0",

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 582 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB