The bmannconsulting.com website
1<!-- That file is not particularly elegant. This will need a refactor at some point. -->
2<style>
3
4 {% comment %}
5 content a.internal-link:before {
6 position: relative;
7 content: "[[ ";
8 color: #aaaaaa;
9 }
10
11 content a.internal-link:after {
12 position: relative;
13 content: " ]]";
14 color: #aaaaaa;
15 }
16 {% endcomment %}
17
18 #tooltip-wrapper {
19 background: white;
20 padding: 1em;
21 border: 1px solid #ddd;
22 border-radius: 4px;
23 overflow: hidden;
24 position: absolute;
25 width: 400px;
26 height: 250px;
27 font-size: 0.8em;
28 box-shadow: 0 5px 10px rgba(0,0,0,0.1);
29 opacity: 0;
30 transition: opacity 100ms;
31 }
32
33 #tooltip-wrapper:after {
34 content: "";
35 position: absolute;
36 z-index: 1;
37 bottom: 0;
38 left: 0;
39 pointer-events: none;
40 background-image: linear-gradient(to bottom, rgba(255,255,255, 0), rgba(255,255,255, 1) 90%);
41 width: 100%;
42 height: 75px;
43 }
44</style>
45
46<div style="opacity: 0; display: none;" id='tooltip-wrapper'>
47 <div id='tooltip-content'>
48 </div>
49</div>
50
51<iframe style="display: none; height: 0; width: 0;" id='link-preview-iframe' src="">
52</iframe>
53
54<script>
55 var opacityTimeout;
56 var contentTimeout;
57 var transitionDurationMs = 100;
58
59 var iframe = document.getElementById('link-preview-iframe')
60 var tooltipWrapper = document.getElementById('tooltip-wrapper')
61 var tooltipContent = document.getElementById('tooltip-content')
62
63 var linkHistories = {};
64
65 function hideTooltip() {
66 opacityTimeout = setTimeout(function() {
67 tooltipWrapper.style.opacity = 0;
68 contentTimeout = setTimeout(function() {
69 tooltipContent.innerHTML = '';
70 tooltipWrapper.style.display = 'none';
71 }, transitionDurationMs + 1);
72 }, transitionDurationMs)
73 }
74
75 function showTooltip(event) {
76 var elem = event.target;
77 var elem_props = elem.getClientRects()[elem.getClientRects().length - 1];
78 var top = window.pageYOffset || document.documentElement.scrollTop
79
80 if (event.target.host === window.location.host) {
81 if (!linkHistories[event.target.href]) {
82 iframe.src = event.target.href
83 iframe.onload = function() {
84 tooltipContentHtml = ''
85 tooltipContentHtml += '<div style="font-weight: bold;">' + iframe.contentWindow.document.querySelector('h1').innerHTML + '</div>'
86 tooltipContentHtml += iframe.contentWindow.document.querySelector('content').innerHTML
87
88 tooltipContent.innerHTML = tooltipContentHtml
89 linkHistories[event.target.href] = tooltipContentHtml
90
91 tooltipWrapper.style.display = 'block';
92 setTimeout(function() {
93 tooltipWrapper.style.opacity = 1;
94 }, 1)
95 }
96 } else {
97 tooltipContent.innerHTML = linkHistories[event.target.href]
98 tooltipWrapper.style.display = 'block';
99 setTimeout(function() {
100 tooltipWrapper.style.opacity = 1;
101 }, 1)
102 }
103
104
105 tooltipWrapper.style.left = elem_props.left - (tooltipWrapper.offsetWidth / 2) + (elem_props.width / 2) + "px";
106 if ((window.innerHeight - elem_props.top) < (tooltipWrapper.offsetHeight)) {
107 tooltipWrapper.style.top = elem_props.top + top - tooltipWrapper.offsetHeight - 10 + "px";
108 } else if ((window.innerHeight - elem_props.top) > (tooltipWrapper.offsetHeight)) {
109 tooltipWrapper.style.top = elem_props.top + top + 35 + "px";
110 }
111
112 if ((elem_props.left + (elem_props.width / 2)) < (tooltipWrapper.offsetWidth / 2)) {
113 tooltipWrapper.style.left = "10px";
114 } else if ((document.body.clientWidth - elem_props.left - (elem_props.width / 2)) < (tooltipWrapper.offsetWidth / 2)) {
115 tooltipWrapper.style.left = document.body.clientWidth - tooltipWrapper.offsetWidth - 20 + "px";
116 }
117 }
118 }
119
120 function setupListeners(linkElement) {
121 linkElement.addEventListener('mouseleave', function(_event) {
122 hideTooltip();
123 });
124
125 tooltipWrapper.addEventListener('mouseleave', function(_event) {
126 hideTooltip();
127 });
128
129 linkElement.addEventListener('touchend', function(_event) {
130 hideTooltip();
131 });
132
133 tooltipWrapper.addEventListener('touchend', function(_event) {
134 hideTooltip();
135 });
136
137 linkElement.addEventListener('mouseenter', function(event) {
138 clearTimeout(opacityTimeout);
139 clearTimeout(contentTimeout);
140 showTooltip(event);
141 });
142
143 tooltipWrapper.addEventListener('mouseenter', function(event) {
144 clearTimeout(opacityTimeout);
145 clearTimeout(contentTimeout);
146 });
147 }
148
149 document.querySelectorAll('{{ include.wrapperQuerySelector }} a').forEach(setupListeners);
150</script>