Merge branch 'master' into master
@ -0,0 +1,5 @@
|
||||
data
|
||||
Dockerfile
|
||||
docker-compose.yml
|
||||
.git
|
||||
.gitignore
|
@ -0,0 +1,4 @@
|
||||
VERSION=latest
|
||||
USE_SSL=true
|
||||
STORAGE='./storage/file'
|
||||
LOG_TO_STDOUT=true
|
@ -0,0 +1,7 @@
|
||||
[ignore]
|
||||
|
||||
[include]
|
||||
|
||||
[libs]
|
||||
|
||||
[options]
|
@ -1,11 +1,10 @@
|
||||
node_modules/
|
||||
www/bower_components/
|
||||
www/code/codemirror*
|
||||
www/common/chainpad.js
|
||||
storage/kad.js
|
||||
www/common/otaml.js
|
||||
www/common/pdfjs/
|
||||
|
||||
NetFluxWebsocketSrv.js
|
||||
NetFluxWebsocketServer.js
|
||||
WebRTCSrv.js
|
||||
server.js
|
||||
www/common/media-tag.js
|
||||
www/scratch
|
||||
|
||||
www/common/toolbar.js
|
||||
www/common/hyperscript.js
|
||||
|
@ -0,0 +1,20 @@
|
||||
FROM node:6-alpine
|
||||
|
||||
COPY . /cryptpad
|
||||
WORKDIR /cryptpad
|
||||
|
||||
RUN apk add --no-cache git tini \
|
||||
&& npm install \
|
||||
&& npm install -g bower \
|
||||
&& bower install --allow-root
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
VOLUME /cryptpad/datastore
|
||||
VOLUME /cryptpad/customize
|
||||
|
||||
ENV USE_SSL=false
|
||||
ENV STORAGE='./storage/file'
|
||||
ENV LOG_TO_STDOUT=true
|
||||
|
||||
CMD ["/sbin/tini", "--", "/cryptpad/container-start.sh"]
|
@ -1,309 +0,0 @@
|
||||
;(function () { 'use strict';
|
||||
const Crypto = require('crypto');
|
||||
const Nacl = require('tweetnacl');
|
||||
|
||||
const LAG_MAX_BEFORE_DISCONNECT = 30000;
|
||||
const LAG_MAX_BEFORE_PING = 15000;
|
||||
const HISTORY_KEEPER_ID = Crypto.randomBytes(8).toString('hex');
|
||||
|
||||
const USE_HISTORY_KEEPER = true;
|
||||
const USE_FILE_BACKUP_STORAGE = true;
|
||||
|
||||
let dropUser;
|
||||
let historyKeeperKeys = {};
|
||||
|
||||
const now = function () { return (new Date()).getTime(); };
|
||||
|
||||
const socketSendable = function (socket) {
|
||||
return socket && socket.readyState === 1;
|
||||
};
|
||||
|
||||
const sendMsg = function (ctx, user, msg) {
|
||||
if (!socketSendable(user.socket)) { return; }
|
||||
try {
|
||||
if (ctx.config.logToStdout) { console.log('<' + JSON.stringify(msg)); }
|
||||
user.socket.send(JSON.stringify(msg));
|
||||
} catch (e) {
|
||||
console.log(e.stack);
|
||||
dropUser(ctx, user);
|
||||
}
|
||||
};
|
||||
|
||||
const storeMessage = function (ctx, channel, msg) {
|
||||
ctx.store.message(channel.id, msg, function (err) {
|
||||
if (err && typeof(err) !== 'function') {
|
||||
// ignore functions because older datastores
|
||||
// might pass waitFors into the callback
|
||||
console.log("Error writing message: " + err);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const sendChannelMessage = function (ctx, channel, msgStruct) {
|
||||
msgStruct.unshift(0);
|
||||
channel.forEach(function (user) {
|
||||
if(msgStruct[2] !== 'MSG' || user.id !== msgStruct[1]) { // We don't want to send back a message to its sender, in order to save bandwidth
|
||||
sendMsg(ctx, user, msgStruct);
|
||||
}
|
||||
});
|
||||
if (USE_HISTORY_KEEPER && msgStruct[2] === 'MSG') {
|
||||
if (historyKeeperKeys[channel.id]) {
|
||||
let signedMsg = msgStruct[4].replace(/^cp\|/, '');
|
||||
signedMsg = Nacl.util.decodeBase64(signedMsg);
|
||||
let validateKey = Nacl.util.decodeBase64(historyKeeperKeys[channel.id]);
|
||||
let validated = Nacl.sign.open(signedMsg, validateKey);
|
||||
if (!validated) {
|
||||
console.log("Signed message rejected");
|
||||
return;
|
||||
}
|
||||
}
|
||||
storeMessage(ctx, channel, JSON.stringify(msgStruct));
|
||||
}
|
||||
};
|
||||
|
||||
dropUser = function (ctx, user) {
|
||||
if (user.socket.readyState !== 2 /* WebSocket.CLOSING */
|
||||
&& user.socket.readyState !== 3 /* WebSocket.CLOSED */)
|
||||
{
|
||||
try {
|
||||
user.socket.close();
|
||||
} catch (e) {
|
||||
console.log("Failed to disconnect ["+user.id+"], attempting to terminate");
|
||||
try {
|
||||
user.socket.terminate();
|
||||
} catch (ee) {
|
||||
console.log("Failed to terminate ["+user.id+"] *shrug*");
|
||||
}
|
||||
}
|
||||
}
|
||||
delete ctx.users[user.id];
|
||||
Object.keys(ctx.channels).forEach(function (chanName) {
|
||||
let chan = ctx.channels[chanName];
|
||||
let idx = chan.indexOf(user);
|
||||
if (idx < 0) { return; }
|
||||
|
||||
if (ctx.config.verbose) {
|
||||
console.log("Removing ["+user.id+"] from channel ["+chanName+"]");
|
||||
}
|
||||
chan.splice(idx, 1);
|
||||
if (chan.length === 0) {
|
||||
if (ctx.config.verbose) {
|
||||
console.log("Removing empty channel ["+chanName+"]");
|
||||
}
|
||||
delete ctx.channels[chanName];
|
||||
delete historyKeeperKeys[chanName];
|
||||
|
||||
/* Call removeChannel if it is a function and channel removal is
|
||||
set to true in the config file */
|
||||
if (ctx.config.removeChannels) {
|
||||
if (typeof(ctx.store.removeChannel) === 'function') {
|
||||
ctx.timeouts[chanName] = setTimeout(function () {
|
||||
ctx.store.removeChannel(chanName, function (err) {
|
||||
if (err) { console.error("[removeChannelErr]: %s", err); }
|
||||
else {
|
||||
if (ctx.config.verbose) {
|
||||
console.log("Deleted channel [%s] history from database...", chanName);
|
||||
}
|
||||
}
|
||||
});
|
||||
}, ctx.config.channelRemovalTimeout);
|
||||
} else {
|
||||
console.error("You have configured your server to remove empty channels, " +
|
||||
"however, the database adaptor you are using has not implemented this behaviour.");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
sendChannelMessage(ctx, chan, [user.id, 'LEAVE', chanName, 'Quit: [ dropUser() ]']);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const getHistory = function (ctx, channelName, handler, cb) {
|
||||
var messageBuf = [];
|
||||
var messageKey;
|
||||
ctx.store.getMessages(channelName, function (msgStr) {
|
||||
var parsed = JSON.parse(msgStr);
|
||||
if (parsed.validateKey) {
|
||||
historyKeeperKeys[channelName] = parsed.validateKey;
|
||||
handler(parsed);
|
||||
return;
|
||||
}
|
||||
messageBuf.push(parsed);
|
||||
}, function (err) {
|
||||
if (err) {
|
||||
console.log("Error getting messages " + err.stack);
|
||||
// TODO: handle this better
|
||||
}
|
||||
var startPoint;
|
||||
var cpCount = 0;
|
||||
var msgBuff2 = [];
|
||||
for (startPoint = messageBuf.length - 1; startPoint >= 0; startPoint--) {
|
||||
var msg = messageBuf[startPoint];
|
||||
msgBuff2.push(msg);
|
||||
if (msg[2] === 'MSG' && msg[4].indexOf('cp|') === 0) {
|
||||
cpCount++;
|
||||
if (cpCount >= 2) {
|
||||
for (var x = msgBuff2.pop(); x; x = msgBuff2.pop()) { handler(x); }
|
||||
break;
|
||||
}
|
||||
}
|
||||
//console.log(messageBuf[startPoint]);
|
||||
}
|
||||
if (cpCount < 2) {
|
||||
// no checkpoints.
|
||||
for (var x = msgBuff2.pop(); x; x = msgBuff2.pop()) { handler(x); }
|
||||
}
|
||||
cb(messageBuf);
|
||||
});
|
||||
};
|
||||
|
||||
const randName = function () { return Crypto.randomBytes(16).toString('hex'); };
|
||||
|
||||
const handleMessage = function (ctx, user, msg) {
|
||||
let json = JSON.parse(msg);
|
||||
let seq = json.shift();
|
||||
let cmd = json[0];
|
||||
let obj = json[1];
|
||||
|
||||
user.timeOfLastMessage = now();
|
||||
user.pingOutstanding = false;
|
||||
|
||||
if (cmd === 'JOIN') {
|
||||
if (obj && obj.length !== 32) {
|
||||
sendMsg(ctx, user, [seq, 'ERROR', 'ENOENT', obj]);
|
||||
return;
|
||||
}
|
||||
let chanName = obj || randName();
|
||||
sendMsg(ctx, user, [seq, 'JACK', chanName]);
|
||||
let chan = ctx.channels[chanName] = ctx.channels[chanName] || [];
|
||||
|
||||
// prevent removal of the channel if there is a pending timeout
|
||||
if (ctx.config.removeChannels && ctx.timeouts[chanName]) {
|
||||
clearTimeout(ctx.timeouts[chanName]);
|
||||
}
|
||||
|
||||
chan.id = chanName;
|
||||
if (USE_HISTORY_KEEPER) {
|
||||
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'JOIN', chanName]);
|
||||
}
|
||||
chan.forEach(function (u) { sendMsg(ctx, user, [0, u.id, 'JOIN', chanName]); });
|
||||
chan.push(user);
|
||||
sendChannelMessage(ctx, chan, [user.id, 'JOIN', chanName]);
|
||||
return;
|
||||
}
|
||||
if (cmd === 'MSG') {
|
||||
if (obj === HISTORY_KEEPER_ID) {
|
||||
let parsed;
|
||||
try { parsed = JSON.parse(json[2]); } catch (err) { console.error(err); return; }
|
||||
if (parsed[0] === 'GET_HISTORY') {
|
||||
sendMsg(ctx, user, [seq, 'ACK']);
|
||||
getHistory(ctx, parsed[1], function (msg) {
|
||||
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify(msg)]);
|
||||
}, function (messages) {
|
||||
// parsed[2] is a validation key if it exists
|
||||
if (messages.length === 0 && parsed[2] && !historyKeeperKeys[parsed[1]]) {
|
||||
var key = {channel: parsed[1], validateKey: parsed[2]};
|
||||
storeMessage(ctx, ctx.channels[parsed[1]], JSON.stringify(key));
|
||||
historyKeeperKeys[parsed[1]] = parsed[2];
|
||||
}
|
||||
let parsedMsg = {state: 1, channel: parsed[1]};
|
||||
sendMsg(ctx, user, [0, HISTORY_KEEPER_ID, 'MSG', user.id, JSON.stringify(parsedMsg)]);
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (obj && !ctx.channels[obj] && !ctx.users[obj]) {
|
||||
sendMsg(ctx, user, [seq, 'ERROR', 'ENOENT', obj]);
|
||||
return;
|
||||
}
|
||||
sendMsg(ctx, user, [seq, 'ACK']);
|
||||
let target;
|
||||
json.unshift(user.id);
|
||||
if ((target = ctx.channels[obj])) {
|
||||
sendChannelMessage(ctx, target, json);
|
||||
return;
|
||||
}
|
||||
if ((target = ctx.users[obj])) {
|
||||
json.unshift(0);
|
||||
sendMsg(ctx, target, json);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (cmd === 'LEAVE') {
|
||||
let err;
|
||||
let chan;
|
||||
let idx;
|
||||
if (!obj) { err = 'EINVAL'; obj = 'undefined';}
|
||||
if (!err && !(chan = ctx.channels[obj])) { err = 'ENOENT'; }
|
||||
if (!err && (idx = chan.indexOf(user)) === -1) { err = 'NOT_IN_CHAN'; }
|
||||
if (err) {
|
||||
sendMsg(ctx, user, [seq, 'ERROR', err, obj]);
|
||||
return;
|
||||
}
|
||||
sendMsg(ctx, user, [seq, 'ACK']);
|
||||
json.unshift(user.id);
|
||||
sendChannelMessage(ctx, chan, [user.id, 'LEAVE', chan.id]);
|
||||
chan.splice(idx, 1);
|
||||
}
|
||||
if (cmd === 'PING') {
|
||||
sendMsg(ctx, user, [seq, 'ACK']);
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
let run = module.exports.run = function (storage, socketServer, config) {
|
||||
/* Channel removal timeout defaults to 60000ms (one minute) */
|
||||
config.channelRemovalTimeout =
|
||||
typeof(config.channelRemovalTimeout) === 'number'?
|
||||
config.channelRemovalTimeout:
|
||||
60000;
|
||||
|
||||
let ctx = {
|
||||
users: {},
|
||||
channels: {},
|
||||
timeouts: {},
|
||||
store: storage,
|
||||
config: config
|
||||
};
|
||||
setInterval(function () {
|
||||
Object.keys(ctx.users).forEach(function (userId) {
|
||||
let u = ctx.users[userId];
|
||||
if (now() - u.timeOfLastMessage > LAG_MAX_BEFORE_DISCONNECT) {
|
||||
dropUser(ctx, u);
|
||||
} else if (!u.pingOutstanding && now() - u.timeOfLastMessage > LAG_MAX_BEFORE_PING) {
|
||||
sendMsg(ctx, u, [0, '', 'PING', now()]);
|
||||
u.pingOutstanding = true;
|
||||
}
|
||||
});
|
||||
}, 5000);
|
||||
socketServer.on('connection', function(socket) {
|
||||
if(socket.upgradeReq.url !== (config.websocketPath || '/cryptpad_websocket')) { return; }
|
||||
let conn = socket.upgradeReq.connection;
|
||||
let user = {
|
||||
addr: conn.remoteAddress + '|' + conn.remotePort,
|
||||
socket: socket,
|
||||
id: randName(),
|
||||
timeOfLastMessage: now(),
|
||||
pingOutstanding: false
|
||||
};
|
||||
ctx.users[user.id] = user;
|
||||
sendMsg(ctx, user, [0, '', 'IDENT', user.id]);
|
||||
socket.on('message', function(message) {
|
||||
if (ctx.config.logToStdout) { console.log('>'+message); }
|
||||
try {
|
||||
handleMessage(ctx, user, message);
|
||||
} catch (e) {
|
||||
console.log(e.stack);
|
||||
dropUser(ctx, user);
|
||||
}
|
||||
});
|
||||
socket.on('close', function (evt) {
|
||||
for (let userId in ctx.users) {
|
||||
if (ctx.users[userId].socket === socket) {
|
||||
dropUser(ctx, ctx.users[userId]);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
}());
|
@ -1,61 +0,0 @@
|
||||
'use strict'
|
||||
let WebSocketServer = require('ws').Server
|
||||
const UNSUPPORTED_DATA = 1007
|
||||
const POLICY_VIOLATION = 1008
|
||||
const CLOSE_UNSUPPORTED = 1003
|
||||
|
||||
var run = module.exports.run = function(server) {
|
||||
server.on('connection', (socket) => {
|
||||
if(socket.upgradeReq.url !== '/cryptpad_webrtc') { return; }
|
||||
socket.on('message', (data) => {
|
||||
try {
|
||||
let msg = JSON.parse(data)
|
||||
console.log(msg)
|
||||
if (msg.hasOwnProperty('key')) {
|
||||
for (let master of server.clients) {
|
||||
if (master.key === msg.key) {
|
||||
socket.close(POLICY_VIOLATION, 'The key already exists')
|
||||
return
|
||||
}
|
||||
}
|
||||
socket.key = msg.key
|
||||
socket.joiningClients = []
|
||||
} else if (msg.hasOwnProperty('id')) {
|
||||
for (let index in socket.joiningClients) {
|
||||
if (index == msg.id) {
|
||||
socket.joiningClients[index].send(JSON.stringify({data: msg.data}))
|
||||
return
|
||||
}
|
||||
}
|
||||
socket.close(POLICY_VIOLATION, 'Unknown id')
|
||||
} else if (msg.hasOwnProperty('join')) {
|
||||
for (let master of server.clients) {
|
||||
if (master.key === msg.join) {
|
||||
socket.master = master
|
||||
master.joiningClients.push(socket)
|
||||
let id = master.joiningClients.length - 1
|
||||
master.send(JSON.stringify({id, data: msg.data}))
|
||||
return
|
||||
}
|
||||
}
|
||||
socket.close(POLICY_VIOLATION, 'Unknown key')
|
||||
} else if (msg.hasOwnProperty('data') && socket.hasOwnProperty('master')) {
|
||||
let id = socket.master.joiningClients.indexOf(socket)
|
||||
socket.master.send(JSON.stringify({id, data: msg.data}))
|
||||
} else {
|
||||
socket.close(UNSUPPORTED_DATA, 'Unsupported message format')
|
||||
}
|
||||
} catch (event) {
|
||||
socket.close(CLOSE_UNSUPPORTED, 'Server accepts only JSON')
|
||||
}
|
||||
})
|
||||
|
||||
socket.on('close', (event) => {
|
||||
if (socket.hasOwnProperty('joiningClients')) {
|
||||
for (let client of socket.joiningClients) {
|
||||
client.close(POLICY_VIOLATION, 'The peer is no longer available')
|
||||
}
|
||||
}
|
||||
});
|
||||
})
|
||||
}
|
@ -0,0 +1,293 @@
|
||||
/*@flow*/
|
||||
/*
|
||||
globals module
|
||||
*/
|
||||
module.exports = {
|
||||
|
||||
// the address you want to bind to, :: means all ipv4 and ipv6 addresses
|
||||
// this may not work on all operating systems
|
||||
httpAddress: '::',
|
||||
|
||||
// the port on which your httpd will listen
|
||||
|
||||
/* CryptPad can be configured to send customized HTTP Headers
|
||||
* These settings may vary widely depending on your needs
|
||||
* Examples are provided below
|
||||
*/
|
||||
|
||||
httpHeaders: {
|
||||
"X-XSS-Protection": "1; mode=block",
|
||||
"X-Content-Type-Options": "nosniff",
|
||||
// 'X-Frame-Options': 'SAMEORIGIN',
|
||||
},
|
||||
|
||||
contentSecurity: [
|
||||
"default-src 'none'",
|
||||
"style-src 'unsafe-inline' 'self'",
|
||||
"script-src 'self'",
|
||||
"font-src 'self' data:",
|
||||
|
||||
/* child-src is used to restrict iframes to a set of allowed domains.
|
||||
* connect-src is used to restrict what domains can connect to the websocket.
|
||||
*
|
||||
* it is recommended that you configure these fields to match the
|
||||
* domain which will serve your CryptPad instance.
|
||||
*/
|
||||
"child-src 'self' blob: *",
|
||||
|
||||
"media-src * blob:",
|
||||
|
||||
/* this allows connections over secure or insecure websockets
|
||||
if you are deploying to production, you'll probably want to remove
|
||||
the ws://* directive, and change '*' to your domain
|
||||
*/
|
||||
"connect-src 'self' ws: wss: blob:",
|
||||
|
||||
// data: is used by codemirror
|
||||
"img-src 'self' data: blob:",
|
||||
|
||||
// for accounts.cryptpad.fr authentication
|
||||
"frame-ancestors 'self' accounts.cryptpad.fr",
|
||||
].join('; '),
|
||||
|
||||
// CKEditor requires significantly more lax content security policy in order to function.
|
||||
padContentSecurity: [
|
||||
"default-src 'none'",
|
||||
"style-src 'unsafe-inline' 'self'",
|
||||
// Unsafe inline, unsafe-eval are needed for ckeditor :(
|
||||
"script-src 'self' 'unsafe-eval' 'unsafe-inline'",
|
||||
"font-src 'self'",
|
||||
|
||||
/* See above under 'contentSecurity' as to how these values should be
|
||||
* configured for best effect.
|
||||
*/
|
||||
"child-src 'self' *",
|
||||
|
||||
// see the comment above in the 'contentSecurity' section
|
||||
"connect-src 'self' ws: wss:",
|
||||
|
||||
// (insecure remote) images are included by users of the wysiwyg who embed photos in their pads
|
||||
"img-src * blob:",
|
||||
].join('; '),
|
||||
|
||||
httpPort: 3000,
|
||||
|
||||
/* your server's websocket url is configurable
|
||||
* (default: '/cryptpad_websocket')
|
||||
*
|
||||
* websocketPath can be relative, of the form '/path/to/websocket'
|
||||
* or absolute, specifying a particular URL
|
||||
*
|
||||
* 'wss://cryptpad.fr:3000/cryptpad_websocket'
|
||||
*/
|
||||
websocketPath: '/cryptpad_websocket',
|
||||
|
||||
/* it is assumed that your websocket will bind to the same port as http
|
||||
* you can override this behaviour by supplying a number via websocketPort
|
||||
*/
|
||||
//websocketPort: 3000,
|
||||
|
||||
/* if you want to run a different version of CryptPad but using the same websocket
|
||||
* server, you should use the other server port as websocketPort and disable
|
||||
* the websockets on that server
|
||||
*/
|
||||
//useExternalWebsocket: false,
|
||||
|
||||
/* If CryptPad is proxied without using https, the server needs to know.
|
||||
* Specify 'useSecureWebsockets: true' so that it can send
|
||||
* Content Security Policy Headers that prevent http and https from mixing
|
||||
*/
|
||||
useSecureWebsockets: false,
|
||||
|
||||
/* CryptPad can log activity to stdout
|
||||
* This may be useful for debugging
|
||||
*/
|
||||
logToStdout: false,
|
||||
|
||||
/* CryptPad supports verbose logging
|
||||
* (false by default)
|
||||
*/
|
||||
verbose: false,
|
||||
|
||||
/* Main pages
|
||||
* add exceptions to the router so that we can access /privacy.html
|
||||
* and other odd pages
|
||||
*/
|
||||
mainPages: [
|
||||
'index',
|
||||
'privacy',
|
||||
'terms',
|
||||
'about',
|
||||
'contact',
|
||||
],
|
||||
|
||||
/* Limits, Donations, Subscriptions and Contact
|
||||
*
|
||||
* By default, CryptPad limits every registered user to 50MB of storage. It also shows a
|
||||
* donate button which allows for making a donation to support CryptPad development.
|
||||
*
|
||||
* You can either:
|
||||
* A: Leave it exactly as it is.
|
||||
* B: Hide the donate button.
|
||||
* C: Change the donate button to a subscribe button, people who subscribe will get more
|
||||
* storage on your instance and you get 50% of the revenue earned.
|
||||
*
|
||||
* CryptPad is developed by people who need to live and who deserve an equivilent life to
|
||||
* what they would get at a company which monitizes user data. However, we intend to have
|
||||
* a mutually positive relationship with every one of our users, including you. If you are
|
||||
* getting value from CryptPad, you should be giving equal value back.
|
||||
*
|
||||
* If you are using CryptPad in a business context, please consider taking a support contract
|
||||
* by contacting sales@cryptpad.fr
|
||||
*
|
||||
* If you choose A then there's nothing to do.
|
||||
*
|
||||
* If you choose B, set this variable to true and it will remove the donate button.
|
||||
*/
|
||||
removeDonateButton: false,
|
||||
/*
|
||||
* If you choose C, set allowSubscriptions to true, then set myDomain to the domain which people
|
||||
* use to reach your CryptPad instance. Then contact sales@cryptpad.fr and tell us your domain.
|
||||
* We will tell you what is needed to get paid.
|
||||
*/
|
||||
allowSubscriptions: false,
|
||||
myDomain: 'i.did.not.read.my.config.myserver.tld',
|
||||
|
||||
/*
|
||||
* If you are using CryptPad internally and you want to increase the per-user storage limit,
|
||||
* change the following value.
|
||||
*
|
||||
* Please note: This limit is what makes people subscribe and what pays for CryptPad
|
||||
* development. Running a public instance that provides a "better deal" than cryptpad.fr
|
||||
* is effectively using the project against itself.
|
||||
*/
|
||||
defaultStorageLimit: 50 * 1024 * 1024,
|
||||
|
||||
/*
|
||||
* By default, CryptPad also contacts our accounts server once a day to check for changes in
|
||||
* the people who have accounts. This check-in will also send the version of your CryptPad
|
||||
* instance and your email so we can reach you if we are aware of a serious problem. We will
|
||||
* never sell it or send you marketing mail. If you want to block this check-in and remain
|
||||
* completely invisible, set this and allowSubscriptions both to false.
|
||||
*/
|
||||
adminEmail: 'i.did.not.read.my.config@cryptpad.fr',
|
||||
|
||||
|
||||
/*
|
||||
You have the option of specifying an alternative storage adaptor.
|
||||
These status of these alternatives are specified in their READMEs,
|
||||
which are available at the following URLs:
|
||||
|
||||
mongodb: a noSQL database
|
||||
https://github.com/xwiki-labs/cryptpad-mongo-store
|
||||
amnesiadb: in memory storage
|
||||
https://github.com/xwiki-labs/cryptpad-amnesia-store
|
||||
leveldb: a simple, fast, key-value store
|
||||
https://github.com/xwiki-labs/cryptpad-level-store
|
||||
sql: an adaptor for a variety of sql databases via knexjs
|
||||
https://github.com/xwiki-labs/cryptpad-sql-store
|
||||
|
||||
For the most up to date solution, use the default storage adaptor.
|
||||
*/
|
||||
storage: './storage/file',
|
||||
|
||||
/*
|
||||
CryptPad stores each document in an individual file on your hard drive.
|
||||
Specify a directory where files should be stored.
|
||||
It will be created automatically if it does not already exist.
|
||||
*/
|
||||
filePath: './datastore/',
|
||||
|
||||
/* CryptPad allows logged in users to request that particular documents be
|
||||
* stored by the server indefinitely. This is called 'pinning'.
|
||||
* Pin requests are stored in a pin-store. The location of this store is
|
||||
* defined here.
|
||||
*/
|
||||
pinPath: './pins',
|
||||
|
||||
/* CryptPad allows logged in users to upload encrypted files. Files/blobs
|
||||
* are stored in a 'blob-store'. Set its location here.
|
||||
*/
|
||||
blobPath: './blob',
|
||||
|
||||
/* CryptPad stores incomplete blobs in a 'staging' area until they are
|
||||
* fully uploaded. Set its location here.
|
||||
*/
|
||||
blobStagingPath: './blobstage',
|
||||
|
||||
/* CryptPad's file storage adaptor closes unused files after a configurale
|
||||
* number of milliseconds (default 30000 (30 seconds))
|
||||
*/
|
||||
channelExpirationMs: 30000,
|
||||
|
||||
/* CryptPad's file storage adaptor is limited by the number of open files.
|
||||
* When the adaptor reaches openFileLimit, it will clean up older files
|
||||
*/
|
||||
openFileLimit: 2048,
|
||||
|
||||
/* CryptPad's socket server can be extended to respond to RPC calls
|
||||
* you can configure it to respond to custom RPC calls if you like.
|
||||
* provide the path to your RPC module here, or `false` if you would
|
||||
* like to disable the RPC interface completely
|
||||
*/
|
||||
rpc: './rpc.js',
|
||||
|
||||
/* RPC errors are shown by default, but if you really don't care,
|
||||
* you can suppress them
|
||||
*/
|
||||
suppressRPCErrors: false,
|
||||
|
||||
|
||||
/* WARNING: EXPERIMENTAL
|
||||
*
|
||||
* CryptPad features experimental support for encrypted file upload.
|
||||
* Our encryption format is still liable to change. As such, we do not
|
||||
* guarantee that files uploaded now will be supported in the future
|
||||
*/
|
||||
|
||||
/* Setting this value to anything other than true will cause file upload
|
||||
* attempts to be rejected outright.
|
||||
*/
|
||||
enableUploads: false,
|
||||
|
||||
/* If you have enabled file upload, you have the option of restricting it
|
||||
* to a list of users identified by their public keys. If this value is set
|
||||
* to true, your server will query a file (cryptpad/privileged.conf) when
|
||||
* users connect via RPC. Only users whose public keys can be found within
|
||||
* the file will be allowed to upload.
|
||||
*
|
||||
* privileged.conf uses '#' for line comments, and splits keys by newline.
|
||||
* This is a temporary measure until a better quota system is in place.
|
||||
* registered users' public keys can be found on the settings page.
|
||||
*/
|
||||
//restrictUploads: false,
|
||||
|
||||
/* Max Upload Size (bytes)
|
||||
* this sets the maximum size of any one file uploaded to the server.
|
||||
* anything larger than this size will be rejected
|
||||
*/
|
||||
maxUploadSize: 20 * 1024 * 1024,
|
||||
|
||||
/* clients can use the /settings/ app to opt out of usage feedback
|
||||
* which informs the server of things like how much each app is being
|
||||
* used, and whether certain clientside features are supported by
|
||||
* the client's browser. The intent is to provide feedback to the admin
|
||||
* such that the service can be improved. Enable this with `true`
|
||||
* and ignore feedback with `false` or by commenting the attribute
|
||||
*/
|
||||
//logFeedback: true,
|
||||
|
||||
/* If you wish to see which remote procedure calls clients request,
|
||||
* set this to true
|
||||
*/
|
||||
//logRPC: true,
|
||||
|
||||
/* it is recommended that you serve CryptPad over https
|
||||
* the filepaths below are used to configure your certificates
|
||||
*/
|
||||
//privKeyAndCertFiles: [
|
||||
// '/etc/apache2/ssl/my_secret.key',
|
||||
// '/etc/apache2/ssl/my_public_cert.crt',
|
||||
// '/etc/apache2/ssl/my_certificate_authorities_cert_chain.ca'
|
||||
//],
|
||||
};
|
@ -1,113 +0,0 @@
|
||||
/*
|
||||
globals module
|
||||
*/
|
||||
module.exports = {
|
||||
|
||||
// the address you want to bind to, :: means all ipv4 and ipv6 addresses
|
||||
// this may not work on all operating systems
|
||||
httpAddress: '::',
|
||||
|
||||
// the port on which your httpd will listen
|
||||
|
||||
/* Cryptpad can be configured to send customized HTTP Headers
|
||||
* These settings may vary widely depending on your needs
|
||||
* Examples are provided below
|
||||
*/
|
||||
|
||||
/*
|
||||
httpHeaders: {
|
||||
"Content-Security-Policy": [
|
||||
"default-serc 'none'",
|
||||
"style-src 'unsafe-inline' 'self'",
|
||||
"script-src 'self' 'unsafe-eval' 'unsafe-inline'",
|
||||
"child-src 'self' cryptpad.fr *.cryptpad.fr",
|
||||
"font-src 'self'",
|
||||
"connect-src 'self' wss://cryptpad.fr",
|
||||
// data: is used by codemirror, (insecure remote) images are included by
|
||||
// users of the wysiwyg who embed photos in their pads
|
||||
"img-src data: *",
|
||||
].join('; '),
|
||||
|
||||
"X-XSS-Protection": "1; mode=block",
|
||||
"X-Content-Type-Options": "nosniff",
|
||||
// 'X-Frame-Options': 'SAMEORIGIN',
|
||||
},*/
|
||||
|
||||
httpPort: 3000,
|
||||
|
||||
/* your server's websocket url is configurable
|
||||
* (default: '/cryptpad_websocket')
|
||||
*
|
||||
* websocketPath can be relative, of the form '/path/to/websocket'
|
||||
* or absolute, specifying a particular URL
|
||||
*
|
||||
* 'wss://cryptpad.fr:3000/cryptpad_websocket'
|
||||
*/
|
||||
websocketPath: '/cryptpad_websocket',
|
||||
|
||||
/* it is assumed that your websocket will bind to the same port as http
|
||||
* you can override this behaviour by supplying a number via websocketPort
|
||||
*/
|
||||
//websocketPort: 3000,
|
||||
|
||||
/* If Cryptpad is proxied without using https, the server needs to know.
|
||||
* Specify 'useSecureWebsockets: true' so that it can send
|
||||
* Content Security Policy Headers that prevent http and https from mixing
|
||||
*/
|
||||
useSecureWebsockets: false,
|
||||
|
||||
/* Cryptpad can log activity to stdout
|
||||
* This may be useful for debugging
|
||||
*/
|
||||
logToStdout: false,
|
||||
|
||||
/* Cryptpad supports verbose logging
|
||||
* (false by default)
|
||||
*/
|
||||
verbose: false,
|
||||
|
||||
|
||||
/*
|
||||
You have the option of specifying an alternative storage adaptor.
|
||||
These status of these alternatives are specified in their READMEs,
|
||||
which are available at the following URLs:
|
||||
|
||||
mongodb: a noSQL database
|
||||
https://github.com/xwiki-labs/cryptpad-mongo-store
|
||||
amnesiadb: in memory storage
|
||||
https://github.com/xwiki-labs/cryptpad-amnesia-store
|
||||
leveldb: a simple, fast, key-value store
|
||||
https://github.com/xwiki-labs/cryptpad-level-store
|
||||
sql: an adaptor for a variety of sql databases via knexjs
|
||||
https://github.com/xwiki-labs/cryptpad-sql-store
|
||||
|
||||
For the most up to date solution, use the default storage adaptor.
|
||||
*/
|
||||
storage: './storage/file',
|
||||
|
||||
/*
|
||||
Cryptpad stores each document in an individual file on your hard drive.
|
||||
Specify a directory where files should be stored.
|
||||
It will be created automatically if it does not already exist.
|
||||
*/
|
||||
filePath: './datastore/',
|
||||
|
||||
/* Cryptpad's file storage adaptor closes unused files after a configurale
|
||||
* number of milliseconds (default 30000 (30 seconds))
|
||||
*/
|
||||
channelExpirationMs: 30000,
|
||||
|
||||
/* Cryptpad's file storage adaptor is limited by the number of open files.
|
||||
* When the adaptor reaches openFileLimit, it will clean up older files
|
||||
*/
|
||||
openFileLimit: 2048,
|
||||
|
||||
/* it is recommended that you serve cryptpad over https
|
||||
* the filepaths below are used to configure your certificates
|
||||
*/
|
||||
//privKeyAndCertFiles: [
|
||||
// '/etc/apache2/ssl/my_secret.key',
|
||||
// '/etc/apache2/ssl/my_public_cert.crt',
|
||||
// '/etc/apache2/ssl/my_certificate_authorities_cert_chain.ca'
|
||||
//],
|
||||
};
|
@ -0,0 +1,23 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Creating customize folder
|
||||
mkdir -p customize
|
||||
[ -z "$(ls -A customize)" ] && echo "Creating customize folder" \
|
||||
&& cp -R customize.dist/* customize/ \
|
||||
&& cp config.example.js customize/config.js
|
||||
|
||||
# Linking config.js
|
||||
[ ! -h config.js ] && echo "Linking config.js" && ln -s customize/config.js config.js
|
||||
|
||||
# Configure
|
||||
[ -n "$USE_SSL" ] && echo "Using secure websockets: $USE_SSL" \
|
||||
&& sed -i "s/useSecureWebsockets: .*/useSecureWebsockets: ${USE_SSL},/g" customize/config.js
|
||||
|
||||
[ -n "$STORAGE" ] && echo "Using storage adapter: $STORAGE" \
|
||||
&& sed -i "s/storage: .*/storage: ${STORAGE},/g" customize/config.js
|
||||
|
||||
[ -n "$LOG_TO_STDOUT" ] && echo "Logging to stdout: $LOG_TO_STDOUT" \
|
||||
&& sed -i "s/logToStdout: .*/logToStdout: ${LOG_TO_STDOUT},/g" customize/config.js
|
||||
|
||||
|
||||
exec node ./server.js
|
@ -1,16 +0,0 @@
|
||||
<!-- This is an HTML fragment which is included into the bottom toolbar -->
|
||||
<div>
|
||||
<div class="bottom-bar">
|
||||
<div class="bottom-bar-left">
|
||||
<span class="bottom-bar-language">
|
||||
<select id="language-selector"></select>
|
||||
</span>
|
||||
<p data-localization="bottom_france">
|
||||
</p>
|
||||
</div>
|
||||
<div class="bottom-bar-right">
|
||||
<p data-localization="bottom_support">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -1,40 +0,0 @@
|
||||
/*
|
||||
globals define
|
||||
*/
|
||||
define([
|
||||
'/customize/languageSelector.js',
|
||||
'/customize/messages.js',
|
||||
'/bower_components/jquery/dist/jquery.min.js'
|
||||
], function (LS, Messages) {
|
||||
var $ = window.jQuery;
|
||||
var main = function () {
|
||||
var url = window.location.pathname;
|
||||
var isHtml = /\.html/.test(url) || url === '/' || url === '';
|
||||
var isPoll = /\/poll\//.test(url);
|
||||
if (!isHtml && !isPoll) {
|
||||
Messages._applyTranslation();
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
url: isHtml ? '/customize/BottomBar.html' : '/customize/Header.html',
|
||||
success: function (ret) {
|
||||
var $bar = $(ret);
|
||||
$('body').append($bar);
|
||||
|
||||
var $sel = $bar.find('#language-selector');
|
||||
|
||||
Object.keys(Messages._languages).forEach(function (code) {
|
||||
$sel.append($('<option>', {
|
||||
value: code,
|
||||
}).text(Messages._languages[code]));
|
||||
});
|
||||
|
||||
LS.main();
|
||||
Messages._applyTranslation();
|
||||
}
|
||||
});
|
||||
};
|
||||
return {
|
||||
main: main
|
||||
};
|
||||
});
|
@ -1,22 +0,0 @@
|
||||
<!-- This is an HTML fragment which is included into the bottom toolbar -->
|
||||
<div>
|
||||
<div class="top-bar">
|
||||
<div class="bottom-bar-left">
|
||||
<span class="bottom-bar-language">
|
||||
<select id="language-selector"></select>
|
||||
</span>
|
||||
<p data-localization="header_france" class="big">
|
||||
</p>
|
||||
</div>
|
||||
<div class="bottom-bar-center">
|
||||
<p><a id="cryptpad-logo" class="big" href="/" data-localization-title="header_logoTitle">CryptPad</a></p>
|
||||
<p><a id="cryptpad-logo" class="small" href="/" data-localization-title="header_logoTitle"><img src="/customize/cryptofist_mini.png" alt="Cryptpad" class="cryptofist" /></a></p>
|
||||
</div>
|
||||
<div class="bottom-bar-right">
|
||||
<p class="small">
|
||||
<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer"><img src="/customize/logo-xwiki.png" alt="XWiki SAS" class="bottom-bar-xwiki"/></a>
|
||||
<p data-localization="header_support" class="big">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="cp">
|
||||
<!-- If this file is not called customize.dist/src/template.html, it is generated -->
|
||||
<head>
|
||||
<title data-localization="main_title">CryptPad: Zero Knowledge, Collaborative Real Time Editing</title>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/main-favicon.png" id="favicon"/>
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.1.15"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
<noscript>
|
||||
<p><strong>OOPS</strong> In order to do encryption in your browser, Javascript is really <strong>really</strong> required.</p>
|
||||
<p><strong>OUPS</strong> Afin de pouvoir réaliser le chiffrement dans votre navigateur, Javascript est <strong>vraiment</strong> nécessaire.</p>
|
||||
</noscript>
|
||||
</html>
|
@ -1,201 +0,0 @@
|
||||
.alertify-logs > * {
|
||||
padding: 12px 48px;
|
||||
color: #fafafa;
|
||||
font-weight: bold;
|
||||
font-size: large;
|
||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2);
|
||||
border-radius: 1px;
|
||||
}
|
||||
.alertify-logs > *,
|
||||
.alertify-logs > *.default {
|
||||
background: rgba(0, 0, 0, 0.8);
|
||||
}
|
||||
.alertify-logs > *.error {
|
||||
background: #FF0073;
|
||||
}
|
||||
.alertify-logs > *.success {
|
||||
background: #46E981;
|
||||
color: #302B28;
|
||||
}
|
||||
.alertify {
|
||||
position: fixed;
|
||||
background-color: rgba(0, 0, 0, 0.3);
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 99999;
|
||||
}
|
||||
.alertify.hide {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
.alertify,
|
||||
.alertify.show {
|
||||
box-sizing: border-box;
|
||||
transition: all 0.33s cubic-bezier(0.25, 0.8, 0.25, 1);
|
||||
}
|
||||
.alertify,
|
||||
.alertify * {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.alertify .dialog {
|
||||
padding: 12px;
|
||||
}
|
||||
.alertify .dialog,
|
||||
.alertify .alert {
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
.alertify .dialog > div,
|
||||
.alertify .alert > div {
|
||||
background-color: #685d56;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.alertify .dialog > *,
|
||||
.alertify .alert > * {
|
||||
width: 400px;
|
||||
max-width: 95%;
|
||||
margin: 0 auto;
|
||||
text-align: center;
|
||||
padding: 12px;
|
||||
background: #fff;
|
||||
box-shadow: 0 2px 4px -1px rgba(0, 0, 0, 0.14), 0 4px 5px 0 rgba(0, 0, 0, 0.098), 0 1px 10px 0 rgba(0, 0, 0, 0.084);
|
||||
}
|
||||
.alertify .dialog .msg,
|
||||
.alertify .alert .msg {
|
||||
padding: 12px;
|
||||
margin-bottom: 12px;
|
||||
margin: 0;
|
||||
text-align: left;
|
||||
}
|
||||
.alertify .dialog input:not(.form-control),
|
||||
.alertify .alert input:not(.form-control) {
|
||||
background-color: #302B28;
|
||||
color: #fafafa;
|
||||
border: 0px;
|
||||
border-radius: 5px;
|
||||
margin-bottom: 15px;
|
||||
width: 100%;
|
||||
font-size: 100%;
|
||||
padding: 12px;
|
||||
}
|
||||
.alertify .dialog nav,
|
||||
.alertify .alert nav {
|
||||
text-align: right;
|
||||
}
|
||||
.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button),
|
||||
.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button) {
|
||||
background-color: transparent;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
outline: 0;
|
||||
border: 0;
|
||||
display: inline-block;
|
||||
align-items: center;
|
||||
padding: 0 6px;
|
||||
margin: 6px 8px;
|
||||
line-height: 36px;
|
||||
min-height: 36px;
|
||||
white-space: nowrap;
|
||||
min-width: 88px;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
font-size: 14px;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
color: #fafafa;
|
||||
border: 1px solid #302B28;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):hover,
|
||||
.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):hover,
|
||||
.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):active,
|
||||
.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):active {
|
||||
background-color: rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):focus,
|
||||
.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button):focus {
|
||||
border: 1px dotted #302B28;
|
||||
}
|
||||
.alertify .dialog nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button)::-moz-focus-inner,
|
||||
.alertify .alert nav button:not(.btn):not(.pure-button):not(.md-button):not(.mdl-button)::-moz-focus-inner {
|
||||
border: 0;
|
||||
}
|
||||
.alertify .dialog nav button.btn,
|
||||
.alertify .alert nav button.btn {
|
||||
margin: 6px 4px;
|
||||
}
|
||||
.alertify-logs {
|
||||
position: fixed;
|
||||
z-index: 99999;
|
||||
}
|
||||
.alertify-logs.bottom,
|
||||
.alertify-logs:not(.top) {
|
||||
bottom: 16px;
|
||||
}
|
||||
.alertify-logs.left,
|
||||
.alertify-logs:not(.right) {
|
||||
left: 16px;
|
||||
}
|
||||
.alertify-logs.left > *,
|
||||
.alertify-logs:not(.right) > * {
|
||||
float: left;
|
||||
transform: translate3d(0, 0, 0);
|
||||
height: auto;
|
||||
}
|
||||
.alertify-logs.left > *.show,
|
||||
.alertify-logs:not(.right) > *.show {
|
||||
left: 0;
|
||||
}
|
||||
.alertify-logs.left > *,
|
||||
.alertify-logs:not(.right) > *,
|
||||
.alertify-logs.left > *.hide,
|
||||
.alertify-logs:not(.right) > *.hide {
|
||||
left: -110%;
|
||||
}
|
||||
.alertify-logs.right {
|
||||
right: 16px;
|
||||
}
|
||||
.alertify-logs.right > * {
|
||||
float: right;
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
.alertify-logs.right > *.show {
|
||||
right: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
.alertify-logs.right > *,
|
||||
.alertify-logs.right > *.hide {
|
||||
right: -110%;
|
||||
opacity: 0;
|
||||
}
|
||||
.alertify-logs.top {
|
||||
top: 0;
|
||||
}
|
||||
.alertify-logs > * {
|
||||
box-sizing: border-box;
|
||||
transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
|
||||
position: relative;
|
||||
clear: both;
|
||||
backface-visibility: hidden;
|
||||
perspective: 1000;
|
||||
max-height: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
.alertify-logs > *.show {
|
||||
margin-top: 12px;
|
||||
opacity: 1;
|
||||
max-height: 1000px;
|
||||
padding: 12px;
|
||||
pointer-events: auto;
|
||||
}
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 121 KiB |
@ -0,0 +1,57 @@
|
||||
/* global CKEDITOR */
|
||||
CKEDITOR.editorConfig = function( config ) {
|
||||
var fixThings = false;
|
||||
// https://dev.ckeditor.com/ticket/10907
|
||||
config.needsBrFiller= fixThings;
|
||||
config.needsNbspFiller= fixThings;
|
||||
|
||||
config.removeButtons= 'Source,Maximize';
|
||||
// magicline plugin inserts html crap into the document which is not part of the
|
||||
// document itself and causes problems when it's sent across the wire and reflected back
|
||||
config.removePlugins= 'resize,elementspath';
|
||||
config.resize_enabled= false; //bottom-bar
|
||||
config.extraPlugins= 'autolink,colorbutton,colordialog,font,indentblock,justify';
|
||||
config.toolbarGroups= [
|
||||
// {"name":"clipboard","groups":["clipboard","undo"]},
|
||||
//{"name":"editing","groups":["find","selection"]},
|
||||
{"name":"links"},
|
||||
{"name":"insert"},
|
||||
{"name":"forms"},
|
||||
{"name":"tools"},
|
||||
{"name":"document","groups":["mode","document","doctools"]},
|
||||
{"name":"others"},
|
||||
{"name":"basicstyles","groups":["basicstyles","cleanup"]},
|
||||
{"name":"paragraph","groups":["list","indent","blocks","align","bidi"]},
|
||||
{"name":"styles"},
|
||||
{"name":"colors"}];
|
||||
|
||||
config.font_defaultLabel = 'Arial';
|
||||
config.fontSize_defaultLabel = '16';
|
||||
config.contentsCss = '/customize/ckeditor-contents.css';
|
||||
|
||||
config.keystrokes = [
|
||||
[ CKEDITOR.ALT + 121 /*F10*/, 'toolbarFocus' ],
|
||||
[ CKEDITOR.ALT + 122 /*F11*/, 'elementsPathFocus' ],
|
||||
|
||||
[ CKEDITOR.SHIFT + 121 /*F10*/, 'contextMenu' ],
|
||||
|
||||
[ CKEDITOR.CTRL + 90 /*Z*/, 'undo' ],
|
||||
[ CKEDITOR.CTRL + 89 /*Y*/, 'redo' ],
|
||||
[ CKEDITOR.CTRL + CKEDITOR.SHIFT + 90 /*Z*/, 'redo' ],
|
||||
|
||||
[ CKEDITOR.CTRL + CKEDITOR.SHIFT + 76 /*L*/, 'link' ],
|
||||
[ CKEDITOR.CTRL + 76 /*L*/, undefined ],
|
||||
|
||||
[ CKEDITOR.CTRL + 66 /*B*/, 'bold' ],
|
||||
[ CKEDITOR.CTRL + 73 /*I*/, 'italic' ],
|
||||
[ CKEDITOR.CTRL + 85 /*U*/, 'underline' ],
|
||||
|
||||
[ CKEDITOR.ALT + 109 /*-*/, 'toolbarCollapse' ]
|
||||
];
|
||||
|
||||
//skin: 'moono-cryptpad,/pad/themes/moono-cryptpad/'
|
||||
//skin: 'flat,/pad/themes/flat/'
|
||||
//config.skin= 'moono-lisa,/pad/themes/moono-lisa/'
|
||||
//skin: 'moono-dark,/pad/themes/moono-dark/'
|
||||
//skin: 'office2013,/pad/themes/office2013/'
|
||||
};
|
@ -0,0 +1,135 @@
|
||||
/*
|
||||
Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
|
||||
For licensing, see LICENSE.md or http://ckeditor.com/license
|
||||
*/
|
||||
|
||||
body
|
||||
{
|
||||
/* Font */
|
||||
font-family: sans-serif, Arial, Verdana, "Trebuchet MS";
|
||||
font-size: 13px;
|
||||
|
||||
/* Text color */
|
||||
color: #333;
|
||||
|
||||
/* Remove the background color to make it transparent */
|
||||
background-color: #fff;
|
||||
|
||||
margin: 20px;
|
||||
}
|
||||
|
||||
.cke_editable
|
||||
{
|
||||
font-size: 16px;
|
||||
line-height: 1.6;
|
||||
|
||||
/* Fix for missing scrollbars with RTL texts. (#10488) */
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
blockquote
|
||||
{
|
||||
font-style: italic;
|
||||
font-family: Georgia, Times, "Times New Roman", serif;
|
||||
padding: 2px 0;
|
||||
border-style: solid;
|
||||
border-color: #ccc;
|
||||
border-width: 0;
|
||||
}
|
||||
|
||||
.cke_contents_ltr blockquote
|
||||
{
|
||||
padding-left: 20px;
|
||||
padding-right: 8px;
|
||||
border-left-width: 5px;
|
||||
}
|
||||
|
||||
.cke_contents_rtl blockquote
|
||||
{
|
||||
padding-left: 8px;
|
||||
padding-right: 20px;
|
||||
border-right-width: 5px;
|
||||
}
|
||||
|
||||
a
|
||||
{
|
||||
color: #0782C1;
|
||||
}
|
||||
|
||||
ol,ul,dl
|
||||
{
|
||||
/* IE7: reset rtl list margin. (#7334) */
|
||||
*margin-right: 0px;
|
||||
/* preserved spaces for list items with text direction other than the list. (#6249,#8049)*/
|
||||
padding: 0 40px;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6
|
||||
{
|
||||
font-weight: normal;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
hr
|
||||
{
|
||||
border: 0px;
|
||||
border-top: 1px solid #ccc;
|
||||
}
|
||||
|
||||
img.right
|
||||
{
|
||||
border: 1px solid #ccc;
|
||||
float: right;
|
||||
margin-left: 15px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
img.left
|
||||
{
|
||||
border: 1px solid #ccc;
|
||||
float: left;
|
||||
margin-right: 15px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
pre
|
||||
{
|
||||
white-space: pre-wrap; /* CSS 2.1 */
|
||||
word-wrap: break-word; /* IE7 */
|
||||
-moz-tab-size: 4;
|
||||
tab-size: 4;
|
||||
}
|
||||
|
||||
.marker
|
||||
{
|
||||
background-color: Yellow;
|
||||
}
|
||||
|
||||
span[lang]
|
||||
{
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
figure
|
||||
{
|
||||
text-align: center;
|
||||
border: solid 1px #ccc;
|
||||
border-radius: 2px;
|
||||
background: rgba(0,0,0,0.05);
|
||||
padding: 10px;
|
||||
margin: 10px 20px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
figure > figcaption
|
||||
{
|
||||
text-align: center;
|
||||
display: block; /* For IE8 */
|
||||
}
|
||||
|
||||
a > img {
|
||||
padding: 1px;
|
||||
margin: 1px;
|
||||
border: none;
|
||||
outline: 1px solid #0782C1;
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html class="cp">
|
||||
<!-- If this file is not called customize.dist/src/template.html, it is generated -->
|
||||
<head>
|
||||
<title data-localization="main_title">CryptPad: Zero Knowledge, Collaborative Real Time Editing</title>
|
||||
<meta content="text/html; charset=utf-8" http-equiv="content-type"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="icon" type="image/png" href="/customize/main-favicon.png" id="favicon"/>
|
||||
<script async data-bootload="/customize/template.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.1.15"></script>
|
||||
</head>
|
||||
<body class="html">
|
||||
<noscript>
|
||||
<p><strong>OOPS</strong> In order to do encryption in your browser, Javascript is really <strong>really</strong> required.</p>
|
||||
<p><strong>OUPS</strong> Afin de pouvoir réaliser le chiffrement dans votre navigateur, Javascript est <strong>vraiment</strong> nécessaire.</p>
|
||||
</noscript>
|
||||
</html>
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 36 KiB |
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 545 B |
@ -0,0 +1,54 @@
|
||||
define([
|
||||
'jquery',
|
||||
'/customize/application_config.js',
|
||||
'/common/cryptpad-common.js',
|
||||
'/api/config',
|
||||
], function ($, Config, Cryptpad, ApiConfig) {
|
||||
|
||||
window.APP = {
|
||||
Cryptpad: Cryptpad,
|
||||
};
|
||||
|
||||
var Messages = Cryptpad.Messages;
|
||||
|
||||
$(function () {
|
||||
// Language selector
|
||||
var $sel = $('#language-selector');
|
||||
Cryptpad.createLanguageSelector(undefined, $sel);
|
||||
$sel.find('button').addClass('btn').addClass('btn-secondary');
|
||||
$sel.show();
|
||||
|
||||
var $upgrade = $('#upgrade');
|
||||
|
||||
var showUpgrade = function (text, feedback, url) {
|
||||
if (ApiConfig.removeDonateButton) { return; }
|
||||
if (localStorage.plan) { return; }
|
||||
if (!text) { return; }
|
||||
$upgrade.text(text).show();
|
||||
$upgrade.click(function () {
|
||||
Cryptpad.feedback(feedback);
|
||||
window.open(url,'_blank');
|
||||
});
|
||||
};
|
||||
|
||||
// User admin menu
|
||||
var $userMenu = $('#user-menu');
|
||||
var userMenuCfg = {
|
||||
$initBlock: $userMenu,
|
||||
'static': true
|
||||
};
|
||||
var $userAdmin = Cryptpad.createUserAdminMenu(userMenuCfg);
|
||||
$userAdmin.find('button').addClass('btn').addClass('btn-secondary');
|
||||
|
||||
$(window).click(function () {
|
||||
$('.cryptpad-dropdown').hide();
|
||||
});
|
||||
|
||||
if (Cryptpad.isLoggedIn() && ApiConfig.allowSubscriptions) {
|
||||
showUpgrade(Messages.upgradeAccount, "HOME_UPGRADE_ACCOUNT", Cryptpad.upgradeURL);
|
||||
} else {
|
||||
showUpgrade(Messages.supportCryptpad, "HOME_SUPPORT_CRYPTPAD", Cryptpad.donateURL);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
Before Width: | Height: | Size: 749 B |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 10 KiB |
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 13"><defs><style>.cls-1{fill:#444;}</style></defs><title>Asset 2</title><g id="Layer_2" data-name="Layer 2"><g id="_490_Icons" data-name="490 Icons"><path class="cls-1" d="M7,0,9,2h7V13H0V0Z"/></g></g></svg>
|
After Width: | Height: | Size: 263 B |
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 15.44 13"><defs><style>.cls-1{fill:#444;}</style></defs><title>Asset 1</title><g id="Layer_2" data-name="Layer 2"><g id="_490_Icons" data-name="490 Icons"><path class="cls-1" d="M13,13l2.44-6.5h-13L0,13ZM2,4,0,13V0H4.5l2,2H13V4Z"/></g></g></svg>
|
After Width: | Height: | Size: 298 B |
@ -0,0 +1,4 @@
|
||||
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/>
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
</svg>
|
After Width: | Height: | Size: 255 B |
@ -0,0 +1,4 @@
|
||||
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M0 0h24v24H0z" fill="none"/>
|
||||
<path d="M20 6h-8l-2-2H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2zm0 12H4V8h16v10z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 271 B |
After Width: | Height: | Size: 9.1 KiB |
After Width: | Height: | Size: 85 KiB |
After Width: | Height: | Size: 35 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 80 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 5.4 KiB |
@ -1,49 +0,0 @@
|
||||
define(['/bower_components/jquery/dist/jquery.min.js'], function() {
|
||||
var $ = window.jQuery;
|
||||
var out = {};
|
||||
|
||||
var LS_LANG = "CRYPTPAD_LANG";
|
||||
|
||||
var getStoredLanguage = function () {
|
||||
return localStorage.getItem(LS_LANG);
|
||||
};
|
||||
|
||||
var storeLanguage = function (l) {
|
||||
localStorage.setItem(LS_LANG, l);
|
||||
};
|
||||
|
||||
var getBrowserLanguage = function () {
|
||||
return navigator.language || navigator.userLanguage;
|
||||
};
|
||||
|
||||
var getLanguage = out.getLanguage = function () {
|
||||
return getStoredLanguage() || getBrowserLanguage();
|
||||
};
|
||||
|
||||
var main = out.main = function ($select) {
|
||||
var selector = $select || $('#language-selector');
|
||||
if (!selector.length) { return; }
|
||||
|
||||
// Select the current language in the list
|
||||
var language = getLanguage();
|
||||
var option = $(selector).find('option[value="' + language + '"]');
|
||||
if ($(option).length) {
|
||||
$(selector).val(language);
|
||||
}
|
||||
else {
|
||||
$(selector).val('en');
|
||||
}
|
||||
|
||||
// Listen for language change
|
||||
$(selector).on('change', function () {
|
||||
var newLanguage = $(selector).val();
|
||||
storeLanguage(newLanguage);
|
||||
if (newLanguage !== language) {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
return out;
|
||||
});
|
Before Width: | Height: | Size: 780 B |
Before Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 2.8 KiB |
@ -1,561 +0,0 @@
|
||||
a.github-corner > svg {
|
||||
fill: #46E981;
|
||||
color: #302B28;
|
||||
}
|
||||
.table-refresh > svg {
|
||||
width: .9em;
|
||||
height: .9em;
|
||||
fill: #46E981;
|
||||
-webkit-transform: translate(0, 15%);
|
||||
-moz-transform: translate(0, 15%);
|
||||
-o-transform: translate(0, 15%);
|
||||
-ms-transform: translate(0, 15%);
|
||||
transform: translate(0, 15%);
|
||||
}
|
||||
.lato {
|
||||
font-family: lato, Helvetica, sans-serif;
|
||||
font-size: 1.02em;
|
||||
}
|
||||
html {
|
||||
font-size: .875em;
|
||||
background-color: #302B28;
|
||||
color: #fafafa;
|
||||
}
|
||||
html,
|
||||
body {
|
||||
font-family: Georgia,Cambria,serif;
|
||||
height: 100%;
|
||||
}
|
||||
body {
|
||||
font-size: 1rem;
|
||||
font-weight: 400;
|
||||
line-height: 2rem;
|
||||
}
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
color: #fafafa;
|
||||
font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
-webkit-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1;
|
||||
-moz-font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1;
|
||||
font-feature-settings: 'dlig' 1, 'liga' 1, 'lnum' 1, 'kern' 1;
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
margin-top: 0;
|
||||
}
|
||||
h1 {
|
||||
line-height: 3rem;
|
||||
font-size: 2.05714rem;
|
||||
margin-bottom: .21999rem;
|
||||
padding-top: .78001rem;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.95312rem;
|
||||
margin-bottom: .18358rem;
|
||||
padding-top: .81642rem;
|
||||
}
|
||||
h2,
|
||||
h3 {
|
||||
line-height: 3rem;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.64571rem;
|
||||
margin-bottom: .07599rem;
|
||||
padding-top: .92401rem;
|
||||
}
|
||||
h4 {
|
||||
font-size: 1.5625rem;
|
||||
margin-bottom: .54686rem;
|
||||
padding-top: .45314rem;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
margin-bottom: -0.56251rem;
|
||||
padding-top: .56251rem;
|
||||
}
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: -0.65001rem;
|
||||
padding-top: .65001rem;
|
||||
}
|
||||
a {
|
||||
cursor: pointer;
|
||||
color: #46E981;
|
||||
text-decoration: none;
|
||||
}
|
||||
a:hover {
|
||||
color: #a1f4bf;
|
||||
}
|
||||
img {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
img.cryptofist {
|
||||
filter: invert(100%);
|
||||
-webkit-filter: invert(100%);
|
||||
}
|
||||
p {
|
||||
padding-top: .66001rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
p,
|
||||
pre {
|
||||
margin-bottom: 1.33999rem;
|
||||
}
|
||||
p,
|
||||
pre,
|
||||
td,
|
||||
a,
|
||||
table,
|
||||
tr {
|
||||
font-family: lato, Helvetica, sans-serif;
|
||||
font-size: 1.02em;
|
||||
}
|
||||
#main {
|
||||
width: 70vw;
|
||||
margin: auto;
|
||||
font-size: medium;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
/* buttons */
|
||||
.create,
|
||||
.action {
|
||||
border: 2px solid #46E981;
|
||||
border-radius: 10px;
|
||||
background-color: #302B28;
|
||||
color: #46E981;
|
||||
font-weight: bold;
|
||||
font-size: large;
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
.create:hover,
|
||||
.action:hover {
|
||||
border: 2px solid #a1f4bf;
|
||||
color: #46E981;
|
||||
}
|
||||
.create {
|
||||
display: none;
|
||||
}
|
||||
.action {
|
||||
display: inline-block;
|
||||
}
|
||||
.buttons {
|
||||
margin-bottom: 50px;
|
||||
margin-top: 20px;
|
||||
line-height: 2.5em;
|
||||
}
|
||||
.button {
|
||||
padding: 4px 12px 4px 12px;
|
||||
border-radius: 5px;
|
||||
margin-top: 12px;
|
||||
margin-bottom: 12px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.alertify button {
|
||||
margin: 3px 0px;
|
||||
}
|
||||
/* Tables */
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
margin: 20px;
|
||||
}
|
||||
tbody {
|
||||
border: 2px solid black;
|
||||
}
|
||||
tbody tr {
|
||||
text-align: center;
|
||||
}
|
||||
tbody tr:first-of-type th {
|
||||
font-size: 20px;
|
||||
border-top: 0px;
|
||||
font-weight: bold;
|
||||
padding: 10px;
|
||||
text-decoration: underline;
|
||||
}
|
||||
tbody tr:first-of-type th.table-refresh {
|
||||
color: #46E981;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
tbody tr:nth-child(odd) {
|
||||
background-color: #685d56;
|
||||
}
|
||||
tbody tr th:first-of-type {
|
||||
border-left: 0px;
|
||||
}
|
||||
tbody tr th {
|
||||
box-sizing: border-box;
|
||||
border: 1px solid black;
|
||||
}
|
||||
tbody tr th,
|
||||
tbody tr td {
|
||||
color: #fafafa;
|
||||
}
|
||||
tbody tr th.remove,
|
||||
tbody tr td.remove {
|
||||
cursor: pointer;
|
||||
}
|
||||
tbody tr th:last-child {
|
||||
border-right: 0px;
|
||||
}
|
||||
tbody td {
|
||||
border-right: 1px solid black;
|
||||
padding: 12px;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
tbody td:last-child {
|
||||
border-right: none;
|
||||
}
|
||||
/* Bottom Bar */
|
||||
.top-bar,
|
||||
.bottom-bar {
|
||||
position: fixed;
|
||||
height: 4%;
|
||||
height: 2.5em;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
background: #302B28;
|
||||
border-top: 1px solid #444;
|
||||
}
|
||||
.top-bar a,
|
||||
.bottom-bar a {
|
||||
color: #46E981;
|
||||
text-decoration: none;
|
||||
}
|
||||
.top-bar p,
|
||||
.bottom-bar p {
|
||||
margin: -1px;
|
||||
font-family: Arial, Helvetica, Tahoma, Verdana, sans-serif;
|
||||
font-size: 20px;
|
||||
display: block;
|
||||
margin-left: 10px;
|
||||
padding-top: 3px;
|
||||
color: #fafafa;
|
||||
}
|
||||
.top-bar img,
|
||||
.bottom-bar img {
|
||||
margin-right: 4px;
|
||||
position: relative;
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
.top-bar .big,
|
||||
.bottom-bar .big {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
.top-bar .big,
|
||||
.bottom-bar .big {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
.top-bar .small,
|
||||
.bottom-bar .small {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
.top-bar .small,
|
||||
.bottom-bar .small {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.top-bar .small img,
|
||||
.bottom-bar .small img {
|
||||
height: 1.25em;
|
||||
}
|
||||
.bottom-bar {
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
.top-bar {
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
.bottom-bar-left {
|
||||
display: block;
|
||||
float: left;
|
||||
padding-left: 10px;
|
||||
}
|
||||
.bottom-bar-left p {
|
||||
float: right;
|
||||
}
|
||||
.bottom-bar-right {
|
||||
display: block;
|
||||
float: right;
|
||||
padding-right: 20px;
|
||||
}
|
||||
.bottom-bar-center {
|
||||
width: 20%;
|
||||
position: absolute;
|
||||
left: 40%;
|
||||
text-align: center;
|
||||
}
|
||||
.bottom-bar-heart {
|
||||
top: 2px;
|
||||
}
|
||||
.bottom-bar-xwiki {
|
||||
top: 3px;
|
||||
}
|
||||
.bottom-bar-openpaas {
|
||||
top: 3px;
|
||||
max-width: 100px;
|
||||
}
|
||||
.bottom-left {
|
||||
border-bottom-left-radius: 5px;
|
||||
}
|
||||
.top-left {
|
||||
border-top-left-radius: 5px;
|
||||
}
|
||||
.remove {
|
||||
color: #FF0073;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
form.realtime {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
form.realtime > textarea {
|
||||
width: 50%;
|
||||
height: 15vh;
|
||||
}
|
||||
form.realtime table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
form.realtime table tr td {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
form.realtime table tr td div.text-cell {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
height: 100%;
|
||||
}
|
||||
form.realtime table tr td div.text-cell input {
|
||||
width: 80%;
|
||||
height: 100%;
|
||||
border: 0px;
|
||||
}
|
||||
form.realtime table tr td div.text-cell input[disabled] {
|
||||
background-color: transparent;
|
||||
color: #fafafa;
|
||||
font-weight: bold;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain {
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain label {
|
||||
background-color: transparent;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) {
|
||||
display: none;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover {
|
||||
font-weight: bold;
|
||||
background-color: #FF0073;
|
||||
color: #302B28;
|
||||
display: block;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover:after {
|
||||
content: "✖";
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes {
|
||||
background-color: #46E981;
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.yes:after {
|
||||
content: "✔";
|
||||
}
|
||||
form.realtime table tr td.checkbox-cell div.checkbox-contain input[type="checkbox"]:not(.editable) ~ .cover.mine {
|
||||
display: none;
|
||||
}
|
||||
form.realtime table input[type="text"] {
|
||||
height: 100%;
|
||||
width: 80%;
|
||||
border: 3px solid #302B28;
|
||||
}
|
||||
form.realtime table .edit {
|
||||
color: #46E981;
|
||||
cursor: pointer;
|
||||
width: 10%;
|
||||
font-size: 20px;
|
||||
}
|
||||
form.realtime table .edit:after {
|
||||
content: '✐';
|
||||
}
|
||||
form.realtime table .edit.editable {
|
||||
display: none;
|
||||
}
|
||||
form.realtime table thead tr th input[type="text"][disabled] {
|
||||
background-color: transparent;
|
||||
color: #fafafa;
|
||||
font-weight: bold;
|
||||
}
|
||||
form.realtime table thead tr th .remove {
|
||||
cursor: pointer;
|
||||
font-size: 20px;
|
||||
}
|
||||
form.realtime table tfoot tr td {
|
||||
text-align: center;
|
||||
}
|
||||
form.realtime table tfoot tr td .save {
|
||||
padding: 15px;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
form.realtime #adduser,
|
||||
form.realtime #addoption {
|
||||
color: #46E981;
|
||||
border: 1px solid #46E981;
|
||||
padding: 15px;
|
||||
cursor: pointer;
|
||||
}
|
||||
form.realtime #adduser {
|
||||
border-top-left-radius: 5px;
|
||||
}
|
||||
form.realtime #addoption {
|
||||
border-bottom-left-radius: 5px;
|
||||
}
|
||||
div.modal,
|
||||
div#modal {
|
||||
box-sizing: border-box;
|
||||
z-index: 9001;
|
||||
position: fixed;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
display: none;
|
||||
background-color: #302B28;
|
||||
}
|
||||
div.modal #content,
|
||||
div#modal #content {
|
||||
box-sizing: border-box;
|
||||
border: 1px solid white;
|
||||
vertical-align: middle;
|
||||
padding: 2.5vw;
|
||||
width: 100vw;
|
||||
height: 56.25vw;
|
||||
max-height: 100vh;
|
||||
max-width: 177.78vh;
|
||||
margin: auto;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
div.modal #content p,
|
||||
div#modal #content p,
|
||||
div.modal #content li,
|
||||
div#modal #content li,
|
||||
div.modal #content pre,
|
||||
div#modal #content pre,
|
||||
div.modal #content code,
|
||||
div#modal #content code {
|
||||
font-size: 2.75vw;
|
||||
line-height: 3.025vw;
|
||||
}
|
||||
div.modal #content h1,
|
||||
div#modal #content h1 {
|
||||
font-size: 5vw;
|
||||
line-height: 5.5vw;
|
||||
}
|
||||
div.modal #content h2,
|
||||
div#modal #content h2 {
|
||||
font-size: 4.2vw;
|
||||
line-height: 4.62vw;
|
||||
}
|
||||
div.modal #content h3,
|
||||
div#modal #content h3 {
|
||||
font-size: 3.6vw;
|
||||
line-height: 3.96vw;
|
||||
}
|
||||
div.modal #content h4,
|
||||
div#modal #content h4 {
|
||||
font-size: 3vw;
|
||||
line-height: 3.3vw;
|
||||
}
|
||||
div.modal #content h5,
|
||||
div#modal #content h5 {
|
||||
font-size: 2.2vw;
|
||||
line-height: 2.42vw;
|
||||
}
|
||||
div.modal #content h6,
|
||||
div#modal #content h6 {
|
||||
font-size: 1.6vw;
|
||||
line-height: 1.76vw;
|
||||
}
|
||||
div.modal #content pre > code,
|
||||
div#modal #content pre > code {
|
||||
display: block;
|
||||
position: relative;
|
||||
border: 1px solid #333;
|
||||
width: 90%;
|
||||
margin: auto;
|
||||
padding-left: .25vw;
|
||||
}
|
||||
div.modal .center,
|
||||
div#modal .center {
|
||||
position: relative;
|
||||
width: 80%;
|
||||
height: 80%;
|
||||
margin: auto;
|
||||
border: 1px solid #685d56;
|
||||
text-align: center;
|
||||
}
|
||||
div.modal.shown,
|
||||
div#modal.shown {
|
||||
display: block;
|
||||
}
|
||||
div.modal table,
|
||||
div#modal table {
|
||||
margin: 30px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
div.modal table input,
|
||||
div#modal table input {
|
||||
height: 100%;
|
||||
width: 90%;
|
||||
border: 3px solid #302B28;
|
||||
}
|
||||
div.modal table tfoot tr td,
|
||||
div#modal table tfoot tr td {
|
||||
z-index: 4000;
|
||||
cursor: pointer;
|
||||
}
|
||||
div.modal #addtime,
|
||||
div#modal #addtime,
|
||||
div.modal #adddate,
|
||||
div#modal #adddate {
|
||||
color: #46E981;
|
||||
border: 1px solid #46E981;
|
||||
padding: 15px;
|
||||
}
|
||||
div.modal #adddate,
|
||||
div#modal #adddate {
|
||||
border-top-left-radius: 5px;
|
||||
}
|
||||
div.modal #addtime,
|
||||
div#modal #addtime {
|
||||
border-bottom-left-radius: 5px;
|
||||
}
|
@ -1,126 +1,167 @@
|
||||
define(['/customize/languageSelector.js',
|
||||
'/customize/translations/messages.js',
|
||||
'/customize/translations/messages.es.js',
|
||||
'/customize/translations/messages.fr.js',
|
||||
|
||||
// 1) additional translation files can be added here...
|
||||
(function () {
|
||||
var LS_LANG = "CRYPTPAD_LANG";
|
||||
|
||||
// add your module to this map so it gets used
|
||||
var map = {
|
||||
'fr': 'Français',
|
||||
'es': 'Español',
|
||||
'pl': 'Polski',
|
||||
'de': 'Deutsch',
|
||||
'pt-br': 'Português do Brasil',
|
||||
'ro': 'Română',
|
||||
'zh': '繁體中文',
|
||||
};
|
||||
|
||||
var getStoredLanguage = function () { return localStorage.getItem(LS_LANG); };
|
||||
var getBrowserLanguage = function () { return navigator.language || navigator.userLanguage; };
|
||||
var getLanguage = function () {
|
||||
if (getStoredLanguage()) { return getStoredLanguage(); }
|
||||
var l = getBrowserLanguage() || '';
|
||||
if (Object.keys(map).indexOf(l) !== -1) {
|
||||
return l;
|
||||
}
|
||||
// Edge returns 'fr-FR' --> transform it to 'fr' and check again
|
||||
return Object.keys(map).indexOf(l.split('-')[0]) !== -1 ? l.split('-')[0] : 'en';
|
||||
};
|
||||
var language = getLanguage();
|
||||
|
||||
'/bower_components/jquery/dist/jquery.min.js'],
|
||||
var req = ['jquery', '/customize/translations/messages.js'];
|
||||
if (language && map[language]) { req.push('/customize/translations/messages.' + language + '.js'); }
|
||||
|
||||
// 2) name your language module here...
|
||||
function(LS, Default, Spanish, French) {
|
||||
var $ = window.jQuery;
|
||||
define(req, function($, Default, Language) {
|
||||
|
||||
// 3) add your module to this map so it gets used
|
||||
var map = {
|
||||
'fr': French,
|
||||
'es': Spanish,
|
||||
};
|
||||
var externalMap = JSON.parse(JSON.stringify(map));
|
||||
|
||||
map.en = 'English';
|
||||
var defaultLanguage = 'en';
|
||||
|
||||
var language = LS.getLanguage();
|
||||
|
||||
var messages;
|
||||
|
||||
if (!language || language === defaultLanguage || language === 'default' || !map[language]) {
|
||||
if (!Language || !language || language === defaultLanguage || language === 'default' || !map[language]) {
|
||||
messages = Default;
|
||||
}
|
||||
else {
|
||||
// Add the translated keys to the returned object
|
||||
messages = $.extend(true, {}, Default, map[language]);
|
||||
messages = $.extend(true, {}, Default, Language);
|
||||
}
|
||||
|
||||
// messages_languages return the available translations and their name in an object :
|
||||
// { "en": "English", "fr": "French", ... }
|
||||
messages._languages = {
|
||||
'en': Default._languageName
|
||||
};
|
||||
for (var l in map) {
|
||||
messages._languages[l] = map[l]._languageName || l;
|
||||
}
|
||||
messages._languages = map;
|
||||
messages._languageUsed = language;
|
||||
|
||||
messages._initSelector = LS.main;
|
||||
messages._checkTranslationState = function () {
|
||||
messages._checkTranslationState = function (cb) {
|
||||
if (typeof(cb) !== "function") { return; }
|
||||
var missing = [];
|
||||
Object.keys(map).forEach(function (code) {
|
||||
var translation = map[code];
|
||||
Object.keys(Default).forEach(function (k) {
|
||||
if (/^_/.test(k) || /nitialState$/.test(k)) { return; }
|
||||
if (!translation[k]) {
|
||||
var warning = "key [" + k + "] is missing from translation [" + code + "]";
|
||||
missing.push(warning);
|
||||
}
|
||||
var reqs = [];
|
||||
Object.keys(externalMap).forEach(function (code) {
|
||||
reqs.push('/customize/translations/messages.' + code + '.js');
|
||||
});
|
||||
require(reqs, function () {
|
||||
var langs = arguments;
|
||||
Object.keys(externalMap).forEach(function (code, i) {
|
||||
var translation = langs[i];
|
||||
var updated = {};
|
||||
Object.keys(Default).forEach(function (k) {
|
||||
if (/^updated_[0-9]+_/.test(k) && !translation[k]) {
|
||||
var key = k.split('_').slice(2).join('_');
|
||||
// Make sure we don't already have an update for that key. It should not happen
|
||||
// but if it does, keep the latest version
|
||||
if (updated[key]) {
|
||||
var ek = updated[key];
|
||||
if (parseInt(ek.split('_')[1]) > parseInt(k.split('_')[1])) { return; }
|
||||
}
|
||||
updated[key] = k;
|
||||
}
|
||||
});
|
||||
Object.keys(Default).forEach(function (k) {
|
||||
if (/^_/.test(k) || k === 'driveReadme') { return; }
|
||||
if (!translation[k] || updated[k]) {
|
||||
if (updated[k]) {
|
||||
missing.push([code, k, 2, 'out.' + updated[k]]);
|
||||
return;
|
||||
}
|
||||
missing.push([code, k, 1]);
|
||||
}
|
||||
});
|
||||
Object.keys(translation).forEach(function (k) {
|
||||
if (/^_/.test(k) || k === 'driveReadme') { return; }
|
||||
if (!Default[k]) {
|
||||
missing.push([code, k, 0]);
|
||||
}
|
||||
});
|
||||
});
|
||||
if (typeof(translation._languageName) !== 'string') {
|
||||
var warning = 'key [_languageName] is missing from translation [' + code + ']';
|
||||
missing.push(warning);
|
||||
}
|
||||
cb(missing);
|
||||
});
|
||||
return missing;
|
||||
};
|
||||
|
||||
// Get keys with parameters
|
||||
messages._getKey = function (key, argArray) {
|
||||
if (!messages[key]) { return '?'; }
|
||||
var text = messages[key];
|
||||
return text.replace(/\{(\d+)\}/g, function (str, p1) {
|
||||
return argArray[p1] || null;
|
||||
if (typeof(text) === 'string') {
|
||||
return text.replace(/\{(\d+)\}/g, function (str, p1) {
|
||||
return argArray[p1] || null;
|
||||
});
|
||||
} else {
|
||||
return text;
|
||||
}
|
||||
};
|
||||
|
||||
// Add handler to the language selector
|
||||
var storeLanguage = function (l) {
|
||||
localStorage.setItem(LS_LANG, l);
|
||||
};
|
||||
messages._initSelector = function ($select) {
|
||||
var selector = $select || $('#language-selector');
|
||||
|
||||
if (!selector.length) { return; }
|
||||
|
||||
// Select the current language in the list
|
||||
selector.setValue(language || 'English');
|
||||
|
||||
// Listen for language change
|
||||
$(selector).find('a.languageValue').on('click', function () {
|
||||
var newLanguage = $(this).attr('data-value');
|
||||
storeLanguage(newLanguage);
|
||||
if (newLanguage !== language) {
|
||||
window.location.reload();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var translateText = function (i, e) {
|
||||
var $el = $(e);
|
||||
var key = $el.data('localization');
|
||||
$el.html(messages[key]);
|
||||
};
|
||||
var translateAppend = function (i, e) {
|
||||
var $el = $(e);
|
||||
var key = $el.data('localization-append');
|
||||
$el.append(messages[key]);
|
||||
};
|
||||
var translateTitle = function () {
|
||||
var $el = $(this);
|
||||
var key = $el.data('localization-title');
|
||||
$el.attr('title', messages[key]);
|
||||
};
|
||||
var translatePlaceholder = function () {
|
||||
var $el = $(this);
|
||||
var key = $el.data('localization-placeholder');
|
||||
$el.attr('placeholder', messages[key]);
|
||||
};
|
||||
messages._applyTranslation = function () {
|
||||
$('[data-localization]').each(function (i, e) {
|
||||
var $el = $(this);
|
||||
var key = $el.data('localization');
|
||||
$el.html(messages[key]);
|
||||
});
|
||||
$('[data-localization-title]').each(function (i, e) {
|
||||
var $el = $(this);
|
||||
var key = $el.data('localization-title');
|
||||
$el.attr('title', messages[key]);
|
||||
});
|
||||
$('[data-localization]').each(translateText);
|
||||
$('[data-localization-append]').each(translateAppend);
|
||||
$('#pad-iframe').contents().find('[data-localization]').each(translateText);
|
||||
$('[data-localization-title]').each(translateTitle);
|
||||
$('[data-localization-placeholder]').each(translatePlaceholder);
|
||||
$('#pad-iframe').contents().find('[data-localization-title]').each(translateTitle);
|
||||
};
|
||||
|
||||
// Non translatable keys
|
||||
messages.initialState = [
|
||||
'<p>',
|
||||
'This is <strong>CryptPad</strong>, the zero knowledge realtime collaborative editor.',
|
||||
'<br>',
|
||||
'What you type here is encrypted so only people who have the link can access it.',
|
||||
'<br>',
|
||||
'Even the server cannot see what you type.',
|
||||
'</p>',
|
||||
'<p>',
|
||||
'<small>',
|
||||
'<i>What you see here, what you hear here, when you leave here, let it stay here</i>',
|
||||
'</small>',
|
||||
'</p>',
|
||||
].join('');
|
||||
|
||||
messages.codeInitialState = [
|
||||
'/*\n',
|
||||
' This is CryptPad, the zero knowledge realtime collaborative editor.\n',
|
||||
' What you type here is encrypted so only people who have the link can access it.\n',
|
||||
' Even the server cannot see what you type.\n',
|
||||
' What you see here, what you hear here, when you leave here, let it stay here.\n',
|
||||
'*/'
|
||||
].join('');
|
||||
|
||||
messages.slideInitialState = [
|
||||
'# CryptSlide\n',
|
||||
'* This is a zero knowledge realtime collaborative editor.\n',
|
||||
'* What you type here is encrypted so only people who have the link can access it.\n',
|
||||
'* Even the server cannot see what you type.\n',
|
||||
'* What you see here, what you hear here, when you leave here, let it stay here.\n',
|
||||
'\n',
|
||||
'---',
|
||||
'\n',
|
||||
'# How to use\n',
|
||||
'1. Write your slides content using markdown syntax\n',
|
||||
'2. Separate your slides with ---\n',
|
||||
'3. Click on the "Play" button to see the result'
|
||||
].join('');
|
||||
messages.driveReadme = '["BODY",{"class":"cke_editable cke_editable_themed cke_contents_ltr cke_show_borders","contenteditable":"true","spellcheck":"false","style":"color: rgb(51, 51, 51);"},' +
|
||||
'[["H1",{},["'+messages.readme_welcome+'"]],["P",{},["'+messages.readme_p1+'"]],["P",{},["'+messages.readme_p2+'"]],["HR",{},[]],["H2",{},["'+messages.readme_cat1+'",["BR",{},[]]]],["UL",{},[["LI",{},["'+messages._getKey("readme_cat1_l1", ['",["STRONG",{},["'+messages.newButton+'"]],"', '",["STRONG",{},["'+messages.type.pad+'"]],"'])+'"]],["LI",{},["'+messages.readme_cat1_l2+'"]],["LI",{},["'+messages._getKey("readme_cat1_l3", ['",["STRONG",{},["'+messages.fm_unsortedName+'"]],"'])+'",["UL",{},[["LI",{},["'+messages._getKey("readme_cat1_l3_l1", ['",["STRONG",{},["'+messages.fm_rootName+'"]],"'])+'"]],["LI",{},["'+messages.readme_cat1_l3_l2+'"]]]]]],["LI",{},["'+messages._getKey("readme_cat1_l4", ['",["STRONG",{},["'+messages.fm_trashName+'"]],"'])+'",["BR",{},[]]]]]],["P",{},[["BR",{},[]]]],["H2",{},["'+messages.readme_cat2+'",["BR",{},[]]]],["UL",{},[["LI",{},["'+messages._getKey("readme_cat2_l1", ['",["STRONG",{},["'+messages.shareButton+'"]],"', '",["STRONG",{},["'+messages.edit+'"]],"', '",["STRONG",{},["'+messages.view+'"]],"'])+'"]],["LI",{},["'+messages.readme_cat2_l2+'"]]]],["P",{},[["BR",{},[]]]],["H2",{},["'+messages.readme_cat3+'"]],["UL",{},[["LI",{},["'+messages.readme_cat3_l1+'"]],["LI",{},["'+messages.readme_cat3_l2+'"]],["LI",{},["'+messages.readme_cat3_l3+'",["BR",{},[]]]]]]],' +
|
||||
'{"metadata":{"defaultTitle":"' + messages.driveReadmeTitle + '","title":"' + messages.driveReadmeTitle + '"}}]';
|
||||
|
||||
return messages;
|
||||
|
||||
});
|
||||
}());
|
||||
|
Before Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 5.8 KiB |
@ -1,9 +0,0 @@
|
||||
/*
|
||||
globals define console
|
||||
*/
|
||||
require([
|
||||
'/customize/DecorateToolbar.js',
|
||||
'/bower_components/jquery/dist/jquery.min.js'
|
||||
], function (Dt) {
|
||||
Dt.main(window.$('#bottom-bar'));
|
||||
});
|
@ -0,0 +1,521 @@
|
||||
define([
|
||||
'/api/config',
|
||||
'/common/hyperscript.js',
|
||||
'/common/cryptpad-common.js',
|
||||
], function (Config, h, Cryptpad) {
|
||||
var Pages = {};
|
||||
var Msg = Cryptpad.Messages;
|
||||
var urlArgs = Config.requireConf.urlArgs;
|
||||
|
||||
var setHTML = function (e, html) {
|
||||
e.innerHTML = html;
|
||||
return e;
|
||||
};
|
||||
|
||||
var indexContent = function () {
|
||||
return [
|
||||
h('div.page.category.first#knowmore', [
|
||||
h('center', [
|
||||
h('h1', Msg.main_howitworks)
|
||||
])
|
||||
]),
|
||||
h('div.page', [
|
||||
h('div.info-container', [
|
||||
h('div.left.image', [
|
||||
h('img', {
|
||||
src: '/customize/images/zeroknowledge_small.png?' + urlArgs ,
|
||||
alt: 'Zero Knowledge'
|
||||
})
|
||||
]),
|
||||
h('div.right', [
|
||||
h('h2', Msg.main_zeroKnowledge),
|
||||
setHTML(h('p'), Msg.main_zeroKnowledge_p)
|
||||
])
|
||||
])
|
||||
]),
|
||||
h('div.page.even', [
|
||||
h('div.info-container', [
|
||||
h('div.left', [
|
||||
h('h2', Msg.main_writeItDown),
|
||||
h('p', Msg.main_writeItDown_p)
|
||||
]),
|
||||
h('div.right.image', [
|
||||
h('img', {
|
||||
alt: "User account",
|
||||
src: '/customize/images/realtime_small.png?' + urlArgs,
|
||||
})
|
||||
])
|
||||
])
|
||||
]),
|
||||
h('div.page', [
|
||||
h('div.info-container', [
|
||||
h('div.left.image', [
|
||||
h('img', {
|
||||
src: '/customize/images/key_small.png?' + urlArgs,
|
||||
alt: 'User account'
|
||||
})
|
||||
]),
|
||||
h('div.right', [
|
||||
h('h2', Msg.main_share),
|
||||
h('p', Msg.main_share_p)
|
||||
])
|
||||
])
|
||||
]),
|
||||
h('div.page.even', [
|
||||
h('div.info-container', [
|
||||
h('div.left', [
|
||||
h('h2', Msg.main_organize),
|
||||
h('p', Msg.main_organize_p)
|
||||
]),
|
||||
h('div.right.image', [
|
||||
h('img', {
|
||||
src: '/customize/images/organize.png?' + urlArgs,
|
||||
alt: 'User account'
|
||||
})
|
||||
])
|
||||
])
|
||||
])
|
||||
];
|
||||
};
|
||||
|
||||
Pages['/about.html'] = function () {
|
||||
return h('div#main_other', [
|
||||
h('center', [
|
||||
h('h1', Msg.about)
|
||||
]),
|
||||
setHTML(h('p'), Msg.main_p2),
|
||||
h('h2', Msg.main_howitworks),
|
||||
setHTML(h('p'), Msg.main_howitworks_p1)
|
||||
].concat(indexContent()));
|
||||
};
|
||||
|
||||
Pages['/privacy.html'] = function () {
|
||||
return h('div#main_other', [
|
||||
h('center', h('h1', Msg.policy_title)),
|
||||
h('h2', Msg.policy_whatweknow),
|
||||
h('p', Msg.policywhatweknow_p1),
|
||||
|
||||
h('h2', Msg.policy_howweuse),
|
||||
h('p', Msg.policy_howweuse_p1),
|
||||
h('p', Msg.policy_howweuse_p2),
|
||||
|
||||
h('h2', Msg.policy_whatwetell),
|
||||
h('p', Msg.policy_whatwetell_p1),
|
||||
|
||||
h('h2', Msg.policy_links),
|
||||
h('p', Msg.policy_links_p1),
|
||||
|
||||
h('h2', Msg.policy_ads),
|
||||
h('p', Msg.policy_ads_p1),
|
||||
|
||||
h('h2', Msg.policy_choices),
|
||||
h('p', Msg.policy_choices_open),
|
||||
setHTML(h('p'), Msg.policy_choices_vpn),
|
||||
|
||||
h('br')
|
||||
]);
|
||||
};
|
||||
|
||||
Pages['/terms.html'] = function () {
|
||||
return h('div#main_other', [
|
||||
h('center', h('h1', Msg.tos_title)),
|
||||
h('p', Msg.tos_legal),
|
||||
h('p', Msg.tos_availability),
|
||||
h('p', Msg.tos_e2ee),
|
||||
h('p', Msg.tos_logs),
|
||||
h('p', Msg.tos_3rdparties),
|
||||
]);
|
||||
};
|
||||
|
||||
Pages['/contact.html'] = function () {
|
||||
return h('div#main_other', [
|
||||
h('center', h('h1', Msg.contact)),
|
||||
setHTML(h('p'), Msg.main_about_p2)
|
||||
]);
|
||||
};
|
||||
|
||||
var userForm = function () {
|
||||
return h('div#userForm.form-group.hidden', [
|
||||
h('input#name.form-control', {
|
||||
name: 'name',
|
||||
type: 'text',
|
||||
placeholder: Msg.login_username
|
||||
}),
|
||||
h('input#password.form-control', {
|
||||
name: 'password',
|
||||
type: 'password',
|
||||
placeholder: Msg.login_password
|
||||
}),
|
||||
h('div', {
|
||||
style: { display: 'none' }
|
||||
}, [
|
||||
h('span.remember.form-check', [
|
||||
h('label.form-check-label', {
|
||||
'for': 'rememberme',
|
||||
placeholder: Msg.login_remember,
|
||||
}, [
|
||||
h('input#rememberme.form-check-input', {
|
||||
type: 'checkbox',
|
||||
checked: true
|
||||
})
|
||||
])
|
||||
])
|
||||
]),
|
||||
h('button.btn.btn-secondary.login.half.first', Msg.login_login),
|
||||
h('button.btn.btn-success.register.half', Msg.login_register),
|
||||
h('p.separator', Msg.login_orNoLogin),
|
||||
h('p#buttons.buttons'),
|
||||
h('p.driveLink', [
|
||||
h('a.gotodrive', {
|
||||
href: '/drive/'
|
||||
}, Msg.login_nologin)
|
||||
])
|
||||
]);
|
||||
};
|
||||
|
||||
|
||||
var appButton = function (alt, h2, img, p, url, btn, id) {
|
||||
return h('div.app', [
|
||||
h('center', [
|
||||
h('h2', h2),
|
||||
h('img', {
|
||||
alt: 'Rich Text application',
|
||||
src: img,
|
||||
})
|
||||
]),
|
||||
setHTML(h('p'), p),
|
||||
h('p.buttons', [
|
||||
h('a#' + id, {
|
||||
href: url,
|
||||
}, [
|
||||
h('button.btn.btn-secondary', btn),
|
||||
])
|
||||
])
|
||||
]);
|
||||
};
|
||||
|
||||
var tryIt = function () {
|
||||
return [
|
||||
h('div.class.category#tryit', [
|
||||
h('center', [
|
||||
h('h1', Msg.tryIt)
|
||||
])
|
||||
]),
|
||||
h('div.page', [
|
||||
h('div.app-container', [
|
||||
h('div.app-row', [
|
||||
appButton("Rich Text application",
|
||||
Msg.main_richText,
|
||||
'/customize/images/pad.png?' + urlArgs,
|
||||
Msg.main_richText_p,
|
||||
'/pad/',
|
||||
Msg.button_newpad,
|
||||
'create-pad'),
|
||||
appButton('Code application',
|
||||
Msg.main_code,
|
||||
'/customize/images/code.png?' + urlArgs,
|
||||
Msg.main_code_p,
|
||||
'/code/',
|
||||
Msg.button_newcode,
|
||||
'create-code'),
|
||||
appButton('Slide application',
|
||||
Msg.main_slide,
|
||||
'/customize/images/slide.png?' + urlArgs,
|
||||
Msg.main_slide_p,
|
||||
'/slide/',
|
||||
Msg.button_newslide,
|
||||
'create-slide'),
|
||||
appButton('Poll application',
|
||||
Msg.main_poll,
|
||||
'/customize/images/poll.png?' + urlArgs,
|
||||
Msg.main_poll_p,
|
||||
'/poll/',
|
||||
Msg.button_newpoll,
|
||||
'create-poll')
|
||||
])
|
||||
])
|
||||
])
|
||||
];
|
||||
};
|
||||
|
||||
Pages['/'] = Pages['/index.html'] = function () {
|
||||
return [
|
||||
h('div#main', [
|
||||
h('div.mainOverlay'),
|
||||
h('div#align-container', [
|
||||
h('div#main-container', [
|
||||
h('div#data.hidden', [
|
||||
setHTML(h('p.left'), Msg.main_info),
|
||||
]),
|
||||
userForm(),
|
||||
h('div#loggedIn.hidden', [
|
||||
h('p#loggedInHello'),
|
||||
h('p', [
|
||||
h('button.btn.btn-primary.gotodrive', Msg.login_accessDrive),
|
||||
]),
|
||||
h('p', [
|
||||
h('button#loggedInLogout.btn.btn-secondary', Msg.logoutButton)
|
||||
])
|
||||
])
|
||||
])
|
||||
]),
|
||||
])
|
||||
]
|
||||
.concat(tryIt());
|
||||
};
|
||||
|
||||
var loadingScreen = function () {
|
||||
return h('div#loading',
|
||||
h('div.loadingContainer', [
|
||||
h('img.cryptofist', {
|
||||
src: '/customize/cryptofist_small.png?' + urlArgs
|
||||
}),
|
||||
h('div.spinnerContainer',
|
||||
h('span.fa.fa-spinner.fa-pulse.fa-4x.fa-fw')),
|
||||
h('p', Msg.loading)
|
||||
])
|
||||
);
|
||||
};
|
||||
loadingScreen = loadingScreen; // TODO use this
|
||||
|
||||
Pages['/user/'] = Pages['/user/index.html'] = function () {
|
||||
return h('div#container');
|
||||
};
|
||||
|
||||
Pages['/register/'] = Pages['/register/index.html'] = function () {
|
||||
return [h('div#main', [
|
||||
h('div.mainOverlay'),
|
||||
h('div#align-container', [
|
||||
h('div#data.hidden', [
|
||||
h('h1', Msg.register_header),
|
||||
h('br'),
|
||||
setHTML(h('p.left.register-explanation'), Msg.register_explanation)
|
||||
]),
|
||||
h('div#userForm.form-group.hidden', [
|
||||
h('input.form-control#username', {
|
||||
type: 'text',
|
||||
autocomplete: 'off',
|
||||
autocorrect: 'off',
|
||||
autocapitalize: 'off',
|
||||
spellcheck: false,
|
||||
placeholder: Msg.login_username,
|
||||
autofocus: true,
|
||||
}),
|
||||
h('input.form-control#password', {
|
||||
type: 'password',
|
||||
placeholder: Msg.login_password,
|
||||
}),
|
||||
h('input.form-control#password-confirm', {
|
||||
type: 'password',
|
||||
placeholder: Msg.login_confirm,
|
||||
}),
|
||||
h('input#import-recent', {
|
||||
type: 'checkbox',
|
||||
checked: true
|
||||
}),
|
||||
h('label', {
|
||||
'for': 'import-recent',
|
||||
}, Msg.register_importRecent),
|
||||
h('br'),
|
||||
h('input#accept-terms', {
|
||||
type: 'checkbox'
|
||||
}),
|
||||
setHTML(h('label', {
|
||||
'for': 'accept-terms',
|
||||
}), Msg.register_acceptTerms),
|
||||
h('br'),
|
||||
h('button#register.btn.btn-primary', Msg.login_register)
|
||||
])
|
||||
])
|
||||
])];
|
||||
};
|
||||
|
||||
Pages['/login/'] = Pages['/login/index.html'] = function () {
|
||||
return [h('div#main', [
|
||||
h('div.mainOverlay'),
|
||||
h('div#align-container',
|
||||
h('div#main-container', [
|
||||
h('div#data.hidden', setHTML(h('p.left'), Msg.main_info)),
|
||||
h('div#userForm.form-group.hidden', [
|
||||
h('input.form-control#name', {
|
||||
name: 'name',
|
||||
type: 'text',
|
||||
autocomplete: 'off',
|
||||
autocorrect: 'off',
|
||||
autocapitalize: 'off',
|
||||
spellcheck: false,
|
||||
placeholder: Msg.login_username,
|
||||
autofocus: true,
|
||||
}),
|
||||
h('input.form-control#password', {
|
||||
type: 'password',
|
||||
'name': 'password',
|
||||
placeholder: Msg.login_password,
|
||||
}),
|
||||
h('button.btn.btn-primary.login.first', Msg.login_login),
|
||||
h('div.extra', [
|
||||
h('p', Msg.login_notRegistered),
|
||||
h('button#register.btn.btn-success.register', Msg.login_register)
|
||||
])
|
||||
])
|
||||
])
|
||||
)
|
||||
])];
|
||||
};
|
||||
|
||||
var appToolbar = function () {
|
||||
return h('div#toolbar.toolbar-container');
|
||||
};
|
||||
|
||||
Pages['/whiteboard/'] = Pages['/whiteboard/index.html'] = function () {
|
||||
return [
|
||||
appToolbar(),
|
||||
h('div#canvas-area', h('canvas#canvas', {
|
||||
width: 600,
|
||||
height: 600
|
||||
})),
|
||||
h('div#controls', {
|
||||
style: {
|
||||
display: 'block',
|
||||
}
|
||||
}, [
|
||||
h('button#clear', Msg.canvas_clear), ' ',
|
||||
h('button#toggleDraw', Msg.canvas_disable),
|
||||
h('button#delete', {
|
||||
style: {
|
||||
display: 'none',
|
||||
}
|
||||
}),
|
||||
h('input#width', {
|
||||
type: 'range',
|
||||
value: "5",
|
||||
min: "1",
|
||||
max: "100"
|
||||
}),
|
||||
h('label', {
|
||||
'for': 'width'
|
||||
}, Msg.canvas_width),
|
||||
h('input#opacity', {
|
||||
type: 'range',
|
||||
value: "1",
|
||||
min: "0.1",
|
||||
max: "1",
|
||||
step: "0.1"
|
||||
}),
|
||||
h('label', {
|
||||
'for': 'width',
|
||||
}),
|
||||
h('span.selected')
|
||||
]),
|
||||
setHTML(h('div#colors'), ' '),
|
||||
loadingScreen(),
|
||||
h('div#cursors', {
|
||||
style: {
|
||||
display: 'none',
|
||||
background: 'white',
|
||||
'text-align': 'center',
|
||||
}
|
||||
}),
|
||||
h('div#pickers'),
|
||||
];
|
||||
};
|
||||
|
||||
Pages['/poll/'] = Pages['/poll/index.html'] = function () {
|
||||
return [
|
||||
appToolbar(),
|
||||
h('div#content', [
|
||||
h('div#poll', [
|
||||
h('div#howItWorks', [
|
||||
h('h1', 'CryptPoll'),
|
||||
setHTML(h('h2'), Msg.poll_subtitle),
|
||||
h('p', Msg.poll_p_save),
|
||||
h('p', Msg.poll_p_encryption)
|
||||
]),
|
||||
h('div.upper', [
|
||||
h('button#publish', {
|
||||
style: { display: 'none' }
|
||||
}, Msg.poll_publish_button),
|
||||
h('button#admin', {
|
||||
style: { display: 'none' },
|
||||
title: Msg.poll_admin_button
|
||||
}, Msg.poll_admin_button),
|
||||
h('button#help', {
|
||||
title: Msg.poll_show_help_button,
|
||||
style: { display: 'none' }
|
||||
}, Msg.poll_show_help_button)
|
||||
]),
|
||||
h('div.realtime', [
|
||||
h('br'),
|
||||
h('center', [
|
||||
h('textarea#description', {
|
||||
rows: "5",
|
||||
cols: "50",
|
||||
disabled: true
|
||||
}),
|
||||
h('br')
|
||||
]),
|
||||
h('div#tableContainer', [
|
||||
h('div#tableScroll'),
|
||||
h('button#create-user', {
|
||||
title: Msg.poll_create_user
|
||||
}, h('span.fa.fa-plus')),
|
||||
h('button#create-option', {
|
||||
title: Msg.poll_create_option
|
||||
}, h('span.fa.fa-plus')),
|
||||
h('button#commit', {
|
||||
title: Msg.poll_commit
|
||||
}, h('span.fa.fa-check'))
|
||||
])
|
||||
])
|
||||
])
|
||||
]),
|
||||
loadingScreen()
|
||||
];
|
||||
};
|
||||
|
||||
Pages['/drive/'] = Pages['/drive/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/file/'] = Pages['/file/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/contacts/'] = Pages['/contacts/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/pad/'] = Pages['/pad/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/code/'] = Pages['/code/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/slide/'] = Pages['/slide/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/invite/'] = Pages['/invite/index.html'] = function () {
|
||||
return loadingScreen();
|
||||
};
|
||||
|
||||
Pages['/settings/'] = Pages['/settings/index.html'] = function () {
|
||||
return [
|
||||
h('div#toolbar'),
|
||||
h('div#container'),
|
||||
loadingScreen()
|
||||
];
|
||||
};
|
||||
|
||||
Pages['/profile/'] = Pages['/profile/index.html'] = function () {
|
||||
return [
|
||||
h('div#toolbar'),
|
||||
h('div#container'),
|
||||
loadingScreen()
|
||||
];
|
||||
};
|
||||
|
||||
return Pages;
|
||||
});
|
@ -1,18 +1,25 @@
|
||||
# Customizing CryptPad
|
||||
|
||||
In order allow the content of the main page to be changed and to allow site-specific changes
|
||||
to the pad and sheet while still keeping the git repository pristine, this directory exists
|
||||
In order allow a variety of features to be changed and to allow site-specific changes
|
||||
to CryptPad apps while still keeping the git repository pristine, this directory exists
|
||||
to allow a set of hooks to be run.
|
||||
|
||||
The server is configured to check for a directory called `/customize/` and if that is not
|
||||
found, to fallback on `/customize.dist/`. In order to customize cryptpad, please **copy**
|
||||
The server is configured to load files from the `/customize/` path preferentially from
|
||||
`cryptpad/customize/`, and to fall back to `cryptpad/customize.dist/` if they are not found
|
||||
|
||||
If you wish to customize cryptpad, please **copy**
|
||||
`/customize.dist/` to `/customize` and then edit it there, this way you will still be able
|
||||
to pull from (and make pull requests to (!) the git repository.
|
||||
|
||||
## Files you may be interested in
|
||||
|
||||
* pad.js will be run whenever the (CKEditor) **pad** is loaded.
|
||||
* sheet.js will be run whenever the (JQuery.sheet) **spreadsheet** is loaded.
|
||||
* index.html is the main page.
|
||||
* index.html is the main page
|
||||
* main.js contains javascript for the home page
|
||||
* application_config.js allows you to modify settings used by the various applications
|
||||
* messages.js contains functions for applying translations to various pages
|
||||
* look inside `/translations/` for the rest of the files which contain translated strings
|
||||
* `/share/` implements an iframe RPC which allows multiple domains to access the same localStorage
|
||||
* `/src/` contains source files for html and css (in the form of html templates and .less stylesheets)
|
||||
|
||||
All other content which is placed in this directory will be referencable at the `/customize/`
|
||||
URL location.
|
||||
|
@ -1,9 +0,0 @@
|
||||
/*
|
||||
globals require
|
||||
*/
|
||||
require([
|
||||
'/customize/DecorateToolbar.js',
|
||||
'/bower_components/jquery/dist/jquery.min.js'
|
||||
], function (Dt) {
|
||||
Dt.main(window.$('#bottom-bar'));
|
||||
});
|
@ -1,42 +0,0 @@
|
||||
var Fs = require("fs");
|
||||
|
||||
// read a file
|
||||
var read = function (path) {
|
||||
return Fs.readFileSync(path, 'utf-8');
|
||||
};
|
||||
|
||||
// write a file
|
||||
var write = function (path, src) {
|
||||
return Fs.writeFileSync(path, src);
|
||||
};
|
||||
|
||||
// basic templating
|
||||
var swap = function (src, dict) {
|
||||
return src.replace(/\{\{(.*?)\}\}/g, function (a, b) {
|
||||
return dict[b] || b;
|
||||
});
|
||||
};
|
||||
|
||||
// read the template file
|
||||
var template = read('./template.html');
|
||||
|
||||
// read page fragments
|
||||
var fragments = {};
|
||||
[ 'analytics',
|
||||
'index',
|
||||
'fork',
|
||||
'terms',
|
||||
'privacy',
|
||||
].forEach(function (name) {
|
||||
fragments[name] = read('./fragments/' + name + '.html');
|
||||
});
|
||||
|
||||
// build static pages
|
||||
['index', 'privacy', 'terms'].forEach(function (page) {
|
||||
var source = swap(template, {
|
||||
fork: fragments.fork,
|
||||
analytics: fragments.analytics,
|
||||
main: fragments[page],
|
||||
});
|
||||
write('../' + page + '.html', source);
|
||||
});
|
@ -1,647 +0,0 @@
|
||||
@import "./variables.less";
|
||||
|
||||
.fontface(@family, @src, @style: normal, @weight: 400, @fmt: 'truetype'){
|
||||
@font-face{
|
||||
font-family: @family;
|
||||
src: url(@src) format(@fmt);
|
||||
font-weight: @weight;
|
||||
font-style: @style;
|
||||
}
|
||||
}
|
||||
|
||||
a.github-corner > svg {
|
||||
fill: @cp-green;
|
||||
color: @base;
|
||||
}
|
||||
|
||||
.transform(...) {
|
||||
-webkit-transform: @arguments;
|
||||
-moz-transform: @arguments;
|
||||
-o-transform: @arguments;
|
||||
-ms-transform: @arguments;
|
||||
transform: @arguments;
|
||||
}
|
||||
|
||||
.translate(@x:0, @y:0) {
|
||||
.transform(translate(@x, @y));
|
||||
}
|
||||
|
||||
.table-refresh > svg {
|
||||
width: .9em;
|
||||
height: .9em;
|
||||
fill: @cp-green;
|
||||
.translate(0, 15%);
|
||||
}
|
||||
|
||||
.lato {
|
||||
font-family: lato, Helvetica, sans-serif;
|
||||
font-size: 1.02em;
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: .875em;
|
||||
background-color: @base;
|
||||
color: @fore;
|
||||
}
|
||||
|
||||
html,body {
|
||||
font-family: Georgia,Cambria,serif;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 1rem;
|
||||
font-weight: 400;
|
||||
line-height: 2rem;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: @fore;
|
||||
|
||||
font-family: "Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
-webkit-font-feature-settings: 'dlig' 1,'liga' 1,'lnum' 1,'kern' 1;
|
||||
-moz-font-feature-settings: 'dlig' 1,'liga' 1,'lnum' 1,'kern' 1;
|
||||
font-feature-settings: 'dlig' 1,'liga' 1,'lnum' 1,'kern' 1;
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
line-height: 3rem;
|
||||
font-size: 2.05714rem;
|
||||
margin-bottom: .21999rem;
|
||||
padding-top: .78001rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.95312rem;
|
||||
margin-bottom: .18358rem;
|
||||
padding-top: .81642rem;
|
||||
}
|
||||
|
||||
h2,h3 {
|
||||
line-height: 3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.64571rem;
|
||||
margin-bottom: .07599rem;
|
||||
padding-top: .92401rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.5625rem;
|
||||
margin-bottom: .54686rem;
|
||||
padding-top: .45314rem;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
margin-bottom: -.56251rem;
|
||||
padding-top: .56251rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: -.65001rem;
|
||||
padding-top: .65001rem;
|
||||
}
|
||||
|
||||
a {
|
||||
cursor: pointer;
|
||||
color: @cp-green;
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: @cp-accent;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
|
||||
&.cryptofist {
|
||||
filter: invert(100%);
|
||||
-webkit-filter: invert(100%);
|
||||
}
|
||||
}
|
||||
|
||||
p {
|
||||
padding-top: .66001rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
p,pre {
|
||||
margin-bottom: 1.33999rem;
|
||||
}
|
||||
|
||||
p, pre, td, a, table, tr {
|
||||
.lato;
|
||||
}
|
||||
|
||||
#main {
|
||||
width: 70vw;
|
||||
margin: auto;
|
||||
|
||||
font-size: medium;
|
||||
padding-bottom: 1em;
|
||||
}
|
||||
|
||||
/* buttons */
|
||||
.create, .action {
|
||||
@thick: 2px;
|
||||
border: @thick solid @cp-green;
|
||||
border-radius: 10px;
|
||||
background-color: @base;
|
||||
color: @cp-green;
|
||||
|
||||
font-weight: bold;
|
||||
font-size: large;
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
&:hover {
|
||||
border: @thick solid @cp-accent;
|
||||
color: @cp-green;
|
||||
}
|
||||
}
|
||||
.create {
|
||||
display: none;
|
||||
}
|
||||
.action {
|
||||
display: inline-block;
|
||||
}
|
||||
.buttons {
|
||||
margin-bottom: 50px;
|
||||
margin-top: 20px;
|
||||
line-height: 2.5em;
|
||||
}
|
||||
|
||||
.button {
|
||||
@hpad: 2 * 6px;
|
||||
@vpad: 2 * 2px;
|
||||
padding: @vpad @hpad @vpad @hpad;
|
||||
|
||||
border-radius: 5px;
|
||||
margin-top: 2 * 6px;
|
||||
margin-bottom: 2 * 6px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.alertify button {
|
||||
margin: 3px 0px;
|
||||
}
|
||||
/* Tables */
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
margin: 20px;
|
||||
}
|
||||
tbody {
|
||||
border: 2px solid black;
|
||||
tr {
|
||||
text-align: center;
|
||||
&:first-of-type th{
|
||||
font-size: 20px;
|
||||
border-top: 0px;
|
||||
font-weight: bold;
|
||||
padding: 10px;
|
||||
text-decoration: underline;
|
||||
&.table-refresh {
|
||||
color: @cp-green;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
}
|
||||
&:nth-child(odd) {
|
||||
background-color: @light-base;
|
||||
}
|
||||
th:first-of-type {
|
||||
border-left: 0px;
|
||||
}
|
||||
th {
|
||||
box-sizing: border-box;
|
||||
border: 1px solid black;
|
||||
}
|
||||
th, td {
|
||||
color: @fore;
|
||||
|
||||
&.remove {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
th:last-child {
|
||||
border-right: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
td {
|
||||
border-right: 1px solid black;
|
||||
padding: 12px;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
&:last-child {
|
||||
border-right: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Bottom Bar */
|
||||
|
||||
.top-bar, .bottom-bar {
|
||||
position:fixed;
|
||||
height:4%;
|
||||
height: 2.5em;
|
||||
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
background: @base;
|
||||
border-top: 1px solid @cp-outline;
|
||||
|
||||
a {
|
||||
color: @cp-green;
|
||||
text-decoration: none;
|
||||
}
|
||||
p {
|
||||
margin: -1px;
|
||||
font-family: Arial, Helvetica, Tahoma, Verdana, sans-serif;
|
||||
|
||||
font-size: 20px;
|
||||
display:block;
|
||||
margin-left: 10px;
|
||||
padding-top:3px;
|
||||
color: @fore;
|
||||
}
|
||||
img {
|
||||
margin-right: 4px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.big {
|
||||
@media screen and (max-width: 800px) {
|
||||
display: none;
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
.small {
|
||||
@media screen and (max-width: 800px) {
|
||||
display: inline-block;
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
display: none;
|
||||
}
|
||||
img {
|
||||
height: 1.25em;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.bottom-bar {
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
.top-bar {
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.bottom-bar-left {
|
||||
display:block;
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
}
|
||||
.bottom-bar-left p {
|
||||
float: right;
|
||||
}
|
||||
.bottom-bar-right {
|
||||
display:block;
|
||||
float:right;
|
||||
padding-right:20px
|
||||
}
|
||||
.bottom-bar-center {
|
||||
width: 20%;
|
||||
position: absolute;
|
||||
left: 40%;
|
||||
text-align: center;
|
||||
}
|
||||
.bottom-bar-heart {
|
||||
top: 2px;
|
||||
}
|
||||
.bottom-bar-xwiki {
|
||||
top: 3px;
|
||||
}
|
||||
.bottom-bar-openpaas {
|
||||
top: 3px;
|
||||
max-width: 100px;
|
||||
}
|
||||
|
||||
|
||||
// form things
|
||||
|
||||
// MIXINS
|
||||
.bottom-left(@s: 5px) { border-bottom-left-radius: @s; }
|
||||
.bottom-left {
|
||||
.bottom-left;
|
||||
}
|
||||
|
||||
.top-left(@s: 5px) { border-top-left-radius: @s; }
|
||||
.top-left {
|
||||
.top-left;
|
||||
}
|
||||
|
||||
.remove {
|
||||
color: @cp-red;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
form.realtime {
|
||||
> input {
|
||||
&[type="text"] {
|
||||
|
||||
}
|
||||
}
|
||||
> textarea {
|
||||
width: 50%;
|
||||
height: 15vh;
|
||||
}
|
||||
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
tr {
|
||||
td {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
|
||||
div.text-cell {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
height: 100%;
|
||||
input {
|
||||
width: 80%;
|
||||
height: 100%;
|
||||
border: 0px;
|
||||
&[disabled] {
|
||||
background-color: transparent;
|
||||
color: @fore;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.checkbox-cell {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
|
||||
div.checkbox-contain {
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
|
||||
label {
|
||||
background-color: transparent;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
input {
|
||||
&[type="checkbox"] {
|
||||
&:not(.editable) {
|
||||
display: none;
|
||||
|
||||
~ .cover {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
|
||||
background-color: @cp-red;
|
||||
color: @base;
|
||||
&:after { content: "✖"; }
|
||||
|
||||
display: block;
|
||||
&.yes {
|
||||
background-color: @cp-green;
|
||||
&:after { content: "✔"; }
|
||||
}
|
||||
&.mine {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
input {
|
||||
&[type="text"] {
|
||||
height: 100%;
|
||||
width: 80%;
|
||||
border: 3px solid @base;
|
||||
}
|
||||
}
|
||||
.edit {
|
||||
color: @cp-green;
|
||||
cursor: pointer;
|
||||
width: 10%;
|
||||
font-size: 20px;
|
||||
&:after { content: '✐'; }
|
||||
&.editable { display: none; }
|
||||
}
|
||||
|
||||
thead {
|
||||
tr {
|
||||
th {
|
||||
input[type="text"][disabled] {
|
||||
background-color: transparent;
|
||||
color: @fore;
|
||||
font-weight: bold;
|
||||
}
|
||||
.remove {
|
||||
cursor: pointer;
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tbody {
|
||||
tr {
|
||||
td {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
tfoot {
|
||||
tr {
|
||||
td {
|
||||
text-align: center;
|
||||
.save {
|
||||
padding: 15px;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#adduser,
|
||||
#addoption {
|
||||
color: @cp-green;
|
||||
border: 1px solid @cp-green;
|
||||
padding: 15px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#adduser { .top-left; }
|
||||
#addoption { .bottom-left; }
|
||||
}
|
||||
|
||||
.viewportRatio (@x, @y, @p: 100) {
|
||||
width: @p * 100vw;
|
||||
height: @y * (@p * 100vw) / @x;
|
||||
max-width: @x / @y * (@p * 100vh);
|
||||
max-height: (@p * 100vh);
|
||||
}
|
||||
|
||||
div.modal, div#modal {
|
||||
|
||||
#content {
|
||||
box-sizing: border-box;
|
||||
.size (@n) {
|
||||
font-size: @n * 1vw;
|
||||
line-height: @n * 1.1vw;
|
||||
}
|
||||
|
||||
border: 1px solid white;
|
||||
|
||||
vertical-align: middle;
|
||||
padding: 2.5vw;
|
||||
|
||||
|
||||
width: 100vw;
|
||||
height: 56.25vw; // height:width ratio = 9/16 = .5625
|
||||
//background: pink;
|
||||
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); }
|
||||
|
||||
|
||||
pre > code {
|
||||
|
||||
display: block;
|
||||
position: relative;
|
||||
border: 1px solid #333;
|
||||
width: 90%;
|
||||
margin: auto;
|
||||
padding-left: .25vw;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
box-sizing: border-box;
|
||||
z-index: 9001;
|
||||
position: fixed;
|
||||
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
display: none;
|
||||
|
||||
background-color: @base;
|
||||
|
||||
.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; }
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
<!-- Piwik -->
|
||||
<script type="text/javascript">
|
||||
if (window.location.href.indexOf('cryptpad.fr') !== -1) {
|
||||
// This piwik is only relevant to cryptpad.fr
|
||||
var _paq = _paq || [];
|
||||
_paq.push(['trackPageView']);
|
||||
_paq.push(['enableLinkTracking']);
|
||||
(function() {
|
||||
var u="//piwik.xwiki.com/";
|
||||
_paq.push(['setTrackerUrl', u+'piwik.php']);
|
||||
_paq.push(['setSiteId', 12]);
|
||||
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
|
||||
g.type='text/javascript'; g.async=true; g.defer=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s);
|
||||
})();
|
||||
}
|
||||
</script>
|
||||
<!-- End Piwik Code -->
|
||||
|
@ -1,2 +0,0 @@
|
||||
<a href="https://github.com/xwiki-labs/cryptpad" class="github-corner" title="Star it, Fork it, or submit issues on Github!" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" style="position: absolute; top: 0; border: 0; right: 0;"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a><style>.github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}</style><!-- Thanks! http://tholman.com/github-corners/ -->
|
||||
|
@ -1,51 +0,0 @@
|
||||
<center>
|
||||
<img class="imgcenter cryptofist" src="/customize/cryptofist_small.png" />
|
||||
<h1>Unity is Strength - Collaboration is Key</h1>
|
||||
|
||||
</center>
|
||||
<p data-localization="main_p1"><!-- Zero Knowledge collaborative realtime editor. Protected from the NSA. --></p>
|
||||
|
||||
<p data-localization="main_p2"><!-- CkEditor, CodeMirror, Chainpad --></p>
|
||||
|
||||
<h2 id="howitworks" data-localization="main_howitworks"></h2>
|
||||
<p data-localization="main_howitworks_p1"><!-- Operational transform, Nakamoto blockchain, server kept unaware of the content--></p>
|
||||
|
||||
<h2 id="about-us" data-localization="main_about"></h2>
|
||||
|
||||
<p data-localization="main_about_p1"><!-- Privacy policy, terms of service --></p>
|
||||
<p data-localization="main_about_p2"><!-- Contact us--></p>
|
||||
|
||||
<center>
|
||||
<noscript>
|
||||
<p>
|
||||
<strong>OOPS</strong> In order to do encryption in your browser, Javascript is really <strong>really</strong> required.
|
||||
</p>
|
||||
<hr>
|
||||
<p>
|
||||
<strong>OUPS</strong> Afin de pouvoir réaliser le cryptage depuis votre navigateur, Javascript est <strong>vraiment</strong> requis.
|
||||
</p>
|
||||
</noscript>
|
||||
<h5 id="tryit" data-localization="tryIt"></h5>
|
||||
|
||||
<table class="recent scroll" style="display:none">
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<th data-localization="table_type"></th>
|
||||
<th data-localization="table_link"></th>
|
||||
<th data-localization="table_created"></th>
|
||||
<th data-localization="table_last"></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div id="buttons" class="buttons">
|
||||
<a id="create-pad" class="button create" href="/pad/" data-localization="button_newpad"></a>
|
||||
<a id="create-code" class="button create" href="/code/" data-localization="button_newcode"></a>
|
||||
<a id="create-poll" class="button create" href="/poll/" data-localization="button_newpoll"></a>
|
||||
<a id="create-slide" class="button create" href="/slide/" data-localization="button_newslide"></a>
|
||||
</div>
|
||||
</center>
|
||||
|
@ -1,34 +0,0 @@
|
||||
<center>
|
||||
<img class="imgcenter cryptofist" src="/customize/cryptofist_small.png" />
|
||||
<h1 data-localization="policy_title"></h1>
|
||||
</center>
|
||||
|
||||
<h2 data-localization="policy_whatweknow"></h2>
|
||||
<p data-localization="policy_whatweknow_p1"><!-- HTTP headers, IP address--></p>
|
||||
<p data-localization="policy_whatweknow_p2"><!-- Piwik --></p>
|
||||
<p>
|
||||
<strong data-localization="policy_whatweknow_p3"><!-- Piwik disabled in pads --></strong>
|
||||
</p>
|
||||
|
||||
<h2 data-localization="policy_howweuse"></h2>
|
||||
<p data-localization="policy_howweuse_p1"><!-- Referrer : promoting--></p>
|
||||
<p data-localization="policy_howweuse_p2"><!-- Browser : prioritizing new features--></p>
|
||||
|
||||
<h2 data-localization="policy_whatwetell"></h2>
|
||||
<p data-localization="policy_whatwetell_p1"></p>
|
||||
|
||||
<h2 data-localization="policy_links"></h2>
|
||||
<p data-localization="policy_links_p1"></p>
|
||||
|
||||
<h2 data-localization="policy_ads"></h2>
|
||||
<p data-localization="policy_ads_p1"></p>
|
||||
|
||||
<h2 data-localization="policy_choices"></h2>
|
||||
<p data-localization="policy_choices_open"></p>
|
||||
<p data-localization="policy_choices_vpn"></p>
|
||||
<p data-localization="policy_choices_ads"></p>
|
||||
|
||||
<br />
|
||||
|
||||
|
||||
|
@ -1,11 +0,0 @@
|
||||
<center>
|
||||
<img class="imgcenter cryptofist" src="/customize/cryptofist_small.png" />
|
||||
<h1 data-localization="tos_title"></h1>
|
||||
</center>
|
||||
|
||||
<p data-localization="tos_legal"></p>
|
||||
<p data-localization="tos_availability"></p>
|
||||
<p data-localization="tos_e2ee"></p>
|
||||
<p data-localization="tos_logs"></p>
|
||||
<p data-localization="tos_3rdparties"></p>
|
||||
|
@ -0,0 +1,91 @@
|
||||
/* Bottom Bar */
|
||||
|
||||
.top-bar, .bottom-bar {
|
||||
position:fixed;
|
||||
height:4%;
|
||||
height: 2.5em;
|
||||
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
background: @base;
|
||||
border-top: 1px solid @cp-outline;
|
||||
|
||||
a {
|
||||
color: @cp-green;
|
||||
text-decoration: none;
|
||||
}
|
||||
p {
|
||||
margin: -1px;
|
||||
font-family: Arial, Helvetica, Tahoma, Verdana, sans-serif;
|
||||
|
||||
font-size: 20px;
|
||||
display:block;
|
||||
margin-left: 10px;
|
||||
padding-top:3px;
|
||||
color: @fore;
|
||||
}
|
||||
img {
|
||||
margin-right: 4px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.big {
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
display: none;
|
||||
}
|
||||
@media screen and (min-width: @media-not-small) {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
.small {
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
display: inline-block;
|
||||
}
|
||||
@media screen and (min-width: @media-not-small) {
|
||||
display: none;
|
||||
}
|
||||
img {
|
||||
height: 1.25em;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
.bottom-bar {
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
.top-bar {
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.bottom-bar-left {
|
||||
display:block;
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
}
|
||||
.bottom-bar-left p {
|
||||
float: right;
|
||||
}
|
||||
.bottom-bar-right {
|
||||
display:block;
|
||||
float:right;
|
||||
padding-right:20px
|
||||
}
|
||||
.bottom-bar-center {
|
||||
width: 20%;
|
||||
position: absolute;
|
||||
left: 40%;
|
||||
text-align: center;
|
||||
}
|
||||
.bottom-bar-heart {
|
||||
top: 2px;
|
||||
}
|
||||
.bottom-bar-xwiki {
|
||||
top: 3px;
|
||||
}
|
||||
.bottom-bar-openpaas {
|
||||
top: 3px;
|
||||
max-width: 100px;
|
||||
}
|
||||
|
@ -0,0 +1,675 @@
|
||||
@import "./variables.less";
|
||||
@import "./mixins.less";
|
||||
|
||||
@import "./alertify.less";
|
||||
@import "./bar.less";
|
||||
@import "./loading.less";
|
||||
@import "./dropdown.less";
|
||||
@import "./topbar.less";
|
||||
@import "./footer.less";
|
||||
|
||||
@toolbar-green: #5cb85c;
|
||||
|
||||
html.cp, .cp body {
|
||||
font-size: .875em;
|
||||
background-color: @page-white; //@base;
|
||||
color: @fore;
|
||||
|
||||
height: 100%;
|
||||
}
|
||||
.fa {
|
||||
cursor: default; // Fix for Edge displaying the text cursor on every icon
|
||||
}
|
||||
|
||||
.cp {
|
||||
|
||||
// override bootstrap colors
|
||||
.btn-primary {
|
||||
background-color: @cp-blue;
|
||||
&:hover {
|
||||
color: #fff;
|
||||
background-color: #025aa5;
|
||||
border-color: #01549b;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 1rem;
|
||||
font-weight: 400;
|
||||
line-height: 2rem;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
a.github-corner > svg {
|
||||
fill: @cp-blue;
|
||||
color: @old-base;
|
||||
}
|
||||
|
||||
.lato {
|
||||
font-family: lato, Helvetica, sans-serif;
|
||||
font-size: 1.02em;
|
||||
}
|
||||
|
||||
.unselectable {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: @fore;
|
||||
|
||||
font-family: "Source Sans Pro","Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
-webkit-font-feature-settings: 'dlig' 1,'liga' 1,'lnum' 1,'kern' 1;
|
||||
-moz-font-feature-settings: 'dlig' 1,'liga' 1,'lnum' 1,'kern' 1;
|
||||
font-feature-settings: 'dlig' 1,'liga' 1,'lnum' 1,'kern' 1;
|
||||
font-style: normal;
|
||||
font-weight: 600;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
h1 {
|
||||
line-height: 3rem;
|
||||
font-size: 2.05714rem;
|
||||
margin-bottom: .21999rem;
|
||||
padding-top: .78001rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.95312rem;
|
||||
margin-bottom: .18358rem;
|
||||
padding-top: .81642rem;
|
||||
}
|
||||
|
||||
h2,h3 {
|
||||
line-height: 3rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.64571rem;
|
||||
margin-bottom: .07599rem;
|
||||
padding-top: .92401rem;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 1.5625rem;
|
||||
margin-bottom: .54686rem;
|
||||
padding-top: .45314rem;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1.25rem;
|
||||
margin-bottom: -.56251rem;
|
||||
padding-top: .56251rem;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 1rem;
|
||||
margin-bottom: -.65001rem;
|
||||
padding-top: .65001rem;
|
||||
}
|
||||
|
||||
p {
|
||||
a:not(.btn) {
|
||||
cursor: pointer;
|
||||
color: @cp-link;
|
||||
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
color: @cp-link-hover;
|
||||
}
|
||||
&:visited {
|
||||
color: @cp-link-visited;
|
||||
}
|
||||
}
|
||||
}
|
||||
a.btn {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
img {
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
p {
|
||||
padding-top: .66001rem;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
p,pre {
|
||||
margin-bottom: 1.33999rem;
|
||||
}
|
||||
|
||||
p, pre, td, a, table, tr {
|
||||
.lato;
|
||||
}
|
||||
|
||||
body.html {
|
||||
display:flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
|
||||
// Main page
|
||||
.page {
|
||||
width: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
background: @page-white;
|
||||
padding: 10px 0;//@main-border-width;
|
||||
position: relative;
|
||||
|
||||
.info-container {
|
||||
color: #121212;
|
||||
width: 800px;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
&>div{
|
||||
padding: 10px;
|
||||
width: 400px;
|
||||
max-width: 100%;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
&:not(.image) {
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
width: 100%;
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
&.image {
|
||||
width:300px;
|
||||
text-align: center;
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.first {
|
||||
//margin-top: ~"min(calc(100vh - 150px), 650px)";
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
//margin-top: 0;
|
||||
}
|
||||
}
|
||||
&.even {
|
||||
//background: darken(@base, 1%);
|
||||
}
|
||||
&.category {
|
||||
background: @category-bg;
|
||||
}
|
||||
|
||||
.app {
|
||||
display: inline-block;
|
||||
width: 300px;
|
||||
vertical-align: middle;
|
||||
margin: 0px 25px;
|
||||
white-space: normal;
|
||||
max-width: ~"calc(50% - 50px)";
|
||||
@media screen and (max-width: 500px) {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
.app-container {
|
||||
width: 1400px;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
.app-row {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-flow: row wrap;
|
||||
max-width: 100%;
|
||||
margin: 0 auto;
|
||||
@media screen and (max-width: 1399px) {
|
||||
display: flex;
|
||||
}
|
||||
img {
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.left {
|
||||
//left: 10%; //@main-border-width;
|
||||
}
|
||||
.right {
|
||||
left: 100px; //@main-border-width;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
padding: 10px 5vh;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 18px;
|
||||
//text-align: justify;
|
||||
}
|
||||
}
|
||||
|
||||
.btn-default {
|
||||
&:hover {
|
||||
background-color: #d8d8d8;
|
||||
}
|
||||
}
|
||||
|
||||
#main {
|
||||
.mainOverlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #000;
|
||||
opacity: 0.35;
|
||||
}
|
||||
}
|
||||
noscript {
|
||||
#noscriptContainer {
|
||||
color: black;
|
||||
position: absolute;
|
||||
top: @topbar-height;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
z-index: 2;
|
||||
#noscript {
|
||||
width: 1000px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
position: relative;
|
||||
font-size: 25px;
|
||||
text-align: center;
|
||||
color: @main-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
#main {
|
||||
background: @main-bg;
|
||||
background-size: cover;
|
||||
background-attachment: fixed;
|
||||
background-position: center;
|
||||
height: ~"calc(100vh - 115px)";
|
||||
min-height: 450px;
|
||||
.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
#main_other {
|
||||
padding: 0 @main-border-width;
|
||||
background-color: @page-white;
|
||||
}
|
||||
|
||||
.category {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
#mainBlock {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
#main, #main_other {
|
||||
position: relative;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin: auto;
|
||||
z-index: 1;
|
||||
|
||||
font-size: medium;
|
||||
|
||||
#align-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
width: 1000px;
|
||||
max-width: 90%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#main-container {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#userForm .extra {
|
||||
p {
|
||||
font-size: 28px;
|
||||
padding: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
#data {
|
||||
p {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-size: 28px;
|
||||
line-height: 1.5em;
|
||||
&.register-explanation {
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
h1, h2 {
|
||||
font-weight: normal;
|
||||
font-size: 48px;
|
||||
line-height: 1.2em;
|
||||
color: @main-color;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 1em;
|
||||
color: @main-color;
|
||||
}
|
||||
width: 600px;
|
||||
max-width: 60%;
|
||||
color: @main-color;
|
||||
padding: 0 15px;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
|
||||
#tryit {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
#loggedIn {
|
||||
float: right;
|
||||
color: @main-color;
|
||||
display: inline-block;
|
||||
width: 350px;
|
||||
max-width: 35%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
button {
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
}
|
||||
p {
|
||||
margin: 20px;
|
||||
padding: 0;
|
||||
font-size: 20px;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#userForm {
|
||||
float: right;
|
||||
display: inline-block;
|
||||
width: 400px;
|
||||
max-width: 40%;
|
||||
padding: 10px;
|
||||
box-sizing: border-box;
|
||||
font-family: lato, Helvetica, sans-serif;
|
||||
color: @main-color;
|
||||
|
||||
label {
|
||||
margin-bottom: 0;
|
||||
margin-left: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
button {
|
||||
font-weight: bold;
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
&.half {
|
||||
width: ~"calc(50% - 10px)";
|
||||
&:not(.first) {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
&.buttons {
|
||||
margin-bottom: 10px;
|
||||
.dropdown-bar {
|
||||
button {
|
||||
white-space: normal;
|
||||
text-align: left;
|
||||
.fa {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
a {
|
||||
color: black;
|
||||
&:hover, :visited {
|
||||
color: black !important;
|
||||
}
|
||||
}
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
&.separator {
|
||||
margin: 5px 0 15px 0;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
a {
|
||||
color: @main-color;
|
||||
font-weight:bold;
|
||||
font-size: 14px;
|
||||
&:hover, :visited {
|
||||
color: @main-color !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.driveLink {
|
||||
padding-left: 1rem; //Bootstrap padding in buttons
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
&> * {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
#align-container {
|
||||
transform: initial;
|
||||
position: relative;
|
||||
display: block;
|
||||
width: 90%;
|
||||
left: 0;
|
||||
}
|
||||
#main-container {
|
||||
position: relative;
|
||||
transform: unset;
|
||||
top:0;
|
||||
|
||||
}
|
||||
#data {
|
||||
text-align: center;
|
||||
}
|
||||
#userForm, #loggedIn, #data {
|
||||
transform: initial;
|
||||
position: relative;
|
||||
display: block;
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
margin: 10px 0;
|
||||
box-sizing: border-box;
|
||||
float: none;
|
||||
}
|
||||
#userForm, #loggedIn {
|
||||
//border: 1px solid #888;
|
||||
}
|
||||
position: relative;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.buttons {
|
||||
margin-top: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
/* buttons */
|
||||
|
||||
.create, .action {
|
||||
display: inline-block;
|
||||
@thick: 2px;
|
||||
border: 0;
|
||||
background-color: @cp-darkblue;
|
||||
color: @topbar-button-color;
|
||||
|
||||
font-weight: bold;
|
||||
font-size: large;
|
||||
margin-right: 5px;
|
||||
margin-left: 5px;
|
||||
&:hover {
|
||||
color: darken(@topbar-button-color, 20%);
|
||||
}
|
||||
}
|
||||
|
||||
// currently only used in /user/
|
||||
.panel {
|
||||
background-color: @dark-base;
|
||||
}
|
||||
|
||||
/* Tables
|
||||
* Currently only used by /poll/
|
||||
*/
|
||||
|
||||
// form things
|
||||
.bottom-left {
|
||||
.bottom-left;
|
||||
}
|
||||
|
||||
.top-left {
|
||||
.top-left;
|
||||
}
|
||||
|
||||
.remove {
|
||||
color: @cp-red;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Pin limit */
|
||||
.limit-container {
|
||||
display: inline-flex;
|
||||
flex-flow: column-reverse;
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
.cryptpad-limit-bar {
|
||||
display: inline-block;
|
||||
max-width: 40vw;
|
||||
margin: 3px;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #999;
|
||||
background: white;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
width: ~"calc(100% - 6px)";
|
||||
height: 25px;
|
||||
line-height: 25px;
|
||||
.usage {
|
||||
height: 100%;
|
||||
display: inline-block;
|
||||
background: blue;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
z-index:1;
|
||||
&.normal {
|
||||
background: @toolbar-green;
|
||||
}
|
||||
&.warning {
|
||||
background: orange;
|
||||
}
|
||||
&.above {
|
||||
background: red;
|
||||
}
|
||||
}
|
||||
.usageText {
|
||||
position: relative;
|
||||
color: black;
|
||||
text-shadow: 1px 0 2px white, 0 1px 2px white, -1px 0 2px white, 0 -1px 2px white;
|
||||
z-index: 2;
|
||||
font-size: @main-font-size;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.upgrade {
|
||||
padding: 0;
|
||||
line-height: 25px;
|
||||
height: 25px;
|
||||
margin: 0 3px;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Upload status table */
|
||||
#uploadStatusContainer {
|
||||
position: absolute;
|
||||
left: 10vw; right: 10vw;
|
||||
bottom: 100px;
|
||||
background-color: rgba(0,0,0,0.5);
|
||||
color: white;
|
||||
opacity: 0.7;
|
||||
box-sizing: border-box;
|
||||
z-index:10000;
|
||||
display: none;
|
||||
font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
||||
#uploadStatus {
|
||||
width: 80vw;
|
||||
border: 1px solid black;
|
||||
border-collapse: collapse;
|
||||
tr:nth-child(1) {
|
||||
background-color: #888;
|
||||
border: 1px solid #999;
|
||||
td { text-align: center; }
|
||||
}
|
||||
td {
|
||||
border-left: 1px solid #BBB;
|
||||
border-right: 1px solid #BBB;
|
||||
padding: 0 10px;
|
||||
}
|
||||
.upProgress {
|
||||
width: 200px;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.progressContainer {
|
||||
position: absolute;
|
||||
width: 0px;
|
||||
left: 5px;
|
||||
top: 1px; bottom: 1px;
|
||||
background-color: rgba(0,0,255,0.3);
|
||||
}
|
||||
.upCancel { text-align: center; }
|
||||
.fa.cancel {
|
||||
color: rgb(255, 0, 115);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// hack for our cross-origin iframe
|
||||
#cors-store {
|
||||
display: none;
|
||||
}
|
@ -0,0 +1,114 @@
|
||||
|
||||
/* The container <div> - needed to position the dropdown content */
|
||||
.dropdown-bar {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
|
||||
.dropbtn {
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.dropbtn {
|
||||
}
|
||||
}
|
||||
|
||||
.fa {
|
||||
font-family: FontAwesome;
|
||||
}
|
||||
|
||||
button {
|
||||
.fa-caret-down{
|
||||
margin-right: 0px;
|
||||
margin-left: 5px;
|
||||
}
|
||||
* {
|
||||
.unselectable();
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
.dropdown-bar-content {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: @dropdown-bg;
|
||||
min-width: 250px;
|
||||
box-shadow: 0px 1px 5px 0px rgba(0, 0, 0, 0.2);
|
||||
z-index: 1000;
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
||||
font-size: 16px;
|
||||
line-height: 1em;
|
||||
|
||||
&.left {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
display: block;
|
||||
}
|
||||
|
||||
a {
|
||||
color: @dropdown-color;
|
||||
padding: 5px 16px;
|
||||
text-decoration: none;
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
float: none;
|
||||
text-align: left;
|
||||
font: @dropdown-font;
|
||||
line-height: 1em;
|
||||
|
||||
|
||||
.fa {
|
||||
width: 20px;
|
||||
text-align: center;
|
||||
margin-right: 5px !important;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: @dropdown-bg-hover;
|
||||
color: @dropdown-color;
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-color: @dropdown-bg-active;
|
||||
color: @dropdown-color;
|
||||
}
|
||||
}
|
||||
|
||||
hr {
|
||||
margin: 5px 0px;
|
||||
height: 1px;
|
||||
background: #bbb;
|
||||
}
|
||||
|
||||
p {
|
||||
min-width: 160px;
|
||||
padding: 5px;
|
||||
margin: 0;
|
||||
white-space: normal;
|
||||
text-align: left;
|
||||
color: black;
|
||||
font-size: 14px;
|
||||
* {
|
||||
font-size: 14px;
|
||||
}
|
||||
h2 {
|
||||
color: black;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
background-color: #EEEEEE;
|
||||
padding: 5px 0px;
|
||||
margin: 5px 0px;
|
||||
font-size: 16px;
|
||||
white-space: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,29 @@
|
||||
@import "./variables.less";
|
||||
|
||||
.cp footer {
|
||||
background: @category-bg;
|
||||
font-family: -apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
|
||||
padding-top: 1em;
|
||||
font-size: 1.2em;
|
||||
a {
|
||||
color: @cp-link;
|
||||
&:visited {
|
||||
color: @cp-link-visited;
|
||||
}
|
||||
&:hover {
|
||||
color: @cp-link-hover;
|
||||
}
|
||||
}
|
||||
li.title {
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
}
|
||||
div.version-footer {
|
||||
background-color: @old-base;
|
||||
color: @old-fore;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
padding-top: 10px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
@import "./variables.less";
|
||||
|
||||
.cp #loading {
|
||||
position: fixed;
|
||||
z-index: 9999;
|
||||
top: 0px;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
background: @bg-loading;
|
||||
color: @color-loading;
|
||||
text-align: center;
|
||||
font-size: 1.5em;
|
||||
.loadingContainer {
|
||||
margin-top: 50vh;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
.cryptofist {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
height: 300px;
|
||||
@media screen and (max-height: @media-short-screen) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.spinnerContainer {
|
||||
position: relative;
|
||||
height: 100px;
|
||||
> div {
|
||||
height: 100px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.cp #loadingTip {
|
||||
position: fixed;
|
||||
z-index: 99999;
|
||||
top: 80%;
|
||||
left: 0;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
|
||||
transition: opacity 750ms;
|
||||
transition-delay: 3000ms;
|
||||
@media screen and (max-height: @media-medium-screen) {
|
||||
display: none;
|
||||
}
|
||||
span {
|
||||
background-color: @bg-loading;
|
||||
color: @color-loading;
|
||||
text-align: center;
|
||||
font-size: 1.5em;
|
||||
opacity: 0.7;
|
||||
font-family: lato, Helvetica, sans-serif;
|
||||
padding: 15px;
|
||||
max-width: 60%;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
@ -0,0 +1,140 @@
|
||||
@import "/customize/src/less/variables.less";
|
||||
|
||||
.fontface(@family, @src, @style: normal, @weight: 400, @fmt: 'truetype'){
|
||||
@font-face {
|
||||
font-family: @family;
|
||||
src: url(@src) format(@fmt);
|
||||
font-weight: @weight;
|
||||
font-style: @style;
|
||||
}
|
||||
}
|
||||
|
||||
.transform(...) {
|
||||
-webkit-transform: @arguments;
|
||||
-moz-transform: @arguments;
|
||||
-o-transform: @arguments;
|
||||
-ms-transform: @arguments;
|
||||
transform: @arguments;
|
||||
}
|
||||
|
||||
.translate(@x:0, @y:0) {
|
||||
.transform(translate(@x, @y));
|
||||
}
|
||||
|
||||
.bottom-left(@s: 5px) { border-bottom-left-radius: @s; }
|
||||
.top-left(@s: 5px) { border-top-left-radius: @s; }
|
||||
|
||||
.size (@n) {
|
||||
// font-size: @n * 1vmin;
|
||||
// line-height: @n * 1.1vmin;
|
||||
font-size: @n * 10%;
|
||||
// line-height: @n * 11%;
|
||||
line-height: 110%;
|
||||
}
|
||||
|
||||
.two-part-gradient (@start, @end) {
|
||||
background: -webkit-linear-gradient(@start, @end); /* For Safari 5.1 to 6.0 */
|
||||
background: -o-linear-gradient(@start, @end); /* For Opera 11.1 to 12.0 */
|
||||
background: -moz-linear-gradient(@start, @end); /* For Firefox 3.6 to 15 */
|
||||
background: linear-gradient(@start, @end); /* Standard syntax */
|
||||
}
|
||||
|
||||
.placeholderColor (@color) {
|
||||
&::-webkit-input-placeholder { /* WebKit, Blink, Edge */
|
||||
color: @color;;
|
||||
}
|
||||
&:-moz-placeholder { /* Mozilla Firefox 4 to 18 */
|
||||
color: @color;
|
||||
opacity: 1;
|
||||
}
|
||||
&::-moz-placeholder { /* Mozilla Firefox 19+ */
|
||||
color: @color;
|
||||
opacity: 1;
|
||||
}
|
||||
&:-ms-input-placeholder { /* Internet Explorer 10-11 */
|
||||
color: @color;
|
||||
}
|
||||
&::-ms-input-placeholder { /* Microsoft Edge */
|
||||
color: @color;
|
||||
}
|
||||
}
|
||||
|
||||
.avatar (@width) {
|
||||
&.avatar {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
font-size: 16px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
&.clickable {
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
background-color: rgba(0,0,0,0.3);
|
||||
}
|
||||
}
|
||||
.default, media-tag {
|
||||
display: inline-flex;
|
||||
width: @width;
|
||||
height: @width;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
box-sizing: content-box;
|
||||
}
|
||||
.default {
|
||||
.unselectable();
|
||||
background: white;
|
||||
color: black;
|
||||
font-size: @width/1.2;
|
||||
}
|
||||
.right-col {
|
||||
order: 10;
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
.name {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.friend {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
media-tag {
|
||||
min-height: @width;
|
||||
min-width: @width;
|
||||
max-height: @width;
|
||||
max-width: @width;
|
||||
img {
|
||||
min-width: 100%;
|
||||
min-height: 100%;
|
||||
max-width: none;
|
||||
max-height: none; // To override 'media-tag img' in slide.less
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.leftsideCategory {
|
||||
.unselectable();
|
||||
padding: 5px 20px;
|
||||
margin: 15px 0;
|
||||
cursor: pointer;
|
||||
height: @toolbar-line-height;
|
||||
line-height: @toolbar-line-height - 10px;
|
||||
.fa {
|
||||
width: 25px;
|
||||
}
|
||||
&:hover {
|
||||
background: rgba(0,0,0,0.05);
|
||||
}
|
||||
&.active {
|
||||
background: white;
|
||||
}
|
||||
}
|
@ -0,0 +1,97 @@
|
||||
@import '/customize/src/less/variables.less';
|
||||
@import '/customize/src/less/mixins.less';
|
||||
|
||||
@leftside-bg: #eee;
|
||||
@leftside-color: #000;
|
||||
@rightside-color: #000;
|
||||
@description-color: #777;
|
||||
|
||||
@button-width: 400px;
|
||||
@button-bg: #3066e5;
|
||||
@button-alt-bg: #fff;
|
||||
@button-red-bg: #e54e4e;
|
||||
|
||||
|
||||
.cp {
|
||||
input[type="text"] {
|
||||
padding-left: 10px;
|
||||
}
|
||||
#container {
|
||||
font-size: 16px;
|
||||
display: flex;
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
#leftSide {
|
||||
color: @leftside-color;
|
||||
width: 250px;
|
||||
background: @leftside-bg;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
.categories {
|
||||
flex: 1;
|
||||
.category {
|
||||
.leftsideCategory();
|
||||
}
|
||||
}
|
||||
}
|
||||
#rightSide {
|
||||
flex: 1;
|
||||
padding: 5px 20px;
|
||||
color: @rightside-color;
|
||||
overflow: auto;
|
||||
.element {
|
||||
label:not(.noTitle), .label {
|
||||
display: block;
|
||||
font-weight: bold;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.description {
|
||||
display: block;
|
||||
color: @description-color;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
[type="text"], button {
|
||||
vertical-align: middle;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.inputBlock {
|
||||
display: inline-flex;
|
||||
width: @button-width;
|
||||
input {
|
||||
flex: 1;
|
||||
border-radius: 0.25em 0 0 0.25em;
|
||||
border: 1px solid #adadad;
|
||||
border-right: 0px;
|
||||
}
|
||||
button {
|
||||
border-radius: 0 0.25em 0.25em 0;
|
||||
//border: 1px solid #adadad;
|
||||
border-left: 0px;
|
||||
}
|
||||
}
|
||||
button.btn {
|
||||
background-color: @button-bg;
|
||||
border-color: darken(@button-bg, 10%);
|
||||
color: white;
|
||||
&:hover {
|
||||
background-color: darken(@button-bg, 10%);
|
||||
}
|
||||
&.btn-danger {
|
||||
background-color: @button-red-bg;
|
||||
border-color: darken(@button-red-bg, 10%);
|
||||
color: white;
|
||||
&:hover {
|
||||
background-color: darken(@button-red-bg, 10%);
|
||||
}
|
||||
}
|
||||
}
|
||||
&>div {
|
||||
margin: 10px 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,95 @@
|
||||
@import "./variables.less";
|
||||
|
||||
#cryptpadTopBar {
|
||||
background: @topbar-back;
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: @topbar-height;
|
||||
color: @topbar-color;
|
||||
font-family: "Source Sans Pro", "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||
padding: 5px;
|
||||
box-sizing: border-box;
|
||||
font-size: 30px;
|
||||
|
||||
border-bottom: 1px solid darken(@topbar-back, 15%);
|
||||
|
||||
&> span {
|
||||
vertical-align: middle;
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
}
|
||||
.cryptpad-logo {
|
||||
height: 40px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.slogan {
|
||||
font-size: 20px;
|
||||
color: @topbar-color;
|
||||
line-height: 40px;
|
||||
}
|
||||
|
||||
.gotoMain {
|
||||
color: @topbar-color;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
&:hover {
|
||||
text-decoration: none;
|
||||
color: @cp-purple;
|
||||
}
|
||||
}
|
||||
|
||||
.right {
|
||||
float: right;
|
||||
font-size: 20px;
|
||||
margin: 0px 10px;
|
||||
line-height: 40px;
|
||||
|
||||
.buttonSuccess {
|
||||
// Bootstrap 4 colors
|
||||
color: #fff;
|
||||
background: @toolbar-green;
|
||||
border-color: @toolbar-green;
|
||||
&:hover {
|
||||
color: #fff;
|
||||
background: #449d44;
|
||||
border: 1px solid #419641;
|
||||
}
|
||||
span {
|
||||
color: #fff;
|
||||
}
|
||||
.large {
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
button {
|
||||
.buttonTitle {
|
||||
.fa-user {
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
&.link a {
|
||||
font-weight: 500;
|
||||
font-size: 0.75em;
|
||||
color: @cp-link;
|
||||
|
||||
&:hover {
|
||||
color: @cp-link-hover;
|
||||
text-decoration: underline;
|
||||
}
|
||||
&:visited {
|
||||
color: @cp-link-visited;
|
||||
}
|
||||
}
|
||||
|
||||
&.link {
|
||||
@media screen and (max-width: @media-not-big) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,139 @@
|
||||
@base: #fff; //#f5f5f5;
|
||||
@dark-base: darken(@base, 20%);
|
||||
@less-dark-base: darken(@base, 10%);
|
||||
@light-base: lighten(@base, 20%);
|
||||
@less-light-base: lighten(@base, 10%);
|
||||
@fore: #555;
|
||||
@old-base: #302B28;
|
||||
@old-fore: #fafafa;
|
||||
|
||||
@main-font-size: 16px;
|
||||
|
||||
@cp-green: #46E981;
|
||||
@cp-accent: lighten(@cp-green, 20%);
|
||||
|
||||
//@cp-red: #FF0073; // remove red
|
||||
@cp-red: #FA5858; // remove red
|
||||
@cp-outline: #444;
|
||||
|
||||
@cp-orange: #FE9A2E;
|
||||
|
||||
@cp-blue: #00CFC1;
|
||||
@cp-blue: #00ADEE;
|
||||
@cp-light-blue: #41b7d8; // lighten(@cp-blue, 20%);
|
||||
|
||||
@cp-purple: #558;
|
||||
|
||||
@page-white: #fafafa;
|
||||
|
||||
// links
|
||||
@cp-link: @cp-light-blue;
|
||||
@cp-link-visited: @cp-light-blue;
|
||||
@cp-link-hover: darken(@cp-light-blue, 10%);
|
||||
|
||||
// alertify things
|
||||
|
||||
@box-shadow: 0 2px 5px 0 rgba(0,0,0,.2);
|
||||
@padding-base: 12px;
|
||||
|
||||
@success-color: @cp-green;
|
||||
@success-fore: @base;
|
||||
@danger-color: @cp-red;
|
||||
|
||||
@text-color: rgba(0, 0, 0, .8);
|
||||
@border-radius: 1px;
|
||||
|
||||
@alertify-fore: @old-fore;
|
||||
@alertify-base: @old-base;
|
||||
|
||||
@alertify-dialog-bg: #444;
|
||||
@alertify-dialog-fg: @old-fore;
|
||||
|
||||
@alertify-btn-fg: @old-fore;
|
||||
|
||||
@alertify-btn-bg: rgba(200, 200, 200, 0.05);
|
||||
@alertify-btn-bg-hover: rgba(200, 200, 200, .15);
|
||||
|
||||
@alertify-bg: rgba(0, 0, 0, .3);
|
||||
@alertify-fg: @old-fore;
|
||||
|
||||
@alertify-input-bg: @old-base;
|
||||
@alertify-input-fg: @old-fore;
|
||||
|
||||
@slide-default-bg: #000;
|
||||
|
||||
@bg-loading: @old-base;
|
||||
@color-loading: @old-fore;
|
||||
|
||||
@media-not-big: 800px;
|
||||
@media-not-small: 801px;
|
||||
|
||||
@media-short-screen: 450px;
|
||||
@media-narrow-screen: 400px;
|
||||
@media-medium-screen: 600px;
|
||||
|
||||
|
||||
// Dropdown
|
||||
|
||||
@dropdown-font: @main-font-size -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
@dropdown-bg: #f9f9f9;
|
||||
@dropdown-color: black;
|
||||
@dropdown-bg-hover: #f1f1f1;
|
||||
@dropdown-bg-active: #e8e8e8;
|
||||
|
||||
// Toolbar
|
||||
|
||||
@toolbar-button-font: @dropdown-font;
|
||||
|
||||
@toolbar-pad-bg: #1c4fa0;
|
||||
@toolbar-pad-color: #fff;
|
||||
@toolbar-slide-bg: #e57614;
|
||||
@toolbar-slide-color: #fff;
|
||||
@toolbar-code-bg: #ffae00;
|
||||
@toolbar-code-color: #000;
|
||||
@toolbar-poll-bg: #006304;
|
||||
@toolbar-poll-color: #fff;
|
||||
@toolbar-whiteboard-bg: #800080;
|
||||
@toolbar-whiteboard-color: #fff;
|
||||
@toolbar-drive-bg: #0087ff;
|
||||
@toolbar-drive-color: #fff;
|
||||
@toolbar-file-bg: #cd2532;
|
||||
@toolbar-file-color: #fff;
|
||||
@toolbar-friends-bg: #607B8D;
|
||||
@toolbar-friends-color: #fff;
|
||||
@toolbar-default-bg: #ddd;
|
||||
@toolbar-default-color: #000;
|
||||
@toolbar-settings-bg: #0087ff;
|
||||
@toolbar-settings-color: #fff;
|
||||
@toolbar-profile-bg: #0087ff;
|
||||
@toolbar-profile-color: #fff;
|
||||
|
||||
|
||||
@topbar-back: #fff;
|
||||
@topbar-color: #000;
|
||||
@topbar-button-bg: #2E9AFE;
|
||||
@topbar-button-color: #fff;
|
||||
@topbar-height: 50px;
|
||||
|
||||
@toolbar-top-height: 64px;
|
||||
|
||||
@main-border-width: 15vw;
|
||||
@cp-darkblue: #3333ff;
|
||||
@cp-accent2: darken(@cp-darkblue, 20%);
|
||||
|
||||
@main-block-bg: rgba(200, 200, 200, 0.3);
|
||||
@main-color: #fff;
|
||||
@main-bg: url('/customize/bg3.jpg') no-repeat center center;
|
||||
|
||||
@category-bg: #f4f4f4;
|
||||
|
||||
.unselectable () {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
@toolbar-line-height: 32px;
|
@ -1,315 +0,0 @@
|
||||
@import "./variables.less";
|
||||
|
||||
.unselectable {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.cryptpad-toolbar {
|
||||
box-sizing: border-box;
|
||||
|
||||
.unselectable;
|
||||
|
||||
font: normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;
|
||||
color: #000;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
z-index: 9001;
|
||||
|
||||
a {
|
||||
float: right;
|
||||
}
|
||||
|
||||
div {
|
||||
white-space: normal;
|
||||
&.cryptpad-back {
|
||||
padding: 0;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
color: #000;
|
||||
}
|
||||
&.cryptpad-lag {
|
||||
float: left;
|
||||
line-height: 26px;
|
||||
margin: 2px 0px;
|
||||
}
|
||||
}
|
||||
|
||||
button, select, .rightside-element {
|
||||
height: 26px;
|
||||
padding-right: 5px;
|
||||
padding-left: 5px;
|
||||
margin: 2px;
|
||||
}
|
||||
|
||||
button {
|
||||
background-color: inherit;
|
||||
background-image: linear-gradient(to bottom,#fff,#e4e4e4);
|
||||
border: 1px solid #A6A6A6;
|
||||
border-bottom-color: #979797;
|
||||
border-radius: 3px;
|
||||
&:hover {
|
||||
background-image:linear-gradient(to bottom,#f2f2f2,#ccc);
|
||||
}
|
||||
&.userlist {
|
||||
@media screen and (max-width: 800px) {
|
||||
display: none;
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
display: inline-block;
|
||||
}
|
||||
&.small {
|
||||
@media screen and (max-width: 800px) {
|
||||
display: inline-block;
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cryptpad-state {
|
||||
line-height: 30px; /* equivalent to 26px + 2*2px margin used for buttons */
|
||||
}
|
||||
|
||||
.rightside-button {
|
||||
float: right;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.leftside-button {
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.rightside-element {
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
&.float {
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
|
||||
select {
|
||||
border: 0px;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
padding-left: 5px;
|
||||
border: 1px solid #A6A6A6;
|
||||
border-bottom-color: #979797;
|
||||
}
|
||||
}
|
||||
|
||||
.cryptpad-toolbar-top {
|
||||
display: block;
|
||||
text-align: center;
|
||||
height: 32px;
|
||||
position: relative;
|
||||
@media screen and (max-width: 400px) {
|
||||
height: 67px;
|
||||
}
|
||||
.cryptpad-title {
|
||||
.title, .pencilIcon {
|
||||
font-size: 1.5em;
|
||||
vertical-align: middle;
|
||||
line-height: 32px;
|
||||
}
|
||||
.pencilIcon {
|
||||
display: none;
|
||||
&:hover {
|
||||
color: #999;
|
||||
}
|
||||
span {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
&:not(input):hover {
|
||||
.editable {
|
||||
border: 1px solid #888;
|
||||
border-radius: 2px 0px 0px 2px;
|
||||
background: white;
|
||||
padding: 5px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.pencilIcon {
|
||||
cursor: pointer;
|
||||
border: 1px solid #888;
|
||||
border-radius: 0px 2px 2px 0px;
|
||||
background: white;
|
||||
padding: 5px;
|
||||
display: inline;
|
||||
margin-left: -1px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
}
|
||||
input {
|
||||
font-size: 1.5em;
|
||||
vertical-align: middle;
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid black;
|
||||
background: #fff;
|
||||
cursor: auto;
|
||||
width: 300px;
|
||||
padding: 0px 5px;
|
||||
}
|
||||
}
|
||||
.cryptpad-link {
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
height: 32px;
|
||||
@media screen and (max-width: 400px) {
|
||||
top: 35px;
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
a.cryptpad-logo {
|
||||
cursor: pointer;
|
||||
height: 32px;
|
||||
padding: 0px 5px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
&:hover {
|
||||
span {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
img {
|
||||
vertical-align: middle;
|
||||
height: 32px;
|
||||
cursor: pointer;
|
||||
}
|
||||
span {
|
||||
font-size: 1.5em;
|
||||
margin-left: 5px;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.big {
|
||||
@media screen and (max-width: 400px) {
|
||||
display: none;
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
.small {
|
||||
@media screen and (max-width: 400px) {
|
||||
display: inline-block;
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
.cryptpad-user {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
@media screen and (max-width: 400px) {
|
||||
top: 3em;
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar-leftside {
|
||||
float: left;
|
||||
margin-bottom: -1px;
|
||||
.cryptpad-user-list {
|
||||
float: right;
|
||||
}
|
||||
.cryptpad-dropdown-container {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
padding: 0px;
|
||||
.cryptpad-dropdown {
|
||||
z-index:1000;
|
||||
display:none;
|
||||
position: absolute;
|
||||
background-color: #f9f9f9;
|
||||
min-width: 160px;
|
||||
overflow: auto;
|
||||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
|
||||
height: auto;
|
||||
padding: 5px;
|
||||
white-space: normal;
|
||||
p {
|
||||
width: 210px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
white-space: normal;
|
||||
&.cryptpad-dropdown-users {
|
||||
text-align:baseline;
|
||||
.yourself, .anonymous, .viewer {
|
||||
font-style: italic;
|
||||
}
|
||||
}
|
||||
h2 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
background-color: #EEEEEE;
|
||||
padding: 5px 0px;
|
||||
margin: 5px 0px;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
button {
|
||||
margin: 2px 0px;
|
||||
}
|
||||
}
|
||||
}
|
||||
button {
|
||||
margin: 2px 4px 2px 0px;
|
||||
}
|
||||
.cryptpad-userbuttons-container {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar-rightside {
|
||||
text-align: right;
|
||||
//float: right;
|
||||
}
|
||||
.cryptpad-spinner {
|
||||
float: left;
|
||||
display: inline-block;
|
||||
height: 26px;
|
||||
margin: 2px;
|
||||
line-height: 26px;
|
||||
font-size: 20px;
|
||||
}
|
||||
.cryptpad-readonly {
|
||||
margin-right: 5px;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.cryptpad-toolbar-username {
|
||||
}
|
||||
.lag {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
padding: 0 !important;
|
||||
margin: 0 5px !important;
|
||||
height: 15px !important;
|
||||
width: 15px !important;
|
||||
border-radius: 50%;
|
||||
border: 1px solid @cp-outline;
|
||||
}
|
||||
.lag-green {
|
||||
background-color: @cp-green;
|
||||
}
|
||||
.lag-red {
|
||||
background-color: @cp-red;
|
||||
}
|
||||
.lag-orange {
|
||||
background-color: @cp-orange;
|
||||
}
|
||||
|
@ -1,33 +0,0 @@
|
||||
@base: #302B28;
|
||||
@light-base: lighten(@base, 20%);
|
||||
@fore: #fafafa;
|
||||
|
||||
@cp-green: #46E981;
|
||||
@cp-accent: lighten(@cp-green, 20%);
|
||||
|
||||
@cp-red: #FF0073; // remove red
|
||||
@cp-outline: #444;
|
||||
|
||||
@cp-orange: #FE9A2E;
|
||||
// alertify things
|
||||
|
||||
@box-shadow: 0 2px 5px 0 rgba(0,0,0,.2);
|
||||
@padding-base: 12px;
|
||||
|
||||
@success-color: @cp-green;
|
||||
@success-fore: @base;
|
||||
@danger-color: @cp-red;
|
||||
|
||||
@text-color: rgba(0, 0, 0, .8);
|
||||
@border-radius: 1px;
|
||||
|
||||
@alertify-btn-fg: @fore;
|
||||
|
||||
@alertify-btn-bg: transparent;
|
||||
@alertify-btn-bg-hover: rgba(0, 0, 0, .15);
|
||||
|
||||
@alertify-bg: rgba(0, 0, 0, .3);
|
||||
|
||||
@alertify-input-bg: @base;
|
||||
@alertify-input-fg: @fore;
|
||||
|
@ -0,0 +1,198 @@
|
||||
define([
|
||||
'jquery',
|
||||
'/common/hyperscript.js',
|
||||
'/common/cryptpad-common.js',
|
||||
'/customize/pages.js',
|
||||
'/api/config',
|
||||
|
||||
'css!/bower_components/components-font-awesome/css/font-awesome.min.css',
|
||||
], function ($, h, Cryptpad, Pages, Config) {
|
||||
$(function () {
|
||||
var urlArgs = Config.requireConf.urlArgs;
|
||||
var Messages = Cryptpad.Messages;
|
||||
var $body = $('body');
|
||||
var isMainApp = function () {
|
||||
return /^\/(pad|code|slide|poll|whiteboard|file|media|contacts|drive|settings|profile)\/$/.test(location.pathname);
|
||||
};
|
||||
|
||||
var rightLink = function (ref, loc, txt) {
|
||||
return h('span.link.right', [
|
||||
h('a', { href: ref, 'data-localization': loc}, txt)
|
||||
]);
|
||||
};
|
||||
|
||||
var $topbar = $(h('div#cryptpadTopBar', [
|
||||
h('span', [
|
||||
h('a.gotoMain', {href: '/'}, [
|
||||
h('img.cryptpad-logo', {
|
||||
src: '/customize/cryptofist_mini.png?' + urlArgs,
|
||||
alt: '',
|
||||
}),
|
||||
'CryptPad'
|
||||
])
|
||||
]),
|
||||
h('span#user-menu.right.dropdown-bar'),
|
||||
h('span#language-selector.right.dropdown-bar'),
|
||||
|
||||
rightLink('/about.html', 'about', 'About'),
|
||||
rightLink('/privacy.html', 'privacy', 'Privacy'),
|
||||
rightLink('/terms.html', 'terms', 'ToS'),
|
||||
rightLink('/contact.html', 'contact', 'Contact'),
|
||||
rightLink('https://blog.cryptpad.fr/', 'blog', 'Blog'),
|
||||
h('span.link.right', [
|
||||
h('button#upgrade.upgrade.btn.buttonSuccess', {
|
||||
style: { display: 'none' }
|
||||
})
|
||||
])
|
||||
]
|
||||
));
|
||||
|
||||
var infoPage = function () {
|
||||
return h('div#mainBlock.hidden', typeof(Pages[location.pathname]) === 'function'?
|
||||
Pages[location.pathname](): [h('div#container')]);
|
||||
};
|
||||
|
||||
var $main = $(infoPage());
|
||||
|
||||
var footerCol = function (title, L, literal) {
|
||||
return h('div.col', [
|
||||
h('ul.list-unstyled', [
|
||||
h('li.title', {
|
||||
'data-localization': title,
|
||||
}, title? Messages[title]: literal )
|
||||
].concat(L.map(function (l) {
|
||||
return h('li', [ l ]);
|
||||
}))
|
||||
)
|
||||
]);
|
||||
};
|
||||
|
||||
var footLink = function (ref, loc, text) {
|
||||
var attrs = {
|
||||
href: ref,
|
||||
};
|
||||
if (!/^\//.test(ref)) {
|
||||
attrs.target = '_blank';
|
||||
attrs.rel = 'noopener noreferrer';
|
||||
}
|
||||
if (loc) {
|
||||
attrs['data-localization'] = loc;
|
||||
text = Messages[loc];
|
||||
}
|
||||
return h('a', attrs, text);
|
||||
};
|
||||
|
||||
var $footer = $(h('footer', [
|
||||
h('div.container', [
|
||||
h('div.row', [
|
||||
footerCol(null, [
|
||||
footLink('/about.html', 'about'),
|
||||
footLink('/terms.html', 'terms'),
|
||||
footLink('/privacy.html', 'privacy'),
|
||||
], 'CryptPad'),
|
||||
footerCol('footer_applications', [
|
||||
footLink('/drive/', 'main_drive'),
|
||||
footLink('/pad/', 'main_richText'),
|
||||
footLink('/code/', 'main_code'),
|
||||
footLink('/slide/', 'main_slide'),
|
||||
footLink('/poll/', 'main_poll'),
|
||||
footLink('/whiteboard/', null, Messages.type.whiteboard)
|
||||
]),
|
||||
footerCol('footer_aboutUs', [
|
||||
footLink('https://blog.cryptpad.fr', 'blog'),
|
||||
footLink('https://labs.xwiki.com', null, 'XWiki Labs'),
|
||||
footLink('http://www.xwiki.com', null, 'XWiki SAS'),
|
||||
footLink('https://www.open-paas.org', null, 'OpenPaaS')
|
||||
]),
|
||||
footerCol('footer_contact', [
|
||||
footLink('https://riot.im/app/#/room/#cryptpad:matrix.org', null, 'Chat'),
|
||||
footLink('https://twitter.com/cryptpad', null, 'Twitter'),
|
||||
footLink('https://github.com/xwiki-labs/cryptpad', null, 'GitHub'),
|
||||
footLink('/contact.html', null, 'Email')
|
||||
])
|
||||
])
|
||||
]),
|
||||
h('div.version-footer', "CryptPad v1.11.0 (Lutin)")
|
||||
]));
|
||||
|
||||
var pathname = location.pathname;
|
||||
|
||||
if (isMainApp()) {
|
||||
if (typeof(Pages[pathname]) === 'function') {
|
||||
var $flash = $('body, #iframe-container, #pad-iframe, textarea');
|
||||
$flash.css({
|
||||
display: 'none',
|
||||
opacity: 0,
|
||||
overflow: 'hidden',
|
||||
});
|
||||
var ready = function () {
|
||||
$flash.css({
|
||||
display: '',
|
||||
opacity: '',
|
||||
overflow: '',
|
||||
});
|
||||
};
|
||||
|
||||
require([
|
||||
'less!/customize/src/less/loading.less'
|
||||
], function () {
|
||||
if (/whiteboard/.test(pathname)) {
|
||||
$('body').html(h('body', Pages[pathname]()).innerHTML);
|
||||
require(['/whiteboard/main.js'], ready);
|
||||
} else if (/poll/.test(pathname)) {
|
||||
$('body').html(h('body', Pages[pathname]()).innerHTML);
|
||||
require(['/poll/main.js'], ready);
|
||||
} else if (/drive/.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require(['/drive/main.js'], ready);
|
||||
} else if (/\/file\//.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/file/main.js' ], ready);
|
||||
} else if (/contacts/.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/contacts/main.js' ], ready);
|
||||
} else if (/pad/.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/pad/main.js' ], ready);
|
||||
} else if (/code/.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/code/main.js' ], ready);
|
||||
} else if (/slide/.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/slide/main.js' ], ready);
|
||||
} else if (/^\/settings\//.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/settings/main.js', ], ready);
|
||||
} else if (/^\/profile\//.test(pathname)) {
|
||||
$('body').append(h('body', Pages[pathname]()).innerHTML);
|
||||
require([ '/profile/main.js', ], ready);
|
||||
}
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
require([
|
||||
'less!/customize/src/less/cryptpad.less',
|
||||
'css!/bower_components/bootstrap/dist/css/bootstrap.min.css',
|
||||
], function () {
|
||||
$body.append($topbar).append($main).append($footer);
|
||||
|
||||
if (/^\/user\//.test(pathname)) {
|
||||
require([ '/user/main.js'], function () {});
|
||||
} else if (/^\/register\//.test(pathname)) {
|
||||
require([ '/register/main.js' ], function () {});
|
||||
} else if (/^\/login\//.test(pathname)) {
|
||||
require([ '/login/main.js' ], function () {});
|
||||
} else if (/^\/($|^\/index\.html$)/.test(pathname)) {
|
||||
// TODO use different top bar
|
||||
require([ '/customize/main.js', ], function () {});
|
||||
} else if (/invite/.test(pathname)) {
|
||||
require([ '/invite/main.js'], function () {});
|
||||
} else {
|
||||
require([ '/customize/main.js', ], function () {});
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
@ -1,318 +0,0 @@
|
||||
.unselectable {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.cryptpad-toolbar {
|
||||
box-sizing: border-box;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
font: normal normal normal 12px Arial, Helvetica, Tahoma, Verdana, Sans-Serif;
|
||||
color: #000;
|
||||
display: inline-block;
|
||||
width: 100%;
|
||||
z-index: 9001;
|
||||
}
|
||||
.cryptpad-toolbar a {
|
||||
float: right;
|
||||
}
|
||||
.cryptpad-toolbar div {
|
||||
white-space: normal;
|
||||
}
|
||||
.cryptpad-toolbar div.cryptpad-back {
|
||||
padding: 0;
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
color: #000;
|
||||
}
|
||||
.cryptpad-toolbar div.cryptpad-lag {
|
||||
float: left;
|
||||
line-height: 26px;
|
||||
margin: 2px 0px;
|
||||
}
|
||||
.cryptpad-toolbar button,
|
||||
.cryptpad-toolbar select,
|
||||
.cryptpad-toolbar .rightside-element {
|
||||
height: 26px;
|
||||
padding-right: 5px;
|
||||
padding-left: 5px;
|
||||
margin: 2px;
|
||||
}
|
||||
.cryptpad-toolbar button {
|
||||
background-color: inherit;
|
||||
background-image: linear-gradient(to bottom, #fff, #e4e4e4);
|
||||
border: 1px solid #A6A6A6;
|
||||
border-bottom-color: #979797;
|
||||
border-radius: 3px;
|
||||
}
|
||||
.cryptpad-toolbar button:hover {
|
||||
background-image: linear-gradient(to bottom, #f2f2f2, #ccc);
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
.cryptpad-toolbar button.userlist {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
.cryptpad-toolbar button.userlist {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
.cryptpad-toolbar button.userlist.small {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 801px) {
|
||||
.cryptpad-toolbar button.userlist.small {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar .cryptpad-state {
|
||||
line-height: 30px;
|
||||
/* equivalent to 26px + 2*2px margin used for buttons */
|
||||
}
|
||||
.cryptpad-toolbar .rightside-button {
|
||||
float: right;
|
||||
cursor: pointer;
|
||||
}
|
||||
.cryptpad-toolbar .leftside-button {
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
}
|
||||
.cryptpad-toolbar .rightside-element {
|
||||
vertical-align: middle;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.cryptpad-toolbar .rightside-element.float {
|
||||
float: right;
|
||||
}
|
||||
.cryptpad-toolbar select {
|
||||
border: 0px;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
padding-left: 5px;
|
||||
border: 1px solid #A6A6A6;
|
||||
border-bottom-color: #979797;
|
||||
}
|
||||
.cryptpad-toolbar-top {
|
||||
display: block;
|
||||
text-align: center;
|
||||
height: 32px;
|
||||
position: relative;
|
||||
}
|
||||
@media screen and (max-width: 400px) {
|
||||
.cryptpad-toolbar-top {
|
||||
height: 67px;
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title .title,
|
||||
.cryptpad-toolbar-top .cryptpad-title .pencilIcon {
|
||||
font-size: 1.5em;
|
||||
vertical-align: middle;
|
||||
line-height: 32px;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title .pencilIcon {
|
||||
display: none;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title .pencilIcon:hover {
|
||||
color: #999;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title .pencilIcon span {
|
||||
cursor: pointer;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title:not(input):hover .editable {
|
||||
border: 1px solid #888;
|
||||
border-radius: 2px 0px 0px 2px;
|
||||
background: white;
|
||||
padding: 5px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title:not(input):hover .pencilIcon {
|
||||
cursor: pointer;
|
||||
border: 1px solid #888;
|
||||
border-radius: 0px 2px 2px 0px;
|
||||
background: white;
|
||||
padding: 5px;
|
||||
display: inline;
|
||||
margin-left: -1px;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-title input {
|
||||
font-size: 1.5em;
|
||||
vertical-align: middle;
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid black;
|
||||
background: #fff;
|
||||
cursor: auto;
|
||||
width: 300px;
|
||||
padding: 0px 5px;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-link {
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
height: 32px;
|
||||
}
|
||||
@media screen and (max-width: 400px) {
|
||||
.cryptpad-toolbar-top .cryptpad-link {
|
||||
top: 35px;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
.cryptpad-toolbar-top .cryptpad-link {
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-link a.cryptpad-logo {
|
||||
cursor: pointer;
|
||||
height: 32px;
|
||||
padding: 0px 5px;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-link a.cryptpad-logo:hover span {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-link a.cryptpad-logo img {
|
||||
vertical-align: middle;
|
||||
height: 32px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-link a.cryptpad-logo span {
|
||||
font-size: 1.5em;
|
||||
margin-left: 5px;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
}
|
||||
@media screen and (max-width: 400px) {
|
||||
.cryptpad-toolbar-top .cryptpad-link .big {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
.cryptpad-toolbar-top .cryptpad-link .big {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@media screen and (max-width: 400px) {
|
||||
.cryptpad-toolbar-top .cryptpad-link .small {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
.cryptpad-toolbar-top .cryptpad-link .small {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar-top .cryptpad-user {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
@media screen and (max-width: 400px) {
|
||||
.cryptpad-toolbar-top .cryptpad-user {
|
||||
top: 3em;
|
||||
}
|
||||
}
|
||||
@media screen and (min-width: 401px) {
|
||||
.cryptpad-toolbar-top .cryptpad-user {
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
.cryptpad-toolbar-leftside {
|
||||
float: left;
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-user-list {
|
||||
float: right;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
padding: 0px;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown {
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: #f9f9f9;
|
||||
min-width: 160px;
|
||||
overflow: auto;
|
||||
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
|
||||
height: auto;
|
||||
padding: 5px;
|
||||
white-space: normal;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown p {
|
||||
width: 210px;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
white-space: normal;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown p.cryptpad-dropdown-users {
|
||||
text-align: baseline;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown p.cryptpad-dropdown-users .yourself,
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown p.cryptpad-dropdown-users .anonymous,
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown p.cryptpad-dropdown-users .viewer {
|
||||
font-style: italic;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown p h2 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
background-color: #EEEEEE;
|
||||
padding: 5px 0px;
|
||||
margin: 5px 0px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-dropdown-container .cryptpad-dropdown button {
|
||||
margin: 2px 0px;
|
||||
}
|
||||
.cryptpad-toolbar-leftside button {
|
||||
margin: 2px 4px 2px 0px;
|
||||
}
|
||||
.cryptpad-toolbar-leftside .cryptpad-userbuttons-container {
|
||||
display: none;
|
||||
}
|
||||
.cryptpad-toolbar-rightside {
|
||||
text-align: right;
|
||||
}
|
||||
.cryptpad-spinner {
|
||||
float: left;
|
||||
display: inline-block;
|
||||
height: 26px;
|
||||
margin: 2px;
|
||||
line-height: 26px;
|
||||
font-size: 20px;
|
||||
}
|
||||
.cryptpad-readonly {
|
||||
margin-right: 5px;
|
||||
font-weight: bold;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.lag {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
padding: 0 !important;
|
||||
margin: 0 5px !important;
|
||||
height: 15px !important;
|
||||
width: 15px !important;
|
||||
border-radius: 50%;
|
||||
border: 1px solid #444;
|
||||
}
|
||||
.lag-green {
|
||||
background-color: #46E981;
|
||||
}
|
||||
.lag-red {
|
||||
background-color: #FF0073;
|
||||
}
|
||||
.lag-orange {
|
||||
background-color: #FE9A2E;
|
||||
}
|
@ -0,0 +1,165 @@
|
||||
define(function () {
|
||||
var out = {};
|
||||
|
||||
// translations must set this key for their language to be available in
|
||||
// the language dropdowns that are shown throughout Cryptpad's interface
|
||||
out._languageName = 'German';
|
||||
|
||||
out.main_title = "Cryptpad: Echtzeitzusammenarbeit, ohne Vorwissen";
|
||||
out.main_slogan = "Einigkeit macht stark - Zusammenarbeit ist der Schlüssel"; // Der Slogan sollte evtl. besser englisch bleiben.
|
||||
|
||||
out.type = {};
|
||||
out.type.pad = 'Pad';
|
||||
out.type.code = 'Code';
|
||||
out.type.poll = 'Umfrage';
|
||||
out.type.slide = 'Präsentation';
|
||||
|
||||
out.common_connectionLost = 'Serververbindung verloren';
|
||||
|
||||
out.disconnected = 'Getrennt';
|
||||
out.synchronizing = 'Synchronisiert';
|
||||
out.reconnecting = 'Verbindung wird neu aufgebaut...';
|
||||
out.lag = 'Lag';
|
||||
out.readonly = 'Nur-Lesen';
|
||||
out.anonymous = "Anonymous";
|
||||
out.yourself = "Du";
|
||||
out.anonymousUsers = "anonyme Nutzer*innen";
|
||||
out.anonymousUser = "anonyme Nutzer*in";
|
||||
out.users = "Nutzer*innen";
|
||||
out.and = "Und";
|
||||
out.viewer = "Betrachter*in";
|
||||
out.viewers = "Betrachter*innen";
|
||||
out.editor = "Bearbeiter*in";
|
||||
out.editors = "Bearbeiter*innen";
|
||||
|
||||
out.greenLight = "Alles funktioniert bestens";
|
||||
out.orangeLight = "Deine langsame Verbindung kann die Nutzung beinträchtigen";
|
||||
out.redLight = "Du wurdest von dieser Sitzung getrennt";
|
||||
|
||||
out.importButtonTitle = 'Importiere eine lokale Datei in dieses Dokument';
|
||||
|
||||
out.exportButtonTitle = 'Exportiere dieses Dokument in eine lokale Datei';
|
||||
out.exportPrompt = 'Wie möchtest du die Datei nennen?';
|
||||
|
||||
|
||||
out.changeNamePrompt = 'Ändere deinen Namen (oder lasse dieses Feld leer um anonym mitzuarbeiten): ';
|
||||
|
||||
out.clickToEdit = "Zum bearbeiten klicken";
|
||||
|
||||
out.forgetButtonTitle = 'Entferne dieses Dokumnt von deiner Startseitenliste';
|
||||
out.forgetPrompt = 'Mit dem Klick auf OK wird das Dokument aus deinem lokalen Speicher gelöscht. Fortfahren?';
|
||||
|
||||
out.shareButton = 'Teilen';
|
||||
out.shareSuccess = 'URL wurde in die Zwischenablage kopiert';
|
||||
|
||||
out.presentButtonTitle = "Präsentationsmodus starten";
|
||||
out.presentSuccess = 'Hit ESC to exit presentation mode';
|
||||
|
||||
out.backgroundButtonTitle = 'Die Hintergrundfarbe der Präsentation ändern';
|
||||
out.colorButtonTitle = 'Die Textfarbe im Präsentationsmodus ändern';
|
||||
|
||||
// Hierfür fehlt eine passende Übersetzung...
|
||||
|
||||
out.editShare = "Mitarbeits-URL teilen";
|
||||
out.editShareTitle = "Mitarbeits-URL in die Zwischenablage kopieren";
|
||||
out.viewShare = "Nur-Lesen-URL teilen";
|
||||
out.viewShareTitle = "Nur-Lesen-URL in die Zwischenablage kopieren";
|
||||
out.viewOpen = "In neuem Tab anzeigen";
|
||||
out.viewOpenTitle = "Dokument im Nur-Lesen-Modus in neuem Tab öffnen.";
|
||||
|
||||
out.notifyJoined = "{0} ist der gemeinsamen Sitzung beigetreten";
|
||||
out.notifyRenamed = "{0} heißt nun {1}";
|
||||
out.notifyLeft = "{0} hat die gemeinsame Sitzung verlassen";
|
||||
|
||||
out.tryIt = 'Probier\'s aus!';
|
||||
|
||||
out.okButton = 'OK (enter)';
|
||||
out.cancelButton = 'Abbrechen (esc)';
|
||||
|
||||
// Polls
|
||||
|
||||
out.poll_title = "Kenntnisfreier Datumsplaner";
|
||||
out.poll_subtitle = "Kenntnisfreies, <em>echtzeit</em> planen";
|
||||
|
||||
out.poll_p_save = "Deine Einstellungen werden sofort automatisch gesichtert.";
|
||||
out.poll_p_encryption = "Alle Eingaben sind verschlüsselt, deshalb haben nur Leute im Besitz des Links Zugriff. Selbst der Server sieht nicht was du änderst.";
|
||||
|
||||
out.wizardLog = "Klicke auf den Button links oben um zur Umfrage zurückzukehren.";
|
||||
out.wizardTitle = "Nutze den Assistenten um deine Umfrage zu erstellen.";
|
||||
out.wizardConfirm = "Bist du wirklich bereit die angegebenen Optionen bereits zu deiner Umfrage hinzuzufügen?";
|
||||
|
||||
out.poll_closeWizardButton = "Assistenten schließen";
|
||||
out.poll_closeWizardButtonTitle = "Assistenten schließen";
|
||||
out.poll_wizardComputeButton = "Optionen übernehmen";
|
||||
out.poll_wizardClearButton = "Tabelle leeren";
|
||||
out.poll_wizardDescription = "Erstellt automatisch die Optionen indem eine beliebige Anzahl von Daten und Zeiten eingegeben wird.";
|
||||
out.poll_wizardAddDateButton = "+ Daten";
|
||||
out.poll_wizardAddTimeButton = "+ Zeiten";
|
||||
|
||||
out.poll_optionPlaceholder = "Option";
|
||||
out.poll_userPlaceholder = "Dein Name";
|
||||
out.poll_removeOption = "Bist du sicher, dass du diese Option entfernen möchtest?";
|
||||
out.poll_removeUser = "Bist du sicher, dass du diese Nutzer*in entfernen möchtest?";
|
||||
|
||||
out.poll_titleHint = "Titel";
|
||||
out.poll_descriptionHint = "Beschreibung";
|
||||
|
||||
// index.html
|
||||
|
||||
out.main_howitworks = 'Wie es funktioniert';
|
||||
out.main_p2 = 'Dieses Projekt nutzt den <a href="http://ckeditor.com/">CKEditor</a> visuellen Editor, <a href="https://codemirror.net/">CodeMirror</a>, und die <a href="https://github.com/xwiki-contrib/chainpad">ChainPad</a> realtime engine.';
|
||||
out.main_howitworks_p1 = 'CryptPad nutzt eine Variante des <a href="https://en.wikipedia.org/wiki/Operational_transformation">Operational transformation</a> Algorithmus. Dieser kann mit Hilfe der <a href="https://bitcoin.org/bitcoin.pdf">Nakamoto Blockchain</a>, einem Konstrukt, das durch das <a href="https://de.wikipedia.org/wiki/Bitcoin">Bitcoin</a>-Projekt Bekanntheit erlangte, verteilten Konsens (distributed consensus) finden. Damit ist der Algorithmus nicht auf einen zentralen Server angewiesen um Konflikte zu lösen — der Server muss also nichts vom Inhalt der Pads wissen.';
|
||||
|
||||
out.main_about_p2 = 'Für Fragen und Kommentare kannst du uns <a href="https://twitter.com/cryptpad">tweeten</a>, ein Ticket <a href="https://github.com/xwiki-labs/cryptpad/issues/" title="our issue tracker">auf Github öffnen</a>, hi auf irc sagen (<a href="http://webchat.freenode.net?channels=%23cryptpad&uio=MT1mYWxzZSY5PXRydWUmMTE9Mjg3JjE1PXRydWUe7" title="freenode webchat">irc.freenode.net</a>), oder <a href="mailto:research@xwiki.com">eine Mail zukommen lassen</a>.';
|
||||
|
||||
out.button_newpad = 'NEUES WYSIWYG-PAD ERSTELLEN';
|
||||
out.button_newcode = 'NEUES CODE-PAD ERSTELLEN';
|
||||
out.button_newpoll = 'NEUE ABSTIMMUNG ERSTELLEN';
|
||||
out.button_newslide = 'NEUE PRÄSENTATION ERSTELLEN';
|
||||
|
||||
// privacy.html
|
||||
|
||||
out.policy_title = 'Cryptpad Datenschutzbestimmungen';
|
||||
out.policy_whatweknow = 'Was wir über dich wissen';
|
||||
out.policy_whatweknow_p1 = 'Als Programm, das im Web gehostet wird, hat Cryptpad Zugriff auf die Metadaten, die vom HTTP-Protokoll exponiert werden. Inbegriffen ist deine IP-Adresse und diverse andere HTTP-Header, die es ermöglichen deinen Browser zu identifizieren. Um zu sehen welche Daten dein Browser preis gibt kanst du die Seite <a target="_blank" rel="noopener noreferrer" href="https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending" title="what http headers is my browser sending">WhatIsMyBrowser.com</a> besuchen.';
|
||||
out.policy_whatweknow_p2 = 'Wir nutzen <a href="https://piwik.org/" target="_blank" rel="noopener noreferrer" title="open source analytics platform">Piwik</a>, eine open source Analyseplatform um mehr über unsere Nutzer*innen zu lernen. Piwik teilt uns mit, wie du Cryptpad gefunden hast — durch direkten Zugriff, mit Hilfe eine Suchmaschine oder über einen Link auf einer anderen Seite wie z.B. Reddit oder Twitter. Außerdem lernen wir mehr über deinen Besuch, welchen Link du auf den Informationsseiten klickst und wie lange du auf diesen Seiten verweilst.';
|
||||
out.policy_howweuse = 'Wie wir das Wissen anwenden';
|
||||
out.policy_howweuse_p1 = 'Wir nutzen diese Informationen um besser entscheiden zu können wie Cryptpad beworben werden kann und um genutzte Strategien zu evaluieren. Informationen über deinen Standort helfen uns abzuschätzen welche Sprachen wir besser unterstützen sollten.';
|
||||
out.policy_howweuse_p2 = "Informationen zu deinem Browser (ob du auf einem Desktop oder Smartphone arbeitest) hilft uns außerdem dabei zu entscheiden, welche Features priorisiert werden sollen. Unser Entwicklerteam ist klein, deshalb ist es uns wichtig Entscheidungen derart zu treffen, dass die Erfahrung der größten Zahl von Nutzer*innen verbessert wird.";
|
||||
out.policy_whatwetell = 'Was wir anderen über die erzählen';
|
||||
out.policy_whatwetell_p1 = 'Wir reichen keine von uns gesammelten Daten weiter, außer im Falle einer gerichtlichen Anordnung.';
|
||||
out.policy_links = 'Links zu anderen Seiten';
|
||||
out.policy_links_p1 = 'Diese Seite beinhaltet Links zu anderen Seiten, teilweise werden diese von anderen Organisationen verwaltet. Wir sind nicht für den Umgang mit der Privatsphäre und die Inhalte der anderen Seiten verantwortlich. Generell werden Links zu externen Seiten in einem neuem Fenster geöffnet, um zu verdeutlichen, dass du Cryptpad.fr verlässt.';
|
||||
out.policy_ads = 'Werbung';
|
||||
out.policy_ads_p1 = 'Wir zeigen keine Onlinewerbung, können aber zu Organisationen verlinken, die unsere Forschung finanzieren.';
|
||||
out.policy_choices = 'Deine Möglichkeiten';
|
||||
out.policy_choices_open = 'Unser Code ist open source, deshalb kannst du jederzeit deine eigene Cryptpad-Instanz hosten.';
|
||||
out.policy_choices_vpn = 'Wenn du unsere gehostete Instanz nutzen möchtest bitten wir dich darum IP-Adresse zu verschleiern, das geht zum Beispiel mit dem <a href="https://www.torproject.org/projects/torbrowser.html.en" title="downloads vor Torproject" target="_blank" rel="noopener noreferrer">Tor browser bundle</a>, oder einem <a href="https://riseup.net/en/vpn" title="VPNs provided by Riseup" target="_blank" rel="noopener noreferrer">VPN-Zugang</a>.';
|
||||
out.policy_choices_ads = 'Wenn du unsere Analysesoftware blockieren möchtest kannst du Adblock-Software wie <a href="https://www.eff.org/privacybadger" title="download privacy badger" target="_blank" rel="noopener noreferrer">Privacy Badger</a> verwenden.';
|
||||
|
||||
// terms.html
|
||||
|
||||
out.tos_title = "Cryptpad Nutzungsbedingungen";
|
||||
out.tos_legal = "Sei nicht bösartig, missbrauchend und mach nichts illegales.";
|
||||
out.tos_availability = "Wir hoffen, dass dir dieser Service nützt, aber Erreichbarkeit und Performanz können nicht garantiert werden. Bitte exportiere deine Daten regelmäßig.";
|
||||
out.tos_e2ee = "Cryptpad Dokumente können von allen gelesen oder bearbeitet werden, die den \"fragment identifier\" des Dokuments erraten oder auf eine andere Art davon erfahren. Wir empfehlen dir Ende-Zu-Ende verschlüsselte Nachrichtentechnik (e2ee) zum Versenden der URLs zu nutzen. Wir übernehmen keine Haftung falls eine URL erschlichen oder abgegriffen wird.";
|
||||
out.tos_logs = "Metadaten, die dein Browser bereitstellt, können geloggt werden, um den Service aufrechtzuerahlten.";
|
||||
out.tos_3rdparties = "Wir geben keine Individualdaten an dritte Weiter, außer auf richterliche Anordnung.";
|
||||
|
||||
// BottomBar.html
|
||||
|
||||
out.bottom_france = '<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer">Mit <img class="bottom-bar-heart" src="/customize/heart.png" /> in <img class="bottom-bar-fr" src="/customize/fr.png" /> gemacht</a>';
|
||||
out.bottom_support = '<a href="http://labs.xwiki.com/" title="XWiki Labs" target="_blank" rel="noopener noreferrer">Ein <img src="/customize/logo-xwiki2.png" alt="XWiki SAS" class="bottom-bar-xwiki"/> Labs Project </a> mit Hilfe von <a href="http://ng.open-paas.org/" title="OpenPaaS::ng" target="_blank" rel="noopener noreferrer"> <img src="/customize/openpaasng.png" alt="OpenPaaS-ng" class="bottom-bar-openpaas" /></a>';
|
||||
|
||||
// Header.html
|
||||
|
||||
out.header_france = '<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer">Mit <img class="bottom-bar-heart" src="/customize/heart.png" /> von <img class="bottom-bar-fr" src="/customize/fr.png" title="France" alt="France"/> und <img src="/customize/logo-xwiki.png" alt="XWiki SAS" class="bottom-bar-xwiki"/></a>';
|
||||
|
||||
|
||||
// TODO Hardcode cause YOLO
|
||||
//out.header_xwiki = '<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer"><img src="/customize/logo-xwiki.png" alt="XWiki SAS" class="bottom-bar-xwiki"/></a>';
|
||||
out.header_support = '<a href="http://ng.open-paas.org/" title="OpenPaaS::ng" target="_blank" rel="noopener noreferrer"> <img src="/customize/openpaasng.png" alt="OpenPaaS-ng" class="bottom-bar-openpaas" /></a>';
|
||||
out.header_logoTitle = 'Zur Hauptseite';
|
||||
|
||||
return out;
|
||||
});
|
@ -0,0 +1,163 @@
|
||||
define(function () {
|
||||
var out = {};
|
||||
|
||||
// translations must set this key for their language to be available in
|
||||
// the language dropdowns that are shown throughout Cryptpad's interface
|
||||
out._languageName = 'Polish';
|
||||
|
||||
out.main_title = "Cryptpad: Wspólne edytowanie w czasie rzeczywistym, bez wiedzy specjalistycznej";
|
||||
out.main_slogan = "Jedność siłą - Współpraca kluczem";
|
||||
|
||||
out.type = {};
|
||||
out.type.pad = 'Pad';
|
||||
out.type.code = 'Kod';
|
||||
out.type.poll = 'Balot';
|
||||
out.type.slide = 'Prezentacja';
|
||||
|
||||
out.common_connectionLost = 'Przerwano połączenie z serwerem';
|
||||
|
||||
out.disconnected = 'Rozłączony';
|
||||
out.synchronizing = 'Synchronizacja';
|
||||
out.reconnecting = 'Wznawianie połączenia...';
|
||||
out.lag = 'Lag';
|
||||
out.readonly = 'Tylko do odczytu';
|
||||
out.anonymous = "Anonimowy";
|
||||
out.yourself = "Ty";
|
||||
out.anonymousUsers = "użytkownicy anonimowi";
|
||||
out.anonymousUser = "użytkownik anonimowy";
|
||||
out.users = "Użytkownicy";
|
||||
out.and = "i";
|
||||
out.viewer = "czytający";
|
||||
out.viewers = "czytających";
|
||||
out.editor = "edytujący";
|
||||
out.editors = "edytujących";
|
||||
|
||||
out.greenLight = "Wszystkie systemy działają poprawnie";
|
||||
out.orangeLight = "Słabe łącze może wpłynąć na działanie aplikacji";
|
||||
out.redLight = "Zostałeś rozłączony z sesją";
|
||||
|
||||
out.importButtonTitle = 'Importuj dokument z pliku lokalnego';
|
||||
|
||||
out.exportButtonTitle = 'Zapisz ten dokument do pliku';
|
||||
out.exportPrompt = 'Jak chciałbyś nazwać swój plik?';
|
||||
|
||||
out.changeNamePrompt = 'Zmień swoją nazwę (Pozostaw puste, by być anonimowym): ';
|
||||
|
||||
out.clickToEdit = "Naciśnij by edytować";
|
||||
|
||||
out.forgetButtonTitle = 'Usuń ten dokument z listy wyświetlanej na stronie głównej';
|
||||
out.forgetPrompt = 'Wciskając OK usuniesz ten URL z pamięci lokalnej, jesteś tego pewien?';
|
||||
|
||||
out.shareButton = 'Udostępnij';
|
||||
out.shareSuccess = 'Pomyślnie skopiowano URL';
|
||||
|
||||
out.presentButtonTitle = "Otwórz tryb prezentacji";
|
||||
out.presentSuccess = 'Naciśnij ESC aby wyjść z trybu prezentacji';
|
||||
|
||||
out.backgroundButtonTitle = 'Zmień kolor tła dla tej prezentacji';
|
||||
out.colorButtonTitle = 'Zmień kolor tekstu dla tej prezentacji';
|
||||
|
||||
|
||||
out.editShare = "Udostępnij URL do edycji";
|
||||
out.editShareTitle = "Zapisz URL do edycji w schowku";
|
||||
out.viewShare = "Udostępnij URL tylko do odczytu";
|
||||
out.viewShareTitle = "Zapisz URL tylko do odczytu w schowku";
|
||||
out.viewOpen = "Otwórz podgląd w nowej karcie";
|
||||
out.viewOpenTitle = "Otwórz ten dokument w nowej karcie, tylko do odczytu";
|
||||
|
||||
out.notifyJoined = "{0} dołączył do sesji współpracy";
|
||||
out.notifyRenamed = "{0} jest teraz znany jako {1}";
|
||||
out.notifyLeft = "{0} opuścił sesję współpracy";
|
||||
|
||||
out.tryIt = 'Wypróbuj!';
|
||||
|
||||
out.okButton = 'OK (enter)';
|
||||
out.cancelButton = 'Anuluj (esc)';
|
||||
|
||||
// Polls
|
||||
|
||||
out.poll_title = "Prosty koordynator spotkań"; // Choice of "Koordynator" can be discussed
|
||||
out.poll_subtitle = "Proste planowanie spotkań, <em>w czasie rzeczywistym</em>";
|
||||
|
||||
out.poll_p_save = "Twoje ustawienia aktualizowane są na bieżąco. Nie martw się zapisywaniem.";
|
||||
out.poll_p_encryption = "Wszystko co robisz jest szyfrowane, więc tylko osoby z linkiem mają tu dostęp. Nawet serwer nie widzi co kombinujesz.";
|
||||
|
||||
out.wizardLog = "Naciśnij przycisk w lewym-górnym rogu by wrócić do planu";
|
||||
out.wizardTitle = "Uzyj kreatora by stworzyć opcje do głosowania";
|
||||
out.wizardConfirm = "Jesteś pewny, że chcesz dodać te opcje do głosowania?";
|
||||
|
||||
out.poll_closeWizardButton = "Zamknij kreator";
|
||||
out.poll_closeWizardButtonTitle = "Zamyka kreator";
|
||||
out.poll_wizardComputeButton = "Ustawienia kalkulacji";
|
||||
out.poll_wizardClearButton = "Wyczyść tabelę";
|
||||
out.poll_wizardDescription = "Automatycznie stwórz część opcji poprzez wpisanie ilości dat i godzin";
|
||||
out.poll_wizardAddDateButton = "+ Daty";
|
||||
out.poll_wizardAddTimeButton = "+ Godziny";
|
||||
|
||||
out.poll_optionPlaceholder = "Opcja";
|
||||
out.poll_userPlaceholder = "Twoje imię";
|
||||
out.poll_removeOption = "Jesteś pewien, że chcesz usunąć tę opcję?";
|
||||
out.poll_removeUser = "Jesteś pewien, że chcesz usunąć tego użytkownika?";
|
||||
|
||||
out.poll_titleHint = "Tytuł";
|
||||
out.poll_descriptionHint = "Opis";
|
||||
|
||||
// index.html
|
||||
|
||||
out.main_p2 = 'Ten projekt wykorzystuje wizualny edytor <a href="http://ckeditor.com/">CKEditor</a> , <a href="https://codemirror.net/">CodeMirror</a>, oraz silnik czasu rzeczywistego <a href="https://github.com/xwiki-contrib/chainpad">ChainPad</a>.';
|
||||
out.main_howitworks = 'Jak to działa';
|
||||
out.main_howitworks_p1 = 'CryptPad wykorzystuje wariant algorytmu <a href="https://en.wikipedia.org/wiki/Operational_transformation">Transformacji operacyjnej</a> który jest wstanie odnaleźć rozdzielony konsensus wprowadzanych danych. Używa do tego <a href="https://bitcoin.org/bitcoin.pdf">Łańcuch blokowy Nakamoto</a>, twór zpopularyzowany przez <a href="https://en.wikipedia.org/wiki/Bitcoin">Bitcoin</a>. W ten sposób algorytm może pominąć potrzebę centralnego serwera do rozwiązywania Konfliktów Operacji Przekształcania poprzez Edycję. Bez potrzeby rozwiązywania konfliktów, serwer może pozostać w niewiedzy o zawartości która jest edytowana w dokumencie.';
|
||||
|
||||
out.main_about_p2 = 'Jeżeli masz jakieś pytania lub komentarze, możesz napisać na <a href="https://twitter.com/cryptpad">tweeterze</a>, otworzyć problem na <a href="https://github.com/xwiki-labs/cryptpad/issues/" title="our issue tracker">githubie</a>, przywitać się na ircu (<a href="http://webchat.freenode.net?channels=%23cryptpad&uio=MT1mYWxzZSY5PXRydWUmMTE9Mjg3JjE1PXRydWUe7" title="freenode webchat">irc.freenode.net</a>), lub wysłać nam <a href="mailto:research@xwiki.com">email</a>.';
|
||||
|
||||
out.button_newpad = 'STWÓRZ PAD WYSIWYG';
|
||||
out.button_newcode = 'STWÓRZ PAD DO KODU';
|
||||
out.button_newpoll = 'STWÓRZ GŁOSOWANIE';
|
||||
out.button_newslide = 'STWÓRZ PREZENTACJĘ';
|
||||
|
||||
// privacy.html
|
||||
|
||||
out.policy_title = 'Polityka prywatności CryptPad';
|
||||
out.policy_whatweknow = 'Co o tobie wiemy';
|
||||
out.policy_whatweknow_p1 = 'Jako aplikacja udostępniana w internecie, CryptPad ma dostęp do metadanych wystawianych przez protokół HTTP. W skład tych danych wchodzi adres IP oraz różne inne nagłówki HTTP które pozwalają na identyfikację twojej przeglądarki. Możesz podejrzeć jakie informacje udostępnia twoja przeglądarka odwiedzając <a target="_blank" rel="noopener noreferrer" href="https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending" title="what http headers is my browser sending">WhatIsMyBrowser.com</a>.';
|
||||
out.policy_whatweknow_p2 = 'Używamy <a href="https://piwik.org/" target="_blank" rel="noopener noreferrer" title="open source analytics platform">Piwik</a>, Open Sourcowej platformy analitycznej, aby dowiedzieć się czegoś o naszych użytkownikach. Piwik mówi nam, skąd dowiedziałeś się o Cryptpad. Bezpośrednio przez adres, silnik wyszukiwany, czy z polecenia innej usługi internetowej jak Reddit czy Twitter. Uczymy się również gdy nas odwiedzasz, jakie linki odwiedzasz z naszej strony informacyjnej i jak długo pozostajesz na konkretnych stronach.';
|
||||
out.policy_howweuse = 'Jak wykorzystujemy zebraną wiedzę';
|
||||
out.policy_howweuse_p1 = 'Dzieki tym informacjom możemy podejmować lepsze decyzje przy promocji CryptPad, poprzez ocenę które z podjętych przez nas prób okazały się udane. Informacja o twojej lokalizacji daje nam znać, czy powinniśmy zapewnić lepsze wsparcie dla języków poza Angielskim.';
|
||||
out.policy_howweuse_p2 = "Informacje o twojej przeglądarce (czy jest to aplikacja desktopowa, czy działająca na systemie mobilnym) pozwalają nam na decydowanie przy priorytezowaniu ulepszeń funkcji. Nasz zespół deweloperski jest mały, a my staramy się dokonywać wyborów które poprawią doświadczenia jak największej liczby użytkowników.";
|
||||
out.policy_whatwetell = 'Jakie dane przekazujemy innym';
|
||||
out.policy_whatwetell_p1 = 'Nie dostarczamy osobom trzecim żadnych danych które udało się nam zebrać, lub tych które nam przekazałeś sam, dopóki nie jesteśmy do tego zobligowani prawnie.';
|
||||
out.policy_links = 'Adresy innych stron';
|
||||
out.policy_links_p1 = 'Ta witryna zawiera łącza do innych stron, włączając w to te stworzone przez inne organizacje. Nie jesteśmy odpowiedzialni za praktyki dotyczące prywatności oraz zawartość usługodawców poza tą witryną. Jako główną zasadę przyjmujemy, że łącza do stron zewnętrznych uruchamiane są w nowej karcie lub oknie, aby upewnić cię iż opuszczasz Cryptpad.';
|
||||
out.policy_ads = 'Promocja i reklama';
|
||||
out.policy_ads_p1 = 'Nie wyświetlamy żadnej zawartości promocyjnej online, choć możemy udostępniać łącza do podmiotów finansujących nasze badania.';
|
||||
out.policy_choices = 'Co możesz zrobić';
|
||||
out.policy_choices_open = 'Nasz kod jest open source, więc zawsze masz możliwość hostowania swojej własnej wersji Cryptpad.';
|
||||
out.policy_choices_vpn = 'Jeżeli chcesz korzystać z wersji udostępnianej przez nas, lecz nie chcesz pokazywać swojego adresu IP, możesz chronić swój adres wykorzystując <a href="https://www.torproject.org/projects/torbrowser.html.en" title="downloads from the Tor project" target="_blank" rel="noopener noreferrer">przeglądarki Tor</a>, lub <a href="https://riseup.net/en/vpn" title="VPNs provided by Riseup" target="_blank" rel="noopener noreferrer">VPN</a>.';
|
||||
out.policy_choices_ads = 'Masz również możliwość blokady naszej platformy analitycznej wykorzystując narzędzia adblock, takie jak <a href="https://www.eff.org/privacybadger" title="download privacy badger" target="_blank" rel="noopener noreferrer">Privacy Badger</a>.';
|
||||
|
||||
// terms.html
|
||||
|
||||
out.tos_title = "Warunki korzystania z usług Cryptpad";
|
||||
out.tos_legal = "Prosimy abyś nie był złośliwy, obelżywy i nie wykorzystywał tego oprogramowania do celow niezgodnych z prawem.";
|
||||
out.tos_availability = "Mamy nadzieję iż uznasz tę usługę za przydatną, lecz dostępność i wydajność nie mogą być przez nas gwarantowane. Prosimy, abyś eksportował swoje dane regularnie.";
|
||||
out.tos_e2ee = "Dokumenty Cryptpad mogą być odczytywane i modyfikowane przez każdego kto może zgadnąć lub w inny sposób uzyskać identyfikator dokumentu. Polecamy korzystania z oprogramowania szyfrującego end-to-end (e2ee) do udostępniania linków URL. Nie będziesz rościł sobie żadnych wierzytelności w wypadku gdy taki URL dostanie się w niepowołane ręce.";
|
||||
out.tos_logs = "Metadane dostarczane przez twoją przeglądarkę do serwera mogą być zapisywane i przechowywane w celu utrzymywania serwisu.";
|
||||
out.tos_3rdparties = "Nie dostarczamy indywidualizowanych danych do osób trzecich, poza sytuacjami dyktowanymi prawnie.";
|
||||
|
||||
// BottomBar.html
|
||||
|
||||
out.bottom_france = '<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer">Stworzone z <img class="bottom-bar-heart" src="/customize/heart.png" /> we <img class="bottom-bar-fr" src="/customize/fr.png" /></a>';
|
||||
out.bottom_support = '<a href="http://labs.xwiki.com/" title="XWiki Labs" target="_blank" rel="noopener noreferrer">Projekt <img src="/customize/logo-xwiki2.png" alt="XWiki SAS" class="bottom-bar-xwiki"/> Labs </a> we wspolpracy z <a href="http://ng.open-paas.org/" title="OpenPaaS::ng" target="_blank" rel="noopener noreferrer"> <img src="/customize/openpaasng.png" alt="OpenPaaS-ng" class="bottom-bar-openpaas" /></a>';
|
||||
|
||||
// Header.html
|
||||
|
||||
out.header_france = '<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer">Pełne <img class="bottom-bar-heart" src="/customize/heart.png" /> z <img class="bottom-bar-fr" src="/customize/fr.png" title="France" alt="France"/> od <img src="/customize/logo-xwiki.png" alt="XWiki SAS" class="bottom-bar-xwiki"/></a>';
|
||||
|
||||
|
||||
// TODO Hardcode cause YOLO
|
||||
//out.header_xwiki = '<a href="http://www.xwiki.com/" target="_blank" rel="noopener noreferrer"><img src="/customize/logo-xwiki.png" alt="XWiki SAS" class="bottom-bar-xwiki"/></a>';
|
||||
out.header_support = '<a href="http://ng.open-paas.org/" title="OpenPaaS::ng" target="_blank" rel="noopener noreferrer"> <img src="/customize/openpaasng.png" alt="OpenPaaS-ng" class="bottom-bar-openpaas" /></a>';
|
||||
out.header_logoTitle = 'Przejdź na stronę główną';
|
||||
|
||||
return out;
|
||||
});
|
@ -0,0 +1,371 @@
|
||||
define(function () {
|
||||
var out = {};
|
||||
|
||||
out.main_title = "CryptPad: Zero Knowledge, Colaborare în timp real";
|
||||
out.main_slogan = "Puterea stă în cooperare - Colaborarea este cheia";
|
||||
|
||||
out.type = {};
|
||||
out.pad = "Rich text";
|
||||
out.code = "Code";
|
||||
out.poll = "Poll";
|
||||
out.slide = "Presentation";
|
||||
out.drive = "Drive";
|
||||
out.whiteboard = "Whiteboard";
|
||||
out.file = "File";
|
||||
out.media = "Media";
|
||||
|
||||
out.button_newpad = "Filă Text Nouă";
|
||||
out.button_newcode = "Filă Cod Nouă";
|
||||
out.button_newpoll = "Sondaj Nou";
|
||||
out.button_newslide = "Prezentare Nouă";
|
||||
out.button_newwhiteboard = "Fila Desen Nouă";
|
||||
out.updated_0_common_connectionLost = "<b>Conexiunea la server este pierdută</b><br>Până la revenirea conexiunii, vei fi în modul citire";
|
||||
out.common_connectionLost = out.updated_0_common_connectionLost;
|
||||
out.websocketError = "Conexiune inexistentă către serverul websocket...";
|
||||
out.typeError = "Această filă nu este compatibilă cu aplicația aleasă";
|
||||
out.onLogout = "Nu mai ești autentificat, <a href=\"/\" target=\"_blank\">apasă aici</a> să te autentifici<br>sau apasă <em>Escape</em>să accesezi fila în modul citire.";
|
||||
out.wrongApp = "Momentan nu putem arăta conținutul sesiunii în timp real în fereastra ta. Te rugăm reîncarcă pagina.";
|
||||
out.loading = "Încarcă...";
|
||||
out.error = "Eroare";
|
||||
|
||||
out.saved = "Salvat";
|
||||
out.synced = "Totul a fost salvat";
|
||||
out.deleted = "Pad șters din CryptDrive-ul tău";
|
||||
out.disconnected = "Deconectat";
|
||||
out.synchronizing = "Se sincronizează";
|
||||
out.reconnecting = "Reconectare...";
|
||||
out.lag = "Decalaj";
|
||||
out.readonly = "Mod citire";
|
||||
out.anonymous = "Anonim";
|
||||
out.yourself = "Tu";
|
||||
out.anonymousUsers = "editori anonimi";
|
||||
out.anonymousUser = "editor anonim";
|
||||
out.users = "Utilizatori";
|
||||
out.and = "Și";
|
||||
out.viewer = "privitor";
|
||||
out.viewers = "privitori";
|
||||
out.editor = "editor";
|
||||
out.editors = "editori";
|
||||
out.language = "Limbă";
|
||||
out.upgrade = "Actualizare";
|
||||
out.upgradeTitle = "Actualizează-ți contul pentru a mări limita de stocare";
|
||||
out.MB = "MB";
|
||||
out.greenLight = "Totul funcționează corespunzător";
|
||||
out.orangeLight = "Conexiunea lentă la internet îți poate afecta experiența";
|
||||
out.redLight = "Ai fost deconectat de la sesiune";
|
||||
out.pinLimitReached = "Ai atins limita de stocare";
|
||||
out.pinLimitReachedAlert = "Ai atins limita de stocare. Noile pad-uri nu vor mai fi stocate în CryptDrive.<br>Pentru a rezolva această problemă, poți să nlături pad-uri din CryptDrive-ul tău (incluzând gunoiul) sau să subscrii la un pachet premium pentru a-ți extinde spațiul de stocare.";
|
||||
out.pinLimitNotPinned = "Ai atins limita de stocare.<br>Acest pad nu va fi stocat n CryptDrive-ul tău.";
|
||||
out.pinLimitDrive = "Ai atins limita de stocare.<br>Nu poți să creezi alte pad-uri.";
|
||||
out.importButtonTitle = "Importă un pad dintr-un fișier local";
|
||||
out.exportButtonTitle = "Exportă pad-ul acesta către un fișier local";
|
||||
out.exportPrompt = "Cum ai vrea să îți denumești fișierul?";
|
||||
out.changeNamePrompt = "Schimbă-ți numele (lasă necompletat dacă vrei să fii anonim): ";
|
||||
out.user_rename = "Schimbă numele afișat";
|
||||
out.user_displayName = "Nume afișat";
|
||||
out.user_accountName = "Nume cont";
|
||||
out.clickToEdit = "Click pentru editare";
|
||||
out.forgetButtonTitle = "Mută acest pad la gunoi";
|
||||
out.forgetPrompt = "Click-ul pe OK va muta acest pad la gunoi. Ești sigur?";
|
||||
out.movedToTrash = "Acest pad a fost mutat la gunoi.<br><a href=\"/drive/\">Acesează-mi Drive-ul</a>";
|
||||
out.shareButton = "Distribuie";
|
||||
out.shareSuccess = "Link copiat în clipboard";
|
||||
out.newButton = "Nou";
|
||||
out.newButtonTitle = "Crează un nou pad";
|
||||
out.saveTemplateButton = "Salvează ca șablon";
|
||||
out.saveTemplatePrompt = "Alege un titlu pentru șablon";
|
||||
out.templateSaved = "Șablon salvat!";
|
||||
out.selectTemplate = "Selectează un șablon sau apasă escape";
|
||||
out.presentButtonTitle = "Intră în modul de prezentare";
|
||||
out.presentSuccess = "Apasă ESC pentru a ieși din modul de prezentare";
|
||||
out.backgroundButtonTitle = "Schimbă culoarea de fundal din prezentare";
|
||||
out.colorButtonTitle = "Schimbă culoarea textului în modul de prezentare";
|
||||
out.printButton = "Printează (enter)";
|
||||
out.printButtonTitle = "Printează-ți slide-urile sau exportă-le ca fișier PDF";
|
||||
out.printOptions = "Opțiuni schemă";
|
||||
out.printSlideNumber = "Afișează numărul slide-ului";
|
||||
out.printDate = "Afișează data";
|
||||
out.printTitle = "Afișează titlul pad-ului";
|
||||
out.printCSS = "Reguli de stil personalizate (CSS):";
|
||||
out.printTransition = "Permite tranziția animațiilor";
|
||||
out.slideOptionsTitle = "Personalizează-ți slide-urile";
|
||||
out.slideOptionsButton = "Salvează (enter)";
|
||||
out.editShare = "Editează link-ul";
|
||||
out.editShareTitle = "Copiază link-ul de editare în clipboard";
|
||||
out.editOpen = "Deschide link-ul de editare într-o nouă filă";
|
||||
out.editOpenTitle = "Deschide acest pad în modul de editare într-o nouă filă";
|
||||
out.viewShare = "Link în modul citire";
|
||||
out.viewShareTitle = "Copiază link-ul în modul de citire în clipboard";
|
||||
out.viewOpen = "Deschide link-ul în modul de citire într-o filă nouă";
|
||||
out.viewOpenTitle = "Deschide acest pad în modul de citire într-o nouă filă";
|
||||
out.notifyJoined = "{0} s-au alăturat sesiunii colaborative";
|
||||
out.notifyRenamed = "{0} e cunoscut ca {1}";
|
||||
out.notifyLeft = "{0} au părăsit sesiunea colaborativă";
|
||||
out.okButton = "OK (enter)";
|
||||
out.cancel = "Anulează";
|
||||
out.cancelButton = "Anulează (esc)";
|
||||
out.historyButton = "Afișează istoricul documentului";
|
||||
out.history_next = "Mergi la versiunea următoare";
|
||||
out.history_prev = "Mergi la versiunea trecută";
|
||||
out.history_goTo = "Mergi la sesiunea selectată";
|
||||
out.history_close = "Înapoi";
|
||||
out.history_closeTitle = "Închide istoricul";
|
||||
out.history_restore = "Restabilește";
|
||||
out.history_restoreTitle = "Restabilește versiunea selectată a documentului";
|
||||
out.history_restorePrompt = "Ești sigur că vrei să înlocuiești versiunea curentă a documentului cu cea afișată?";
|
||||
out.history_restoreDone = "Document restabilit";
|
||||
out.history_version = "Versiune:";
|
||||
out.poll_title = "Zero Knowledge Selector Dată";
|
||||
out.poll_subtitle = "Zero Knowledge, <em>realtime</em> programare";
|
||||
out.poll_p_save = "Setările tale sunt actualizate instant, așa că tu nu trebuie să salvezi.";
|
||||
out.poll_p_encryption = "Tot conținutul tău este criptat ca doar persoanele cărora tu le dai link-ul să aibă acces. Nici serverul nu poate să vadă ce modifici.";
|
||||
out.wizardLog = "Click pe butonul din dreapta sus pentru a te ntoarce la sondajul tău";
|
||||
out.wizardTitle = "Folosește wizard-ul pentru a crea sondajul tău";
|
||||
out.wizardConfirm = "Ești pregătit să adaugi aceste opțiuni la sondajul tău?";
|
||||
out.poll_publish_button = "Publică";
|
||||
out.poll_admin_button = "Admin";
|
||||
out.poll_create_user = "Adaugă un nou utilizator";
|
||||
out.poll_create_option = "Adaugă o nouă opțiune";
|
||||
out.poll_commit = "Comite";
|
||||
out.poll_closeWizardButton = "Închide wizard-ul";
|
||||
out.poll_closeWizardButtonTitle = "Închide wizard-ul";
|
||||
out.poll_wizardComputeButton = "Calculează Opțiunile";
|
||||
out.poll_wizardClearButton = "Curăță Tabelul";
|
||||
out.poll_wizardDescription = "Crează automat un număr de opțiuni întroducând orice număr de zile sau intervale orare";
|
||||
|
||||
out.poll_wizardAddDateButton = "+ Zi";
|
||||
out.poll_wizardAddTimeButton = "+ Ore";
|
||||
out.poll_optionPlaceholder = "Opțiune";
|
||||
out.poll_userPlaceholder = "Numele tău";
|
||||
out.poll_removeOption = "Ești sigur că vrei să îndepărtezi această opțiune?";
|
||||
out.poll_removeUser = "Ești sigur că vrei să îndepărtezi aceast utilizator?";
|
||||
out.poll_titleHint = "Titlu";
|
||||
out.poll_descriptionHint = "Descrie sondajul, și apoi folosește butonul 'publică' când ai terminat. Orice utilizator care are link-ul poate modifica descrierea, dar descurajăm această practică.";
|
||||
out.canvas_clear = "Curăță";
|
||||
out.canvas_delete = "Curăță selecția";
|
||||
out.canvas_disable = "Dezactivează modul desen";
|
||||
out.canvas_enable = "Activează modul desen";
|
||||
out.canvas_width = "Lățime";
|
||||
out.canvas_opacity = "Opacitate";
|
||||
out.fm_rootName = "Documente";
|
||||
out.fm_trashName = "Gunoi";
|
||||
out.fm_unsortedName = "Fișiere nesortate";
|
||||
out.fm_filesDataName = "Toate fișierele";
|
||||
out.fm_templateName = "Șabloane";
|
||||
out.fm_searchName = "Caută";
|
||||
out.fm_searchPlaceholder = "Caută...";
|
||||
out.fm_newButton = "Nou";
|
||||
out.fm_newButtonTitle = "Crează un nou pad sau folder";
|
||||
out.fm_newFolder = "Folder nou";
|
||||
out.fm_newFile = "Pad nou";
|
||||
out.fm_folder = "Folder";
|
||||
out.fm_folderName = "Numele folderului";
|
||||
out.fm_numberOfFolders = "# de foldere";
|
||||
out.fm_numberOfFiles = "# of files";
|
||||
out.fm_fileName = "Nume filă";
|
||||
out.fm_title = "Titlu";
|
||||
out.fm_type = "Tip";
|
||||
out.fm_lastAccess = "Ultima accesare";
|
||||
out.fm_creation = "Creare";
|
||||
out.fm_forbidden = "Acțiune interzisă";
|
||||
out.fm_originalPath = "Ruta inițială";
|
||||
out.fm_openParent = "Arată în folder";
|
||||
out.fm_noname = "Document nedenumit";
|
||||
out.fm_emptyTrashDialog = "Ești sigur că vrei să golești coșul de gunoi?";
|
||||
out.fm_removeSeveralPermanentlyDialog = "Ești sigur că vrei să ștergi pentru totdeauna aceste {0} elemente din coșul de gunoi?";
|
||||
out.fm_removePermanentlyDialog = "Ești sigur că vrei să ștergi acest element pentru totdeauna?";
|
||||
out.fm_removeSeveralDialog = "Ești sigur că vrei să muți aceste {0} elemente la coșul de gunoi?";
|
||||
out.fm_removeDialog = "Ești sigur că vrei să muți {0} la gunoi?";
|
||||
out.fm_restoreDialog = "Ești sigur că vrei să restabilești {0} în locația trecută?";
|
||||
out.fm_unknownFolderError = "Ultima locație vizitată sau cea selectată nu mai există. Deschidem fișierul părinte...";
|
||||
out.fm_contextMenuError = "Nu putem deschide meniul de context pentru acest element. Dacă problema persistă, reîncarcă pagina.";
|
||||
out.fm_selectError = "Nu putem selecta elementul vizat. Dacă problema persistă, reîncarcă pagina.";
|
||||
out.fm_categoryError = "Nu putem deschide categoria selectată, afișează sursa.";
|
||||
out.fm_info_root = "Crează câte foldere tip cuib ai nevoie pentru a-ți sorta fișierele.";
|
||||
out.fm_info_unsorted = "Conține toate fișierele pe care le-ai vizitat și nu sunt sortate în \"Documente\" sau mutate în \"Gunoi\".";
|
||||
out.fm_info_template = "Conține toate pad-urile stocate ca șabloane și pe care le poți refolosi atunci când creezi un nou pad.";
|
||||
out.fm_info_trash = "Fișierele șterse din gunoi vor fi șterse și din \"Toate fișierele\", făcând imposibilă recuperarea fișierelor din managerul de fișiere.";
|
||||
out.fm_info_allFiles = "Conține toate fișierele din \"Documente\", \"Nesortate\" și \"Gunoi\". Poți să muți sau să ștergi fișierele aici.";
|
||||
out.fm_info_login = "Loghează-te";
|
||||
out.fm_info_register = "Înscrie-te";
|
||||
out.fm_info_anonymous = "Nu ești logat cu un cont valid așa că aceste pad-uri vor fi șterse (<a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">află de ce</a>). <a href=\"/register/\">Înscrie-te</a> sau <a href=\"/login/\">Loghează-te</a> pentru a le salva.";
|
||||
out.fm_alert_backupUrl = "Link copie de rezervă pentru acest drive.<br> Este <strong>foarte recomandat</strong> să o păstrezi pentru tine.<br>Poți să o folosești pentru a recupera toate fișierele în cazul în care memoria browserului tău este șterge..<br>Oricine are linkul poate să editeze sau să îndepărteze toate fișierele din managerul tău de documente.<br>";
|
||||
out.fm_alert_anonymous = "Salut, momentan folosești CryptPad în mod anonim. Este ok, doar că fișierele tale vor fi șterse după o perioadă de inactivitate. Am dezactivat caracteristicile avansate ale drive-ului pentru utilizatorii anonimi pentru a face clar faptul că stocare documentelor acolo nu este o metodă sigură. Poți să <a href=\"https://blog.cryptpad.fr/2017/05/17/You-gotta-log-in/\" target=\"_blank\">citești mai multe</a> despre motivarea noastră și despre ce de trebuie să te <a href=\"/register/\">Înregistrezi</a> si sa te <a href=\"/login/\">Loghezi</a>.";
|
||||
out.fm_backup_title = "Link de backup";
|
||||
out.fm_nameFile = "Cum ai vrea să numești fișierul?";
|
||||
out.fc_newfolder = "Folder nou";
|
||||
out.fc_rename = "Redenumește";
|
||||
out.fc_open = "Deschide";
|
||||
out.fc_open_ro = "Deschide (modul citire)";
|
||||
out.fc_delete = "Șterge";
|
||||
out.fc_restore = "Restaurează";
|
||||
out.fc_remove = "Șterge permanent";
|
||||
out.fc_empty = "Curăță coșul";
|
||||
out.fc_prop = "Proprietăți";
|
||||
out.fc_sizeInKilobytes = "Dimensiune n Kilobytes";
|
||||
out.fo_moveUnsortedError = "Nu poți să muți un folder la lista de pad-uri nesortate";
|
||||
out.fo_existingNameError = "Numele ales este deja folosit în acest director. Te rugăm să alegi altul.";
|
||||
out.fo_moveFolderToChildError = "Nu poți să muți un folder într-unul dintre descendenții săi";
|
||||
out.fo_unableToRestore = "Nu am reușit să restaurăm fișierul în locația de origine. Poți să ncerci să îl muți într-o nouă locație.";
|
||||
out.fo_unavailableName = "Un fișier sau un folder cu același nume există deja în locația nouă. Redenumește elementul și încearcă din nou.";
|
||||
out.login_login = "Loghează-te";
|
||||
out.login_makeAPad = "Crează un pad în modul anonim";
|
||||
out.login_nologin = "Răsfoiește pad-urile locale";
|
||||
out.login_register = "Înscrie-te";
|
||||
out.logoutButton = "Deloghează-te";
|
||||
out.settingsButton = "Setări";
|
||||
out.login_username = "Nume utilizator";
|
||||
out.login_password = "Parolă";
|
||||
out.login_confirm = "Confirmă parola";
|
||||
out.login_remember = "Ține-mă minte";
|
||||
out.login_hashing = "Încriptăm parola, o să mai dureze.";
|
||||
out.login_hello = "Salut {0},";
|
||||
out.login_helloNoName = "Salut,";
|
||||
out.login_accessDrive = "Acesează-ți drive-ul";
|
||||
out.login_orNoLogin = "sau";
|
||||
out.login_noSuchUser = "Nume de utilizator sau parolă invalide. Încearcă din nou sau înscrie-te.";
|
||||
out.login_invalUser = "Nume utilizator cerut";
|
||||
out.login_invalPass = "Parolă cerută";
|
||||
out.login_unhandledError = "O eroare neașteptată a avut loc emoticon_unhappy";
|
||||
out.register_importRecent = "Importă istoricul pad-ului (Recomandat)";
|
||||
out.register_acceptTerms = "Accept <a href='/terms.html'>termenii serviciului</a>";
|
||||
out.register_passwordsDontMatch = "Parolele nu se potrivesc!";
|
||||
out.register_mustAcceptTerms = "Trebuie să accepți termenii serviciului";
|
||||
out.register_mustRememberPass = "Nu putem să îți resetăm parola dacă o uiți. Este foarte important să o ții minte! Bifează căsuța pentru a confirma.";
|
||||
out.register_header = "Bine ai venit în CryptPad";
|
||||
out.register_explanation = "<p>Hai să stabilim câteva lucruri, mai întâi</p><ul><li>Parola ta este cheia secretă care criptează toate pad-urile tale. Dacă pierzi/uiți parola nu există nici-o metodă prin care îți putem recupera datele.</li><li>Poți importa pad-uri care au fost vizionate recent în browser pentru a le avea în cont.</li><li>Dacă folosești un computer împărțit, trebuie să te deloghezi, închiderea taburilor nu este de ajuns.</li></ul>";
|
||||
out.register_writtenPassword = "Mi-am notat numele de utilizator și parola, înaintează.";
|
||||
out.register_cancel = "Întoarce-te";
|
||||
out.register_warning = "Zero Knowledge înseamnă că noi nu îți putem recupera datele dacă îți pierzi parola.";
|
||||
out.register_alreadyRegistered = "Acest user există deja, vrei să te loghezi?";
|
||||
out.settings_title = "Setări";
|
||||
out.settings_save = "Salvează";
|
||||
out.settings_backupTitle = "Fă o copie de rezervă sau restaurează toate datele";
|
||||
out.settings_backup = "Copie de rezervă";
|
||||
out.settings_restore = "Restaurează";
|
||||
out.settings_resetTitle = "Curăță-ți drive-ul";
|
||||
out.settings_reset = "Îndepărtează toate fișierele și folderele din CryptPad-ul tău.";
|
||||
out.settings_resetPrompt = "Această acțiune va indepărta toate pad-urile din drive-ul tău.<br>Ești sigur că vrei să continui?<br>Tastează “<em>Iubesc CryptPad</em>” pentru a confirma.";
|
||||
out.settings_resetDone = "Drive-ul tău este acum gol!";
|
||||
out.settings_resetError = "Text de verificare incorect. CryptPad-ul tău nu a fost schimbat.";
|
||||
out.settings_resetTips = "Sfaturi în CryptDrive";
|
||||
out.settings_resetTipsButton = "Resetează sfaturile disponibile în CryptDrive";
|
||||
out.settings_resetTipsDone = "Toate sfaturile sunt vizibile din nou.";
|
||||
out.settings_importTitle = "Importă pad-urile recente ale acestui browser n CryptDrive-ul meu";
|
||||
out.settings_import = "Importă";
|
||||
out.settings_importConfirm = "Ești sigur că vrei să imporți pad-urile recente ale acestui browser în contul tău de CryptDrive?";
|
||||
out.settings_importDone = "Import complet";
|
||||
out.settings_userFeedbackHint1 = "CryptPad oferă niște feedback foarte simplu serverului, pentru a ne informa cum putem să îți îmbunătățim experiența voastră.";
|
||||
out.settings_userFeedbackHint2 = "Conținutul pad-ului tău nu va fi împărțit cu serverele.";
|
||||
out.settings_userFeedback = "Activează feedback";
|
||||
out.settings_anonymous = "Nu ești logat. Setările sunt specifice browser-ului.";
|
||||
out.settings_publicSigningKey = "Cheia de semnătură publică";
|
||||
out.settings_usage = "Uzaj";
|
||||
out.settings_usageTitle = "Vezi dimensiunea totală a pad-urilor fixate în MB";
|
||||
out.settings_pinningNotAvailable = "Pad-urile fixate sunt disponibile doar utilizatorilor înregistrați.";
|
||||
out.settings_pinningError = "Ceva nu a funcționat";
|
||||
out.settings_usageAmount = "Pad-urile tale fixate ocupă {0}MB";
|
||||
out.settings_logoutEverywhereTitle = "Deloghează-te peste tot";
|
||||
out.settings_logoutEverywhere = "Deloghează-te din toate sesiunile web";
|
||||
out.settings_logoutEverywhereConfirm = "Ești sigur? Va trebui să te loghezi, din nou, pe toate device-urile tale.";
|
||||
out.upload_serverError = "Eroare de server: fișierele tale nu pot fi încărcate la momentul acesta.";
|
||||
out.upload_uploadPending = "Ai deja o încărcare în desfășurare. Anulezi și încarci noul fișier?";
|
||||
out.upload_success = "Fișierul tău ({0}) a fost ncărcat și adăugat la drive-ul tău cu succes.";
|
||||
out.main_p2 = "Acest proiect folosește <a href=\"http://ckeditor.com/\">CKEditor</a> Visual Editor, <a href=\"https://codemirror.net/\">CodeMirror</a>, și <a href=\"https://github.com/xwiki-contrib/chainpad\">ChainPad</a> un motor în timp real.";
|
||||
out.main_howitworks_p1 = "CryptPad folosește o variantă a algoritmului de <a href=\"https://en.wikipedia.org/wiki/Operational_transformation\">Operational transformation</a> care este capabil să găsescă consens distribuit folosind <a href=\"https://bitcoin.org/bitcoin.pdf\">Nakamoto Blockchain</a>, o construcție popularizată de <a href=\"https://en.wikipedia.org/wiki/Bitcoin\">Bitcoin</a>. Astfel algoritmul poate evita nevoia ca serverul central să rezove conflicte, iar serverul nu este interesat de conținutul care este editat în pad.";
|
||||
out.main_about_p2 = "Dacă ai orice fel de întrebare sau comentariu, poți să ne <a href=\"https://twitter.com/cryptpad\">dai un tweet</a>, semnalezi o problemă <a href=\"https://github.com/xwiki-labs/cryptpad/issues/\" title=\"index de probleme\">on github</a>, spui salut pe IRC (<a href=\"http://webchat.freenode.net?channels=%23cryptpad&uio=MT1mYWxzZSY5PXRydWUmMTE9Mjg3JjE1PXRydWUe7\" title=\"freenode webchat\">irc.freenode.net</a>), sau <a href=\"research@xwiki.com\">trimiți un email</a>.";
|
||||
out.main_info = "<h1>Colaborează în siguranță</h1><br> Dezvoltă-ți ideile împreună cu documentele partajate în timp ce tehnologia <strong>Zero Knowledge</strong> îți păstrează securitatea; chiar și de noi.";
|
||||
out.main_howitworks = "Cum funcționează";
|
||||
out.main_zeroKnowledge = "Zero Knowledge";
|
||||
out.main_zeroKnowledge_p = "Nu trebuie să ne crezi că <em>nu ne uităm</em> la pad-urile tale, cu tehnologia revoluționară Zero Knowledge a CryptPad <em>nu putem</em>. Învață mai multe despre cum îți protejăm <a href=\"/privacy.html\" title='Intimitatea'>Intimitate și Securitate</a>.";
|
||||
out.main_writeItDown = "Notează";
|
||||
out.main_writeItDown_p = "Cele mai importante proiecte vin din idei mici. Notează-ți momentele de inspirație și ideile neașteptate pentru că nu știi niciodată care ar putea fi noua mare descoperire.";
|
||||
out.main_share = "Partajează link-ul, partajează pad-ul";
|
||||
out.main_share_p = "Dezvoltă-ți ideile împreună: organizează întâlniri eficiente, colaborează pe liste TODO și fă prezentări scurte cu toți prietenii tăi și device-urile tale.";
|
||||
out.main_organize = "Organizează-te";
|
||||
out.main_organize_p = "Cu CryptPad Drive, poți să stai cu ochii pe ce este important. Folderele îți permit să ții evidența proiectelor tale și să ai o viziune globală asupra evoluției lucrurilor.";
|
||||
out.tryIt = "Testează!";
|
||||
out.main_richText = "Rich Text editor";
|
||||
out.main_richText_p = "Editează texte complexe în mod colaborativ cu Zero Knowledge în timp real. <a href=\"http://ckeditor.com\" target=\"_blank\">CkEditor</a> application.";
|
||||
out.main_code = "Editor cod";
|
||||
out.main_code_p = "Editează cod din softul tău, în mod colaborativ, cu Zero Knowledge în timp real.<a href=\"https://www.codemirror.net\" target=\"_blank\">CodeMirror</a> application.";
|
||||
out.main_slide = "Editor slide-uri";
|
||||
out.main_slide_p = "Crează-ți prezentări folosind sintaxa Markdown, și afișează-le în browser-ul tău.";
|
||||
out.main_poll = "Sondaj";
|
||||
out.main_poll_p = "Plănuiește întâlniri sau evenimente, sau votează pentru cea mai bună soluție pentru problema ta.";
|
||||
out.main_drive = "CryptDrive";
|
||||
out.footer_applications = "Aplicații";
|
||||
out.footer_contact = "Contact";
|
||||
out.footer_aboutUs = "Despre noi";
|
||||
out.about = "Despre";
|
||||
out.privacy = "Privacy";
|
||||
out.contact = "Contact";
|
||||
out.terms = "ToS";
|
||||
out.blog = "Blog";
|
||||
out.policy_title = "Politica de confidențialitate CryptPad";
|
||||
out.policy_whatweknow = "Ce știm despre tine";
|
||||
out.policy_whatweknow_p1 = "Ca o aplicație care este găzduită online, CryptPad are acces la metadatele expuse de protocolul HTTP. Asta include adresa IP-ului tău, și alte titluri HTTP care pot fi folosite ca să identifice un browser. Poți să vezi ce informații împărtășește browser-ul tău vizitând <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.whatismybrowser.com/detect/what-http-headers-is-my-browser-sending\" title=\"what http headers is my browser sending\">WhatIsMyBrowser.com</a>.";
|
||||
out.policy_whatweknow_p2 = "Folosim <a href=\"https://www.elastic.co/products/kibana\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"platforma de analiză open source\">Kibana</a>, o platformă open source, pentru a afla mai multe despre utilizatorii noștri. Kibana ne spune despre cum ai găsit CryptPad, căutare directă, printr-un motor de căutare, sau prin recomandare de la un alt serviciu online ca Reddit sau Twitter.";
|
||||
out.policy_howweuse = "Cum folosim ce aflăm";
|
||||
out.policy_howweuse_p1 = "Folosim aceste informații pentru a lua decizii mai bune în promovarea CryptPad, prin evaluarea eforturilor trecute care au fost de succes. Informațiile despre locația ta ne ajută să aflăm dacă ar trebui să oferim suport pentru alte limbi, pe lângă engleză.";
|
||||
out.policy_howweuse_p2 = "Informațiile despre browser-ul tău (dacă este bazat pe un sistem de operare desktop sau mobil) ne ajută să luăm decizii când prioritizăm viitoarele îmbunătățiri. Echipa noastră de dezvoltare este mică, și încercăm să facem alegeri care să îmbunătățească experiența câtor mai mulți utilizatori.";
|
||||
|
||||
out.policy_whatwetell = "Ce le spunem altora despre tine";
|
||||
out.policy_whatwetell_p1 = "Nu furnizăm informațiile obținute terților, decât dacă ne este cerut în mod legal.";
|
||||
out.policy_links = "Link-uri către alte site-uri";
|
||||
out.policy_links_p1 = "Acest site conține link-uri către alte site-uri, incluzându-le pe cele produse de alte organizații. Nu suntem responsabili pentru practicile de intimitate sau pentru conținutul site-urilor externe. Ca regulă generală, link-urile către site-uri externe sunt deschise ntr-o fereastră noup, pentru a face clar faptul că părăsiți CryptPad.fr.";
|
||||
out.policy_ads = "Reclame";
|
||||
out.policy_ads_p1 = "Nu afișăm nici o formă de publicitate online, dar s-ar putea să atașăm link-uri către instituțiile care ne finanțează cerecetarea.";
|
||||
out.policy_choices = "Ce alegeri ai";
|
||||
out.policy_choices_open = "Codul nostru este open source, așa că tu ai mereu posibilitatea de a-ți găzdui propria instanță de CryptPad.";
|
||||
out.policy_choices_vpn = "Dacă vrei să folosești instanța găzduită de noi, dar nu vrei să îți expui IP-ul, poți să îl protejezi folosind <a href=\"https://www.torproject.org/projects/torbrowser.html.en\" title=\"downloads from the Tor project\" target=\"_blank\" rel=\"noopener noreferrer\">Tor browser bundle</a>, sau <a href=\"https://riseup.net/en/vpn\" title=\"VPNs provided by Riseup\" target=\"_blank\" rel=\"noopener noreferrer\">VPN</a>.";
|
||||
out.policy_choices_ads = "Dacă vrei doar să blochezi platforma noastră de analiză, poți folosi soluții de adblocking ca <a href=\"https://www.eff.org/privacybadger\" title=\"download privacy badger\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy Badger</a>.";
|
||||
out.tos_title = "CryptPad Termeni de Utilizare";
|
||||
out.tos_legal = "Te rugăm să nu fii rău intenționat, abuziv, sau să faci orice ilegal.";
|
||||
out.tos_availability = "Sperăm că o să găsești acest serviciu util, dar disponibilitatea sau performanța nu poate fi garantată. Te rugăm să îți exporți datele n mod regulat.";
|
||||
out.tos_e2ee = "Conținutul CryptPad poate fi citit sau modificat de oricine care poate ghici sau obține fragmentul identificator al pad-ului. Recomandăm să folosești soluții de comunicare criptate end-to-end-encrypted (e2ee) pentru a partaja link-uri, evitând orice risc în cazul unei scurgeri de informații.";
|
||||
out.tos_logs = "Metadatele oferite de browser-ul tău serverului ar putea fi înscrise în scopul de a menține serviciul.";
|
||||
out.tos_3rdparties = "Nu oferim date personale terților, decât dacă ne sunt solicitate prin lege.";
|
||||
out.bottom_france = "<a href=\"http://www.xwiki.com/\" target=\"_blank\" rel=\"noopener noreferrer\">Realizat cu <img class=\"bottom-bar-heart\" src=\"/customize/heart.png\" alt=\"love\" /> n <img class=\"bottom-bar-fr\" src=\"/customize/fr.png\" alt=\"Franța\" /></a>";
|
||||
out.bottom_support = "<a href=\"http://labs.xwiki.com/\" title=\"XWiki Labs\" target=\"_blank\" rel=\"noopener noreferrer\">Un proiect al <img src=\"/customize/logo-xwiki2.png\" alt=\"XWiki SAS\" class=\"bottom-bar-xwiki\"/> Labs Project </a> cu susținerea <a href=\"http://ng.open-paas.org/\" title=\"OpenPaaS::ng\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"/customize/openpaasng.png\" alt=\"OpenPaaS-ng\" class=\"bottom-bar-openpaas\" /></a>";
|
||||
out.header_france = "<a href=\"http://www.xwiki.com/\" target=\"_blank\" rel=\"noopener noreferrer\">With <img class=\"bottom-bar-heart\" src=\"/customize/heart.png\" alt=\"love\" /> from <img class=\"bottom-bar-fr\" src=\"/customize/fr.png\" title=\"Franța\" alt=\"Franța\"/> by <img src=\"/customize/logo-xwiki.png\" alt=\"XWiki SAS\" class=\"bottom-bar-xwiki\"/></a>";
|
||||
out.header_support = "<a href=\"http://ng.open-paas.org/\" title=\"OpenPaaS::ng\" target=\"_blank\" rel=\"noopener noreferrer\"> <img src=\"/customize/openpaasng.png\" alt=\"OpenPaaS-ng\" class=\"bottom-bar-openpaas\" /></a>";
|
||||
out.header_logoTitle = "Mergi la pagina principală";
|
||||
out.initialState = "<span style=\"font-size:16px;\"><p>Acesta este <strong>CryptPad</strong>, editorul colaborativ bazat pe tehnologia Zero Knowledge în timp real. Totul este salvat pe măsură ce scrii.<br>Partajează link-ul către acest pad pentru a edita cu prieteni sau folosește <span class=\"fa fa-share-alt\" style=\"border:1px solid black;color:#000;\"> Share </span> butonul pentru a partaja <em>read-only link</em> permițând vizualizarea dar nu și editarea.</p><p><em>Îndrăznește, începe să scrii...</em></p></span><p> <br></p>";
|
||||
out.codeInitialState = "/*\n Acesta este editorul colaborativ de cod bazat pe tehnologia Zero Knowledge CryptPad.\n Ce scrii aici este criptat, așa că doar oamenii care au link-ul pot să-l acceseze.\n Poți să alegi ce limbaj de programare pus n evidență și schema de culori UI n dreapta sus.\n*/";
|
||||
out.slideInitialState = "# CryptSlide\n* Acesta este un editor colaborativ bazat pe tehnologia Zero Knowledge.\n* Ce scrii aici este criptat, așa că doar oamenii care au link-ul pot să-l acceseze.\n* Nici măcar serverele nu au acces la ce scrii tu.\n* Ce vezi aici, ce auzi aici, atunci când pleci, lași aici.\n\n-\n# Cum se folosește\n1. Scrie-ți conținutul slide-urilor folosind sintaxa markdown\n - Află mai multe despre sintaxa markdown [aici](http://www.markdowntutorial.com/)\n2. Separă-ți slide-urile cu -\n3. Click pe butonul \"Play\" pentru a vedea rezultatele - Slide-urile tale sunt actualizate în timp real.";
|
||||
out.driveReadmeTitle = "Ce este CryptDrive?";
|
||||
out.readme_welcome = "Bine ai venit n CryptPad !";
|
||||
out.readme_p1 = "Bine ai venit în CryptPad, acesta este locul unde îți poți lua notițe, singur sau cu prietenii.";
|
||||
out.readme_p2 = "Acest pad o să îți ofere un scurt ghid în cum poți să folosești CryptPad pentru a lua notițe, a le ține organizate și a colabora pe ele.";
|
||||
out.readme_cat1 = "Descoperă-ți CryptDrive-ul";
|
||||
out.readme_cat1_l1 = "Crează un pad: În CryptDrive-ul tău, dă click {0} apoi {1} și poți să creezi un pad.";
|
||||
out.readme_cat1_l2 = "Deschide pad-urile din CryptDrive-ul tău: doublu-click pe iconița unui pad pentru a-l deschide.";
|
||||
out.readme_cat1_l3 = "Organizează-ți pad-urile: Când ești logat, orice pad accesezi va fi afișat ca în secțiunea {0} a drive-ului tău.";
|
||||
out.readme_cat1_l3_l1 = "Poți să folosești funcția click and drag pentru a muta fișierele în folderele secțiunii {0} a drive-ului tău și pentru a crea noi foldere.";
|
||||
out.readme_cat1_l3_l2 = "Ține minte să încerci click-dreapta pe iconițe pentru că există și meniuri adiționale.";
|
||||
out.readme_cat1_l4 = "Pune pad-urile vechi în gunoi. Poți să folosești funcția click and drag pe pad-uri în categoria {0} la fel ca și în cazul folderelor.";
|
||||
out.readme_cat2 = "Crează pad-uri ca un profesionist";
|
||||
out.edit = "editează";
|
||||
out.view = "vezi";
|
||||
out.readme_cat2_l1 = "Butonul {0} din pad-ul tău dă accesul colaboratorilor tăi să {1} sau să {2} pad-ul.";
|
||||
out.readme_cat2_l2 = "Schimbă titlul pad-ului dând click pe creion";
|
||||
out.readme_cat3 = "Descoperă aplicațiile CryptPad";
|
||||
out.readme_cat3_l1 = "Cu editorul de cod CryptPad, poți colabora pe cod ca Javascript și markdown ca HTML și Markdown";
|
||||
out.readme_cat3_l2 = "Cu editorul de slide-uri CryptPad, poți să faci prezentări scurte folosind Markdown";
|
||||
out.readme_cat3_l3 = "Cu CryptPoll poți să organizezi votări rapide, mai ales pentru a programa ntâlniri care se potrivesc calendarelor tuturor";
|
||||
|
||||
out.tips = { };
|
||||
out.tips.lag = "Iconița verde din dreapta-sus arată calitatea conexiunii internetului tău la serverele CryptPad.";
|
||||
out.tips.shortcuts = "`ctrl+b`, `ctrl+i` and `ctrl+u` sunt scurtături pentru bold, italic și underline.";
|
||||
out.tips.indentare = "În listele cu bulină sau cele numerotate, poți folosi tab sau shift+tab pentru a mări sau micșora indentarea.";
|
||||
out.tips.titlu = "Poți seta titlul pad-urilor tale prin click pe centru sus.";
|
||||
out.tips.stocare = "De fiecare dată când vizitezi un pad, dacă ești logat va fi salvat pe CryptDrive-ul tău.";
|
||||
out.tips.marker = "Poți sublinia text într-un pad folosind itemul \"marker\" n meniul de stiluri.";
|
||||
|
||||
out.feedback_about = "Dacă citești asta, probabil că ești curios de ce CryptPad cere pagini web atunci când întreprinzi anumite acțiuni";
|
||||
out.feedback_privacy = "Ne pasă de intimitatea ta, si în același timp vrem să păstrăm CryptPad ușor de folosit. Folosim acest fișier pentru a ne da seama care beneficii UI contează cel mai mult pentru utilizatori, cerându-l alături de un parametru specific atunci când acțiunea se desfășoară";
|
||||
out.feedback_optout = "Dacă vrei să ieși, vizitează <a href='/settings/'>setările de pe pagina ta de user</a>, unde vei găsi o căsuță pentru a activa sau dezactiva feedback-ul de la user";
|
||||
|
||||
return out;
|
||||
});
|
@ -1,190 +0,0 @@
|
||||
define([
|
||||
'/api/config?cb=' + Math.random().toString().slice(2),
|
||||
'/customize/messages.js',
|
||||
'/bower_components/chainpad-listmap/chainpad-listmap.js',
|
||||
'/bower_components/chainpad-crypto/crypto.js',
|
||||
'/customize/store.js',
|
||||
|
||||
'/bower_components/scrypt-async/scrypt-async.min.js',
|
||||
'/bower_components/tweetnacl/nacl-fast.min.js',
|
||||
], function (Config, Messages, Listmap, Crypto, Store) {
|
||||
var Scrypt = window.scrypt;
|
||||
var Nacl = window.nacl;
|
||||
|
||||
var User = {};
|
||||
var localKey = User.localKey = 'cryptpad_user_session';
|
||||
var store;
|
||||
|
||||
Store.ready(function (err, s) {
|
||||
if (err) {
|
||||
console.error(err);
|
||||
return;
|
||||
}
|
||||
store = s;
|
||||
});
|
||||
|
||||
var isArray = function (o) { return Object.prototype.toString.call(o) === '[object Array]'; };
|
||||
|
||||
var session = User.session = function (secret, cb) {
|
||||
if (secret) {
|
||||
store.set(localKey, secret, cb);
|
||||
return;
|
||||
}
|
||||
if (secret === null) {
|
||||
store.remove(localKey, cb);
|
||||
}
|
||||
|
||||
store.get(localKey, cb);
|
||||
};
|
||||
|
||||
/* 64 uint8s symmetric keys
|
||||
32 b64 channel
|
||||
16 b64 key
|
||||
16 b64 junk
|
||||
32 uint8s ed signing key
|
||||
32 uint8s curve public key */
|
||||
var parse128 = function (A) {
|
||||
if (A.length !== 128) {
|
||||
throw new Error("Expected 128 uint8s!");
|
||||
}
|
||||
var symmetric = Nacl.util.encodeBase64(A.slice(0, 36));
|
||||
return {
|
||||
ed: A.slice(96),
|
||||
curve: A.slice(64, 96),
|
||||
channel: symmetric.slice(0, 32),
|
||||
key: symmetric.slice(32),
|
||||
extra: A.slice(36, 64),
|
||||
};
|
||||
};
|
||||
|
||||
var initialize = User.initialize = function (proxy, secret, cb) {
|
||||
proxy.on('ready', function (info) {
|
||||
var now = ''+new Date();
|
||||
// old atime
|
||||
var otime = proxy.atime;
|
||||
|
||||
var atime = proxy.atime = now;
|
||||
|
||||
// creation time
|
||||
proxy.ctime = proxy.ctime || now;
|
||||
|
||||
proxy.username = proxy.username || secret.username;
|
||||
proxy.schema = proxy.schema || 'login_data-v0';
|
||||
|
||||
proxy.documents = proxy.documents || [];
|
||||
cb(void 0, proxy);
|
||||
});
|
||||
};
|
||||
|
||||
/*
|
||||
cb(proxy);
|
||||
*/
|
||||
var connect = User.connect = function (secret, cb) {
|
||||
if (!secret) {
|
||||
// FIXME
|
||||
return;
|
||||
}
|
||||
var config = {
|
||||
websocketURL: Config.websocketURL,
|
||||
channel: secret.channel,
|
||||
data: {},
|
||||
crypto: Crypto.createEncryptor(secret.key),
|
||||
logLevel: 0,
|
||||
};
|
||||
var rt = Listmap.create(config);
|
||||
initialize(rt.proxy, secret, cb);
|
||||
};
|
||||
|
||||
var disconnect = User.disconnect = function (cb) {
|
||||
var err = "User.disconnect is not implemented yet";
|
||||
cb(err);
|
||||
};
|
||||
|
||||
var genSecret = User.genSecret = function (uname, pw, cb) {
|
||||
Scrypt(pw,
|
||||
uname,
|
||||
15, // memory cost parameter
|
||||
8, // block size parameter
|
||||
128, // derived key length
|
||||
200, // interruptStep
|
||||
function (bytes) {
|
||||
var secret = parse128(bytes);
|
||||
secret.username = uname;
|
||||
cb(void 0, secret);
|
||||
});
|
||||
};
|
||||
|
||||
/* Asynchronously derive 128 random uint8s given a uname and password
|
||||
|
||||
cb(proxy, secret)
|
||||
*/
|
||||
var login = User.login = function (uname, pw, cb) {
|
||||
genSecret(uname, pw, function (err, secret) {
|
||||
session(secret, function (err) {
|
||||
connect(secret, cb);
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
var prepareStore = User.prepareStore = function (proxy) {
|
||||
var store = {};
|
||||
|
||||
var ps = proxy.store = proxy.store || {};
|
||||
|
||||
var set = store.set = function (key, val, cb) {
|
||||
ps[key] = val;
|
||||
cb();
|
||||
};
|
||||
|
||||
var batchset = store.setBatch = function (map, cb) {
|
||||
if (isArray(map) || typeof(map) !== 'object') {
|
||||
cb('[setBatch.TypeError] expected key-value pairs to set');
|
||||
return;
|
||||
}
|
||||
Object.keys(map).forEach(function (k) {
|
||||
ps[k] = map[k];
|
||||
});
|
||||
cb();
|
||||
};
|
||||
|
||||
var get = store.get = function (key, cb) {
|
||||
cb(void 0, ps[key]);
|
||||
};
|
||||
|
||||
var batchget = store.getBatch = function (keys, cb) {
|
||||
if (!isArray(keys)) {
|
||||
cb('[getBatch.TypeError] expected array of keys to return');
|
||||
return;
|
||||
}
|
||||
var map = {};
|
||||
keys.forEach(function (k) {
|
||||
map[k] = ps[k];
|
||||
});
|
||||
cb(void 0, map);
|
||||
};
|
||||
|
||||
var remove = store.remove = function (key, cb) {
|
||||
ps[key] = undefined;
|
||||
cb();
|
||||
};
|
||||
|
||||
var batchremove = store.removeBatch = function (keys, cb) {
|
||||
if (!isArray(keys)) {
|
||||
cb('[batchremove.TypeError] expected array of keys to remove');
|
||||
return;
|
||||
}
|
||||
keys.forEach(function (k) {
|
||||
ps[k] = undefined;
|
||||
});
|
||||
cb();
|
||||
};
|
||||
|
||||
var keys = store.keys = function (cb) {
|
||||
cb(void 0, Object.keys(ps));
|
||||
};
|
||||
|
||||
return store;
|
||||
};
|
||||
|
||||
return User;
|
||||
});
|
@ -0,0 +1,23 @@
|
||||
version: '2'
|
||||
services:
|
||||
|
||||
cryptpad:
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
- VERSION=${VERSION}
|
||||
image: "xwiki/cryptpad:${VERSION}"
|
||||
hostname: cryptpad
|
||||
|
||||
labels:
|
||||
- traefik.port=3000
|
||||
- traefik.frontend.passHostHeader=true
|
||||
environment:
|
||||
- USE_SSL=${USE_SSL}
|
||||
- STORAGE=${STORAGE}
|
||||
- LOG_TO_STDOUT=${LOG_TO_STDOUT}
|
||||
|
||||
restart: always
|
||||
volumes:
|
||||
- ./data/files:/cryptpad/datastore:rw
|
||||
- ./data/customize:/cryptpad/customize:rw
|