Sozi library (js and css)

This commit is contained in:
Simon Vieille 2018-05-14 13:52:30 +02:00
parent 525bfad692
commit c0ff02c334
No known key found for this signature in database
GPG Key ID: 919533E2B946EA10
3 changed files with 349 additions and 0 deletions

View File

@ -0,0 +1,49 @@
Sozi UI
=======
Add controlers on embeded Sozi presentations.
Usage
-----
```
var soziUi = new SoziUi(element, options);
soziUi.addControls();
soziUi.addEvents();
```
Example
-------
```
<link rel="stylesheet" href="/path/to/sozi-ui.css">
<div class="sozi-container">
<iframe src="/presentation.svg" frameborder="0" class="presentation"></iframe>
</div>
<script src="/path/to/sozi-ui.js"></script>
<script>
window.addEventListener('load', function() {
var presentations = document.querySelectorAll('.presentation');
presentations.forEach(function(presentation) {
var soziUi = new SoziUi(presentation, {
summary: true,
allowFullscreen: true,
position: 'bottom' // or 'top',
lang: {
next: 'Suivant',
previous: 'Précédent',
fullscrenOn: 'Plein écran',
fullscrenOff: 'Réduire'
}
});
soziUi.addControls();
soziUi.addEvents();
});
}, false)
</script>
```

75
src/sozi-ui.css Normal file
View File

@ -0,0 +1,75 @@
.sozi-container {
background: #fff;
}
.sozi-ui-controls {
width: 100%;
background: #017499;
color: #fff;
font-family: Tahoma, Calibri, Verdana;
font-size: 13px;
line-height: 35px;
}
.sozi-ui-controls:after {
content: '.';
display: block;
height: 0;
width: 0;
clear: both;
}
.sozi-ui-element {
display: inline-block;
padding: 3px 15px;
cursor: pointer;
border-right: 1px solid #008ab4;
}
.sozi-ui-frame-current, .sozi-ui-frame-number, .sozi-ui-frame-current-title {
font-weight: bold;
}
.sozi-ui-frame-current-title, .sozi-ui-summary {
border: 0;
}
.sozi-ui-summary {
float: right;
border: 0;
height: 35px;
line-height: 35px;
background: none;
color: #fff;
margin-top: 4px;
}
.sozi-ui-fullscreen {
border-left: 1px solid #008ab4;
}
.sozi-ui-fullscreen-btn {
display: none;
}
.sozi-ui-fullscreen-btn.active {
display: inline;
}
.sozi-container.fullscreen iframe {
width: 100%;
height: calc(100% - 30px);
}
.sozi-container.fullscreen .sozi-ui-controls {
width: 100%;
}
.sozi-ui-controls.position-bottom {
position: absolute;
bottom: 0;
}
.sozi-ui-controls.position-top {
top: 0;
}

View File

