Updated cards from tuesch changes. Incorporated InteractionMapper memory leak fix.

This commit is contained in:
Severin Opel 2019-08-13 14:31:03 +02:00
parent 03be6673c5
commit 30c7113713
193 changed files with 21151 additions and 474 deletions

566
dist/iwmlib.js vendored
View File

@ -3364,7 +3364,9 @@
} }
close() { close() {
console.log('SCATTER WAS CLOSED!');
this._callCloseCallbacks(); this._callCloseCallbacks();
this._removeCallbacks();
this._removeSelfFromScatterContainer(); this._removeSelfFromScatterContainer();
} }
@ -3374,6 +3376,11 @@
} }
} }
_removeCallbacks() {
this.onClose = [];
this.onTransform = [];
}
_removeSelfFromScatterContainer() { _removeSelfFromScatterContainer() {
// Removes self from container when it's closed. // Removes self from container when it's closed.
if (this.container) { if (this.container) {
@ -7638,8 +7645,6 @@
} }
} }
/** To avoid problems with relative URL paths, we use inline data URI to load svg icons. */
/** /**
* A class that collects static methods to maintain the states and parts of * A class that collects static methods to maintain the states and parts of
* EyeVisit like cards. * EyeVisit like cards.
@ -7650,11 +7655,35 @@
static setup(context, modules = []) { static setup(context, modules = []) {
console.log('Setup Card...', modules); console.log('Setup Card...', modules);
context.modules = []; context.modules = [];
context.module = {};
context.classList.add('info-card');
context.setAttribute('data-id', Card.id++);
modules.forEach(module => { modules.forEach(module => {
if (module.apply(context)) context.modules.push(module.constructor.name); if (module.apply(context)) {
const moduleName = module.constructor.name;
context.modules.push(moduleName);
context.module[moduleName] = module;
}
}); });
} }
static remove(context) {
for (let module of Object.values(context.module)) {
module.remove();
}
}
static eventClose(event) {
let context = this.getContext(event.target);
if (context) {
this.constructor.close(context);
} else console.error('Could not find context!', event.target);
}
/** /**
* *
* *
@ -7662,13 +7691,12 @@
* @param {*} event * @param {*} event
* @memberof Card * @memberof Card
*/ */
static close(event) { static close(context) {
let context = this.getContext(event.target); console.log('CLOSE CARD!!!');
if (context) { this.unregisterAllEvents(context);
if (context.onClose) { if (context.onClose) {
context.onClose(event); context.onClose(event);
} else context.parentNode.removeChild(context); } else context.parentNode.removeChild(context);
} else console.error('Could not find context!', event.target);
} }
/** /**
@ -7680,12 +7708,12 @@
* @param {*} replaceFunc * @param {*} replaceFunc
* @memberof Card * @memberof Card
*/ */
static _replaceAttributes(html, attribute, replaceFunc) { static _replaceAttributes(context, html, attribute, replaceFunc) {
let clickables = html.querySelectorAll(`[${attribute}]`); let clickables = html.querySelectorAll(`[${attribute}]`);
clickables.forEach(element => { clickables.forEach(element => {
let attributeVal = element.getAttribute(attribute); let attributeVal = element.getAttribute(attribute);
element.removeAttribute(attribute); element.removeAttribute(attribute);
replaceFunc.call(this, element, attributeVal); replaceFunc.call(this, context, element, attributeVal);
}); });
} }
@ -7699,7 +7727,7 @@
* @returns * @returns
* @memberof Card * @memberof Card
*/ */
static _replaceCallback(element, attributeVal) { static _replaceCallback(context, element, attributeVal) {
if (element.tagName == 'A') { if (element.tagName == 'A') {
element.addEventListener('click', event => { element.addEventListener('click', event => {
event.preventDefault(); event.preventDefault();
@ -7731,7 +7759,7 @@
// These are 'hardcoded' inside the convert.js. // These are 'hardcoded' inside the convert.js.
if (element.tagName == 'circle') return false if (element.tagName == 'circle') return false
InteractionMapper.on(interactionType, element, event => { this.registerEvent(context, interactionType, element, event => {
/** /**
* Replaces the strings from the listener with the cooresponding variables. * Replaces the strings from the listener with the cooresponding variables.
*/ */
@ -7783,6 +7811,13 @@
/<\s*(a|video|img|image|circle)\s(.*?)(xlink:href|href|src)\s*=\s*["'](\..*?)["']\s*(.*?)>/g, /<\s*(a|video|img|image|circle)\s(.*?)(xlink:href|href|src)\s*=\s*["'](\..*?)["']\s*(.*?)>/g,
function(data) { function(data) {
let path = that._getRelativePath(arguments[4]); let path = that._getRelativePath(arguments[4]);
console.log('REPLACE ', arguments[1]);
if (arguments[1] == 'a') {
console.error('NOT REPLACING LINKS');
return ''
}
const tag = `<${arguments[1]} ${arguments[2]} ${arguments[3]}="${path}" ${arguments[5]}>`; const tag = `<${arguments[1]} ${arguments[2]} ${arguments[3]}="${path}" ${arguments[5]}>`;
/* if (that.debug) */ console.log('Adjusted: ', tag); /* if (that.debug) */ console.log('Adjusted: ', tag);
return tag return tag
@ -7979,6 +8014,7 @@
if (this.debug) console.log('Close Popup.', context, popup); if (this.debug) console.log('Close Popup.', context, popup);
window.popup = popup; window.popup = popup;
popup.close(); popup.close();
InteractionMapper.off(popup.element);
this._unsetPopup(context); this._unsetPopup(context);
} else { } else {
console.error('Requested to close popup, but popup was not found.'); console.error('Requested to close popup, but popup was not found.');
@ -8348,7 +8384,7 @@
// but for simplicity it's just done here for now. // but for simplicity it's just done here for now.
// TODO: Adjust to load while animating (Problem: Unload when cancelled). // TODO: Adjust to load while animating (Problem: Unload when cancelled).
console.log('loadHighlightPopup', src, position, local); console.log('loadHighlightPopup', src, position, local);
this._loadPopupContent(src) this._loadPopupContent(context, src)
.then(content => { .then(content => {
this._openPopup(context, src, local, content, { this._openPopup(context, src, local, content, {
highlight: node, highlight: node,
@ -8375,14 +8411,14 @@
* @returns {Promise} - Returns a promise, that's resolved when the data is loaded. * @returns {Promise} - Returns a promise, that's resolved when the data is loaded.
* @memberof Card * @memberof Card
*/ */
static _loadPopupContent(source) { static _loadPopupContent(context, source) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest(); let xhr = new XMLHttpRequest();
xhr.open('get', source, true); xhr.open('get', source, true);
xhr.onreadystatechange = () => { xhr.onreadystatechange = () => {
if (xhr.readyState == 4) { if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status == 0) { if (xhr.status == 200 || xhr.status == 0) {
let html = this.postProcessResponseText(xhr.responseText); let html = this.postProcessResponseText(context, xhr.responseText);
let selector = Card.popupHtmlSelector; let selector = Card.popupHtmlSelector;
let content = { html: html.body.innerHTML, selector }; let content = { html: html.body.innerHTML, selector };
resolve(content); resolve(content);
@ -8477,6 +8513,9 @@
let wrapper = this.getContext(node); let wrapper = this.getContext(node);
let zoomable = node.closest('figure'); let zoomable = node.closest('figure');
if (zoomable == null) {
return
}
// load mainimg - if none exists, there is nothing to open // load mainimg - if none exists, there is nothing to open
let img = zoomable.querySelector('.mainimg'); let img = zoomable.querySelector('.mainimg');
@ -8735,18 +8774,18 @@
} }
/** /**
* Closes a zoomable object with animation * Closes an zoomable object with an animation.
* *
* @static * @static
* @param {any} wrapper - the wrapper containing the index card * @param {DOMElement} context - Context of the zoomable.
* @param {any} div - the figure containing the relevant elements * @param {*} zoomable
* @param {any} zoomable - the zoomable element, from which the zoomed figure originates * @param {*} zoomedFig
* @param {any} rect - the target rect for the tween (typically the top left width height of the zoomable)
* @memberof Card * @memberof Card
*/ */
static closeZoomable(context, zoomable, zoomedFig) { static closeZoomable(context, zoomable, zoomedFig) {
if (this.debug) console.log('Close Zoomable', context, zoomable, zoomedFig); if (this.debug) console.log('Close Zoomable', context, zoomable, zoomedFig);
//TODO: Why do I need this check. Shouldn't it be always present?! - SO
if (zoomable) { if (zoomable) {
this._unsetZoomable(context); this._unsetZoomable(context);
let caption = zoomable.querySelector('figcaption.cap'); let caption = zoomable.querySelector('figcaption.cap');
@ -8767,12 +8806,15 @@
TweenLite.set(zoomable, { TweenLite.set(zoomable, {
opacity: 1 opacity: 1
}); });
let div = zoomedFig.parentNode; let div = zoomedFig.parentNode;
let videoElement = div.querySelector('video'); let videoElement = div.querySelector('video');
if (videoElement) videoElement.pause(); if (videoElement) videoElement.pause();
div.parentNode.removeChild(div); div.parentNode.removeChild(div);
} }
}); });
InteractionMapper.off(zoomedFig);
} }
} }
@ -8862,6 +8904,7 @@
rotation: angle rotation: angle
}); });
indexbox.prepend(clone); indexbox.prepend(clone);
clone.setAttribute('data-source', src);
let titlebar = clone.querySelector('.titlebar'); let titlebar = clone.querySelector('.titlebar');
let title = titlebar.querySelector('h2'); let title = titlebar.querySelector('h2');
@ -8886,7 +8929,7 @@
} }
//jquery hyphenate below //jquery hyphenate below
if (typeof $ != 'undefined') { if (this.constructor._jQueryIsPresent()) {
$('.column') $('.column')
.not('.overview') .not('.overview')
.children('p') .children('p')
@ -8941,7 +8984,57 @@
Card._disableCardCloseButton(context); Card._disableCardCloseButton(context);
const closeAnimation = () => { //TODO consider renaming it to something more intuitive.
let iconClone = clone.querySelector('.card-icon');
if (iconClone == null) {
iconClone = clone.querySelector('.cardicon');
console.warn("Legacy selector. Change it to 'card-icon' and find a more suitable name.");
}
if (iconClone.tagName == 'img') {
iconClone.src = iconClone.src.replace('info.svg', 'close.svg');
}
//console.log("ICON: ", iconClone)
iconClone.classList.remove('info');
iconClone.classList.add('close', 'view-button', 'transparent-background');
// We append the icon clone to the subcard-content.
// Then it's always on the content and not on the background
// (If there is one).
if (this.dynamicHeight) {
article.appendChild(iconClone);
}
const eventElements = [indexbox, iconClone, clone];
// Use the 'tap' event for closing.
// Otherwise the subcard cannot be closed,
// when another subcard is touched.
InteractionMapper.on('tap', iconClone, () => {
if (editable) {
let isDirty = mainController.askSaveNode();
if (isDirty) {
mainController.saveNode(html.innerHTML, url => {
callback(url);
this._closeIndexCard(context, card,{
eventElements,
src
});
});
} else {
this._closeIndexCard(context, card);
}
} else {
this._closeIndexCard(context, card);
}
});
}
static _closeIndexCard(context, card, {
eventElements = [],
src = null
} = []) {
//logging //logging
if (src) { if (src) {
let strparts = src.split('/'); let strparts = src.split('/');
@ -8956,7 +9049,7 @@
Card._cleanup(context); Card._cleanup(context);
Card._unsetSubcard(context); Card._unsetSubcard(context);
this._subcardChanged(context, true);
this._enableCardCloseButton(context); this._enableCardCloseButton(context);
let previewTitlebar = card.querySelector('.titlebar'); let previewTitlebar = card.querySelector('.titlebar');
@ -9019,47 +9112,16 @@
titlebar.style.borderBottomWidth = desiredBorderBottomWidth / transform.scaleY + 'px'; titlebar.style.borderBottomWidth = desiredBorderBottomWidth / transform.scaleY + 'px';
} }
}); });
};
//TODO consider renaming it to something more intuitive.
let iconClone = clone.querySelector('.card-icon');
if (iconClone == null) {
iconClone = clone.querySelector('.cardicon');
console.warn("Legacy selector. Change it to 'card-icon' and find a more suitable name.");
} }
if (iconClone.tagName == 'img') { /**
iconClone.src = iconClone.src.replace('info.svg', 'close.svg'); * Tests if jQuery is properly included in the project.
} * Otherwise specific features may not work correctly (e.g. hyphenation)
//console.log("ICON: ", iconClone) */
iconClone.classList.remove('info'); _jQueryIsPresent() {
iconClone.classList.add('close', 'view-button', 'transparent-background'); let jQueryInitialized = typeof $ != 'undefined';
if (!jQueryInitialized) console.error('No jQuery is provided. Specific features may fail.');
// We append the icon clone to the subcard-content. return jQueryInitialized
// Then it's always on the content and not on the background
// (If there is one).
if (this.dynamicHeight) {
article.appendChild(iconClone);
}
// Use the 'tap' event for closing.
// Otherwise the subcard cannot be closed,
// when another subcard is touched.
InteractionMapper.on('tap', iconClone, () => {
if (editable) {
let isDirty = mainController.askSaveNode();
if (isDirty) {
mainController.saveNode(html.innerHTML, url => {
callback(url);
closeAnimation();
});
} else {
closeAnimation();
}
} else {
closeAnimation();
}
});
} }
/** /**
@ -9124,14 +9186,10 @@
xhr.onreadystatechange = () => { xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) { if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
let html = xhr.responseText; let html = xhr.responseText;
let parsedHTML = this.postProcessResponseText(html); let parsedHTML = this.postProcessResponseText(context, html);
// TODO: What is this good for?
// let article = parsedHTML.querySelector('article')
// card.insertAdjacentElement('afterbegin', article)
// TweenLite.set(article, { autoAlpha: 0 })
Card.expandIndexCard(card, parsedHTML, 'article', relativeSource, saveCallback); Card.expandIndexCard(card, parsedHTML, 'article', relativeSource, saveCallback);
this._subcardChanged(context);
} }
}; };
xhr.onerror = () => { xhr.onerror = () => {
@ -9257,7 +9315,8 @@
* @returns * @returns
* @memberof Card * @memberof Card
*/ */
static postProcessResponseText(htmlString) { static postProcessResponseText(context, htmlString) {
console.error('RUN POSTPROCESS');
let editable = this.isEditable(); let editable = this.isEditable();
htmlString = this._adjustRelativeLinks(htmlString); htmlString = this._adjustRelativeLinks(htmlString);
@ -9265,7 +9324,7 @@
let parser = new DOMParser(); let parser = new DOMParser();
let html = parser.parseFromString(htmlString, 'text/html'); let html = parser.parseFromString(htmlString, 'text/html');
if (!editable) { if (!editable) {
this._replaceAttributes(html, 'onclick', this._replaceCallback); this._replaceAttributes(context, html, 'onclick', this._replaceCallback);
} }
let zoomableWrappers = html.querySelectorAll('.svg-wrapper'); let zoomableWrappers = html.querySelectorAll('.svg-wrapper');
zoomableWrappers.forEach(wrapper => { zoomableWrappers.forEach(wrapper => {
@ -9386,7 +9445,7 @@
this._setPopupSource(popup, source); this._setPopupSource(popup, source);
context.popup = popup; context.popup = popup;
if (typeof $ != 'undefined') { if (this.constructor._jQueryIsPresent()) {
//jquery hyphenate below //jquery hyphenate below
console.log('hyphenated popup:', $('span').hyphenate('de')); console.log('hyphenated popup:', $('span').hyphenate('de'));
} }
@ -9485,8 +9544,44 @@
static get relativePath() { static get relativePath() {
return Card._relativePath return Card._relativePath
} }
static getRegisteredEvents(context) {
return context._registeredEvents == null ? [] : context._registeredEvents
} }
/**
* Helper method that registers InteractionMapper events on the info card.
* Those events are saved on the context element. An they are unregistered when the
* card is closed again.
*
* @static
* @param {DOMElement} context - Context of the Card.
* @param {string} types
* @param {DOMElement} element -Element on which the event is registered.
* @param {Function} callback - Function thats called when the event occurs.
* @memberof Card
*/
static registerEvent(context, types, element, callback) {
InteractionMapper.on(types, element, callback);
if (context._registeredEvents == null) context._registeredEvents = [];
if (context._registeredEvents.indexOf(element) == -1) context._registeredEvents.push(element);
}
/**
* Unregisters all events on the infocard.
*
*
* @static
* @param {DomElement} context - Context of the card.
* @memberof Card
*/
static unregisterAllEvents(context) {
let eventElements = this.getRegisteredEvents(context);
InteractionMapper.off(eventElements);
}
}
Card.id = 0;
Card.debug = true; Card.debug = true;
Card._relativePath = ''; Card._relativePath = '';
Card.scatterContainer = null; Card.scatterContainer = null;
@ -10091,7 +10186,7 @@
* *
* @class ScatterCard * @class ScatterCard
*/ */
class ScatterCard extends Card { class ScatterCard$1 extends Card {
/** /**
* TODO: Find a more suitable name. * TODO: Find a more suitable name.
* Adjusts the HTML to work in the new context. * Adjusts the HTML to work in the new context.
@ -10101,7 +10196,7 @@
* @param {*} htmlString * @param {*} htmlString
* @param {*} basePath * @param {*} basePath
* @param {*} [opts={}] * @param {*} [opts={}]
* @memberof Card * @memberof ScatterCard
*/ */
static setup(context, htmlString, { basePath = './', modules = [] } = {}) { static setup(context, htmlString, { basePath = './', modules = [] } = {}) {
context.classList.add('info-card'); context.classList.add('info-card');
@ -10115,7 +10210,7 @@
/** /**
* Conflicts with the FindTarget method of the Abstract scatter. * Conflicts with the FindTarget method of the Abstract scatter.
*/ */
this._replaceAttributes(html, 'onclick', this._replaceCallback); this._replaceAttributes(context, html, 'onclick', this._replaceCallback);
let content = html.querySelector('.mainview'); let content = html.querySelector('.mainview');
context.appendChild(content); context.appendChild(content);
@ -10137,7 +10232,16 @@
element.onClose = callback; element.onClose = callback;
} }
} }
/**
* Removes the close listener from a card element.
*
* @static
* @param {HTMLElement} element - Context of the Card.
* @memberof ScatterCard
*/
static removeOnCloseListener(element) {
element.onClose = null;
}
/** /**
* Creates a scatter for the card and applies the card to it, * Creates a scatter for the card and applies the card to it,
* *
@ -10147,7 +10251,7 @@
* @param {string} [basePath=""] * @param {string} [basePath=""]
* @param {*} [opts={}] * @param {*} [opts={}]
* @returns * @returns
* @memberof Card * @memberof ScatterCard
*/ */
static createCardScatter(html, scatterContainer, { basePath = './', modules = [] } = {}) { static createCardScatter(html, scatterContainer, { basePath = './', modules = [] } = {}) {
let element = document.createElement('div'); let element = document.createElement('div');
@ -10165,6 +10269,42 @@
return element return element
} }
/**
* Closes but NOT removes the scatter element.
*
* The remove must be called separately, it may be used in the close callback
* of the scatter.
*/
static close(context) {
Card.close(context);
if (context['scatter']) {
console.error('CLOSED CARD');
context.scatter.close();
} else {
console.error('Expected a scatter element to close!', this);
}
}
/**
* Cleans up the card.
*
* @static
* @override
* @memberof ScatterCard
*/
static remove(context) {
if (context['scatter']) {
context.scatter = null;
console.error('REMOVED CARD');
} else {
console.error('Expected a scatter element to remove!', this);
}
Card.remove(context);
}
/** /**
*Utility function to create a fully functional card scatter. *Utility function to create a fully functional card scatter.
* *
@ -10204,13 +10344,13 @@
} }
} }
ScatterCard.selectedLanguage = 0; ScatterCard$1.selectedLanguage = 0;
ScatterCard.languages = ['Deutsch', 'English']; ScatterCard$1.languages = ['Deutsch', 'English'];
ScatterCard.languageTags = { ScatterCard$1.languageTags = {
Deutsch: 'de', Deutsch: 'de',
English: 'en' English: 'en'
}; };
ScatterCard.scatterContainer = null; ScatterCard$1.scatterContainer = null;
var CardPlugin = CardPlugin || {}; var CardPlugin = CardPlugin || {};
@ -10360,7 +10500,6 @@
this.fadeAnimationDuration = fadeAnimationDuration; this.fadeAnimationDuration = fadeAnimationDuration;
this.interactionType = interactionType; this.interactionType = interactionType;
} }
get require() { get require() {
return [CardPlugin.LightBox] return [CardPlugin.LightBox]
} }
@ -10606,12 +10745,103 @@
this.className = className; this.className = className;
this.parentSelector = parentSelector; this.parentSelector = parentSelector;
this.interactionType = interactionType; this.interactionType = interactionType;
/*
Speech doesn't stop when page is navigated.
Therefore we do it manually here.
*/
window.addEventListener('beforeunload', () => {
window.speechSynthesis.cancel();
});
// Binding the function beforehand ensures, that the end function is always the same.
this._end = this._end.bind(this);
this._setupUtterance();
this.utterance.addEventListener('end', event => {
this._end();
});
} }
get require() { get require() {
return [CardPlugin.Ui] return [CardPlugin.Ui]
} }
subcardChanged(closed) {
if (this.cardActive) {
this._updateText(closed);
}
}
get cardActive() {
return this.activeUtterance == this.utterance
}
_updateText(ignoreSubcard = false) {
let node = this.context;
let subcard = this.context.querySelector('.mainview > .subcard');
if (ignoreSubcard) {
if (subcard != null) {
let clone = node.cloneNode(true);
let clonedSubcard = clone.querySelector('.mainview > .subcard');
clonedSubcard.parentNode.removeChild(clonedSubcard);
node = clone;
}
} else {
if (subcard) {
let clone = subcard.cloneNode(true);
clone.querySelectorAll('figure').forEach(figure => {
figure.parentNode.removeChild(figure);
});
node = clone;
}
}
let id = this.context.getAttribute('data-id');
let src = this.context.getAttribute('data-source');
let subcardSource = null;
if (subcard != null) {
subcardSource = subcard.getAttribute('data-source');
}
if (!window.speechSynthesis.speaking) {
this._start(node);
Logging.log(`Started speech on card: id:${id} - source: ${src} - subcard: ${subcardSource}`);
} else if (this.cardActive && this._sameText(node)) {
Logging.log(`Stopped speech on card: id:${id} - source: ${src} - subcard: ${subcardSource}`);
this._stop();
} else {
Logging.log(`Updated Text on card: id:${id} - source: ${src} - subcard: ${subcardSource}`);
this._stop()
.then(() => {
this._start(node);
})
.catch(console.error);
}
}
_sameText(node) {
return this.utterance.text == this._cleanupText(node)
}
_setupUtterance() {
this.utterance = new SpeechSynthesisUtterance();
this.utterance.lang = 'de-DE';
}
get require() {
return [CardPlugin.Ui]
}
remove() {
this.button = null;
super.remove();
}
append(context) { append(context) {
let container = context.querySelector(this.parentSelector); let container = context.querySelector(this.parentSelector);
this.button = document.createElement('div'); this.button = document.createElement('div');
@ -10619,115 +10849,97 @@
container.appendChild(this.button); container.appendChild(this.button);
InteractionMapper.on(this.interactionType, this.button, () => { InteractionMapper.on(this.interactionType, this.button, () => {
let subcard = context.querySelector('.mainview > .subcard'); this.speak();
let target = subcard ? subcard : context; });
this.speak(target); this.context.addEventListener('DOMNodeRemoved', event => {
if (
this.context['lastSpeechNode'] == window.speechSynthesis['speechPluginNode'] &&
event.target == this.context
) {
this._stop();
}
}); });
} }
_activate() { _isSameNode(node) {
this._disableActive(); return this.currentText == node.textContent
this.active = this; }
speak() {
/**
* This is a little bit ugly, but imho the most elegant of all dirty solutions.
*
5ht * Within the plugins we have no knowledge of other cards and such. But must differentiate the
* clicks by their corresponding owner. The SpeechUtterance just takes a text and has no knowledge
* about the node that is currently read to the user.
*
* This means, that we can identify same text, but not differentiate same text on different nodes.
* To account for that, we add the node to the speechSynthesis object (#benefitsOfJavaScript) and
* have access to the node, by - let's say - expanding the functionality of the SpeechSynthesis object.
*
* SO -17.07.19
*/
let activeNode = window.speechSynthesis['speechPluginNode'];
this._updateText();
}
async _stop() {
return new Promise(resolve => {
if (this.activeUtterance) {
this.activeUtterance.addEventListener('end', resolve, {
once: true
});
}
window.speechSynthesis.cancel();
})
}
get activeUtterance() {
return window.speechSynthesis['speechPluginUtterance']
}
_end() {
window.speechSynthesis['speechPluginNode'] = null;
window.speechSynthesis['speechPluginUtterance'] = null;
this._deactivateButton();
this.context.classList.remove('speech-plugin-is-reading');
}
_start(node) {
window.speechSynthesis.cancel();
window.speechSynthesis['speechPluginUtterance'] = this.utterance;
window.speechSynthesis['speechPluginNode'] = node;
this.context['lastSpeechNode'] = node;
let cleanText = this._cleanupText(node);
this.utterance.text = cleanText;
window.speechSynthesis.speak(this.utterance);
this._activateButton(); this._activateButton();
this.context.classList.add('speech-plugin-is-reading');
}
_cleanupText(node) {
let text = node.textContent;
text = this._removeShy(text);
return text
}
_removeShy(text) {
return text.replace(/\u00AD/g, '')
} }
_activateButton() { _activateButton() {
if (this.button) this.button.classList.add('active'); if (this.button) this.button.classList.add('active');
} }
_deactivate() {
this._deactivateButton();
}
_deactivateButton() { _deactivateButton() {
if (this.button) this.button.classList.remove('active'); if (this.button) this.button.classList.remove('active');
} }
_isSameNode(node) {
//console.log(this.currentText, node.innerText)
return this.currentText == node.innerText
}
speak(node) {
console.log(this._isSameNode(node));
if (!window.speechSynthesis.speaking) {
console.log('Noone talking!');
this._start(node);
} else if (this._isSameNode(node)) {
console.log('Requested same!');
this._stop();
} else {
console.log('Requested Different!');
this._stop();
this._start(node);
}
}
_disableActive() {
console.log('disableActive:', this.active);
if (this.active) {
this.active._deactivate();
}
}
_start(node) {
this.currentText = node.innerText;
let utterance = new SpeechSynthesisUtterance(node.innerText);
let voices = window.speechSynthesis.getVoices();
console.log(voices);
let voice = voices.filter(val => {
//console.log(val)
return val.name == 'Microsoft Hedda Desktop - German'
})[0];
//console.log(voice)
utterance.voice = voice;
console.log('TALK: ', utterance);
window.speechSynthesis.speak(utterance);
this._activate();
window.speechSynthesis.resume();
utterance.onboundary = () => {
console.log('onboundary', node.innerText);
if (this.currentText.substring(0, 5) != node.innerText.substring(0, 5)) {
console.log('text for speech synth changed!', this.currentText, node.innerText);
this._stop();
}
};
utterance.onend = () => console.log('onend', node.innerText);
utterance.onerror = () => console.log('onerror', node.innerText);
utterance.onmark = () => console.log('onmark', node.innerText);
utterance.onpause = () => console.log('onpause', node.innerText);
utterance.onresume = () => console.log('onresume', node.innerText);
utterance.onstart = () => console.log('onstart', node.innerText);
utterance.onerror = () => console.log('onerror', node.innerText);
}
_stop() {
window.speechSynthesis.cancel();
this.currentText = null;
this._deactivate();
}
get active() {
return this.constructor.active
}
set active(val) {
this.constructor.active = val;
}
get currentText() {
return this.constructor.text
}
set currentText(val) {
this.constructor.text = val;
}
}; };
/* eslint-disable no-unused-vars */ /* eslint-disable no-unused-vars */
@ -10842,7 +11054,7 @@
window.Card = Card; window.Card = Card;
window.CardPlugin = CardPlugin; window.CardPlugin = CardPlugin;
window.CardPluginBase = CardPluginBase; window.CardPluginBase = CardPluginBase;
window.ScatterCard = ScatterCard; window.ScatterCard = ScatterCard$1;
window.Highlight = Highlight$1; window.Highlight = Highlight$1;
window.Theme = Theme; window.Theme = Theme;

7
dist/iwmlib.pixi.js vendored
View File

@ -6979,7 +6979,9 @@
} }
close() { close() {
console.log('SCATTER WAS CLOSED!');
this._callCloseCallbacks(); this._callCloseCallbacks();
this._removeCallbacks();
this._removeSelfFromScatterContainer(); this._removeSelfFromScatterContainer();
} }
@ -6989,6 +6991,11 @@
} }
} }
_removeCallbacks() {
this.onClose = [];
this.onTransform = [];
}
_removeSelfFromScatterContainer() { _removeSelfFromScatterContainer() {
// Removes self from container when it's closed. // Removes self from container when it's closed.
if (this.container) { if (this.container) {

View File

@ -1,3 +1,6 @@
'use strict';
/** To avoid problems with relative URL paths, we use inline data URI to load svg icons. */ /** To avoid problems with relative URL paths, we use inline data URI to load svg icons. */
const closeIconDataURI = `data:image/svg+xml;utf8, const closeIconDataURI = `data:image/svg+xml;utf8,
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
@ -31,11 +34,35 @@ export default class Card {
static setup(context, modules = []) { static setup(context, modules = []) {
console.log('Setup Card...', modules) console.log('Setup Card...', modules)
context.modules = [] context.modules = []
context.module = {}
context.classList.add('info-card')
context.setAttribute('data-id', Card.id++)
modules.forEach(module => { modules.forEach(module => {
if (module.apply(context)) context.modules.push(module.constructor.name) if (module.apply(context)) {
const moduleName = module.constructor.name
context.modules.push(moduleName)
context.module[moduleName] = module
}
}) })
} }
static remove(context) {
for (let module of Object.values(context.module)) {
module.remove()
}
}
static eventClose(event) {
let context = this.getContext(event.target)
if (context) {
this.constructor.close(context)
} else console.error('Could not find context!', event.target)
}
/** /**
* *
* *
@ -43,13 +70,12 @@ export default class Card {
* @param {*} event * @param {*} event
* @memberof Card * @memberof Card
*/ */
static close(event) { static close(context) {
let context = this.getContext(event.target) console.log('CLOSE CARD!!!')
if (context) { this.unregisterAllEvents(context)
if (context.onClose) { if (context.onClose) {
context.onClose(event) context.onClose(event)
} else context.parentNode.removeChild(context) } else context.parentNode.removeChild(context)
} else console.error('Could not find context!', event.target)
} }
/** /**
@ -61,12 +87,12 @@ export default class Card {
* @param {*} replaceFunc * @param {*} replaceFunc
* @memberof Card * @memberof Card
*/ */
static _replaceAttributes(html, attribute, replaceFunc) { static _replaceAttributes(context, html, attribute, replaceFunc) {
let clickables = html.querySelectorAll(`[${attribute}]`) let clickables = html.querySelectorAll(`[${attribute}]`)
clickables.forEach(element => { clickables.forEach(element => {
let attributeVal = element.getAttribute(attribute) let attributeVal = element.getAttribute(attribute)
element.removeAttribute(attribute) element.removeAttribute(attribute)
replaceFunc.call(this, element, attributeVal) replaceFunc.call(this, context, element, attributeVal)
}) })
} }
@ -80,7 +106,7 @@ export default class Card {
* @returns * @returns
* @memberof Card * @memberof Card
*/ */
static _replaceCallback(element, attributeVal) { static _replaceCallback(context, element, attributeVal) {
if (element.tagName == 'A') { if (element.tagName == 'A') {
element.addEventListener('click', event => { element.addEventListener('click', event => {
event.preventDefault() event.preventDefault()
@ -112,7 +138,7 @@ export default class Card {
// These are 'hardcoded' inside the convert.js. // These are 'hardcoded' inside the convert.js.
if (element.tagName == 'circle') return false if (element.tagName == 'circle') return false
InteractionMapper.on(interactionType, element, event => { this.registerEvent(context, interactionType, element, event => {
/** /**
* Replaces the strings from the listener with the cooresponding variables. * Replaces the strings from the listener with the cooresponding variables.
*/ */
@ -164,6 +190,13 @@ export default class Card {
/<\s*(a|video|img|image|circle)\s(.*?)(xlink:href|href|src)\s*=\s*["'](\..*?)["']\s*(.*?)>/g, /<\s*(a|video|img|image|circle)\s(.*?)(xlink:href|href|src)\s*=\s*["'](\..*?)["']\s*(.*?)>/g,
function(data) { function(data) {
let path = that._getRelativePath(arguments[4]) let path = that._getRelativePath(arguments[4])
console.log('REPLACE ', arguments[1])
if (arguments[1] == 'a') {
console.error('NOT REPLACING LINKS')
return ''
}
const tag = `<${arguments[1]} ${arguments[2]} ${arguments[3]}="${path}" ${arguments[5]}>` const tag = `<${arguments[1]} ${arguments[2]} ${arguments[3]}="${path}" ${arguments[5]}>`
/* if (that.debug) */ console.log('Adjusted: ', tag) /* if (that.debug) */ console.log('Adjusted: ', tag)
return tag return tag
@ -361,6 +394,7 @@ export default class Card {
if (this.debug) console.log('Close Popup.', context, popup) if (this.debug) console.log('Close Popup.', context, popup)
window.popup = popup window.popup = popup
popup.close() popup.close()
InteractionMapper.off(popup.element)
this._unsetPopup(context) this._unsetPopup(context)
} else { } else {
console.error('Requested to close popup, but popup was not found.') console.error('Requested to close popup, but popup was not found.')
@ -730,7 +764,7 @@ export default class Card {
// but for simplicity it's just done here for now. // but for simplicity it's just done here for now.
// TODO: Adjust to load while animating (Problem: Unload when cancelled). // TODO: Adjust to load while animating (Problem: Unload when cancelled).
console.log('loadHighlightPopup', src, position, local) console.log('loadHighlightPopup', src, position, local)
this._loadPopupContent(src) this._loadPopupContent(context, src)
.then(content => { .then(content => {
this._openPopup(context, src, local, content, { this._openPopup(context, src, local, content, {
highlight: node, highlight: node,
@ -757,14 +791,14 @@ export default class Card {
* @returns {Promise} - Returns a promise, that's resolved when the data is loaded. * @returns {Promise} - Returns a promise, that's resolved when the data is loaded.
* @memberof Card * @memberof Card
*/ */
static _loadPopupContent(source) { static _loadPopupContent(context, source) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest() let xhr = new XMLHttpRequest()
xhr.open('get', source, true) xhr.open('get', source, true)
xhr.onreadystatechange = () => { xhr.onreadystatechange = () => {
if (xhr.readyState == 4) { if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status == 0) { if (xhr.status == 200 || xhr.status == 0) {
let html = this.postProcessResponseText(xhr.responseText) let html = this.postProcessResponseText(context, xhr.responseText)
let selector = Card.popupHtmlSelector let selector = Card.popupHtmlSelector
let content = { html: html.body.innerHTML, selector } let content = { html: html.body.innerHTML, selector }
resolve(content) resolve(content)
@ -859,6 +893,9 @@ export default class Card {
let wrapper = this.getContext(node) let wrapper = this.getContext(node)
let zoomable = node.closest('figure') let zoomable = node.closest('figure')
if (zoomable == null) {
return
}
// load mainimg - if none exists, there is nothing to open // load mainimg - if none exists, there is nothing to open
let img = zoomable.querySelector('.mainimg') let img = zoomable.querySelector('.mainimg')
@ -1117,18 +1154,18 @@ export default class Card {
} }
/** /**
* Closes a zoomable object with animation * Closes an zoomable object with an animation.
* *
* @static * @static
* @param {any} wrapper - the wrapper containing the index card * @param {DOMElement} context - Context of the zoomable.
* @param {any} div - the figure containing the relevant elements * @param {*} zoomable
* @param {any} zoomable - the zoomable element, from which the zoomed figure originates * @param {*} zoomedFig
* @param {any} rect - the target rect for the tween (typically the top left width height of the zoomable)
* @memberof Card * @memberof Card
*/ */
static closeZoomable(context, zoomable, zoomedFig) { static closeZoomable(context, zoomable, zoomedFig) {
if (this.debug) console.log('Close Zoomable', context, zoomable, zoomedFig) if (this.debug) console.log('Close Zoomable', context, zoomable, zoomedFig)
//TODO: Why do I need this check. Shouldn't it be always present?! - SO
if (zoomable) { if (zoomable) {
this._unsetZoomable(context) this._unsetZoomable(context)
let caption = zoomable.querySelector('figcaption.cap') let caption = zoomable.querySelector('figcaption.cap')
@ -1149,12 +1186,15 @@ export default class Card {
TweenLite.set(zoomable, { TweenLite.set(zoomable, {
opacity: 1 opacity: 1
}) })
let div = zoomedFig.parentNode let div = zoomedFig.parentNode
let videoElement = div.querySelector('video') let videoElement = div.querySelector('video')
if (videoElement) videoElement.pause() if (videoElement) videoElement.pause()
div.parentNode.removeChild(div) div.parentNode.removeChild(div)
} }
}) })
InteractionMapper.off(zoomedFig)
} }
} }
@ -1244,6 +1284,7 @@ export default class Card {
rotation: angle rotation: angle
}) })
indexbox.prepend(clone) indexbox.prepend(clone)
clone.setAttribute('data-source', src)
let titlebar = clone.querySelector('.titlebar') let titlebar = clone.querySelector('.titlebar')
let title = titlebar.querySelector('h2') let title = titlebar.querySelector('h2')
@ -1268,7 +1309,7 @@ export default class Card {
} }
//jquery hyphenate below //jquery hyphenate below
if (typeof $ != 'undefined') { if (this.constructor._jQueryIsPresent()) {
$('.column') $('.column')
.not('.overview') .not('.overview')
.children('p') .children('p')
@ -1323,7 +1364,67 @@ export default class Card {
Card._disableCardCloseButton(context) Card._disableCardCloseButton(context)
const closeAnimation = () => { //TODO consider renaming it to something more intuitive.
let iconClone = clone.querySelector('.card-icon')
if (iconClone == null) {
iconClone = clone.querySelector('.cardicon')
console.warn("Legacy selector. Change it to 'card-icon' and find a more suitable name.")
}
if (iconClone.tagName == 'img') {
iconClone.src = iconClone.src.replace('info.svg', 'close.svg')
}
//console.log("ICON: ", iconClone)
iconClone.classList.remove('info')
iconClone.classList.add('close', 'view-button', 'transparent-background')
// We append the icon clone to the subcard-content.
// Then it's always on the content and not on the background
// (If there is one).
if (this.dynamicHeight) {
article.appendChild(iconClone)
}
if (enableNearestNeighborTaps) {
//look for nearby popups on tap
InteractionMapper.on('tap', indexbox, () => {
console.log('Tap handler called', editable)
if (!editable) {
this.findNearbyPopups(event, card)
}
})
}
const eventElements = [indexbox, iconClone, clone]
// Use the 'tap' event for closing.
// Otherwise the subcard cannot be closed,
// when another subcard is touched.
InteractionMapper.on('tap', iconClone, () => {
if (editable) {
let isDirty = mainController.askSaveNode()
if (isDirty) {
mainController.saveNode(html.innerHTML, url => {
callback(url)
this._closeIndexCard(context, card,{
eventElements,
src
})
})
} else {
this._closeIndexCard(context, card)
}
} else {
this._closeIndexCard(context, card)
}
})
}
static _closeIndexCard(context, card, {
eventElements = [],
src = null
} = []) {
//logging //logging
if (src) { if (src) {
let strparts = src.split('/') let strparts = src.split('/')
@ -1338,7 +1439,7 @@ export default class Card {
Card._cleanup(context) Card._cleanup(context)
Card._unsetSubcard(context) Card._unsetSubcard(context)
this._subcardChanged(context, true)
this._enableCardCloseButton(context) this._enableCardCloseButton(context)
let previewTitlebar = card.querySelector('.titlebar') let previewTitlebar = card.querySelector('.titlebar')
@ -1403,55 +1504,14 @@ export default class Card {
}) })
} }
//TODO consider renaming it to something more intuitive. /**
let iconClone = clone.querySelector('.card-icon') * Tests if jQuery is properly included in the project.
* Otherwise specific features may not work correctly (e.g. hyphenation)
if (iconClone == null) { */
iconClone = clone.querySelector('.cardicon') _jQueryIsPresent() {
console.warn("Legacy selector. Change it to 'card-icon' and find a more suitable name.") let jQueryInitialized = typeof $ != 'undefined'
} if (!jQueryInitialized) console.error('No jQuery is provided. Specific features may fail.')
return jQueryInitialized
if (iconClone.tagName == 'img') {
iconClone.src = iconClone.src.replace('info.svg', 'close.svg')
}
//console.log("ICON: ", iconClone)
iconClone.classList.remove('info')
iconClone.classList.add('close', 'view-button', 'transparent-background')
// We append the icon clone to the subcard-content.
// Then it's always on the content and not on the background
// (If there is one).
if (this.dynamicHeight) {
article.appendChild(iconClone)
}
if (enableNearestNeighborTaps) {
//look for nearby popups on tap
InteractionMapper.on('tap', indexbox, () => {
console.log('Tap handler called', editable)
if (!editable) {
this.findNearbyPopups(event, card)
}
})
}
// Use the 'tap' event for closing.
// Otherwise the subcard cannot be closed,
// when another subcard is touched.
InteractionMapper.on('tap', iconClone, () => {
if (editable) {
let isDirty = mainController.askSaveNode()
if (isDirty) {
mainController.saveNode(html.innerHTML, url => {
callback(url)
closeAnimation()
})
} else {
closeAnimation()
}
} else {
closeAnimation()
}
})
} }
/** /**
@ -1516,14 +1576,10 @@ export default class Card {
xhr.onreadystatechange = () => { xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) { if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
let html = xhr.responseText let html = xhr.responseText
let parsedHTML = this.postProcessResponseText(html) let parsedHTML = this.postProcessResponseText(context, html)
// TODO: What is this good for?
// let article = parsedHTML.querySelector('article')
// card.insertAdjacentElement('afterbegin', article)
// TweenLite.set(article, { autoAlpha: 0 })
Card.expandIndexCard(card, parsedHTML, 'article', relativeSource, saveCallback) Card.expandIndexCard(card, parsedHTML, 'article', relativeSource, saveCallback)
this._subcardChanged(context)
} }
} }
xhr.onerror = () => { xhr.onerror = () => {
@ -1649,7 +1705,8 @@ export default class Card {
* @returns * @returns
* @memberof Card * @memberof Card
*/ */
static postProcessResponseText(htmlString) { static postProcessResponseText(context, htmlString) {
console.error('RUN POSTPROCESS')
let editable = this.isEditable() let editable = this.isEditable()
htmlString = this._adjustRelativeLinks(htmlString) htmlString = this._adjustRelativeLinks(htmlString)
@ -1657,7 +1714,7 @@ export default class Card {
let parser = new DOMParser() let parser = new DOMParser()
let html = parser.parseFromString(htmlString, 'text/html') let html = parser.parseFromString(htmlString, 'text/html')
if (!editable) { if (!editable) {
this._replaceAttributes(html, 'onclick', this._replaceCallback) this._replaceAttributes(context, html, 'onclick', this._replaceCallback)
} }
let zoomableWrappers = html.querySelectorAll('.svg-wrapper') let zoomableWrappers = html.querySelectorAll('.svg-wrapper')
zoomableWrappers.forEach(wrapper => { zoomableWrappers.forEach(wrapper => {
@ -1778,7 +1835,7 @@ export default class Card {
this._setPopupSource(popup, source) this._setPopupSource(popup, source)
context.popup = popup context.popup = popup
if (typeof $ != 'undefined') { if (this.constructor._jQueryIsPresent()) {
//jquery hyphenate below //jquery hyphenate below
console.log('hyphenated popup:', $('span').hyphenate('de')) console.log('hyphenated popup:', $('span').hyphenate('de'))
} }
@ -1877,8 +1934,44 @@ export default class Card {
static get relativePath() { static get relativePath() {
return Card._relativePath return Card._relativePath
} }
static getRegisteredEvents(context) {
return context._registeredEvents == null ? [] : context._registeredEvents
} }
/**
* Helper method that registers InteractionMapper events on the info card.
* Those events are saved on the context element. An they are unregistered when the
* card is closed again.
*
* @static
* @param {DOMElement} context - Context of the Card.
* @param {string} types
* @param {DOMElement} element -Element on which the event is registered.
* @param {Function} callback - Function thats called when the event occurs.
* @memberof Card
*/
static registerEvent(context, types, element, callback) {
InteractionMapper.on(types, element, callback)
if (context._registeredEvents == null) context._registeredEvents = []
if (context._registeredEvents.indexOf(element) == -1) context._registeredEvents.push(element)
}
/**
* Unregisters all events on the infocard.
*
*
* @static
* @param {DomElement} context - Context of the card.
* @memberof Card
*/
static unregisterAllEvents(context) {
let eventElements = this.getRegisteredEvents(context)
InteractionMapper.off(eventElements)
}
}
Card.id = 0
Card.debug = true Card.debug = true
Card._relativePath = '' Card._relativePath = ''
Card.scatterContainer = null Card.scatterContainer = null

View File

@ -146,7 +146,6 @@ CardPlugin.EnlargeableThumbnail = class EnlargeableThumbnail extends CardPluginB
this.fadeAnimationDuration = fadeAnimationDuration this.fadeAnimationDuration = fadeAnimationDuration
this.interactionType = interactionType this.interactionType = interactionType
} }
get require() { get require() {
return [CardPlugin.LightBox] return [CardPlugin.LightBox]
} }
@ -392,12 +391,103 @@ CardPlugin.Speech = class SpeechPlugin extends CardPluginBase {
this.className = className this.className = className
this.parentSelector = parentSelector this.parentSelector = parentSelector
this.interactionType = interactionType this.interactionType = interactionType
/*
Speech doesn't stop when page is navigated.
Therefore we do it manually here.
*/
window.addEventListener('beforeunload', () => {
window.speechSynthesis.cancel()
})
// Binding the function beforehand ensures, that the end function is always the same.
this._end = this._end.bind(this)
this._setupUtterance()
this.utterance.addEventListener('end', event => {
this._end()
})
} }
get require() { get require() {
return [CardPlugin.Ui] return [CardPlugin.Ui]
} }
subcardChanged(closed) {
if (this.cardActive) {
this._updateText(closed)
}
}
get cardActive() {
return this.activeUtterance == this.utterance
}
_updateText(ignoreSubcard = false) {
let node = this.context
let subcard = this.context.querySelector('.mainview > .subcard')
if (ignoreSubcard) {
if (subcard != null) {
let clone = node.cloneNode(true)
let clonedSubcard = clone.querySelector('.mainview > .subcard')
clonedSubcard.parentNode.removeChild(clonedSubcard)
node = clone
}
} else {
if (subcard) {
let clone = subcard.cloneNode(true)
clone.querySelectorAll('figure').forEach(figure => {
figure.parentNode.removeChild(figure)
})
node = clone
}
}
let id = this.context.getAttribute('data-id')
let src = this.context.getAttribute('data-source')
let subcardSource = null
if (subcard != null) {
subcardSource = subcard.getAttribute('data-source')
}
if (!window.speechSynthesis.speaking) {
this._start(node)
Logging.log(`Started speech on card: id:${id} - source: ${src} - subcard: ${subcardSource}`)
} else if (this.cardActive && this._sameText(node)) {
Logging.log(`Stopped speech on card: id:${id} - source: ${src} - subcard: ${subcardSource}`)
this._stop()
} else {
Logging.log(`Updated Text on card: id:${id} - source: ${src} - subcard: ${subcardSource}`)
this._stop()
.then(() => {
this._start(node)
})
.catch(console.error)
}
}
_sameText(node) {
return this.utterance.text == this._cleanupText(node)
}
_setupUtterance() {
this.utterance = new SpeechSynthesisUtterance()
this.utterance.lang = 'de-DE'
}
get require() {
return [CardPlugin.Ui]
}
remove() {
this.button = null
super.remove()
}
append(context) { append(context) {
let container = context.querySelector(this.parentSelector) let container = context.querySelector(this.parentSelector)
this.button = document.createElement('div') this.button = document.createElement('div')
@ -405,113 +495,97 @@ CardPlugin.Speech = class SpeechPlugin extends CardPluginBase {
container.appendChild(this.button) container.appendChild(this.button)
InteractionMapper.on(this.interactionType, this.button, () => { InteractionMapper.on(this.interactionType, this.button, () => {
let subcard = context.querySelector('.mainview > .subcard') this.speak()
let target = subcard ? subcard : context })
this.speak(target) this.context.addEventListener('DOMNodeRemoved', event => {
if (
this.context['lastSpeechNode'] == window.speechSynthesis['speechPluginNode'] &&
event.target == this.context
) {
this._stop()
}
})
ScatterCard
}
_isSameNode(node) {
return this.currentText == node.textContent
}
speak() {
/**
* This is a little bit ugly, but imho the most elegant of all dirty solutions.
*
5ht * Within the plugins we have no knowledge of other cards and such. But must differentiate the
* clicks by their corresponding owner. The SpeechUtterance just takes a text and has no knowledge
* about the node that is currently read to the user.
*
* This means, that we can identify same text, but not differentiate same text on different nodes.
* To account for that, we add the node to the speechSynthesis object (#benefitsOfJavaScript) and
* have access to the node, by - let's say - expanding the functionality of the SpeechSynthesis object.
*
* SO -17.07.19
*/
let activeNode = window.speechSynthesis['speechPluginNode']
this._updateText()
}
async _stop() {
return new Promise(resolve => {
if (this.activeUtterance) {
this.activeUtterance.addEventListener('end', resolve, {
once: true
}) })
} }
_activate() { window.speechSynthesis.cancel()
this._disableActive() })
this.active = this }
get activeUtterance() {
return window.speechSynthesis['speechPluginUtterance']
}
_end() {
window.speechSynthesis['speechPluginNode'] = null
window.speechSynthesis['speechPluginUtterance'] = null
this._deactivateButton()
this.context.classList.remove('speech-plugin-is-reading')
}
_start(node) {
window.speechSynthesis.cancel()
window.speechSynthesis['speechPluginUtterance'] = this.utterance
window.speechSynthesis['speechPluginNode'] = node
this.context['lastSpeechNode'] = node
let cleanText = this._cleanupText(node)
this.utterance.text = cleanText
window.speechSynthesis.speak(this.utterance)
this._activateButton() this._activateButton()
this.context.classList.add('speech-plugin-is-reading')
}
_cleanupText(node) {
let text = node.textContent
text = this._removeShy(text)
return text
}
_removeShy(text) {
return text.replace(/\u00AD/g, '')
} }
_activateButton() { _activateButton() {
if (this.button) this.button.classList.add('active') if (this.button) this.button.classList.add('active')
} }
_deactivate() {
this._deactivateButton()
}
_deactivateButton() { _deactivateButton() {
if (this.button) this.button.classList.remove('active') if (this.button) this.button.classList.remove('active')
} }
_isSameNode(node) {
//console.log(this.currentText, node.innerText)
return this.currentText == node.innerText
}
speak(node) {
console.log(this._isSameNode(node))
if (!window.speechSynthesis.speaking) {
console.log('Noone talking!')
this._start(node)
} else if (this._isSameNode(node)) {
console.log('Requested same!')
this._stop()
} else {
console.log('Requested Different!')
this._stop()
this._start(node)
}
}
_disableActive() {
console.log('disableActive:', this.active)
if (this.active) {
this.active._deactivate()
}
}
_start(node) {
this.currentText = node.innerText
let utterance = new SpeechSynthesisUtterance(node.innerText)
let voices = window.speechSynthesis.getVoices()
console.log(voices)
let voice = voices.filter(val => {
//console.log(val)
return val.name == 'Microsoft Hedda Desktop - German'
})[0]
//console.log(voice)
utterance.voice = voice
console.log('TALK: ', utterance)
window.speechSynthesis.speak(utterance)
this._activate()
window.speechSynthesis.resume()
utterance.onboundary = () => {
console.log('onboundary', node.innerText)
if (this.currentText.substring(0, 5) != node.innerText.substring(0, 5)) {
console.log('text for speech synth changed!', this.currentText, node.innerText)
this._stop()
}
}
utterance.onend = () => console.log('onend', node.innerText)
utterance.onerror = () => console.log('onerror', node.innerText)
utterance.onmark = () => console.log('onmark', node.innerText)
utterance.onpause = () => console.log('onpause', node.innerText)
utterance.onresume = () => console.log('onresume', node.innerText)
utterance.onstart = () => console.log('onstart', node.innerText)
utterance.onerror = () => console.log('onerror', node.innerText)
}
_stop() {
window.speechSynthesis.cancel()
this.currentText = null
this._deactivate()
}
get active() {
return this.constructor.active
}
set active(val) {
this.constructor.active = val
}
get currentText() {
return this.constructor.text
}
set currentText(val) {
this.constructor.text = val
}
} }

View File

@ -15,7 +15,7 @@ export default class ScatterCard extends Card {
* @param {*} htmlString * @param {*} htmlString
* @param {*} basePath * @param {*} basePath
* @param {*} [opts={}] * @param {*} [opts={}]
* @memberof Card * @memberof ScatterCard
*/ */
static setup(context, htmlString, { basePath = './', modules = [] } = {}) { static setup(context, htmlString, { basePath = './', modules = [] } = {}) {
context.classList.add('info-card') context.classList.add('info-card')
@ -29,7 +29,7 @@ export default class ScatterCard extends Card {
/** /**
* Conflicts with the FindTarget method of the Abstract scatter. * Conflicts with the FindTarget method of the Abstract scatter.
*/ */
this._replaceAttributes(html, 'onclick', this._replaceCallback) this._replaceAttributes(context, html, 'onclick', this._replaceCallback)
let content = html.querySelector('.mainview') let content = html.querySelector('.mainview')
context.appendChild(content) context.appendChild(content)
@ -51,7 +51,16 @@ export default class ScatterCard extends Card {
element.onClose = callback element.onClose = callback
} }
} }
/**
* Removes the close listener from a card element.
*
* @static
* @param {HTMLElement} element - Context of the Card.
* @memberof ScatterCard
*/
static removeOnCloseListener(element) {
element.onClose = null
}
/** /**
* Creates a scatter for the card and applies the card to it, * Creates a scatter for the card and applies the card to it,
* *
@ -61,7 +70,7 @@ export default class ScatterCard extends Card {
* @param {string} [basePath=""] * @param {string} [basePath=""]
* @param {*} [opts={}] * @param {*} [opts={}]
* @returns * @returns
* @memberof Card * @memberof ScatterCard
*/ */
static createCardScatter(html, scatterContainer, { basePath = './', modules = [] } = {}) { static createCardScatter(html, scatterContainer, { basePath = './', modules = [] } = {}) {
let element = document.createElement('div') let element = document.createElement('div')
@ -79,6 +88,42 @@ export default class ScatterCard extends Card {
return element return element
} }
/**
* Closes but NOT removes the scatter element.
*
* The remove must be called separately, it may be used in the close callback
* of the scatter.
*/
static close(context) {
Card.close(context)
if (context['scatter']) {
console.error('CLOSED CARD')
context.scatter.close()
} else {
console.error('Expected a scatter element to close!', this)
}
}
/**
* Cleans up the card.
*
* @static
* @override
* @memberof ScatterCard
*/
static remove(context) {
if (context['scatter']) {
context.scatter = null
console.error('REMOVED CARD')
} else {
console.error('Expected a scatter element to remove!', this)
}
Card.remove(context)
}
/** /**
*Utility function to create a fully functional card scatter. *Utility function to create a fully functional card scatter.
* *

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8" ?>
<data>
<header>
<!-- Thumbnail of artwork with 512px large side -->
<thumbnail>01/thumbnail.jpg</thumbnail>
<!-- <artist> </artist>-->
<title>Das Rathaus</title>
<!-- <misc>erbaut 1435</misc>-->
<description>
Das Rathaus ist das wichtigste Gebäude auf dem Marktplatz. Mit dem Bau wurde 1435 begonnen, seitdem wurde es immer wieder verändert, sodass es Merkmale vieler Baustile vom Spätmittelalter bis zum 21. Jahrhundert aufweist. Die auffällige Fassadengestaltung stammt aus dem 19. Jahrhundert.
</description>
</header>
<card src="01/01_baugeschichte.xml"/>
<card src="01/01_funktiondamals.xml"/>
<card src="01/01_funktionheute.xml"/>
<card src="01/01_besonderheiten.xml"/>
<card src="01/01_besonderheiten2.xml"/>
<card src="01/01_besonderheiten3.xml"/>
</data>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Tübingen wird Stadt</h2> <p contenteditable="false" data-link="Popup">Bereits 1191 wurden in Tübingen Kaufleute erwähnt ein Beweis für einen Handelsplatz und der erste Schritt hin zur Stadt. Schon damals dürfte Tübingen städtischen Charakter besessen haben, es wurde jedoch erst 1231 urkundlich als Stadt erwähnt. Das daraufhin erstarkte städtische Selbstbewusstsein und die erhebliche Wirtschaftskraft Tübingens ebneten den Weg für den Bau eines Rathauses, das in mehreren Bauphasen errichtet wurde.</p><h2 contenteditable="false">Bauphasen</h2> <p contenteditable="false" data-link="Popup">1435 Erster Rathausbau</p> <p contenteditable="false" data-link="Popup">1495 Erweiterung um ein Stockwerk</p> <p contenteditable="false" data-link="Popup">1510/11 Einbau der <a href="../01/astronomischeuhr.html" data-highlight-id="" onclick="Card.loadPopup(event)">Astronomischen Uhr</a></p> <p contenteditable="false" data-link="Popup">1543 Erster Rathausanbau an der Haaggasse</p> <p contenteditable="false" data-link="Popup">1598 Einbau des <a href="../01/ziergiebel.html" data-highlight-id="" onclick="Card.loadPopup(event)">Ziergiebels</a></p> <p contenteditable="false" data-link="Popup">1692 Erneute Renovierung</p> <p contenteditable="false" data-link="Popup">1876/77 Anbringung der <a href="../01/vorderheutigenfassade.html" data-highlight-id="" onclick="Card.loadPopup(event)">heutigen Fassade</a></p> <p contenteditable="false" data-link="Popup">1910 Erneuerung des Anbaus an der Haaggasse</p> <p contenteditable="false" data-link="Popup">1965 Grundlegende Sanierungen</p> <p contenteditable="false" data-link="Popup">2016 Grundlegende Sanierungen</p></div>
<div class="column content" data-link="Popup" tabindex=""><div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" viewBox="0 0 345 387.5" width="345" height="387.5" contenteditable="false">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image width="345" height="387.5" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../01/rathauszweigeschossig.png"></image>
<g stroke-width="3"></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="false" class="cap">Erster Rathausbau 15. Jh.</figcaption>
<figcaption contenteditable="false" class="zoomcap">Rekonstruktion des Rathauses im 15. Jahrhundert, Stadtarchiv Tübingen</figcaption>
</figure>
</div><h2 contenteditable="false">Der erste Rathausbau</h2> <p contenteditable="false" data-link="Popup">Um am Marktplatz ein großes <a href="../glossar/rathaus.html" data-highlight-id="" onclick="Card.loadPopup(event)">Rathaus</a> zu errichten, wurden dort wohl mehrere staatliche Bürgerhäuser abgerissen. Der erste Rathausbau 1435 war ein <a href="../glossar/fachwerk.html" data-highlight-id="" onclick="Card.loadPopup(event)">Fachwerkbau</a> mit drei Markthallen im Erdgeschoss und zwei Obergeschossen (siehe Abbildung). Im Erdgeschoss waren Verkaufsstände von Bäckern und Metzgern untergebracht, die sich bis dahin ohne Überdachung im Süden des Platzes befanden. Die Obergeschosse boten Raum für eine Verkaufshalle, die auch für Versammlungen und Feiern benutzt wurde, das Stadtgericht, das bis dahin ebenfalls auf dem Platz „direkt unter den Wolken“ tagte, sowie den Stadtrat.</p></div>
</div>
</article>
</body></html>

View File

@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8" ?>
<card type="artist">
<!-- <card type="thema"> -->
<!-- <card type="details"> -->
<!-- <card type="leben des kunstwerks"> -->
<!-- <card type="komposition"> -->
<!-- <card type="licht und farbe"> -->
<!-- <card type="extra info"> -->
<h1>Das wichtigste &lt;br/&gt;städtische Gebäude</h1>
<preview>
<text>
Nach 200 Jahren &lt;br/&gt;endlich ein Rathaus
</text>
</preview>
<content template="1">
<column>
<text><![CDATA[
<h2>Tübingen wird Stadt</h2>
<p>Bereits 1191 wurden in Tübingen Kaufleute erwähnt ein Beweis für einen Handelsplatz und der erste Schritt hin zur Stadt. Schon damals dürfte Tübingen städtischen Charakter besessen haben, es wurde jedoch erst 1231 urkundlich als Stadt erwähnt. Das daraufhin erstarkte städtische Selbstbewusstsein und die erhebliche Wirtschaftskraft Tübingens ebneten den Weg für den Bau eines Rathauses, das in mehreren Bauphasen errichtet wurde.</p>
]]></text>
<text><![CDATA[
<h2>Bauphasen</h2>
<p>1435 Erster Rathausbau</p>
<p>1495 Erweiterung um ein Stockwerk</p>
<p>1510/11 Einbau der <a href="01/astronomischeuhr.xml" >Astronomischen Uhr</a></p>
<p>1543 Erster Rathausanbau an der Haaggasse</p>
<p>1598 Einbau des <a href="01/ziergiebel.xml" >Ziergiebels</a> </p>
<p>1692 Erneute Renovierung</p>
<p>1876/77 Anbringung der <a href="01/vorderheutigenfassade.xml" >heutigen Fassade</a></p>
<p>1910 Erneuerung des Anbaus an der Haaggasse</p>
<p>1965 Grundlegende Sanierungen</p>
<p>2016 Grundlegende Sanierungen</p>
]]></text>
</column>
<column>
<img src="01/rathauszweigeschossig.png" maxHeight="310" caption="Erster Rathausbau 15. Jh." allowZoom="true" zoomCaption="Rekonstruktion des Rathauses im 15. Jahrhundert, Stadtarchiv Tübingen"/>
<text><![CDATA[
<h2>Der erste Rathausbau</h2>
<p>Um am Marktplatz ein großes <a href="glossar/rathaus.xml" >Rathaus</a> zu errichten, wurden dort wohl mehrere staatliche Bürgerhäuser abgerissen. Der erste Rathausbau 1435 war ein <a href="glossar/fachwerk.xml" >Fachwerkbau</a> mit drei Markthallen im Erdgeschoss und zwei Obergeschossen (siehe Abbildung). Im Erdgeschoss waren Verkaufsstände von Bäckern und Metzgern untergebracht, die sich bis dahin ohne Überdachung im Süden des Platzes befanden. Die Obergeschosse boten Raum für eine Verkaufshalle, die auch für Versammlungen und Feiern benutzt wurde, das Stadtgericht, das bis dahin ebenfalls auf dem Platz „direkt unter den Wolken“ tagte, sowie den Stadtrat.</p>
]]></text>
</column>
</content>
</card>

View File

@ -0,0 +1,51 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Die drei Schichten der Fassade</h2> <p contenteditable="false" data-link="Popup">Unter der heutigen Bemalung der Rathausfassade (siehe Abbildung) liegen <a href="../01/malschichten.html" data-highlight-id="" onclick="Card.loadPopup(event)">zwei ältere Malschichten</a>: eine einfache Ausfüllung der Fachwerkfelder und darüber eine <a href="../01/grisaillemalerei.html" data-highlight-id="" onclick="Card.loadPopup(event)">Grisaillemalerei</a>. Sein heutiges Aussehen erhielt das Rathaus 1876 zum 400. Universitätsjubiläum. Nach Entwürfen des Stuttgarter Hochschulprofessors Konrad Dollinger wurde die Fassade von Ludwig Lesker mit <a href="../glossar/sgraffittomalerei.html" data-highlight-id="" onclick="Card.loadPopup(event)">Sgraffittomalerei</a> im Neorenaissance-Stil versehen. Die aufwändige Gestaltung erinnert in Farben und Ornamentik vor allem an das 16. Jahrhundert, eine Blütezeit der Stadt und der Universität.</p> <div style="height: undefinedpx">&nbsp;</div><div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" viewBox="0 0 594 337.5" width="594" height="337.5" contenteditable="false">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image width="594" height="337.5" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../01/fassadeneu.jpg"></image>
<g stroke-width="3"><circle xlink:href="../01/eberhardfassade.html" data-highlight-id="01.fassadeneu.jpg.h1" onclick="Card.loadHighlightPopup(event)" cx="320" cy="62" r="59"></circle>
<circle xlink:href="../01/breuning.html" data-highlight-id="01.fassadeneu.jpg.h2" onclick="Card.loadHighlightPopup(event)" cx="48" cy="199" r="30"></circle>
<circle xlink:href="../01/osiander.html" data-highlight-id="01.fassadeneu.jpg.h3" onclick="Card.loadHighlightPopup(event)" cx="155" cy="199" r="30"></circle>
<circle xlink:href="../01/dann.html" data-highlight-id="01.fassadeneu.jpg.h4" onclick="Card.loadHighlightPopup(event)" cx="250" cy="199" r="30"></circle>
<circle xlink:href="../01/huber.html" data-highlight-id="01.fassadeneu.jpg.h5" onclick="Card.loadHighlightPopup(event)" cx="348" cy="199" r="30"></circle>
<circle xlink:href="../01/cotta.html" data-highlight-id="01.fassadeneu.jpg.h6" onclick="Card.loadHighlightPopup(event)" cx="446" cy="199" r="30"></circle>
<circle xlink:href="../01/uhland.html" data-highlight-id="01.fassadeneu.jpg.h7" onclick="Card.loadHighlightPopup(event)" cx="541" cy="199" r="30"></circle>
<circle xlink:href="../01/gerechtigkeit.html" data-highlight-id="01.fassadeneu.jpg.h8" onclick="Card.loadHighlightPopup(event)" cx="106" cy="275" r="42"></circle>
<circle xlink:href="../01/wohlstand.html" data-highlight-id="01.fassadeneu.jpg.h9" onclick="Card.loadHighlightPopup(event)" cx="211" cy="275" r="42"></circle>
<circle xlink:href="../01/wissenschaft.html" data-highlight-id="01.fassadeneu.jpg.h10" onclick="Card.loadHighlightPopup(event)" cx="490" cy="275" r="42"></circle></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="false" class="cap">Die Fassade des Rathauses</figcaption>
<figcaption contenteditable="false" class="zoomcap">Die Fassade des Rathauses, Foto: Christoph Jäckle</figcaption>
</figure>
</div></div>
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Mutige Männer, allegorische Frauen</h2> <p contenteditable="false" data-link="Popup"><a href="../01/eberhardfassade.html" data-highlight-id="01.fassadeneu.jpg.h1" onclick="Card.loadPopup(event)">Graf Eberhard im Bart</a>, der Gründer der Universität, der für seine Verdienste um die politische Einheit Württembergs in den Herzogsstand erhoben wurde, ist im obersten Geschoss abgebildet. Er wacht als echter Ritter über Stadt und Bürger, das Herzogsschwert und die Gründungsurkunde der Universität in den Händen.</p> <p contenteditable="false" data-link="Popup">Unter ihm sind in sechs Medaillons Porträts wichtiger Männer der Tübinger Stadtgeschichte zu sehen, die sich alle in besonderer Weise um bürgerliche Rechte und Freiheiten verdient gemacht hatten, wie sie bereits im <a href="../glossar/tuebingervertrag.html" data-highlight-id="" onclick="Card.loadPopup(event)">Tübinger Vertrag</a> von 1514 festgelegt wurden. Es handelt sich um den Vogt <a href="../01/breuning.html" data-highlight-id="01.fassadeneu.jpg.h2" onclick="Card.loadPopup(event)">Konrad Breuning</a>, den Diplomaten <a href="../01/osiander.html" data-highlight-id="01.fassadeneu.jpg.h3" onclick="Card.loadPopup(event)">Johannes Osiander</a>, den Bürgermeister <a href="../01/dann.html" data-highlight-id="01.fassadeneu.jpg.h4" onclick="Card.loadPopup(event)">Jakob Heinrich Dann</a>, den Oberamtmann <a href="../01/huber.html" data-highlight-id="01.fassadeneu.jpg.h5" onclick="Card.loadPopup(event)">Johann Ludwig Huber</a>, den Verleger <a href="../01/cotta.html" data-highlight-id="01.fassadeneu.jpg.h6" onclick="Card.loadPopup(event)">Johann Friedrich Cotta</a> und den Politiker <a href="../01/uhland.html" data-highlight-id="01.fassadeneu.jpg.h7" onclick="Card.loadPopup(event)">Ludwig Uhland</a>.</p> <p contenteditable="false" data-link="Popup">Die drei allegorischen Frauenfiguren im untersten Stock symbolisieren die <a href="../01/gerechtigkeit.html" data-highlight-id="01.fassadeneu.jpg.h8" onclick="Card.loadPopup(event)">Gerechtigkeit</a>, den <a href="../01/wohlstand.html" data-highlight-id="01.fassadeneu.jpg.h9" onclick="Card.loadPopup(event)">wirtschaftlichen Wohlstand</a> und die <a href="../01/wissenschaft.html" data-highlight-id="01.fassadeneu.jpg.h10" onclick="Card.loadPopup(event)">Wissenschaft</a>. Während die ersten beiden allgemein städtisch­bürgerliche Tugenden verkörpern, betont die dritte den Charakter Tübingens als Universitätsstadt.</p></div>
</div>
</article>
</body></html>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- <card type="artist"> -->
<!-- <card type="thema"> -->
<card type="details">
<!-- <card type="leben des kunstwerks"> -->
<!-- <card type="komposition"> -->
<!-- <card type="licht und farbe"> -->
<!-- <card type="extra info"> -->
<h1>Fassadenmalerei</h1>
<preview>
<text>
Fassade aus &lt;br/&gt;Geist und Politik
</text>
</preview>
<content template="1">
<column>
<text><![CDATA[
<h2>Die drei Schichten der Fassade</h2>
<p>Unter der heutigen Bemalung der Rathausfassade (siehe Abbildung) liegen <a href="01/malschichten.xml">zwei ältere Malschichten</a>: eine einfache Ausfüllung der Fachwerkfelder und darüber eine <a href="01/grisaillemalerei.xml">Grisaillemalerei</a>. Sein heutiges Aussehen erhielt das Rathaus 1876 zum 400. Universitätsjubiläum. Nach Entwürfen des Stuttgarter Hochschulprofessors Konrad Dollinger wurde die Fassade von Ludwig Lesker mit <a href="glossar/sgraffittomalerei.xml" >Sgraffittomalerei</a> im Neorenaissance-Stil versehen. Die aufwändige Gestaltung erinnert in Farben und Ornamentik vor allem an das 16. Jahrhundert, eine Blütezeit der Stadt und der Universität.</p>
]]></text>
<space lines="1"/>
<img src="01/fassadeneu.jpg" maxHeight="270" caption="Die Fassade des Rathauses" allowZoom="true" zoomCaption="Die Fassade des Rathauses, Foto: Christoph Jäckle">
<highlight x="0.44" y="0.01" radius="0.1" href="01/eberhardfassade.xml" id="01.fassadeneu.jpg.h1"/>
<highlight x="0.03" y="0.5" radius="0.05" href="01/breuning.xml" id="01.fassadeneu.jpg.h2"/>
<highlight x="0.21" y="0.5" radius="0.05" href="01/osiander.xml" id="01.fassadeneu.jpg.h3"/>
<highlight x="0.37" y="0.5" radius="0.05" href="01/dann.xml" id="01.fassadeneu.jpg.h4"/>
<highlight x="0.535" y="0.5" radius="0.05" href="01/huber.xml" id="01.fassadeneu.jpg.h5"/>
<highlight x="0.7" y="0.5" radius="0.05" href="01/cotta.xml" id="01.fassadeneu.jpg.h6"/>
<highlight x="0.86" y="0.5" radius="0.05" href="01/uhland.xml" id="01.fassadeneu.jpg.h7"/>
<highlight x="0.107" y="0.69" radius="0.07" href="01/gerechtigkeit.xml" id="01.fassadeneu.jpg.h8"/>
<highlight x="0.285" y="0.69" radius="0.07" href="01/wohlstand.xml" id="01.fassadeneu.jpg.h9"/>
<highlight x="0.754" y="0.69" radius="0.07" href="01/wissenschaft.xml" id="01.fassadeneu.jpg.h10"/>
</img>
</column>
<column>
<text><![CDATA[
<h2>Mutige Männer, allegorische Frauen</h2>
<p><a href="01/eberhardfassade.xml" imageHighlightId="01.fassadeneu.jpg.h1">Graf Eberhard im Bart</a>, der Gründer der Universität, der für seine Verdienste um die politische Einheit Württembergs in den Herzogsstand erhoben wurde, ist im obersten Geschoss abgebildet. Er wacht als echter Ritter über Stadt und Bürger, das Herzogsschwert und die Gründungsurkunde der Universität in den Händen.</p>
<p>Unter ihm sind in sechs Medaillons Porträts wichtiger Männer der Tübinger Stadtgeschichte zu sehen, die sich alle in besonderer Weise um bürgerliche Rechte und Freiheiten verdient gemacht hatten, wie sie bereits im <a href="glossar/tuebingervertrag.xml">Tübinger Vertrag</a> von 1514 festgelegt wurden. Es handelt sich um den Vogt <a href="01/breuning.xml" imageHighlightId="01.fassadeneu.jpg.h2">Konrad Breuning</a>, den Diplomaten <a href="01/osiander.xml" imageHighlightId="01.fassadeneu.jpg.h3">Johannes Osiander</a>, den Bürgermeister <a href="01/dann.xml" imageHighlightId="01.fassadeneu.jpg.h4">Jakob Heinrich Dann</a>, den Oberamtmann <a href="01/huber.xml" imageHighlightId="01.fassadeneu.jpg.h5">Johann Ludwig Huber</a>, den Verleger <a href="01/cotta.xml" imageHighlightId="01.fassadeneu.jpg.h6">Johann Friedrich Cotta</a> und den Politiker <a href="01/uhland.xml" imageHighlightId="01.fassadeneu.jpg.h7">Ludwig Uhland</a>.</p>
<p>Die drei allegorischen Frauenfiguren im untersten Stock symbolisieren die <a href="01/gerechtigkeit.xml" imageHighlightId="01.fassadeneu.jpg.h8">Gerechtigkeit</a>, den <a href="01/wohlstand.xml" imageHighlightId="01.fassadeneu.jpg.h9">wirtschaftlichen Wohlstand</a> und die <a href="01/wissenschaft.xml" imageHighlightId="01.fassadeneu.jpg.h10">Wissenschaft</a>. Während die ersten beiden allgemein städtisch-bürgerliche Tugenden verkörpern, betont die dritte den Charakter Tübingens als Universitätsstadt.</p>
]]></text>
</column>
</content>
</card>

View File

@ -0,0 +1,44 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Wer ist das Rebmännle am Rathaus?</h2> <p contenteditable="false" data-link="Popup">Die kleine Skulptur „Rebmännle“, die um 1600 an der <a href="../01/rebmaennle.html" data-highlight-id="" onclick="Card.loadPopup(event)">Südostecke des Rathauses</a> angebracht wurde, stellt eindeutig eine unbekleidete weibliche Figur dar (siehe Abbildung). Sie tanzt auf einer <a href="../01/weintraube.html" data-highlight-id="01.rebmaennleneu.jpg.h1" onclick="Card.loadPopup(event)">vollen Weintraube</a>, um ihren Körper ist eine <a href="../01/girlandeausweinblaettern.html" data-highlight-id="01.rebmaennleneu.jpg.h2" onclick="Card.loadPopup(event)">Girlande aus Weinblättern</a> geschlungen und ihr nach hinten geworfener <a href="../01/umhang.html" data-highlight-id="01.rebmaennleneu.jpg.h4" onclick="Card.loadPopup(event)">Umhang</a> erinnert an ein Weinblatt. Es handelt sich um eine Frau aus dem Gefolge des Weingottes <a href="../glossar/bacchus.html" data-highlight-id="" onclick="Card.loadPopup(event)">Bacchus</a>, eine sogenannte Bacchantin. Die Platzierung an der prominenten Stelle soll die Bedeutung des Weinbaus für Tübingen symbolisieren.</p> <div style="height: undefinedpx">&nbsp;</div><h2 contenteditable="false">Nackte Frau im öffentlichen Raum</h2> <p contenteditable="false" data-link="Popup">Um 1600 konnte nur eine Figur aus der antiken Mythologie nackt im öffentlichen Raum aufgestellt werden, ohne Scham und Anstand zu verletzen. Zudem bot das Personal der antiken Götterwelt den Künstlern der frühen Neuzeit zum ersten Mal die Möglichkeit, nackte Figuren zu repräsentieren. Das Aussehen des „Rebmännles“ mit den stämmigen Beinen, dem üppigen Bauch und dem lachenden Gesicht entspricht der Vorstellung von <a href="../01/schoenheitsideal.html" data-highlight-id="" onclick="Card.loadPopup(event)">weiblicher Schönheit</a> zwischen Renaissance und Frühbarock.</p></div>
<div class="column content" data-link="Popup" tabindex=""><div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" viewBox="0 0 467 875" width="467" height="875" contenteditable="false">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image width="467" height="875" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../01/rebmaennleneu.jpg"></image>
<g stroke-width="3"><circle xlink:href="../01/weintraube.html" data-highlight-id="01.rebmaennleneu.jpg.h1" onclick="Card.loadHighlightPopup(event)" cx="228" cy="767" r="93"></circle>
<circle xlink:href="../01/umhang.html" data-highlight-id="01.rebmaennleneu.jpg.h4" onclick="Card.loadHighlightPopup(event)" cx="182" cy="68" r="42"></circle>
<circle xlink:href="../01/girlandeausweinblaettern.html" data-highlight-id="01.rebmaennleneu.jpg.h2" onclick="Card.loadHighlightPopup(event)" cx="243" cy="406" r="56"></circle></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="false" class="cap">Tübinger Rebmännle</figcaption>
<figcaption contenteditable="false" class="zoomcap">Tübinger Rebmännle, Foto: Rose Hajdu, Stadtarchiv Tübingen</figcaption>
</figure>
</div></div>
</div>
</article>
</body></html>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- <card type="artist"> -->
<!-- <card type="thema"> -->
<card type="details">
<!-- <card type="leben des kunstwerks"> -->
<!-- <card type="komposition"> -->
<!-- <card type="licht und farbe"> -->
<!-- <card type="extra info"> -->
<h1>Tübinger Rebmännle</h1>
<preview>
<text>
Eine unbekleidete Frau?
</text>
</preview>
<content template="1">
<column>
<text><![CDATA[
<h2>Wer ist das Rebmännle am Rathaus?</h2>
<p>Die kleine Skulptur „Rebmännle“, die um 1600 an der <a href="01/rebmaennle.xml" >Südostecke des Rathauses</a> angebracht wurde, stellt eindeutig eine unbekleidete weibliche Figur dar (siehe Abbildung). Sie tanzt auf einer <a href="01/weintraube.xml" imageHighlightId="01.rebmaennleneu.jpg.h1">vollen Weintraube</a>, um ihren Körper ist eine <a href="01/girlandeausweinblaettern.xml" imageHighlightId="01.rebmaennleneu.jpg.h2">Girlande aus Weinblättern</a> geschlungen und ihr nach hinten geworfener <a href="01/umhang.xml" imageHighlightId="01.rebmaennleneu.jpg.h4">Umhang</a> erinnert an ein Weinblatt. Es handelt sich um eine Frau aus dem Gefolge des Weingottes <a href="glossar/bacchus.xml">Bacchus</a>, eine sogenannte Bacchantin. Die Platzierung an der prominenten Stelle soll die Bedeutung des Weinbaus für Tübingen symbolisieren.</p>
]]></text>
<space lines="2"/>
<text><![CDATA[
<h2>Nackte Frau im öffentlichen Raum</h2>
<p>Um 1600 konnte nur eine Figur aus der antiken Mythologie nackt im öffentlichen Raum aufgestellt werden, ohne Scham und Anstand zu verletzen. Zudem bot das Personal der antiken Götterwelt den Künstlern der frühen Neuzeit zum ersten Mal die Möglichkeit, nackte Figuren zu repräsentieren. Das Aussehen des „Rebmännles“ mit den stämmigen Beinen, dem üppigen Bauch und dem lachenden Gesicht entspricht der Vorstellung von <a href="01/schoenheitsideal.xml" >weiblicher Schönheit</a> zwischen Renaissance und Frühbarock.</p>
]]></text>
<!-- <text><![CDATA[
<h2>Symbol des Tübinger Weinbaus</h2>
<p>Die Platzierung an der prominenten Stelle soll die Bedeutung des Weinbaus für Tübingen symbolisieren. Um 1600 konnte eigentlich nur eine Figur aus der antiken Mythologie nackt im öffentlichen Raum aufgestellt werden, ohne Scham und Anstand zu ver-letzen. Zudem bot das Personal der antiken Götter-welt den Künstlern der frühen Neuzeit auch neue Möglichkeiten künstlerischen Ausdrucks, wie sie bei den Heiligenfiguren des Mittelalters kaum möglich gewesen waren: An der Bacchantin fallen die stäm-migen Beine, der üppige Bauch und das lachende Gesicht als besonders <a href="01/lebensnahundrealistisch.xml" >lebensnah und realistisch</a> auf.</p>
]]></text> -->
</column>
<column>
<img src="01/rebmaennleneu.jpg" maxHeight="700" caption="Tübinger Rebmännle" allowZoom="true" zoomCaption="Tübinger Rebmännle, Foto: Rose Hajdu, Stadtarchiv Tübingen">
<highlight x="0.29" y="0.77" radius="0.2" href="01/weintraube.xml" id="01.rebmaennleneu.jpg.h1"/>
<highlight x="0.3" y="0.03" radius="0.09" href="01/umhang.xml" id="01.rebmaennleneu.jpg.h4"/>
<!-- <highlight x="0.39" y="0.12" radius="0.12" href="01/gesicht.xml" id="01.rebmaennle2.jpg.h3"/> -->
<highlight x="0.4" y="0.4" radius="0.12" href="01/girlandeausweinblaettern.xml" id="01.rebmaennleneu.jpg.h2"/>
</img>
</column>
</content>
</card>

View File

@ -0,0 +1,47 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">500 Jahre schwäbische Qualitätsarbeit</h2> <p contenteditable="false" data-link="Popup">Die <a href="../01/astronomischeuhr.html" data-highlight-id="" onclick="Card.loadPopup(event)">Astronomische Uhr</a> im <a href="../01/ziergiebel2.html" data-highlight-id="" onclick="Card.loadPopup(event)">Ziergiebel</a> des Rathauses ist ein Meisterwerk der Technik (siehe Abbildung). Sie wurde 1511 mit großer Wahrscheinlichkeit von <a href="../glossar/stoefflerjohannes.html" data-highlight-id="" onclick="Card.loadPopup(event)">Johannes Stöffler</a> entworfen und wohl von einem ortsansässigen Schmid gebaut. Sie gehört zu einem Ensemble von fünf Uhren im und am Rathaus, von denen vier die Zeit anzeigen. Sie ist nicht nur die älteste Uhr weltweit, die Sonnen- und Mondfinsternisse mit einem Drachenzeiger anzeigen kann, sondern läuft auch heute noch so präzise, dass sie nur alle zwanzig Jahre neu justiert werden muss.</p><div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" viewBox="0 0 496 500" width="496" height="500" contenteditable="false">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image width="496" height="500" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../01/astronomischeuhrneu.jpg"></image>
<g stroke-width="3"><circle xlink:href="../01/mondphasen.html" data-highlight-id="01.astronomischeuhrneu.jpg.h1" onclick="Card.loadHighlightPopup(event)" cx="248" cy="94" r="60"></circle>
<circle xlink:href="../01/tierkreis.html" data-highlight-id="01.astronomischeuhrneu.jpg.h2" onclick="Card.loadHighlightPopup(event)" cx="129" cy="290" r="35"></circle>
<circle xlink:href="../01/sonnenzeiger.html" data-highlight-id="01.astronomischeuhrneu.jpg.h3" onclick="Card.loadHighlightPopup(event)" cx="323" cy="335" r="30"></circle>
<circle xlink:href="../01/mondzeiger.html" data-highlight-id="01.astronomischeuhrneu.jpg.h4" onclick="Card.loadHighlightPopup(event)" cx="214" cy="240" r="30"></circle>
<circle xlink:href="../01/drachenzeiger.html" data-highlight-id="01.astronomischeuhrneu.jpg.h5" onclick="Card.loadHighlightPopup(event)" cx="293" cy="265" r="30"></circle></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="false" class="cap">Die Astronomische Uhr</figcaption>
<figcaption contenteditable="false" class="zoomcap">Die Astronomische Uhr im Ziergiebel des Rathauses, Foto: Christoph Jäckle</figcaption>
</figure>
</div></div>
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Was zeigt die Uhr an?</h2> <p contenteditable="false" data-link="Popup">Die Astronomische Uhr besteht aus
einer <a href="../01/mondphasen.html" data-highlight-id="01.astronomischeuhrneu.jpg.h1" onclick="Card.loadPopup(event)">Mondphasenanzeige</a> und einem <a href="../01/astronomischeszifferblatt.html" data-highlight-id="" onclick="Card.loadPopup(event)">astronomischen Zifferblatt</a> mit einem <a href="../01/tierkreis.html" data-highlight-id="01.astronomischeuhrneu.jpg.h2" onclick="Card.loadPopup(event)">Tierkreis</a>. Die Uhr besitzt drei Zeiger. Der <a href="../01/sonnenzeiger.html" data-highlight-id="01.astronomischeuhrneu.jpg.h3" onclick="Card.loadPopup(event)">Sonnenzeiger</a> bewegt sich ein „knappes“ Grad pro Tag, da 360 Grad in 365 Tagen durchlaufen werden. Er zeigt das aktuelle Tierkreiszeichen an. Der <a href="../01/mondzeiger.html" data-highlight-id="01.astronomischeuhrneu.jpg.h4" onclick="Card.loadPopup(event)">Mondzeiger</a> zeigt die scheinbare Position des Mondes zur Position der Sonne an. Er benötigt für einen vollen Umlauf 27 Tage, 7 Stunden, 43 Minuten (Siderischer Mondmonat). Da aber in dieser Zeit auch der Sonnenzeiger weitergelaufen ist, benötigt der Mondzeiger noch etwas länger um erneut über das Sonnen- bzw. -Sternsymbol des Sonnenzeigers zu laufen. Daraus resultiert eine Zeitspanne von 29 Tagen, 12 Stunden und 44 Minuten, welche dann dem synodischen Mondmonat von Vollmond zu Vollmond entspricht. Am langsamsten ist der <a href="../01/drachenzeiger.html" data-highlight-id="01.astronomischeuhrneu.jpg.h5" onclick="Card.loadPopup(event)">Drachenzeiger</a>, der in 18 Jahren und 224 Tagen einmal gegen den Uhrzeigersinn läuft. Kommen nun Sonnen-, Mond- und Drachenzeiger zur Deckung, so findet irgendwo auf der Erde eine Mond- oder Sonnenfinsternis statt. Im Durchschnitt wiederholt sich dieses Ereignis etwa viermal im Jahr.</p> <p contenteditable="false" data-link="Popup">Die Uhr war mehr als nur ein raffiniertes technisches Spielzeug: Sie steht auch für einen selbstbewussten Umgang naturwissenschaftlichen Fragen zu einer Zeit in der sich langsam die Astronomie als Wissenschaft von der mythologischen Astrologie trennte.</p></div>
</div>
</article>
</body></html>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- <card type="artist"> -->
<!-- <card type="thema"> -->
<card type="details">
<!-- <card type="leben des kunstwerks"> -->
<!-- <card type="komposition"> -->
<!-- <card type="licht und farbe"> -->
<!-- <card type="extra info"> -->
<h1>Die Astronomische Uhr</h1>
<preview>
<text>
Revolutionäres &lt;br/&gt;Meisterwerk der Technik
</text>
</preview>
<content template="1">
<column>
<text><![CDATA[
<h2>500 Jahre schwäbische Qualitätsarbeit </h2>
<p>Die <a href="01/astronomischeuhr.xml" >Astronomische Uhr</a> im <a href="01/ziergiebel2.xml">Ziergiebel</a> des Rathauses ist ein Meisterwerk der Technik (siehe Abbildung). Sie wurde 1511 mit großer Wahrscheinlichkeit von <a href="glossar/stoefflerjohannes.xml">Johannes Stöffler</a> entworfen und wohl von einem ortsansässigen Schmid gebaut. Sie gehört zu einem Ensemble von fünf Uhren im und am Rathaus, von denen vier die Zeit anzeigen. Sie ist nicht nur die älteste Uhr weltweit, die Sonnen- und Mondfinsternisse mit einem Drachenzeiger anzeigen kann, sondern läuft auch heute noch so präzise, dass sie nur alle zwanzig Jahre neu justiert werden muss.</p>
]]></text>
<img src="01/astronomischeuhrneu.jpg" maxHeight="400" caption="Die Astronomische Uhr" allowZoom="true" zoomCaption="Die Astronomische Uhr im Ziergiebel des Rathauses, Foto: Christoph Jäckle">
<highlight x="0.38" y="0.068" radius="0.12" href="01/mondphasen.xml" id="01.astronomischeuhrneu.jpg.h1"/>
<highlight x="0.19" y="0.51" radius="0.07" href="01/tierkreis.xml" id="01.astronomischeuhrneu.jpg.h2"/>
<highlight x="0.59" y="0.61" radius="0.06" href="01/sonnenzeiger.xml" id="01.astronomischeuhrneu.jpg.h3"/>
<highlight x="0.37" y="0.42" radius="0.06" href="01/mondzeiger.xml" id="01.astronomischeuhrneu.jpg.h4"/>
<highlight x="0.53" y="0.47" radius="0.06" href="01/drachenzeiger.xml" id="01.astronomischeuhrneu.jpg.h5"/>
</img>
</column>
<column>
<text><![CDATA[
<h2>Was zeigt die Uhr an?</h2>
<p>Die Astronomische Uhr besteht aus
einer <a href="01/mondphasen.xml" imageHighlightId="01.astronomischeuhrneu.jpg.h1">Mondphasenanzeige</a> und einem <a href="01/astronomischeszifferblatt.xml">astronomischen Zifferblatt</a> mit einem <a href="01/tierkreis.xml" imageHighlightId="01.astronomischeuhrneu.jpg.h2">Tierkreis</a>. Die Uhr besitzt drei Zeiger. Der <a href="01/sonnenzeiger.xml" imageHighlightId="01.astronomischeuhrneu.jpg.h3" >Sonnenzeiger</a> bewegt sich ein „knappes“ Grad pro Tag, da 360 Grad in 365 Tagen durchlaufen werden. Er zeigt das aktuelle Tierkreiszeichen an. Der <a href="01/mondzeiger.xml" imageHighlightId="01.astronomischeuhrneu.jpg.h4">Mondzeiger</a> zeigt die scheinbare Position des Mondes zur Position der Sonne an. Er benötigt für einen vollen Umlauf 27 Tage, 7 Stunden, 43 Minuten (Siderischer Mondmonat). Da aber in dieser Zeit auch der Sonnenzeiger weitergelaufen ist, benötigt der Mondzeiger noch etwas länger um erneut über das Sonnen- bzw. -Sternsymbol des Sonnenzeigers zu laufen. Daraus resultiert eine Zeitspanne von 29 Tagen, 12 Stunden und 44 Minuten, welche dann dem synodischen Mondmonat von Vollmond zu Vollmond entspricht. Am langsamsten ist der <a href="01/drachenzeiger.xml" imageHighlightId="01.astronomischeuhrneu.jpg.h5">Drachenzeiger</a>, der in 18 Jahren und 224 Tagen einmal gegen den Uhrzeigersinn läuft. Kommen nun Sonnen-, Mond- und Drachenzeiger zur Deckung, so findet irgendwo auf der Erde eine Mond- oder Sonnenfinsternis statt. Im Durchschnitt wiederholt sich dieses Ereignis etwa viermal im Jahr.</p>
<p>Die Uhr war mehr als nur ein raffiniertes technisches Spielzeug: Sie steht auch für einen selbstbewussten Umgang naturwissenschaftlichen Fragen zu einer Zeit in der sich langsam die Astronomie als Wissenschaft von der mythologischen Astrologie trennte.</p>
]]></text>
</column>
</content>
</card>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Erdgeschoss: Handel und Lager</h2> <p contenteditable="false" data-link="Popup">Das Rathaus war vom Marktplatz und von der Haaggasse aus zugänglich. Im Erdgeschoss befanden sich drei etwa gleich große Hallen. Im linken Bereich waren die Metzger untergebracht, die dort ihre Fleischbänke unterhielten. Im mittleren Raum verkauften Bäcker ihre Waren. Rechts erkennt man einen Torbogen für eine Durchfahrt in die Rathausgasse. 1543 wurde ein Salzhaus angebaut, unter dem ein geräumiger Keller zusätzlich Lagerplatz für Wein bot, der vom <a href="../01/spital.html" data-highlight-id="" onclick="Card.loadPopup(event)">Spital</a> hier eingelagert wurde.</p><h2 contenteditable="false">1. Geschoss: Ein Saal für Gerber und Bürgerschaft</h2> <p contenteditable="false" data-link="Popup">Im ersten Geschoss nutzten die Gerber den Saal, in dem heute der Gemeinderat tagt, zum Verkauf von Leder. Die <a href="../01/lederbuehne.html" data-highlight-id="" onclick="Card.loadPopup(event)">„Lederbühne“</a> diente gleichzeitig der Tübinger Bürgerschaft als Festsaal.</p><h2 contenteditable="false">2. Geschoss: Gericht und Rat der Stadt</h2> <p contenteditable="false" data-link="Popup">Stadtgericht und Rat tagten im zweiten Geschoss. Im ehemaligen Sitzungssaal, der heute als Trauzimmer genutzt wird, ist noch die bemalte <a href="../01/holzvertaefelung.html" data-highlight-id="" onclick="Card.loadPopup(event)">Holzvertäfelung</a> erhalten. Der repräsentative Empfangsraum, der sogenannte <a href="../01/oehrn.html" data-highlight-id="" onclick="Card.loadPopup(event)">Öhrn</a>, wurde 1596 von <a href="../glossar/zueberlinjakob.html" data-highlight-id="" onclick="Card.loadPopup(event)">Jakob Züberlin</a> mit <a href="../01/grisaillemalerei.html" data-highlight-id="" onclick="Card.loadPopup(event)">Grisaillemalereien</a> nach Vorlagen von Tobias Stimmer ausgestattet (siehe Abbildung). Die <a href="../01/motive.html" data-highlight-id="" onclick="Card.loadPopup(event)">Motive</a> haben alle mit Recht und Gerechtigkeit zu tun.</p></div>
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">3. Geschoss: Hofgericht des Landes</h2> <p contenteditable="false" data-link="Popup">Im dritten Geschoss des Rathauses, das 1495 aufgestockt worden war, fanden von 1514 bis 1806 die Sitzungen des Hofgerichts in dem sogenannten <a href="../01/hofgerichtssaal.html" data-highlight-id="" onclick="Card.loadPopup(event)">Hofgerichtssaal</a> statt. Das Hofgericht war im Mittelalter und in der Frühen Neuzeit das höchste Gericht des Landes Württemberg. Es tagte immer dort, wo sich der Graf oder Herzog gera­de aufhielt, wo er „Hof hielt“. Im Zuge des <a href="../glossar/tuebingervertrag.html" data-highlight-id="" onclick="Card.loadPopup(event)">Tübinger Vertrags</a> von 1514 wurde das württembergische Hofgericht nach Tübingen verlegt.</p> <div style="height: undefinedpx">&nbsp;</div><div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" viewBox="0 0 584 537.5" width="584" height="537.5" contenteditable="false">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image width="584" height="537.5" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../01/oehrn2.jpg"></image>
<g stroke-width="3"></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="false" class="cap">Der Öhrn mit Grisaillemalereien</figcaption>
<figcaption contenteditable="false" class="zoomcap">Der Öhrn im Rathaus, Basketballer aus Aix-en-Provence, Foto: Alfred Göhner, 1966, Stadtarchiv Tübingen</figcaption>
</figure>
</div></div>
</div>
</article>
</body></html>

View File

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- <card type="artist"> -->
<card type="thema">
<!-- <card type="details"> -->
<!-- <card type="leben des kunstwerks"> -->
<!-- <card type="komposition"> -->
<!-- <card type="licht und farbe"> -->
<!-- <card type="extra info"> -->
<h1>Alles unter einem Dach</h1>
<preview>
<text>
Räte, Richter, Händler &lt;br/&gt; und Halunken
</text>
</preview>
<content template="1">
<column>
<text><![CDATA[
<h2>Erdgeschoss: Handel und Lager</h2>
<p>Das Rathaus war vom Marktplatz und von der Haaggasse aus zugänglich. Im Erdgeschoss befanden sich drei etwa gleich große Hallen. Im linken Bereich waren die Metzger untergebracht, die dort ihre Fleischbänke unterhielten. Im mittleren Raum verkauften Bäcker ihre Waren. Rechts erkennt man einen Torbogen für eine Durchfahrt in die Rathausgasse. 1543 wurde ein Salzhaus angebaut, unter dem ein geräumiger Keller zusätzlich Lagerplatz für Wein bot, der vom <a href="01/spital.xml">Spital</a> hier eingelagert wurde.</p>
]]></text>
<text><![CDATA[
<h2>1. Geschoss: Ein Saal für Gerber und Bürgerschaft</h2>
<p>Im ersten Geschoss nutzten die Gerber den Saal, in dem heute der Gemeinderat tagt, zum Verkauf von Leder. Die <a href="01/lederbuehne.xml">„Lederbühne“</a> diente gleichzeitig der Tübinger Bürgerschaft als Festsaal.</p>
]]></text>
<text><![CDATA[
<h2>2. Geschoss: Gericht und Rat der Stadt</h2>
<p>Stadtgericht und Rat tagten im zweiten Geschoss. Im ehemaligen Sitzungssaal, der heute als Trauzimmer genutzt wird, ist noch die bemalte <a href="01/holzvertaefelung.xml">Holzvertäfelung</a> erhalten. Der repräsentative Empfangsraum, der sogenannte <a href="01/oehrn.xml">Öhrn</a>, wurde 1596 von <a href="glossar/zueberlinjakob.xml" >Jakob Züberlin</a> mit <a href="01/grisaillemalerei.xml">Grisaillemalereien</a> nach Vorlagen von Tobias Stimmer ausgestattet (siehe Abbildung). Die <a href="01/motive.xml" >Motive</a> haben alle mit Recht und Gerechtigkeit zu tun. </p>
]]></text>
</column>
<column>
<text><![CDATA[
<h2>3. Geschoss: Hofgericht des Landes</h2>
<p>Im dritten Geschoss des Rathauses, das 1495 aufgestockt worden war, fanden von 1514 bis 1806 die Sitzungen des Hofgerichts in dem sogenannten <a href="01/hofgerichtssaal.xml" >Hofgerichtssaal</a> statt. Das Hofgericht war im Mittelalter und in der Frühen Neuzeit das höchste Gericht des Landes Württemberg. Es tagte immer dort, wo sich der Graf oder Herzog gera-de aufhielt, wo er „Hof hielt“. Im Zuge des <a href="glossar/tuebingervertrag.xml">Tübinger Vertrags</a> von 1514 wurde das württembergische Hofgericht nach Tübingen verlegt.</p>
]]></text>
<space lines="1"/>
<img src="01/oehrn2.jpg" maxHeight="430" caption="Der Öhrn mit Grisaillemalereien" allowZoom="true" zoomCaption="Der Öhrn im Rathaus, Basketballer aus Aix-en-Provence, Foto: Alfred Göhner, 1966, Stadtarchiv Tübingen"/>
</column>
</content>
</card>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Zentrum der Stadtpolitik</h2> <p contenteditable="false" data-link="Popup">Das Rathaus ist noch heute das Zentrum für Stadtpolitik und -verwaltung. Im Ratssaal im ersten Obergeschoss tagt der Gemeinderat (siehe Abbildung). In der ehemaligen Großen Gerichtsstube im zweiten Obergeschoss befindet sich das Trauzimmer, das Amtszimmer des Oberbürgermeisters in der ehemaligen Kleinen Gerichtsstube. Sie wurde 1760 neu ausgebaut und mit Rokokodekor versehen. Außer einem weiteren Besprechungsraum im ehemaligen Hofgerichtssaal im dritten Obergeschoss, sind unter anderem Büros der städtischen Verwaltung untergebracht.</p> <div style="height: undefinedpx">&nbsp;</div><h2 contenteditable="false">Wohin mit der Stadtarchiv?</h2> <p contenteditable="false" data-link="Popup">Das Stadtarchiv war auch bis 2012 im Dachgeschoss und im Rathausanbau untergebracht. Seine umfangreichen Bestände an historischen Dokumenten belasteten nicht nur die Fachwerkkonstruktion des Rathauses, sondern waren auch in Gefahr, bei einem Brand vernichtet zu werden. Während der Restaurierungsmaßnahmen 2012 bis 2016 zog das Archiv in das hinter dem Rathaus stehenden Breuninghaus um. Langfristig ist ein Umzug auf das Gelände des ehemaligen Güterbahnhofs geplant.</p></div>
<div class="column content" data-link="Popup" tabindex=""><h2 contenteditable="false">Restaurierung 2012-2016</h2> <p contenteditable="false" data-link="Popup">Auslöser für die letzte Restaurierung waren, neben veralteter Haustechnik, Brandschutz und unzeitgemäßen Büro- und Besprechungsräumen, vor allem statische Probleme.</p> <p contenteditable="false" data-link="Popup">Bei der Sanierung kamen sensationelle Entdeckungen im Eingangsbereich zu Tage: Eine einheitliche Halle im Erdgeschoss gab es nie. Stattdessen befanden sich dort drei kleine Hallen zum Verkauf von Brot, Salz und Fleisch. An der Stütze neben dem Eingang zum Treppenhaus ist noch der Ansatz eines Brustriegels sichtbar, der die Halle abgeteilt hat. In der nördlichen Halle fand man an den Deckenbalken noch <a href="../01/baeckerzeichenneu.html" data-highlight-id="" onclick="Card.loadPopup(event)">Zeichen der Bäcker</a>. Die nördliche, bräunlich verputzte Außenwand ist das älteste Bauteil des Rathauses.</p><div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" viewBox="0 0 581 387.5" width="581" height="387.5" contenteditable="false">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image width="581" height="387.5" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../01/ratssaalneu.jpg"></image>
<g stroke-width="3"></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="false" class="cap">Ratssaal im ersten Obergeschoss</figcaption>
<figcaption contenteditable="false" class="zoomcap">Ratssaal nach der Sanierung des Rathauses, Foto: Universitätsstadt Tübingen</figcaption>
</figure>
</div></div>
</div>
</article>
</body></html>

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" ?>
<!-- <card type="artist"> -->
<card type="thema">
<!-- <card type="details"> -->
<!-- <card type="leben des kunstwerks"> -->
<!-- <card type="komposition"> -->
<!-- <card type="licht und farbe"> -->
<!-- <card type="extra info"> -->
<h1>Im Wandel der Zeit</h1>
<preview>
<text>
Was ist geblieben &lt;br/&gt;was hat sich verändert?
</text>
</preview>
<content template="1">
<column>
<text><![CDATA[
<h2>Zentrum der Stadtpolitik</h2>
<p>Das Rathaus ist noch heute das Zentrum für Stadtpolitik und -verwaltung. Im Ratssaal im ersten Obergeschoss tagt der Gemeinderat (siehe Abbildung). In der ehemaligen Großen Gerichtsstube im zweiten Obergeschoss befindet sich das Trauzimmer, das Amtszimmer des Oberbürgermeisters in der ehemaligen Kleinen Gerichtsstube. Sie wurde 1760 neu ausgebaut und mit Rokokodekor versehen. Außer einem weiteren Besprechungsraum im ehemaligen Hofgerichtssaal im dritten Obergeschoss, sind unter anderem Büros der städtischen Verwaltung untergebracht.</p>
]]></text>
<space lines="2"/>
<text><![CDATA[
<h2>Wohin mit der Stadtarchiv?</h2>
<p>Das Stadtarchiv war auch bis 2012 im Dachgeschoss und im Rathausanbau untergebracht. Seine umfangreichen Bestände an historischen Dokumenten belasteten nicht nur die Fachwerkkonstruktion des Rathauses, sondern waren auch in Gefahr, bei einem Brand vernichtet zu werden. Während der Restaurierungsmaßnahmen 2012 bis 2016 zog das Archiv in das hinter dem Rathaus stehenden Breuninghaus um. Langfristig ist ein Umzug auf das Gelände des ehemaligen Güterbahnhofs geplant.</p>
]]></text>
</column>
<column>
<text><![CDATA[
<h2>Restaurierung 2012-2016</h2>
<p>Auslöser für die letzte Restaurierung waren, neben veralteter Haustechnik, Brandschutz und unzeitgemäßen Büro- und Besprechungsräumen, vor allem statische Probleme.</p>
<p>Bei der Sanierung kamen sensationelle Entdeckungen im Eingangsbereich zu Tage: Eine einheitliche Halle im Erdgeschoss gab es nie. Stattdessen befanden sich dort drei kleine Hallen zum Verkauf von Brot, Salz und Fleisch. An der Stütze neben dem Eingang zum Treppenhaus ist noch der Ansatz eines Brustriegels sichtbar, der die Halle abgeteilt hat. In der nördlichen Halle fand man an den Deckenbalken noch <a href="01/baeckerzeichenneu.xml" >Zeichen der Bäcker</a>. Die nördliche, bräunlich verputzte Außenwand ist das älteste Bauteil des Rathauses.</p>
]]></text>
<img src="01/ratssaalneu.jpg" maxHeight="310" caption="Ratssaal im ersten Obergeschoss" allowZoom="true" zoomCaption="Ratssaal nach der Sanierung des Rathauses, Foto: Universitätsstadt Tübingen"/>
</column>
</content>
</card>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/astronomischeszifferblattneu.jpg"><p contenteditable="false" data-link="Popup"><span>Das astronomische Zifferblatt, Foto: Christoph Jäckle</span></p><p contenteditable="false" data-link="Popup"><span>Das astronomische Zifferblatt zeigt Jahreszeiten, Tag- und Nachtlängen sowie andere astromische Ereignisse. Das originale Zifferblatt mit dem Tierkreiszeichen von 1511 war nach erheblichen Wetterschäden unbrauchbar. Deswegen wurde es beim Umsetzen der Uhr vom ersten Geschoss in den Ziergiebel im Jahr 1849 wahrscheinlich außer Betrieb genommen, aber weiterhin auf dem Dachboden des Rathauses aufbewahrt. Dieses ursprüngliche Zifferblatt (siehe Abbildung unten) befindet sich im Stadtmuseum Tübingen und kann dort in der Dauerausstellung besichtigt werden.</span></p><img contenteditable="false" src="../01/urspruenglicheszifferblattneu.jpg"><p contenteditable="false" data-link="Popup"><span>Das ursprüngliche Zifferblatt der Astronomischen Uhr, Foto: Stadtmuseum Tübingen</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/astronomischeszifferblattneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Das astronomische Zifferblatt, Foto: Christoph Jäckle</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Das astronomische Zifferblatt zeigt Jahreszeiten, Tag- und Nachtlängen sowie andere astromische Ereignisse. Das originale Zifferblatt mit dem Tierkreiszeichen von 1511 war nach erheblichen Wetterschäden unbrauchbar. Deswegen wurde es beim Umsetzen der Uhr vom ersten Geschoss in den Ziergiebel im Jahr 1849 wahrscheinlich außer Betrieb genommen, aber weiterhin auf dem Dachboden des Rathauses aufbewahrt. Dieses ursprüngliche Zifferblatt (siehe Abbildung unten) befindet sich im Stadtmuseum Tübingen und kann dort in der Dauerausstellung besichtigt werden.</span></p>
]]></text>
<img src="01/urspruenglicheszifferblattneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Das ursprüngliche Zifferblatt der Astronomischen Uhr, Foto: Stadtmuseum Tübingen</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Eine astronomische Uhr ist eine mechanische Uhr, die astronomische Gegebenheiten anzeigt, wie die Position von Sonne und Mond im Tierkreis, die Mondphasen oder die Planetenstellungen. Astronomische Uhren wurden seit dem späten Mittelalter als monumentale Uhren an Türmen oder Rathäusern angebracht.</span></p><img contenteditable="false" src="../01/uhrfrueher.jpg"><p contenteditable="false" data-link="Popup"><span>Die Astronomische Uhr des Tübinger Rathauses, 1826, Foto: Deutsches Literatuarchiv Marbach</span></p><p contenteditable="false" data-link="Popup"><span>Die Astronomische Uhr des Tübinger Rathauses war vorher im ersten Geschoss über dem Haupteingang neben der Rathauskanzel angebracht und wurde erst 1849 in den Ziergiebel versetzt.</span></p></div>
</body></html>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Eine astronomische Uhr ist eine mechanische Uhr, die astronomische Gegebenheiten anzeigt, wie die Position von Sonne und Mond im Tierkreis, die Mondphasen oder die Planetenstellungen. Astronomische Uhren wurden seit dem späten Mittelalter als monumentale Uhren an Türmen oder Rathäusern angebracht.</span></p>
]]></text>
<img src="01/uhrfrueher.jpg"/>
<text><![CDATA[
<p><span class="popuptext">Die Astronomische Uhr des Tübinger Rathauses, 1826, Foto: Deutsches Literatuarchiv Marbach</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Die Astronomische Uhr des Tübinger Rathauses war vorher im ersten Geschoss über dem Haupteingang neben der Rathauskanzel angebracht und wurde erst 1849 in den Ziergiebel versetzt.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/baeckerzeichenneu.jpg"><p contenteditable="false" data-link="Popup"><span>Bäckerzeichen im Rathaus, Brezel mit gekreuztem Backschieber, EG, eingeritzt in einem Balken an der Decke, Foto und Bearbeitung: Tilmann Marstaller</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/baeckerzeichenneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Bäckerzeichen im Rathaus, Brezel mit gekreuztem Backschieber, EG, eingeritzt in einem Balken an der Decke, Foto und Bearbeitung: Tilmann Marstaller</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/breuningneu.jpg"><p contenteditable="false" data-link="Popup"><span>Konrad Breuning (1440 1517) gehörte zu einer einflussreichen Tübinger Familie und bekleidete eine Reihe wichtiger politischer Ämter, unter anderem war er Tübinger Vogt und Mitglied des Hofgerichts. Als Kaiser Maximilian den völlig unfähigen Herzog Eberhard II. absetzte, gehörte Breuning als früherer Berater und Vertrauter von Eberhard im Bart zu dem Zwischenregiment, das solange eingerichtet wurde, bis Herzog Ulrich alt genug war, um die Regierungsgeschäfte zu übernehmen. Als Ulrich angesichts der Bauernaufstände vom „Armen Konrad“ 1514 einen Landtag in Tübingen einberief, leitete Breuning die Verhandlungen. Es gelang ihm für das Bürgertum weit reichende politische Mitspracherechte und weitere Privilegien auszuhandeln. 1517 ließ ihn Herzog Ulrich wegen vermeintlichen Hochverrats hinrichten.</span></p></div>
</body></html>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/breuningneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Konrad Breuning (1440 1517) gehörte zu einer einflussreichen Tübinger Familie und bekleidete eine Reihe wichtiger politischer Ämter, unter anderem war er Tübinger Vogt und Mitglied des Hofgerichts. Als Kaiser Maximilian den völlig unfähigen Herzog Eberhard II. absetzte, gehörte Breuning als früherer Berater und Vertrauter von Eberhard im Bart zu dem Zwischenregiment, das solange eingerichtet wurde, bis Herzog Ulrich alt genug war, um die Regierungsgeschäfte zu übernehmen. Als Ulrich angesichts der Bauernaufstände vom „Armen Konrad“ 1514 einen Landtag in Tübingen einberief, leitete Breuning die Verhandlungen. Es gelang ihm für das Bürgertum weit reichende politische Mitspracherechte und weitere Privilegien auszuhandeln. 1517 ließ ihn Herzog Ulrich wegen vermeintlichen Hochverrats hinrichten.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/cottaneu.jpg"><p contenteditable="false" data-link="Popup"><span>Johann Friedrich Cotta (1764 in Stuttgart 1832 in Stuttgart) betrieb in Tübingen einen der größten europäischen Verlage, gründete die erste überregionale Tageszeitung in Deutschland, erfand das Taschenbuch und setzte sich für Pressefreiheit und Urheberrecht ein. Als Landtagsabgeordneter machte er sich für die Freiheiten des Tübinger Vertrags stark.</span></p></div>
</body></html>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/cottaneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Johann Friedrich Cotta (1764 in Stuttgart 1832 in Stuttgart) betrieb in Tübingen einen der größten europäischen Verlage, gründete die erste überregionale Tageszeitung in Deutschland, erfand das Taschenbuch und setzte sich für Pressefreiheit und Urheberrecht ein. Als Landtagsabgeordneter machte er sich für die Freiheiten des Tübinger Vertrags stark.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/dannneu.jpg"><p contenteditable="false" data-link="Popup"><span>Jakob Heinrich Dann (1720 in Tübingen 1790 in Tübingen) setzte sich als Tübinger Bürgermeister und Landtagsabgeordneter für die im „Tübinger Vertrag“ vereinbarten Rechte gegenüber Herzog Karl Eugen ein. Als er bei seinem Versuch gegen Korruption vorzugehen keine Mehrheiten erhielt, trat er von seinen Ämtern zurück.</span></p></div>
</body></html>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/dannneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Jakob Heinrich Dann (1720 in Tübingen 1790 in Tübingen) setzte sich als Tübinger Bürgermeister und Landtagsabgeordneter für die im „Tübinger Vertrag“ vereinbarten Rechte gegenüber Herzog Karl Eugen ein. Als er bei seinem Versuch gegen Korruption vorzugehen keine Mehrheiten erhielt, trat er von seinen Ämtern zurück.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/drachenzeigerneu.jpg"><p contenteditable="false" data-link="Popup"><span>Der Drachenzeiger hat die Form eines Drachens mit Flügel. Die Verwendung der Drachenform für diesen Zeiger geht auf einen alten chinesischen Glauben zurück, wonach ein Drache Sonne oder Mond bei einer Finsternis verschlingt und wieder ausspuckt.</span></p> <p contenteditable="false" data-link="Popup"><span>Je nach seiner Position im Verhältnis zum Sonnen- und Mondzeiger, zeigt der Drachenzeiger totale und partielle Sonnen- und Mondfinsternisse.</span></p></div>
</body></html>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/drachenzeigerneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der Drachenzeiger hat die Form eines Drachens mit Flügel. Die Verwendung der Drachenform für diesen Zeiger geht auf einen alten chinesischen Glauben zurück, wonach ein Drache Sonne oder Mond bei einer Finsternis verschlingt und wieder ausspuckt.</span></p>
<p><span class="popuptext">Je nach seiner Position im Verhältnis zum Sonnen- und Mondzeiger, zeigt der Drachenzeiger totale und partielle Sonnen- und Mondfinsternisse.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/eberhardfassadeneu.jpg"><p contenteditable="false" data-link="Popup"><span>Ganzfigurporträt von Graf Eberhard im Bart auf der Fassade des Rathauses, Foto: Christoph Jäckle</span></p><p contenteditable="false" data-link="Popup"><span>Eberhard im Bart (1445 in Urach 1496 in Tübingen), Graf und später Herzog von Württemberg, übernahm bereits mit 14 Jahren die Regierungsgeschäfte. Den Beinamen „im Bart“ erhielt er, weil er den Bart, der ihm auf einer Pilgerfahrt nach Jerusalem gewachsen war, nicht mehr abnahm. 1474 heiratete er die steinreiche Markgrafentochter Barbara von Mantua aus dem Hause Gonzaga, wodurch Württemberg mit einem der glanzvollsten Zentren der italienischen Renaissance in Kontakt kam. Er gründete 1477 mit Unterstützung seiner Mutter und seiner Frau die Universität Tübingen. Daneben galt als seine größte politische Leistung die Wiedervereinigung Württembergs — das Land war seit 1442 in einen Stuttgarter und einen Uracher Teil gespalten, was es gegenüber dem Kaiser und den freien Reichsstädten dauerhaft geschwächt hatte. 1495 wurde Eberhard in den Herzogsstand erhoben und verlegte die Residenz von Urach nach Stuttgart. Sein Lebensmotto „Attempto“ - „Ich wag's!“ wurde zur Devise der Tübinger Universität, seine Beliebtheit wurde vor allem im 19. Jahrhundert legendär.</span></p></div>
</body></html>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/eberhardfassadeneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Ganzfigurporträt von Graf Eberhard im Bart auf der Fassade des Rathauses, Foto: Christoph Jäckle</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Eberhard im Bart (1445 in Urach 1496 in Tübingen), Graf und später Herzog von Württemberg, übernahm bereits mit 14 Jahren die Regierungsgeschäfte. Den Beinamen „im Bart“ erhielt er, weil er den Bart, der ihm auf einer Pilgerfahrt nach Jerusalem gewachsen war, nicht mehr abnahm. 1474 heiratete er die steinreiche Markgrafentochter Barbara von Mantua aus dem Hause Gonzaga, wodurch Württemberg mit einem der glanzvollsten Zentren der italienischen Renaissance in Kontakt kam. Er gründete 1477 mit Unterstützung seiner Mutter und seiner Frau die Universität Tübingen. Daneben galt als seine größte politische Leistung die Wiedervereinigung Württembergs — das Land war seit 1442 in einen Stuttgarter und einen Uracher Teil gespalten, was es gegenüber dem Kaiser und den freien Reichsstädten dauerhaft geschwächt hatte. 1495 wurde Eberhard in den Herzogsstand erhoben und verlegte die Residenz von Urach nach Stuttgart. Sein Lebensmotto „Attempto“ - „Ich wag's!“ wurde zur Devise der Tübinger Universität, seine Beliebtheit wurde vor allem im 19. Jahrhundert legendär.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1003 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/gerechtigkeitneu.jpg"><p contenteditable="false" data-link="Popup"><span>Unten links an der Rathausfassade sieht man Justitia, die Personifizierung der Gerechtigkeit, mit ihren Attributen Schwert und Waage.</span></p></div>
</body></html>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/gerechtigkeitneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Unten links an der Rathausfassade sieht man Justitia, die Personifizierung der Gerechtigkeit, mit ihren Attributen Schwert und Waage.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/girlandeausweinblaettern.jpg"><p contenteditable="false" data-link="Popup"><span>Eine Girlande aus Weinblättern ist um den Körper der weiblichen Figur geschlungen.</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/girlandeausweinblaettern.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Eine Girlande aus Weinblättern ist um den Körper der weiblichen Figur geschlungen.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Grisaillemalerei bezeichnet eine Malerei, die ausschließlich in Weiß, Schwarz und Grautönen ausgeführt ist. Der Begriff leitet sich von dem französischen „gris“ ab und bedeutet grau. Die Grisaillemalerei wurde gerne eingesetzt, um dreidimensionale, skulpturale Effekte zu schaffen.</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Grisaillemalerei bezeichnet eine Malerei, die ausschließlich in Weiß, Schwarz und Grautönen ausgeführt ist. Der Begriff leitet sich von dem französischen „gris“ ab und bedeutet grau. Die Grisaillemalerei wurde gerne eingesetzt, um dreidimensionale, skulpturale Effekte zu schaffen.</span></p>
]]></text>
<!--<img src="01/grisaillemalerei.jpg" caption=" "/> -->
<!-- <text><![CDATA[
<p><span class="popuptext">Noch heute ist am Rathaus von der Haaggasse aus die Grisaillemalerei aus dem 16. und 17. Jahrhundert von Ornamenten mit Ranken, Girlanden, Vasen, Menschen, Tieren, Masken und architektonischen Formen zu sehen.</span></p>
]]></text> -->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Grisaillemalerei bezeichnet eine Malerei, die ausschließlich in Weiß, Schwarz und Grautönen ausgeführt ist. Der Begriff leitet sich ab von dem französischen „gris“ und bedeutet grau. Die Grisaillemalerei wurde gerne eingesetzt, um dreidimensionale, skulpturale Effekte zu schaffen.</span></p><img contenteditable="false" src="../01/grisaillemalereirathaus.jpg"></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Grisaillemalerei bezeichnet eine Malerei, die ausschließlich in Weiß, Schwarz und Grautönen ausgeführt ist. Der Begriff leitet sich ab von dem französischen „gris“ und bedeutet grau. Die Grisaillemalerei wurde gerne eingesetzt, um dreidimensionale, skulpturale Effekte zu schaffen.</span></p>
]]></text>
<img src="01/grisaillemalereirathaus.jpg" caption=" "/>
<!-- <text><![CDATA[
<p><span class="popuptext">Rathaus, Diaserie von Peter Neumann für eine geplante Neuauflage des Rathausführers.Aufnahmen aus dem Jahr 2001.Stadtarchiv Tübingen, D 150/363-140/18</span></p>
]]></text>-->
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/hofgerichtssaal.jpg"><p contenteditable="false" data-link="Popup"><span>Hofgerichtssaal des Rathauses nach der Sanierung 2016, Stadtarchiv Tübingen</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/hofgerichtssaal.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Hofgerichtssaal des Rathauses nach der Sanierung 2016, Stadtarchiv Tübingen</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/trauzimmer.jpg"><p contenteditable="false" data-link="Popup"><span>Die bemalte Holzvertäfelung im Trauzimmer, Foto: Christoph Jäckle</span></p><p contenteditable="false" data-link="Popup"><span>Eine Holzvertäfelung ist eine hölzerne Wand- oder Deckenverkleidung von Innenräumen zum Schmuck, zur Wärmedämmung oder zum Schutz von darunterliegenden Schichten.</span></p></div>
</body></html>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/trauzimmer.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Die bemalte Holzvertäfelung im Trauzimmer, Foto: Christoph Jäckle</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Eine Holzvertäfelung ist eine hölzerne Wand- oder Deckenverkleidung von Innenräumen zum Schmuck, zur Wärmedämmung oder zum Schutz von darunterliegenden Schichten.</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/huberneu.jpg"><p contenteditable="false" data-link="Popup"><span>Johann Ludwig Huber (1723 in Großheppach 1800 in Stuttgart) war Jurist und ab 1762 Oberamtmann von Tübingen. Er wurde auf Befehl des Herzogs Karl Eugen abgesetzt und auf dem Hohenasperg inhaftiert, nachdem er es abgelehnt hatte, eine Militärsteuer ohne die Zustimmung der Landstände einzutreiben. Mit der Steuer wollte Karl Eugen Soldaten rekrutieren, um sie nach Frankreich zu „verkaufen“.</span></p></div>
</body></html>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/huberneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Johann Ludwig Huber (1723 in Großheppach 1800 in Stuttgart) war Jurist und ab 1762 Oberamtmann von Tübingen. Er wurde auf Befehl des Herzogs Karl Eugen abgesetzt und auf dem Hohenasperg inhaftiert, nachdem er es abgelehnt hatte, eine Militärsteuer ohne die Zustimmung der Landstände einzutreiben. Mit der Steuer wollte Karl Eugen Soldaten rekrutieren, um sie nach Frankreich zu „verkaufen“.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 215 KiB

View File

@ -0,0 +1,123 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title>Das Rathaus</title>
<link rel="stylesheet" href="../_theme/css/editor.css">
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/subcard.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
<script src="../../../../../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../../../../../lib/3rdparty/jquery.hypher.js"></script>
<script src="../../../../../lib/3rdparty/hyphenation/de.js"></script>
</head>
<body class="info-card" style="width: 1400px; height: 1200px;">
<div class="mainview">
<header class="columns">
<figure class="thumbnail-wrapper">
<img draggable="false" contenteditable="false" class="thumbnail" src="../01/thumbnail.jpg">
</figure>
<div class="overview column content">
<h1 contenteditable="false">Das Rathaus</h1>
<p class="misc" contenteditable="false"></p>
<p contenteditable="false">Das Rathaus ist das wichtigste Gebäude auf dem Marktplatz. Mit dem Bau wurde 1435 begonnen, seitdem wurde es immer wieder verändert, sodass es Merkmale vieler Baustile vom Spätmittelalter bis zum 21. Jahrhundert aufweist. Die auffällige Fassadengestaltung stammt aus dem 19. Jahrhundert.</p>
</div>
</header>
<main class="subcards-container columns is-multiline is-centered" tabindex="" data-blocks="Card,Card with Image,Card with Figure"><div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard artist" onclick="Card.openIndexCard(event, '../01/01_baugeschichte.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 contenteditable="false">Das wichtigste <br>städtische Gebäude</h2>
</div>
<div class="wrapper">
<div class="preview content"><p contenteditable="false">Nach 200 Jahren <br>endlich ein Rathaus</p></div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div>
<div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard thema" onclick="Card.openIndexCard(event, '../01/01_funktiondamals.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 contenteditable="false">Alles unter einem Dach</h2>
</div>
<div class="wrapper">
<div class="preview content"><p contenteditable="false">Räte, Richter, Händler <br> und Halunken</p></div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div>
<div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard thema" onclick="Card.openIndexCard(event, '../01/01_funktionheute.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 contenteditable="false">Im Wandel der Zeit</h2>
</div>
<div class="wrapper">
<div class="preview content"><p contenteditable="false">Was ist geblieben <br>was hat sich verändert?</p></div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div>
<div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard details" onclick="Card.openIndexCard(event, '../01/01_besonderheiten.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 contenteditable="false">Fassadenmalerei</h2>
</div>
<div class="wrapper">
<div class="preview content"><p contenteditable="false">Fassade aus <br>Geist und Politik</p></div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div>
<div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard details" onclick="Card.openIndexCard(event, '../01/01_besonderheiten2.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 contenteditable="false">Tübinger Rebmännle</h2>
</div>
<div class="wrapper">
<div class="preview content"><p contenteditable="false">Eine unbekleidete Frau?</p></div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div>
<div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard details" onclick="Card.openIndexCard(event, '../01/01_besonderheiten3.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 contenteditable="false">Die Astronomische Uhr</h2>
</div>
<div class="wrapper">
<div class="preview content"><p contenteditable="false">Revolutionäres <br>Meisterwerk der Technik</p></div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div></main>
<div class="button icon close view-button inverted transparent-background" onclick="Card.close(event)"></div>
</div>
</body></html>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Die sogenannte „Lederbühne“ befand sich im ersten Geschoss. Dennoch konnten die Lederwaren fast ebenerdig angeliefert werden, da der Saal ursprünglich einen direkten Zugang von der Haaggasse aus besaß.</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Die sogenannte „Lederbühne“ befand sich im ersten Geschoss. Dennoch konnten die Lederwaren fast ebenerdig angeliefert werden, da der Saal ursprünglich einen direkten Zugang von der Haaggasse aus besaß.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Der Saal besaß ursprünglich einen direkten Zugang von der Haaggasse aus, sodass die Lederwaren fast ebener-dig angeliefert werden konnten.</span></p>
]]></text> -->
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/malschichten.png"><p contenteditable="false" data-link="Popup"><span>Die zwei älteren Malschichten des Rathauses, eine Ausfüllung der Fachwerkfelder und eine Grisaillemalerei, Zeichnung: Hochbauamt, Stadtarchiv Tübingen</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/malschichten.png" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Die zwei älteren Malschichten des Rathauses, eine Ausfüllung der Fachwerkfelder und eine Grisaillemalerei, Zeichnung: Hochbauamt, Stadtarchiv Tübingen</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Die ursprüngliche Bemalung des Rathauses mag ähnlich ausgesehen haben, wie diese Abbildung von Fachwerkfeldern mit schmaler Umrandung.</span></p>
]]></text> -->
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/mondphasenanzeigeneu.jpg"><p contenteditable="false" data-link="Popup"><span>Die Mondphasenanzeige hat einen feststehenden Teil aus einem silbernen Halbkreis mit zwei kleineren Halbkreisen und einen beweglichen Teil, nämlich einen Zeiger, der an beiden Enden vergoldete Vollmondscheiben mit einem Gesicht hat. Durch seine Bewegung stellt der Zeiger die passende Mondphase dar, wie z. B. den Neu- oder Vollmond.</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/mondphasenanzeigeneu.jpg" caption=" "/>
<text><![CDATA[<p>
<span class="popuptext">Die Mondphasenanzeige hat einen feststehenden Teil aus einem silbernen Halbkreis mit zwei kleineren Halbkreisen und einen beweglichen Teil, nämlich einen Zeiger, der an beiden Enden vergoldete Vollmondscheiben mit einem Gesicht hat. Durch seine Bewegung stellt der Zeiger die passende Mondphase dar, wie z. B. den Neu- oder Vollmond.</span></p>
]]></text>
<!-- <text><![CDATA[<p><span class="popuptext"><span class="popuptext">Das Mondphasen-Zifferblatt hat einen feststehenden Teil aus einem silbernen Halbkreis mit zwei kleineren Halbkreisen und einen beweglichen Teil, nämlich einen Zeiger, der an seinen beiden Enden vergoldete Vollmondscheiben mit einem Gesicht hat. Durch seine Bewegung stellt der Zeiger die passende Mondphase dar, wie z. B. Neu- oder Vollmond an.</span></p>
]]></text> -->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/mondzeigerneu.jpg"><p contenteditable="false" data-link="Popup"><span>Der Mondzeiger besitzt an einem Ende einen vergoldeten Halbmond mit Gesicht und am anderen Ende eine goldene Kugel. Er zeigt die scheinbare Position des Mondes zur Position der Sonne an. Steht beispielsweise die Sichel des Mondzeigers auf dem Sonnensymbol des Sonnenzeigers so ist Neumond, steht sie dagegen auf dem Sternsymbol des Sonnenzeigers so ist Vollmond.</span></p></div>
</body></html>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/mondzeigerneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der Mondzeiger besitzt an einem Ende einen vergoldeten Halbmond mit Gesicht und am anderen Ende eine goldene Kugel. Er zeigt die scheinbare Position des Mondes zur Position der Sonne an. Steht beispielsweise die Sichel des Mondzeigers auf dem Sonnensymbol des Sonnenzeigers so ist Neumond, steht sie dagegen auf dem Sternsymbol des Sonnenzeigers so ist Vollmond.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Der Mondzeiger besitzt an einem Ende einen vergoldeten Halbmond mit Gesicht (links in der Abbildung) und am andern Ende eine goldene Kugel (rechts in der Abbildung). Er braucht 27 Tage, 7 Stunden und 43 Minuten für einen Umlauf. Exakt so lange braucht der Mond, um die Erde einmal zu umkreisen. Seine Stellung zum Sonnenzeiger gibt die Mondphase an, die zusätzlich auch am Mondphasenzifferblatt angezeigt wird. Liegen die beiden Zeiger einander gegenüber ist Vollmond, decken sie sich ist Neumond.</span></p>
]]></text> -->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Im Öhrn des Rathauses befinden sich acht Gerechtigkeitsbilder. Darunter auch das biblische „Gleichnis vom Splitter und Balken“. Es fordert dazu auf, sich zuerst eigener Fehler bewusst zu werden, bevor man die Fehler anderer verurteilt. Hier appelliert es an verantwortungsvolle Rechtsprechung.</span></p><img contenteditable="false" src="../01/gleichnis.jpg"><p contenteditable="false" data-link="Popup"><span>„Gleichnis vom Splitter und Balken“ im Öhrn des Rathauses, Foto: Peter Neumann, Stadtarchiv Tübingen</span></p><p contenteditable="false" data-link="Popup"><span>Solche allegorische Darstellungen, die die Idee von Recht und Gerechtigkeit zum Ausdruck bringen, waren im Mittelalter und der frühen Neuzeit häufig an Orten der Rechtsprechung angebracht, also an Rathäusern, Pfalzen, Gerichtsportalen oder Justizpalästen.</span></p></div>
</body></html>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Im Öhrn des Rathauses befinden sich acht Gerechtigkeitsbilder. Darunter auch das biblische „Gleichnis vom Splitter und Balken“. Es fordert dazu auf, sich zuerst eigener Fehler bewusst zu werden, bevor man die Fehler anderer verurteilt. Hier appelliert es an verantwortungsvolle Rechtsprechung.</span></p>
]]></text>
<img src="01/gleichnis.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">„Gleichnis vom Splitter und Balken“ im Öhrn des Rathauses, Foto: Peter Neumann, Stadtarchiv Tübingen</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Solche allegorische Darstellungen, die die Idee von Recht und Gerechtigkeit zum Ausdruck bringen, waren im Mittelalter und der frühen Neuzeit häufig an Orten der Rechtsprechung angebracht, also an Rathäusern, Pfalzen, Gerichtsportalen oder Justizpalästen.</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Der Öhrn ist eine süddeutsche Bezeichnung für Gang oder Flur, ein Raum, der zur Erschließung weiterer Räume dient.</span></p><img contenteditable="false" src="../01/oehrn.jpg"><p contenteditable="false" data-link="Popup"><span>Der Öhrn des Rathauses, Wandmalereien nach der Renovierung 1952, Foto: Gisela Fendel, Stadtarchiv Tübingen</span></p><p contenteditable="false" data-link="Popup"><span>Im Rathaus war der Öhrn nicht nur Vorraum für die beiden Gerichtsstuben, sondern diente früher wie heute als offizieller Empfangsraum der Stadt. Er war ursprünglich über eine freiliegende Holztreppe von der Haaggasse aus zu betreten, die der Erweiterung 1908 zum Opfer fiel.</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Der Öhrn ist eine süddeutsche Bezeichnung für Gang oder Flur, ein Raum, der zur Erschließung weiterer Räume dient.</span></p>
]]></text>
<img src="01/oehrn.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der Öhrn des Rathauses, Wandmalereien nach der Renovierung 1952, Foto: Gisela Fendel, Stadtarchiv Tübingen</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Im Rathaus war der Öhrn nicht nur Vorraum für die beiden Gerichtsstuben, sondern diente früher wie heute als offizieller Empfangsraum der Stadt. Er war ursprünglich über eine freiliegende Holztreppe von der Haaggasse aus zu betreten, die der Erweiterung 1908 zum Opfer fiel.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/osianderneu.jpg"><p contenteditable="false" data-link="Popup"><span>Johannes Osiander (1657 in Tübingen 1724 in Tübingen) war Theologe, Professor für Griechisch, Hebräisch und Geographie und Diplomat. Er wirkte ab 1688 als Unterhändler im Pfälzischen Erbfolgekrieg. 1693 bewahrte er Tübingen durch sein Verhandlungsgeschick vor der Zerstörung durch die Franzosen.</span></p></div>
</body></html>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/osianderneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Johannes Osiander (1657 in Tübingen 1724 in Tübingen) war Theologe, Professor für Griechisch, Hebräisch und Geographie und Diplomat. Er wirkte ab 1688 als Unterhändler im Pfälzischen Erbfolgekrieg. 1693 bewahrte er Tübingen durch sein Verhandlungsgeschick vor der Zerstörung durch die Franzosen.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Angeblich soll während der Verhandlungen auf dem Schlachtfeld eine Kugel direkt neben der Delegation eingeschlagen sein, zu der Osiander gehörte und ihm die Perücke vom Kopf gerissen haben. Dass er sie einfach kaltblütig wieder aufsetzte und in aller Ruhe weiter verhandelte, soll die Franzosen so beeindruckt haben, dass sie von einem weiteren Vorrücken absahen.</span></p>
]]></text> -->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 MiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Der Ratssaal im ersten Obergeschoss wurde bei den durchgreifenden Sanierungsarbeiten Mitte des 20. Jahrhunderts von späteren Einbauten befreit, die ursprüngliche Holzkonstruktion mit den fünf mächtigen Pfeilern ertüchtigt sowie eine neue Holzdecke&nbsp;eingezogen.</span></p></div>
</body></html>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Der Ratssaal im ersten Obergeschoss wurde bei den durchgreifenden Sanierungsarbeiten Mitte des 20. Jahrhunderts von späteren Einbauten befreit, die ursprüngliche Holzkonstruktion mit den fünf mächtigen Pfeilern ertüchtigt sowie eine neue Holzdecke eingezogen.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Der Saal des ersten Obergeschosses wurde bei den durchgreifenden Sanierungsarbeiten Mitte des 20. Jahrhunderts von späteren Einbauten befreit, die ursprüngliche Holzkonstruktion mit den fünf mächtigen Pfeilern erneuert sowie eine neue Holzdecke eingezogen. Die Aufstellung der Tische für die Bürgermeister an der Längswand und für die Gemeinderatsmitglieder gegenüber vermeidet die Sichtbehinderung trotz der dicken Pfeiler.</span></p>
]]></text>-->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/rebmaennle.jpg"><p contenteditable="false" data-link="Popup"><span>Das Rebmännle befindet sich an der Südostecke des Rathauses (siehe roter Kreis). Foto: Otto Buchegger, Stadtarchiv Tübingen</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/rebmaennle.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Das Rebmännle befindet sich an der Südostecke des Rathauses (siehe roter Kreis). Foto: Otto Buchegger, Stadtarchiv Tübingen</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Insgesamt wurde bei der neuesten Restaurierung darauf geachtet, das Rathaus wieder „historischer“ zu machen. Zum Beispiel orientierte man sich bei den Fenstern im ersten und zweiten Geschoss alten Bildern aus dem 19. Jahrhundert. Auch die dreiteilige Halle im Erdgeschoss wurde wieder sichtbar gemacht.</span></p></div>
</body></html>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Insgesamt wurde bei der neuesten Restaurierung darauf geachtet, das Rathaus wieder „historischer“ zu machen. Zum Beispiel orientierte man sich bei den Fenstern im ersten und zweiten Geschoss alten Bildern aus dem 19. Jahrhundert. Auch die dreiteilige Halle im Erdgeschoss wurde wieder sichtbar gemacht.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Insgesamt wurde bei der neuesten Restaurierung darauf geachtet, das Rathaus wieder „historischer“ zu machen. Bei den Fenstern im ersten und zweiten Geschoss orientierte man sich an alten Bildern aus dem 19. Jahrhundert. Auch die dreiteilige Halle im Erdgeschoss wurde wieder sichtbar gemacht.</span></p>
]]></text> -->
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Beispielsweise beschreibt der Arzt Jean Liebault in seinem Buch „Drei Werke zu Verschönerung und zum Schmuck des menschlichen Körpers“ von 1582 schöne Frauen seiner Zeit als die, die „[…] einen vollen, ausladenden, weißen Oberköper haben mit zwei runden festen Äpfeln, die wie kleine Wellen auf und ab wogen; die Arme sollen fleischig und kräftig sein; die Hände weiß, keinesfalls länglich und nicht sehr breit und auf dem Handrücken darf man keine Knoten oder Venen sehen; die Füße sollen klein, kurz, trocken und rund sein, frisch und leicht. [...] Das Kinn kurz und in der Mitte vertieft und im unteren Bereich so fleischig und fett, dass es zum Hals hin hinabhängt und ein zweites Kinn zu formen scheint; die leuchtenden, blutroten Wangen müssen hoch sein, mit kleinen Grübchen in der Mitte, in denen ein hübsches Lachen sitzt; die Ohren sollen rund, kurz und nicht hängend sein, Hals und Kehle wohlgerundet […]. Dies ist das Bild und das perfekte Beispiel wahrhafter und naiver weiblicher Schönheit.“</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Beispielsweise beschreibt der Arzt Jean Liebault in seinem Buch „Drei Werke zu Verschönerung und zum Schmuck des menschlichen Körpers“ von 1582 schöne Frauen seiner Zeit als die, die „[…] einen vollen, ausladenden, weißen Oberköper haben mit zwei runden festen Äpfeln, die wie kleine Wellen auf und ab wogen; die Arme sollen fleischig und kräftig sein; die Hände weiß, keinesfalls länglich und nicht sehr breit und auf dem Handrücken darf man keine Knoten oder Venen sehen; die Füße sollen klein, kurz, trocken und rund sein, frisch und leicht. [...] Das Kinn kurz und in der Mitte vertieft und im unteren Bereich so fleischig und fett, dass es zum Hals hin hinabhängt und ein zweites Kinn zu formen scheint; die leuchtenden, blutroten Wangen müssen hoch sein, mit kleinen Grübchen in der Mitte, in denen ein hübsches Lachen sitzt; die Ohren sollen rund, kurz und nicht hängend sein, Hals und Kehle wohlgerundet […]. Dies ist das Bild und das perfekte Beispiel wahrhafter und naiver weiblicher Schönheit.“</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Das Aussehen des „Rebmännles“ entspricht ziemlich genau dem Schönheitsideal zwischen Renaissance und Frühbarock. Der Arzt Jean Liebault beschreibt in seinem Buch „Drei Werke zu Verschönerung und zum Schmuck des menschlichen Körpers“ von 1582 schöne Frauen seiner Zeit als die, die „[…] einen vollen, ausladenden, weißen Oberköper haben mit zwei runden festen Äpfeln, die wie kleine Wellen auf und ab wogen; die Arme sollen fleischig und kräftig sein; die Hände weiß, keinesfalls länglich und nicht sehr breit und auf dem Handrücken darf man keine Knoten oder Venen sehen; die Füße sollen klein, kurz, trocken und rund sein, frisch und leicht. [...] Das Kinn kurz und in der Mitte vertieft und im unteren Bereich so fleischig und fett, dass es zum Hals hin hinabhängt und ein zweites Kinn zu formen scheint; die leuchtenden, blutroten Wangen müssen hoch sein, mit kleinen Grübchen in der Mitte, in denen ein hübsches Lachen sitzt; die Ohren sollen rund, kurz und nicht hängend sein, Hals und Kehle wohlgerundet […]. Dies ist das Bild und das perfekte Beispiel wahrhafter und naiver weiblicher Schönheit.“</span></p>
]]></text> -->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Für kleinere Zusammenkünfte ist der kleine Sitzungssaal oder der ehemalige Hofgerichtssaal vorgesehen.</span></p><img contenteditable="false" src="../01/sitzungssaal.jpg"><p contenteditable="false" data-link="Popup"><span>Der kleine Sitzungssaal im zweiten Geschoss des Rathauses, Foto: Peter Neumann, Stadtarchiv</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Für kleinere Zusammenkünfte ist der kleine Sitzungssaal oder der ehemalige Hofgerichtssaal vorgesehen.</span></p>
]]></text>
<img src="01/sitzungssaal.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der kleine Sitzungssaal im zweiten Geschoss des Rathauses, Foto: Peter Neumann, Stadtarchiv</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>An der Astronomischen Uhr können Sonnen- und Mondfinsternisse abgelesen werden. Wenn Sonnen-, Mond- und Drachenzeiger übereinanderstehen zeigt dies eine Sonnenfinsternis an. Wenn sich Sonnen- und Mondzeiger genau gegenüberliegen und mit dem Drachenzeiger eine Linie bilden, zeigt dies eine Mondfinsternis an.</span></p></div>
</body></html>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">An der Astronomischen Uhr können Sonnen- und Mondfinsternisse abgelesen werden. Wenn Sonnen-, Mond- und Drachenzeiger übereinanderstehen zeigt dies eine Sonnenfinsternis an. Wenn sich Sonnen- und Mondzeiger genau gegenüberliegen und mit dem Drachenzeiger eine Linie bilden, zeigt dies eine Mondfinsternis an.</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/sonnenzeigerneu.jpg"><p contenteditable="false" data-link="Popup"><span>Der Sonnenzeiger hat an einem Ende eine vergoldete Sonne mit Gesicht und am anderen Ende einen goldenen Stern. Er bewegt sich täglich ein „knappes“ Grad und braucht 365 Tage, 5 Stunden, 48 Minuten und 46 Sekunden für einen Umlauf durch die Tierkreiszeichen. In diesem Zeitraum wird die Sonne auch einmal von der Erde umkreist.</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/sonnenzeigerneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der Sonnenzeiger hat an einem Ende eine vergoldete Sonne mit Gesicht und am anderen Ende einen goldenen Stern. Er bewegt sich täglich ein „knappes“ Grad und braucht 365 Tage, 5 Stunden, 48 Minuten und 46 Sekunden für einen Umlauf durch die Tierkreiszeichen. In diesem Zeitraum wird die Sonne auch einmal von der Erde umkreist.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Der Sonnenzeiger hat an einem Ende eine vergoldete Sonne mit Gesicht (links in der Abbildung) und am anderen Ende einen goldenen Stern (rechts in der Abbildung). Er bewegt sich täglich um ca. 1 Grad weiter und braucht 365 Tage, 5 Stunden, 48 Minuten und 46 Sekunden für einen Umlauf durch die Tierkreiszeichen. In diesem Zeitraum wird die Sonne auch einmal von der Erde umkreist.</span></p>
]]></text> -->
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/spital.jpg"><p contenteditable="false" data-link="Popup"><span>Das Spital (heutiges Bürgerheim), Foto: Christoph Jäckle</span></p><p contenteditable="false" data-link="Popup"><span>Das ehemalige Tübinger Spital (heutiges Bürgerheim) wurde im 13. Jahrhundert gegründet und befand sich in der Schmiedtorstraße 2.</span></p> <p contenteditable="false" data-link="Popup"><span>Der Begriff Spital existiert seit dem 4. Jahrhundert und bezeichnete eine Einrichtung, die unterschiedliche Aufgaben der sozialen Fürsorge erfüllte: Zum Beispiel als Alten- oder Pflegeheim, Armen- oder Waisenhaus. Erst im 18. Jahrhundert wurden Kranke aufgenommen und im 19. Jahrhundert bezeichnete man ein Krankenhaus als Spital.</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<!-- <text><![CDATA[
<p><span class="popuptext">Das Wort „Spital“ ist aus dem lateinischen Wort „hospes“ (Gast) abgeleitet und eine alte Bezeichnung für ein Pflege- oder Altenheim.</span></p>
]]></text> -->
<img src="01/spital.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Das Spital (heutiges Bürgerheim), Foto: Christoph Jäckle</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Das ehemalige Tübinger Spital (heutiges Bürgerheim) wurde im 13. Jahrhundert gegründet und befand sich in der Schmiedtorstraße 2.</span></p>
<p><span class="popuptext">Der Begriff Spital existiert seit dem 4. Jahrhundert und bezeichnete eine Einrichtung, die unterschiedliche Aufgaben der sozialen Fürsorge erfüllte: Zum Beispiel als Alten- oder Pflegeheim, Armen- oder Waisenhaus. Erst im 18. Jahrhundert wurden Kranke aufgenommen und im 19. Jahrhundert bezeichnete man ein Krankenhaus als Spital.</span></p>
]]></text>
<!-- <text><![CDATA[
<p><span class="popuptext">Der Begriff Spital existiert seit dem 4. Jahrhundert und bezeichnete eine Einrichtung, die unterschiedliche Aufgaben der sozialen Fürsorge erfüllte: Zum Beispiel als Pilgerherberge, Alten- oder Pflegeheim, Armen- oder Waisenhaus. Erst in 18. Jahrhundert werden Kranke aufgenommen und im 19. Jahrhundert bezeichnet man ein Krankenhaus als Spital.</span></p>
]]></text> -->
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/tagnacht.jpg"><p contenteditable="false" data-link="Popup"><span>Die Position des Sonnenzeigers auf dem mittleren Ring außen schwarz­weiß gezahnt, innen rotbraun gibt die Tag- und Nachtlängen an. Auf diesem Ring befinden sich vergoldete Zahlen von 8 bis 16 beginnend bei sechs Uhr. Sie sind einmal im und einmal gegen den Uhrzeigerdrehsinn angeordnet. Während die Zahl, die sich auf dem Schnittpunkt der Zeigerstande unter des Sonnenkopfes mit dem braunen Ring des Sonnenzeigers befindet, die Tageslänge (tägliche Sonnenscheindauer) angibt, zeigt der Schnittpunkt unter der Sternseite des Sonnenzeigers die Nachtlänge. So sieht man z. B. in der Abbildung, dass der Tag ca. 11 Stunden und die Nacht ca. 13 Stunden dauert.</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/tagnacht.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Die Position des Sonnenzeigers auf dem mittleren Ring außen schwarz-weiß gezahnt, innen rotbraun gibt die Tag- und Nachtlängen an. Auf diesem Ring befinden sich vergoldete Zahlen von 8 bis 16 beginnend bei sechs Uhr. Sie sind einmal im und einmal gegen den Uhrzeigerdrehsinn angeordnet. Während die Zahl, die sich auf dem Schnittpunkt der Zeigerstande unter des Sonnenkopfes mit dem braunen Ring des Sonnenzeigers befindet, die Tageslänge (tägliche Sonnenscheindauer) angibt, zeigt der Schnittpunkt unter der Sternseite des Sonnenzeigers die Nachtlänge. So sieht man z. B. in der Abbildung, dass der Tag ca. 11 Stunden und die Nacht ca. 13 Stunden dauert.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/detailuhrneu.jpg"><p contenteditable="false" data-link="Popup"><span>Auf dem äußersten Ring des astronomischen Zifferblatts sind die zwölf Tierkreiszeichen aufgemalt. Sie zeigen in drei Gruppen beginnend mit dem Widder als Frühlingsanfang (siehe Abbildung) die vier Jahreszeiten. Der sich anschließende Ring außen schwarz­weiß gezahnt, innen rotbraun teilt die Tierkreiszeichen in 30° Segmente. Deshalb findet sich am Beginn jeden Tierkreiszeichens eine vergoldete 30.</span></p></div>
</body></html>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/detailuhrneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Auf dem äußersten Ring des astronomischen Zifferblatts sind die zwölf Tierkreiszeichen aufgemalt. Sie zeigen in drei Gruppen beginnend mit dem Widder als Frühlingsanfang (siehe Abbildung) die vier Jahreszeiten. Der sich anschließende Ring außen schwarz-weiß gezahnt, innen rotbraun teilt die Tierkreiszeichen in 30° Segmente. Deshalb findet sich am Beginn jeden Tierkreiszeichens eine vergoldete 30.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/uhlandneu.jpg"><p contenteditable="false" data-link="Popup"><span>Ludwig Uhland (1787 in Tübingen 1862 in Tübingen) war nicht nur Dichter und Sprachwissenschaftler, sondern vor allem einer der bedeutendsten Politiker seiner Zeit, der als unabhängiges Mitglied des Frankfurter Parlamentes couragiert für Freiheit und Menschenwürde kämpfte. Als württembergischer Abgeordneter setzte er sich bei der Diskussion um eine Verfassung für das Königreich Württemberg für das „gute, alte Recht“ des Tübinger Vertrags ein.</span></p></div>
</body></html>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/uhlandneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Ludwig Uhland (1787 in Tübingen 1862 in Tübingen) war nicht nur Dichter und Sprachwissenschaftler, sondern vor allem einer der bedeutendsten Politiker seiner Zeit, der als unabhängiges Mitglied des Frankfurter Parlamentes couragiert für Freiheit und Menschenwürde kämpfte. Als württembergischer Abgeordneter setzte er sich bei der Diskussion um eine Verfassung für das Königreich Württemberg für das „gute, alte Recht“ des Tübinger Vertrags ein.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/umhang.jpg"><p contenteditable="false" data-link="Popup"><span>Der Umhang von Rebmännle erinnert an die Form eines Weinblatts. Foto: Peter Neumann, Stadtarchiv Tübingen</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/umhang.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der Umhang von Rebmännle erinnert an die Form eines Weinblatts. Foto: Peter Neumann, Stadtarchiv Tübingen</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 225 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/vorderheutigenfassade.jpg"><p contenteditable="false" data-link="Popup"><span>Das Rathaus vor der Renovierung 1876, Foto: Paul Sinner, Stadtarchiv Tübingen</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/vorderheutigenfassade.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Das Rathaus vor der Renovierung 1876, Foto: Paul Sinner, Stadtarchiv Tübingen</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/weintraube.jpg"><p contenteditable="false" data-link="Popup"><span>Auf einer vollen Weintraube tanzt die nackte, weibliche Figur.</span></p></div>
</body></html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/weintraube.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Auf einer vollen Weintraube tanzt die nackte, weibliche Figur.</span></p>
]]></text>
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/wissenschaftneu.jpg"><p contenteditable="false" data-link="Popup"><span>Rechts unten auf der Fassade sieht man Minerva als Göttin der Weisheit, der Kriegsführung und der Wissenschaft. Zu ihrer Linken sieht man ein Schild, was als eines ihrer Attribute gilt.</span></p></div>
</body></html>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/wissenschaftneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Rechts unten auf der Fassade sieht man Minerva als Göttin der Weisheit, der Kriegsführung und der Wissenschaft. Zu ihrer Linken sieht man ein Schild, was als eines ihrer Attribute gilt.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/wohlstandneu.jpg"><p contenteditable="false" data-link="Popup"><span>Ceres, Göttin des Ackerbaus, befindet sich als Personifizierung des wirtschaftlichen Wohlstands an der Rathausfassade links neben dem Balkon. Sie hält ihre Attribute Ährengarbe und Füllhorn mit Früchten in den Armen.</span></p></div>
</body></html>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/wohlstandneu.jpg"/>
<text><![CDATA[
<p><span class="popuptext">Ceres, Göttin des Ackerbaus, befindet sich als Personifizierung des wirtschaftlichen Wohlstands an der Rathausfassade links neben dem Balkon. Sie hält ihre Attribute Ährengarbe und Füllhorn mit Früchten in den Armen.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><p contenteditable="false" data-link="Popup"><span>Ein Ziergiebel ist ein als Ornament ausgestalteter oberer Abschluss eines Bauteils in der Form eines Giebels.</span></p></div>
</body></html>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<text><![CDATA[
<p><span class="popuptext">Ein Ziergiebel ist ein als Ornament ausgestalteter oberer Abschluss eines Bauteils in der Form eines Giebels.</span></p>
]]></text>
<!-- <img src="01/ziergiebel.jpg" caption=" "/> -->
</content>

View File

@ -0,0 +1,22 @@
<!DOCTYPE html><html lang="en"><head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex=""><img contenteditable="false" src="../01/ziergiebelneu.jpg"><p contenteditable="false" data-link="Popup"><span>Der Ziergiebel des Rathauses, Foto: Christoph Jäckle</span></p><p contenteditable="false" data-link="Popup"><span>Ein Ziergiebel ist ein als Ornament ausgestalteter oberer Abschluss eines Bauteils in der Form eines Giebels.</span></p></div>
</body></html>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8" ?>
<content>
<img src="01/ziergiebelneu.jpg" caption=" "/>
<text><![CDATA[
<p><span class="popuptext">Der Ziergiebel des Rathauses, Foto: Christoph Jäckle</span></p>
]]></text>
<text><![CDATA[
<p><span class="popuptext">Ein Ziergiebel ist ein als Ornament ausgestalteter oberer Abschluss eines Bauteils in der Form eines Giebels.</span></p>
]]></text>
</content>

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

View File

@ -0,0 +1,5 @@
{
"card": "03",
"cards": ["01"],
"tueschDirectory": "../../../../../dev/tuesch/var/cards/"
}

View File

@ -0,0 +1,11 @@
body {
background-color: white;
color: black;
width: 100%;
height: 100%;
}
article {
top: 66px;
}

10719
lib/card/test/example/_theme/css/bulma.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,649 @@
/* Color */
/* Font Properties */
/* Spacing */
/* Borders */
/* Shadows */
/*
$context: "../../../../../..";
$white: #FEFEFE;
$shady-white: rgb(240, 240, 240);
$gray: #CCC;
$dark: #333;
$black: #222;
$small-edge-radius: 3px;
$big-edge-radius: 10px;
$small-pad: 16px;
$big-pad: 32px;
$tuebingen-red: #e73230;
$increased-letter-spacing: 0.1em;
$font-color: $black;
$text-font-size: 26px;
$medium-font-size: 28px;
$large-font-size: 32px;
$regular-font-size: 1.451rem;
$subtitle-font-size: $medium-font-size;
$title-font-size: $subtitle-font-size * 1.641;
/* Font Weights */
/*
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
*/
/**
The essential.scss defines proerties that
are essential for the basic features of an
info card and are completely
*/
.unselectable {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.info-card {
position: absolute;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.zoomable-wrapper {
display: inline-block;
-ms-flex-item-align: center;
-ms-grid-row-align: center;
align-self: center;
font-size: 0;
}
.zoomable-wrapper figure {
display: inline-block;
}
.zoomable-wrapper figcaption {
font-size: initial;
}
.zoomable-wrapper > figure > div {
height: 100%;
}
.zoomable-wrapper svg {
overflow: visible;
width: 100%;
height: 100%;
}
div {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/*
If any default style by the browser or
certain plugins (e.g. Bulma) needs to be overwritten,
this can be done in this file.
*/
/* Remove the negative margin from Bulma's columns. */
.columns {
margin: 0 !important;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.content h1, .content h2, .content h3, .content h4, .content h5, .content h6 {
color: unset;
}
.content:not(:last-child) {
margin-bottom: 0;
}
.button {
border-color: unset;
border: unset;
border-radius: unset;
}
.button:active, .button:hover {
border-color: unset;
}
.icon {
width: unset;
height: unset;
}
/* Color */
/* Font Properties */
/* Spacing */
/* Borders */
/* Shadows */
/*
$context: "../../../../../..";
$white: #FEFEFE;
$shady-white: rgb(240, 240, 240);
$gray: #CCC;
$dark: #333;
$black: #222;
$small-edge-radius: 3px;
$big-edge-radius: 10px;
$small-pad: 16px;
$big-pad: 32px;
$tuebingen-red: #e73230;
$increased-letter-spacing: 0.1em;
$font-color: $black;
$text-font-size: 26px;
$medium-font-size: 28px;
$large-font-size: 32px;
$regular-font-size: 1.451rem;
$subtitle-font-size: $medium-font-size;
$title-font-size: $subtitle-font-size * 1.641;
/* Font Weights */
/*
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
*/
@font-face {
font-family: "Material Icons";
font-style: normal;
font-weight: 400;
src: url(../fonts/material-icon-font/MaterialIcons-Regular.eot);
/* For IE6-8 */
src: local("Material Icons"), local("MaterialIcons-Regular"), url(../fonts/material-icon-font/MaterialIcons-Regular.woff2) format("woff2"), url(../fonts/material-icon-font/MaterialIcons-Regular.woff) format("woff"), url(../fonts/material-icon-font/MaterialIcons-Regular.ttf) format("truetype");
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px;
/* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
}
/**
* The card.scss is responsible for styling the top level of the card.
*
* + Info-Card
* ++ Header
* +++ Thubnail
* +++ Overview
* ++ Subcards-Container
* +++ n * Subcards
*/
.info-card {
font-family: "Calibri", sans-serif;
color: white;
background-color: #333;
-webkit-box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.5);
box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.5);
border-radius: 3px;
/*
This mixin selects the elements of $selector
and adjust the style it there are n children of this selector
inside the parent.
*/
}
.info-card .ui {
width: 100%;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: end;
-ms-flex-pack: end;
justify-content: flex-end;
padding: 10px;
z-index: 11;
position: absolute;
top: 0;
}
.info-card .speech {
width: 52px;
height: 52px;
}
.info-card:before {
content: '';
display: block;
content: '';
position: absolute;
z-index: -1;
border-radius: 3px;
top: -8px;
left: -8px;
width: calc(100% + 16px);
height: calc(100% + 16px);
-webkit-box-shadow: 0 0 15px #008bd2;
box-shadow: 0 0 15px #008bd2;
background: repeating-linear-gradient(-45deg, #008bd2, #008bd2 20px, #33a2db 20px, #33a2db 40px);
background-size: 56px 56px;
/* This is unique for this background, need to find a pattern and develop a formula */
background-position-x: 0%;
-webkit-animation: 'slide' 20s infinite linear forwards;
opacity: 0;
-webkit-transition: opacity 1s;
transition: opacity 1s;
}
.info-card.speech-plugin-is-reading .speech.button:before {
content: 'stop';
}
.info-card.speech-plugin-is-reading:before {
opacity: 1;
}
@-webkit-keyframes 'slide' {
0% {
background-position-x: 0%;
}
100% {
background-position-x: 100%;
}
}
.info-card .img-overlay {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.3);
z-index: 200;
display: none;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.info-card .img-overlay img {
width: 100%;
height: 100%;
-o-object-fit: contain;
object-fit: contain;
}
@-webkit-keyframes pulse {}
@keyframes pulse {}.info-card nav {
z-index: 200;
position: absolute;
top: 20px;
right: 20px;
}
.info-card nav > * {
margin-right: 6.66667px;
}
.info-card a {
color: #008bd2;
}
.info-card a:hover {
color: #008bd2;
}
.info-card .mainview {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
height: 100%;
border-radius: inherit;
}
.info-card p {
font-size: 26px;
}
.info-card header {
height: 35%;
color: #f2f2f2;
background: -webkit-gradient(linear, left bottom, left top, from(#333333), color-stop(200%, #6f6f6e));
background: linear-gradient(to top, #333333, #6f6f6e 200%);
padding: 60px;
padding-bottom: 20px;
border-radius: inherit;
display: -ms-grid;
display: grid;
-ms-grid-columns: 1fr 2fr;
grid-template-columns: 1fr 2fr;
grid-gap: 20px;
z-index: 1;
}
.info-card header h1 {
-webkit-margin-before: 0;
font-size: 52px;
font-weight: 500;
margin-bottom: -2px;
}
.info-card header .overview {
padding: 0 20px;
margin-top: 0;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
-ms-grid-column: 2;
grid-column-start: 2;
}
.info-card header p {
font-weight: 400;
}
.info-card header p.misc {
font-size: 26px;
font-style: italic;
font-weight: 300;
opacity: 0.5;
margin-bottom: 0.641em;
}
.info-card .thumbnail-wrapper {
overflow: hidden;
border-radius: 3px;
}
.info-card .thumbnail-wrapper:before {
content: ' ';
position: absolute;
width: 100%;
height: 100%;
-webkit-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.8);
box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.8);
}
.info-card .thumbnail-wrapper .button {
position: absolute;
bottom: 0;
right: 0;
}
.info-card .thumbnail {
height: 100%;
min-width: 100%;
-o-object-fit: cover;
object-fit: cover;
overflow: hidden;
}
.info-card .subcards-container {
background-color: #333333;
height: 65%;
display: -ms-grid;
display: grid;
grid-auto-rows: 1fr;
grid-gap: 20px;
padding: 60px;
padding-top: 20px;
-ms-grid-columns: (1fr)[9];
grid-template-columns: repeat(9, 1fr);
grid-template-areas: '. tl tl tl . tr tr tr .' '. bl bl bl . br br br .';
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(5):nth-child(4),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(5) ~ .subcard-wrapper:nth-child(4) {
-ms-grid-row: 2;
-ms-grid-column: 2;
-ms-grid-column-span: 3;
grid-area: bl;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(5):nth-child(5),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(5) ~ .subcard-wrapper:nth-child(5) {
-ms-grid-row: 2;
-ms-grid-column: 6;
-ms-grid-column-span: 3;
grid-area: br;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4):first-child,
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4) ~ .subcard-wrapper:first-child {
-ms-grid-row: 1;
-ms-grid-column: 2;
-ms-grid-column-span: 3;
grid-area: tl;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4):nth-child(2),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4) ~ .subcard-wrapper:nth-child(2) {
-ms-grid-row: 1;
-ms-grid-column: 6;
-ms-grid-column-span: 3;
grid-area: tr;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4):nth-child(3),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4) ~ .subcard-wrapper:nth-child(3) {
-ms-grid-row: 2;
-ms-grid-column: 2;
-ms-grid-column-span: 3;
grid-area: bl;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4):nth-child(4),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(4) ~ .subcard-wrapper:nth-child(4) {
-ms-grid-row: 2;
-ms-grid-column: 6;
-ms-grid-column-span: 3;
grid-area: br;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(3):first-child,
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(3) ~ .subcard-wrapper:first-child {
-ms-grid-row: 1;
-ms-grid-column: 2;
-ms-grid-column-span: 3;
grid-area: tl;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(3):nth-child(2),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(3) ~ .subcard-wrapper:nth-child(2) {
-ms-grid-row: 1;
-ms-grid-column: 6;
-ms-grid-column-span: 3;
grid-area: tr;
}
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(3):nth-child(3),
.info-card .subcards-container .subcard-wrapper:first-child:nth-last-child(3) ~ .subcard-wrapper:nth-child(3) {
-ms-grid-row: 2;
grid-row: 2;
-ms-grid-column: 4;
-ms-grid-column-span: 3;
grid-column: 4 / 7;
}
.info-card .subcards-container .subcard-wrapper {
padding: 0;
}
.info-card .subcards-container > div {
width: auto;
grid-column: span 3;
}
.card-icon,
.zoomable-icon {
position: absolute;
bottom: 0;
right: 0;
}
.speech-only-text {
opacity: 0;
position: absolute;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
z-index: -1;
}
figure {
position: relative;
border: 3px solid #f2f2f2;
-webkit-box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.5);
box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.5);
-webkit-margin-before: 0;
-webkit-margin-after: 0;
-webkit-margin-start: 0;
-webkit-margin-end: 0;
}
figure .icon {
position: absolute;
bottom: 0;
right: 0;
border-radius: 3px 0 0 0;
}
.view-button.icon {
position: absolute;
bottom: 0;
right: 0;
padding: 26px 26px;
margin: -23px -13px;
}
.view-button.icon.inverted:before {
color: #f2f2f2;
}
.view-button.icon:before {
color: #333333;
font-size: 36px;
text-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
}
.icon {
min-width: 44px;
min-height: 44px;
color: #191919;
background-color: #f2f2f2;
pointer-events: none;
}
.icon.button {
pointer-events: all;
border-radius: 3px;
}
.icon.button.corner-button {
border-radius: 0;
}
.icon.button.corner-button.bottom-right {
border-top-left-radius: 3px;
}
.icon.inverted {
color: #f2f2f2;
background-color: #191919;
}
.icon.transparent-background {
background-color: transparent;
}
.icon.active {
color: #f2f2f2;
background-color: #008bd2;
}
.icon:before {
font-family: "Material Icons";
font-size: 36px;
}
.icon.info:before {
content: 'info_outline';
}
.icon.close:before {
content: 'close';
}
.icon.zoom:before {
content: 'search';
}
.icon.speech:before {
content: 'record_voice_over';
}
.icon.language:before {
content: 'language';
}
.info-card.debug .view-button {
background-color: rgba(255, 0, 0, 0.5) !important;
}
.info-card.debug .view-button.disabled {
-webkit-filter: grayscale(1);
filter: grayscale(1);
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,6 @@
html, body {
position: relative;
margin: 0;
padding: 0;
height: 100%;
}

View File

@ -0,0 +1,10 @@
circle {
stroke-width: 1;
stroke: white;
fill: transparent;
}
mask circle {
stroke-width: 0;
fill: white;
}

View File

@ -0,0 +1 @@
/* No CSS */

View File

@ -0,0 +1,163 @@
/* Color */
/* Font Properties */
/* Spacing */
/* Borders */
/* Shadows */
/*
$context: "../../../../../..";
$white: #FEFEFE;
$shady-white: rgb(240, 240, 240);
$gray: #CCC;
$dark: #333;
$black: #222;
$small-edge-radius: 3px;
$big-edge-radius: 10px;
$small-pad: 16px;
$big-pad: 32px;
$tuebingen-red: #e73230;
$increased-letter-spacing: 0.1em;
$font-color: $black;
$text-font-size: 26px;
$medium-font-size: 28px;
$large-font-size: 32px;
$regular-font-size: 1.451rem;
$subtitle-font-size: $medium-font-size;
$title-font-size: $subtitle-font-size * 1.641;
/* Font Weights */
/*
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
*/
/* Color */
/* Font Properties */
/* Spacing */
/* Borders */
/* Shadows */
/*
$context: "../../../../../..";
$white: #FEFEFE;
$shady-white: rgb(240, 240, 240);
$gray: #CCC;
$dark: #333;
$black: #222;
$small-edge-radius: 3px;
$big-edge-radius: 10px;
$small-pad: 16px;
$big-pad: 32px;
$tuebingen-red: #e73230;
$increased-letter-spacing: 0.1em;
$font-color: $black;
$text-font-size: 26px;
$medium-font-size: 28px;
$large-font-size: 32px;
$regular-font-size: 1.451rem;
$subtitle-font-size: $medium-font-size;
$title-font-size: $subtitle-font-size * 1.641;
/* Font Weights */
/*
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
*/
@font-face {
font-family: "Material Icons";
font-style: normal;
font-weight: 400;
src: url(../fonts/material-icon-font/MaterialIcons-Regular.eot);
/* For IE6-8 */
src: local("Material Icons"), local("MaterialIcons-Regular"), url(../fonts/material-icon-font/MaterialIcons-Regular.woff2) format("woff2"), url(../fonts/material-icon-font/MaterialIcons-Regular.woff) format("woff"), url(../fonts/material-icon-font/MaterialIcons-Regular.ttf) format("truetype");
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px;
/* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
-webkit-font-feature-settings: 'liga';
font-feature-settings: 'liga';
}
.popup {
width: 800px;
width: -webkit-fit-content;
width: -moz-fit-content;
width: fit-content;
min-width: 400px;
color: #191919;
background-color: #f2f2f2;
border-radius: 3px;
-webkit-box-shadow: 0 0 100px rgba(0, 0, 0, 0.3), 2px 3px 25px rgba(0, 0, 0, 0.3), 0 0 4px rgba(0, 0, 0, 0.8);
box-shadow: 0 0 100px rgba(0, 0, 0, 0.3), 2px 3px 25px rgba(0, 0, 0, 0.3), 0 0 4px rgba(0, 0, 0, 0.8);
padding: 25.64px 40px;
}
.popup img {
display: block;
margin: auto;
}
.popup img:not(:first-child) {
margin-top: 20px;
}
.popup img:not(:last-child) {
margin-bottom: 20px;
}
.popup .notch {
width: 20px;
height: 20px;
border-color: #f2f2f2;
}
.PopupContent p:not(:last-child) {
margin-bottom: 30px;
}

View File

@ -0,0 +1,12 @@
{
"version": 3,
"mappings": "ACEA,WAAW;AA2CX,qBAAqB;AAcrB,aAAa;AAOb,aAAa;AAGb,aAAa;AAIb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmCkB;AAAA;;;;;EAKhB;AA/GF,WAAW;AA2CX,qBAAqB;AAcrB,aAAa;AAOb,aAAa;AAGb,aAAa;AAIb;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmCkB;AAAA;;;;;EAKhB;AC7GF,UAAU;EACN,WAAW,EAHc,gBAAgB;EAIzC,UAAU,EAAE,MAAM;EAClB,WAAW,EAAE,GAAG;EAChB,GAAG,EAAE,0DAA0D;EAAE,eAAe;EAChF,GAAG,EAAE,uBAAuB,EACvB,8BAA8B,EAC9B,4DAA4D,CAAC,eAAe,EAC5E,2DAA2D,CAAC,cAAc,EAC1E,0DAA0D,CAAC,kBAAkB;;;AAGpF,AAAA,eAAe,CAAC;EACd,WAAW,EAAE,gBAAgB;EAC7B,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,MAAM;EAClB,SAAS,EAAE,IAAI;EAAG,yBAAyB;EAC3C,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,CAAC;EACd,cAAc,EAAE,IAAI;EACpB,cAAc,EAAE,MAAM;EACtB,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,MAAM;EACnB,SAAS,EAAE,GAAG;EAEd,sCAAsC;EACtC,sBAAsB,EAAE,WAAW;EACnC,oCAAoC;EACpC,cAAc,EAAE,kBAAkB;EAElC,0BAA0B;EAC1B,uBAAuB,EAAE,SAAS;EAElC,qBAAqB;EACrB,qBAAqB,EAAE,MAAM;CAC9B;;AFpCH,AAAA,MAAM,CAAC;EACH,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,WAAW;EAClB,SAAS,EAAE,KAAK;EAChB,KAAK,ECHD,OAAO;EDIX,gBAAgB,ECHZ,OAAO;EDIX,aAAa,EC0DA,GAAG;EDzDhB,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAe,EC6DnB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAe,ED7Dc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAe;EACnF,OAAO,EAAE,OAAwB,CAAC,IAAgB;CAqBrD;;AA7BD,AAUI,MAVE,CAUF,GAAG,CAAC;EACA,OAAO,EAAE,KAAK;EACd,MAAM,EAAG,IAAI;CAUhB;;AAtBL,AAcQ,MAdF,CAUF,GAAG,AAIE,IAAK,CAAA,YAAY,EAAC;EACf,UAAU,EC2CN,IAAI;CD1CX;;AAhBT,AAkBQ,MAlBF,CAUF,GAAG,AAQE,IAAK,CAAA,WAAW,EAAC;EACd,aAAa,ECuCT,IAAI;CDtCX;;AApBT,AAwBI,MAxBE,CAwBF,MAAM,CAAC;EACH,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,YAAY,ECzBZ,OAAO;CD0BV;;AAGL,AACI,aADS,CACT,CAAC,AAAA,IAAK,CAAA,WAAW,EAAE;EACf,aAAa,EC0BL,IAAI;CDzBf",
"sources": [
"popup.scss",
"_variables.scss",
"_icons.scss",
"_variables.scss"
],
"names": [],
"file": "popup.css"
}

View File

@ -0,0 +1,416 @@
/* Color */
/* Font Properties */
/* Spacing */
/* Borders */
/* Shadows */
/*
$context: "../../../../../..";
$white: #FEFEFE;
$shady-white: rgb(240, 240, 240);
$gray: #CCC;
$dark: #333;
$black: #222;
$small-edge-radius: 3px;
$big-edge-radius: 10px;
$small-pad: 16px;
$big-pad: 32px;
$tuebingen-red: #e73230;
$increased-letter-spacing: 0.1em;
$font-color: $black;
$text-font-size: 26px;
$medium-font-size: 28px;
$large-font-size: 32px;
$regular-font-size: 1.451rem;
$subtitle-font-size: $medium-font-size;
$title-font-size: $subtitle-font-size * 1.641;
/* Font Weights */
/*
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
*/
/**
The subcards.scss is responsible for all css of the subcards.
Historically, it was always used for the preview-cards on the info-card
and the article page of the corresponding subcard.
Discuss: Personally I would prefer a strict separation from front page
and article page. But there may be advantages, when the unit 'subcard'
has a stylesheet on it's own.
- SO
Structure:
1. Shared (Preview and Expanded)
2. Preview Subcards
3. Expanded Subcards
*/
.info-card {
/*
1. Shared Properties
*/
/*
2. Preview Properties
*/
/*
3. Article Properties
*/
/*
Colors for the card topics.
*/
/* Remap the colors to the 'bundled' groups. */
}
.info-card .subcard {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
color: #191919;
position: relative;
border-radius: 3px;
}
.info-card .subcard-content {
position: relative;
}
.info-card .titlebar {
min-height: 84px;
background: -webkit-gradient(linear, left bottom, left top, color-stop(-100%, #333333), color-stop(200%, #6f6f6e));
background: linear-gradient(to top, #333333 -100%, #6f6f6e 200%);
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
border-radius: inherit;
}
.info-card .titlebar h2 {
color: #f2f2f2;
font-size: 26px;
text-transform: uppercase;
letter-spacing: 2px;
line-height: 1.3em;
text-align: center;
margin: 0;
padding: 10px;
}
.info-card .subcards-container .subcard-wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.info-card .subcards-container .subcard {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
z-index: 1;
-webkit-box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.5);
box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.5);
overflow: hidden;
}
.info-card .subcards-container .titlebar {
min-height: 27%;
}
.info-card .subcards-container .subcard-content {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
overflow: hidden;
}
.info-card .subcards-container .wrapper {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
overflow: hidden;
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
}
.info-card .subcards-container .wrapper .preview {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
background-color: #f2f2f2;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
width: 100%;
height: 100%;
}
.info-card .subcards-container .wrapper .preview p {
font-style: italic;
color: #6f6f6e;
font-weight: 500;
text-align: center;
padding: 40px;
}
.info-card .subcards-container .wrapper .preview img {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
-o-object-fit: cover;
object-fit: cover;
}
.info-card .subcards-container .icon {
border-radius: 3px 0 0 0;
}
.info-card .subcards-container .subcard.visited .icon.info:before {
content: "check";
}
.info-card .subcards-container figure {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
border: none;
}
.info-card .mainview > .subcard {
background-color: rgba(25, 25, 25, 0.8);
-webkit-box-pack: center;
-ms-flex-pack: center;
justify-content: center;
}
.info-card .mainview > .subcard .column.content {
-webkit-box-flex: 1;
-ms-flex: 1;
flex: 1;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.info-card .mainview > .subcard .column.content.wide {
-webkit-box-flex: 1;
-ms-flex: 1 0 55%;
flex: 1 0 55%;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.info-card .mainview > .subcard .column.content.narrow {
-webkit-box-flex: 1;
-ms-flex: 1 0 35%;
flex: 1 0 35%;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.info-card .mainview > .subcard article {
background-color: #f2f2f2;
max-height: 100%;
}
.info-card .mainview > .subcard article p {
line-height: 1.4em;
}
.info-card .mainview > .subcard article p:last-child {
margin-bottom: 0;
}
.info-card .mainview > .subcard article p:not(:last-child) {
margin-bottom: 0.5em;
}
.info-card .mainview > .subcard article h2 {
font-size: 36px;
}
.info-card .mainview > .subcard article h2:not(:first-child) {
margin-top: 0.5em;
}
.info-card .mainview > .subcard article .column:not(.zoomable-wrapper) {
margin: 30px;
}
.info-card .mainview > .subcard article a {
margin: -0px -5px -20px -5px;
padding: 0px 5px 10px 5px;
}
.info-card .mainview > .subcard .subcard-content {
overflow: hidden;
background-color: #f2f2f2;
-webkit-box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.5);
box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.5);
}
.info-card .mainview > .subcard .subcard-content.dynamic-height {
overflow: visible;
}
.info-card .mainview > .subcard .subcard-content:not(.dynamic-height) {
height: 100%;
}
.info-card .mainview > .subcard .zoomable-wrapper {
padding: 0;
margin: 0;
padding-top: 30px;
padding-bottom: 60px;
-ms-flex-item-align: center;
-ms-grid-row-align: center;
align-self: center;
-webkit-box-flex: 0;
-ms-flex: 0;
flex: 0;
}
.info-card .mainview > .subcard .imggroup {
padding: 0;
margin: 0;
padding-top: 30px;
padding-bottom: 60px;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: space-evenly;
-ms-flex-pack: space-evenly;
justify-content: space-evenly;
}
.info-card > .zoomable-wrapper figcaption,
.info-card .mainview > .subcard figcaption {
width: 100%;
position: absolute;
text-align: center;
}
.info-card > .zoomable-wrapper figcaption.zoomcap,
.info-card .mainview > .subcard figcaption.zoomcap {
font-size: 8px;
display: none;
top: calc(100% + 10px);
padding: 10px;
background-color: #f2f2f2;
-webkit-box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.5);
box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.5);
color: #191919;
z-index: -1;
}
.info-card > .zoomable-wrapper figcaption.cap,
.info-card .mainview > .subcard figcaption.cap {
bottom: -40px;
}
.info-card .subcard.leben_des_kunstwerks .titlebar {
border-bottom: 10px solid #80b1d3;
z-index: 10;
position: relative;
}
.info-card .subcard.licht_und_farbe .titlebar {
border-bottom: 10px solid #80b1d3;
z-index: 10;
position: relative;
}
.info-card .subcard.extra_info .titlebar {
border-bottom: 10px solid #80b1d3;
z-index: 10;
position: relative;
}
.info-card .subcard.artist .titlebar {
border-bottom: 10px solid #fdb462;
z-index: 10;
position: relative;
}
.info-card .subcard.komposition .titlebar {
border-bottom: 10px solid #80b1d3;
z-index: 10;
position: relative;
}
.info-card .subcard.details .titlebar {
border-bottom: 10px solid #bc80bd;
z-index: 10;
position: relative;
}
.info-card .subcard.thema .titlebar {
border-bottom: 10px solid #fb8072;
z-index: 10;
position: relative;
}
.info-card.debug .mainview > .subcard a {
background-color: rgba(102, 51, 153, 0.239);
}
.info-card.debug article {
background-color: rgba(0, 255, 0, 0.5);
}
.info-card.debug .subcard .view-button {
background-color: rgba(0, 255, 0, 0.5) !important;
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 275 KiB

View File

@ -0,0 +1,9 @@
The recommended way to use the Material Icons font is by linking to the web font hosted on Google Fonts:
```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet">
```
Read more in our full usage guide:
http://google.github.io/material-design-icons/#icon-font-for-the-web

View File

@ -0,0 +1,932 @@
3d_rotation e84d
ac_unit eb3b
access_alarm e190
access_alarms e191
access_time e192
accessibility e84e
accessible e914
account_balance e84f
account_balance_wallet e850
account_box e851
account_circle e853
adb e60e
add e145
add_a_photo e439
add_alarm e193
add_alert e003
add_box e146
add_circle e147
add_circle_outline e148
add_location e567
add_shopping_cart e854
add_to_photos e39d
add_to_queue e05c
adjust e39e
airline_seat_flat e630
airline_seat_flat_angled e631
airline_seat_individual_suite e632
airline_seat_legroom_extra e633
airline_seat_legroom_normal e634
airline_seat_legroom_reduced e635
airline_seat_recline_extra e636
airline_seat_recline_normal e637
airplanemode_active e195
airplanemode_inactive e194
airplay e055
airport_shuttle eb3c
alarm e855
alarm_add e856
alarm_off e857
alarm_on e858
album e019
all_inclusive eb3d
all_out e90b
android e859
announcement e85a
apps e5c3
archive e149
arrow_back e5c4
arrow_downward e5db
arrow_drop_down e5c5
arrow_drop_down_circle e5c6
arrow_drop_up e5c7
arrow_forward e5c8
arrow_upward e5d8
art_track e060
aspect_ratio e85b
assessment e85c
assignment e85d
assignment_ind e85e
assignment_late e85f
assignment_return e860
assignment_returned e861
assignment_turned_in e862
assistant e39f
assistant_photo e3a0
attach_file e226
attach_money e227
attachment e2bc
audiotrack e3a1
autorenew e863
av_timer e01b
backspace e14a
backup e864
battery_alert e19c
battery_charging_full e1a3
battery_full e1a4
battery_std e1a5
battery_unknown e1a6
beach_access eb3e
beenhere e52d
block e14b
bluetooth e1a7
bluetooth_audio e60f
bluetooth_connected e1a8
bluetooth_disabled e1a9
bluetooth_searching e1aa
blur_circular e3a2
blur_linear e3a3
blur_off e3a4
blur_on e3a5
book e865
bookmark e866
bookmark_border e867
border_all e228
border_bottom e229
border_clear e22a
border_color e22b
border_horizontal e22c
border_inner e22d
border_left e22e
border_outer e22f
border_right e230
border_style e231
border_top e232
border_vertical e233
branding_watermark e06b
brightness_1 e3a6
brightness_2 e3a7
brightness_3 e3a8
brightness_4 e3a9
brightness_5 e3aa
brightness_6 e3ab
brightness_7 e3ac
brightness_auto e1ab
brightness_high e1ac
brightness_low e1ad
brightness_medium e1ae
broken_image e3ad
brush e3ae
bubble_chart e6dd
bug_report e868
build e869
burst_mode e43c
business e0af
business_center eb3f
cached e86a
cake e7e9
call e0b0
call_end e0b1
call_made e0b2
call_merge e0b3
call_missed e0b4
call_missed_outgoing e0e4
call_received e0b5
call_split e0b6
call_to_action e06c
camera e3af
camera_alt e3b0
camera_enhance e8fc
camera_front e3b1
camera_rear e3b2
camera_roll e3b3
cancel e5c9
card_giftcard e8f6
card_membership e8f7
card_travel e8f8
casino eb40
cast e307
cast_connected e308
center_focus_strong e3b4
center_focus_weak e3b5
change_history e86b
chat e0b7
chat_bubble e0ca
chat_bubble_outline e0cb
check e5ca
check_box e834
check_box_outline_blank e835
check_circle e86c
chevron_left e5cb
chevron_right e5cc
child_care eb41
child_friendly eb42
chrome_reader_mode e86d
class e86e
clear e14c
clear_all e0b8
close e5cd
closed_caption e01c
cloud e2bd
cloud_circle e2be
cloud_done e2bf
cloud_download e2c0
cloud_off e2c1
cloud_queue e2c2
cloud_upload e2c3
code e86f
collections e3b6
collections_bookmark e431
color_lens e3b7
colorize e3b8
comment e0b9
compare e3b9
compare_arrows e915
computer e30a
confirmation_number e638
contact_mail e0d0
contact_phone e0cf
contacts e0ba
content_copy e14d
content_cut e14e
content_paste e14f
control_point e3ba
control_point_duplicate e3bb
copyright e90c
create e150
create_new_folder e2cc
credit_card e870
crop e3be
crop_16_9 e3bc
crop_3_2 e3bd
crop_5_4 e3bf
crop_7_5 e3c0
crop_din e3c1
crop_free e3c2
crop_landscape e3c3
crop_original e3c4
crop_portrait e3c5
crop_rotate e437
crop_square e3c6
dashboard e871
data_usage e1af
date_range e916
dehaze e3c7
delete e872
delete_forever e92b
delete_sweep e16c
description e873
desktop_mac e30b
desktop_windows e30c
details e3c8
developer_board e30d
developer_mode e1b0
device_hub e335
devices e1b1
devices_other e337
dialer_sip e0bb
dialpad e0bc
directions e52e
directions_bike e52f
directions_boat e532
directions_bus e530
directions_car e531
directions_railway e534
directions_run e566
directions_subway e533
directions_transit e535
directions_walk e536
disc_full e610
dns e875
do_not_disturb e612
do_not_disturb_alt e611
do_not_disturb_off e643
do_not_disturb_on e644
dock e30e
domain e7ee
done e876
done_all e877
donut_large e917
donut_small e918
drafts e151
drag_handle e25d
drive_eta e613
dvr e1b2
edit e3c9
edit_location e568
eject e8fb
email e0be
enhanced_encryption e63f
equalizer e01d
error e000
error_outline e001
euro_symbol e926
ev_station e56d
event e878
event_available e614
event_busy e615
event_note e616
event_seat e903
exit_to_app e879
expand_less e5ce
expand_more e5cf
explicit e01e
explore e87a
exposure e3ca
exposure_neg_1 e3cb
exposure_neg_2 e3cc
exposure_plus_1 e3cd
exposure_plus_2 e3ce
exposure_zero e3cf
extension e87b
face e87c
fast_forward e01f
fast_rewind e020
favorite e87d
favorite_border e87e
featured_play_list e06d
featured_video e06e
feedback e87f
fiber_dvr e05d
fiber_manual_record e061
fiber_new e05e
fiber_pin e06a
fiber_smart_record e062
file_download e2c4
file_upload e2c6
filter e3d3
filter_1 e3d0
filter_2 e3d1
filter_3 e3d2
filter_4 e3d4
filter_5 e3d5
filter_6 e3d6
filter_7 e3d7
filter_8 e3d8
filter_9 e3d9
filter_9_plus e3da
filter_b_and_w e3db
filter_center_focus e3dc
filter_drama e3dd
filter_frames e3de
filter_hdr e3df
filter_list e152
filter_none e3e0
filter_tilt_shift e3e2
filter_vintage e3e3
find_in_page e880
find_replace e881
fingerprint e90d
first_page e5dc
fitness_center eb43
flag e153
flare e3e4
flash_auto e3e5
flash_off e3e6
flash_on e3e7
flight e539
flight_land e904
flight_takeoff e905
flip e3e8
flip_to_back e882
flip_to_front e883
folder e2c7
folder_open e2c8
folder_shared e2c9
folder_special e617
font_download e167
format_align_center e234
format_align_justify e235
format_align_left e236
format_align_right e237
format_bold e238
format_clear e239
format_color_fill e23a
format_color_reset e23b
format_color_text e23c
format_indent_decrease e23d
format_indent_increase e23e
format_italic e23f
format_line_spacing e240
format_list_bulleted e241
format_list_numbered e242
format_paint e243
format_quote e244
format_shapes e25e
format_size e245
format_strikethrough e246
format_textdirection_l_to_r e247
format_textdirection_r_to_l e248
format_underlined e249
forum e0bf
forward e154
forward_10 e056
forward_30 e057
forward_5 e058
free_breakfast eb44
fullscreen e5d0
fullscreen_exit e5d1
functions e24a
g_translate e927
gamepad e30f
games e021
gavel e90e
gesture e155
get_app e884
gif e908
golf_course eb45
gps_fixed e1b3
gps_not_fixed e1b4
gps_off e1b5
grade e885
gradient e3e9
grain e3ea
graphic_eq e1b8
grid_off e3eb
grid_on e3ec
group e7ef
group_add e7f0
group_work e886
hd e052
hdr_off e3ed
hdr_on e3ee
hdr_strong e3f1
hdr_weak e3f2
headset e310
headset_mic e311
healing e3f3
hearing e023
help e887
help_outline e8fd
high_quality e024
highlight e25f
highlight_off e888
history e889
home e88a
hot_tub eb46
hotel e53a
hourglass_empty e88b
hourglass_full e88c
http e902
https e88d
image e3f4
image_aspect_ratio e3f5
import_contacts e0e0
import_export e0c3
important_devices e912
inbox e156
indeterminate_check_box e909
info e88e
info_outline e88f
input e890
insert_chart e24b
insert_comment e24c
insert_drive_file e24d
insert_emoticon e24e
insert_invitation e24f
insert_link e250
insert_photo e251
invert_colors e891
invert_colors_off e0c4
iso e3f6
keyboard e312
keyboard_arrow_down e313
keyboard_arrow_left e314
keyboard_arrow_right e315
keyboard_arrow_up e316
keyboard_backspace e317
keyboard_capslock e318
keyboard_hide e31a
keyboard_return e31b
keyboard_tab e31c
keyboard_voice e31d
kitchen eb47
label e892
label_outline e893
landscape e3f7
language e894
laptop e31e
laptop_chromebook e31f
laptop_mac e320
laptop_windows e321
last_page e5dd
launch e895
layers e53b
layers_clear e53c
leak_add e3f8
leak_remove e3f9
lens e3fa
library_add e02e
library_books e02f
library_music e030
lightbulb_outline e90f
line_style e919
line_weight e91a
linear_scale e260
link e157
linked_camera e438
list e896
live_help e0c6
live_tv e639
local_activity e53f
local_airport e53d
local_atm e53e
local_bar e540
local_cafe e541
local_car_wash e542
local_convenience_store e543
local_dining e556
local_drink e544
local_florist e545
local_gas_station e546
local_grocery_store e547
local_hospital e548
local_hotel e549
local_laundry_service e54a
local_library e54b
local_mall e54c
local_movies e54d
local_offer e54e
local_parking e54f
local_pharmacy e550
local_phone e551
local_pizza e552
local_play e553
local_post_office e554
local_printshop e555
local_see e557
local_shipping e558
local_taxi e559
location_city e7f1
location_disabled e1b6
location_off e0c7
location_on e0c8
location_searching e1b7
lock e897
lock_open e898
lock_outline e899
looks e3fc
looks_3 e3fb
looks_4 e3fd
looks_5 e3fe
looks_6 e3ff
looks_one e400
looks_two e401
loop e028
loupe e402
low_priority e16d
loyalty e89a
mail e158
mail_outline e0e1
map e55b
markunread e159
markunread_mailbox e89b
memory e322
menu e5d2
merge_type e252
message e0c9
mic e029
mic_none e02a
mic_off e02b
mms e618
mode_comment e253
mode_edit e254
monetization_on e263
money_off e25c
monochrome_photos e403
mood e7f2
mood_bad e7f3
more e619
more_horiz e5d3
more_vert e5d4
motorcycle e91b
mouse e323
move_to_inbox e168
movie e02c
movie_creation e404
movie_filter e43a
multiline_chart e6df
music_note e405
music_video e063
my_location e55c
nature e406
nature_people e407
navigate_before e408
navigate_next e409
navigation e55d
near_me e569
network_cell e1b9
network_check e640
network_locked e61a
network_wifi e1ba
new_releases e031
next_week e16a
nfc e1bb
no_encryption e641
no_sim e0cc
not_interested e033
note e06f
note_add e89c
notifications e7f4
notifications_active e7f7
notifications_none e7f5
notifications_off e7f6
notifications_paused e7f8
offline_pin e90a
ondemand_video e63a
opacity e91c
open_in_browser e89d
open_in_new e89e
open_with e89f
pages e7f9
pageview e8a0
palette e40a
pan_tool e925
panorama e40b
panorama_fish_eye e40c
panorama_horizontal e40d
panorama_vertical e40e
panorama_wide_angle e40f
party_mode e7fa
pause e034
pause_circle_filled e035
pause_circle_outline e036
payment e8a1
people e7fb
people_outline e7fc
perm_camera_mic e8a2
perm_contact_calendar e8a3
perm_data_setting e8a4
perm_device_information e8a5
perm_identity e8a6
perm_media e8a7
perm_phone_msg e8a8
perm_scan_wifi e8a9
person e7fd
person_add e7fe
person_outline e7ff
person_pin e55a
person_pin_circle e56a
personal_video e63b
pets e91d
phone e0cd
phone_android e324
phone_bluetooth_speaker e61b
phone_forwarded e61c
phone_in_talk e61d
phone_iphone e325
phone_locked e61e
phone_missed e61f
phone_paused e620
phonelink e326
phonelink_erase e0db
phonelink_lock e0dc
phonelink_off e327
phonelink_ring e0dd
phonelink_setup e0de
photo e410
photo_album e411
photo_camera e412
photo_filter e43b
photo_library e413
photo_size_select_actual e432
photo_size_select_large e433
photo_size_select_small e434
picture_as_pdf e415
picture_in_picture e8aa
picture_in_picture_alt e911
pie_chart e6c4
pie_chart_outlined e6c5
pin_drop e55e
place e55f
play_arrow e037
play_circle_filled e038
play_circle_outline e039
play_for_work e906
playlist_add e03b
playlist_add_check e065
playlist_play e05f
plus_one e800
poll e801
polymer e8ab
pool eb48
portable_wifi_off e0ce
portrait e416
power e63c
power_input e336
power_settings_new e8ac
pregnant_woman e91e
present_to_all e0df
print e8ad
priority_high e645
public e80b
publish e255
query_builder e8ae
question_answer e8af
queue e03c
queue_music e03d
queue_play_next e066
radio e03e
radio_button_checked e837
radio_button_unchecked e836
rate_review e560
receipt e8b0
recent_actors e03f
record_voice_over e91f
redeem e8b1
redo e15a
refresh e5d5
remove e15b
remove_circle e15c
remove_circle_outline e15d
remove_from_queue e067
remove_red_eye e417
remove_shopping_cart e928
reorder e8fe
repeat e040
repeat_one e041
replay e042
replay_10 e059
replay_30 e05a
replay_5 e05b
reply e15e
reply_all e15f
report e160
report_problem e8b2
restaurant e56c
restaurant_menu e561
restore e8b3
restore_page e929
ring_volume e0d1
room e8b4
room_service eb49
rotate_90_degrees_ccw e418
rotate_left e419
rotate_right e41a
rounded_corner e920
router e328
rowing e921
rss_feed e0e5
rv_hookup e642
satellite e562
save e161
scanner e329
schedule e8b5
school e80c
screen_lock_landscape e1be
screen_lock_portrait e1bf
screen_lock_rotation e1c0
screen_rotation e1c1
screen_share e0e2
sd_card e623
sd_storage e1c2
search e8b6
security e32a
select_all e162
send e163
sentiment_dissatisfied e811
sentiment_neutral e812
sentiment_satisfied e813
sentiment_very_dissatisfied e814
sentiment_very_satisfied e815
settings e8b8
settings_applications e8b9
settings_backup_restore e8ba
settings_bluetooth e8bb
settings_brightness e8bd
settings_cell e8bc
settings_ethernet e8be
settings_input_antenna e8bf
settings_input_component e8c0
settings_input_composite e8c1
settings_input_hdmi e8c2
settings_input_svideo e8c3
settings_overscan e8c4
settings_phone e8c5
settings_power e8c6
settings_remote e8c7
settings_system_daydream e1c3
settings_voice e8c8
share e80d
shop e8c9
shop_two e8ca
shopping_basket e8cb
shopping_cart e8cc
short_text e261
show_chart e6e1
shuffle e043
signal_cellular_4_bar e1c8
signal_cellular_connected_no_internet_4_bar e1cd
signal_cellular_no_sim e1ce
signal_cellular_null e1cf
signal_cellular_off e1d0
signal_wifi_4_bar e1d8
signal_wifi_4_bar_lock e1d9
signal_wifi_off e1da
sim_card e32b
sim_card_alert e624
skip_next e044
skip_previous e045
slideshow e41b
slow_motion_video e068
smartphone e32c
smoke_free eb4a
smoking_rooms eb4b
sms e625
sms_failed e626
snooze e046
sort e164
sort_by_alpha e053
spa eb4c
space_bar e256
speaker e32d
speaker_group e32e
speaker_notes e8cd
speaker_notes_off e92a
speaker_phone e0d2
spellcheck e8ce
star e838
star_border e83a
star_half e839
stars e8d0
stay_current_landscape e0d3
stay_current_portrait e0d4
stay_primary_landscape e0d5
stay_primary_portrait e0d6
stop e047
stop_screen_share e0e3
storage e1db
store e8d1
store_mall_directory e563
straighten e41c
streetview e56e
strikethrough_s e257
style e41d
subdirectory_arrow_left e5d9
subdirectory_arrow_right e5da
subject e8d2
subscriptions e064
subtitles e048
subway e56f
supervisor_account e8d3
surround_sound e049
swap_calls e0d7
swap_horiz e8d4
swap_vert e8d5
swap_vertical_circle e8d6
switch_camera e41e
switch_video e41f
sync e627
sync_disabled e628
sync_problem e629
system_update e62a
system_update_alt e8d7
tab e8d8
tab_unselected e8d9
tablet e32f
tablet_android e330
tablet_mac e331
tag_faces e420
tap_and_play e62b
terrain e564
text_fields e262
text_format e165
textsms e0d8
texture e421
theaters e8da
thumb_down e8db
thumb_up e8dc
thumbs_up_down e8dd
time_to_leave e62c
timelapse e422
timeline e922
timer e425
timer_10 e423
timer_3 e424
timer_off e426
title e264
toc e8de
today e8df
toll e8e0
tonality e427
touch_app e913
toys e332
track_changes e8e1
traffic e565
train e570
tram e571
transfer_within_a_station e572
transform e428
translate e8e2
trending_down e8e3
trending_flat e8e4
trending_up e8e5
tune e429
turned_in e8e6
turned_in_not e8e7
tv e333
unarchive e169
undo e166
unfold_less e5d6
unfold_more e5d7
update e923
usb e1e0
verified_user e8e8
vertical_align_bottom e258
vertical_align_center e259
vertical_align_top e25a
vibration e62d
video_call e070
video_label e071
video_library e04a
videocam e04b
videocam_off e04c
videogame_asset e338
view_agenda e8e9
view_array e8ea
view_carousel e8eb
view_column e8ec
view_comfy e42a
view_compact e42b
view_day e8ed
view_headline e8ee
view_list e8ef
view_module e8f0
view_quilt e8f1
view_stream e8f2
view_week e8f3
vignette e435
visibility e8f4
visibility_off e8f5
voice_chat e62e
voicemail e0d9
volume_down e04d
volume_mute e04e
volume_off e04f
volume_up e050
vpn_key e0da
vpn_lock e62f
wallpaper e1bc
warning e002
watch e334
watch_later e924
wb_auto e42c
wb_cloudy e42d
wb_incandescent e42e
wb_iridescent e436
wb_sunny e430
wc e63d
web e051
web_asset e069
weekend e16b
whatshot e80e
widgets e1bd
wifi e63e
wifi_lock e1e1
wifi_tethering e1e2
work e8f9
wrap_text e25b
youtube_searched_for e8fa
zoom_in e8ff
zoom_out e900
zoom_out_map e56b

View File

@ -0,0 +1,36 @@
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url(MaterialIcons-Regular.eot); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
url(MaterialIcons-Regular.woff2) format('woff2'),
url(MaterialIcons-Regular.woff) format('woff'),
url(MaterialIcons-Regular.ttf) format('truetype');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}

View File

@ -0,0 +1,138 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>HTML Cards</title>
<link rel="stylesheet" href="css/bulma.css">
<link rel="stylesheet" href="css/card.css">
<link rel="stylesheet" href="css/subcard.css">
<link rel="stylesheet" href="css/highlight.css">
<link rel="stylesheet" href="css/popup.css">
<style>
html,
body {
margin: 0;
padding: 0;
height: 100%;
width: 100%;
overflow: hidden;
position: fixed;
background-color: white;
}
.box {
width: 200px;
height: 200px;
background-color: blueviolet;
}
</style>
</head>
<body>
<!--
<h1>HTML Cards</h1>
<p>Some Text on the page. Eiusmod nostrud laborum non nulla in sunt ex cillum quis. Nulla mollit minim Lorem in. Deserunt
aliquip cillum dolor adipisicing.
</p>
<p>
Ea velit consectetur est cillum consectetur adipisicing dolor sunt nostrud. Qui eu ut anim incididunt aute irure do occaecat
reprehenderit ea irure ex. Ullamco cupidatat ut duis incididunt consectetur in cillum et Lorem. Ullamco voluptate
laborum non consectetur non laborum voluptate minim. Non cillum do eiusmod magna consequat anim exercitation occaecat
proident velit.
</p>
<p>
Qui adipisicing dolor occaecat cupidatat dolore ipsum velit excepteur magna Lorem aliqua consectetur consectetur ipsum. Sunt
tempor excepteur amet laborum id enim sunt aute dolor culpa dolor non. Eu anim veniam minim eu cupidatat enim culpa
quis dolore. Amet consectetur anim et culpa aliquip consequat reprehenderit fugiat. Aute labore ullamco minim deserunt
dolore quis ipsum magna consequat culpa do. Velit proident aliqua ipsum qui dolor veniam amet proident est veniam
cillum.
</p>
<p>
Cupidatat esse ut proident consectetur irure velit esse sint consectetur id est consectetur mollit. Nisi ullamco sunt deserunt
consequat tempor adipisicing. Labore reprehenderit tempor aliquip veniam amet culpa excepteur dolore. Tempor aute
dolor est sit. Duis laboris mollit est irure dolore pariatur deserunt velit velit elit sit. Labore laborum officia
officia anim ipsum officia anim nostrud cillum est anim qui. Dolore non minim eu eiusmod amet in deserunt exercitation
anim consectetur commodo occaecat.</p> -->
<script src="../../../../../lib/3rdparty/all.js"></script>
<script src="../../../../../lib/bootstrap.js"></script>
<script src="../../../../../lib/3rdparty/inobounce.js"></script>
<script src="../../../../../lib/3rdparty/hammer.propagating.js"></script>
<script src="./js/all.js"></script>
<script src="./js/card.js"></script>
<script src="./js/highlight.js"></script>
<script src="../../../js/theme.js"></script>
<script>
setup()
async function setup() {
console.log("Setting up card ...")
let config = await Theme.loadConfig()
console.log("Config loaded ...")
let scatterContainer = new DOMScatterContainer(document.body, {
stopEvents: false,
useCapture: false
})
Card.dynamicHeight = true
function createScatterCard(id) {
return ScatterCard.loadAndCreateScatterCard(scatterContainer, id, {
basePath: config.tueschDirectory,
modules: [
// new CardPlugin.LightBox("img-overlay"),
// new CardPlugin.EnlargeableThumbnail(".thumbnail-wrapper", ".img-overlay"),
// new CardPlugin.Ui("ui"),
// new CardPlugin.Speech(".ui", "speech")
],
onCreated: () => {
console.log("Hello")
},
onClose: () => {
console.log("Tried to close the card. This is forbidden here! ;)")
}
}).catch(e => console.error(e))
}
function enableDebug(element) {
element.classList.add("debug")
}
const debug = true
if (config.cards) {
let promises = []
config.cards.forEach(card => {
let promise = createScatterCard(card)
promise.then(el => {
if (debug)
enableDebug(el)
})
});
await Promise.all(promises)
} else {
element = await createScatterCard(config.card)
if (debug) enableDebug(element)
}
console.log("Card loaded!")
}
</script>
</body>
</html>

View File

@ -0,0 +1,7 @@
$a: #ff77a5
$b: #1eb4e9
$c: #22d5a5
$d: #f65d3b
$e: #fcb95a
$f: #1eb4e9
$g: #ff77a5

View File

@ -0,0 +1,7 @@
$a: #f5f3ad //OLD
$b: #FF0000 //OLD
$c: #99d1ed
$d: #aed3b3
$e: #FF0000 //OLD
$f: #f5adac //
$g: #c499ed

View File

@ -0,0 +1,7 @@
$a: #fb8072
$b: #80b1d3
$c: #8dd3c7
$d: #fdb462
$e: #ffed6f
$f: #bc80bd
$g: #ccebc5

View File

@ -0,0 +1,7 @@
$a: #e1dea7
$b: #dec1b2
$c: #c8d9d7
$d: #b0c6b2
$e: #bebebe
$f: #dec1b2
$g: #c3c0d1

View File

@ -0,0 +1,52 @@
/**
The essential.scss defines proerties that
are essential for the basic features of an
info card and are completely
*/
.unselectable {
user-select: none;
}
.info-card {
position: absolute;
user-select: none;
}
.zoomable-wrapper {
display: inline-block;
align-self: center;
figure {
// Is required that the zoomable tween works properly.
display: inline-block;
}
// Problem with display-block is, that it produces spaces
// when elements contain a linebreak. Setting the font-size
// to 0 prevents that.
font-size: 0;
figcaption {
font-size: initial;
}
//Discuss: There is a weird div that needs to be scaled
// alongside. Maybe this introduces the jittering of the graphic.
// Try to get rid of it
// - SO
& > figure > div {
height: 100%;
}
svg {
overflow: visible;
width: 100%;
height: 100%;
}
}
div {
// Resets a weird styling, when certain elements
// are (long) clicked on using a touch screen.
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

View File

@ -0,0 +1,43 @@
@import "_variables.scss";
$material-icons-font-family: "Material Icons";
@font-face {
font-family: $material-icons-font-family;
font-style: normal;
font-weight: 400;
src: url(../fonts/material-icon-font/MaterialIcons-Regular.eot); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
url(../fonts/material-icon-font/MaterialIcons-Regular.woff2) format('woff2'),
url(../fonts/material-icon-font/MaterialIcons-Regular.woff) format('woff'),
url(../fonts/material-icon-font/MaterialIcons-Regular.ttf) format('truetype');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}

View File

@ -0,0 +1,5 @@
@mixin beforeClass($selector){
@at-root #{selector-unify(&, $selector + ":before")} {
@content
}
}

View File

@ -0,0 +1,38 @@
/*
If any default style by the browser or
certain plugins (e.g. Bulma) needs to be overwritten,
this can be done in this file.
*/
/* Remove the negative margin from Bulma's columns. */
.columns {
margin: 0 !important;
box-sizing: border-box;
}
.content {
h1,h2,h3,h4,h5,h6 {
color: unset;
}
&:not(:last-child){
margin-bottom: 0;
}
}
.button {
border-color: unset;
border: unset;
border-radius: unset;
&:active,
&:hover
{
border-color: unset;
}
}
.icon {
width: unset;
height: unset;
}

View File

@ -0,0 +1,114 @@
/* Color */
$black: #191919;
$white: #f2f2f2;
$gray-light: #e5e5e5;
$gray: #6f6f6e;
$gray-dark: #333333;
$blue: #008bd2;
$blue-light: #33a2db;
$blue-lighter: #99d1ed;
$blue-dark: #004669;
$blue-darker: #002335;
$red: #e73230;
$red-light: #ff5f5d;
$red-lighter: #f5adac;
$red-dark: #741918;
$red-darker: #3a0c0c;
$yellow: #e5e133;
$yellow-light: #eae75c;
$yellow-lighter: #f5f3ad;
$yellow-dark: #807d1c;
$yellow-darker: #0d2510;
$green: #349240;
$green-light: #85be8c;
$green-lighter: #aed3b3;
$green-dark: #1a4920;
$green-darker: #002335;
$purple: #6b00d1;
$purple-light: #8933da;
$purple-lighter: #c499ed;
$purple-dark: #360069;
$purple-darker: #1b0034;
$tuebingen-red: $red;
$link-color: $blue;
/* Font Properties */
$card-font-color: $white;
$font-family: "Calibri", sans-serif;
$tiny-font-size: 8px;
$small-font-size: 18px;
$regular-font-size: 26px;
$large-font-size: 36px;
$title-font-size: 52px;
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
/* Spacing */
$grid-space: 25px;
$default-space: 20px;
$article-space: 30px;
$border-space: 3* $default-space;
/* Borders */
$default-radius: 3px;
/* Shadows */
$near-hover-shadow: 1px 2px 5px rgba(0,0,0,0.5);
$medium-hover-shadow: 2px 3px 25px rgba(0,0,0,0.3);
/*
$context: "../../../../../..";
$white: #FEFEFE;
$shady-white: rgb(240, 240, 240);
$gray: #CCC;
$dark: #333;
$black: #222;
$small-edge-radius: 3px;
$big-edge-radius: 10px;
$small-pad: 16px;
$big-pad: 32px;
$tuebingen-red: #e73230;
$increased-letter-spacing: 0.1em;
$font-color: $black;
$text-font-size: 26px;
$medium-font-size: 28px;
$large-font-size: 32px;
$regular-font-size: 1.451rem;
$subtitle-font-size: $medium-font-size;
$title-font-size: $subtitle-font-size * 1.641;
/* Font Weights *//*
$strong-font-weight: 700;
$medium-font-weight: 500;
$light-font-weight: 300;
*/

View File

@ -0,0 +1,4 @@
@import 'card.scss'
@import 'subcard.scss'
@import 'highlight.scss'
@import 'popup.scss'

View File

@ -0,0 +1,474 @@
@import '_mixins.scss';
@import '_variables.scss';
@import '_essentials.scss';
@import '_overrides.scss';
@import '_icons.scss';
/**
* The card.scss is responsible for styling the top level of the card.
*
* + Info-Card
* ++ Header
* +++ Thubnail
* +++ Overview
* ++ Subcards-Container
* +++ n * Subcards
*/
.info-card {
font-family: $font-family;
color: white;
background-color: #333;
box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.5);
border-radius: 3px;
.ui {
width: 100%;
display: flex;
justify-content: flex-end;
padding: 10px;
z-index: 11;
position: absolute;
top: 0;
}
.speech {
width: 52px;
height: 52px;
}
&:before {
content: '';
display: block;
content: '';
position: absolute;
z-index: -1;
// SIZE
$border: 16px;
border-radius: 3px;
top: -$border/2;
left: -$border/2;
width: calc(100% + #{$border});
height: calc(100% + #{$border});
// BACKGROUND
box-shadow: 0 0 15px #008bd2;
background: repeating-linear-gradient(
-45deg,
#008bd2,
#008bd2 20px,
#33a2db 20px,
#33a2db 40px
);
// ANIMATION
background-size: 56px 56px; /* This is unique for this background, need to find a pattern and develop a formula */
background-position-x: 0%;
-webkit-animation: 'slide' 20s infinite linear forwards;
opacity: 0;
transition: opacity 1s;
}
&.speech-plugin-is-reading {
.speech.button:before {
content: 'stop';
}
&:before {
opacity: 1;
}
}
@-webkit-keyframes 'slide' {
0% {
background-position-x: 0%;
}
100% {
background-position-x: 100%;
}
}
.img-overlay {
position: absolute;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.3);
z-index: 200;
//padding: $default-space;
display: none;
align-items: center;
justify-content: center;
img {
// padding: $default-space;
width: 100%;
height: 100%;
object-fit: contain;
}
@keyframes pulse {
}
}
nav {
z-index: 200;
position: absolute;
top: $default-space;
right: $default-space;
> * {
margin-right: $default-space / 3;
}
}
a {
// display: inline-block;
color: $link-color;
&:hover {
color: $link-color;
}
}
.mainview {
display: flex;
flex-direction: column;
height: 100%;
//Inherits from info-card
border-radius: inherit;
}
p {
font-size: $regular-font-size;
}
header {
height: 35%;
color: $white;
background: linear-gradient(to top, $gray-dark, $gray 200%);
padding: $default-space * 3;
padding-bottom: $default-space;
border-radius: inherit;
display: grid;
grid-template-columns: 1fr 2fr;
grid-gap: 20px;
//box-shadow: $near-hover-box-shadow;
z-index: 1;
h1 {
-webkit-margin-before: 0;
font-size: $title-font-size;
font-weight: 500;
margin-bottom: -2px;
}
.overview {
// margin-left: $default-space;
padding: 0 $default-space;
margin-top: 0;
display: flex;
flex-direction: column;
grid-column-start:2;
//justify-content: flex-end;
}
p {
font-weight: 400;
}
p.misc {
font-size: $regular-font-size;
font-style: italic;
font-weight: 300;
opacity: 0.5;
margin-bottom: 0.641em;
// // Added an icon before the build date.
// // Just for testing.
// &:before {
// opacity: 0.5;
// position: relative;
// top: 5px;
// margin-right: 10px;
// font-style: normal;
// content: "build";
// font: {
// family: $material-icons-font-family;
// };
// }
}
}
.thumbnail-wrapper {
overflow: hidden;
border-radius: $default-radius;
&:before {
content: ' ';
position: absolute;
width: 100%;
height: 100%;
// z-index: 1;
box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.8);
}
// Discuss: I added this for the thumbnail zoom icon
// explicitly. I got rid of the .zoomicon class, because
// everything was a zoomicon.
// Now every icon is just an icon. The icons directly on the
// subcards are card-icons.
//
// But a name for icons that can be on content elements of any
// card page is yet to be found. (e.g. zoomables).
.button {
position: absolute;
bottom: 0;
right: 0;
}
}
.thumbnail {
height: 100%;
min-width: 100%;
object-fit: cover;
overflow: hidden;
}
/*
This mixin selects the elements of $selector
and adjust the style it there are n children of this selector
inside the parent.
*/
@mixin childCountIs($selector, $n) {
// #{$var} just prints the string to css.
#{$selector}:first-child:nth-last-child(#{$n}),
#{$selector}:first-child:nth-last-child(#{$n}) ~ #{$selector} {
// @content prints the content to the mixin.
@content;
}
}
.subcards-container {
// flex: 1;
background-color: $gray-dark;
height: 65%;
// We should use css-grids instead of flexbox here:
// https://www.w3.org/TR/css-grid-1/
//"Unlike Flexible Box Layout, which is single-axisoriented,
// Grid Layout is optimized for 2-dimensional layouts:
// those in which alignment of content is desired in both dimensions."
display: grid;
// Not sure why, but 1fr does not behave in the rows as expected:
// Expectation: All space is available and therefore 1fr means
// Half of the space available.
grid-auto-rows: 1fr;
grid-gap: $default-space;
padding: $default-space * 3;
padding-top: $default-space;
// The fr stands for fraction and should be preferably used with css grids.
grid-template-columns: repeat(9, 1fr);
grid-template-areas: '. tl tl tl . tr tr tr .' '. bl bl bl . br br br .';
@include childCountIs('.subcard-wrapper', 5) {
&:nth-child(4) {
grid-area: bl;
}
&:nth-child(5) {
grid-area: br;
}
}
@include childCountIs('.subcard-wrapper', 4) {
&:first-child {
grid-area: tl;
}
&:nth-child(2) {
grid-area: tr;
}
&:nth-child(3) {
grid-area: bl;
}
&:nth-child(4) {
grid-area: br;
}
}
@include childCountIs('.subcard-wrapper', 3) {
&:first-child {
grid-area: tl;
}
&:nth-child(2) {
grid-area: tr;
}
&:nth-child(3) {
grid-row: 2;
grid-column: 4 / 7;
}
}
.subcard-wrapper {
padding: 0;
}
> div {
width: auto;
grid-column: span 3;
}
}
}
.card-icon,
.zoomable-icon {
position: absolute;
bottom: 0;
right: 0;
}
.speech-only-text {
opacity: 0;
position: absolute;
user-select: none;
pointer-events: none;
z-index: -1;
}
figure {
position: relative;
border: 3px solid $white;
box-shadow: $near-hover-shadow;
-webkit-margin-before: 0;
-webkit-margin-after: 0;
-webkit-margin-start: 0;
-webkit-margin-end: 0;
}
figure .icon {
position: absolute;
bottom: 0;
right: 0;
border-radius: $default-radius 0 0 0;
}
.view-button.icon {
position: absolute;
bottom: 0;
right: 0;
padding: 26px 26px;
margin: -23px -13px;
// padding: $default-space/2 $default-space;
&.inverted {
// background-color: transparent;
&:before {
color: $white;
}
}
&:before {
color: $gray-dark;
font-size: $large-font-size;
text-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
}
}
.icon {
min-width: 44px;
min-height: 44px;
color: $black;
background-color: $white;
pointer-events: none;
&.button {
pointer-events: all;
border-radius: $default-radius;
&.corner-button {
border-radius: 0;
&.bottom-right {
border-top-left-radius: $default-radius;
}
}
}
&.inverted {
color: $white;
background-color: $black;
}
&.transparent-background {
background-color: transparent;
}
&.active {
color: $white;
background-color: $link-color;
}
&:before {
// This is a nice feature of SASS
// It lets you split attributes into
// namespaces.
//
// font-family:#, font-weight:#, font-size:#
// ==> font {family: #, weight: #, size: # }
font: {
family: $material-icons-font-family;
size: 36px;
}
@include beforeClass('.info') {
content: 'info_outline';
}
@include beforeClass('.close') {
content: 'close';
}
@include beforeClass('.zoom') {
content: 'search';
}
@include beforeClass('.speech') {
content: 'record_voice_over';
}
@include beforeClass('.language') {
content: 'language';
}
}
}
.info-card.debug {
.view-button {
background-color: rgba(255, 0, 0, 0.5) !important;
&.disabled {
filter: grayscale(1);
}
}
}

View File

@ -0,0 +1,6 @@
html, body {
position: relative;
margin:0;
padding:0;
height:100%;
}

View File

@ -0,0 +1,12 @@
circle
{
stroke-width: 1;
stroke: white;
fill: transparent;
}
mask circle
{
stroke-width: 0;
fill: white;
}

View File

@ -0,0 +1,39 @@
@import "_variables.scss";
@import "_icons.scss";
.popup {
width: 800px;
width: fit-content;
min-width: 400px;
color: $black;
background-color: $white;
border-radius: $default-radius;
box-shadow: 0 0 100px rgba(0,0,0,0.3),$medium-hover-shadow, 0 0 4px rgba(0,0,0,0.8);
padding: $default-space *2* 0.641 $default-space*2;
img {
display: block;
margin: auto;
&:not(:first-child){
margin-top: $default-space;
}
&:not(:last-child){
margin-bottom: $default-space;
}
}
.notch {
width: 20px;
height: 20px;
border-color: $white;
}
}
.PopupContent {
p:not(:last-child) {
margin-bottom: $article-space;
}
}

View File

@ -0,0 +1,345 @@
@import "_variables.scss";
/**
The subcards.scss is responsible for all css of the subcards.
Historically, it was always used for the preview-cards on the info-card
and the article page of the corresponding subcard.
Discuss: Personally I would prefer a strict separation from front page
and article page. But there may be advantages, when the unit 'subcard'
has a stylesheet on it's own.
- SO
Structure:
1. Shared (Preview and Expanded)
2. Preview Subcards
3. Expanded Subcards
*/
.info-card {
/*
1. Shared Properties
*/
.subcard {
display: flex;
flex-direction: column;
color: $black;
position: relative;
border-radius: 3px;
}
.subcard-content{
position: relative;
}
.titlebar {
min-height: 84px;
background: linear-gradient(to top, $gray-dark -100%, $gray 200%);
display: flex;
align-items: center;
justify-content: center;
border-radius: inherit;
h2 {
color: $white;
font-size: $regular-font-size;
text-transform: uppercase;
letter-spacing: 2px;
line-height: 1.3em;
// font-weight: $normal-font-weight;
text-align: center;
margin: 0;
padding: $default-space / 2;
}
}
/*
2. Preview Properties
*/
.subcards-container {
.subcard-wrapper {
display: flex;
}
.subcard {
flex: 1;
// Put the subcards before the close button
// to avoid closing when pushing subcard.
z-index: 1;
box-shadow: $near-hover-shadow;
//Required for round borders.
overflow: hidden;
}
$titlebar-height: 27%;
.titlebar {
min-height: $titlebar-height;
}
.subcard-content {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
}
.wrapper {
display: flex;
overflow: hidden;
flex:1;
// height: 100% - $titlebar-height;
.preview {
display: flex;
background-color: $white;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
p {
//font-size: $large-font-size;
// line-height: $large-font-size*1.3;
font-style: italic;
color: $gray;
font-weight: 500;
text-align: center;
padding: 2 * $default-space;
}
// Cover the whole preview area!
img {
// The position is set to absolute
// then we can use the 1fr unit on the
// grid element.
//
// Otherwise it stretches with content.
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
}
}
.icon {
border-radius: $default-radius 0 0 0;
}
.subcard.visited {
.icon.info:before {
content: "check";
}
}
figure {
//Reset some Bulma default styling.
width: 100%;
height: 100%;
padding: 0;
margin: 0;
border: none;
}
}
/*
3. Article Properties
*/
.mainview > .subcard {
background-color: rgba($black,0.8);
justify-content: center;
.column.content {
flex: 1;
display: flex;
flex-direction: column;
}
.column.content.wide {
flex: 1 0 55%;
display: flex;
flex-direction: column;
}
.column.content.narrow {
flex: 1 0 35%;
display: flex;
flex-direction: column;
}
article {
background-color: $white;
max-height: 100%;
p {
line-height: 1.4em;
}
p:last-child{
margin-bottom: 0;
}
p:not(:last-child) {
margin-bottom: 0.5em;
}
h2 {
font-size: $large-font-size;
}
h2:not(:first-child) {
margin-top: 0.5em;
}
.column:not(.zoomable-wrapper) {
margin: $article-space;
}
a {
margin: -0px -5px -20px -5px;
padding: 0px 5px 10px 5px;
}
}
.subcard-content{
overflow: hidden;
background-color: $white;
box-shadow: 1px 3px 8px rgba(0, 0, 0, 0.5)
}
.subcard-content.dynamic-height {
overflow: visible;
}
.subcard-content:not(.dynamic-height){
height: 100%;
}
.zoomable-wrapper {
padding: 0;
margin: 0;
padding-top: $article-space;
padding-bottom: 2* $article-space;
align-self: center;
flex: 0;
}
.imggroup {
padding: 0;
margin: 0;
padding-top: $article-space;
padding-bottom: 2* $article-space;
display: flex;
justify-content: space-evenly;
}
}
& > .zoomable-wrapper,
.mainview > .subcard {
// figure {
// position: relative;
// border: 5px solid white;
// box-shadow: $near-hover-shadow;
// }
figcaption {
width: 100%;
position: absolute;
text-align: center;
&.zoomcap {
font-size: $tiny-font-size;
display: none;
top: calc(100% + 10px);
padding: $default-space / 2;
background-color: $white;
box-shadow: $near-hover-shadow;
color: $black;
z-index: -1;
}
&.cap {
bottom: -40px;
}
}
}
/*
Colors for the card topics.
*/
@import "_colors_003.sass";
/* Remap the colors to the 'bundled' groups. */
$g: $a;
$a: $b;
$c: $b;
$e: $b;
@mixin subcard-style($topic-color) {
// border: 2px solid $topic-color;
.titlebar {
border-bottom: 10px solid $topic-color;
// box-shadow: 0 2px 5px rgba($topic-color, 0.5);
z-index: 10;
// background-color: $topic-color;
position: relative;
}
}
.subcard.leben_des_kunstwerks {
@include subcard-style($a);
}
.subcard.licht_und_farbe {
@include subcard-style($b);
}
.subcard.extra_info {
@include subcard-style($c);
}
.subcard.artist {
@include subcard-style($d);
}
.subcard.komposition {
@include subcard-style($e);
}
.subcard.details {
@include subcard-style($f);
}
.subcard.thema {
@include subcard-style($g);
}
}
.info-card.debug {
.mainview > .subcard a {
background-color: rgba(102, 51, 153, 0.239);
}
article {
background-color: rgba(0,255,0,0.5);
}
.subcard .view-button{
background-color: rgba(0, 255, 0, 0.5) !important;
}
}

View File

@ -0,0 +1,40 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-innerhtml="col1" data-link="Popup" tabindex="0">
<p>Vom Kriegsgott Mars existieren 2 unterschiedlich hochwertige Abgüsse, die nach dem Modell Giambolognas angefertigt
wurden. Die unterschiedliche Qualität von Abgüssen ergibt sich aus dem Aufwand der Oberflächenbearbeitung
&nbsp;nach dem Guss.</p>
</div>
<div class="column content" data-innerhtml="col2" data-link="Popup" tabindex="0">
<p>Der früheste nachgewiesene Abguss gelangte 1587 als persönliches Geschenk des Künstlers an den sächsischen
Kurfürsten Christian I., der dem Bildhauer als Dank eine goldene Kette zukommen ließ. Dieses Dresdner
Exemplar ist noch qualitätsvoller als die Braunschweiger Version. Aus dem mit ihm verknüpften Datum wird
übrigens auf eine Entstehungszeit des Modells vor 1587 geschlossen.</p>
</div>
</div>
</article>
</body>
</html>

View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 2/3 &amp; 1/3 Columns</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<article>
<div class="columns">
<div class="column content wide" data-innerhtml="col1" data-link="Popup" tabindex="0">
<p>Vom Kriegsgott Mars existieren 2 unterschiedlich hochwertige Abgüsse, die nach dem Modell Giambolognas angefertigt
wurden. Die unterschiedliche Qualität von Abgüssen ergibt sich aus dem Aufwand der Oberflächenbearbeitung
&nbsp;nach dem Guss.</p>
</div>
<div class="column content narrow" data-innerhtml="col2" data-link="Popup" tabindex="0">
<p>Der früheste nachgewiesene Abguss gelangte 1587 als persönliches Geschenk des Künstlers an den sächsischen
Kurfürsten Christian I., der dem Bildhauer als Dank eine goldene Kette zukommen ließ. Dieses Dresdner
Exemplar ist noch qualitätsvoller als die Braunschweiger Version. Aus dem mit ihm verknüpften Datum wird
übrigens auf eine Entstehungszeit des Modells vor 1587 geschlossen.</p>
</div>
</div>
</article>
</body>
</html>

View File

@ -0,0 +1,53 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title data-innerhtml="title">Article with 50% Columns and Imagegroup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
<link rel="import" href="../_theme/templates/templates.html">
</head>
<body>
<article>
<div class="columns">
<div class="column content" data-innerhtml="col1" data-link="Popup" tabindex="0">
<p>Vom Kriegsgott Mars existieren 2 unterschiedlich hochwertige Abgüsse, die nach dem Modell Giambolognas angefertigt
wurden. Die unterschiedliche Qualität von Abgüssen ergibt sich aus dem Aufwand der Oberflächenbearbeitung
&nbsp;nach dem Guss.</p>
</div>
<div class="column content" data-innerhtml="col2" data-link="Popup" tabindex="0">
<p>Der früheste nachgewiesene Abguss gelangte 1587 als persönliches Geschenk des Künstlers an den sächsischen
Kurfürsten Christian I., der dem Bildhauer als Dank eine goldene Kette zukommen ließ. Dieses Dresdner
Exemplar ist noch qualitätsvoller als die Braunschweiger Version. Aus dem mit ihm verknüpften Datum wird
übrigens auf eine Entstehungszeit des Modells vor 1587 geschlossen.</p>
</div>
</div>
<div class="columns is-multiline is-centered" data-innerhtml="bottom" tabindex="0" data-blocks="Zoomable Figure" placeholder="Add zoomable figures here...">
<div class="column" data-blocks="Zoomable Figure">
<figure>
<img src="../assets/women.jpeg">
<figcaption>A Lady</figcaption>
</figure>
</div>
<div class="column" data-blocks="Zoomable Figure">
<figure>
<img src="../assets/women.jpeg">
<figcaption>A Lady</figcaption>
</figure>
</div>
</div>
</article>
</body>
</html>

View File

@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title data-innerhtml="title">Card</title>
<link rel="stylesheet" href="../_theme/css/editor.css">
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/subcard.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
<script src="../../../../../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../../../../../lib/3rdparty/jquery.hypher.js"></script>
<script src="../../../../../lib/3rdparty/hyphenation/de.js"></script>
</head>
<body class="info-card" style="width: 1400px; height: 1200px;">
<div class="mainview">
<header class="columns">
<figure class="thumbnail-wrapper">
<img draggable="false" contenteditable="true" data-replace="src" class="thumbnail" src="../assets/women.jpeg">
</figure>
<div class="overview column content">
<h1 data-innerhtml="title" contenteditable="true">Titel</h1>
<p data-innerhtml="misc" class="misc" contenteditable="true">Misc</p>
<p data-innerhtml="description" contenteditable="true">Verschiedenes</p>
</div>
</header>
<main data-innerhtml="cards" class="subcards-container columns is-multiline is-centered" tabindex="0" data-blocks="Card,Card with Image,Card with Figure"></main>
<div class="button icon close view-button inverted transparent-background" onclick="Card.close(event)"></div>
</div>
</body>
</html>

View File

@ -0,0 +1,26 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title data-innerhtml="title">Popup</title>
<link rel="stylesheet" href="../_theme/css/bulma.css">
<link rel="stylesheet" href="../_theme/css/card.css">
<link rel="stylesheet" href="../_theme/css/article.css">
<link rel="stylesheet" href="../_theme/css/highlight.css">
<link rel="stylesheet" href="../_theme/css/popup.css">
<!-- disable zooming -->
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, minimum-scale=1, maximum-scale=1">
<script src="../_theme/js/all.js"></script>
<script src="../_theme/js/3rdparty/all.js"></script>
<script src="../_theme/js/card.js"></script>
<script src="../_theme/js/highlight.js"></script>
</head>
<body>
<!-- IMPORTANT: Deleted style overwrite here which set a rigid width. -->
<div class="popupHtml" tabindex="0" data-innerhtml="content">
</div>
</body>
</html>

View File

@ -0,0 +1,94 @@
<!-- To be consistent overall, with css-naming and bulma.
Classes should be named lower-case using hyphens to seperate words: e.g. subcard-wrapper -->
<template class="card" data-allowed-within=".columns" id="Card">
<div class="subcard-wrapper column is-one-third" ondragstart="Card.dragStart(event)">
<div class="subcard" data-append="class" data-onclick="Card.openIndexCard(event, 'articlePath')" onclick="Card.openIndexCard(event, './article1.html')">
<div class="subcard-content content">
<div class="titlebar">
<h2 data-innerhtml="h1" contenteditable="true">Eine Überschrift</h2>
</div>
<div class="wrapper">
<div data-innerhtml="preview" class="preview content">
<p data-innerhtml="text" contenteditable="true">Ein kurzer Teaser</p>
</div>
</div>
</div>
<!-- This is outside the content, that the content can have an overflow:hidden without effecting the scalability of the close button. -->
<div class="icon card-icon info button"></div>
</div>
</div>
</template>
<!-- When is this used? The id seems to be invalid. -->
<template class="cardImage" data-allowed-within=".columns" id="Card with Image">
<div class="column is-one-third" ondragstart="Card.dragStart(event)">
<div class="card">
<div class="card-content content">
<h1 contenteditable="true">Eine Überschrift</h1>
<div class="wrapper">
<div data-innerhtml="preview" class="preview">
<figure>
<!-- Here it's important to disable the image's dragable property. -->
<img draggable="false" data-replace="src" contenteditable="true" src="../assets/king.jpeg">
</figure>
</div>
</div>
</div>
</div>
</div>
</template>
<!-- The id seems to be invalid! -->
<template class="zoomableImage" data-allowed-within=".columns" id="Zoomable Image">
<!-- This wrapper was not identifiable. So I made it a zoomable-wrapper. -->
<div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure style="display: block;" class="zoomable singlefig" id="zoomable1">
<div style="position:relative;" class="svg-wrapper">
<svg draggable="false" class="mainimg" onclick="Card.openPopupOrZoomable(event)" data-replace="viewBox width height" viewBox="0 6.6 100 86.8"
width="128" height="128" contenteditable="true">
<!-- The defs section must be defined and cannot be generated in JavaScript-->
<defs></defs>
<image data-replace="width height xlink:href" width="100" height="100" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="../assets/gelehrter.jp"></image>
<g stroke-width="3" data-innerhtml="circles"></g>
</svg>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="true" data-innerhtml="caption" class="cap">Gelehrter in seiner Studierstube</figcaption>
<figcaption contenteditable="true" data-innerhtml="zoomCaption" class="zoomcap">Rembrandt:
<i>Gelehrter in seiner Studierstube</i>, Radierung, um 1652, Braunschweig, Herzog Anton Ulrich-Museum, Kupferstichkabinett.</figcaption>
</figure>
</div>
</template>
<template class="zoomableVideo" data-allowed-within=".columns" id="Zoomable Video">
<div class="zoomable-wrapper column" ondragstart="Card.dragStart(event)">
<figure class="zoomable singlefig" data-style="maxHeight" id="zoomable1">
<div style="position:relative;">
<video class="mainimg" onclick="Card.openZoomable(event)" data-replace="width src" width="100" src="../assets/small.mp4"></video>
<div class="icon button corner-button bottom-right zoom zoomable-icon" onclick="Card.openZoomable(event)"></div>
</div>
<figcaption contenteditable="true" data-innerhtml="caption" class="cap">Gelehrter in seiner Studierstube</figcaption>
<figcaption contenteditable="true" data-innerhtml="zoomCaption" class="zoomcap">Rembrandt:
<i>Gelehrter in seiner Studierstube</i>, Radierung, um 1652, Braunschweig, Herzog Anton Ulrich-Museum, Kupferstichkabinett.</figcaption>
</figure>
</div>
</template>
<template class="link" data-allowed-within="p" id="Link">
<a ondragstart="Card.dragStart(event)" href="URL">SELECTED</a>
</template>
<!--
<template class="link" data-allowed-within="p" id="Popup">
<a ondragstart="Card.dragStart(event)" onclick="Card.loadPopup(event)" href="FILE">SELECTED</a>
</template>
-->
<template class="paragraph" data-allowed-within=".column,.popup" id="Paragraph">
<p contenteditable="true" data-append="class" data-link="Popup" data-innerhtml="text">Ein Beispiel für einen Absatz</p>
</template>
<template class="header" data-allowed-within=".column,.popup" id="Header">
<h2 contenteditable="true" data-innerhtml="text">Eine Überschrift</h2>
</template>

94
lib/card/test/index.html Normal file
View File

@ -0,0 +1,94 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Card Debugging</title>
<style>
html,
body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
}
body {
display: flex;
justify-content: center;
align-items: center;
}
#scatter-container-dom {
background-color: red;
width: 800px;
height: 600px;
}
</style>
<link rel="stylesheet" href="../../../css/bulma.css" />
<link rel="stylesheet" href="./example/_theme/css/bundle.css" />
</head>
<body>
<div class="rows">
<div id="scatter-container-dom" class="row"></div>
<div class="columns row">
<div class="column">
<div id="add-button" class="button is-success">Add</div>
</div>
<div class="column">
<div id="delete-button" class="button is-danger">Delete</div>
</div>
</div>
</div>
<script src="../../../dist/iwmlib.3rdparty.js"></script>
<script src="../../../dist/iwmlib.js"></script>
<script>
const domContainer = document.getElementById("scatter-container-dom")
const scatterContainer = new DOMScatterContainer(domContainer)
let addBtn = document.getElementById('add-button')
let deleteBtn = document.getElementById('delete-button')
addBtn.addEventListener('click', createCard)
deleteBtn.addEventListener('click', () => {
Array.from(domContainer.childNodes).forEach(child =>{
ScatterCard.close(child)
})
})
function createCard() {
const path = './example/01/index.html'
let card = null
ScatterCard.loadHTML(path).then(response => {
console.log("Nothing happening here")
card = document.createElement('div')
// // For debugging purpose to find the card fast with the debugging tools.
card.setAttribute('data-source', path)
scatterContainer.element.appendChild(card)
new DOMScatter(card, scatterContainer, {
width: 1400,
height: 1200,
scale: 0.5,
minScale: 0.2,
maxScale: 1
})
ScatterCard.setup(card, response, {
basePath: './example/THE_USELESS_PART'
})
})
}
</script>
</body>
</html>

3
package-lock.json generated
View File

@ -2224,8 +2224,7 @@
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
"integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
"dev": true, "dev": true
"optional": true
}, },
"expand-brackets": { "expand-brackets": {
"version": "2.1.4", "version": "2.1.4",