diff --git a/src/components/features/Achievement.vue b/src/components/features/Achievement.vue index 9fad1be..9fc1ab9 100644 --- a/src/components/features/Achievement.vue +++ b/src/components/features/Achievement.vue @@ -1,5 +1,5 @@ <template> - <tooltip v-if="achievement.unlocked" :text="tooltip"> + <tooltip v-if="achievement.unlocked" :display="tooltip"> <div :style="style" :class="{ [layer || tab.layer]: true, feature: true, achievement: true, locked: !achievement.earned, bought: achievement.earned }"> diff --git a/src/components/features/RespecButton.vue b/src/components/features/RespecButton.vue index e8a628b..cba4570 100644 --- a/src/components/features/RespecButton.vue +++ b/src/components/features/RespecButton.vue @@ -1,6 +1,6 @@ <template> <div style="display: flex"> - <tooltip text="Disable respec confirmation"> + <tooltip display="Disable respec confirmation"> <Toggle :value="confirmRespec" @change="setConfirmRespec" /> </tooltip> <button @click="respec" :class="{ feature: true, respec: true, can: unlocked, locked: !unlocked }" diff --git a/src/components/fields/Slider.vue b/src/components/fields/Slider.vue index 96f2d36..5df7287 100644 --- a/src/components/fields/Slider.vue +++ b/src/components/fields/Slider.vue @@ -1,7 +1,7 @@ <template> <div class="field"> <span class="field-title" v-if="title">{{ title }}</span> - <tooltip :text="`${value}`" :class="{ fullWidth: !title }"> + <tooltip :display="`${value}`" :class="{ fullWidth: !title }"> <input type="range" :value="value" @input="e => $emit('change', parseInt(e.target.value))" :min="min" :max="max" /> </tooltip> </div> diff --git a/src/components/system/Nav.vue b/src/components/system/Nav.vue index 983807b..dd84a2a 100644 --- a/src/components/system/Nav.vue +++ b/src/components/system/Nav.vue @@ -3,7 +3,7 @@ <div class="nav" v-if="useHeader"> <img v-if="banner" :src="banner" height="100%" :alt="title" /> <div v-else class="title">{{ title }}</div> - <div class="version" @click="openDialog('Changelog')">v{{ version }}</div> + <tooltip display="Changelog" bottom><div class="version" @click="openDialog('Changelog')">v{{ version }}</div></tooltip> <div style="flex-grow: 1"></div> <div class="discord"> <img src="images/discord.png" @click="window.open(discordLink, 'mywindow')" /> @@ -16,9 +16,15 @@ <li><a href="http://discord.gg/wwQfgPa" target="_blank">Jacorb's Games</a></li> </ul> </div> - <div class="info" @click="openDialog('Info')"><br/>i</div> - <img class="options" src="images/options_wheel.png" @click="openDialog('Saves')" /> - <img class="options" src="images/options_wheel.png" @click="openDialog('Options')" /> + <tooltip display="<span>Info</span>" bottom yoffset="4px"> + <div class="info" @click="openDialog('Info')"><br/>i</div> + </tooltip> + <tooltip display="Saves" bottom xoffset="-24px" style="margin-top: 6px"> + <div class="material-icons saves" @click="openDialog('Saves')">library_books</div> + </tooltip> + <tooltip display="<span>Options</span>" bottom xoffset="-64px" yoffset="-8px"> + <img class="options" src="images/options_wheel.png" @click="openDialog('Options')" /> + </tooltip> </div> <div v-else> <div class="discord overlay"> @@ -33,9 +39,18 @@ </ul> </div> <div class="info overlay" @click="openDialog('Info')"><br/>i</div> - <img class="options overlay" src="images/options_wheel.png" @click="openDialog('Saves')" /> - <img class="options overlay" src="images/options_wheel.png" @click="openDialog('Options')" /> - <div class="version overlay" @click="openDialog('Changelog')">v{{ version }}</div> + <tooltip display="<span>Info</span>" right> + <img class="options overlay" src="images/options_wheel.png" @click="openDialog('Saves')" /> + </tooltip> + <tooltip display="Saves" right> + <div class="material-icons saves overlay" @click="openDialog('Saves')">library_books</div> + </tooltip> + <tooltip display="<span>Options</span>" right> + <img class="options overlay" src="images/options_wheel.png" @click="openDialog('Options')" /> + </tooltip> + <tooltip display="Changelog" right> + <div class="version overlay" @click="openDialog('Changelog')">v{{ version }}</div> + </tooltip> </div> <Info :show="showInfo" @openDialog="openDialog" @closeDialog="closeDialog" /> <SavesManager :show="showSaves" @closeDialog="closeDialog" /> @@ -68,6 +83,7 @@ export default { }, openDialog(dialog) { this[`show${dialog}`] = true; + console.log(`show${dialog}`, this[`show${dialog}`]); }, closeDialog(dialog) { this[`show${dialog}`] = false; @@ -166,6 +182,17 @@ export default { -3px 0 12px var(--link); } + .saves { + font-size: 36px; + cursor: pointer; + } + + .saves:hover { + transform: scale(1.2, 1.2); + text-shadow: 5px 0 10px var(--color), + -3px 0 12px var(--color); + } + .options { height: 50px; width: 50px; @@ -184,9 +211,6 @@ export default { } .version { - margin-left: 12px; - margin-right: 12px; - margin-bottom: 5px; color: var(--points); cursor: pointer; } @@ -201,4 +225,10 @@ export default { transform: scale(1.2, 1.2); text-shadow: 5px 0 10px var(--points), -3px 0 12px var(--points); } + + .nav > .title + .tooltip-container { + margin-left: 12px; + margin-right: 12px; + margin-bottom: 5px; + } </style> diff --git a/src/components/system/Tooltip.vue b/src/components/system/Tooltip.vue index a668e9a..df9d93f 100644 --- a/src/components/system/Tooltip.vue +++ b/src/components/system/Tooltip.vue @@ -1,115 +1,143 @@ <template> - <div :tooltip="text"> + <div class="tooltip-container" :class="{ force }"> + <div class="tooltip" :class="{ top, left, right, bottom }" + :style="{ '--xoffset': xoffset, '--yoffset': yoffset }"> + <component :is="tooltipDisplay" /> + </div> <slot /> </div> </template> <script> +import { coerceComponent } from '../../util/vue'; + export default { name: 'tooltip', props: { - text: String + force: Boolean, + display: String, + top: Boolean, + left: Boolean, + right: Boolean, + bottom: Boolean, + xoffset: String, + yoffset: String + }, + computed: { + tooltipDisplay() { + return coerceComponent(this.display); + } + }, + provide: { + tab() { + return {}; + } } }; </script> <style scoped> -[tooltip] { - position: relative; +.tooltip-container { + position: relative; + --xoffset: 0px; + --yoffset: 0px; } -[tooltip]:before, -[tooltip]:after { - visibility: hidden; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=0); - opacity: 0; +.tooltip, .tooltip::after { pointer-events: none; - white-space: pre-wrap; + position: absolute; +} + +.tooltip { + text-align: center; + width: 150px; + font-size: 14px; + line-height: 1.2; + bottom: calc(100% + var(--yoffset)); + left: calc(50% + var(--xoffset)); + margin-bottom: 5px; + transform: translateX(-50%); + padding: 7px; + border-radius: 3px; + opacity: 0; + background-color: var(--background-tooltip); + color: var(--points); +} + +.tooltip-container:hover, +.force { + z-index: 1; +} + +.tooltip-container:hover > .tooltip, +.force > .tooltip { + opacity: 1; z-index: 100 !important; } -[tooltip]:before { - position: absolute; - bottom: 100%; - left: 50%; - margin-bottom: 5px; - margin-left: -80px; - padding: 7px; - width: 160px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - background-color: var(--background-tooltip); - color: var(--points); - content: attr(tooltip); - text-align: center; - font-size: 14px; - line-height: 1.2; - white-space: pre-wrap; -} - -[tooltip]:after { - position: absolute; - bottom: 100%; - left: 50%; - margin-left: -5px; - width: 0; - border-top: 5px solid var(--background-tooltip); - border-right: 5px solid transparent; - border-left: 5px solid transparent; +.tooltip::after { content: " "; - font-size: 0; - line-height: 0; - white-space: pre-wrap; + position: absolute; + top: 100%; + bottom: 100%; + left: calc(50% - var(--xoffset)); + width: 0; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: var(--background-tooltip) transparent transparent transparent; } -[tooltip]:hover:before, -[tooltip].forceTooltip:before, -[tooltip]:hover:after, -[tooltip].forceTooltip:after { - animation: tooltip 0.25s linear 1; - animation-fill-mode: forwards; - white-space: pre-wrap; -} - -@keyframes tooltip { - 0% { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=0); - opacity: 0; - visibility: hidden; - } - 100% { - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; - filter: progid: DXImageTransform.Microsoft.Alpha(Opacity=100); - opacity: 1; - visibility: visible; - } -} - -.tooltip-left[tooltip]:before, -.side-nodes [tooltip]:before { - bottom: unset; +.tooltip.left, +.side-nodes .tooltip:not(.right):not(.bottom):not(.top) { + bottom: calc(50% + var(--yoffset)); left: unset; - right: 100%; - top: 50%; - margin-left: unset; + right: calc(100% + var(--xoffset)); margin-bottom: unset; margin-right: 5px; - transform: translateY(-50%); + transform: translateY(50%); } -.tooltip-left[tooltip]:after, -.side-nodes [tooltip]:after { +.tooltip.left::after, +.side-nodes .tooltip:not(.right):not(.bottom):not(.top)::after { + top: calc(50% + var(--yoffset)); bottom: unset; - left: unset; + left: 100%; right: 100%; - top: 50%; - transform: translateY(-50%); - border-left: 5px solid var(--background-tooltip); - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: unset; + margin-left: unset; + margin-top: -5px; + border-color: transparent transparent transparent var(--background-tooltip); +} + +.tooltip.right { + bottom: calc(50% + var(--yoffset)); + left: calc(100% + var(--xoffset)); + margin-bottom: unset; + margin-left: 5px; + transform: translateY(50%); +} + +.tooltip.right::after { + top: calc(50% + var(--yoffset)); + left: 0; + right: 100%; + margin-left: -10px; + margin-top: -5px; + border-color: transparent var(--background-tooltip) transparent transparent; +} + +.tooltip.bottom { + top: calc(100% + var(--yoffset)); + bottom: unset; + left: calc(50% + var(--xoffset)); + margin-bottom: unset; + margin-top: 5px; + transform: translateX(-50%); +} + +.tooltip.bottom::after { + top: 0; + margin-top: -10px; + border-color: transparent transparent var(--background-tooltip) transparent; } </style> diff --git a/src/components/tree/Branches.vue b/src/components/tree/Branches.vue index bac73d3..f62699f 100644 --- a/src/components/tree/Branches.vue +++ b/src/components/tree/Branches.vue @@ -95,7 +95,7 @@ svg, left: 0; width: 100%; height: 100%; - z-index: -1; + z-index: -10; pointer-events: none; } </style> diff --git a/src/components/tree/TreeNode.vue b/src/components/tree/TreeNode.vue index 0ced67f..2a2de9e 100644 --- a/src/components/tree/TreeNode.vue +++ b/src/components/tree/TreeNode.vue @@ -1,6 +1,5 @@ <template> - <tooltip :text="tooltip" :class="{ - forceTooltip, + <tooltip :display="tooltip" :force="forceTooltip" :class="{ ghost: layer.layerShown === 'ghost', treeNode: true, [id]: true,