@ -0,0 +1,225 @@
if (window.NodeList && !NodeList.prototype.forEach) {
NodeList.prototype.forEach = function(callback, thisArg) {
thisArg = thisArg || window;
for (var i = 0; i < this.length; i++) {
callback.call(thisArg, this[i], i, this);
}
};
}
if (!Array.prototype.forEach) {
Array.prototype.forEach = function(callback, thisArg) {
thisArg = thisArg || window;
for (var i = 0; i < this.length; i++) {
callback.call(thisArg, this[i], i, this);
}
};
}
(function(arr) {
arr.forEach(function(item) {
if (item.hasOwnProperty('prepend')) {
return;
}
Object.defineProperty(item, 'prepend', {
configurable: true,
enumerable: true,
writable: true,
value: function prepend() {
var argArr = Array.prototype.slice.call(arguments),
docFrag = document.createDocumentFragment();
argArr.forEach(function(argItem) {
var isNode = argItem instanceof Node;
docFrag.appendChild(isNode ? argItem : document.createTextNode(String(argItem)));
});
this.insertBefore(docFrag, this.firstChild);
}
});
});
})([Element.prototype, Document.prototype, DocumentFragment.prototype]);
var SoziUi = function(element, options) {
this.element = element;
this.options = Object.assign({
summary: true,
position: 'bottom',
allowFullscreen: true
}, options || {});
this.options.lang = Object.assign({
next: 'Suivant',
previous: 'Précédent',
fullscrenOn: 'Plein écran',
fullscrenOff: 'Réduire'
}, this.options.lang || {});
this.container = this.element.parentNode;
this.document = this.element.contentWindow;
this.sozi = this.document.sozi;
this.player = this.sozi.player;
this.document.document.querySelector('#sozi-framenumber').style.display = 'none';
}
SoziUi.prototype.addControls = function() {
var ui = `
<div class="sozi-ui-element sozi-ui-player-previous">${this.options.lang.previous}</div>
<div class="sozi-ui-element sozi-ui-frame-current"></div>
<div class="sozi-ui-element sozi-ui-frame-number"></div>
<div class="sozi-ui-element sozi-ui-player-next">${this.options.lang.next}</div>
<div class="sozi-ui-element sozi-ui-frame-current-title"></div>
`;
if (this.options.allowFullscreen) {
var uiFullscreen = document.createElement('div');
uiFullscreen.classList.add('sozi-ui-fullscreen');
uiFullscreen.classList.add('sozi-ui-element');
uiFullscreen.innerHTML = `
<span class="sozi-ui-fullscreen-btn sozi-ui-fullscreen-on active">${this.options.lang.fullscrenOn}</span>
<span class="sozi-ui-fullscreen-btn sozi-ui-fullscreen-off">${this.options.lang.fullscrenOff}</span>
`
ui += uiFullscreen.outerHTML;
}
if (this.options.summary) {
var summary = document.createElement('select');
summary.classList.add('sozi-ui-summary');
summary.classList.add('sozi-ui-element');
this.sozi.document.frames.forEach(function(frame, i) {
var item = document.createElement('option');
item.classList.add('sozi-ui-summary-item');
item.setAttribute('value', i);
item.textContent = frame.title;
summary.appendChild(item);
});
ui += summary.outerHTML;
}
controls = document.createElement('div');
controls.classList.add('sozi-ui-controls');
controls.innerHTML = ui;
if (this.options.position === 'bottom') {
controls.classList.add('position-bottom');
this.container.append(controls);
} else {
controls.classList.add('position-top');
this.container.prepend(controls);
}
this.uiFrameCurrent = controls.querySelector('.sozi-ui-frame-current');
this.uiFrameCurrentTitle = controls.querySelector('.sozi-ui-frame-current-title');
this.uiFrameNumber = controls.querySelector('.sozi-ui-frame-number');
this.uiSummaryItems = controls.querySelectorAll('.sozi-ui-summary-item');
this.uiPlayerPrevious = controls.querySelector('.sozi-ui-player-previous');
this.uiPlayerNext = controls.querySelector('.sozi-ui-player-next');
this.uiFullscreenOn = controls.querySelector('.sozi-ui-fullscreen-on')
this.uiFullscreenOff = controls.querySelector('.sozi-ui-fullscreen-off')
this.uiFrameCurrent.textContent = this.currentFrame();
this.uiFrameNumber.textContent = this.frameNumber();
this.uiFrameCurrentTitle.textContent = this.currentFrameTitle();
}
SoziUi.prototype.addEvents = function() {
var that = this;
this.sozi.events.listen('framechange', function() {
that.onFrameChange();
that.element.focus();
});
this.uiPlayerPrevious.addEventListener('click', function() {
that.previousFrame();
}, false);
this.uiPlayerNext.addEventListener('click', function() {
that.nextFrame();
}, false);
this.container.addEventListener('mouseenter', function() {
that.element.focus();
}, false)
if (this.options.allowFullscreen) {
this.uiFullscreenOn.addEventListener('click', function() {
that.fullscreen(true);
}, false);
this.uiFullscreenOff.addEventListener('click', function() {
that.fullscreen(false);
}, false);
['webkitfullscreenchange', 'mozfullscreenchange', 'fullscreenchange', 'MSFullscreenChange'].forEach(function(event) {
document.addEventListener(event, function() {
that.uiFullscreenOn.classList.toggle('active');
that.uiFullscreenOff.classList.toggle('active');
that.container.classList.toggle('fullscreen');
that.element.focus();
}, false);
});
}
if (this.options.summary) {
this.uiSummaryItems.forEach(function(item) {
item.addEventListener('click', function() {
var frame = parseInt(item.getAttribute('value'));
that.sozi.events.fire('framechange', frame);
that.player.moveToFrame(frame)
that.element.focus();
}, false);
});
}
}
SoziUi.prototype.frameNumber = function() {
return this.sozi.document.frames.length;
}
SoziUi.prototype.currentFrame = function() {
return this.sozi.location.getFrameIndex() + 1;
}
SoziUi.prototype.currentFrameTitle = function() {
return this.sozi.document.frames[this.currentFrame() - 1].title;
}
SoziUi.prototype.previousFrame = function() {
return this.player.moveToPrevious();
}
SoziUi.prototype.nextFrame = function() {
return this.player.moveToNext();
}
SoziUi.prototype.onFrameChange = function() {
this.uiFrameCurrent.textContent = this.currentFrame();
this.uiFrameCurrentTitle.textContent = this.currentFrameTitle();
}
SoziUi.prototype.fullscreen = function(active) {
if (active) {
if (this.container.requestFullscreen) {
this.container.requestFullscreen();
} else if (this.container.webkitRequestFullscreen) {
this.container.webkitRequestFullscreen();
} else if (this.container.mozRequestFullScreen) {
this.container.mozRequestFullScreen();
}
} else {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
}
}
}