preparing 2018

This commit is contained in:
nek0 2018-01-21 07:12:14 +01:00
parent d9a8c2f178
commit aa08502706
8 changed files with 1541 additions and 19 deletions

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page SYSTEM "http://www.c3d2.de/dtd/c3d2web.dtd">
<page pagetitle="Datenspuren 2017" title="Datenspuren">
<page pagetitle="Datenspuren 2018" title="Datenspuren">
<div title="Datenspuren" itemscope="itemscope" itemtype="http://schema.org/EducationEvent" class="event-page h-event vevent">
<a itemprop="url" href="http://datenspuren.de/2017/"><span itemprop="name" class="name n"><strong>Bloß keine Datenspuren!</strong></span></a>
<div itemprop="description">14. Symposium Datenspuren 2017</div>
<a itemprop="url" href="http://datenspuren.de/2018/"><span itemprop="name" class="name n"><strong><!--Bloß keine Datenspuren!--></strong></span></a>
<div itemprop="description">15. Symposium Datenspuren 2018</div>
<span>
<div>
Datum:
<span itemprop="startDate" content="2017-10-21T12:00" class="dt-start dtstart">21.10.</span> -
<span itemprop="endDate" content="2017-10-22T17:45" class="dt-end dtend">22.10.2017</span>
<span itemprop="startDate" content="2018-10-22T12:00" class="dt-start dtstart">22.10.</span> -
<span itemprop="endDate" content="2017-10-23T17:45" class="dt-end dtend">23.10.2018</span>
</div>
<div itemscope="itemscope" itemtype="http://schema.org/Performer" class="">
<div itemscope="itemscope" itemtype="http://schema.org/Organization">
@ -20,9 +20,9 @@
<div>
Ort:
<span itemprop="location" itemscope="itemscope" itemtype="http://schema.org/PostalAddress" class="adr address">
<span class="extended-address">Technische Sammlungen</span>,
<span itemprop="streetAddress" class="street-address">Junghansstraße 1-3</span>,
<span itemprop="postalCode" class="postal-code">01277</span>
<span class="extended-address">Zentralwerk</span>,
<span itemprop="streetAddress" class="street-address">Riesaer Straße 32</span>,
<span itemprop="postalCode" class="postal-code">01127</span>
<span itemprop="addressLocality" class="locality">Dresden</span>
</span>
</div>
@ -33,12 +33,12 @@
</div>
<dl>
<dt>Video-Mitschnitte</dt>
<dd><link href="https://media.ccc.de/c/DS2017">media.ccc.de/c/DS2017</link></dd>
<!--<dt>Video-Mitschnitte</dt>
<dd><link href="https://media.ccc.de/c/DS2018">media.ccc.de/c/DS2018</link></dd>-->
<dt>Infos</dt>
<dd>Wiki: <link>https://wiki.c3d2.de/Datenspuren_2017</link></dd>
<dd>Einreichungen: <link>https://frab.cccv.de/de/DS2017/cfp/</link></dd>
<dd>Lightning Talks: <link>https://pentapad.c3d2.de/p/lt-ds2017</link></dd>
<dd>Wiki: <link>https://wiki.c3d2.de/Datenspuren_2018</link></dd>
<!--<dd>Einreichungen: <link>https://frab.cccv.de/de/DS2018/cfp/</link></dd>-->
<!--<dd>Lightning Talks: <link>https://pentapad.c3d2.de/p/lt-ds2018</link></dd>-->
<!-- <dd>Orga-Wiki: <link>https://wiki.c3d2.de/Datenspuren_2017/Organisation</link></dd>-->
<dt>Chat</dt>
<dd>IRC-Channel <link

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 934 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,173 @@
var poisJson
var currentPosition = {
lat: 51.0420162,
lon: 13.7976983
}
var currentCenter
var geoListeners = []
function POI(info) {
this.info = info
this.lon = info.lon || info.center.lon
this.lat = info.lat || info.center.lat
}
POI.prototype.getDistance = function() {
return WGS84Util.distanceBetween({
coordinates: [this.lon, this.lat]
}, {
coordinates: [currentPosition.lon, currentPosition.lat]
})
}
POI.prototype.makeArrowEl = function() {
var el = $('<div class="geo-arrow"><p class="arrow"><span></span></p><p class="dist"></p></div>')
var update = function() {
var bearing = -180.0 * Math.atan2(
this.lat - currentPosition.lat,
this.lon - currentPosition.lon
) / Math.PI
el.find('.arrow span').css('transform', 'rotate(' + (bearing - (currentPosition.heading || 0)) + 'deg)')
el.find('.arrow span').text(typeof currentPosition.heading === 'number' ?
"➡" : "➢"
)
el.find('.dist').text(formatDistance(this.getDistance()))
}.bind(this)
// Initialize:
update()
// hook onGeo listener
geoListeners.push(update)
return el
}
function onGeo(geo) {
console.log("onGeo", geo)
currentPosition = {
lat: geo.coords.latitude,
lon: geo.coords.longitude,
heading: geo.heading
}
// if distance > 100m to old center (not currentPosition!), reset list
var dist = WGS84Util.distanceBetween({
coordinates: [currentCenter.lon, currentCenter.lat]
}, {
coordinates: [currentPosition.lon, currentPosition.lat]
})
if (dist >= 100) {
if (poisJson)
showPOIs(poisJson)
} else {
// call listeners
geoListeners.forEach(function(f) {
f(currentPosition)
})
}
}
function formatDistance(x) {
if (x >= 1000) {
return (Math.round(x / 100) / 10) + " km"
} else {
return Math.round(x) + " m"
}
}
function makeLink(link) {
var a = $('<a></a>')
a.attr('href', link.indexOf("://") < 0 ? "http://" + link : link)
a.text(link.replace(/^\w+?:\/\//, "").replace(/\/+$/, ""))
return a
}
function showPOIs(json) {
geoListeners = []
var dl = $('#food')
dl.empty()
currentCenter = currentPosition
var pois = json.elements.map(function(info) {
return new POI(info)
}).sort(function(a, b) {
return a.getDistance() - b.getDistance()
})
while(pois.length > 20 && pois[pois.length - 1].getDistance() > 1000) {
pois.pop()
}
pois.forEach(function(poi) {
if (!poi.info.tags.name) {
console.warn("No name:", poi.info)
return // Skip
}
var dt = $('<dt><a></a></dt>')
dt.find('a').
attr('href', "https://www.openstreetmap.org/" + poi.info.type + "/" + poi.info.id).
text(poi.info.tags.name)
if (poi.info.tags.wheelchair == 'yes')
dt.append("<span class='wheelchair'>♿</span>")
if (poi.info.tags['addr:street'] && poi.info.tags['addr:housenumber']) {
var addr = $('<span class="addr"></span>')
addr.text(poi.info.tags['addr:street'] + " " +
poi.info.tags['addr:housenumber'])
dt.append(addr)
}
if (poi.info.tags.website) {
var addr = $('<span class="website"></span>')
addr.append(makeLink(poi.info.tags.website))
dt.append(addr)
}
dt.prepend(poi.makeArrowEl())
dl.append(dt)
if (poi.info.tags.opening_hours) {
poi.info.tags.opening_hours.split(/\s*;\s*/g).forEach(function(range) {
var dd = $('<dd></dd>')
dd.text(range)
dl.append(dd)
})
}
})
}
var h3 = $('<h3 id="foodlocator">Imbißmöglichkeiten anzeigen</h3>')
$('article').append(h3)
$('article').append('<p id="geopos-privacy-hint">Sollte ich in meinem Browser Geopositionsabfragen erlauben? Sie werden lediglich von JavaScript im Browser ausgewertet. Diese Daten werden nicht ins Netz übermittelt. Bei Fehlen wird der Veranstaltungsort als aktueller Standort benutzt.</p>')
var ran = false
h3.click(function() {
if (ran) return
ran = true
navigator.geolocation.getCurrentPosition(function(geo) {
onGeo(geo)
navigator.geolocation.watchPosition(onGeo, null, {
enableHighAccuracy: true
})
})
h3.addClass('expanded')
h3.text("Lade Imbißmöglichkeiten...")
$('#geopos-privacy-hint').remove()
$.ajax({
url: "pois.json",
success: function(json) {
$('article').append('<dl id="food"></dl>')
showPOIs(json)
poisJson = json
h3.text("Imbißmöglichkeiten in der Umgebung")
$('article').append("<p style='margin-top: 1.5em'>Quelle: <a href='https://www.openstreetmap.org/'>OpenStreetMap</a>. Wir ermutigen zur Vervollständigung der Daten dort. Stündlich aktualisiert mithilfe Overpass Turbo.</p>")
},
error: function() {
h3.text("Fehler! Versuch z.B. osm24.eu stattdessen.")
}
})
})

View File

@ -0,0 +1,251 @@
/** @fileOverview Geographic coordinate utilities using WGS84 datum
* @author cs_brandt
* @date 02/25/2013
*/
/** @module wgs84-util */
var WGS84Util = window.WGS84Util = {};
// Semi-Major Axis (Equatorial Radius)
var SEMI_MAJOR_AXIS = 6378137.0;
// First Eccentricity Squared
var ECC_SQUARED = 0.006694380004260827;
/**
* From: Haversine formula - RW Sinnott, "Virtues of the Haversine",
* Sky and Telescope, vol 68, no 2, 1984
*
* @param {object} coordA GeoJSON point
* @param {object} coordB GeoJSON point
* @return {number} the distance from this point to the supplied point, in km
* (using Haversine formula)
*
*/
WGS84Util.distanceBetween = function(coordA, coordB) {
var lat1 = this.degToRad(coordA.coordinates[1]), lon1 = this.degToRad(coordA.coordinates[0]);
var lat2 = this.degToRad(coordB.coordinates[1]), lon2 = this.degToRad(coordB.coordinates[0]);
var dLat = lat2 - lat1;
var dLon = lon2 - lon1;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1) * Math.cos(lat2) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = SEMI_MAJOR_AXIS * c;
return d;
};
/**
* Returns the destination point from this point having travelled the given distance (in m) on the
* given initial bearing (bearing may vary before destination is reached)
*
* see http://williams.best.vwh.net/avform.htm#LL
*
* @param {object} coordA GeoJSON point
* @param {Number} brng: Initial bearing in degrees
* @param {Number} dist: Distance in m
*
* @returns {object} GeoJSON destination point
*/
WGS84Util.destinationPoint = function(coordA, brng, dist) {
dist = typeof(dist) == 'number' ? dist : typeof(dist) == 'string' && dist.trim() != '' ? +dist : NaN;
dist = dist / SEMI_MAJOR_AXIS; // convert dist to angular distance in radians
brng = this.degToRad(brng); //
var lat1 = this.degToRad(coordA.coordinates[1]), lon1 = this.degToRad(coordA.coordinates[0]);
var lat2 = Math.asin( Math.sin(lat1) * Math.cos(dist) +
Math.cos(lat1) * Math.sin(dist) * Math.cos(brng) );
var lon2 = lon1 + Math.atan2(Math.sin(brng) * Math.sin(dist) * Math.cos(lat1),
Math.cos(dist) - Math.sin(lat1) * Math.sin(lat2));
lon2 = (lon2 + 3 * Math.PI) % (2 * Math.PI) - Math.PI; // normalise to -180..+180º
return {
"type": "Point",
"coordinates": [parseFloat(this.radToDeg(lon2).toFixed(10)), parseFloat(this.radToDeg(lat2).toFixed(10))]
};
};
/**
* Conversion from degrees to radians.
*
* @param {number} deg the angle in degrees.
* @return {number} the angle in radians.
*/
WGS84Util.degToRad = function(deg) {
return (deg * (Math.PI / 180.0));
};
/**
* Conversion from radians to degrees.
*
* @param {number} rad the angle in radians.
* @return {number} the angle in degrees.
*/
WGS84Util.radToDeg = function(rad) {
return (180.0 * (rad / Math.PI));
};
/**
* Converts a set of Longitude and Latitude co-ordinates to UTM
* using the WGS84 ellipsoid.
*
* @param {object} ll Object literal with lat and lon properties
* representing the WGS84 coordinate to be converted.
* @return {object} Object literal containing the UTM value with easting,
* northing, zoneNumber and zoneLetter properties, and an optional
* accuracy property in digits. Returns null if the conversion failed.
*/
WGS84Util.LLtoUTM = function(ll) {
var Lat = ll.coordinates[1];
var Long = ll.coordinates[0];
var k0 = 0.9996;
var LongOrigin;
var eccPrimeSquared;
var N, T, C, A, M;
var LatRad = this.degToRad(Lat);
var LongRad = this.degToRad(Long);
var LongOriginRad;
var ZoneNumber;
var zoneLetter = 'N';
// (int)
ZoneNumber = Math.floor((Long + 180) / 6) + 1;
//Make sure the longitude 180.00 is in Zone 60
if (Long === 180) {
ZoneNumber = 60;
}
// Special zone for Norway
if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) {
ZoneNumber = 32;
}
// Special zones for Svalbard
if (Lat >= 72.0 && Lat < 84.0) {
if (Long >= 0.0 && Long < 9.0) {
ZoneNumber = 31;
} else if (Long >= 9.0 && Long < 21.0) {
ZoneNumber = 33;
} else if (Long >= 21.0 && Long < 33.0) {
ZoneNumber = 35;
} else if (Long >= 33.0 && Long < 42.0) {
ZoneNumber = 37;
}
}
LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin
// in middle of
// zone
LongOriginRad = this.degToRad(LongOrigin);
eccPrimeSquared = (ECC_SQUARED) / (1 - ECC_SQUARED);
N = SEMI_MAJOR_AXIS / Math.sqrt(1 - ECC_SQUARED * Math.sin(LatRad) * Math.sin(LatRad));
T = Math.tan(LatRad) * Math.tan(LatRad);
C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad);
A = Math.cos(LatRad) * (LongRad - LongOriginRad);
M = SEMI_MAJOR_AXIS * ((1 - ECC_SQUARED / 4 - 3 * ECC_SQUARED * ECC_SQUARED / 64 - 5 * ECC_SQUARED * ECC_SQUARED * ECC_SQUARED / 256) * LatRad - (3 * ECC_SQUARED / 8 + 3 * ECC_SQUARED * ECC_SQUARED / 32 + 45 * ECC_SQUARED * ECC_SQUARED * ECC_SQUARED / 1024) * Math.sin(2 * LatRad) + (15 * ECC_SQUARED * ECC_SQUARED / 256 + 45 * ECC_SQUARED * ECC_SQUARED * ECC_SQUARED / 1024) * Math.sin(4 * LatRad) - (35 * ECC_SQUARED * ECC_SQUARED * ECC_SQUARED / 3072) * Math.sin(6 * LatRad));
var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0);
var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0)));
if (Lat < 0.0) {
UTMNorthing += 10000000.0; //10000000 meter offset for
// southern hemisphere
zoneLetter = 'S';
}
return {"type": "Feature", "geometry": {"type": "Point", "coordinates": [parseFloat(UTMEasting.toFixed(1)), parseFloat(UTMNorthing.toFixed(1))]}, "properties": {"zoneLetter": zoneLetter, "zoneNumber": ZoneNumber}};
};
/**
* Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience
* class where the Zone can be specified as a single string eg."60N" which
* is then broken down into the ZoneNumber and ZoneLetter.
*
* @param {object} utm An object literal with northing, easting, zoneNumber
* and zoneLetter properties. If an optional accuracy property is
* provided (in meters), a bounding box will be returned instead of
* latitude and longitude.
* @return {object} An object literal containing either lat and lon values
* (if no accuracy was provided), or top, right, bottom and left values
* for the bounding box calculated according to the provided accuracy.
* Returns null if the conversion failed.
*/
WGS84Util.UTMtoLL = function(utm) {
var UTMNorthing = utm.geometry.coordinates[1];
var UTMEasting = utm.geometry.coordinates[0];
var zoneLetter = utm.properties.zoneLetter;
var zoneNumber = utm.properties.zoneNumber;
// check the ZoneNummber is valid
if (zoneNumber < 0 || zoneNumber > 60) {
return null;
}
var k0 = 0.9996;
var eccPrimeSquared;
var e1 = (1 - Math.sqrt(1 - ECC_SQUARED)) / (1 + Math.sqrt(1 - ECC_SQUARED));
var N1, T1, C1, R1, D, M;
var LongOrigin;
var mu, phi1Rad;
// remove 500,000 meter offset for longitude
var x = UTMEasting - 500000.0;
var y = UTMNorthing;
// We must know somehow if we are in the Northern or Southern
// hemisphere, this is the only time we use the letter So even
// if the Zone letter isn't exactly correct it should indicate
// the hemisphere correctly
if (zoneLetter === 'S') {
y -= 10000000.0; // remove 10,000,000 meter offset used
// for southern hemisphere
}
// There are 60 zones with zone 1 being at West -180 to -174
LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin
// in middle of
// zone
eccPrimeSquared = (ECC_SQUARED) / (1 - ECC_SQUARED);
M = y / k0;
mu = M / (SEMI_MAJOR_AXIS * (1 - ECC_SQUARED / 4 - 3 * ECC_SQUARED * ECC_SQUARED / 64 - 5 * ECC_SQUARED * ECC_SQUARED * ECC_SQUARED / 256));
phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu);
// double phi1 = ProjMath.radToDeg(phi1Rad);
N1 = SEMI_MAJOR_AXIS / Math.sqrt(1 - ECC_SQUARED * Math.sin(phi1Rad) * Math.sin(phi1Rad));
T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad);
C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad);
R1 = SEMI_MAJOR_AXIS * (1 - ECC_SQUARED) / Math.pow(1 - ECC_SQUARED * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5);
D = x / (N1 * k0);
var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720);
lat = this.radToDeg(lat);
var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad);
lon = LongOrigin + this.radToDeg(lon);
var result = { "type": "Point", "coordinates": [] };
if (utm.accuracy) {
var topRight = this.UTMtoLL({
northing: utm.northing + utm.accuracy,
easting: utm.easting + utm.accuracy,
zoneLetter: utm.zoneLetter,
zoneNumber: utm.zoneNumber
});
result = {
top: topRight.lat,
right: topRight.lon,
bottom: lat,
left: lon
};
} else {
result.coordinates[0] = parseFloat(lon.toFixed(8));
result.coordinates[1] = parseFloat(lat.toFixed(8));
}
return result;
};

