Merge branch 'staging' of github.com:xwiki-labs/cryptpad into staging
commit
6e733b1329
@ -0,0 +1,190 @@
|
|||||||
|
require.config({ paths: { 'json.sortify': '/bower_components/json.sortify/dist/JSON.sortify' } });
|
||||||
|
define([
|
||||||
|
'/common/cryptpad-common.js',
|
||||||
|
'/common/cryptget.js',
|
||||||
|
'/common/fileObject.js',
|
||||||
|
'json.sortify'
|
||||||
|
], function (Cryptpad, Crypt, FO, Sortify) {
|
||||||
|
var exp = {};
|
||||||
|
|
||||||
|
var getType = function (el) {
|
||||||
|
if (el === null) { return "null"; }
|
||||||
|
return Array.isArray(el) ? "array" : typeof(el);
|
||||||
|
};
|
||||||
|
|
||||||
|
var findAvailableKey = function (obj, key) {
|
||||||
|
if (typeof (obj[key]) === "undefined") { return key; }
|
||||||
|
var i = 1;
|
||||||
|
var nkey = key;
|
||||||
|
while (typeof (obj[nkey]) !== "undefined") {
|
||||||
|
nkey = key + '_' + i;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return nkey;
|
||||||
|
};
|
||||||
|
|
||||||
|
var copy = function (el) {
|
||||||
|
if (typeof (el) !== "object") { return el; }
|
||||||
|
return JSON.parse(JSON.stringify(el));
|
||||||
|
};
|
||||||
|
|
||||||
|
var deduplicate = function (array) {
|
||||||
|
var a = array.slice();
|
||||||
|
for(var i=0; i<a.length; i++) {
|
||||||
|
for(var j=i+1; j<a.length; j++) {
|
||||||
|
if(a[i] === a[j] || (
|
||||||
|
typeof(a[i]) === "object" && Sortify(a[i]) === Sortify(a[j]))) {
|
||||||
|
a.splice(j--, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return a;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Merge obj2 into obj1
|
||||||
|
// If keepOld is true, obj1 values are kept in case of conflicti
|
||||||
|
// Not used ATM
|
||||||
|
var merge = function (obj1, obj2, keepOld) {
|
||||||
|
if (typeof (obj1) !== "object" || typeof (obj2) !== "object") { return; }
|
||||||
|
Object.keys(obj2).forEach(function (k) {
|
||||||
|
var v = obj2[k];
|
||||||
|
// If one of them is not an object or if we have a map and a array, don't override, create a new key
|
||||||
|
if (!obj1[k] || typeof(obj1[k]) !== "object" || typeof(obj2[k]) !== "object" ||
|
||||||
|
(getType(obj1[k]) !== getType(obj2[k]))) {
|
||||||
|
// We don't want to override the values in the object (username, preferences)
|
||||||
|
// These values should be the ones stored in the first object
|
||||||
|
if (keepOld) { return; }
|
||||||
|
if (obj1[k] === obj2[k]) { return; }
|
||||||
|
var nkey = findAvailableKey(obj1, k);
|
||||||
|
obj1[nkey] = copy(obj2[k]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Else, they're both maps or both arrays
|
||||||
|
if (getType(obj1[k]) === "array" && getType(obj2[k]) === "array") {
|
||||||
|
var c = obj1[k].concat(obj2[k]);
|
||||||
|
obj1[k] = deduplicate(c);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
merge(obj1[k], obj2[k], keepOld);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var createFromPath = function (proxy, oldFo, path, href) {
|
||||||
|
var root = proxy.drive;
|
||||||
|
|
||||||
|
var error = function (msg) {
|
||||||
|
console.error(msg || "Unable to find that path", path);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (path[0] === FO.TRASH && path.length === 4) {
|
||||||
|
href = oldFo.getTrashElementData(path);
|
||||||
|
path.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
var p, next, nextRoot;
|
||||||
|
path.forEach(function (p, i) {
|
||||||
|
if (!root) { return; }
|
||||||
|
if (typeof(p) === "string") {
|
||||||
|
if (getType(root) !== "object") { root = undefined; error(); return; }
|
||||||
|
if (i === path.length - 1) {
|
||||||
|
root[findAvailableKey(root, p)] = href;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
next = getType(path[i+1]);
|
||||||
|
nextRoot = getType(root[p]);
|
||||||
|
if (nextRoot !== "undefined") {
|
||||||
|
if (next === "string" && nextRoot === "object" || next === "number" && nextRoot === "array") {
|
||||||
|
root = root[p];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
p = findAvailableKey(root, p);
|
||||||
|
}
|
||||||
|
if (next === "number") {
|
||||||
|
root[p] = [];
|
||||||
|
root = root[p];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
root[p] = {};
|
||||||
|
root = root[p];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Path contains a non-string element: it's an array index
|
||||||
|
if (typeof(p) !== "number") { root = undefined; error(); return; }
|
||||||
|
if (getType(root) !== "array") { root = undefined; error(); return; }
|
||||||
|
if (i === path.length - 1) {
|
||||||
|
if (root.indexOf(href) === -1) { root.push(href); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
next = getType(path[i+1]);
|
||||||
|
if (next === "number") {
|
||||||
|
error('2 consecutives arrays in the user object');
|
||||||
|
root = undefined;
|
||||||
|
//root.push([]);
|
||||||
|
//root = root[root.length - 1];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
root.push({});
|
||||||
|
root = root[root.length - 1];
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
var mergeAnonDrive = exp.anonDriveIntoUser = function (proxy, cb) {
|
||||||
|
// Make sure we have an FS_hash and we don't use it, otherwise just stop the migration and cb
|
||||||
|
if (!localStorage.FS_hash || !Cryptpad.isLoggedIn()) {
|
||||||
|
if (typeof(cb) === "function") { cb(); }
|
||||||
|
}
|
||||||
|
// Get the content of FS_hash and then merge the objects, remove the migration key and cb
|
||||||
|
var todo = function (err, doc) {
|
||||||
|
if (err) { console.error("Cannot migrate recent pads", err); return; }
|
||||||
|
var parsed;
|
||||||
|
try { parsed = JSON.parse(doc); } catch (e) { console.error("Cannot parsed recent pads", e); return; }
|
||||||
|
if (parsed) {
|
||||||
|
//merge(proxy, parsed, true);
|
||||||
|
var oldFo = FO.init(parsed.drive, {
|
||||||
|
Cryptpad: Cryptpad
|
||||||
|
});
|
||||||
|
var newData = Cryptpad.getStore().getProxy();
|
||||||
|
var newFo = newData.fo;
|
||||||
|
var newRecentPads = proxy.drive[Cryptpad.storageKey];
|
||||||
|
var newFiles = newFo.getFilesDataFiles();
|
||||||
|
var oldFiles = oldFo.getFilesDataFiles();
|
||||||
|
oldFiles.forEach(function (href) {
|
||||||
|
// Do not migrate a pad if we already have it, it would create a duplicate in the drive
|
||||||
|
if (newFiles.indexOf(href) !== -1) { return; }
|
||||||
|
// If we have a stronger version, do not add the current href
|
||||||
|
if (Cryptpad.findStronger(href, newRecentPads)) { return; }
|
||||||
|
// If we have a weaker version, replace the href by the new one
|
||||||
|
// NOTE: if that weaker version is in the trash, the strong one will be put in unsorted
|
||||||
|
var weaker = Cryptpad.findWeaker(href, newRecentPads);
|
||||||
|
if (weaker) {
|
||||||
|
// Update RECENTPADS
|
||||||
|
newRecentPads.some(function (pad) {
|
||||||
|
if (pad.href === weaker) {
|
||||||
|
pad.href = href;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
// Update the file in the drive
|
||||||
|
newFo.replaceHref(weaker, href);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Here it means we have a new href, so we should add it to the drive at its old location
|
||||||
|
var paths = oldFo.findFile(href);
|
||||||
|
if (paths.length === 0) { return; }
|
||||||
|
createFromPath(proxy, oldFo, paths[0], href);
|
||||||
|
// Also, push the file data in our array
|
||||||
|
var data = oldFo.getFileData(href);
|
||||||
|
if (data) {
|
||||||
|
newRecentPads.push(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (typeof(cb) === "function") { cb(); }
|
||||||
|
};
|
||||||
|
Crypt.get(localStorage.FS_hash, todo);
|
||||||
|
};
|
||||||
|
|
||||||
|
return exp;
|
||||||
|
});
|
@ -0,0 +1,322 @@
|
|||||||
|
html,
|
||||||
|
body {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-size: 40px;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 37px;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
font-size: 34px;
|
||||||
|
}
|
||||||
|
h4 {
|
||||||
|
font-size: 31px;
|
||||||
|
}
|
||||||
|
h5 {
|
||||||
|
font-size: 27px;
|
||||||
|
}
|
||||||
|
h6 {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
body .CodeMirror {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
body .CodeMirror-focused .cm-matchhighlight {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAFklEQVQI12NgYGBgkKzc8x9CMDAwAAAmhwSbidEoSQAAAABJRU5ErkJggg==);
|
||||||
|
background-position: bottom;
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
#colorPicker_check {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
@media print {
|
||||||
|
@page {
|
||||||
|
margin: 0;
|
||||||
|
size: auto;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
body .CodeMirror,
|
||||||
|
body #cme_toolbox {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
body * {
|
||||||
|
visibility: hidden;
|
||||||
|
height: auto;
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
max-height: none;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
html #print {
|
||||||
|
display: block;
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
html #print * {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#print {
|
||||||
|
position: relative;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#print .slide-frame {
|
||||||
|
display: flex !important;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-flow: column;
|
||||||
|
padding: 5vh 0;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
page-break-after: always;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
#print .slide-frame li {
|
||||||
|
min-width: 50vw;
|
||||||
|
}
|
||||||
|
#print .slide-frame h1 {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
#print .slide-frame .slideNumber {
|
||||||
|
position: absolute;
|
||||||
|
right: 5vh;
|
||||||
|
bottom: 5vh;
|
||||||
|
}
|
||||||
|
#print .slide-frame .slideDate {
|
||||||
|
position: absolute;
|
||||||
|
left: 5vh;
|
||||||
|
bottom: 5vh;
|
||||||
|
}
|
||||||
|
#print .slide-frame .slideTitle {
|
||||||
|
position: absolute;
|
||||||
|
top: 5vh;
|
||||||
|
left: 0px;
|
||||||
|
right: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.cp.slide #modal .button {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 30px;
|
||||||
|
opacity: 0.6;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.cp.slide #modal .button:hover {
|
||||||
|
opacity: 1;
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
.cp.slide #modal #button_exit {
|
||||||
|
left: 20px;
|
||||||
|
top: 20px;
|
||||||
|
z-index: 9001;
|
||||||
|
}
|
||||||
|
.cp.slide #modal #button_left {
|
||||||
|
left: 6vw;
|
||||||
|
bottom: 10vh;
|
||||||
|
}
|
||||||
|
.cp.slide #modal #button_right {
|
||||||
|
right: 6vw;
|
||||||
|
bottom: 10vh;
|
||||||
|
}
|
||||||
|
.cp.slide #modal #content h1,
|
||||||
|
.cp.slide #modal #content h2,
|
||||||
|
.cp.slide #modal #content h3,
|
||||||
|
.cp.slide #modal #content h4,
|
||||||
|
.cp.slide #modal #content h5,
|
||||||
|
.cp.slide #modal #content h6 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.cp.slide #modal.shown {
|
||||||
|
display: block;
|
||||||
|
position: fixed;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
z-index: 100;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.cp.slide #modal #content p,
|
||||||
|
.cp.slide #modal #content ul,
|
||||||
|
.cp.slide #modal #content ol {
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
.cp.slide #modal #content img {
|
||||||
|
position: relative;
|
||||||
|
min-width: 1%;
|
||||||
|
max-width: 90%;
|
||||||
|
max-height: 90%;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
.cp div.modal,
|
||||||
|
.cp div#modal {
|
||||||
|
box-sizing: border-box;
|
||||||
|
z-index: 9001;
|
||||||
|
position: fixed;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
display: none;
|
||||||
|
background-color: #000;
|
||||||
|
}
|
||||||
|
.cp div.modal #content,
|
||||||
|
.cp div#modal #content {
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid white;
|
||||||
|
vertical-align: middle;
|
||||||
|
padding: 2.5vw;
|
||||||
|
/* center things as much as possible
|
||||||
|
|
||||||
|
margin-top: 50vh;
|
||||||
|
margin-bottom: 50vh;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
|
||||||
|
*/
|
||||||
|
width: 100vw;
|
||||||
|
height: 56.25vw;
|
||||||
|
max-height: 100vh;
|
||||||
|
max-width: 177.78vh;
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.cp div.modal #content p,
|
||||||
|
.cp div#modal #content p,
|
||||||
|
.cp div.modal #content li,
|
||||||
|
.cp div#modal #content li,
|
||||||
|
.cp div.modal #content pre,
|
||||||
|
.cp div#modal #content pre,
|
||||||
|
.cp div.modal #content code,
|
||||||
|
.cp div#modal #content code {
|
||||||
|
font-size: 2.75vw;
|
||||||
|
line-height: 3.025vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h1,
|
||||||
|
.cp div#modal #content h1 {
|
||||||
|
font-size: 5vw;
|
||||||
|
line-height: 5.5vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h2,
|
||||||
|
.cp div#modal #content h2 {
|
||||||
|
font-size: 4.2vw;
|
||||||
|
line-height: 4.62vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h3,
|
||||||
|
.cp div#modal #content h3 {
|
||||||
|
font-size: 3.6vw;
|
||||||
|
line-height: 3.96vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h4,
|
||||||
|
.cp div#modal #content h4 {
|
||||||
|
font-size: 3vw;
|
||||||
|
line-height: 3.3vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h5,
|
||||||
|
.cp div#modal #content h5 {
|
||||||
|
font-size: 2.2vw;
|
||||||
|
line-height: 2.42vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h6,
|
||||||
|
.cp div#modal #content h6 {
|
||||||
|
font-size: 1.6vw;
|
||||||
|
line-height: 1.76vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content h1,
|
||||||
|
.cp div#modal #content h1,
|
||||||
|
.cp div.modal #content h2,
|
||||||
|
.cp div#modal #content h2,
|
||||||
|
.cp div.modal #content h3,
|
||||||
|
.cp div#modal #content h3,
|
||||||
|
.cp div.modal #content h4,
|
||||||
|
.cp div#modal #content h4,
|
||||||
|
.cp div.modal #content h5,
|
||||||
|
.cp div#modal #content h5,
|
||||||
|
.cp div.modal #content h6,
|
||||||
|
.cp div#modal #content h6 {
|
||||||
|
color: inherit;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.cp div.modal #content pre > code,
|
||||||
|
.cp div#modal #content pre > code {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid #333;
|
||||||
|
width: 90%;
|
||||||
|
margin: auto;
|
||||||
|
padding-left: .25vw;
|
||||||
|
}
|
||||||
|
.cp div.modal #content ul,
|
||||||
|
.cp div#modal #content ul,
|
||||||
|
.cp div.modal #content ol,
|
||||||
|
.cp div#modal #content ol {
|
||||||
|
min-width: 50%;
|
||||||
|
max-width: 100%;
|
||||||
|
display: table;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.cp div.modal .center,
|
||||||
|
.cp div#modal .center {
|
||||||
|
position: relative;
|
||||||
|
width: 80%;
|
||||||
|
height: 80%;
|
||||||
|
margin: auto;
|
||||||
|
border: 1px solid #ffffff;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.cp div.modal.shown,
|
||||||
|
.cp div#modal.shown {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.cp div.modal table,
|
||||||
|
.cp div#modal table {
|
||||||
|
margin: 30px;
|
||||||
|
border-collapse: collapse;
|
||||||
|
}
|
||||||
|
.cp div.modal table input,
|
||||||
|
.cp div#modal table input {
|
||||||
|
height: 100%;
|
||||||
|
width: 90%;
|
||||||
|
border: 3px solid #fff;
|
||||||
|
}
|
||||||
|
.cp div.modal table tfoot tr td,
|
||||||
|
.cp div#modal table tfoot tr td {
|
||||||
|
z-index: 4000;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.cp div.modal #addtime,
|
||||||
|
.cp div#modal #addtime,
|
||||||
|
.cp div.modal #adddate,
|
||||||
|
.cp div#modal #adddate {
|
||||||
|
color: #46E981;
|
||||||
|
border: 1px solid #46E981;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
.cp div.modal #adddate,
|
||||||
|
.cp div#modal #adddate {
|
||||||
|
border-top-left-radius: 5px;
|
||||||
|
}
|
||||||
|
.cp div.modal #addtime,
|
||||||
|
.cp div#modal #addtime {
|
||||||
|
border-bottom-left-radius: 5px;
|
||||||
|
}
|
@ -0,0 +1,314 @@
|
|||||||
|
@import "../../customize.dist/src/less/variables.less";
|
||||||
|
@import "../../customize.dist/src/less/mixins.less";
|
||||||
|
|
||||||
|
// used for slides
|
||||||
|
.viewportRatio (@x, @y, @p: 100) {
|
||||||
|
width: @p * 100vw;
|
||||||
|
height: @y * (@p * 100vw) / @x;
|
||||||
|
max-width: @x / @y * (@p * 100vh);
|
||||||
|
max-height: (@p * 100vh);
|
||||||
|
}
|
||||||
|
|
||||||
|
html, body{
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
padding: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
flex-flow: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
//.cp {
|
||||||
|
h1 { font-size: 40px; }
|
||||||
|
h2 { font-size: 37px; }
|
||||||
|
h3 { font-size: 34px; }
|
||||||
|
h4 { font-size: 31px; }
|
||||||
|
h5 { font-size: 27px; }
|
||||||
|
h6 { font-size: 24px; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
.CodeMirror {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.CodeMirror-focused .cm-matchhighlight {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAFklEQVQI12NgYGBgkKzc8x9CMDAwAAAmhwSbidEoSQAAAABJRU5ErkJggg==);
|
||||||
|
background-position: bottom;
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#colorPicker_check {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
@page {
|
||||||
|
margin: 0;
|
||||||
|
size: auto;
|
||||||
|
}
|
||||||
|
body {
|
||||||
|
.CodeMirror, #cme_toolbox {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
* {
|
||||||
|
visibility: hidden;
|
||||||
|
height: auto;
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
html, body {
|
||||||
|
max-height: none;
|
||||||
|
overflow: visible;
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
#print {
|
||||||
|
display: block;
|
||||||
|
visibility: visible;
|
||||||
|
* {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#print {
|
||||||
|
position: relative;
|
||||||
|
display: none;
|
||||||
|
.slide-frame {
|
||||||
|
display: flex !important;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
flex-flow: column;
|
||||||
|
padding: 5vh 0;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
page-break-after: always;
|
||||||
|
position: relative;
|
||||||
|
box-sizing: border-box;
|
||||||
|
li {
|
||||||
|
min-width: 50vw;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
.slideNumber {
|
||||||
|
position: absolute;
|
||||||
|
right: 5vh;
|
||||||
|
bottom: 5vh;
|
||||||
|
}
|
||||||
|
.slideDate {
|
||||||
|
position: absolute;
|
||||||
|
left: 5vh;
|
||||||
|
bottom: 5vh;
|
||||||
|
}
|
||||||
|
.slideTitle {
|
||||||
|
position: absolute;
|
||||||
|
top: 5vh;
|
||||||
|
left: 0px; right: 0px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cp {
|
||||||
|
|
||||||
|
&.slide {
|
||||||
|
#modal {
|
||||||
|
.button {
|
||||||
|
position: absolute;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 30px;
|
||||||
|
opacity: 0.6;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.button:hover {
|
||||||
|
opacity: 1;
|
||||||
|
display: block !important;
|
||||||
|
}
|
||||||
|
#button_exit {
|
||||||
|
left: 20px;
|
||||||
|
top: 20px;
|
||||||
|
z-index: 9001;
|
||||||
|
}
|
||||||
|
#button_left {
|
||||||
|
left: 6vw;
|
||||||
|
bottom: 10vh;
|
||||||
|
}
|
||||||
|
#button_right {
|
||||||
|
right: 6vw;
|
||||||
|
bottom: 10vh;
|
||||||
|
}
|
||||||
|
#content {
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
&.shown {
|
||||||
|
display: block;
|
||||||
|
position: fixed;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
z-index: 100;
|
||||||
|
background-color: black;
|
||||||
|
color: white;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#modal #content {
|
||||||
|
p, ul, ol { font-size: 26px; }
|
||||||
|
|
||||||
|
img {
|
||||||
|
position: relative;
|
||||||
|
min-width: 1%;
|
||||||
|
max-width: 90%;
|
||||||
|
max-height: 90%;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
div.modal, div#modal {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
#content {
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px solid white;
|
||||||
|
|
||||||
|
vertical-align: middle;
|
||||||
|
padding: 2.5vw;
|
||||||
|
|
||||||
|
/* center things as much as possible
|
||||||
|
|
||||||
|
margin-top: 50vh;
|
||||||
|
margin-bottom: 50vh;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
width: 100vw;
|
||||||
|
height: 56.25vw; // height:width ratio = 9/16 = .5625
|
||||||
|
max-height: 100vh;
|
||||||
|
max-width: 177.78vh; // 16/9 = 1.778
|
||||||
|
margin: auto;
|
||||||
|
position: absolute;
|
||||||
|
top:0;bottom:0; // vertical center
|
||||||
|
left:0;right:0; // horizontal center
|
||||||
|
|
||||||
|
p, li, pre, code {
|
||||||
|
.size(2.75);
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 { .size(5); }
|
||||||
|
h2 { .size(4.2); }
|
||||||
|
h3 { .size(3.6); }
|
||||||
|
h4 { .size (3); }
|
||||||
|
h5 { .size(2.2); }
|
||||||
|
h6 { .size(1.6); }
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
color: inherit;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
pre > code {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
border: 1px solid #333;
|
||||||
|
width: 90%;
|
||||||
|
margin: auto;
|
||||||
|
padding-left: .25vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul, ol {
|
||||||
|
min-width: 50%;
|
||||||
|
max-width: 100%;
|
||||||
|
display: table;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
box-sizing: border-box;
|
||||||
|
z-index: 9001;
|
||||||
|
position: fixed;
|
||||||
|
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
height: 100vh;
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
background-color: @slide-default-bg;
|
||||||
|
|
||||||
|
.center {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
width: 80%;
|
||||||
|
height: 80%;
|
||||||
|
margin: auto;
|
||||||
|
border: 1px solid @light-base;
|
||||||
|
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.shown {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
margin: 30px;
|
||||||
|
|
||||||
|
border-collapse: collapse;
|
||||||
|
tr {
|
||||||
|
td {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
height: 100%;
|
||||||
|
width: 90%;
|
||||||
|
border: 3px solid @base;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
tr {
|
||||||
|
th {
|
||||||
|
span.remove {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tbody {
|
||||||
|
tr {
|
||||||
|
td {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tfoot {
|
||||||
|
tr {
|
||||||
|
td {
|
||||||
|
z-index: 4000;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#addtime,
|
||||||
|
#adddate {
|
||||||
|
color: @cp-green;
|
||||||
|
border: 1px solid @cp-green;
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#adddate { .top-left; }
|
||||||
|
#addtime { .bottom-left; }
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue