272 lines
No EOL
8.8 KiB
HTML
272 lines
No EOL
8.8 KiB
HTML
<style>
|
|
.interverse{
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
max-width: 90vw;
|
|
}
|
|
|
|
#interverse-details{
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
}
|
|
#interverse-details>*{
|
|
margin:1rem;
|
|
}
|
|
#interverse-details img{
|
|
max-width:20vw;
|
|
max-height:50vh;
|
|
}
|
|
#interverse-resource-groups{
|
|
display: flex;
|
|
flex-direction: row;
|
|
flex-wrap: wrap;
|
|
max-width: 100%;
|
|
justify-content: center;
|
|
}
|
|
#interverse-resource-groups>*{
|
|
margin:1rem;
|
|
}
|
|
|
|
#interverse-groups h3{
|
|
text-align: center;
|
|
font-size:2rem;
|
|
}
|
|
#interverse-resource-groups img{
|
|
|
|
max-height:5rem;
|
|
max-width: 5rem;
|
|
}
|
|
#interverse-resources{
|
|
display: flex;
|
|
flex-direction: row;
|
|
max-width: 100%;
|
|
justify-content: center;
|
|
}
|
|
#interverse-resources>*{
|
|
margin:1rem;
|
|
}
|
|
#interverse-resources img{
|
|
|
|
max-height:5rem;
|
|
max-width: 5rem;
|
|
}
|
|
#interverse-groups{
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
|
|
}
|
|
.interverse-connection-group{
|
|
display:flex;
|
|
flex-direction: row;
|
|
flex-wrap: wrap;
|
|
justify-content: center;
|
|
}
|
|
#interverse-connections{
|
|
display: flex;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
justify-content: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
#interverse-connections>*{
|
|
margin:5px;
|
|
}
|
|
@keyframes glow{
|
|
from {box-shadow: 0rem 0rem 0.25rem transparent;}
|
|
to {box-shadow: 0rem 0rem 1.5rem rgb(7, 129, 229);}
|
|
}
|
|
.interverse-connection-preview{
|
|
|
|
animation: glow 2s alternate;
|
|
animation-iteration-count: infinite;
|
|
border-radius:1.5rem;
|
|
}
|
|
.interverse-connection-preview,.interverse-connection{
|
|
display:flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
margin:1rem;
|
|
}
|
|
.interverse-connection-preview>*{
|
|
margin:1rem;
|
|
}
|
|
a{
|
|
font-weight: bolder;
|
|
}
|
|
.interverse-connection-preview img{
|
|
max-height:15rem;
|
|
max-width: 15rem;
|
|
}
|
|
</style>
|
|
<script src="https://unpkg.com/alpinejs" defer></script>
|
|
<script>
|
|
function fetchback(url,cback){
|
|
fetch(url).then((request)=>request.json()).then((data)=>cback(data));
|
|
}
|
|
function interverse_data(url,cback){
|
|
url = interverse_proxy+"/initial?url="+url
|
|
fetch(url).then((response)=> {
|
|
if (!response.ok){
|
|
return {}
|
|
}
|
|
return response.json();
|
|
}).then((data)=>cback(data))
|
|
|
|
}
|
|
|
|
// https://davidwalsh.name/query-string-javascript
|
|
function getUrlParameter(name) {
|
|
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
|
|
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
|
|
var results = regex.exec(location.search);
|
|
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
|
|
};
|
|
</script>
|
|
<div class="interverse" x-data x-if="Alpine.store('data')">
|
|
<section id="interverse-details">
|
|
<img x-bind:src="Alpine.store('data')['image']">
|
|
<div id="interverse-contact">
|
|
<h1 x-text="Alpine.store('data')['name']"></h1>
|
|
|
|
<a x-bind:href="Alpine.store('data')['location']" x-text="Alpine.store('data')['location']"></a>
|
|
<template x-for="key in Object.keys(Alpine.store('data')['contact'])">
|
|
<p>
|
|
<strong x-text="key"></strong>
|
|
<span x-text="Alpine.store('data')['contact'][key]"></span>
|
|
</p>
|
|
</template>
|
|
</div>
|
|
</section>
|
|
<section id="interverse-resource-groups">
|
|
<template x-for="(group,name) in Alpine.store('data')['resource_groups']">
|
|
<div class="interverse-resource">
|
|
<h1 x-text="name"></h1>
|
|
<section class="interverse-group">
|
|
<template x-for="resource in group">
|
|
<a x-bind:href="resource['location']">
|
|
<div class="interverse-resource">
|
|
<template x-if="resource['icon'] !=''">
|
|
<img class="interverse-resource-icon" x-bind:src="resource['icon']">
|
|
</template>
|
|
<h2 x-text="resource['label']"></h2>
|
|
<p x-text="resource['description']"></p>
|
|
</div>
|
|
</a>
|
|
</template>
|
|
</section>
|
|
</div>
|
|
</template>
|
|
</section>
|
|
<div id="interverse-resources">
|
|
<template x-for="resource in Alpine.store('data')['resources']">
|
|
<a x-bind:href="resource['location']">
|
|
<div class="interverse-resource">
|
|
<template x-if="resource['icon'] !=''">
|
|
<img class="interverse-resource-icon" x-bind:src="resource['icon']">
|
|
</template>
|
|
<h2 x-text="resource['label']"></h2>
|
|
<p x-text="resource['description']"></p>
|
|
</div>
|
|
</a>
|
|
</template>
|
|
</div>
|
|
<div id="interverse-groups">
|
|
<template x-for="(group,name) in Alpine.store('data')['connection_groups']">
|
|
<div>
|
|
<h3 x-text="name"></h3>
|
|
<div class="interverse-connection-group">
|
|
<template x-for="link in group">
|
|
<div class="interverse-connection" x-data="{connected:false">
|
|
<template x-if="Alpine.store(link)['name'] !=''">
|
|
<div class='interverse-connection-preview'
|
|
x-on:click="initialize(link)">
|
|
<h3 x-text="Alpine.store(link)['name']"></h3>
|
|
<img x-bind:src="Alpine.store(link)['image']">
|
|
<a x-bind:href="link" x-text="link"></a>
|
|
</div>
|
|
</template>
|
|
<template x-if="Alpine.store(link) == undefined">
|
|
<div>
|
|
<a x-bind:href="link" x-text="link">
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
</div>
|
|
</template>
|
|
</div>
|
|
|
|
</div>
|
|
</template>
|
|
</div>
|
|
<div id="interverse-connections">
|
|
<template x-for="connection in Alpine.store('data')['connections']">
|
|
<div class="interverse-connection">
|
|
<template x-if="Alpine.store(connection)['name']">
|
|
<div x-on:click="initialize(connection)" class='interverse-connection-preview'>
|
|
<h3 x-text="Alpine.store(connection)['name']"></h3>
|
|
<template x-if="Alpine.store(connection)['image']!=''">
|
|
<img x-bind:src="Alpine.store(connection)['image']">
|
|
</template>
|
|
</div>
|
|
</template>
|
|
<template x-if="Alpine.store(link) == undefined">
|
|
<a x-bind:href="connection" x-text="connection"></a>
|
|
</template>
|
|
|
|
</div>>
|
|
</template>
|
|
</div>
|
|
<div id="interverse-contact">
|
|
<template x-for="contact in Alpine.store('data')['contact']">
|
|
<div class="interverse-contact">
|
|
|
|
</div>
|
|
|
|
</template>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script>
|
|
var t = new Date();
|
|
var timestamp = t.getTime();
|
|
var main_url = window.location.host;
|
|
var interverse_proxy="http://localhost:5000"
|
|
if (getUrlParameter("url")) {
|
|
main_url = getUrlParameter("url")
|
|
}
|
|
document.addEventListener('alpine:init', function () {
|
|
initialize(main_url);
|
|
});
|
|
|
|
/*
|
|
Alpine.store('data',data['main'])
|
|
for (c in data['connections']){
|
|
Alpine.store(c,data['connections'][c])
|
|
}
|
|
*/
|
|
|
|
function initialize(url) {
|
|
Alpine.store("data", {});
|
|
fetchback("https://"+url+'/.well-known/interverse',function(data){
|
|
if (data['name']){
|
|
Alpine.store('data',data);
|
|
}
|
|
});
|
|
interverse_data(url.replace("https://",'').replace('http://','').replace('/',''), function (data) {
|
|
console.log("Initializing interverse...")
|
|
Alpine.store('data',data);
|
|
});
|
|
fetchback(interverse_proxy+'/complete?url='+url.replace("https://",'').replace('http://','').replace('/',''),function(data){
|
|
for (c in data['connections']){
|
|
Alpine.store(c,data['connections'][c])
|
|
}
|
|
});
|
|
}
|
|
</script> |