View File

@ -0,0 +1,256 @@
body {
display: flex;
flex-direction: column;
height: 100vh;
margin: 0;
padding: 0;
color: black;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 16px;
}
.wrapper {
flex: 1;
padding: 0 5em 0;
}
#oldds {
background-color: lightgray;
list-style-type: none;
margin: 0 auto;
}
#oldds li {
display: inline;
padding: 0 0.3em;
}
a {
color: blue;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
nav {
}
nav ul {
padding: 0;
}
nav li {
display: inline-block;
text-align: center;
border: 2px solid black;
}
nav li a {
display: inline-block;
width: 123px;
text-decoration: none;
background-color: white;
}
article .center a img {
width: 100%;
}
article dl dd a {
word-wrap: break-word;
}
footer {
text-align: center;
}
#logo img {
width: 100%;
}
.scheduletitle {
clear: both;
}
.schedule thead th {
border-bottom: 3px solid #738588;
}
.schedule td.cell-height1,
.schedule td.cell-height2,
.schedule td.cell-height3,
.schedule td.cell-height4,
.schedule td.cell-height5,
.schedule td.cell-height6,
.schedule td.cell-height7,
.schedule td.cell-height8,
.schedule td.cell-height9,
.schedule td.cell-height10,
.schedule td.cell-height11,
.schedule td.cell-height12,
.schedule td.cell-height13,
.schedule td.cell-height14,
.schedule td.cell-height15,
.schedule td.cell-height16,
.schedule td.cell-height17,
.schedule td.cell-height18,
.schedule td.cell-height19,
.schedule td.cell-height20
{
border: 1px solid #738588;
}
.cell-time {
border-right: 3px solid #738588;
}
.schedule {
border-collapse: collapse;
}
@media (min-width: 768px) {
}
@media (min-width: 1000px) {
#logo {
display: inline-block;
float:right;
padding: 2em;
width: 50%;
}
}
.free-admission {
margin: 1em 0;
color: #ff0000;
font-weight: bold;
/*animation-name: glitch;
animation-duration: 10s;
animation-iteration-count: infinite;*/
/*animation-timing-function: cubic-bezier(.25, .46, .45, .94);*/
transform-origin: 0% 50%;
}
/*@keyframes glitch {
0% {
transform: translate(0)
}
19.9% {
transform: translate(0)
}
20% {
color: #738588;
transform: translate(-4px, 4px)
}
39.9% {
color: #738588;
transform: translate(-4px, 4px)
}
40% {
transform: translate(-4px, -4px)
}
59.9% {
transform: translate(-4px, -4px)
}
60% {
transform: translate(4px, 4px)
}
79.9% {
transform: translate(4px, 4px)
}
80% {
color: #fe0080;
transform: translate(4px, -4px)
}
99.9% {
color: #fe0080;
transform: translate(4px, -4px)
}
}*/
/* Just for pois.js */
#foodlocator {
cursor: pointer;
}
#foordlocator.expanded {
cursor: default;
}
#food dt {
clear: both;
margin-top: 1em;
font-weight: bold;
}
#food dt .wheelchair {
font-size: 120%;
line-height: 1em;
color: #444;
}
#food dt .addr, #food dt .website {
font-weight: normal;
margin-left: 0.8em;
color: #444;
}
#food dd {
color: #444;
font-size: 80%;
margin: 0 0 0 2em;
}
.geo-arrow {
float: left;
clear: left;
margin: 0 0.5em 1.5em 0;
}
.geo-arrow .arrow {
margin: 0;
text-align: center;
font-size: 200%;
font-weight: bold;
line-height: 1em;
}
.geo-arrow .arrow span {
display: inline-block;
}
.geo-arrow .dist {
margin: 0;
text-align: center;
font-size: 70%;
line-height: 1em;
font-weight: 100;
}
.resource {
display: inline-block;
margin: 8px;
padding: 0;
box-sizing: border-box;
/* width: 290px; */
}
.resource h4 {
text-align: center;
margin: 2px 4px;
padding: 0;
font-size: 100%;
font-weight: bold;
}
.resource img {
width: 100%;
}
.resource .links {
margin: 2px 4px;
padding: 0;
list-style-type: none;
text-align: center;
}
.resource .links li {
display: inline-block;
font-size: 80%;
padding: 0 0.5em;
}
.resource .links li .size {
padding: 0 0 0 0.4em;
color: #777;
}

View File

@ -46,12 +46,12 @@
<li>
<a href="about.html">Über</a>
</li>
<li>
<!--<li>
<a href="fahrplan.html">Programm</a>
</li>
<li>
</li>-->
<!--<li>
<a href="location.html">Ort</a>
</li>
</li>-->
<!--
<li>
<a href="help.html">Helfen</a>
@ -66,9 +66,9 @@
</ul>
</nav>
<article>
<div id="logo">
<!--<div id="logo">
<img src="images/logo.svg"></img>
</div>
</div>-->
<xsl:apply-templates/>
</article>
</div>
@ -87,6 +87,7 @@
<li><a href="../2014/">2014</a></li>
<li><a href="../2015/">2015</a></li>
<li><a href="../2016/">2016</a></li>
<li><a href="../2017/">2017</a></li>
</ul>
<div>
<!--a href="licenses.html">Lizenzen</a> | -->