Compare commits
200 Commits
webpack-in
...
master
Author | SHA1 | Date |
---|---|---|
xdrm-brackets | 010160e109 | |
xdrm-brackets | 51dab68805 | |
xdrm-brackets | d534f1f37c | |
xdrm-brackets | fad2ac4696 | |
xdrm-brackets | cea356fb66 | |
xdrm-brackets | 5a8cc4ddb7 | |
Guillaume FAUVET | 972dc6f86d | |
xdrm-brackets | 1463253b86 | |
xdrm-brackets | 7cb932335c | |
xdrm-brackets | 044abf22e4 | |
xdrm-brackets | 741656e6f1 | |
xdrm-brackets | 2b53f076bc | |
xdrm-brackets | 855cfa023a | |
xdrm-brackets | 11761e16e2 | |
xdrm-brackets | 512bd699de | |
xdrm-brackets | 2da458ad31 | |
xdrm-brackets | 8e78142119 | |
xdrm-brackets | ec59cde080 | |
xdrm-brackets | 60a6ec10bf | |
xdrm-brackets | 89520180c7 | |
xdrm-brackets | dd4ae7e748 | |
xdrm-brackets | 81449426a5 | |
xdrm-brackets | 27942b8b82 | |
xdrm-brackets | a073f5632d | |
Guillaume FAUVET | d2b54f431b | |
xdrm-brackets | aa5b97dcc8 | |
xdrm-brackets | 69df30d57c | |
SeekDaSky | 26c6a6bb22 | |
SeekDaSky | 3c68e0a100 | |
Guillaume FAUVET | b1bafa61a8 | |
xdrm-brackets | 87504efc0a | |
xdrm-brackets | d8156b3f55 | |
SeekDaSky | f468536e13 | |
SeekDaSky | f3437d8db9 | |
Guillaume FAUVET | 65ad834bd8 | |
Guillaume FAUVET | c0013f25b0 | |
xdrm-brackets | 90c05624ab | |
Guillaume FAUVET | a04a0ede20 | |
Guillaume FAUVET | 8d62ed08e5 | |
Guillaume FAUVET | dbdc578ea3 | |
Guillaume FAUVET | 438607a1e6 | |
xdrm-brackets | 66d8eb39eb | |
SeekDaSky | a906da7266 | |
SeekDaSky | a297a89287 | |
xdrm-brackets | 94ad405dee | |
xdrm-brackets | 1400d445ee | |
xdrm-brackets | bdf119700c | |
xdrm-brackets | 97c6dcf8be | |
xdrm-brackets | f3e3f1496b | |
Guillaume FAUVET | e8d385f1f6 | |
Guillaume FAUVET | 0596380219 | |
Guillaume FAUVET | db00a1cdc3 | |
Guillaume FAUVET | 7f183ed8ea | |
Guillaume FAUVET | 067ef7de6a | |
Guillaume FAUVET | 35129d49f0 | |
xdrm-brackets | d7710a2b92 | |
xdrm-brackets | f856b67f7e | |
xdrm-brackets | 965b634f72 | |
xdrm-brackets | d7a5e57a22 | |
xdrm-brackets | 56b4327184 | |
Guillaume FAUVET | b12eb46939 | |
Guillaume FAUVET | 514f56db18 | |
Guillaume FAUVET | 11895fb875 | |
Guillaume FAUVET | 2791dda887 | |
Guillaume FAUVET | d0dc02e53f | |
Guillaume FAUVET | 0406689523 | |
SeekDaSky | d5078b9bc9 | |
SeekDaSky | e82f192f8e | |
xdrm-brackets | 96b92e02cb | |
xdrm-brackets | 48f9be4f3c | |
SeekDaSky | ce31a026c5 | |
SeekDaSky | 1327cfebda | |
xdrm-brackets | 8875440602 | |
xdrm-brackets | 4699fe9e70 | |
xdrm-brackets | ec45b1c13a | |
xdrm-brackets | ca3e25b0e7 | |
xdrm-brackets | dc167766fa | |
xdrm-brackets | b7d22fad31 | |
xdrm-brackets | ab1b3080c7 | |
xdrm-brackets | cddb82a8b5 | |
xdrm-brackets | 9f0f82c521 | |
xdrm-brackets | 216412f26a | |
SeekDaSky | cb5482950f | |
SeekDaSky | d5c713de6c | |
SeekDaSky | 79c74e9832 | |
xdrm-brackets | e30b4a6098 | |
xdrm-brackets | c01cbb89a7 | |
xdrm-brackets | a5a89be961 | |
xdrm-brackets | 3434ac229c | |
xdrm-brackets | 0861185a8e | |
xdrm-brackets | a166ecc004 | |
SeekDaSky | 63b5c3afa8 | |
xdrm-brackets | 602d72f361 | |
xdrm-brackets | 62b353eea9 | |
xdrm-brackets | 8a649dbf0b | |
xdrm-brackets | 037057cc8a | |
xdrm-brackets | 5ecb15048a | |
xdrm-brackets | a20335c045 | |
xdrm-brackets | 9a9af7373e | |
xdrm-brackets | 978d920fec | |
xdrm-brackets | f4c59b11a6 | |
xdrm-brackets | 629df98a36 | |
xdrm-brackets | cf08a98b9e | |
xdrm-brackets | ad575c3697 | |
xdrm-brackets | ece78fa1bd | |
xdrm-brackets | 84cabd92eb | |
xdrm-brackets | ea6d21634d | |
xdrm-brackets | 78439ec878 | |
xdrm-brackets | 40598a5418 | |
xdrm-brackets | 97bb6de0cf | |
xdrm-brackets | d824ae38f0 | |
xdrm-brackets | 1c34b59231 | |
xdrm-brackets | 29cb835400 | |
SeekDaSky | 7f4b481bb6 | |
SeekDaSky | 4f6fa13155 | |
Guillaume FAUVET | 95e90bef20 | |
Guillaume FAUVET | 3c442e48a5 | |
xdrm-brackets | 4cfb4a7f4d | |
xdrm-brackets | ff129222b9 | |
xdrm-brackets | 7092a5f9c8 | |
xdrm-brackets | c107e6c38b | |
xdrm-brackets | 926f5d1224 | |
xdrm-brackets | 5d9e6ef83f | |
SeekDaSky | 27bb422aca | |
SeekDaSky | 3ba539e9de | |
SeekDaSky | 5ccdc2e804 | |
xdrm-brackets | 1945158724 | |
xdrm-brackets | 40967db18b | |
xdrm-brackets | 6a483539f5 | |
xdrm-brackets | adcaf1a72f | |
xdrm-brackets | 9b67c15a6b | |
xdrm-brackets | 372d532f1b | |
xdrm-brackets | 1db7f17830 | |
xdrm-brackets | 8c919acc4b | |
xdrm-brackets | b7c307a852 | |
xdrm-brackets | d61476d302 | |
xdrm-brackets | 54a95d481c | |
xdrm-brackets | 7b5c057da6 | |
xdrm-brackets | 49b4e0a914 | |
xdrm-brackets | 21d4be378e | |
xdrm-brackets | fe1ab69cf0 | |
xdrm-brackets | 3fd5fdfa97 | |
xdrm-brackets | 69a6be7c2d | |
xdrm-brackets | 18a20ca7b4 | |
xdrm-brackets | 3f646bcd6c | |
xdrm-brackets | ba14390582 | |
xdrm-brackets | ee05d5f432 | |
xdrm-brackets | 3862675b1d | |
xdrm-brackets | 0f1d995c94 | |
xdrm-brackets | dd7bad469c | |
xdrm-brackets | 47d9dfac0b | |
xdrm-brackets | 7363f6ea1a | |
xdrm-brackets | 3b524fbe93 | |
xdrm-brackets | 092836359b | |
xdrm-brackets | 6bcc725d31 | |
xdrm-brackets | 19a9ab9dc4 | |
xdrm-brackets | dc02f564be | |
xdrm-brackets | e0debfed54 | |
xdrm-brackets | c02253dc11 | |
xdrm-brackets | 64d04d83b9 | |
xdrm-brackets | 8b6e616a1f | |
xdrm-brackets | 2ae283987a | |
xdrm-brackets | add5e16625 | |
xdrm-brackets | 6d894c456f | |
xdrm-brackets | 7db3f2e3f8 | |
xdrm-brackets | 2a791d0401 | |
xdrm-brackets | 9fdec3c2db | |
xdrm-brackets | 360c2f7133 | |
xdrm-brackets | 7e2714222d | |
xdrm-brackets | 54757ef460 | |
xdrm-brackets | dfe9843845 | |
xdrm-brackets | c2f3f0ce15 | |
xdrm-brackets | 8ce1bcd7dd | |
xdrm-brackets | 49ff17aa71 | |
xdrm-brackets | dc66a92169 | |
xdrm-brackets | e81817b819 | |
xdrm-brackets | b66bafb3c3 | |
xdrm-brackets | a2746b6275 | |
xdrm-brackets | 43e1c742b7 | |
xdrm-brackets | c5fae9e7ce | |
xdrm-brackets | 2653f896f2 | |
xdrm-brackets | ddd2ae4870 | |
xdrm-brackets | 705cd4bc55 | |
xdrm-brackets | f62e247d6b | |
xdrm-brackets | 7a4c6d7ca8 | |
xdrm-brackets | 8e5c1680be | |
xdrm-brackets | 5d9cc9e33c | |
xdrm-brackets | f1a9e65327 | |
xdrm-brackets | 5894aecae3 | |
xdrm-brackets | 2e7291929a | |
xdrm-brackets | d043c83ead | |
xdrm-brackets | ace717d6e4 | |
xdrm-brackets | 3ace1314b6 | |
xdrm-brackets | bad67426a5 | |
xdrm-brackets | 6443dbbf7e | |
xdrm-brackets | d03d889024 | |
xdrm-brackets | 07edda0345 | |
xdrm-brackets | 8d5806710b | |
xdrm-brackets | 6da4f911ae | |
SeekDaSky | 9e96edb1ab |
|
@ -1,12 +1,15 @@
|
|||
websocket.out
|
||||
ndli1718.jar
|
||||
.vscode
|
||||
.DS_Store
|
||||
node_modules/
|
||||
dist/
|
||||
npm-debug.log
|
||||
yarn-error.log
|
||||
public_html/js/bundle.js
|
||||
public_html/js/bundle.js*
|
||||
public_html/js/bundle@*.js
|
||||
public_html/js/bundle@*.js*
|
||||
package-lock.json
|
||||
yarn.lock
|
||||
|
||||
# Editor directories and files
|
||||
.idea
|
||||
|
@ -14,3 +17,4 @@ package-lock.json
|
|||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
/.gtm/
|
||||
|
|
141
README.md
|
@ -9,3 +9,144 @@
|
|||
- Guillaume Fauvet
|
||||
- Adrien Marquès
|
||||
```
|
||||
|
||||
|
||||
# Installation
|
||||
|
||||
### 1. Clonage des sources
|
||||
|
||||
Placez vous dans le dossier qui contiendra le projet
|
||||
|
||||
```bash
|
||||
> git clone https://git.xdrm.io/ndli1718/main.git ndli1718-web;
|
||||
```
|
||||
|
||||
Si le clonage a fonctionné, il doit maintenant contenir un nouveau dossier `ndli1718-web` contenant les sources.
|
||||
|
||||
### 2. Créer un lien pour Apache/nginx
|
||||
|
||||
Toujours dans le dossier parent (celui qui contient `ndli1718-web`)
|
||||
|
||||
##### 1. Sous apache
|
||||
|
||||
```bash
|
||||
> ln -s ndli1718-web /var/www/ndli1718-web;
|
||||
```
|
||||
|
||||
##### 2. Sous Nginx
|
||||
|
||||
```bash
|
||||
> ln -s ndli1718-web /usr/local/nginx/html/ndli1718-web;
|
||||
```
|
||||
|
||||
|
||||
### 3-1. Configuration Apache
|
||||
|
||||
> Si vous n'avez pas apache
|
||||
```bash
|
||||
> sudo apt-get install apache2 libapache2-mod-php mysql-server php-mysql php;
|
||||
```
|
||||
|
||||
##### 1. Créer l'hôte virtuel
|
||||
|
||||
Créer le fichier `/etc/apache2/sites-available/ndli1718.conf`
|
||||
|
||||
```xml
|
||||
<VirtualHost *:80>
|
||||
ServerName ndli1718
|
||||
|
||||
ServerAdmin mail@example.com
|
||||
DocumentRoot /var/www/ndli1718-web
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/ndli1718-error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/ndli1718-access.log combined
|
||||
|
||||
#Include conf-available/serve-cgi-bin.conf
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
|
||||
##### 2. Enregistrer le nom de domaine local
|
||||
|
||||
Ajouter la ligne suivante dans le fichier `/etc/hosts`
|
||||
|
||||
```txt
|
||||
127.0.0.1 ndli1718
|
||||
```
|
||||
|
||||
Cela permettra à apache au lieu de chercher le nom de domaine `ndli1718` (qui n'existe pas) de rediriger directement vers vous-même. (Localhost au lieu de passer par des serveurs DNS).
|
||||
|
||||
##### 3. Corriger les permissions
|
||||
|
||||
Dans le dossier des sources (ndli1718-web):
|
||||
|
||||
```bash
|
||||
> source /etc/apache2/envvars;
|
||||
> sudo chown -R $USER:$APACHE_RUN_USER .;
|
||||
> sudo chmod -R 775 .;
|
||||
> sudo chmod -R g+s .;
|
||||
```
|
||||
|
||||
|
||||
##### 4. Activer l'hôte virtuel
|
||||
|
||||
```bash
|
||||
> sudo a2ensite ndli1718.conf;
|
||||
> sudo service apache2 reload;
|
||||
```
|
||||
|
||||
|
||||
##### 5. Test de la configuration
|
||||
|
||||
Ouvrer le navigateur de votre choix avec l'URL `http://ndli1718/`.
|
||||
|
||||
Si la page ne fonctionne pas, vérifiez dans les logs d'apache de quoi il s'agit.
|
||||
|
||||
```bash
|
||||
> tail -f /var/log/apache2/ndli1718-error.log;
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 3-2. Configuration nginx
|
||||
|
||||
**TODO**
|
||||
|
||||
|
||||
### 4. Installation webpack / vuejs
|
||||
|
||||
##### 1. Installation de nodejs+npm
|
||||
|
||||
Installation de node js (ajout du repository officiel)
|
||||
```bash
|
||||
> curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
|
||||
> sudo apt-get install -y nodejs
|
||||
```
|
||||
|
||||
##### 2. Mise à jour de npm
|
||||
|
||||
```bash
|
||||
> npm install -g npm@latest;
|
||||
```
|
||||
|
||||
*Attention:* Si vous n'avez pas les permissions et qu'il vous demande d'être **root**, suivez ce [tuto](https://docs.npmjs.com/getting-started/fixing-npm-permissions).
|
||||
|
||||
|
||||
##### 3. Installation de vue-cli
|
||||
|
||||
```bash
|
||||
> npm install -g vue-cli;
|
||||
```
|
||||
|
||||
##### 4. Construction du projet
|
||||
|
||||
Dans le dossier du projet `ndli1718-web`, lancez les commandes suivantes:
|
||||
|
||||
```bash
|
||||
> npm install;
|
||||
> touch ./public_html/js/bundle@a.{js,js.map};
|
||||
> npm run build;
|
||||
```
|
||||
|
||||
|
||||
**.. voila ..**
|
|
@ -25,11 +25,13 @@
|
|||
public static function check(){
|
||||
/* (1) Initialisation
|
||||
---------------------------------------------------------*/
|
||||
if( !isset($_SESSION['TOKEN']) ) $_SESSION['TOKEN'] = [];
|
||||
if( !isset($_SESSION['AUTH']) ) $_SESSION['AUTH'] = [];
|
||||
if( !isset($_SESSION['PERM']) ) $_SESSION['PERM'] = [];
|
||||
if( !isset($_SESSION['USER']) ) $_SESSION['USER'] = [];
|
||||
if( !isset($_SESSION['ADMIN']) ) $_SESSION['ADMIN'] = [];
|
||||
if( !isset($_SESSION['TOKEN']) ) $_SESSION['TOKEN'] = [];
|
||||
if( !isset($_SESSION['AUTH']) ) $_SESSION['AUTH'] = [];
|
||||
if( !isset($_SESSION['PERM']) ) $_SESSION['PERM'] = [];
|
||||
if( !isset($_SESSION['USER']) ) $_SESSION['USER'] = [];
|
||||
if( !isset($_SESSION['ADMIN']) ) $_SESSION['ADMIN'] = [];
|
||||
if( !isset($_SESSION['NAME']) ) $_SESSION['NAME'] = '';
|
||||
if( !isset($_SESSION['WS']) ) $_SESSION['WS'] = true;
|
||||
|
||||
|
||||
/* (2) Gestion de AUTH (authentification)
|
||||
|
@ -37,8 +39,10 @@
|
|||
$AUTH = '';
|
||||
|
||||
/* (1) Si Auth dans HEADER, on le récupère */
|
||||
if( isset($_SERVER['PHP_AUTH_DIGEST']) && is_string($_SERVER['PHP_AUTH_DIGEST']) )
|
||||
if( isset($_SERVER['PHP_AUTH_DIGEST']) && is_string($_SERVER['PHP_AUTH_DIGEST']) ){
|
||||
$AUTH = $_SERVER['PHP_AUTH_DIGEST'];
|
||||
$_SESSION['WS'] = true;
|
||||
}
|
||||
|
||||
/* (2) Si SESSION déja connectée -> no récupère le token */
|
||||
elseif( isset($_SESSION['TOKEN']) && is_string($_SESSION['TOKEN']) )
|
||||
|
|
|
@ -141,6 +141,10 @@
|
|||
return $checker && (is_numeric($value) || $value == null || $value == 'null');
|
||||
break;
|
||||
|
||||
case "float":
|
||||
return $checker && is_float($value);
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
break;
|
||||
|
|
|
@ -119,7 +119,8 @@
|
|||
// On rajoute l'erreur au message
|
||||
$returnData = array_merge([
|
||||
'error' => $this->error->get(),
|
||||
'ErrorDescription' => $this->error->explicit()
|
||||
'ErrorDescription' => $this->error->explicit(),
|
||||
'name' => $_SESSION['NAME']
|
||||
],
|
||||
$this->data
|
||||
);
|
||||
|
@ -127,6 +128,7 @@
|
|||
return json_encode($returnData);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -9,7 +9,7 @@ use \database\core\Repo;
|
|||
use \api\core\AuthSystemDefault;
|
||||
|
||||
|
||||
class authentication{
|
||||
class admin{
|
||||
|
||||
public function __construct(){}
|
||||
|
||||
|
@ -17,7 +17,7 @@ class authentication{
|
|||
|
||||
|
||||
|
||||
public function POST_admin($argv){
|
||||
public function POST_login($argv){
|
||||
extract($argv);
|
||||
|
||||
/* (1) Logout by default
|
||||
|
@ -52,6 +52,7 @@ class authentication{
|
|||
---------------------------------------------------------*/
|
||||
/* (1) Update session */
|
||||
$_SESSION['TOKEN'] = 'a'.$fetched_admin['token'];
|
||||
$_SESSION['WS'] = true; // to tell websocket we are connected
|
||||
new AuthSystemDefault;
|
||||
|
||||
/* (2) Return status */
|
||||
|
@ -59,7 +60,10 @@ class authentication{
|
|||
|
||||
}
|
||||
|
||||
public function POST_user($argv){
|
||||
|
||||
|
||||
|
||||
public function POST_signup($argv){
|
||||
extract($argv);
|
||||
|
||||
|
||||
|
@ -68,37 +72,44 @@ class authentication{
|
|||
$_SESSION['TOKEN'] = [];
|
||||
|
||||
|
||||
/* (2) Search for @id_user from username
|
||||
/* (2) Check if @username is unique
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Fetch by username */
|
||||
$fetched_user = Repo::request('user', 'getByUsername', $username);
|
||||
$fetched_admin = Repo::request('admin', 'getByUsername', $username);
|
||||
|
||||
/* (2) If not found -> error */
|
||||
if( !is_array($fetched_user) || !isset($fetched_user['id_user']) || !is_numeric($fetched_user['id_user']) )
|
||||
return ['connected' => false];
|
||||
|
||||
/* (3) Extract @id_user */
|
||||
$id_user = intval( $fetched_user['id_user'] );
|
||||
/* (2) If found -> error */
|
||||
if( $fetched_admin !== false )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
|
||||
/* (3) Check password for user
|
||||
/* (3) Check if @mail is unique
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Check password */
|
||||
$valid_pass = Repo::request('user', 'checkPassword', $id_user, $password);
|
||||
/* (1) Fetch by mail */
|
||||
$fetched_admin = Repo::request('admin', 'getByMail', $mail);
|
||||
|
||||
/* (2) If wrong password -> error */
|
||||
if( !$valid_pass )
|
||||
return ['connected' => false];
|
||||
/* (2) If found -> error */
|
||||
if( $fetched_admin !== false )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
|
||||
/* (4) Update session to be connected
|
||||
/* (4) Create user
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Update session */
|
||||
$_SESSION['TOKEN'] = 'u'.$fetched_user['token'];
|
||||
new AuthSystemDefault;
|
||||
/* (1) Create repo request */
|
||||
$id_created = Repo::request('admin', 'create', $username, $mail, $password);
|
||||
|
||||
/* (2) Return status */
|
||||
return ['connected' => true];
|
||||
/* (2) If error -> dispatch */
|
||||
if( $id_created === false )
|
||||
return [ 'error' => new Error(Err::RepoError) ];
|
||||
|
||||
/* (3) Return status */
|
||||
return [ 'registered' => $id_created ];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function DELETE_logout(){
|
||||
$_SESSION = [];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace api\module;
|
||||
|
||||
|
||||
use \error\core\Error;
|
||||
use \error\core\Err;
|
||||
use \database\core\Repo;
|
||||
use \api\core\AuthSystemDefault;
|
||||
|
||||
|
||||
class dev{
|
||||
|
||||
public function __construct(){}
|
||||
|
||||
public function __destruct(){}
|
||||
|
||||
|
||||
|
||||
public function GET_session_destroy($argv){
|
||||
extract($argv);
|
||||
|
||||
$_SESSION = [];
|
||||
|
||||
return ['notice' => 'reload the website NOW !!'];
|
||||
}
|
||||
|
||||
public function GET_release($argv){
|
||||
extract($argv);
|
||||
|
||||
\chdir(__ROOT__);
|
||||
\exec("git pull origin master", $out_pull);
|
||||
\exec("npm update");
|
||||
\exec("npm run build", $out_npm);
|
||||
|
||||
return [ 'stdout' => [ $out_pull, $out_npm ] ];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,213 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 07/12/17
|
||||
* Time: 19:48
|
||||
*/
|
||||
|
||||
namespace api\module;
|
||||
|
||||
|
||||
use \database\core\Repo;
|
||||
use \error\core\Error;
|
||||
use \error\core\Err;
|
||||
use kwebsocket\core\wsinterop;
|
||||
|
||||
class message
|
||||
{
|
||||
|
||||
public function GET_emergency($argv){
|
||||
extract($argv);
|
||||
|
||||
$messages = [];
|
||||
|
||||
return ["sent" => true, "messages" => $messages];
|
||||
//TODO: tout poster dans la BDD
|
||||
}
|
||||
|
||||
public function POST_emergency($argv){
|
||||
extract($argv);
|
||||
|
||||
/* (1) Get ID_USER if connected
|
||||
---------------------------------------------------------*/
|
||||
$id_user = null;
|
||||
$name = null;
|
||||
|
||||
if( count($_SESSION['ADMIN']) > 0 )
|
||||
$id_user = $_SESSION['ADMIN']['id'];
|
||||
|
||||
elseif( count($_SESSION['USER']) > 0 )
|
||||
$id_user = $_SESSION['USER']['id'];
|
||||
|
||||
else
|
||||
$name = $_SESSION['NAME'];
|
||||
|
||||
|
||||
/* (2) Create emergenct
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to create entry */
|
||||
$id_created = Repo::request('emergency', 'create',
|
||||
$id_user,
|
||||
$name,
|
||||
$message,
|
||||
0,
|
||||
$location[0],
|
||||
$location[1],
|
||||
$URL_0
|
||||
);
|
||||
|
||||
/* (2) If cannot create -> dispatch error */
|
||||
if( $id_created === false )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
|
||||
|
||||
/* (3) Send to WebSocket
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Open socket */
|
||||
$wsi = new wsinterop('localhost', 9998);
|
||||
|
||||
/* (2) Send data */
|
||||
$wsi->send([
|
||||
'operation' => 'PostMessage',
|
||||
'message' => $message,
|
||||
'username' => $_SESSION['NAME'],
|
||||
'location' => $location,
|
||||
'id' => $id_created,
|
||||
'channelType' => 'Emergency',
|
||||
'channelName' => "$URL_0"
|
||||
]);
|
||||
|
||||
/* (3) Close socket */
|
||||
$wsi->close();
|
||||
|
||||
|
||||
return ['sent' => intval($id_created) ];
|
||||
}
|
||||
|
||||
public function DELETE_emergency($argv){
|
||||
extract($argv);
|
||||
|
||||
/* (1) Create emergenct
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to create entry */
|
||||
$deleted = Repo::request('emergency', 'remove', $id);
|
||||
|
||||
/* (2) If cannot create -> dispatch error */
|
||||
if( $deleted === false )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
|
||||
|
||||
/* (2) Send to WebSocket
|
||||
---------------------------------------------------------*/
|
||||
$wsi = new wsinterop("localhost",9998);
|
||||
|
||||
$wsi->send([
|
||||
'operation' => 'DelMessage',
|
||||
'id' => "$id",
|
||||
'channelType' => 'Emergency',
|
||||
'channelName' => "$URL_0"
|
||||
]);
|
||||
|
||||
$wsi->close();
|
||||
|
||||
return ["deleted" => true];
|
||||
}
|
||||
|
||||
public function PUT_emergency($argv){
|
||||
extract($argv);
|
||||
|
||||
/* (1) Create emergenct
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to create entry */
|
||||
$updated = Repo::request('emergency', 'update', $id, $message);
|
||||
|
||||
/* (2) If cannot create -> dispatch error */
|
||||
if( $updated === false )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
|
||||
|
||||
/* (2) Send to WebSocket
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Create socket */
|
||||
$wsi = new wsinterop("localhost",9998);
|
||||
|
||||
/* (2) Send data */
|
||||
$wsi->send([
|
||||
"operation" => "UpdMessage",
|
||||
"id" => "$id",
|
||||
"message" => $message,
|
||||
"channelType" => "Emergency",
|
||||
"channelName" => "$URL_0"
|
||||
]);
|
||||
|
||||
/* (3) Close socket */
|
||||
$wsi->close();
|
||||
|
||||
return ['updated' => true];
|
||||
}
|
||||
|
||||
public function POST_event($argv){
|
||||
extract($argv);
|
||||
|
||||
$wsi = new wsinterop("localhost",9998);
|
||||
|
||||
$wsi->send([
|
||||
"operation" => "PostMessage",
|
||||
"message" => $message,
|
||||
"username" => $_SESSION['NAME'],
|
||||
"location" => $location,
|
||||
"type" => $type,
|
||||
//TODO implémenter la récupération d'id depuis la bdd
|
||||
"id" => uniqid(),
|
||||
"channelType" => "Event",
|
||||
"channelName" => is_null($URL_0) ? "" : "$URL_0"
|
||||
]);
|
||||
|
||||
$wsi->close();
|
||||
|
||||
return ["sent" => true];
|
||||
//TODO: tout poster dans la BDD
|
||||
}
|
||||
|
||||
public function DELETE_event($argv){
|
||||
extract($argv);
|
||||
|
||||
$wsi = new wsinterop("localhost",9998);
|
||||
|
||||
$wsi->send([
|
||||
"operation" => "DelMessage",
|
||||
"id" => $id,
|
||||
"channelType" => "Event",
|
||||
"channelName" => is_null($URL_0) ? "" : "$URL_0"
|
||||
]);
|
||||
|
||||
$wsi->close();
|
||||
|
||||
return ["sent" => true];
|
||||
//TODO: tout poster dans la BDD
|
||||
}
|
||||
|
||||
public function PUT_event($argv){
|
||||
extract($argv);
|
||||
|
||||
$wsi = new wsinterop("localhost",9998);
|
||||
|
||||
$wsi->send([
|
||||
"operation" => "UpdMessage",
|
||||
"id" => $id,
|
||||
"message" => $message,
|
||||
"channelType" => "Event",
|
||||
"channelName" => is_null($URL_0) ? "" : "$URL_0"
|
||||
]);
|
||||
|
||||
$wsi->close();
|
||||
|
||||
return ["sent" => true];
|
||||
//TODO: tout poster dans la BDD
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,114 @@
|
|||
<?php
|
||||
|
||||
namespace api\module;
|
||||
|
||||
|
||||
use \error\core\Error;
|
||||
use \error\core\Err;
|
||||
use \database\core\Repo;
|
||||
use \api\core\AuthSystemDefault;
|
||||
|
||||
|
||||
class user{
|
||||
|
||||
public function __construct(){}
|
||||
|
||||
public function __destruct(){}
|
||||
|
||||
|
||||
public function POST_login($argv){
|
||||
extract($argv);
|
||||
|
||||
|
||||
/* (1) Logout by default
|
||||
---------------------------------------------------------*/
|
||||
$_SESSION['TOKEN'] = [];
|
||||
|
||||
|
||||
/* (2) Search for @id_user from username
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Fetch by username */
|
||||
$fetched_user = Repo::request('user', 'getByUsername', $username);
|
||||
|
||||
/* (2) If not found -> error */
|
||||
if( !is_array($fetched_user) || !isset($fetched_user['id_user']) || !is_numeric($fetched_user['id_user']) )
|
||||
return ['connected' => false];
|
||||
|
||||
/* (3) Extract @id_user */
|
||||
$id_user = intval( $fetched_user['id_user'] );
|
||||
|
||||
|
||||
/* (3) Check password for user
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Check password */
|
||||
$valid_pass = Repo::request('user', 'checkPassword', $id_user, $password);
|
||||
|
||||
/* (2) If wrong password -> error */
|
||||
if( !$valid_pass )
|
||||
return ['connected' => false];
|
||||
|
||||
|
||||
/* (4) Update session to be connected
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Update session */
|
||||
$_SESSION['TOKEN'] = 'u'.$fetched_user['token'];
|
||||
$_SESSION['WS'] = true; // to tell websocket we are connected
|
||||
new AuthSystemDefault;
|
||||
|
||||
/* (2) Return status */
|
||||
return ['connected' => true];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public function POST_signup($argv){
|
||||
extract($argv);
|
||||
|
||||
|
||||
/* (1) Logout by default
|
||||
---------------------------------------------------------*/
|
||||
$_SESSION['TOKEN'] = [];
|
||||
|
||||
|
||||
/* (2) Check if @username is unique
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Fetch by username */
|
||||
$fetched_user = Repo::request('user', 'getByUsername', $username);
|
||||
|
||||
/* (2) If found -> error */
|
||||
if( $fetched_user !== false )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
|
||||
/* (3) Check if @mail is unique
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Fetch by mail */
|
||||
$fetched_user = Repo::request('user', 'getByMail', $mail);
|
||||
|
||||
/* (2) If found -> error */
|
||||
if( $fetched_user !== false )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
|
||||
/* (4) Create user
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Create repo request */
|
||||
$id_created = Repo::request('user', 'create', $username, $mail, $password);
|
||||
|
||||
/* (2) If error -> dispatch */
|
||||
if( $id_created === false )
|
||||
return [ 'error' => new Error(Err::RepoError) ];
|
||||
|
||||
/* (3) Return status */
|
||||
return [ 'registered' => $id_created ];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function DELETE_logout(){
|
||||
$_SESSION = [];
|
||||
}
|
||||
|
||||
}
|
|
@ -114,11 +114,11 @@
|
|||
try{
|
||||
|
||||
/* (1) If local -> instanciates with local configuration */
|
||||
if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
|
||||
// if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
|
||||
self::$instance[$label] = new DatabaseDriver($conf[$label]['local']['host'], $conf[$label]['local']['dbname'], $conf[$label]['local']['user'], $conf[$label]['local']['password']);
|
||||
/* (2) If Remote -> instanciates with Remote configuration */
|
||||
else
|
||||
self::$instance[$label] = new DatabaseDriver($conf[$label]['remote']['host'], $conf[$label]['remote']['dbname'], $conf[$label]['remote']['user'], $conf[$label]['remote']['password']);
|
||||
// else
|
||||
// self::$instance[$label] = new DatabaseDriver($conf[$label]['remote']['host'], $conf[$label]['remote']['dbname'], $conf[$label]['remote']['user'], $conf[$label]['remote']['password']);
|
||||
|
||||
return true;
|
||||
|
||||
|
|
|
@ -4,9 +4,12 @@
|
|||
|
||||
class Repo_i{
|
||||
|
||||
/**
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $pdo = null;
|
||||
|
||||
public function setPDO($pdo){
|
||||
public function setPDO( \PDO $pdo){
|
||||
|
||||
$this->pdo = $pdo;
|
||||
|
||||
|
|
|
@ -0,0 +1,146 @@
|
|||
<?php
|
||||
|
||||
namespace database\repo;
|
||||
use \database\core\Repo_i;
|
||||
|
||||
class emergency extends Repo_i{
|
||||
|
||||
|
||||
/* (1) Return all emergencies in database
|
||||
*
|
||||
* @limit<int> Nb max voulu
|
||||
*
|
||||
* @return emergencies<array> The emergency list
|
||||
* FALSE on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getAll(int $limit){
|
||||
|
||||
/* (1) Statement */
|
||||
$st = $this->pdo->query("SELECT * FROM `emergency` ORDER BY `timestamp` DESC LIMIT $limit");
|
||||
|
||||
/* (2) Fetched data */
|
||||
return $st->fetchAll();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Return a emergency by its `id_emergency`
|
||||
*
|
||||
* @id_emergency<int> The emergency UID
|
||||
*
|
||||
* @return emergency<array> The emergency if found
|
||||
* FALSE on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getById(int $id_emergency){
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("SELECT * FROM `emergency` WHERE `id_emergency` = :id_emergency LIMIT 1");
|
||||
|
||||
/* (2) Bind variables */
|
||||
$pst->bindParam(':id_emergency', $id_emergency, \PDO::PARAM_INT);
|
||||
|
||||
/* (3) Execute */
|
||||
if( !$pst->execute() ) return false; // if error -> send FALSE
|
||||
|
||||
/* (4) Fetched data */
|
||||
return $pst->fetch();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Creates a new emergency
|
||||
*
|
||||
* @id_user<int|null> The user ID if defined
|
||||
* @name<String> The user name (if not connected)
|
||||
* @message<String> The message content
|
||||
* @type<int> The message type
|
||||
* @latitude<int> Sender latitude
|
||||
* @longitude<int> Sender longitude
|
||||
* @dep<int> Departement id
|
||||
*
|
||||
* @return id_created<int> UID of the created emergency
|
||||
* FALSE on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create($id_user, String $name, String $message, int $type, float $latitude, float $longitude, $dep){
|
||||
|
||||
/* (2) Create the emergency
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("INSERT INTO `emergency`(`id_emergency`, `id_user`, `timestamp`, `name`, `message`, `type`, `latitude`, `longitude`, `dep`)
|
||||
VALUES(DEFAULT, :id_user, DEFAULT, :name, :message, :type, :latitude, :longitude, :dep)");
|
||||
|
||||
/* (3) Bind variables */
|
||||
$pst->bindParam(':id_user', $id_user, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':name', $name, \PDO::PARAM_STR, 50);
|
||||
$pst->bindParam(':message', $message, \PDO::PARAM_STR);
|
||||
$pst->bindParam(':type', $type, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':latitude', $latitude, \PDO::PARAM_STR);
|
||||
$pst->bindParam(':longitude', $longitude, \PDO::PARAM_STR);
|
||||
$pst->bindParam(':dep', $dep, \PDO::PARAM_STR, 2);
|
||||
|
||||
/* (4) Execute -> if error return FALSE */
|
||||
if( !$pst->execute() ) return false;
|
||||
|
||||
|
||||
/* (2) Get the id
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Get last inserted id */
|
||||
return $this->pdo->lastInsertId();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Updates an emergency
|
||||
*
|
||||
* @id_emergency<int> The emergency UID
|
||||
* @new_msg<String> New message content
|
||||
*
|
||||
* @return updated<bool> True if updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function update(int $id_emergency, String $new_msg){
|
||||
|
||||
/* (1) Update the emergency
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("UPDATE `emergency` SET `message` = :new_msg WHERE `id_emergency` = :id_emergency");
|
||||
|
||||
/* (3) Bind variables */
|
||||
$pst->bindParam(':id_emergency', $id_emergency, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':new_msg', $new_msg, \PDO::PARAM_STR);
|
||||
|
||||
/* (4) Execute -> if error return FALSE */
|
||||
return $pst->execute();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (5) Removes an emergency
|
||||
*
|
||||
* @id_emergency<int> The emergency UID
|
||||
*
|
||||
* @return removed<bool> True has been removed
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function remove(int $id_emergency){
|
||||
|
||||
/* (1) Update the emergency
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("DELETE FROM `emergency` WHERE `id_emergency` = :id_emergency");
|
||||
|
||||
/* (2) Bind variables */
|
||||
$pst->bindParam(':id_emergency', $id_emergency, \PDO::PARAM_INT);
|
||||
|
||||
/* (3) Execute -> if error return FALSE */
|
||||
return $pst->execute();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,148 @@
|
|||
<?php
|
||||
|
||||
namespace database\repo;
|
||||
use \database\core\Repo_i;
|
||||
|
||||
class event extends Repo_i{
|
||||
|
||||
|
||||
/* (1) Return all events in database
|
||||
*
|
||||
* @limit<int> Nb max voulu
|
||||
*
|
||||
* @return events<array> The event list
|
||||
* FALSE on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getAll(int $limit){
|
||||
|
||||
/* (1) Statement */
|
||||
$st = $this->pdo->query("SELECT * FROM `event` ORDER BY `timestamp` DESC LIMIT $limit");
|
||||
|
||||
/* (2) Fetched data */
|
||||
return $st->fetchAll();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Return a event by its `id_event`
|
||||
*
|
||||
* @id_event<int> The event UID
|
||||
*
|
||||
* @return event<array> The event if found
|
||||
* FALSE on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getById(int $id_event){
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("SELECT * FROM `event` WHERE `id_event` = :id_event LIMIT 1");
|
||||
|
||||
/* (2) Bind variables */
|
||||
$pst->bindParam(':id_event', $id_event, \PDO::PARAM_INT);
|
||||
|
||||
/* (3) Execute */
|
||||
if( !$pst->execute() ) return false; // if error -> send FALSE
|
||||
|
||||
/* (4) Fetched data */
|
||||
return $pst->fetch();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Creates a new event
|
||||
*
|
||||
* @id_user<int|null> The user ID if defined
|
||||
* @name<String> The user name (if not connected)
|
||||
* @timestamp<int> The timestamp
|
||||
* @message<String> The message content
|
||||
* @type<int> The message type
|
||||
* @latitude<int> Sender latitude
|
||||
* @longitude<int> Sender longitude
|
||||
* @dep<int> Departement id
|
||||
*
|
||||
* @return id_created<int> UID of the created event
|
||||
* FALSE on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create($id_user, String $name, int $timestamp, String $message, int $type, float $latitude, float $longitude, int $dep){
|
||||
|
||||
/* (2) Create the event
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("INSERT INTO `event`(`id_event`, `id_user`, `timestamp`, `name`, `message`, `type`, `latitude`, `longitude`, `dep`)
|
||||
VALUES(DEFAULT, :id_user, :timestamp, :name, :message, :type, :latitude, :longitude, :dep)");
|
||||
|
||||
/* (3) Bind variables */
|
||||
$pst->bindParam(':id_user', $id_user, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':timestamp', $timestamp, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':name', $name, \PDO::PARAM_STR, 50);
|
||||
$pst->bindParam(':message', $message, \PDO::PARAM_STR);
|
||||
$pst->bindParam(':type', $type, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':latitude', $latitude, \PDO::PARAM_STR);
|
||||
$pst->bindParam(':longitude', $longitude, \PDO::PARAM_STR);
|
||||
$pst->bindParam(':dep', $dep, \PDO::PARAM_STR, 2);
|
||||
|
||||
/* (4) Execute -> if error return FALSE */
|
||||
if( !$pst->execute() ) return false;
|
||||
|
||||
|
||||
/* (2) Get the id
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Get last inserted id */
|
||||
return $this->pdo->lastInsertId;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Updates an event
|
||||
*
|
||||
* @id_event<int> The event UID
|
||||
* @new_msg<String> New message content
|
||||
*
|
||||
* @return updated<bool> True if updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function update(int $id_event, String $new_msg){
|
||||
|
||||
/* (1) Update the event
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("UPDATE `event` SET `message` = :new_msg WHERE `id_event` = :id_event");
|
||||
|
||||
/* (3) Bind variables */
|
||||
$pst->bindParam(':id_event', $id_event, \PDO::PARAM_INT);
|
||||
$pst->bindParam(':new_msg', $new_msg, \PDO::PARAM_STR);
|
||||
|
||||
/* (4) Execute -> if error return FALSE */
|
||||
return $pst->execute();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (5) Removes an event
|
||||
*
|
||||
* @id_event<int> The event UID
|
||||
*
|
||||
* @return removed<bool> True has been removed
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function remove(int $id_event){
|
||||
|
||||
/* (1) Update the event
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$pst = $this->pdo->prepare("DELETE FROM `event` WHERE `id_event` = :id_event");
|
||||
|
||||
/* (2) Bind variables */
|
||||
$pst->bindParam(':id_event', $id_event, \PDO::PARAM_INT);
|
||||
|
||||
/* (3) Execute -> if error return FALSE */
|
||||
return $pst->execute();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -88,6 +88,7 @@
|
|||
case Err::UnknownTemplate: return $this->UnknownTemplate(); break;
|
||||
case Err::UnknownAddress: return $this->UnknownAddress(); break;
|
||||
case Err::UnknownError: return $this->UnknownError(); break;
|
||||
case Err::AlreadyExists: return $this->AlreadyExists(); break;
|
||||
|
||||
default: return $this->UnknownDebugError(); break;
|
||||
}
|
||||
|
@ -179,6 +180,8 @@
|
|||
return 'unknown';
|
||||
}private function UnknownError(){
|
||||
return 'unknown error';
|
||||
}private function AlreadyExists(){
|
||||
return 'item already exists';
|
||||
}private function UnknownDebugError(){
|
||||
return 'unknown debug error';
|
||||
}
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
<?php
|
||||
|
||||
namespace kwebsocket\core;
|
||||
|
||||
class wsinterop{
|
||||
|
||||
|
||||
private $socket;
|
||||
private $host;
|
||||
private $port;
|
||||
private $isOpened;
|
||||
|
||||
public function __construct(String $host, int $port){
|
||||
|
||||
$this->socket = socket_create(AF_INET, SOCK_STREAM, 0);
|
||||
$this->isOpened = socket_connect($this->socket,$host,$port);
|
||||
$this->host = $host;
|
||||
$this->port = $port;
|
||||
|
||||
socket_set_block($this->socket);
|
||||
|
||||
}
|
||||
|
||||
public function send(array $data) : bool{
|
||||
|
||||
if( !$this->isOpened ) return false;
|
||||
|
||||
$toSend = json_encode($data);
|
||||
$size = strlen($toSend);
|
||||
|
||||
socket_write($this->socket,pack('N',$size));
|
||||
$success = socket_write($this->socket,$toSend);
|
||||
|
||||
return $success == $size;
|
||||
}
|
||||
|
||||
public function receive() : array{
|
||||
$size = 0;
|
||||
while($size == 0){
|
||||
$size = unpack("N",socket_read($this->socket,4))[1];
|
||||
}
|
||||
$read = 0;
|
||||
$data = "";
|
||||
$tmp = "";
|
||||
|
||||
while($read != $size){
|
||||
|
||||
$remaining = ($size - $read);
|
||||
$read += socket_recv($this->socket,$tmp,$remaining,MSG_DONTWAIT);
|
||||
$data .= $tmp;
|
||||
|
||||
}
|
||||
|
||||
return json_decode($data,true);
|
||||
}
|
||||
|
||||
public function close(){
|
||||
socket_shutdown($this->socket);
|
||||
socket_close($this->socket);
|
||||
}
|
||||
|
||||
}
|
|
@ -32,11 +32,13 @@
|
|||
*
|
||||
*/
|
||||
public function call(){
|
||||
/* (1) Authentication */
|
||||
\router\controller\loader::start();
|
||||
|
||||
/* (1) Process response */
|
||||
/* (2) Process response */
|
||||
$this->response = $this->request->dispatch();
|
||||
|
||||
/* (2) Manages result */
|
||||
/* (3) Manages result */
|
||||
if( $this->response instanceof Response )
|
||||
echo $this->response->serialize();
|
||||
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
<?php
|
||||
|
||||
namespace router\controller;
|
||||
|
||||
|
||||
class js{
|
||||
|
||||
|
||||
private $pagename;
|
||||
|
||||
/* PRE-CALL
|
||||
*
|
||||
* @url<String> Calling URI
|
||||
*
|
||||
*/
|
||||
public function __construct($url){
|
||||
}
|
||||
|
||||
|
||||
/* Generate _SERVER.js
|
||||
*
|
||||
*/
|
||||
public function server(){
|
||||
header('Content-Type: text/javascript; charset=utf-8');
|
||||
|
||||
echo "window._SERVER = ".json_encode([
|
||||
|
||||
'session' => [
|
||||
'name' => $_SESSION['NAME'],
|
||||
'connected' => count($_SESSION['ADMIN']) + count($_SESSION['USER']) > 0
|
||||
]
|
||||
|
||||
])."\n";
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Manage bundle hash
|
||||
*
|
||||
*/
|
||||
public function bundle(){
|
||||
|
||||
/* (1) Extract /public_html/js/ all .js files */
|
||||
$js_scripts = glob(__PUBLIC__.'/js/*.js');
|
||||
|
||||
/* (2) If match pattern 'bundle@*.js' */
|
||||
foreach($js_scripts as $fname){
|
||||
|
||||
$bname = basename($fname);
|
||||
|
||||
// if match -> load it and exit
|
||||
if( preg_match('/bundle@[\da-f]+\.js/', $bname) )
|
||||
header("Location: /js/$bname");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* POST-CALL
|
||||
*
|
||||
*/
|
||||
public function __destruct(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: jean-kevin
|
||||
* Date: 08/12/17
|
||||
* Time: 02:07
|
||||
*/
|
||||
|
||||
namespace router\controller;
|
||||
|
||||
|
||||
use kwebsocket\core\wsinterop;
|
||||
|
||||
abstract class loader {
|
||||
|
||||
public static function start() {
|
||||
if( $_SESSION['WS'] || strlen($_SESSION['NAME']) == 0 ){
|
||||
|
||||
// ask with websocketInterop
|
||||
$wsi = new wsinterop('localhost', 9998);
|
||||
|
||||
if( count($_SESSION['USER']) > 0 ){
|
||||
|
||||
// get/send name to web socket
|
||||
$wsi->send(['operation' => "Connect",'type' => 'user', 'name' => $_SESSION['USER']['username']]);
|
||||
$check = $wsi->receive();
|
||||
|
||||
if( $check['error'] == false )
|
||||
$_SESSION['NAME'] = $check['name'];
|
||||
|
||||
}elseif( count($_SESSION['ADMIN']) > 0 ){
|
||||
|
||||
// get/send name to web socket
|
||||
$wsi->send(['operation' => "Connect",'type' => 'admin', 'name' => $_SESSION['ADMIN']['username']]);
|
||||
$check = $wsi->receive();
|
||||
|
||||
if( $check['error'] == false )
|
||||
$_SESSION['NAME'] = $check['name'];
|
||||
|
||||
}else{
|
||||
|
||||
// get/send name to web socket
|
||||
$wsi->send(['operation' => "Connect",'type' => 'guest', 'name' => null]);
|
||||
$check = $wsi->receive();
|
||||
|
||||
if( $check['error'] == false )
|
||||
$_SESSION['NAME'] = $check['name'];
|
||||
}
|
||||
|
||||
$wsi->close();
|
||||
$wsi = null;
|
||||
|
||||
$_SESSION['WS'] = false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -3,6 +3,8 @@
|
|||
namespace router\controller;
|
||||
|
||||
|
||||
use kwebsocket\core\wsinterop;
|
||||
|
||||
class page{
|
||||
|
||||
|
||||
|
@ -14,7 +16,8 @@
|
|||
*
|
||||
*/
|
||||
public function __construct($url){
|
||||
$this->pagename = $url['page'];
|
||||
|
||||
// $this->pagename = $url['page'];
|
||||
|
||||
}
|
||||
|
||||
|
@ -23,8 +26,10 @@
|
|||
*
|
||||
*/
|
||||
public function load(){
|
||||
if( file_exists(__ROOT__."/view/".$this->pagename.".php") )
|
||||
include __ROOT__."/view/".$this->pagename.".php";
|
||||
loader::start();
|
||||
|
||||
if( file_exists(__ROOT__."/view/home.php") )
|
||||
include __ROOT__."/view/home.php";
|
||||
else
|
||||
echo "page not found";
|
||||
}
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
/* CALL
|
||||
*
|
||||
*/
|
||||
public function homepage(){
|
||||
header('Location: /homepage/');
|
||||
public function home(){
|
||||
header('Location: /home/');
|
||||
}
|
||||
|
||||
/* POST-CALL
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace router\controller;
|
||||
|
||||
|
||||
class svg{
|
||||
|
||||
|
||||
private $path;
|
||||
private $color;
|
||||
|
||||
/* PRE-CALL
|
||||
*
|
||||
* @url<String> Calling URI
|
||||
*
|
||||
*/
|
||||
public function __construct($url){
|
||||
$this->path = $url['path'];
|
||||
$this->color = substr($url['color'], 1);
|
||||
}
|
||||
|
||||
|
||||
/* Colorate svg
|
||||
*
|
||||
*/
|
||||
public function color(){
|
||||
header('Content-Type: image/svg+xml');
|
||||
|
||||
// On crée la partie ajoutée
|
||||
$stylesheet = "\n<style type='text/css'>\n";
|
||||
$stylesheet .= "\t#fill-edit{\n";
|
||||
$stylesheet .= "\t\tfill: #".$this->color." !important;\n";
|
||||
$stylesheet .= "\t\tfill-opacity: 1 !important;\n";
|
||||
$stylesheet .= "\t}\n";
|
||||
$stylesheet .= "\t#stroke-edit{\n";
|
||||
$stylesheet .= "\t\tstroke: #".$this->color." !important;\n";
|
||||
$stylesheet .= "\t\tstroke-opacity: 1 !important;\n";
|
||||
$stylesheet .= "\t}\n";
|
||||
$stylesheet .= "</style></svg>";
|
||||
|
||||
// On récupère le fichier
|
||||
$file = file_get_contents(__PUBLIC__.'/'.$this->path);
|
||||
|
||||
// On ajoute le style
|
||||
$file = str_replace('</svg>', $stylesheet, $file);
|
||||
|
||||
echo $file;
|
||||
|
||||
}
|
||||
|
||||
/* POST-CALL
|
||||
*
|
||||
*/
|
||||
public function __destruct(){
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -1,7 +1,8 @@
|
|||
{
|
||||
|
||||
"authentication": {
|
||||
"POST admin": {
|
||||
"admin": {
|
||||
|
||||
"POST login": {
|
||||
"description": "Connexion administrateur",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
|
@ -13,7 +14,32 @@
|
|||
}
|
||||
},
|
||||
|
||||
"POST user": {
|
||||
"POST signup": {
|
||||
"description": "Formulaire d'inscription",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"username": { "description": "Identifiant de l'administrateur", "type": "varchar(3,20,alphanumeric)" },
|
||||
"mail": { "description": "Adresse mail de l'administrateur", "type": "mail" },
|
||||
"password": { "description": "Mot de passe de l'administrateur", "type": "text" }
|
||||
},
|
||||
"output": {
|
||||
"registered": { "description": "UID du nouvel administrateur", "type": "id" }
|
||||
}
|
||||
},
|
||||
|
||||
"DELETE logout": {
|
||||
"description": "Déconnexion utilisateur",
|
||||
"permissions": [],
|
||||
"parameters": {},
|
||||
"output": {}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"user": {
|
||||
|
||||
"POST login": {
|
||||
|
||||
"description": "Connexion utilisateur",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
|
@ -23,11 +49,133 @@
|
|||
"output": {
|
||||
"connected": { "description": "Vrai si connecté.", "type": "boolean" }
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"POST signup": {
|
||||
"description": "Formulaire d'inscription",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"username": { "description": "Identifiant de l'utilisateur", "type": "varchar(3,20,alphanumeric)" },
|
||||
"mail": { "description": "Adresse mail de l'utilisateur", "type": "mail" },
|
||||
"password": { "description": "Mot de passe de l'utilisateur", "type": "text" }
|
||||
},
|
||||
"output": {
|
||||
"registered": { "description": "UID du nouvel utilisateur", "type": "id" }
|
||||
}
|
||||
},
|
||||
|
||||
"DELETE logout": {
|
||||
"description": "Déconnexion utilisateur",
|
||||
"permissions": [],
|
||||
"parameters": {},
|
||||
"output": {}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
|
||||
"dev": {
|
||||
|
||||
"GET session_destroy": {
|
||||
"description": "Destroy current session",
|
||||
"permissions": [],
|
||||
"parameters": {},
|
||||
"output": {}
|
||||
},
|
||||
|
||||
"GET release": {
|
||||
"description": "Auto release git repo",
|
||||
"permissions": [],
|
||||
"parameters": {},
|
||||
"output": {}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"message": {
|
||||
"POST emergency": {
|
||||
"description" : "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": { "description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast", "type" : "numeric" },
|
||||
"message": { "description": "message a publier", "type": "text" },
|
||||
"location": { "description": "coordonés GPS du message, des coordonnées invalide ne seront pas affiché", "type": "array<numeric>" }
|
||||
}
|
||||
},
|
||||
"DELETE emergency": {
|
||||
"description": "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": { "description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast", "type": "numeric" },
|
||||
"id": { "description": "message a publier", "type": "id" }
|
||||
}
|
||||
},
|
||||
"PUT emergency": {
|
||||
"description" : "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": { "description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast", "type": "numeric" },
|
||||
"id": { "description": "message a publier", "type": "id" },
|
||||
"message": { "description": "message a publier", "type": "text" }
|
||||
}
|
||||
},
|
||||
"GET emergency": {
|
||||
"description" : "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": { "description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast", "type" : "numeric" },
|
||||
"limit": { "description": "nombre de message a récupérer maximum", "type" : "numeric", "optional": true }
|
||||
}
|
||||
},
|
||||
|
||||
"POST event": {
|
||||
"description" : "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": { "description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast", "type": "numeric", "optional": true },
|
||||
"message": { "description": "message a publier", "type": "text", "optional": false },
|
||||
"type": { "description": "Flag du type d'evenement", "type": "numeric" },
|
||||
"location": { "description": "coordonés GPS du message, des coordonnées invalide ne seront pas affiché", "type": "array<numeric>" }
|
||||
}
|
||||
},
|
||||
"DELETE event": {
|
||||
"description": "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": {
|
||||
"description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast",
|
||||
"type": "numeric",
|
||||
"optional": true
|
||||
},
|
||||
"id": {
|
||||
"description": "message a publier",
|
||||
"type": "text"
|
||||
}
|
||||
}
|
||||
},
|
||||
"PUT event": {
|
||||
"description" : "",
|
||||
"permissions": [],
|
||||
"parameters": {
|
||||
"URL_0": {
|
||||
"description": "code departement, si le paramètre n'est pas fourni le message est envoyé en broadcast",
|
||||
"type" : "numeric",
|
||||
"optional" : true
|
||||
},
|
||||
"id": {
|
||||
"description": "message a publier",
|
||||
"type": "text"
|
||||
},
|
||||
"message": {
|
||||
"description": "message a publier",
|
||||
"type": "text",
|
||||
"optional": false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"RESTexample": {
|
||||
"POST article": {
|
||||
|
|
|
@ -5,14 +5,27 @@
|
|||
|
||||
"routes": {
|
||||
|
||||
"/{page}/": {
|
||||
"/{path}{color}": {
|
||||
"methods": ["GET"],
|
||||
"controller": "page:load",
|
||||
"controller": "svg:color",
|
||||
"arguments": {
|
||||
"page": "[a-z]+"
|
||||
"path": ".+\\.svg",
|
||||
"color": "@[a-fA-F0-9]{6}"
|
||||
}
|
||||
},
|
||||
|
||||
"/js/_SERVER.js": {
|
||||
"methods": ["GET"],
|
||||
"controller": "js:server",
|
||||
"arguments": {}
|
||||
},
|
||||
|
||||
"/js/bundle.js": {
|
||||
"methods": ["GET"],
|
||||
"controller": "js:bundle",
|
||||
"arguments": {}
|
||||
},
|
||||
|
||||
"/api/v/1.0/{module}/{method}{uri_args}": {
|
||||
"methods": ["GET", "POST", "PUT", "DELETE", "VIEW"],
|
||||
"controller": "api:call",
|
||||
|
@ -25,7 +38,7 @@
|
|||
|
||||
"/{any}": {
|
||||
"methods": ["GET"],
|
||||
"controller": "redirect:homepage",
|
||||
"controller": "page:load",
|
||||
"arguments": {
|
||||
"any": ".*"
|
||||
}
|
||||
|
|
20
package.json
|
@ -6,11 +6,18 @@
|
|||
"license": "MIT",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
|
||||
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
|
||||
"build:clean": "rm ./public_html/js/bundle@*.js*",
|
||||
"build:bundle": "cross-env NODE_ENV=production webpack --progress --hide-modules",
|
||||
"build:dev": "cross-env NODE_ENV=development webpack --progress --hide-modules",
|
||||
"dev": "npm run build:clean; npm run build:dev",
|
||||
"build": "npm run build:clean; npm run build:bundle",
|
||||
|
||||
"ws-start": "java -jar ./ndli1718.jar > ./websocket.out 2>&1 &",
|
||||
"ws-stop": "ps -aux | grep 'java -jar ./ndli1718.jar' | grep -v 'grep' && echo 'killing process..' && kill `ps -aux | grep \"java -jar ./ndli1718.jar\" | grep -v \"grep\" | awk '{print $2}'` && echo 'killed' || return 0",
|
||||
"ws-restart": "npm run ws-stop; npm run ws-start"
|
||||
},
|
||||
"dependencies": {
|
||||
"vue": "^2.4.4"
|
||||
"vue": "^2.5.9"
|
||||
},
|
||||
"browserslist": [
|
||||
"> 1%",
|
||||
|
@ -26,8 +33,9 @@
|
|||
"css-loader": "^0.28.7",
|
||||
"file-loader": "^1.1.4",
|
||||
"vue-loader": "^13.0.5",
|
||||
"vue-template-compiler": "^2.4.4",
|
||||
"webpack": "^3.6.0",
|
||||
"webpack-dev-server": "^2.9.1"
|
||||
"vue-template-compiler": "^2.5.9",
|
||||
"vue-router": "^2.5.3",
|
||||
"webpack": "^3.8.1",
|
||||
"webpack-dev-server": "^2.9.5"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
#CONTAINER.accueil{
|
||||
display: block;
|
||||
}
|
||||
|
||||
#CONTAINER.accueil > * {
|
||||
padding: 0 50px;
|
||||
}
|
||||
|
||||
#CONTAINER.accueil h1 {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
letter-spacing: 2px;
|
||||
background: -webkit-linear-gradient(top left, #474dff, #00E288);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
overflow: hidden;
|
||||
margin: 50px auto 0 calc(50% - 161.5px);
|
||||
}
|
||||
|
||||
#CONTAINER.accueil h2 {
|
||||
margin: 25px auto 10px auto;
|
||||
color: #10c0a3;
|
||||
}
|
||||
|
||||
#CONTAINER .icon-type{
|
||||
height: 23px;
|
||||
}
|
||||
|
||||
#CONTAINER ul {
|
||||
margin-top: 10px;
|
||||
margin-left: 50px;
|
||||
}
|
||||
|
||||
#CONTAINER ul li div {
|
||||
display: inline-block;
|
||||
width: 25px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#CONTAINER.accueil table{
|
||||
width: 70%;
|
||||
display: block;
|
||||
margin: 15px auto 15px 30px;
|
||||
}
|
||||
|
||||
#CONTAINER.accueil table > tbody > tr{
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#CONTAINER.accueil table > tbody > tr > td{
|
||||
width: 115px;
|
||||
}
|
||||
|
||||
#CONTAINER a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
#CONTAINER .phone{
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 3em;
|
||||
height: 2em;
|
||||
padding: -1em;
|
||||
|
||||
background: url('/image/container/phone.svg@aaaaaa') center center no-repeat;
|
||||
background-size: 25px;
|
||||
background-color: transparent;
|
||||
|
||||
border-radius: 50% / 50%;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
transition: background .2s ease-in-out;
|
||||
}
|
||||
|
||||
#CONTAINER a:hover .phone{
|
||||
background-size: 30px;
|
||||
background-image: url('/image/container/phone.svg@3bc010');
|
||||
}
|
|
@ -0,0 +1,208 @@
|
|||
/* Card container */
|
||||
#CONTAINER.message{
|
||||
height: calc( 100% - 6.3em );
|
||||
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
flex-wrap: nowrap;
|
||||
}
|
||||
|
||||
#CONTAINER.message div,
|
||||
#CONTAINER.message div[data-noauthor='1']{ /* Message item */
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: auto;
|
||||
|
||||
margin: 0 1.5em;
|
||||
margin-top: 2.5em;
|
||||
padding: 1em;
|
||||
|
||||
align-self: flex-start;
|
||||
|
||||
border-radius: 3px;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
color: #222;
|
||||
}
|
||||
|
||||
#CONTAINER.message div[data-noauthor='0']{
|
||||
margin-top: .5em;
|
||||
}
|
||||
|
||||
#CONTAINER.message div.me{ /* Message Item (self) */
|
||||
/* background: #13d89d; */
|
||||
align-self: flex-end;
|
||||
margin: 1em 1.5em;
|
||||
}
|
||||
|
||||
#CONTAINER.message div.end-pad{
|
||||
padding: 0;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.author{ /* Message author */
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: -1.8em;
|
||||
left: .5em;
|
||||
|
||||
background: #eee;
|
||||
|
||||
color: #888;
|
||||
}
|
||||
|
||||
#CONTAINER.message div.me span.author{ /* Hide message author if self */
|
||||
display: none;
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.date{ /* Message date */
|
||||
display: block;
|
||||
position: relative;
|
||||
|
||||
margin-top: 1em;
|
||||
|
||||
color: #888;
|
||||
font-size: .8em;
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.del, /* Del btn */
|
||||
#CONTAINER.message div span.maps, /* Maps btn */
|
||||
#CONTAINER.message div span.upd{ /* Update btn */
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: calc( 100% + .2em );
|
||||
left: calc( 100% - 1.5em );
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
|
||||
background: url('/image/container/del-msg.svg@777777') center center no-repeat;
|
||||
background-size: 80% auto;
|
||||
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.maps{
|
||||
top: .3em;
|
||||
left: calc( 100% - 1em - .2em );
|
||||
background-image: url('/image/container/maps.svg@dddddd');
|
||||
background-size: auto 100%;
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.upd{
|
||||
left: calc( 100% - 3em );
|
||||
background-image: url('/image/container/edit-msg.svg@777777');
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.del:hover{
|
||||
background-image: url('/image/container/del-msg.svg@e33222')
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.upd:hover{
|
||||
background-image: url('/image/container/edit-msg.svg@2ab1dd')
|
||||
}
|
||||
|
||||
#CONTAINER.message div span.maps:hover{
|
||||
background-image: url('/image/container/maps.svg@29c98e');
|
||||
}
|
||||
|
||||
#CONTAINER.message div span span.code{ /* Code block */
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
|
||||
padding: .2em .3em;
|
||||
|
||||
border-radius: 3px;
|
||||
|
||||
background: #f0f0f0;
|
||||
|
||||
font-family: 'Liberation Mono';
|
||||
font-size: .9em;
|
||||
|
||||
}
|
||||
|
||||
#CONTAINER.message div span span.utf8{ /* Smileys */
|
||||
font-family: 'Liberation Mono';
|
||||
font-size: 1.3em;
|
||||
|
||||
color: #ea921f;
|
||||
}
|
||||
|
||||
#CONTAINER.message div span span.utf8.bl{ color: #338be0; }
|
||||
#CONTAINER.message div span span.utf8.br{ color: #773c22; }
|
||||
|
||||
|
||||
#CONTAINER.message form.msg-input{ /* Message Input */
|
||||
display: block;
|
||||
position: fixed;
|
||||
top: calc( 100% - 3em );
|
||||
left: 15em;
|
||||
width: calc( 100% - 15em - 2*1px );
|
||||
height: 3em;
|
||||
|
||||
border-top: 1px solid #ddd;
|
||||
|
||||
background: #fff;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
transition: left .2s ease-in-out,
|
||||
width .2s ease-in-out;
|
||||
}
|
||||
|
||||
#WRAPPER.min #CONTAINER.message form.msg-input{
|
||||
left: 3.5em;
|
||||
width: calc( 100% - 3.5em - 2*1px );
|
||||
}
|
||||
|
||||
#CONTAINER.message form.msg-input input{ /* form Input */
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: calc( 100% - 2em - 3em );
|
||||
height: calc( 100% - 2*.5em );
|
||||
|
||||
padding: .5em 1em;
|
||||
|
||||
border: none;
|
||||
|
||||
background: url('/image/loader/send-input.svg') -1em center no-repeat;
|
||||
background-size: 1em auto;
|
||||
|
||||
font-size: inherit;
|
||||
font-family: inherit;
|
||||
|
||||
transition: all .2s ease-in-out;
|
||||
}
|
||||
|
||||
#CONTAINER.message form.msg-input input.loading{ /* Loading input */
|
||||
width: calc( 100% - 2em - 3em - 2.5em );
|
||||
padding-left: 3em;
|
||||
|
||||
background-position: 1em center;
|
||||
}
|
||||
|
||||
#CONTAINER.message form.msg-input button{ /* form send button */
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: calc( 100% - 3em );
|
||||
width: 3em;
|
||||
height: 3em;
|
||||
|
||||
background: url('/image/container/send-msg.svg@777777') center center no-repeat;
|
||||
background-size: 50%;
|
||||
|
||||
border: none;
|
||||
|
||||
font-size: inherit;
|
||||
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#CONTAINER.message form.msg-input button:hover{
|
||||
background-image: url('/image/container/send-msg.svg@000000');
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
@font-face {
|
||||
font-family: 'Aller';
|
||||
src: url('/font/Aller_Rg.ttf');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* BOLD */
|
||||
@font-face {
|
||||
font-family: 'Aller';
|
||||
src: url('/font/Aller_Bd.ttf');
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* italic */
|
||||
@font-face {
|
||||
font-family: 'Aller';
|
||||
src: url('/font/Aller_It.ttf');
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* BOLD italic */
|
||||
@font-face {
|
||||
font-family: 'Aller';
|
||||
src: url('/font/Aller_BdIt.ttf');
|
||||
font-weight: bold;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* light */
|
||||
@font-face {
|
||||
font-family: 'Aller';
|
||||
src: url('/font/Aller_Lt.ttf');
|
||||
font-weight: lighter;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
/* light italic */
|
||||
@font-face {
|
||||
font-family: 'Aller';
|
||||
src: url('/font/Aller_LtIt.ttf');
|
||||
font-weight: lighter;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* LIBERATION MONO */
|
||||
|
||||
/* regular */
|
||||
@font-face {
|
||||
font-family: 'Liberation Mono';
|
||||
src: url('/font/LiberationMono_Rg.ttf');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
|
@ -0,0 +1,179 @@
|
|||
/* Header Icon */
|
||||
#HEADER #header-icon{
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: calc( 15em - 3em );
|
||||
height: calc( 100% - 2*1em );
|
||||
|
||||
padding: 1em 0;
|
||||
padding-left: 3em;
|
||||
|
||||
background: url('/image/header-icon.svg@555555') center left 2em no-repeat;
|
||||
background-size: 1.7em;
|
||||
/* background-color: rgba(0,0,0,.7); */
|
||||
|
||||
color: #fff;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
-moz-user-select: none;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
|
||||
transition: all .2s ease-in-out;
|
||||
}
|
||||
|
||||
/* Header Icon > Title */
|
||||
#header-icon .header-title{
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
margin-left: 2em;
|
||||
|
||||
font-size: 1.2em;
|
||||
letter-spacing: 2px;
|
||||
|
||||
background: -webkit-linear-gradient(top left, #474dff, #00E288);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/****************************/
|
||||
|
||||
|
||||
/* Header info container */
|
||||
#header-info{
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 15em;
|
||||
width: calc( 100% - 15em - 12em - 2em - 5em );
|
||||
height: calc( 100% - 2*1.2em );
|
||||
|
||||
padding: 1.2em 0;
|
||||
padding-left: 5em;
|
||||
background: url('/image/header/info/info.svg@2299e3') center left 2em no-repeat;
|
||||
background-size: 1.6em;
|
||||
|
||||
color: #333;
|
||||
}
|
||||
|
||||
#header-info.info{ background-image: url('/image/header/info/info.svg@2299e3'); }
|
||||
#header-info.warning{ background-image: url('/image/header/info/warning.svg@ed5e17'); }
|
||||
#header-info.error{ background-image: url('/image/header/info/error.svg@d7373a'); }
|
||||
|
||||
|
||||
/****************************/
|
||||
|
||||
|
||||
|
||||
/* Header Notifications */
|
||||
#header-notif{
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: calc( 100% - 12em - 2em ); /* 2em not to be in the border */
|
||||
width: 12em;
|
||||
height: 100%;
|
||||
|
||||
/* flex */
|
||||
flex-direction: row;
|
||||
justify-content: space-around;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Notification element */
|
||||
#header-notif .hnotif,
|
||||
#header-notif .hnotif.bell{
|
||||
display: block;
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
|
||||
background: url('/image/header/notif/bell.svg@aaaaaa') center center no-repeat;
|
||||
background-size: 50%;
|
||||
background-color: transparent;
|
||||
|
||||
border-radius: 50% / 50%;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
transition: background .2s ease-in-out;
|
||||
}
|
||||
#header-notif .hnotif.emergency{ background-image: url('/image/header/notif/emergency.svg@aaaaaa'); }
|
||||
#header-notif .hnotif.event{ background-image: url('/image/header/notif/event.svg@aaaaaa'); }
|
||||
#header-notif .hnotif.message{ background-image: url('/image/header/notif/message.svg@aaaaaa'); }
|
||||
#header-notif .hnotif.search{ background-image: url('/image/header/notif/search.svg@aaaaaa'); }
|
||||
#header-notif .hnotif.menu{ background-image: url('/image/header/notif/menu.svg@aaaaaa'); }
|
||||
#header-notif .hnotif.login{ background-image: url('/image/header/notif/login.svg@aaaaaa'); }
|
||||
#header-notif .hnotif.logout{ background-image: url('/image/header/notif/logout.svg@aaaaaa'); }
|
||||
|
||||
/* HOVER */
|
||||
#header-notif .hnotif:hover{
|
||||
background-color: #ddd;
|
||||
background-image: url('/image/header/notif/bell.svg@ee9a31');
|
||||
}
|
||||
|
||||
#header-notif .hnotif.emergency:hover{ background-image: url('/image/header/notif/emergency.svg@f93e2b'); }
|
||||
#header-notif .hnotif.event:hover{ background-image: url('/image/header/notif/event.svg@2986d4'); }
|
||||
#header-notif .hnotif.message:hover{ background-image: url('/image/header/notif/message.svg@23c795'); }
|
||||
#header-notif .hnotif.search:hover{ background-image: url('/image/header/notif/search.svg@ae51da'); }
|
||||
#header-notif .hnotif.menu:hover{ background-image: url('/image/header/notif/menu.svg@4a8ad8'); }
|
||||
#header-notif .hnotif.login:hover{ background-image: url('/image/header/notif/login.svg@660088'); }
|
||||
#header-notif .hnotif.logout:hover{ background-image: url('/image/header/notif/logout.svg@660088'); }
|
||||
|
||||
|
||||
|
||||
/* Counter element */
|
||||
#header-notif .hnotif[data-count]:before{
|
||||
content: attr(data-count);
|
||||
|
||||
display: block;
|
||||
position: absolute;
|
||||
margin-left: 1.2em;
|
||||
min-width: calc( 1.4em - 2*.35em );
|
||||
width: auto;
|
||||
height: calc( 1.4em - 2*.1em );
|
||||
|
||||
padding: .1em .35em;
|
||||
|
||||
border-radius: 50% / 50%;
|
||||
background: #474dff;
|
||||
|
||||
font-size: .8em;
|
||||
|
||||
}
|
||||
|
||||
#header-notif .hnotif[data-count='']:before,
|
||||
#header-notif .hnotif[data-count='0']:before{
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************/
|
||||
|
||||
/* Minified Header */
|
||||
#WRAPPER.min #HEADER #header-icon{
|
||||
width: calc( 3.5em - 3em );
|
||||
background-position: center center;
|
||||
}
|
||||
|
||||
#WRAPPER.min #HEADER #header-icon:hover{
|
||||
transform: rotate(-5deg);
|
||||
}
|
||||
|
||||
#WRAPPER.min #HEADER #header-info{
|
||||
left: 3.5em;
|
||||
}
|
|
@ -0,0 +1,167 @@
|
|||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
|
||||
body{
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
background-color: #ecf0f5;
|
||||
|
||||
font-size: 16px;
|
||||
font-family: 'Aller', Lato, Verdana;
|
||||
}
|
||||
|
||||
/* Content Wrapper */
|
||||
#WRAPPER {
|
||||
display: block;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
background-color: #eee;
|
||||
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Page Header */
|
||||
#HEADER{
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: calc( 3.5em - 1px );
|
||||
|
||||
background: #fff;
|
||||
/* background: -webkit-linear-gradient(top right, #2428ff, #00E288); */
|
||||
|
||||
color: #fff;
|
||||
font-family: inherit;
|
||||
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Page Menu */
|
||||
#MENU{
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 3.5em;
|
||||
left: 0;
|
||||
width: calc( 15em - 1px );
|
||||
height: calc( 100% - 3.5em );
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
border-right: 1px solid #ddd;
|
||||
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
flex-wrap: nowrap;
|
||||
|
||||
transition: width .2s ease-in-out;
|
||||
}
|
||||
|
||||
/* Page container */
|
||||
#CONTAINER{
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 3.5em;
|
||||
left: 15em;
|
||||
width: calc( 100% - 15em );
|
||||
height: calc( 100% - 3.5em );
|
||||
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
|
||||
transition: left .2s ease-in-out,
|
||||
width .2s ease-in-out;
|
||||
}
|
||||
|
||||
#WRAPPER.min #CONTAINER{
|
||||
left: 3.5em;
|
||||
width: calc( 100% - 3.5em );
|
||||
}
|
||||
|
||||
|
||||
/* Notification Stack */
|
||||
#WRAPPER #NOTIF-STACK{
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 4em;
|
||||
left: calc( 100% - 15em );
|
||||
width: 14em;
|
||||
min-height: 2em;
|
||||
height: auto;
|
||||
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
z-index: 101;
|
||||
}
|
||||
|
||||
#WRAPPER #NOTIF-STACK.active{
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Login form authentication */
|
||||
#WRAPPER #LOGIN-FORM{
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 4em;
|
||||
left: calc( 100% - 21em );
|
||||
width: 20em;
|
||||
min-height: 2em;
|
||||
height: auto;
|
||||
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
z-index: 101;
|
||||
}
|
||||
|
||||
#WRAPPER #LOGIN-FORM.active{
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Sign up form authentication */
|
||||
#WRAPPER #SIGNUP-FORM{
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 4em;
|
||||
left: calc( 100% - 21em );
|
||||
width: 20em;
|
||||
min-height: 2em;
|
||||
height: auto;
|
||||
|
||||
border: 1px solid #ddd;
|
||||
border-radius: 3px;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
z-index: 101;
|
||||
}
|
||||
|
||||
#WRAPPER #SIGNUP-FORM.active{
|
||||
display: block;
|
||||
}
|
|
@ -0,0 +1,129 @@
|
|||
/* Header */
|
||||
#LOGIN-FORM > .head{
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
padding: .7em 0;
|
||||
|
||||
border-radius: 3px 3px 0 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
text-align: center;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
#LOGIN-FORM > .body{
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 2em;
|
||||
height: auto;
|
||||
|
||||
border-radius: 0 0 3px 3px;
|
||||
|
||||
overflow: auto;
|
||||
|
||||
}
|
||||
|
||||
/* Items */
|
||||
#LOGIN-FORM > .body > form{
|
||||
display: block;
|
||||
position: relative;
|
||||
|
||||
padding: .8em 1em;
|
||||
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
color: #555;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
transition: background-color .2s ease-in-out,
|
||||
color .2s ease-in-out;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form * {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form > *{
|
||||
display: block;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form > input{
|
||||
padding: 5px;
|
||||
margin: 5px auto 10px auto;
|
||||
border-color: #777777;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form > input.err{
|
||||
border-color: #ff0000;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form #btn-connection,
|
||||
#LOGIN-FORM > .body > form #btn-signup{
|
||||
border-width: 2px;
|
||||
|
||||
padding: 6px;
|
||||
margin: 8px auto 0 auto;
|
||||
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
|
||||
transition: background-color .2s ease-in-out,
|
||||
color .2s ease-in-out;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form #btn-connection{
|
||||
color: #21bb89;
|
||||
background-color: #fff;
|
||||
border-color: #21bb89;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form #btn-connection:hover{
|
||||
color: #fff;
|
||||
background-color: #21bb89;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form #btn-signup{
|
||||
color: #660088;
|
||||
background-color: #fff;
|
||||
border-color: #660088;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form #btn-signup:hover{
|
||||
color: #fff;
|
||||
background-color: #660088;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form #btn-connection + span{
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#LOGIN-FORM > .body > form > #msg-err{
|
||||
color: #ff0000;
|
||||
font-size: 0.85em;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form,
|
||||
#LOGIN-FORM > .body > form > input,
|
||||
#LOGIN-FORM > .body > form button {
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
#LOGIN-FORM > .body > form > input,
|
||||
#LOGIN-FORM > .body > form button {
|
||||
-webkit-border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
outline: none;
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
/* Menu Item Wrapper */
|
||||
#MENU .menu-item-wrapper{
|
||||
display: block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 4em;
|
||||
|
||||
flex: 0 0 1;
|
||||
|
||||
font-size: .8em;
|
||||
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Menu Standard Item */
|
||||
#MENU .menu-item-wrapper .menu-item{
|
||||
display: block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: calc( 100% - 3em );
|
||||
height: calc( 100% - 1.4em );
|
||||
|
||||
background: #fff url('/image/menu/dashboard.svg') center left 1em no-repeat;
|
||||
background-size: 1.2em auto;
|
||||
|
||||
padding-top: 1.4em;
|
||||
padding-left: 3em;
|
||||
|
||||
color: #888;
|
||||
letter-spacing: 2px;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
transition: background .2s ease-in-out,
|
||||
padding .2s ease-in-out,
|
||||
color .2s ease-in-out;
|
||||
}
|
||||
|
||||
#MENU .menu-item[data-theme='emergency']{ background-image: url('/image/menu/emergency.svg@aaaaaa'); }
|
||||
#MENU .menu-item[data-theme='event']{ background-image: url('/image/menu/event.svg@aaaaaa'); }
|
||||
#MENU .menu-item[data-theme='inbox']{ background-image: url('/image/menu/messages.svg@aaaaaa'); }
|
||||
|
||||
/* HOVER */
|
||||
#MENU .menu-item:hover,
|
||||
#MENU .menu-item.active{
|
||||
color: #444;
|
||||
|
||||
background-color: #eef2f5;
|
||||
}
|
||||
|
||||
#MENU .menu-item[data-theme='emergency']:hover{ background-image: url('/image/menu/emergency.svg@f93e2b'); }
|
||||
#MENU .menu-item[data-theme='event']:hover{ background-image: url('/image/menu/event.svg@2986d4'); }
|
||||
#MENU .menu-item[data-theme='inbox']:hover{ background-image: url('/image/menu/messages.svg@23c795'); }
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/****************************/
|
||||
|
||||
/* Minified Menu */
|
||||
#WRAPPER.min #MENU{
|
||||
width: calc( 3.5em - 1px );
|
||||
}
|
||||
|
||||
|
||||
#WRAPPER.min #MENU .menu-item-wrapper .menu-item{
|
||||
width: calc( 100% - 5em );
|
||||
padding-left: 5em;
|
||||
|
||||
background-position: 1.2em center;
|
||||
background-size: 2em;
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/* Header */
|
||||
#NOTIF-STACK > .head{
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
padding: .7em 0;
|
||||
|
||||
border-radius: 3px 3px 0 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
text-align: center;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
#NOTIF-STACK > .body{
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 2em;
|
||||
height: auto;
|
||||
max-height: 12em;
|
||||
|
||||
border-radius: 0 0 3px 3px;
|
||||
|
||||
overflow: auto;
|
||||
|
||||
}
|
||||
|
||||
/* Items */
|
||||
#NOTIF-STACK > .body > span{
|
||||
display: block;
|
||||
position: relative;
|
||||
|
||||
padding: .8em 1em;
|
||||
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
color: #555;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
transition: background-color .2s ease-in-out,
|
||||
color .2s ease-in-out;
|
||||
}
|
||||
|
||||
#NOTIF-STACK > .body > span:hover{
|
||||
background-color: #eee;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
#NOTIF-STACK > .body > span:last-child{
|
||||
border: 0;
|
||||
border-radius: 0 0 3px 3px;
|
||||
}
|
|
@ -0,0 +1,116 @@
|
|||
/* Header */
|
||||
#SIGNUP-FORM > .head{
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
|
||||
padding: .7em 0;
|
||||
|
||||
border-radius: 3px 3px 0 0;
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
text-align: center;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
/* Container */
|
||||
#SIGNUP-FORM > .body{
|
||||
display: block;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 2em;
|
||||
height: auto;
|
||||
|
||||
border-radius: 0 0 3px 3px;
|
||||
|
||||
overflow: auto;
|
||||
|
||||
}
|
||||
|
||||
/* Items */
|
||||
#SIGNUP-FORM > .body > form{
|
||||
display: block;
|
||||
position: relative;
|
||||
|
||||
padding: .8em 1em;
|
||||
|
||||
border-bottom: 1px solid #ddd;
|
||||
|
||||
background-color: #fff;
|
||||
|
||||
color: #555;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
transition: background-color .2s ease-in-out,
|
||||
color .2s ease-in-out;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form * {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > *{
|
||||
display: block;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > input{
|
||||
padding: 5px;
|
||||
margin: 5px auto 10px auto;
|
||||
border-color: #777777;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > input.err{
|
||||
border-color: #ff0000;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > #btn-create-account{
|
||||
color: #21bb89;
|
||||
background-color: #fff;
|
||||
border-color: #21bb89;
|
||||
border-width: 2px;
|
||||
|
||||
padding: 6px;
|
||||
margin: 15px auto 0 auto;
|
||||
|
||||
font-weight: bold;
|
||||
cursor: pointer;
|
||||
|
||||
transition: background-color .2s ease-in-out,
|
||||
color .2s ease-in-out;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > #btn-create-account:hover{
|
||||
color: #fff;
|
||||
background-color: #21bb89;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#SIGNUP-FORM > .body > form > #msg-err{
|
||||
color: #ff0000;
|
||||
font-size: 0.85em;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form,
|
||||
#SIGNUP-FORM > .body > form > input,
|
||||
#SIGNUP-FORM > .body > form > button {
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > input,
|
||||
#SIGNUP-FORM > .body > form > button {
|
||||
-webkit-border-radius: 3px;
|
||||
-moz-border-radius: 3px;
|
||||
border-radius: 3px;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#SIGNUP-FORM > .body > form > #membre{
|
||||
font-size: 0.8em;
|
||||
color: #006eff;
|
||||
text-decoration: underline;
|
||||
margin-top: 8px;
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
This Dalton Maag Ltd Free Licence Agreement becomes a binding contract between the Licensee and Dalton Maag Ltd when the Licensee commences a Font Software download, or if the Licensee is acquiring Font Software on a permanent medium, when the Licensee opens the package in which the software is contained. If the Licensee does not wish to be bound by the Agreements, the Licensee cannot access, use or download the Font Software. Please read all of the Agreement before agreeing to be bound by its terms and conditions.
|
||||
|
||||
This Free Licence Agreement supplements, and should be read in conjunction with, the standard Dalton Maag End User Licence Agreement version 1.2.
|
||||
|
||||
1 You, the Licensee, are granted the right by Dalton Maag to Use the Aller Font Family, Standard Edition under the terms set out in the EULA. This free licence has a Licensed Unit size of 25 Users.
|
||||
|
||||
2 Use by more than 25 Users, or equivalent Website Visitors, is a breach of this Free Licence Agreement, and instead requires a commercial licence.
|
||||
|
||||
Fontsquirrel Note: 1000 website visitors is the equivalent of 1 user - http://www.daltonmaag.com/about/web_embedding_faq.html
|
||||
|
||||
3 Editions other than the Standard Edition of the Aller Font Family are not covered by this Free Licence Agreement, and require a commercial licence.
|
||||
|
||||
4 Dalton Maag will provide no technical support under this Free Licence Agreement.
|
||||
|
||||
5 The Licensee may redistribute the Aller Font Family only as a verbatim copy of the .zip file supplied, ensuring that the acquirer’s attention is drawn to this Free Licence Agreement and the End User Licence Agreement.
|
||||
|
||||
You can contact us by email at info@daltonmaag.com or by post:
|
||||
Dalton Maag Ltd Unit 107 245A Coldharbour Lane
|
||||
London SW9 8RR United Kingdom
|
||||
|
||||
You can find out more about the Aller Font Family at our website: http://www.daltonmaag.com/aller
|
||||
|
||||
|
||||
-------
|
||||
|
||||
Dalton Maag Ltd End User Licence Agreement (EULA)
|
||||
|
||||
We recommend that the Licensee prints this End User Licence Agreement for further reference.
|
||||
|
||||
This Dalton Maag Ltd End User Licence Agreement (“EULA”) becomes a binding contract between the Licensee and Dalton Maag Ltd when the Licensee commences a Font Software download, or if the Licensee is acquiring Font Software on a permanent medium, when the Licensee opens the package in which the software is contained.
|
||||
|
||||
If the Licensee does not wish to be bound by the EULA, the Licensee cannot access, use or download the Font Software. Please read all of the EULA before agreeing to be bound by its terms and conditions.
|
||||
|
||||
The Licensee hereby agrees to the following:
|
||||
|
||||
1 The Licensee is bound by the EULA and acknowledges that all Use (as defined herein) of the Font Software (as defined herein) supplied by Dalton Maag is governed by the EULA.
|
||||
|
||||
2 “Dalton Maag” shall mean Dalton Maag Ltd, its successors and assignees, its parent and affiliated corporations, its authorized distributors, and any third party which has licensed to Dalton Maag any or all of the components of the Font Software supplied to the Licensee.
|
||||
|
||||
3 “Licensee” shall mean the individual, company, corporation, or other organization subject to this End User Licence Agreement due to their access or Use of Dalton Maag Font Software.
|
||||
|
||||
4 “Font Software” shall mean the software provided by Dalton Maag which, when used on an appropriate Device or Devices, generates typeface and typographic designs and ornaments. Font Software shall include all bitmap representations of typeface and typographic designs and ornaments created by or derived from the Font Software. Font Software includes upgrades, updates, related files, permitted copies, permitted conversions, and related documentation.
|
||||
|
||||
5 “Device” shall mean a hardware, software, or firmware component to which an individual is able to give commands (whether by keyboard or otherwise), regardless of the locations of the individual, the Device, or the Font Software.
|
||||
|
||||
6 “Use” of the Font Software shall be deemed to occur when an individual is able to give commands (whether by keyboard or otherwise) to a Device on which the Font Software is installed, regardless of the locations of the individual, the Device, or the Font Software.
|
||||
|
||||
7 “User” shall mean an individual giving commands (whether by keyboard or otherwise) to a Device on which the Font Software is installed, regardless of the locations of the individual, the Device, or the Font Software. Users do not need to be members of the Licensee’s organization or household, and may be members of the public.
|
||||
|
||||
8 “Licensed Unit” shall mean the number of simultaneous Users permitted by the Licence. If the Licensee intends that Devices on which the Font Software is installed should be simultaneously used by more Users than permitted by the Licensed Unit, the Licensee should purchase an additional Licensed Unit of the correct size to cover the shortfall.
|
||||
|
||||
9 “Derivative Work” shall mean data based upon or derived from the Font Software, or any portion of the Font Software, in any form in which such data may be recast, transformed, or adapted,
|
||||
|
||||
including, but not limited to, data in any format into which Font Software may be converted.
|
||||
|
||||
10 “Digital Product” shall mean an electronic document or data file created by Use of the Font Software which is offered for distribution outside of the Licensee’s organization or household. By way of illustration and not by way of limitation, an electronic book, electronic magazine, or computer game shall all be considered Digital Products. A separate OEM/ISV licence is required to use Dalton Maag Font Software in Digital Products. A document distributed in connection with a commercial transaction in which the consideration is unrelated to such document, for example, a business letter, a ticket for an event, an invoice, or a receipt shall not be considered a Digital Product.
|
||||
|
||||
11 “Licensee’s Website” shall mean the publicly or privately accessible collection of linked webpages, and other files, under the legal control of the Licensee.
|
||||
|
||||
12 “Website Visitor” shall mean a unique individual who accesses any webpage, file, or data hosted on or provided by the Licensee’s Website.
|
||||
|
||||
13 The Licensee is hereby granted a non-exclusive, non-assignable, non-transferable (except as expressly permitted in section 21) licence to Use the Font Software subject to all of the terms and conditions of the EULA. The Licensee has no rights to the Font Software other than as expressly set forth in the EULA. The Licensee agrees that Dalton Maag owns all right, title and interest in and to the Font Software, its structure, organization, code, and related files, including all property rights therein such as copyright, design and trademark rights. The Licensee agrees that the Font Software, its structure, organization, code, and related files are valuable property of Dalton Maag and that any intentional Use of the Font Software not expressly permitted by the EULA constitutes infringement of copyright. All rights not expressly granted in the EULA are expressly reserved to Dalton Maag. The Licensee may not use the Font Software to electronically distribute a Digital Product without a separate licence from Dalton Maag authorizing the Licensee to do so.
|
||||
|
||||
14 The Licensee shall not install, access or Use the Font Software until it has paid the applicable licence fee in full, or received an invoice for the licence fee and that invoice has not yet reached its due date, or been given written authorization to Use the Font Software by Dalton Maag. The Licensee shall pay all applicable invoices in full within 30 days of each invoice’s issue date. If the Licensee fails to pay any invoice when it is due, then, in addition to any other rights and remedies available, Dalton Maag may charge the Licensee interest at a rate of 6% above Bank of England base rate from the due date to the date on which the Licensee pays in full including any interest and/or cancel the Licence, or suspend the Licence and charge the Licensee for all additional costs resulting from such suspension and any subsequent resumption.
|
||||
|
||||
15 The Licensee may install the Font Software on any number of Devices which are all under the ownership or exclusive control of the Licensee, or of the Licensee’s direct employees. The Licensee shall ensure that the number of simultaneous Users of Devices on which the Font Software is installed does not exceed the Licensed Unit. The Licensee must take all reasonable steps to ensure that it retains exclusive custody and control over all copies of the Font Software. The Licensee must not transfer the ownership of Devices on which the Font Software is installed. Upon termination
|
||||
|
||||
of the EULA, the Licensee must destroy all copies of the Font Software.
|
||||
|
||||
16 The Licensee may convert the Font Software to EOT format (or other format which Dalton Maag may from time-to-time make it known that it allows under specific terms) for installation on the Licensee’s Website. Website Visitors are included in the Licensed Unit at the equivalence of 1,000 (one thousand) Website Visitors per day being equal to 1 (one) User of the Font Software. For the purpose of Licensed Unit assessment, the Licensee may disregard the Licensee’s Website’s busiest day in a seven-day period. Should the number of Website Visitors cause the number of Users to exceed the Licensed Unit, the Licensee must immediately purchase an additional Licensed Unit of the correct size to cover the shortfall.
|
||||
|
||||
17 The Licensee may electronically distribute Font Software embedded in a personal or business document (that is, a document other than a “Digital Product” as defined herein) only when the Font Software embedded in such document is in a static bitmap image or an embedded electronic document, and is distributed in a secure format that permits only the viewing and printing (and not the editing, altering, enhancing, or modifying) of such static graphic image or embedded document. The Licensee may not embed Font Software in an electronic document or data file for any reason other than the Licensee’s own personal or business Use.
|
||||
|
||||
18 The Licensee may not alter Font Software for the purpose of adding any functionality which such Font Software did not have when delivered to the Licensee by Dalton Maag. If the Font Software contains embedding bits that limit the capabilities of the Font Software, the Licensee may not change or alter the embedding bits. Font Software may not be used to create or distribute any electronic document in which the Font Software, or any part thereof, is embedded in a format that permits editing, alterations, enhancements, or modifications by the recipient of such document. If the Licensee has reason to believe that a recipient of an electronic document possesses the capability to edit, alter, enhance, or modify such electronic document even though the Licensee has distributed it in a format which does not permit such editing, alteration, enhancement, or modification, the Licensee shall not transmit such document to such a person.
|
||||
|
||||
19 The Licensee may take one (1) copy of the Font Software used for a particular document, or Font Software embedded in an electronic document, to a commercial printer or service bureau solely for the purpose of printing such document. The commercial printer or service bureau shall not be permitted to Use the Font Software to make changes or amendments to the document. The Licensee shall ensure that the commercial printer or service bureau destroys all copies of the Font Software upon final delivery of the printed document.
|
||||
|
||||
20 The Licensee acknowledges that the typeface design and Font Software are protected by the copyright, design, and other intellectual property laws of England and Wales, by the copyright and design laws of other nations, and by international treaties. The Licensee agrees to treat the Font Software as the Licensee would any other copyrighted material, such as a book. The Licensee may not copy the Font Software, except as expressly provided herein. Any copies that the Licensee is expressly permitted to make pursuant to the EULA must contain the same copyright, trademark, and other proprietary notices that appear on or in the Font Software. The Licensee shall not produce Derivative Works of this Font Software except for document embedding and permitted conversions as expressly set out in this Agreement. The Licensee is permitted to reverse engineer the Font Software in order to produce any compatible software product, provided that such a product is not a Derivative Work of the Font Software. The Licensee agrees to use trademarks associated with the Font Software according to accepted trademark practice, including identification of the trademark owner’s name. Trademarks can only be used to identify printed output produced by the Font Software. The use of any trademark as herein authorized does not give the Licensee any rights of ownership in that trademark and all use of any trademark shall inure to the sole benefit of Dalton Maag. The Licensee may not change any trademark or trade name designation for the Font Software.
|
||||
|
||||
21 The Licensee may not rent, lease, sublicense, give, lend, or further distribute the Font Software, or any copy thereof, except as expressly provided herein. The Licensee may transfer all the Licensee’s rights to use the Font Software to another person or legal entity provided that the transferee accepts and agrees to be bound by all the terms and conditions of the EULA and the Licensee destroy all copies of the Font Software, including all copies stored in the memory of a hardware device, and provided the entirety of the Licensed Unit is transferred.
|
||||
|
||||
22 Dalton Maag makes no warranty, express or implied, that this Font Software is suitable for any specific purpose. Dalton Maag will provide the Licensee with basic technical support on the correct installation and exploitation of the Font Software in common software packages and operating systems. Once Font Software has been downloaded online or security seals broken on physical packaging, the software cannot be returned. Otherwise, the Licensee has a right to cancel within fourteen (14) days of completion of the contract of sale.
|
||||
|
||||
23 Dalton Maag, or its appointed auditor, is entitled to inspect and have access to any premises, and to any Devices, owned or operated by Licensee, at or on which this Font Software is kept or Used, for the purposes of ensuring that the Licensee is complying with the terms of this Licence. The Licensee’s business information shall remain strictly confidential by Dalton Maag and their auditor, who shall be granted access to all the necessary documents to verify compliance with this and any other agreement with Dalton Maag. The inspection shall take place within the Licensee’s usual business hours and after reasonable written notice. Dalton Maag shall bear the costs of the inspection. However, if, in the course of the inspection, deviations to the detriment of Dalton Maag are discovered, the Licensee shall bear the costs of the audit.
|
||||
|
||||
24 This EULA will be governed by the laws of England and Wales. For the purposes of the Sale of Goods Act 1979, Supply of Goods and Services Act 1982, and the Consumer Protection (Distance Selling) Regulations 2000, Font Software is classified as computer software.
|
||||
|
||||
25 The EULA shall automatically terminate upon failure by the Licensee (or any authorized person or member of the Licensee’s immediate household to whom the Licensee has given permission to Use the Font Software) to comply with its terms. The termination of the EULA shall not preclude Dalton Maag from suing the Licensee for damages of any breach of the EULA. The EULA may only be modified in writing signed by an authorized officer of Dalton Maag.
|
||||
|
||||
26 The Licensee has the rights expressly set forth in the EULA and no other. All rights in and to the Font Software, including unpublished rights, are reserved under the copyright laws of England and Wales and other jurisdictions. All rights reserved. The EULA may be enforced by Dalton Maag or by an authorized dealer acting on behalf of Dalton Maag.
|
||||
|
||||
Version 1.2. For licences issued from 22 August 2010.
|
|
@ -0,0 +1,46 @@
|
|||
Digitized data copyright (c) 2010 Google Corporation
|
||||
with Reserved Font Arimo, Tinos and Cousine.
|
||||
Copyright (c) 2012 Red Hat, Inc.
|
||||
with Reserved Font Name Liberation.
|
||||
|
||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||
This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 20 22"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="del-msg.svg"
|
||||
width="20"
|
||||
height="22"><metadata
|
||||
id="metadata4199"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4197" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4195"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="39.666667"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><style
|
||||
type="text/css"
|
||||
id="style4191">
|
||||
.st0{fill:#1E232D;}
|
||||
</style><path
|
||||
d="M 7,0 7,2 0,2 0,4 20,4 20,2 13,2 13,0 7,0 Z M 2,6 2,19.699219 C 2,20.799219 2.9,22 4,22 l 12,0 c 1.1,0 2,-1.200781 2,-2.300781 L 18,6 16,6 16,20 4,20 4,6 2,6 Z M 7,8 7,18 9,18 9,8 7,8 Z m 4,0 0,10 2,0 0,-10 -2,0 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="35.994999"
|
||||
viewBox="0 0 35.994999 35.994999"
|
||||
width="35.994999"
|
||||
id="svg4173"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="edit-msg.svg">
|
||||
<metadata
|
||||
id="metadata4183">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4181" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4179"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="19.833333"
|
||||
inkscape:cx="18"
|
||||
inkscape:cy="18"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4173" />
|
||||
<path
|
||||
d="m 29.324219,0 c -0.5125,0 -1.024063,0.1959375 -1.414063,0.5859375 L 24.25,4.2441406 l 7.5,7.5000004 3.660156,-3.6582035 c 0.78,-0.78 0.78,-2.0500781 0,-2.8300781 L 30.740234,0.5859375 C 30.350234,0.1959375 29.836719,0 29.324219,0 Z M 22.130859,6.3652344 0,28.494141 l 0,7.5 7.5,0 22.130859,-22.128907 -7.5,-7.4999996 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="16"
|
||||
version="1.1"
|
||||
viewBox="0 0 10 16"
|
||||
width="10"
|
||||
id="svg4174"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="maps.svg">
|
||||
<metadata
|
||||
id="metadata4185">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4183"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="42.072853"
|
||||
inkscape:cx="0.16900642"
|
||||
inkscape:cy="5.1542799"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4174" />
|
||||
<defs
|
||||
id="defs4178" />
|
||||
<path
|
||||
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1"
|
||||
d="M 0.02038,6 C 0.00689,5.83531 0,5.66854 0,5.5 0,2.46243 2.23858,0 5,0 7.76142,0 10,2.46243 10,5.5 10,5.66854 9.993,5.83531 9.9796,6 L 10,6 C 10,9.00574 5,16 5,16 5,16 0,9.02234 0,6 Z M 5,7 C 6.10457,7 7,6.10457 7,5 7,3.89543 6.10457,3 5,3 3.89543,3 3,3.89543 3,5 3,6.10457 3.89543,7 5,7 Z m 0,0"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="352"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 352.04639 352"
|
||||
width="352.04639"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="phone.svg"><metadata
|
||||
id="metadata3396"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs3394" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1855"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview3392"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="1.7949219"
|
||||
inkscape:cx="176.07275"
|
||||
inkscape:cy="176.1"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 335.97275,255.4 c -14.6,-15 -56.1,-43.1 -83.3,-43.1 -6.3,0 -11.8,1.4 -16.3,4.3 -13.3,8.5 -23.9,15.1 -29,15.1 -2.8,0 -5.8,-2.5 -12.4,-8.2 l -1.1,-1 c -18.3,-15.9 -22.2,-20 -29.3,-27.4 l -1.8,-1.9 c -1.3,-1.3 -2.4,-2.5 -3.5,-3.6 -6.2,-6.4 -10.7,-11 -26.6,-29 l -0.7,-0.8 c -7.6,-8.6 -12.6,-14.2 -12.9,-18.3 -0.3,-4 3.2,-10.5 12.1,-22.6 10.8,-14.6 11.2,-32.6 1.3,-53.5 -7.9,-16.5 -20.8,-32.3 -32.2,-46.2 L 99.272748,18 c -9.8,-12 -21.2,-18 -33.9,-18 -14.1,0 -25.8,7.6 -32,11.6 -0.5,0.3 -1,0.7 -1.5,1 -13.9,8.8 -24.0000004,20.9 -27.8000004,33.2 -5.7,18.5 -9.5,42.5 17.8000004,92.4 23.6,43.2 45,72.2 79.000002,107.1 32,32.8 46.2,43.4 78,66.4 35.4,25.6 69.4,40.3 93.2,40.3 22.1,0 39.5,0 64.3,-29.9 26,-31.4 15.2,-50.6 -0.4,-66.7 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
viewBox="0 0 20.015684 19.959942"
|
||||
xml:space="preserve"
|
||||
id="svg4190"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="send-msg.svg"
|
||||
width="20.015684"
|
||||
height="19.959942"><metadata
|
||||
id="metadata4199"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4197" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4195"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="39.666667"
|
||||
inkscape:cx="9.9906835"
|
||||
inkscape:cy="9.9541575"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4190" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="fill-edit"
|
||||
d="M 19.490683,9.1057851 1.5906835,0.10578512 c -0.90000002,-0.4 -1.90000002,0.4 -1.50000002,1.29999998 l 2.50000002,6.7 11.3999995,1.8999999 -11.3999995,1.9 -2.50000002,6.7 c -0.3,0.9 0.6,1.7 1.50000002,1.2 l 17.8999995,-9 c 0.7,-0.3 0.7,-1.2999999 0,-1.6999999 z" /></svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,156 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="118.91737mm"
|
||||
height="123.77343mm"
|
||||
viewBox="0 0 421.36068 438.56727"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="header-icon.svg">
|
||||
<defs
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4392">
|
||||
<stop
|
||||
style="stop-color:#01ff9b;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4394" />
|
||||
<stop
|
||||
style="stop-color:#b93fff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4396" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4384">
|
||||
<stop
|
||||
style="stop-color:#247eff;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4386" />
|
||||
<stop
|
||||
style="stop-color:#b93fff;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4388" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient4376">
|
||||
<stop
|
||||
style="stop-color:#247eff;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop4378" />
|
||||
<stop
|
||||
style="stop-color:#01ff9b;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop4380" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4384"
|
||||
id="radialGradient4513"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-9.9729112,-2.5638923,0.7929986,-3.0845694,1902.2148,3158.432)"
|
||||
cx="207.87584"
|
||||
cy="667.8092"
|
||||
fx="207.87584"
|
||||
fy="667.8092"
|
||||
r="44.320953" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4392"
|
||||
id="radialGradient4517"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.14515886,1.7429031,-6.1621421,0.51321807,3511.8122,-377.06608)"
|
||||
cx="426.45297"
|
||||
cy="504.74533"
|
||||
fx="426.45297"
|
||||
fy="504.74533"
|
||||
r="53.399887" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4376"
|
||||
id="radialGradient4519"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.2471052,-0.56697707,1.2548046,2.7600292,-853.32466,-904.75052)"
|
||||
cx="419.95505"
|
||||
cy="589.65613"
|
||||
fx="419.95505"
|
||||
fy="589.65613"
|
||||
r="132.01888" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="0.70673618"
|
||||
inkscape:cx="2.5056919"
|
||||
inkscape:cy="380.992"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="svg2"
|
||||
showgrid="false"
|
||||
inkscape:snap-smooth-nodes="false"
|
||||
inkscape:object-nodes="true"
|
||||
inkscape:snap-midpoints="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:object-paths="true"
|
||||
inkscape:snap-object-midpoints="true"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<metadata
|
||||
id="metadata7">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="g4495"
|
||||
transform="translate(-209.39264,-343.12606)">
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20.15600014;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="M 51.71875,31.947266 A 49.553467,49.553467 0 0 0 2.1660156,81.501953 49.553467,49.553467 0 0 0 51.71875,131.05469 49.553467,49.553467 0 0 0 101.27344,81.501953 49.553467,49.553467 0 0 0 51.71875,31.947266 Z m 146.36523,57.707031 c -60.54674,0 -109.845699,49.298963 -109.845699,109.845703 0,60.54675 49.298959,109.8457 109.845699,109.8457 60.54674,-1e-5 109.8457,-49.29896 109.84571,-109.8457 0,-60.54674 -49.29896,-109.845703 -109.84571,-109.845703 z m 0,20.154293 c 49.65363,0 89.68946,40.03778 89.68946,89.69141 -10e-6,49.65363 -40.03583,89.68944 -89.68946,89.68945 -49.65363,0 -89.68945,-40.03581 -89.68945,-89.68945 0,-49.65363 40.03582,-89.69142 89.68945,-89.69141 z m 0,65.53907 A 24.153133,24.153133 0 0 0 173.93164,199.5 24.153133,24.153133 0 0 0 198.08398,223.65234 24.153133,24.153133 0 0 0 222.23633,199.5 24.153133,24.153133 0 0 0 198.08398,175.34766 Z m 184.62305,21.0039 a 38.653133,38.653133 0 0 0 -38.65234,38.65235 38.653133,38.653133 0 0 0 38.65234,38.65429 38.653133,38.653133 0 0 0 38.6543,-38.65429 38.653133,38.653133 0 0 0 -38.6543,-38.65235 z M 168.19727,330.24805 a 54.866684,54.866684 0 0 0 -54.86719,54.86718 54.866684,54.866684 0 0 0 54.86719,54.86719 54.866684,54.866684 0 0 0 54.86718,-54.86719 54.866684,54.866684 0 0 0 -54.86718,-54.86718 z"
|
||||
transform="translate(209.39259,343.12606)"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#radialGradient4513);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20.15600014;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 220.69141,510.95117 a 10.079008,10.079008 0 0 0 -10.00977,9.08203 c -0.84144,7.40602 -1.28911,14.94417 -1.28906,22.59375 1.7e-4,61.4491 28.05032,116.48824 72.03711,152.81055 a 10.079008,10.079008 0 1 0 12.83203,-15.54297 c -39.53275,-32.64437 -64.71274,-81.94377 -64.71289,-137.26758 -5e-5,-6.86335 0.40134,-13.6376 1.16015,-20.3164 a 10.079008,10.079008 0 0 0 -10.01757,-11.35938 z"
|
||||
id="path4499"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#radialGradient4517);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20.15600014;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 561.92773,639.51758 a 10.079008,10.079008 0 0 0 -8.27343,4.45508 c -20.50478,29.58881 -49.15424,51.79491 -81.79688,64.48437 a 10.079008,10.079008 0 1 0 7.30469,18.78516 c 36.33348,-14.12424 68.23615,-38.8558 91.05859,-71.78907 a 10.079008,10.079008 0 0 0 -8.29297,-15.93554 z"
|
||||
id="path4501"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:url(#radialGradient4519);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:20.15600014;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
d="m 407.47656,344.54102 c -22.36663,6e-5 -43.90088,3.71972 -63.97851,10.56836 a 10.079008,10.079008 0 1 0 6.50781,19.07812 c 18.01891,-6.14638 37.32814,-9.48865 57.45703,-9.49023 82.88052,0.10549 154.61176,57.2925 173.17969,138.0664 a 10.079008,10.079008 0 1 0 19.64453,-4.51562 C 579.642,408.43801 499.64256,344.65831 407.49023,344.54102 a 10.079008,10.079008 0 0 0 -0.0137,0 z"
|
||||
id="path4503"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 11 KiB |
|
@ -0,0 +1,69 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="20"
|
||||
version="1.1"
|
||||
width="20"
|
||||
id="svg4173"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="error.svg">
|
||||
<metadata
|
||||
id="metadata4189">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4187" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4185"
|
||||
showgrid="false"
|
||||
inkscape:zoom="14.024285"
|
||||
inkscape:cx="5.7725748"
|
||||
inkscape:cy="10.277948"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4173"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<g
|
||||
transform="translate(-2,-1030.4)"
|
||||
id="g4175">
|
||||
<path
|
||||
d="M 22,12 C 22,17.523 17.523,22 12,22 6.4772,22 2,17.523 2,12 2,6.4772 6.4772,2 12,2 17.523,2 22,6.4772 22,12 Z"
|
||||
transform="translate(0,1028.4)"
|
||||
id="fill-edit"
|
||||
style="fill:#e9202a;fill-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 7.05015,1036.85 3.5357,3.6 -3.5357,3.5 1.4142,1.4 3.5355,-3.5 3.536,3.5 1.414,-1.4 -3.536,-3.5 3.536,-3.6 -1.414,-1.4 -3.536,3.5 -3.5355,-3.5 -1.4142,1.4 z"
|
||||
id="path4183"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ecf0f1" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="16px"
|
||||
version="1.1"
|
||||
viewBox="0 0 16 16"
|
||||
width="16px"
|
||||
id="svg4175"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="info.svg">
|
||||
<metadata
|
||||
id="metadata4186">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4184"
|
||||
showgrid="false"
|
||||
inkscape:zoom="59.5"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4175" />
|
||||
<title
|
||||
id="title4177" />
|
||||
<defs
|
||||
id="defs4179" />
|
||||
<path
|
||||
d="M 7,3 7,5 9,5 9,3 Z M 8,16 C 3.58172,16 0,12.41828 0,8 0,3.58172 3.58172,0 8,0 c 4.41828,0 8,3.58172 8,8 0,4.41828 -3.58172,8 -8,8 z M 7,7 7,13 9,13 9,7 Z m 0,0"
|
||||
id="fill-edit"
|
||||
style="fill:#e8b522;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="21.906097"
|
||||
version="1.1"
|
||||
viewBox="0 0 25.764629 21.906097"
|
||||
width="25.764629"
|
||||
id="svg4198"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="warning.svg">
|
||||
<metadata
|
||||
id="metadata4209">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4207"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.518213"
|
||||
inkscape:cx="-25.586636"
|
||||
inkscape:cy="6.3550537"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4198"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<defs
|
||||
id="defs4202" />
|
||||
<path
|
||||
d="m 11.307797,1.0544896 c 0.870066,-1.4076629 2.282795,-1.4043083 3.150787,0 l 10.78509,17.4489874 c 1.161529,1.879215 0.315436,3.40262 -1.888703,3.40262 l -20.9435603,0 c -2.2046308,0 -3.0539832,-1.517336 -1.8887031,-3.40262 z m 1.575767,13.8516074 c 0.552285,0 1,-0.453036 1,-0.99703 l 0,-6.0059401 c 0,-0.550644 -0.443865,-0.99703 -1,-0.99703 -0.552285,0 -1,0.453036 -1,0.99703 l 0,6.0059401 c 0,0.550644 0.443865,0.99703 1,0.99703 z m 0,4 c 0.552285,0 1,-0.447715 1,-1 0,-0.552285 -0.447715,-1 -1,-1 -0.552285,0 -1,0.447715 -1,1 0,0.552285 0.447715,1 1,1 z m 0,0"
|
||||
id="fill-edit"
|
||||
style="fill:#eb8c1e;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 141.732 141.732"
|
||||
height="141.732px"
|
||||
id="Livello_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 141.732 141.732"
|
||||
width="141.732px"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="bell.svg"><metadata
|
||||
id="metadata4205"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4203" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4201"
|
||||
showgrid="false"
|
||||
inkscape:zoom="6.7169026"
|
||||
inkscape:cx="68.781703"
|
||||
inkscape:cy="70.865997"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Livello_1" /><g
|
||||
id="g5841"><path
|
||||
d="m 135.055,115.131 c 0,-3.528 -2.861,-6.396 -6.395,-6.396 -8.83,0 -15.988,-7.158 -15.988,-15.99 l 0,-38.378 C 112.672,34.361 98.463,17.658 79.533,13.688 80.121,12.446 80.461,11.06 80.461,9.593 80.462,4.296 76.165,0 70.866,0 c -5.299,0 -9.594,4.296 -9.594,9.598 0,1.467 0.339,2.853 0.927,4.095 -18.928,3.97 -33.137,20.673 -33.137,40.679 l 0,38.377 c 0,8.832 -7.159,15.99 -15.99,15.99 -3.533,0 -6.396,2.864 -6.396,6.396 0,3.531 2.862,6.396 6.396,6.396 l 15.99,0 29.011,0 c 0,9.716 5.729,17.591 12.793,17.591 7.064,0 12.792,-7.875 12.792,-17.591 l 29.014,0 15.988,0 0,0 c 3.534,-0.005 6.395,-2.867 6.395,-6.4"
|
||||
id="fill-edit"
|
||||
style="fill:#ffffff"
|
||||
inkscape:connector-curvature="0" /></g></svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="895"
|
||||
width="1004.5717"
|
||||
id="svg4195"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="emergency.svg">
|
||||
<metadata
|
||||
id="metadata4203">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4201" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4199"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="0.46484375"
|
||||
inkscape:cx="363.40304"
|
||||
inkscape:cy="434.7744"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4195" />
|
||||
<path
|
||||
d="m 996.13961,799.247 -438.286,-767 C 546.45861,12.306 525.25261,0 502.28561,0 c -22.967,0 -44.173,12.306 -55.567,32.247 l -438.2860041,767 c -11.319,19.809 -11.238,44.144 0.213,63.876 C 20.096606,882.855 41.184606,895 63.999606,895 l 876.572004,0 c 22.814,0 43.903,-12.145 55.354,-31.877 11.45099,-19.732 11.53299,-44.067 0.214,-63.876 z M 566.28561,767 l -128,0 0,-128 128,0 0,128 z m 0,-192 -128,0 0,-256 128,0 0,256 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="18.99975"
|
||||
id="Layer_1"
|
||||
version="1.2"
|
||||
viewBox="0 0 15.999 18.99975"
|
||||
width="15.999"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="event.svg"><metadata
|
||||
id="metadata4182"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4180" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4178"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="14.024285"
|
||||
inkscape:cx="-4.2272722"
|
||||
inkscape:cy="9.948518"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 13.656,2.30475 c -3.124,-3.073 -8.189,-3.073 -11.313,0 -3.124,3.074 -3.124,8.057 0,11.13 l 5.656,5.565 5.657,-5.565 c 3.124,-3.073 3.124,-8.056 0,-11.13 z m -5.657,8.195 c -0.668,0 -1.295,-0.26 -1.768,-0.732 -0.975,-0.975 -0.975,-2.561 0,-3.536 0.472,-0.472 1.1,-0.732 1.768,-0.732 0.668,0 1.296,0.26 1.768,0.732 0.975,0.975 0.975,2.562 0,3.536 -0.472,0.472 -1.1,0.732 -1.768,0.732 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 32 32"
|
||||
height="27.500999"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 25.530701 27.500999"
|
||||
width="25.530701"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="login.svg"><metadata
|
||||
id="metadata3435"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs3433" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1855"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview3431"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="14.359375"
|
||||
inkscape:cx="0.48565475"
|
||||
inkscape:cy="12.727735"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="fill-edit"
|
||||
d="M 12.724609,0 C 9.2036094,0 6.3476562,3.3760156 6.3476562,7.5410156 c 0,4.1650004 2.9096407,9.2031254 6.4316408,9.2031254 3.521,0 6.320312,-5.039125 6.320312,-9.2031254 0,-4.165 -2.854,-7.5410156 -6.375,-7.5410156 z m 6.458985,13.169922 c -1.209,2.763 -3.847297,5.072266 -6.404297,5.072266 -3.1220001,0 -5.3886564,-2.282922 -6.5976564,-5.044922 -7.03099997,3.642 -6.14648435,12.859375 -6.14648435,12.859375 0,1.262 0.99410935,1.445312 2.16210935,1.445312 l 10.5820314,0 10.564453,0 c 1.17,0 2.167969,-0.184312 2.167969,-1.445312 0.001,0 0.701875,-9.243719 -6.328125,-12.886719 z"
|
||||
style="fill:#515151" /></svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="1280"
|
||||
viewBox="0 0 1568 1280"
|
||||
width="1568"
|
||||
id="svg3406"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="logout.svg">
|
||||
<metadata
|
||||
id="metadata3414">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs3412" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1153"
|
||||
inkscape:window-height="480"
|
||||
id="namedview3410"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="0.13169643"
|
||||
inkscape:cx="239.72881"
|
||||
inkscape:cy="640"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg3406" />
|
||||
<path
|
||||
d="m 640,1184 q 0,4 1,20 1,16 0.5,26.5 -0.5,10.5 -3,23.5 -2.5,13 -10,19.5 -7.5,6.5 -20.5,6.5 l -320,0 Q 169,1280 84.5,1195.5 0,1111 0,992 L 0,288 Q 0,169 84.5,84.5 169,0 288,0 l 320,0 q 13,0 22.5,9.5 9.5,9.5 9.5,22.5 0,4 1,20 1,16 0.5,26.5 -0.5,10.5 -3,23.5 -2.5,13 -10,19.5 Q 621,128 608,128 l -320,0 q -66,0 -113,47 -47,47 -47,113 l 0,704 q 0,66 47,113 47,47 113,47 l 312,0 11.5,1 11.5,3 8,5.5 7,9 2,13.5 z m 928,-544 q 0,26 -19,45 l -544,544 q -19,19 -45,19 -26,0 -45,-19 -19,-19 -19,-45 l 0,-288 -448,0 q -26,0 -45,-19 -19,-19 -19,-45 l 0,-384 q 0,-26 19,-45 19,-19 45,-19 l 448,0 0,-288 q 0,-26 19,-45 19,-19 45,-19 26,0 45,19 l 544,544 q 19,19 19,45 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="16px"
|
||||
version="1.1"
|
||||
viewBox="0 0 16 16"
|
||||
width="16px"
|
||||
id="svg4207"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="menu.svg">
|
||||
<metadata
|
||||
id="metadata4221">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4219"
|
||||
showgrid="false"
|
||||
inkscape:zoom="3.6875"
|
||||
inkscape:cx="-10.285784"
|
||||
inkscape:cy="17.130472"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4207" />
|
||||
<title
|
||||
id="title4209" />
|
||||
<desc
|
||||
id="desc4211" />
|
||||
<defs
|
||||
id="defs4213" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff;fill-rule:evenodd;stroke:none;stroke-width:1"
|
||||
id="fill-edit"
|
||||
d="M 0,4 4,4 4,0 0,0 0,4 0,4 Z m 6,12 4,0 0,-4 -4,0 0,4 0,0 z m -6,0 4,0 0,-4 -4,0 0,4 0,0 z m 0,-6 4,0 0,-4 -4,0 0,4 0,0 z m 6,0 4,0 0,-4 -4,0 0,4 0,0 z m 6,-10 0,4 4,0 0,-4 -4,0 0,0 z M 6,4 10,4 10,0 6,0 6,4 6,4 Z m 6,6 4,0 0,-4 -4,0 0,4 0,0 z m 0,6 4,0 0,-4 -4,0 0,4 0,0 z"
|
||||
class="fill-edit" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 24 24"
|
||||
height="24px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="message.svg"><metadata
|
||||
id="metadata4230"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4228" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4226"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="-22.067797"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="M 11.984,13 C 10.031,13 -0.031,4.891 -0.031,4.891 l 0,-0.891 c 0,-1.104 0.896,-2 2.002,-2 L 21.997,2 C 23.104,2 24,2.896 24,4 l -0.016,1 c 0,0 -9.953,8 -12,8 z m 0,2.75 c 2.141,0 12,-7.75 12,-7.75 L 24,20 c 0,1.104 -0.896,2 -2.003,2 L 1.971,22 C 0.866,22 -0.031,21.104 -0.031,20 L -0.015,8 c -0.001,0 10.046,7.75 11.999,7.75 z"
|
||||
id="fill-edit"
|
||||
style="clip-rule:evenodd;fill:#ffffff;fill-rule:evenodd"
|
||||
class="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="512px"
|
||||
id="Layer_1"
|
||||
style="enable-background:new 0 0 512 512;"
|
||||
version="1.1"
|
||||
viewBox="0 0 512 512"
|
||||
width="512px"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="search.svg"><metadata
|
||||
id="metadata4239"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4237" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4235"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.3037281"
|
||||
inkscape:cx="-124.44228"
|
||||
inkscape:cy="283.03834"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 445,386.7 -84.8,-85.9 c 13.8,-24.1 21,-50.9 21,-77.9 C 381.2,135.3 310,64 222.6,64 135.2,64 64,135.3 64,222.9 c 0,87.6 71.2,158.9 158.6,158.9 27.9,0 55.5,-7.7 80.1,-22.4 l 84.4,85.6 c 1.9,1.9 4.6,3.1 7.3,3.1 2.7,0 5.4,-1.1 7.3,-3.1 L 445,401.2 c 4,-4.1 4,-10.5 0,-14.5 z M 222.6,125.9 c 53.4,0 96.8,43.5 96.8,97 0,53.5 -43.4,97 -96.8,97 -53.4,0 -96.8,-43.5 -96.8,-97 0,-53.5 43.4,-97 96.8,-97 z"
|
||||
id="fill-edit"
|
||||
style="fill:#ffffff"
|
||||
class="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,122 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="20.299726"
|
||||
id="svg17515"
|
||||
version="1.1"
|
||||
viewBox="0 0 20.300547 20.299727"
|
||||
width="20.300547"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="leaf.svg">
|
||||
<metadata
|
||||
id="metadata4242">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4240"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="7.4375"
|
||||
inkscape:cx="9.2732193"
|
||||
inkscape:cy="-8.533034"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg17515" />
|
||||
<defs
|
||||
id="defs17517">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath32617-9-8-8-9">
|
||||
<circle
|
||||
cx="-64.623535"
|
||||
cy="50.047192"
|
||||
id="path32619-2-3-5-1"
|
||||
r="38.553814"
|
||||
style="fill:#4bb7c0;fill-opacity:1;stroke:none"
|
||||
transform="matrix(9.3443438,0,0,9.3443438,-627.91229,-5859.5225)" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath19550">
|
||||
<circle
|
||||
cx="-64.623535"
|
||||
cy="50.047192"
|
||||
id="circle19552"
|
||||
r="38.553814"
|
||||
style="fill:#4bb7c0;fill-opacity:1;stroke:none"
|
||||
transform="matrix(9.3443438,0,0,9.3443438,-627.91229,-5859.5225)" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
id="layer1"
|
||||
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,731.72834,-734.05521)">
|
||||
<g
|
||||
id="g41012"
|
||||
style="display:inline"
|
||||
transform="translate(771.91739,120.01351)">
|
||||
<path
|
||||
d="m -748.16739,916.09845 c 0,6.4893 -4.71244,9.5 -7.75,9.5 -3.03756,0 -7.75,-3.0107 -7.75,-9.5 0,-6.4893 7.75,-14 7.75,-14 0,0 7.75,7.5107 7.75,14 z"
|
||||
id="path24016"
|
||||
style="opacity:1;fill:#88b03c;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
inkscape:connector-curvature="0" />
|
||||
<g
|
||||
id="g40993"
|
||||
transform="translate(0.13258252,0)">
|
||||
<path
|
||||
d="m -756.36719,-114.06055 a 0.50005,0.50005 0 0 0 -0.49219,0.50782 l 0,5.03515 -1.89062,-1.89062 a 0.50004997,0.50004997 0 0 0 -0.35938,-0.15235 0.50004997,0.50004997 0 0 0 -0.34765,0.85938 l 2.59765,2.59765 0,2.83594 -2.39062,-2.39062 a 0.50005,0.50005 0 0 0 -0.35938,-0.15235 0.50005,0.50005 0 0 0 -0.34765,0.85938 l 3.09765,3.09765 0,2.83594 -2.64062,-2.64062 a 0.50004994,0.50004994 0 0 0 -0.35938,-0.15235 0.50004994,0.50004994 0 0 0 -0.34765,0.85938 l 3.34765,3.347654 0,3.742188 c 0.32495,0.05865 0.64277,0.09766 0.94141,0.09766 0.0189,0 0.0395,-0.0037 0.0586,-0.0039 l 0,-3.835938 3.34961,-3.347654 a 0.50004994,0.50004994 0 1 0 -0.70703,-0.70703 l -2.64258,2.64062 0,-2.83594 3.09961,-3.09765 a 0.50005,0.50005 0 1 0 -0.70703,-0.70703 l -2.39258,2.39062 0,-2.83594 2.59961,-2.59765 a 0.50004997,0.50004997 0 1 0 -0.70703,-0.70703 l -1.89258,1.89062 0,-5.03515 a 0.50005,0.50005 0 0 0 -0.50781,-0.50782 z"
|
||||
id="path40983"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#81a53c;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
transform="translate(-0.13258252,1020.3622)"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
<path
|
||||
d="m -755.92578,906.09766 a 0.50005,0.50005 0 0 0 -0.49219,0.50781 l 0,23.48633 a 0.50005,0.50005 0 1 0 1,0 l 0,-23.48633 a 0.50005,0.50005 0 0 0 -0.50781,-0.50781 z"
|
||||
id="path24019"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#94b84f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m -758.66797,909.59766 a 0.50004997,0.50004997 0 0 0 -0.34765,0.85937 l 2.74414,2.74414 a 0.50004997,0.50004997 0 0 0 0.70703,0 l 2.74609,-2.74414 a 0.50004997,0.50004997 0 1 0 -0.70703,-0.70703 l -2.39258,2.39062 -2.39062,-2.39062 a 0.50004997,0.50004997 0 0 0 -0.35938,-0.15234 z"
|
||||
id="path24021"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#94b84f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999994px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m -759.16797,913.34766 a 0.50005,0.50005 0 0 0 -0.34765,0.85937 l 3.24414,3.24414 a 0.50005,0.50005 0 0 0 0.70703,0 l 3.24609,-3.24414 A 0.50005,0.50005 0 1 0 -753.02539,913.5 l -2.89258,2.89062 -2.89062,-2.89062 a 0.50005,0.50005 0 0 0 -0.35938,-0.15234 z"
|
||||
id="path24025"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#94b84f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m -759.41797,917.34766 a 0.50004994,0.50004994 0 0 0 -0.34765,0.85937 l 3.49414,3.49414 a 0.50004994,0.50004994 0 0 0 0.70703,0 l 3.49609,-3.49414 A 0.50004994,0.50004994 0 1 0 -752.77539,917.5 l -3.14258,3.14062 -3.14062,-3.14062 a 0.50004994,0.50004994 0 0 0 -0.35938,-0.15234 z"
|
||||
id="path24033"
|
||||
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#94b84f;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.99999988px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
|
@ -0,0 +1,33 @@
|
|||
<!-- By Sam Herbert (@sherb), for everyone. More @ http://goo.gl/7AJzbL -->
|
||||
<svg width="120" height="30" viewBox="0 0 120 30" xmlns="http://www.w3.org/2000/svg" fill="#333">
|
||||
<circle cx="15" cy="15" r="15">
|
||||
<animate attributeName="r" from="15" to="15"
|
||||
begin="0s" dur="0.8s"
|
||||
values="15;9;15" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="fill-opacity" from="1" to="1"
|
||||
begin="0s" dur="0.8s"
|
||||
values="1;.5;1" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
<circle cx="60" cy="15" r="9" fill-opacity="0.3">
|
||||
<animate attributeName="r" from="9" to="9"
|
||||
begin="0s" dur="0.8s"
|
||||
values="9;15;9" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="fill-opacity" from="0.5" to="0.5"
|
||||
begin="0s" dur="0.8s"
|
||||
values=".5;1;.5" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
<circle cx="105" cy="15" r="15">
|
||||
<animate attributeName="r" from="15" to="15"
|
||||
begin="0s" dur="0.8s"
|
||||
values="15;9;15" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
<animate attributeName="fill-opacity" from="1" to="1"
|
||||
begin="0s" dur="0.8s"
|
||||
values="1;.5;1" calcMode="linear"
|
||||
repeatCount="indefinite" />
|
||||
</circle>
|
||||
</svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
viewBox="0 0 27.264933 27.91894"
|
||||
xml:space="preserve"
|
||||
id="svg4192"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="bell.svg"
|
||||
width="27.264933"
|
||||
height="27.91894"><metadata
|
||||
id="metadata4208"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4206" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4204"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="19.833333"
|
||||
inkscape:cx="13.632468"
|
||||
inkscape:cy="13.95947"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4192" /><path
|
||||
style="fill:#303030"
|
||||
d="M 6.2334745,2.8200083 C 4.9127641,3.5825208 3.8161064,4.7610239 3.14727,6.1384613 2.5498244,7.3681209 2.2834618,8.7361758 2.3751714,10.096279 c 0.043636,0.640147 0.1754012,1.284037 0.4147444,2.024304 0.1433218,0.442894 0.3426228,0.863323 0.5348972,1.270792 0.1230364,0.261182 0.2467934,0.522849 0.3551845,0.78891 0.2587977,0.635917 0.5054067,1.323636 0.7550252,2.101857 0.3276133,1.024217 0.6186368,2.081206 0.8999229,3.103514 0.0989,0.358395 0.1976377,0.716604 0.2979726,1.074465 L 6.1312489,20.17241 21.384741,11.365802 21.883072,11.07809 C 21.519849,10.711677 21.152042,10.349241 20.782999,9.9885358 19.911961,9.1374768 19.01207,8.2573947 18.211279,7.3147403 17.868437,6.9109221 17.544935,6.4762407 17.233768,6.0559234 16.732049,5.3784772 16.213974,4.6773502 15.582176,4.0669455 14.542459,3.0625379 13.381494,2.3824444 12.131114,2.0476967 10.12185,1.5090318 8.0276696,1.7841293 6.2334745,2.8200083 Z M 5.333391,5.9884819 c 0.086873,-0.064846 0.2073855,-0.075858 0.3067679,-0.017718 0.1321312,0.076838 0.1767463,0.2471934 0.099228,0.3797021 -0.7782634,1.3313681 -0.9925158,2.8905071 -0.6355729,4.634773 0.024968,0.1208 -0.032221,0.23889 -0.1329585,0.297051 -0.025184,0.01454 -0.052988,0.0261 -0.083544,0.03211 C 4.7369552,11.3448 4.5900172,11.24694 4.5594892,11.097122 4.1794942,9.2408071 4.4212277,7.5028214 5.2591128,6.0707617 c 0.019458,-0.033177 0.045317,-0.060669 0.074276,-0.082285 z M 5.34982,12.270592 c 0.1416573,-0.05941 0.3044256,0.0069 0.3632978,0.148439 l 0.3167845,0.762725 c 0.054401,0.130674 0.00244,0.277978 -0.1167702,0.346804 -0.010412,0.006 -0.021841,0.01258 -0.033033,0.01722 -0.1416373,0.05944 -0.303839,-0.009 -0.3627124,-0.150525 L 5.1992603,12.63331 c -0.059261,-0.142191 0.00879,-0.305053 0.1505577,-0.36273 z m 0.4264062,8.747949 1.0636038,4.34864 c 0.052183,0.215234 0.1963741,0.388984 0.3982298,0.475715 0.2018063,0.08586 0.4292832,0.07273 0.6210275,-0.03797 l 7.4333247,-4.291631 0.482212,-0.278406 1.931536,-1.115172 0.482212,-0.278406 0.124919,-0.07212 7.096178,-4.09698 c 0.191408,-0.110509 0.316235,-0.299886 0.342055,-0.518065 0.02615,-0.21837 -0.05082,-0.430031 -0.211524,-0.58351 l -3.240947,-3.09155 -0.50236,0.290038 -15.5181062,8.959382 -0.5023606,0.290038 z m 9.8409238,0.926933 c 0.40791,0.374706 1.024929,0.464915 1.529429,0.173642 l 0.639368,-0.369139 c 0.5045,-0.291274 0.734886,-0.870732 0.614334,-1.411345 l -0.531911,0.307099 -1.719309,0.992644 -0.531911,0.307099 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 4.0 KiB |
|
@ -0,0 +1,54 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
width="48"
|
||||
id="svg4262"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="dashboard.svg">
|
||||
<metadata
|
||||
id="metadata4272">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4270" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4268"
|
||||
showgrid="false"
|
||||
inkscape:zoom="19.833333"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4262" />
|
||||
<path
|
||||
d="M 6,26 22,26 22,6 6,6 6,26 Z m 0,16 16,0 0,-12 -16,0 0,12 z m 20,0 16,0 0,-20 -16,0 0,20 z M 26,6 26,18 42,18 42,6 26,6 Z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,52 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 52 52"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 33.890625 36.996338"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="emergency.svg"
|
||||
width="33.890625"
|
||||
height="36.996338"><metadata
|
||||
id="metadata4206"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4204" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4202"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="18.307692"
|
||||
inkscape:cx="16.945312"
|
||||
inkscape:cy="18.498169"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="1104"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
style="fill:#f93e2b"
|
||||
d="m 17,0 c -0.552246,0 -1,0.4477539 -1,1 l 0,4.046875 C 13.653626,5.241516 11.500366,6.1166993 9.7285156,7.4726562 L 7.5292969,4.4160156 C 7.2060539,3.9677736 6.5825196,3.8652341 6.1347656,4.1894531 5.6865236,4.5117181 5.583496,5.1357424 5.90625,5.5839844 L 8.2382812,8.8242188 C 6.8918453,10.26593 5.899781,12.034973 5.390625,14 L 1,14 c -0.5522465,0 -1,0.447754 -1,1 0,0.552246 0.4477535,1 1,1 l 4.0449219,0 c -0.02734,0.329407 -0.048828,0.659851 -0.048828,0.996094 l 0,10.089844 c 0.325928,-0.05499 0.6567378,-0.08984 0.9980468,-0.08984 l 22.0000004,0 c 0.34143,0 0.675903,0.03479 1.001953,0.08984 l 0,-10.089844 c 0,-0.336243 -0.02349,-0.666687 -0.05078,-0.996094 l 3.945313,0 c 0.552246,0 1,-0.447754 1,-1 0,-0.552246 -0.447753,-1 -1,-1 l -4.289063,0 C 28.085813,12.006409 27.074646,10.212647 25.699219,8.7597656 L 27.984375,5.5839844 C 28.307129,5.1357424 28.204101,4.5117181 27.755859,4.1894531 27.307129,3.8666991 26.684082,3.9682616 26.361328,4.4160156 L 24.197266,7.421875 C 22.440675,6.096619 20.316468,5.240357 18,5.046875 L 18,1 C 18,0.4477539 17.552247,0 17,0 Z m -2,10 c 0.552247,0 1,0.447754 1,1 0,0.552246 -0.447753,1 -1,1 -1.654296,0 -3,1.345703 -3,3 0,0.552246 -0.447753,1 -1,1 -0.552246,0 -1,-0.447754 -1,-1 0,-2.756836 2.243165,-5 5,-5 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#000000;fill-opacity:1"
|
||||
d="m 5.9960938,28.996094 c -2.199951,0 -4,1.799988 -4,4 0,2.210022 1.800049,4 4,4 l 22.0000002,0 c 2.210022,0 4,-1.789978 4,-4 0,-2.200012 -1.789978,-4 -4,-4 l -22.0000002,0 z"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 3.2 KiB |
|
@ -0,0 +1,63 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="44"
|
||||
viewBox="0 0 44 44"
|
||||
width="44"
|
||||
id="svg4303"
|
||||
version="1.1"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="event.svg">
|
||||
<metadata
|
||||
id="metadata4313">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs4311" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4309"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="27.246023"
|
||||
inkscape:cy="13.248375"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4303"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0" />
|
||||
<path
|
||||
d="m 22,14 c -4.42,0 -8,3.58 -8,8 0,4.42 3.58,8 8,8 4.42,0 8,-3.58 8,-8 0,-4.42 -3.58,-8 -8,-8 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
d="m 20,0 0,4.1191406 C 11.66,5.0391406 5.0391406,11.66 4.1191406,20 L 0,20 0,24 4.1191406,24 C 5.0391406,32.34 11.66,38.960859 20,39.880859 L 20,44 l 4,0 0,-4.119141 C 32.34,38.960859 38.960859,32.34 39.880859,24 L 44,24 44,20 39.880859,20 C 38.960859,11.66 32.34,5.0391406 24,4.1191406 L 24,0 20,0 Z m 2,8 c 7.73,0 14,6.27 14,14 0,7.73 -6.27,14 -14,14 C 14.27,36 8,29.73 8,22 8,14.27 14.27,8 22,8 Z"
|
||||
id="path4857"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
viewBox="0 0 26.324236 19.183594"
|
||||
xml:space="preserve"
|
||||
id="svg4176"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="messages.svg"
|
||||
width="26.324236"
|
||||
height="19.183594"><metadata
|
||||
id="metadata4190"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4188" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4186"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="14.024284"
|
||||
inkscape:cx="14.033312"
|
||||
inkscape:cy="4.9732261"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="1104"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4176" /><path
|
||||
style="fill:#303030"
|
||||
d="M 2.048828,0 C 0.918458,0 0,0.922854 0,2.058594 l 0,10.851562 c 0,1.13086 0.918458,2.048829 2.048828,2.048829 l 2.634765,0 0,-0.699219 0,-9.759766 c 0,-1.13086 0.920412,-2.050781 2.050782,-2.050781 l 14.205078,0 0.701172,0 0,-0.390625 C 21.640615,0.922844 20.715828,0 19.580078,0 L 2.048828,0 Z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
style="fill:#303030"
|
||||
d="M 7.6015625 3.1484375 C 6.0512025 3.1484375 5.3847656 3.7640931 5.3847656 5.3144531 L 5.3847656 13.902344 C 5.3847656 15.446824 6.6488794 16.710938 8.1933594 16.710938 L 22.816406 16.710938 C 23.014646 16.710938 23.209957 16.776367 23.367188 16.896484 L 25.625 18.628906 L 26.324219 19.183594 L 26.324219 4.5097656 C 26.324219 4.5045656 26.324259 4.4993806 26.324219 4.4941406 C 26.318319 3.7324706 25.630831 3.1484375 24.869141 3.1484375 L 24.263672 3.1484375 L 7.6015625 3.1484375 z M 10.814453 8.265625 L 20.193359 8.265625 C 20.386719 8.265625 20.542969 8.4218744 20.542969 8.6152344 C 20.542969 8.8085934 20.386719 8.9648438 20.193359 8.9648438 L 10.814453 8.9648438 C 10.621093 8.9648438 10.464844 8.8085934 10.464844 8.6152344 C 10.464844 8.4218744 10.621093 8.265625 10.814453 8.265625 z M 12.449219 11.107422 L 18.558594 11.107422 C 18.751954 11.107422 18.910156 11.263671 18.910156 11.457031 C 18.910156 11.650391 18.751954 11.806641 18.558594 11.806641 L 12.449219 11.806641 C 12.255859 11.806641 12.099609 11.650391 12.099609 11.457031 C 12.099609 11.263671 12.255859 11.107422 12.449219 11.107422 z "
|
||||
id="path4211" /></svg>
|
After Width: | Height: | Size: 3.1 KiB |
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 48 48"
|
||||
height="48px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 48 48"
|
||||
width="48px"
|
||||
xml:space="preserve"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="profile.svg"><metadata
|
||||
id="metadata4223"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs4221" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview4219"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.906433"
|
||||
inkscape:cx="16.712255"
|
||||
inkscape:cy="22.408078"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="M 43,42 5,42 C 2.791,42 1,40.209 1,38 L 1,17 c 0,-2.209 1.791,-4 4,-4 l 15,0 0,-4 c 0,-2.209 1.791,-4 4,-4 2.209,0 4,1.791 4,4 l 0,4 15,0 c 2.209,0 4,1.791 4,4 l 0,21 c 0,2.209 -1.791,4 -4,4 z M 17.014,34.488 c 0,0.003 0,0.004 0,0.004 -0.004,0 -0.018,-0.781 -0.018,-0.781 0,0 1.166,-0.601 2.031,-1.378 0.507,-0.417 0.741,-1.362 0.741,-1.362 0.137,-0.828 0.238,-2.877 0.238,-3.703 0,-2.062 -1.033,-4.28 -4.007,-4.28 l 0,-0.008 0,0.007 c -2.974,0 -4.007,2.219 -4.007,4.28 0,0.826 0.102,2.875 0.238,3.703 0,0 0.234,0.945 0.741,1.362 0.865,0.777 2.031,1.378 2.031,1.378 0,0 -0.014,0.781 -0.018,0.781 0,0 0,-10e-4 0,-0.004 0,0 0.029,1.146 0.029,1.487 0,1.362 -1.365,2.018 -2.223,2.018 -0.002,0 -0.002,0 -0.003,0 -2.593,0.113 -3.205,0.976 -3.21,0.984 C 9.419,39.23 9.199,39.482 8.998,40 l 14.004,0 c -0.201,-0.518 -0.421,-0.77 -0.582,-1.022 -0.005,-0.009 -0.617,-0.871 -3.21,-0.984 -0.001,0 -0.001,0 -0.003,0 -0.857,0 -2.223,-0.655 -2.223,-2.018 0,-0.342 0.03,-1.488 0.03,-1.488 z M 26,9 C 26,7.896 25.104,7 24,7 22.896,7 22,7.896 22,9 l 0,6 c 0,1.104 0.896,2 2,2 1.104,0 2,-0.896 2,-2 l 0,-6 z m 19,8 c 0,-1.104 -0.896,-2 -2,-2 l -15,0 c 0,2.209 -1.791,4 -4,4 -2.209,0 -4,-1.791 -4,-4 L 5,15 c -1.104,0 -2,0.896 -2,2 l 0,21 c 0,1.104 0.896,2 2,2 l 1.797,0 c 0.231,-0.589 0.656,-1.549 1.16,-2.24 0.025,-0.014 0.848,-1.739 4.998,-1.79 0.006,-0.021 0.01,-1.042 0.022,-1.027 -0.32,-0.202 -0.737,-0.516 -1.051,-0.816 -0.255,-0.156 -1.161,-1.029 -1.452,-2.583 -0.087,-0.542 -0.488,-3.099 -0.488,-4.166 0,-3.171 1.265,-6.381 5.953,-6.381 0.021,0 0.1,0 0.121,0 4.688,0 5.953,3.21 5.953,6.381 0,1.067 -0.401,3.624 -0.488,4.166 -0.291,1.554 -1.197,2.427 -1.452,2.583 -0.313,0.301 -0.73,0.614 -1.051,0.816 0.013,-0.015 0.017,1.007 0.022,1.027 4.151,0.051 4.974,1.776 4.998,1.79 0.504,0.691 0.929,1.651 1.16,2.24 L 43,40 c 1.104,0 2,-0.896 2,-2 l 0,-21 z m -5,9 -12,0 c -0.553,0 -1,-0.447 -1,-1 0,-0.553 0.447,-1 1,-1 l 12,0 c 0.553,0 1,0.447 1,1 0,0.553 -0.447,1 -1,1 z m -12,4 2,0 c 0.553,0 1,0.447 1,1 0,0.553 -0.447,1 -1,1 l -2,0 c -0.553,0 -1,-0.447 -1,-1 0,-0.553 0.447,-1 1,-1 z m 0,4 6,0 c 0.553,0 1,0.447 1,1 0,0.553 -0.447,1 -1,1 l -6,0 c -0.553,0 -1,-0.447 -1,-1 0,-0.553 0.447,-1 1,-1 z m 4,-3 c 0,-0.553 0.447,-1 1,-1 l 4,0 c 0.553,0 1,0.447 1,1 0,0.553 -0.447,1 -1,1 l -4,0 c -0.553,0 -1,-0.447 -1,-1 z m -9,-22 2,0 0,2 -2,0 0,-2 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0"
|
||||
style="clip-rule:evenodd;fill-rule:evenodd" /></svg>
|
After Width: | Height: | Size: 3.8 KiB |
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" ?><svg height="60px" version="1.1" viewBox="0 0 60 60" width="60px" xmlns="http://www.w3.org/2000/svg" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns" xmlns:xlink="http://www.w3.org/1999/xlink"><title/><desc/><defs/><g fill="none" fill-rule="evenodd" id="Page-1" stroke="none" stroke-width="1"><g fill="#1B1A19" id="Fill-175-+-Fill-176-+-Fill-177"><path d="M60,38 C60,37.448 59.552,37 59,37 L53.91,37 C53.431,34.167 50.967,32 48,32 C45.033,32 42.569,34.167 42.09,37 L19.91,37 C19.431,34.167 16.967,32 14,32 C11.033,32 8.569,34.167 8.09,37 L1,37 C0.448,37 0,37.448 0,38 C0,38.552 0.448,39 1,39 L3,39 L3,46 C3,48.617 5.477,51 8.198,51 L11.156,51 L16.137,59.505 C16.385,59.928 16.902,60.11 17.36,59.933 L22.924,57.788 L27.585,59.91 L27.599,59.913 L27.784,59.957 L27.984,59.997 L28,60 L28.171,59.966 L28.358,59.934 L34.102,57.734 L39.631,59.929 C39.751,59.978 39.876,60 39.999,60 C40.353,60 40.693,59.812 40.874,59.486 L45.588,51 L54,51 C56.369,51 60,48.76 60,46 L60,39 C60,38.814 59.935,38.649 59.847,38.5 C59.935,38.351 60,38.186 60,38 L60,38 Z M48,34 C50.206,34 52,35.794 52,38 C52,40.206 50.206,42 48,42 C45.794,42 44,40.206 44,38 C44,35.794 45.794,34 48,34 L48,34 Z M14,34 C16.206,34 18,35.794 18,38 C18,40.206 16.206,42 14,42 C11.794,42 10,40.206 10,38 C10,35.794 11.794,34 14,34 L14,34 Z M22.597,55.771 L17.434,57.761 L13.474,51 L27,51 L27,57.446 L23.371,55.794 C23.126,55.684 22.849,55.676 22.597,55.771 L22.597,55.771 Z M39.552,57.747 L34.477,55.731 C34.243,55.639 33.984,55.637 33.75,55.727 L29,57.546 L29,51 L43.3,51 L39.552,57.747 L39.552,57.747 Z M58,46 C58,47.362 55.543,49 54,49 L12,49 L11.893,49.022 L11.729,49 L8.198,49 C6.614,49 5,47.486 5,46 L5,39 L8.09,39 C8.569,41.833 11.033,44 14,44 C16.967,44 19.431,41.833 19.91,39 L42.09,39 C42.569,41.833 45.033,44 48,44 C50.967,44 53.431,41.833 53.91,39 L58,39 L58,46 L58,46 Z" id="Fill-175"/><path d="M29.567,32.302 C29.717,32.382 29.878,32.419 30.037,32.419 C30.394,32.419 30.74,32.228 30.92,31.89 C31.18,31.403 30.996,30.797 30.508,30.537 C23.63,26.869 25.251,23.28 27.304,18.737 C28.185,16.788 29.087,14.789 29.18,12.777 C31.258,14.095 33,16.007 33,18 C33,18.464 33.319,18.867 33.77,18.973 C34.225,19.078 34.687,18.862 34.894,18.447 C36.686,14.863 38.696,10.844 34.298,2.877 C42.521,6.311 46.877,13.37 45.03,20.757 C44.939,21.12 45.058,21.502 45.338,21.75 C45.619,21.997 46.013,22.069 46.361,21.933 C47.843,21.359 49.981,19.289 50.873,15.691 C51.909,17.67 53.019,20.658 52.74,23.266 C52.557,24.984 51.806,26.261 50.445,27.168 C49.986,27.474 49.862,28.095 50.168,28.555 C50.474,29.014 51.095,29.139 51.555,28.832 C53.414,27.593 54.482,25.792 54.729,23.479 C55.22,18.884 52.21,13.517 50.984,12.251 C50.706,11.966 50.286,11.872 49.915,12.011 C49.543,12.151 49.289,12.498 49.268,12.895 C49.125,15.589 48.273,17.412 47.399,18.553 C47.968,10.457 41.994,2.935 32.286,0.042 C31.887,-0.076 31.45,0.066 31.199,0.401 C30.948,0.737 30.933,1.194 31.162,1.545 C35.585,8.348 35.423,12.012 34.231,15.108 C33.022,12.859 30.589,11.087 28.417,10.091 C28.064,9.928 27.649,9.986 27.353,10.237 C27.057,10.488 26.933,10.888 27.035,11.263 C27.581,13.267 26.561,15.524 25.481,17.914 C23.501,22.297 21.037,27.753 29.567,32.302" id="Fill-176"/><path d="M40.628,30.071 C40.116,30.277 39.866,30.858 40.071,31.372 C40.228,31.762 40.603,32 41,32 C41.124,32 41.249,31.977 41.372,31.929 C43.311,31.153 44.407,29.276 44.457,26.645 C44.535,22.484 42.034,17.254 39.406,16.086 C39.04,15.923 38.607,15.996 38.315,16.272 C38.021,16.548 37.922,16.974 38.063,17.351 C39.428,20.989 38.767,23.496 37.408,24.092 C36.305,24.577 34.958,23.705 34.058,21.925 C33.875,21.563 33.488,21.347 33.087,21.379 C32.683,21.412 32.338,21.684 32.214,22.07 C30.967,25.944 30.96,28.375 34.293,31.707 C34.684,32.098 35.316,32.098 35.707,31.707 C36.098,31.316 36.098,30.684 35.707,30.293 C33.672,28.258 33.176,26.851 33.575,24.715 C35.07,26.282 36.857,26.519 38.212,25.923 C39.81,25.222 40.98,23.347 40.809,20.473 C41.764,22.233 42.495,24.578 42.456,26.606 C42.422,28.434 41.807,29.6 40.628,30.071" id="Fill-177"/></g></g></svg>
|
After Width: | Height: | Size: 4.0 KiB |
|
@ -0,0 +1,62 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="20"
|
||||
version="1.2"
|
||||
viewBox="0 0 20 20"
|
||||
width="20"
|
||||
xml:space="preserve"
|
||||
id="svg3422"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="rain.svg"><metadata
|
||||
id="metadata3445"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs3443" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1855"
|
||||
inkscape:window-height="1056"
|
||||
id="namedview3441"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="38.291667"
|
||||
inkscape:cx="8.7725789"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg3422" /><g
|
||||
id="Layer_1"
|
||||
transform="translate(-2,-4)"><g
|
||||
id="g3425"><path
|
||||
d="m 15,22 c -0.552,0 -1,-0.447 -1,-1 l 0,-6 c 0,-0.553 0.448,-1 1,-1 0.552,0 1,0.447 1,1 l 0,6 c 0,0.553 -0.448,1 -1,1 z"
|
||||
id="path3427"
|
||||
inkscape:connector-curvature="0" /></g><g
|
||||
id="g3429"><path
|
||||
d="M 9,22 C 8.448,22 8,21.553 8,21 l 0,-6 c 0,-0.553 0.448,-1 1,-1 0.552,0 1,0.447 1,1 l 0,6 c 0,0.553 -0.448,1 -1,1 z"
|
||||
id="path3431"
|
||||
inkscape:connector-curvature="0" /></g><g
|
||||
id="g3433"><path
|
||||
d="m 12,24 c -0.552,0 -1,-0.447 -1,-1 l 0,-6 c 0,-0.553 0.448,-1 1,-1 0.552,0 1,0.447 1,1 l 0,6 c 0,0.553 -0.448,1 -1,1 z"
|
||||
id="path3435"
|
||||
inkscape:connector-curvature="0" /></g><g
|
||||
id="g3437"><path
|
||||
d="M 6,18 C 3.794,18 2,16.206 2,14 2,12.139 3.277,10.571 5.001,10.126 5,10.084 5,10.042 5,10 5,6.691 7.691,4 11,4 13.587,4 15.824,5.639 16.65,8.015 19.586,7.771 22,10.128 22,13 c 0,2.241 -1.507,4.223 -3.666,4.819 -0.535,0.146 -1.083,-0.166 -1.23,-0.697 -0.147,-0.532 0.165,-1.083 0.698,-1.23 C 19.096,15.534 20,14.345 20,13 c 0,-1.654 -1.346,-3 -3,-3 -0.242,0 -0.499,0.041 -0.811,0.13 L 15.115,10.436 14.93,9.334 C 14.604,7.402 12.952,6 11,6 8.794,6 7,7.794 7,10 c 0,0.272 0.027,0.545 0.082,0.808 L 7.33,12.01 5.908,11.994 C 4.897,12 4,12.897 4,14 c 0,1.103 0.897,2 2,2 0.552,0 1,0.447 1,1 0,0.553 -0.448,1 -1,1 z"
|
||||
id="path3439"
|
||||
inkscape:connector-curvature="0" /></g></g></svg>
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg enable-background="new -0.71 -1.337 141.732 141.732" height="141.732px" id="Livello_1" version="1.1" viewBox="-0.71 -1.337 141.732 141.732" width="141.732px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Livello_66"><path d="M136.314,53.739L136.314,53.739l-16.896-4.931l12.231-7.688c2.58-1.622,3.465-5.218,1.976-8.024 c-1.486-2.81-4.787-3.771-7.367-2.149l-12.269,7.715l4.541-18.456c0.771-3.137-0.938-6.354-3.813-7.194 c-2.877-0.839-5.838,1.02-6.605,4.154l-7.336,29.803L75.662,62.75l-0.084-0.056H75.57l-0.002-24.781l20.039-21.818 c2.104-2.294,2.104-6.013-0.002-8.307c-2.104-2.294-5.521-2.294-7.627,0L75.57,21.3L75.568,5.875c0-3.244-2.414-5.874-5.396-5.875 c-2.979,0.001-5.395,2.631-5.395,5.875v15.382L52.411,7.788c-2.105-2.294-5.521-2.294-7.63,0s-2.107,6.013,0,8.307L64.78,37.871 V62.8l-0.053-0.104l-0.076,0.05l-25.104-15.78L32.214,17.16c-0.771-3.138-3.729-4.994-6.604-4.154 c-2.879,0.84-4.586,4.061-3.813,7.191l4.541,18.457l-12.269-7.714c-2.582-1.621-5.881-0.655-7.369,2.15 c-1.489,2.81-0.604,6.403,1.975,8.021l12.234,7.69l-16.9,4.936c-2.878,0.842-4.587,4.062-3.812,7.194 c0.771,3.134,3.729,4.993,6.607,4.154l27.318-7.974l19.739,12.41L34.11,81.942l-27.314-7.97c-2.882-0.84-5.837,1.021-6.606,4.153 C-0.584,81.259,1.125,84.479,4,85.317l16.897,4.934L8.663,97.94c-2.58,1.622-3.466,5.215-1.978,8.024s4.791,3.771,7.371,2.147 l12.266-7.713l-4.538,18.456c-0.771,3.134,0.938,6.354,3.813,7.194s5.836-1.021,6.605-4.153l7.334-29.804l25.11-15.787l0.084,0.053 l0.043-0.084l0.002,0.084h0.011l0.002,24.785l-20.04,21.817c-2.104,2.294-2.104,6.014,0,8.307c2.107,2.294,5.521,2.294,7.629,0 l12.41-13.509v15.424c0,3.245,2.416,5.875,5.396,5.875c2.979,0,5.393-2.63,5.393-5.874l0.002-15.382l12.368,13.468 c2.105,2.294,5.521,2.294,7.63,0c2.104-2.294,2.104-6.013,0-8.307l-20-21.775V76.344l0.01,0.018l0.074-0.047l25.104,15.781 l7.334,29.803c0.771,3.138,3.729,4.994,6.605,4.154s4.586-4.06,3.812-7.194l-4.541-18.456l12.269,7.712 c2.58,1.622,5.883,0.66,7.368-2.146c1.49-2.812,0.607-6.402-1.973-8.024l-12.233-7.688l16.896-4.934c0,0,0,0,0.002,0 c2.877-0.839,4.584-4.06,3.812-7.19c-0.771-3.134-3.729-4.993-6.604-4.153l-27.32,7.97L86.453,69.539l19.75-12.417l27.317,7.97 v0.001c2.879,0.839,5.836-1.021,6.605-4.154C140.898,57.8,139.191,54.579,136.314,53.739"/></g><g id="Livello_1_1_"/></svg>
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -0,0 +1,53 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="19"
|
||||
version="1.2"
|
||||
viewBox="0 0 20 19"
|
||||
width="20"
|
||||
xml:space="preserve"
|
||||
id="svg3562"
|
||||
inkscape:version="0.91 r13725"
|
||||
sodipodi:docname="storm.svg"><metadata
|
||||
id="metadata3577"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs3575" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="735"
|
||||
inkscape:window-height="480"
|
||||
id="namedview3573"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="10"
|
||||
inkscape:cy="11"
|
||||
inkscape:window-x="65"
|
||||
inkscape:window-y="24"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg3562" /><g
|
||||
id="Layer_1"
|
||||
transform="translate(-2,-4)"><g
|
||||
id="g3565"><path
|
||||
d="m 17,18 c -0.553,0 -1,-0.447 -1,-1 0,-0.553 0.447,-1 1,-1 1.654,0 3,-1.346 3,-3 0,-1.654 -1.346,-3 -3,-3 -0.238,0 -0.496,0.042 -0.813,0.131 L 15.116,10.432 14.93,9.334 C 14.604,7.402 12.951,6 11,6 8.795,6 7,7.794 7,10 c 0,0.274 0.027,0.545 0.082,0.806 l 0.26,1.24 -1.436,-0.052 C 4.896,12 4,12.897 4,14 c 0,1.103 0.896,2 2,2 0.553,0 1,0.447 1,1 0,0.553 -0.447,1 -1,1 C 3.795,18 2,16.206 2,14 2,12.139 3.277,10.571 5.002,10.126 5,10.084 5,10.042 5,10 5,6.691 7.691,4 11,4 13.587,4 15.824,5.638 16.649,8.015 19.574,7.774 22,10.127 22,13 c 0,2.757 -2.243,5 -5,5 z"
|
||||
id="path3567"
|
||||
inkscape:connector-curvature="0" /></g><g
|
||||
id="g3569"><polygon
|
||||
points="9.639,23 14.139,18.95 11.139,17.5 12.639,14 8.139,18.051 11.139,19.5 "
|
||||
id="polygon3571" /></g></g></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg height="64px" id="Layer_1" style="enable-background:new 0 0 44 64;" version="1.1" viewBox="0 0 44 64" width="44px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Body_7_"><g><path d="M32,0H12C9.791,0,8,1.791,8,4v56c0,2.209,1.791,4,4,4h20c2.209,0,4-1.791,4-4V4 C36,1.791,34.209,0,32,0z" style="fill:#666666;"/></g></g><g id="Tunnel_Visor"><g><path d="M0,8c2.938,0,6,10,6,10h2V6H0V8z M0,26c2.938,0,6,10,6,10h2 V24H0V26z M0,44c2.938,0,6,9.999,6,9.999h2v-12H0V44z M36,6v12h2c0,0,3.063-10,6-10V6H36z M36,36h2c0,0,3.063-10,6-10v-2h-8V36z M36,53.999h2c0,0,3.063-9.999,6-9.999v-2.001h-8V53.999z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#333333;"/></g></g><g id="Green"><g><ellipse cx="22" cy="49.982" rx="6" ry="6.006" style="fill:#88C057;"/></g></g><g id="Yellow_2_"><g><ellipse cx="22" cy="31.982" rx="6" ry="6.006" style="fill:#FFCC66;"/></g></g><g id="Red_2_"><g><ellipse cx="22" cy="13.982" rx="6" ry="6.006" style="fill:#ED7161;"/></g></g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></svg>
|
After Width: | Height: | Size: 1.2 KiB |
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" ?><!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'><svg height="60px" id="Layer_1" style="enable-background:new 0 0 64.001 60;" version="1.1" viewBox="0 0 64.001 60" width="64.001px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g id="Stand_1_"><g><rect height="8" style="fill:#B3B3B3;" width="32" x="16.001" y="44"/></g></g><g id="Leg"><g><path d="M8.001,56c0,2.209,1.791,4,4,4s4-1.791,4-4V6h-8V56z M48.001,6v50c0,2.209,1.79,4,4,4 c2.209,0,4-1.791,4-4V6H48.001z" style="fill:#CCCCCC;"/></g></g><g id="Bar"><g><path d="M60.445,15.999H3.556C1.592,15.999,0,17.609,0,19.596v8.789c0,1.986,1.592,3.597,3.556,3.597h56.89 c1.963,0,3.555-1.61,3.555-3.597v-8.789C64,17.609,62.408,15.999,60.445,15.999z" style="fill:#E6E6E6;"/></g></g><g id="Stripes_1_"><g><path d="M10.001,16l-10,10v2.395c0.005,1.981,1.594,3.587,3.555,3.587 H6.02L22.001,16H10.001z M60.455,16h-2.454L42.02,31.981h12l9.98-9.98v-2.405C64,17.612,62.413,16.006,60.455,16z M34.001,16 l-16,16h12l16-16H34.001z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FF8833;"/></g></g><g id="Lights"><g><path d="M12.001,0c-3.313,0-6,2.686-6,6c0,3.313,2.687,6,6,6 s6-2.687,6-6C18.001,2.686,15.314,0,12.001,0z M52.001,0c-3.313,0-6,2.686-6,6c0,3.313,2.687,6,6,6s6-2.687,6-6 C58.001,2.686,55.314,0,52.001,0z" style="fill-rule:evenodd;clip-rule:evenodd;fill:#FFCC66;"/></g></g><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/><g/></svg>
|
After Width: | Height: | Size: 1.5 KiB |
|
@ -8,7 +8,6 @@
|
|||
|
||||
/* (1) Start session */
|
||||
session_start();
|
||||
// $_SESSION['PERM'] = ['journalist'];
|
||||
|
||||
/* (2) Set default Driver for Repos */
|
||||
Repo::setDriver(DatabaseDriver::get());
|
||||
|
@ -17,5 +16,5 @@
|
|||
Request::setAuthSystem(new AuthSystemDefault);
|
||||
|
||||
/* (4) launch router */
|
||||
$MainRouter = Router::launch($_GET['url']);
|
||||
Router::launch($_GET['url']);
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
test prod-releaser@1
|
|
@ -0,0 +1,39 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.4">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
<title>Nuit de l'Info 2017-18</title>
|
||||
|
||||
<!-- Icon -->
|
||||
<link rel='shortcut icon' href='/favicon.ico'>
|
||||
|
||||
<!-- CSS dependencies -->
|
||||
<link rel='stylesheet' type='text/css' href='/css/font-loader.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/layout.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/menu.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/header.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/container.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/accueil.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/notification-stack.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/login-form.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/signup-form.css'>
|
||||
|
||||
<!-- JS dependencies -->
|
||||
<script type='text/javascript' src='/js/_SERVER.js'></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<div id='main-vue'></div>
|
||||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/bundle.js'></script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,31 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
<title>Nuit de l'Info 2017-18</title>
|
||||
|
||||
<!-- Icon -->
|
||||
<link rel='shortcut icon' href='/favicon.ico'>
|
||||
|
||||
<!-- CSS dependencies -->
|
||||
|
||||
<!-- JS libs -->
|
||||
<script type='text/javascript' src='/js/lib/api.js'></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
|
||||
<div id='mainview'></div>
|
||||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/action-script.js'></script>
|
||||
<script type='text/javascript' src='/js/bundle.js'></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,161 @@
|
|||
/* classe API */
|
||||
export class API{
|
||||
|
||||
constructor(target){
|
||||
|
||||
this.target = target;
|
||||
|
||||
this.xhr = []; // tableau d'objets pour les requêtes ajax
|
||||
this.buffer = null; // Contiendra le buffer pour debugger si erreur de parsage
|
||||
this.error = { // error constants
|
||||
'-1': 'Invalid target format: "METHOD module/method"',
|
||||
'-2': 'XHR error',
|
||||
'-3': 'Invalid JSON response',
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* transaction avec le serveur (http://{host}/api/)
|
||||
*
|
||||
* @param pTarget<String> URI cible, format "HTTP_METHOD uri/uri/uri"
|
||||
* @param pArgs<Object> Le tableu d'arguments passé en POST (attribut<->postfield) à http://{host}/api/
|
||||
* @param pHandler<Function> Fonction qui s'éxécutera lors de la réponse (1 argument -> réponse<Object>)
|
||||
* @param pToken<String> Optionnel, token d'auth pour l'api
|
||||
*
|
||||
***************************************************************************************************
|
||||
*
|
||||
* @usecase
|
||||
* 1. api.call(
|
||||
* 2. "PUT newspaper/article/4"
|
||||
* 2. { content: "New article content" },
|
||||
* 3. function(resp){
|
||||
* 4. alert(resp.error);
|
||||
* 5. }
|
||||
* 6. );
|
||||
*
|
||||
*/
|
||||
call(pTarget, pArgs, pHandler, pToken=null){
|
||||
|
||||
|
||||
/* (1) Check @pHandler (for dispatching errors)
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Check if is a Function */
|
||||
if( !(pHandler instanceof Function) )
|
||||
throw new Error("3rd argument must be a function, but is of type '"+typeof(pHandler)+"' !");
|
||||
|
||||
|
||||
|
||||
/* (2) Check @pTarget
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Check format */
|
||||
if( !/^([A-Z]+) (.+)/i.test(pTarget) ){
|
||||
pHandler({ error: -1, ErrorDescription: this.error['-1'] });
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) Store locally data */
|
||||
var lHttpMethod = RegExp.$1;
|
||||
var lUri = RegExp.$2;
|
||||
|
||||
|
||||
|
||||
/* (3) Create form data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Create virtual form */
|
||||
var lForm = new FormData();
|
||||
|
||||
/* (2) Add attributes */
|
||||
for( var key in pArgs ){
|
||||
|
||||
// {2.1} If a file -> send as it //
|
||||
if( pArgs[key] instanceof File )
|
||||
lForm.append(key, pArgs[key]);
|
||||
|
||||
// {2.2} Else -> JSON stringify //
|
||||
else
|
||||
lForm.append(key, JSON.stringify(pArgs[key]));
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (4) Create XHR request
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Clean ended requests */
|
||||
for( var i = this.xhr.length-1 ; i >= 0 ; i-- ){
|
||||
|
||||
if( this.xhr[i] != null )
|
||||
break;
|
||||
|
||||
this.xhr.pop();
|
||||
|
||||
}
|
||||
|
||||
/* (2) Push a new entry -> fetch its index */
|
||||
i = this.xhr.push(null) - 1;
|
||||
|
||||
/* (3) Create XHR object */
|
||||
this.xhr[i] = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHttpRequest');
|
||||
|
||||
|
||||
|
||||
/* (5) Bind response event
|
||||
---------------------------------------------------------*/
|
||||
var self = this; // to access the buffer
|
||||
|
||||
this.xhr[i].onreadystatechange = function(i){
|
||||
|
||||
/* (1) If request over */
|
||||
if( this.xhr[i].readyState == 4 ){
|
||||
|
||||
/* (2) Update buffer (for debug) */
|
||||
self.buffer = this.xhr[i].responseText;
|
||||
|
||||
/* (3) If request success */
|
||||
if( [0, 200, 417].indexOf(this.xhr[i].status) > -1 ){
|
||||
|
||||
|
||||
/* (3.1) Create default response (if JSON error) */
|
||||
var response = {error:-3, ErrorDescription: self.error['-3']};
|
||||
|
||||
/* (3.2) Try to parse JSON */
|
||||
try{ response = JSON.parse(this.xhr[i].responseText); }catch(e){}
|
||||
|
||||
/* (3.3) Launch @pHandler with response */
|
||||
pHandler(response);
|
||||
|
||||
/* (4) If request error */
|
||||
}else
|
||||
pHandler({ error:-2, ErrorDescription: self.error['-2'] });
|
||||
|
||||
/* (5) Notify current xhr instance is done */
|
||||
this.xhr[i] = null;
|
||||
|
||||
}
|
||||
|
||||
}.bind(this, i);
|
||||
|
||||
|
||||
/* (6) Finish & send request
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Open the XHR */
|
||||
this.xhr[i].open(lHttpMethod, this.target+lUri, true);
|
||||
|
||||
/* (2) Manage optional token */
|
||||
if( pToken != null )
|
||||
this.xhr[i].setRequestHeader('Authorization', 'Digest '+pToken);
|
||||
|
||||
/* (3) Custom header to notify we're using Ajax */
|
||||
this.xhr[i].setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
|
||||
/* (4) Make the call */
|
||||
this.xhr[i].send( lForm );
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
/* classe GlobalStore */
|
||||
export class GlobalStore{
|
||||
|
||||
constructor(){
|
||||
|
||||
this.data = {};
|
||||
|
||||
}
|
||||
|
||||
add(field, value){
|
||||
this.data[field] = value;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/* classe InfoBox */
|
||||
export class InfoBox{
|
||||
|
||||
|
||||
constructor(msgObject){
|
||||
|
||||
/* (1) get reference target */
|
||||
this.target = msgObject;
|
||||
|
||||
/* (2) Init useful variables */
|
||||
this.stack = []; // message stack
|
||||
this.pending = false; // if currently waiting/showing
|
||||
|
||||
|
||||
}
|
||||
|
||||
show(msg, type, timeout=2000){
|
||||
|
||||
/* (1) If pending -> add to stack */
|
||||
if( this.pending )
|
||||
|
||||
this.stack.push( {message: msg, type: type, to: timeout} );
|
||||
|
||||
/* (2) Else -> display message */
|
||||
else
|
||||
this._display(msg, type, timeout);
|
||||
|
||||
}
|
||||
|
||||
|
||||
_next(){
|
||||
|
||||
/* (1) Init */
|
||||
this.target.active = false;
|
||||
|
||||
|
||||
/* (2) Get last active message + pop stack */
|
||||
var buf = this.stack.pop();
|
||||
|
||||
/* (3) If no more msg -> exit */
|
||||
if( buf == null )
|
||||
return (this.pending = false);
|
||||
|
||||
/* (4) Send current message */
|
||||
this._display(buf.message, buf.type, buf.to);
|
||||
|
||||
}
|
||||
|
||||
|
||||
_display(msg, type, timeout=2000){
|
||||
|
||||
/* (1) Set pending */
|
||||
this.pending = true;
|
||||
|
||||
/* (2) Set message data */
|
||||
this.target.message = msg;
|
||||
this.target.type = type;
|
||||
this.target.active = true;
|
||||
|
||||
/* (3) Timeout to next */
|
||||
setTimeout(this._next.bind(this), timeout);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,217 @@
|
|||
/* classe client WebSocket */
|
||||
class WSClient{
|
||||
|
||||
/* (1) Constructor
|
||||
*
|
||||
* @server_url<String> The url of the desired server
|
||||
* @channel_uri<String> The url of the desired channel
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
constructor(server_url, channel_uri){
|
||||
|
||||
/* (1) Store & create data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Store the arguments */
|
||||
this.server_url = server_url;
|
||||
this.channel_uri = channel_uri;
|
||||
this.built_url = this.server_url+'/'+this.channel_uri;
|
||||
|
||||
/* (2) Initialise event data */
|
||||
this.is_opened = false; // Set to TRUE when connection opened
|
||||
this.pending = null; // Next message to send through connection
|
||||
this.handler = []; // On reveice handlers
|
||||
|
||||
/* (3) Create the websocket connection */
|
||||
this.ws = new WebSocket(this.built_url);
|
||||
|
||||
|
||||
/* (2) Bind events
|
||||
---------------------------------------------------------*/
|
||||
/* (1) OPEN: when connection is established */
|
||||
this.ws.onopen = this._onopen.bind(this);
|
||||
|
||||
/* (2) MESSAGE: when message received */
|
||||
this.ws.onmessage = this._onmessage.bind(this);
|
||||
|
||||
/* (3) ERROR: when websocket error */
|
||||
this.ws.onerror = this._onerror.bind(this);
|
||||
|
||||
/* (4) CLOSE: when websocket closes */
|
||||
this.ws.onclose = this._onclose.bind(this);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Binds a handle to the onReceive event (global only)
|
||||
*
|
||||
* @callback<Function> Callback function(message, error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
listen(callback){
|
||||
|
||||
/* (1) Check @callback type (default value) */
|
||||
if( !(callback instanceof Function) )
|
||||
throw new Error('WSClient.bind(callback) expected argument *callback* to be a function');
|
||||
|
||||
/* (2) Store callback */
|
||||
this.on_receive = callback;
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Sends a message through the socket
|
||||
*
|
||||
* @message<String> The data to send
|
||||
* <Object> The data to send (will be serialized)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
send(message){
|
||||
|
||||
/* (1) Manage arguments
|
||||
---------------------------------------------------------*/
|
||||
/* (2) Check @message type */
|
||||
if( typeof message != 'string' && typeof message != 'object' ){
|
||||
this.on_receive(null, 'wrong message type');
|
||||
return this;
|
||||
}
|
||||
|
||||
/* (2) Stringify JSON if object */
|
||||
if( typeof message == 'object' )
|
||||
message = JSON.stringify(message);
|
||||
|
||||
|
||||
/* (2) Send process
|
||||
---------------------------------------------------------*/
|
||||
/* (1) If not opened -> store message (will send when onopen()) */
|
||||
if( !this.is_opened )
|
||||
this.pending = message;
|
||||
|
||||
/* (2) If already opened -> send now */
|
||||
else
|
||||
this.ws.send(message);
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) PRIVATE: Open handler
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
_onopen(){
|
||||
|
||||
/* (1) Set @is_opened status variable */
|
||||
this.is_opened = true;
|
||||
|
||||
/* (2) If message pending */
|
||||
if( this.pending != null ){
|
||||
|
||||
this.ws.send(this.pending); // send message
|
||||
this.pending = null; // reset message (optional)
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (5) PRIVATE: Receive handler
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
_onmessage(msg_event){
|
||||
|
||||
/* (1) If not trusted -> error */
|
||||
if( !msg_event.isTrusted ){
|
||||
this.on_receive(null, 'not trusted');
|
||||
return;
|
||||
}
|
||||
|
||||
/* (2) If wrong origin -> error */
|
||||
if( msg_event.origin != this.server_url ){
|
||||
this.on_receive(null, 'unknown origin');
|
||||
return;
|
||||
}
|
||||
|
||||
/* (3) If not for this channel -> exit */
|
||||
if( msg_event.target.url != this.built_url )
|
||||
return;
|
||||
|
||||
/* (3) Try to JSON parse */
|
||||
var parsedMsg = null;
|
||||
try{
|
||||
|
||||
parsedMsg = JSON.parse(msg_event.data);
|
||||
|
||||
}catch(e){
|
||||
this.on_receive(null, 'JSON error');
|
||||
return;
|
||||
}
|
||||
|
||||
/* (4) If all right -> success */
|
||||
this.on_receive(parsedMsg, null);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (6) PRIVATE: Error handler
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
_onerror(){
|
||||
|
||||
/* (1) Remove other handlers (only 1 error) */
|
||||
this.ws.onmessage = null;
|
||||
this.ws.onclose = null;
|
||||
|
||||
/* (2) Send error */
|
||||
this.on_receive(null, 'websocket error');
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (7) PRIVATE: Close handler
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
_onclose(){
|
||||
|
||||
/* (1) Remove onmessage (not to catch messages) */
|
||||
this.ws.onmessage = null;
|
||||
|
||||
/* (2) Send end */
|
||||
this.on_receive(null, 'websocket closed');
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
class WSClientBuilder{
|
||||
|
||||
/* (1) Constructor
|
||||
*
|
||||
* @server_url<String> The url of the desired server
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
constructor(server_url){
|
||||
/* (1) Store the server url */
|
||||
this.server_url = server_url;
|
||||
}
|
||||
|
||||
|
||||
/* (2) Builds a WSClient with desired channel
|
||||
*
|
||||
* @channel_uri<String> The uri of the desired channel
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
channel(channel_uri=''){
|
||||
return new WSClient(this.server_url, channel_uri);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
export{ WSClient, WSClientBuilder }
|
66
view/main.js
|
@ -1,7 +1,65 @@
|
|||
/* (1) Imports
|
||||
---------------------------------------------------------*/
|
||||
/* (1) NPM libs */
|
||||
import Vue from 'vue'
|
||||
// import App from './vue/main.vue'
|
||||
import VueRouter from 'vue-router'
|
||||
|
||||
/* (2) Internal libs */
|
||||
import {API} from './lib/api-es6'
|
||||
import {InfoBox} from './lib/infobox-es6'
|
||||
import {WSClient,WSClientBuilder} from './lib/ws-client-es6'
|
||||
import routes from './routes'
|
||||
|
||||
/* (3) Vues */
|
||||
import wrapper_vue from './vue/wrapper.vue'
|
||||
|
||||
|
||||
/* (2) Initialisation
|
||||
---------------------------------------------------------*/
|
||||
/* (1) global store init */
|
||||
require('./vue-config');
|
||||
window.gstore.add('server', window._SERVER);
|
||||
window.infobox = new InfoBox(gstore.data.info);
|
||||
|
||||
/* (2) API */
|
||||
window.api = new API(gstore.data.is_local ? 'http://ndli1718/api/v/1.0/' : 'https://ndli1718.xdrm.io/api/v/1.0/');
|
||||
|
||||
/* (3) wsclient */
|
||||
window.wsc = new WSClientBuilder(gstore.data.is_local ? 'ws://localhost:9999' : 'wss://websocket.xdrm.io');
|
||||
|
||||
|
||||
/* (4) Init vue router */
|
||||
Vue.use(VueRouter);
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: routes[0]
|
||||
});
|
||||
|
||||
/* (5) Render view */
|
||||
new Vue({
|
||||
el: '#mainview',
|
||||
render: h => h(require('./vue/main.vue'))
|
||||
})
|
||||
el: '#main-vue',
|
||||
router,
|
||||
render: h => h(wrapper_vue)
|
||||
});
|
||||
|
||||
/* (6) Navigate at page load (to update notifications count) */
|
||||
gstore.data.func.nav(router, null);
|
||||
|
||||
|
||||
/* (3) Set WebSocket channels
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Make router globally available */
|
||||
window._router_ = router;
|
||||
|
||||
/* (2) Create/Manage web socket clients */
|
||||
require('./websocket');
|
||||
|
||||
/* (3) Remove global ref to router */
|
||||
delete window._router_;
|
||||
|
||||
|
||||
/* (4) Get geolocation
|
||||
---------------------------------------------------------*/
|
||||
navigator.geolocation && navigator.geolocation.watchPosition(function(loc){
|
||||
gstore.data.loc = [ loc.coords.latitude, loc.coords.longitude ];
|
||||
}, null, { enableHighAccuracy: true });
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
export default { 0: [
|
||||
|
||||
{
|
||||
path: '/dashboard/',
|
||||
component: require('./vue/container/dashboard.vue').default
|
||||
}, {
|
||||
path: '/emergency/',
|
||||
component: require('./vue/container/emergency.vue').default
|
||||
}, {
|
||||
path: '/inbox/',
|
||||
component: require('./vue/container/inbox.vue').default
|
||||
}, {
|
||||
path: '/event/',
|
||||
component: require('./vue/container/event.vue').default
|
||||
}, {
|
||||
path: '*',
|
||||
redirect: '/dashboard/'
|
||||
}
|
||||
]}
|
|
@ -0,0 +1,155 @@
|
|||
import {GlobalStore} from './lib/gstore-es6'
|
||||
|
||||
window.gstore = new GlobalStore();
|
||||
|
||||
// Header
|
||||
gstore.add('header_title', 'ndli1718');
|
||||
gstore.add('info', {
|
||||
active: false,
|
||||
type: 'warning',
|
||||
message: 'Warning! blabla'
|
||||
});
|
||||
gstore.add('notif', {
|
||||
emergency: { class: 'emergency', data: [], count: 0 },
|
||||
event: { class: 'event', data: [], count: 0 },
|
||||
inbox: { class: 'message', data: [], count: 0 },
|
||||
dashboard: { class: 'menu', data: [], count: 0 }
|
||||
});
|
||||
|
||||
// Menu
|
||||
gstore.add('menu_item', {
|
||||
dashboard: {
|
||||
label: 'Accueil',
|
||||
theme: 'dashboard'
|
||||
}, emergency: {
|
||||
label: 'Urgences',
|
||||
theme: 'emergency'
|
||||
}, event: {
|
||||
label: 'Signalements',
|
||||
theme: 'event'
|
||||
}, inbox: {
|
||||
label: 'Messagerie',
|
||||
theme: 'inbox'
|
||||
}
|
||||
});
|
||||
|
||||
gstore.add('URI', document.URL.replace(/^(?:\/\/|[^\/]+)*/, ''));
|
||||
gstore.add('is_local', document.URL.replace(/^http:\/\/([^\/]+).*$/, '$1') == 'ndli1718');
|
||||
gstore.add('min_menu', false);
|
||||
|
||||
// Proccess current page from url
|
||||
if( /^\/(\w+)(?:\/?.*)$/.test(gstore.data.URI) ){
|
||||
var mi_keys = Object.keys( gstore.data.menu_item );
|
||||
|
||||
// if current page exists
|
||||
if( !!~mi_keys.indexOf(RegExp.$1) ) gstore.add('menu_item_active', RegExp.$1);
|
||||
else gstore.add('menu_item_active', 'dashboard');
|
||||
|
||||
}else
|
||||
gstore.add('menu_item_active', 'dashboard');
|
||||
|
||||
// Functions
|
||||
gstore.add('func', {
|
||||
nav: function(router, uri){
|
||||
|
||||
// {1} Update view (vue-router) //
|
||||
if( typeof uri == 'string' )
|
||||
router.push('/'+uri);
|
||||
|
||||
// {2} if no @uri -> Extract route from @router //
|
||||
else if( /^\/([^\/]+).*$/.test( router.app.$route.path ) )
|
||||
uri = RegExp.$1;
|
||||
|
||||
// {3} If no @uri -> exit //
|
||||
else
|
||||
return;
|
||||
|
||||
// {4} Activate current menu_item //
|
||||
gstore.data.menu_item_active = uri;
|
||||
|
||||
// {5} Manage notifications //
|
||||
for( var id in gstore.data.notif )
|
||||
if( id == uri ) // if notif links to current page
|
||||
gstore.data.notif[id].count = 0;
|
||||
|
||||
},
|
||||
toggleMenuSize: function(){ gstore.data.min_menu=!gstore.data.min_menu; },
|
||||
bbcode: function(msg){
|
||||
/* (1) Escape HTML
|
||||
---------------------------------------------------------*/
|
||||
msg = msg.replace(/&/g, '&');
|
||||
msg = msg.replace(/</g, '<');
|
||||
msg = msg.replace(/>/g, '>');
|
||||
|
||||
|
||||
/* (2) Manage text format
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Manage bold */
|
||||
msg = msg.replace(/\*([^\*]+)\*/g, "<b>$1</b>");
|
||||
|
||||
/* (2) italic */
|
||||
msg = msg.replace(/_([^_]+)_/g, "<i>$1</i>");
|
||||
|
||||
/* (3) underline */
|
||||
msg = msg.replace(/\[([^\]]+)\]/g, "<ins>$1</ins>");
|
||||
|
||||
/* (4) Code */
|
||||
msg = msg.replace(/`([^`]+)`/g, "<span class='code'>$1</span>");
|
||||
|
||||
|
||||
/* (3) Manage emojis
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Smileys */
|
||||
msg = msg.replace(/:D/g, "<span class='utf8'>😃</span>");
|
||||
msg = msg.replace(/:\)/g, "<span class='utf8'>🙂</span>");
|
||||
msg = msg.replace(/:B/g, "<span class='utf8'>😎</span>");
|
||||
msg = msg.replace(/:3/g, "<span class='utf8'>😗</span>");
|
||||
msg = msg.replace(/;\)/g, "<span class='utf8'>😉</span>");
|
||||
msg = msg.replace(/:P/g, "<span class='utf8'>😋</span>");
|
||||
msg = msg.replace(/;P/g, "<span class='utf8'>😜</span>");
|
||||
msg = msg.replace(/xD/g, "<span class='utf8'>😆</span>");
|
||||
msg = msg.replace(/:O/ig, "<span class='utf8'>😲</span>");
|
||||
msg = msg.replace(/:S/g, "<span class='utf8'>😖</span>");
|
||||
msg = msg.replace(/\^\^/g, "<span class='utf8'>😊</span>");
|
||||
|
||||
/* (2) Emojis */
|
||||
msg = msg.replace(/:poop:/g, "<span class='utf8 br'>💩</span>");
|
||||
msg = msg.replace(/:fuck:/g, "<span class='utf8'>🖕</span>");
|
||||
msg = msg.replace(/\+1/g, "<span class='utf8 bl'>👍</span>");
|
||||
msg = msg.replace(/-1/g, "<span class='utf8 bl'>👎</span>");
|
||||
|
||||
return msg;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// new-message container
|
||||
gstore.add('new_msg', {
|
||||
inbox: '',
|
||||
emergency: '',
|
||||
event: ''
|
||||
});
|
||||
// edit-message container
|
||||
gstore.add('upd_msg', {
|
||||
inbox: null,
|
||||
emergency: null,
|
||||
event: null
|
||||
});
|
||||
// if message loader
|
||||
gstore.add('msg_pending', {
|
||||
inbox: true,
|
||||
emergency: true,
|
||||
event: true
|
||||
}); // true when message send pending
|
||||
|
||||
// notification stack visibility
|
||||
gstore.add('nstack', false);
|
||||
|
||||
// location
|
||||
gstore.add('loc', [0, 0]);
|
||||
|
||||
// login form authentication visibility
|
||||
gstore.add('loginform', false);
|
||||
|
||||
// sign up form visibility
|
||||
gstore.add('signupform', false);
|
|
@ -0,0 +1,54 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='accueil'>
|
||||
<h1>{{ nom_app.toUpperCase() }}</h1>
|
||||
<h2>Ayez les bons réflexes !</h2>
|
||||
<p>Parce que chaque seconde gagnée est précieuse pour augmenter la chance de survie de la personne accidentée,
|
||||
voici les principaux numéros d'urgences ouvert 24/7 : </p>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="tel:15">15<div class='phone'></div></a></td>
|
||||
<td><a href="tel:17">17<div class='phone'></div></a></td>
|
||||
<td><a href="tel:18">18<div class='phone'></div></a></td>
|
||||
<td><a href="tel:112">112<div class='phone'></div></a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SAMU</td>
|
||||
<td>Police</td>
|
||||
<td>Pompier</td>
|
||||
<td>Urgence<br>européenne</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h2>Le concept</h2>
|
||||
<div>
|
||||
<p>{{ nom_app }} est la toute dernière application de prévention routière. C'est également une manière simple
|
||||
d'échanger sur le traffic, et de prévenir l'accident. Parmi les 3 centre de discussion, vous retrouverez
|
||||
les icônes suivants : </p>
|
||||
<ul>
|
||||
<li><div><img class='icon-type' src="/public_html/image/type/rain.svg"/></div> : forte pluie</li>
|
||||
<li><div><img class='icon-type' src="/public_html/image/type/snow.svg"/></div> : neige ou verglas</li>
|
||||
<li><div><img class='icon-type' src="/public_html/image/type/storm.svg"/></div> : tempête ou orage</li>
|
||||
<li><div><img class='icon-type' src="/public_html/image/type/accident.svg"/></div> : accident de voiture</li>
|
||||
<li><div><img class='icon-type' src="/public_html/image/type/traffic.svg"/></div> : ralentissements</li>
|
||||
<li><div><img class='icon-type' src="/public_html/image/type/work.svg"/></div> : travaux sur la route</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'CONTAINER_ACCUEIL',
|
||||
data(){
|
||||
return {
|
||||
gstore: gstore.data,
|
||||
nom_app: 'Ndli1718'
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,147 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='message'>
|
||||
|
||||
<div v-for='(msg, id) in gstore.notif.emergency.data' :class="msg.user == gstore.server.session.name ? 'me' : ''" :data-noauthor='id == 0 || gstore.notif.emergency.data[id-1].user != msg.user ? "1" : "0"'>
|
||||
<span class='author' v-text='msg.user' v-if='id == 0 || gstore.notif.emergency.data[id-1].user != msg.user'></span>
|
||||
<span class='content' v-html='bbcode(msg.message)'></span>
|
||||
<span class='date' v-text='local_date(id)'></span>
|
||||
<span @click='del_message(msg.id)' class='del' v-if='msg.user == gstore.server.session.name'></span>
|
||||
<span @click='upd_message(msg.id, msg.message)' class='upd' v-if='msg.user == gstore.server.session.name'></span>
|
||||
<span @click='maps(msg.location)' class='maps' v-if='msg.user != gstore.server.session.name && msg.location[0] != 0 && msg.location[1] != 0'></span>
|
||||
</div>
|
||||
|
||||
<div class='end-pad'></div> <!-- End Spacing -->
|
||||
|
||||
<form class='msg-input' @submit.prevent='new_message(gstore.new_msg.emergency)'>
|
||||
<input type='text' placeholder='Nouveau message..' id='msg-new-content' v-model='gstore.new_msg.emergency' :class='gstore.msg_pending.emergency ? "loading" : ""'>
|
||||
<button></button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'CONTAINER_EMERGENCY',
|
||||
data(){ return {
|
||||
gstore: gstore.data,
|
||||
dep: "31"
|
||||
}; },
|
||||
methods: {
|
||||
maps(coord){
|
||||
window.open('https://www.google.com/maps/?q=-'+coord[0]+','+coord[1]);
|
||||
},
|
||||
local_date: function(id){
|
||||
/* (1) Get current date (convert unix timestamp to javascript timestamp */
|
||||
var cur = new Date( gstore.data.notif.emergency.data[id].timestamp * 1000);
|
||||
|
||||
/* (2) First line -> show whole date */
|
||||
if( id < 1 )
|
||||
return cur.toLocaleString();
|
||||
|
||||
/* (3) Get previous date */
|
||||
var pre = new Date( gstore.data.notif.emergency.data[id-1].timestamp );
|
||||
|
||||
/* (2) If same day -> show time only */
|
||||
if( cur.toLocaleDateString() == pre.toLocaleDateString() )
|
||||
return cur.toLocaleTimeString();
|
||||
|
||||
return cur.toLocaleString();
|
||||
},
|
||||
new_message(msg){
|
||||
|
||||
/* (1) If empty message -> abort */
|
||||
if( msg.trim().length == 0 )
|
||||
return;
|
||||
|
||||
|
||||
|
||||
/* (1) If in EDIT_MODE
|
||||
---------------------------------------------------------*/
|
||||
if( gstore.data.upd_msg.emergency != null ){
|
||||
|
||||
/* (2) Prepare request */
|
||||
var rq = {
|
||||
id: this.gstore.upd_msg.emergency,
|
||||
message: msg
|
||||
};
|
||||
|
||||
/* (3) Add loader */
|
||||
gstore.data.msg_pending.emergency = true;
|
||||
|
||||
/* (4) Send request */
|
||||
api.call("PUT message/emergency/"+this.dep, rq, function(rs){
|
||||
|
||||
// {1} If error -> exit //
|
||||
if( rs.error != 0 )
|
||||
return;
|
||||
|
||||
// {2} Update message content //
|
||||
for( var id in gstore.data.notif.emergency.data )
|
||||
if( gstore.data.notif.emergency.data[id].id == gstore.data.upd_msg.emergency )
|
||||
gstore.data.notif.emergency.data[id].message = msg;
|
||||
|
||||
|
||||
// {3} exit EDIT_MODE //
|
||||
gstore.data.upd_msg.emergency = null;
|
||||
|
||||
// {4} Empty input //
|
||||
gstore.data.new_msg.emergency = '';
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
/* (2) If IN NEW_MSG_MODE
|
||||
---------------------------------------------------------*/
|
||||
}else{
|
||||
|
||||
/* (2) Prepare request */
|
||||
var rq = {
|
||||
message: this.gstore.new_msg.emergency,
|
||||
location: this.gstore.loc,
|
||||
username: this.gstore.server.session.name
|
||||
};
|
||||
|
||||
/* (3) Add loader */
|
||||
gstore.data.msg_pending.emergency = true;
|
||||
|
||||
/* (4) Send request */
|
||||
api.call("POST message/emergency/"+this.dep, rq, function(rs){
|
||||
|
||||
// {1} If error -> exit //
|
||||
if( rs.error != 0 )
|
||||
return;
|
||||
|
||||
// {2} Empty input //
|
||||
gstore.data.new_msg.emergency = '';
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
del_message(id_msg){
|
||||
api.call("DELETE message/emergency/"+this.dep, { id: id_msg }, function(rs){});
|
||||
},
|
||||
upd_message(id_msg, msg_content){
|
||||
|
||||
/* (1) Move to 'edit_mode' */
|
||||
this.gstore.upd_msg.emergency = id_msg;
|
||||
|
||||
/* (2) Copy message content to INPUT */
|
||||
this.gstore.new_msg.emergency = msg_content;
|
||||
|
||||
|
||||
},
|
||||
bbcode: function(msg){
|
||||
return this.gstore.func.bbcode(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,80 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='message'>
|
||||
|
||||
<div v-for='(msg, id) in gstore.notif.event.data' :class="msg[0] == gstore.server.session.name ? 'me' : ''" :data-noauthor='id == 0 || gstore.notif.event.data[id-1][0] != gstore.notif.event.data[id][0] ? "1" : "0"'>
|
||||
<span class='author' v-text='msg[0]' v-if='id == 0 || gstore.notif.event.data[id-1][0] != msg[0]'></span>
|
||||
<span class='content' v-html='bbcode(msg[1])'></span>
|
||||
<span class='date' v-text='local_date(id)'></span>
|
||||
</div>
|
||||
|
||||
<div class='end-pad'></div> <!-- End Spacing -->
|
||||
|
||||
<form class='msg-input' @submit.prevent='new_message(gstore.new_msg.event)'>
|
||||
<input type='text' placeholder='Nouveau message..' id='msg-new-content' v-model='gstore.new_msg.event' :class='gstore.msg_pending.event ? "loading" : ""'>
|
||||
<button></button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'CONTAINER_EVENT',
|
||||
data(){ return { gstore: gstore.data }; },
|
||||
methods: {
|
||||
local_date: function(id){
|
||||
/* (1) Get current date */
|
||||
var cur = new Date( gstore.data.notif.event.data[id].timestamp * 1000 );
|
||||
|
||||
/* (2) First line -> show whole date */
|
||||
if( id < 1 )
|
||||
return cur.toLocaleString();
|
||||
|
||||
/* (3) Get previous date */
|
||||
var pre = new Date( gstore.data.notif.event.data[id-1].timestamp );
|
||||
|
||||
/* (2) If same day -> show time only */
|
||||
if( cur.toLocaleDateString() == pre.toLocaleDateString() )
|
||||
return cur.toLocaleTimeString();
|
||||
|
||||
return cur.toLocaleString();
|
||||
},
|
||||
new_message(msg){
|
||||
|
||||
/* (1) If empty message -> abort */
|
||||
if( msg.trim().length == 0 )
|
||||
return;
|
||||
|
||||
/* (2) Prepare request */
|
||||
var rq = {
|
||||
message: this.gstore.new_msg.event,
|
||||
location: this.gstore.loc,
|
||||
username: this.gstore.server.session.name
|
||||
};
|
||||
|
||||
/* (3) Add loader */
|
||||
gstore.data.msg_pending.event = true;
|
||||
|
||||
/* (4) Send request */
|
||||
api.call("POST message/event/"+this.dep, rq, function(rs){
|
||||
|
||||
// {1} If error -> exit //
|
||||
if( rs.error != 0 )
|
||||
return;
|
||||
|
||||
// {2} Empty input //
|
||||
gstore.data.new_msg.event = '';
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
bbcode: function(msg){
|
||||
return this.gstore.func.bbcode(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,49 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='message'>
|
||||
|
||||
<div v-for='(msg, id) in gstore.notif.inbox.data' :class="msg[0] == gstore.server.session.name ? 'me' : ''" :data-noauthor='id == 0 || gstore.notif.inbox.data[id-1][0] != gstore.notif.inbox.data[id][0] ? "1" : "0"'>
|
||||
<span class='author' v-text='msg[0]' v-if='id == 0 || gstore.notif.inbox.data[id-1][0] != msg[0]'></span>
|
||||
<span class='content' v-html='bbcode(msg[1])'></span>
|
||||
</div>
|
||||
|
||||
<div class='end-pad'></div> <!-- End Spacing -->
|
||||
|
||||
<form class='msg-input' @submit.prevent='new_message(gstore.new_msg.inbox)'>
|
||||
<input type='text' placeholder='Nouveau message..' id='msg-new-content' v-model='gstore.new_msg.inbox' :class='gstore.msg_pending.inbox ? "loading" : ""'>
|
||||
<button></button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'CONTAINER_INBOX',
|
||||
data(){ return { gstore: gstore.data }; },
|
||||
methods: {
|
||||
new_message(msg){
|
||||
|
||||
/* (1) If empty message -> abort */
|
||||
if( msg.trim().length == 0 )
|
||||
return;
|
||||
|
||||
/* (2) Send message to WebSocket */
|
||||
wsc_chat.send(JSON.stringify({message: msg}));
|
||||
|
||||
/* (3) Add loader */
|
||||
gstore.data.msg_pending.inbox = true;
|
||||
|
||||
/* (4) Empty input */
|
||||
this.gstore.new_msg.inbox = '';
|
||||
|
||||
},
|
||||
bbcode: function(msg){
|
||||
return this.gstore.func.bbcode(msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,49 @@
|
|||
<template>
|
||||
|
||||
<div id='HEADER'>
|
||||
|
||||
<!-- Header Icon+Title -->
|
||||
<div id='header-icon' @click='gstore.func.toggleMenuSize'>
|
||||
<div class='header-title'>{{ gstore.header_title }}</div>
|
||||
</div>
|
||||
|
||||
<!-- Header Info -->
|
||||
<div id='header-info' v-show='gstore.info.active' :class='gstore.info.type'>{{ gstore.info.message }}</div>
|
||||
|
||||
<!-- Header Notif -->
|
||||
<div id='header-notif'>
|
||||
<div v-for='(notif, link) in gstore.notif' @click='show_notif(link)' :class='"hnotif " + notif.class' :data-count='notif.count'></div>
|
||||
<div v-if='!is_connected' @click='show_login()' class='hnotif login'></div>
|
||||
<div v-if='is_connected' @click='logout()' class='hnotif logout'></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'HEADER',
|
||||
data(){
|
||||
return {
|
||||
gstore: gstore.data,
|
||||
is_connected: _SERVER.session.connected
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
show_notif(uri){
|
||||
this.gstore.func.nav(this.$router, uri);
|
||||
},
|
||||
show_login() {
|
||||
this.gstore.signupform = false;
|
||||
this.gstore.loginform = !this.gstore.loginform;
|
||||
},
|
||||
logout() {
|
||||
api.call('DELETE user/logout', null, function() {
|
||||
document.location = '';
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,66 @@
|
|||
<template>
|
||||
|
||||
<div id='LOGIN-FORM' :class='gstore.loginform ? "active" : ""'>
|
||||
|
||||
<!-- Header -->
|
||||
<div class='head'>
|
||||
<span>Connexion au compte</span>
|
||||
<i></i>
|
||||
</div>
|
||||
|
||||
<!-- Body -->
|
||||
<div class='body'>
|
||||
<form @submit.prevent='authentification'>
|
||||
<label for='username'>Nom d'utilisateur</label>
|
||||
<input :class='err_connection ? "err" : ""' v-model='username_val' type='text' id='username'>
|
||||
<label for='password'>Mot de passe</label>
|
||||
<input :class='err_connection ? "err" : ""' v-model='password_val' type='password' id='password'>
|
||||
<p v-if='err_connection' id='msg-err'>Identifiant ou mot de passe incorrect</p>
|
||||
<div>
|
||||
<button id='btn-connection'>Se connecter</button>
|
||||
<span>ou</span>
|
||||
<button @click='signup' id='btn-signup'>S'inscrire</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'LOGIN_FORM',
|
||||
data(){
|
||||
return {
|
||||
gstore: gstore.data,
|
||||
username_val: '',
|
||||
password_val: '',
|
||||
err_connection: false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
authentification() {
|
||||
let request = {
|
||||
username: this.username_val,
|
||||
password: this.password_val
|
||||
};
|
||||
|
||||
api.call("POST user/login", request, function (response) {
|
||||
/* (1) Check if is there an error and display theme that goes with */
|
||||
if (response.error != 0 || !response.connected) {
|
||||
this.err_connection = true;
|
||||
}
|
||||
/* (2) Close the login form authentication */
|
||||
else {
|
||||
document.location = '';
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
signup(evt) {
|
||||
evt.preventDefault();
|
||||
this.gstore.signupform = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -1,59 +0,0 @@
|
|||
<template>
|
||||
<div id="app">
|
||||
<h1>{{ msg }}</h1>
|
||||
<h2>Essential Links</h2>
|
||||
<ul>
|
||||
<li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
|
||||
<li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
|
||||
<li><a href="https://chat.vuejs.org" target="_blank">Community Chat</a></li>
|
||||
<li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
|
||||
</ul>
|
||||
<h2>Ecosystem</h2>
|
||||
<ul>
|
||||
<li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
|
||||
<li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
|
||||
<li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
|
||||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'app',
|
||||
data () {
|
||||
return {
|
||||
msg: 'Welcome to Your Vue.js App'
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#app {
|
||||
font-family: 'Avenir', Helvetica, Arial, sans-serif;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
text-align: center;
|
||||
color: #2c3e50;
|
||||
margin-top: 60px;
|
||||
}
|
||||
|
||||
h1, h2 {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
li {
|
||||
display: inline-block;
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #42b983;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,28 @@
|
|||
<template>
|
||||
|
||||
<div id='MENU'>
|
||||
|
||||
<div v-for='(item, index) in gstore.menu_item' class='menu-item-wrapper'>
|
||||
|
||||
<div :class="(index == gstore.menu_item_active) ? 'menu-item active' : 'menu-item'" @click='navigate(index)' :data-theme='item.theme'>
|
||||
<span>{{ item.label }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'MENU',
|
||||
data(){ return { gstore: gstore.data }; },
|
||||
methods: {
|
||||
navigate(uri){
|
||||
this.gstore.func.nav(this.$router, uri);
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,24 @@
|
|||
<template>
|
||||
|
||||
<div id='NOTIF-STACK' :class='gstore.nstack ? "active" : ""'>
|
||||
|
||||
<!-- Header -->
|
||||
<div class='head'>Notifications</div>
|
||||
|
||||
<!-- Body -->
|
||||
<div class='body'>
|
||||
<span v-for='n in gstore.notif.emergency.data'><b>{{ n }}</b> est connecté</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'NOTIFICATION_STACK',
|
||||
data(){ return { gstore: gstore.data }; },
|
||||
methods: {}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,104 @@
|
|||
<template>
|
||||
|
||||
<div id='SIGNUP-FORM' :class='gstore.signupform ? "active" : ""'>
|
||||
|
||||
<!-- Header -->
|
||||
<div class='head'>
|
||||
<span>Création d'un compte</span>
|
||||
<i></i>
|
||||
</div>
|
||||
|
||||
<!-- Body -->
|
||||
<div class='body'>
|
||||
<form @submit.prevent='create_account'>
|
||||
<label for='username'>Nom d'utilisateur</label>
|
||||
<input :class='err_username ? "err" : ""' v-model='username_val' type='text' id='username'>
|
||||
<label for='mail'>Adresse mail</label>
|
||||
<input :class='err_mail ? "err" : ""' v-model='mail_val' type='email' id='mail'>
|
||||
<label for='password'>Mot de passe</label>
|
||||
<input v-model='password_val' type='password' id='password'>
|
||||
<p v-if='err_username || err_mail || err_unknow' id='msg-err'>{{ err_message }}</p>
|
||||
<button id='btn-create-account'>Créer mon compte</button>
|
||||
<p @click='redirect_login' id='membre'>Déjà membre ? Connectez-vous !</p>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'SIGNUP_FORM',
|
||||
data(){
|
||||
return {
|
||||
gstore: gstore.data,
|
||||
username_val: '',
|
||||
mail_val: '',
|
||||
password_val: '',
|
||||
err_username: false,
|
||||
err_mail: false,
|
||||
err_unknow: false,
|
||||
err_message: ''
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
create_account() {
|
||||
const const_username = this.username_val;
|
||||
const const_mail = this.mail_val;
|
||||
const const_password = this.password_val;
|
||||
|
||||
let request = {
|
||||
username: const_username,
|
||||
mail: const_mail,
|
||||
password: const_password
|
||||
};
|
||||
|
||||
api.call("POST user/signup", request, function (response) {
|
||||
/* (1) Check if is there an error and display theme that goes with */
|
||||
if (response.error == 17 && response.ErrorDescription.indexOf('mail') !== -1) {
|
||||
this.err_username = false;
|
||||
this.err_mail = true;
|
||||
this.err_unknow = false;
|
||||
this.err_message = 'Le mail est invalide';
|
||||
}
|
||||
else if (response.error == 17 && response.ErrorDescription.indexOf('username') !== -1) {
|
||||
this.err_username = true;
|
||||
this.err_mail = false;
|
||||
this.err_unknow = false;
|
||||
this.err_message = 'Le nom d\'utilisateur a des caractères invalides';
|
||||
}
|
||||
else if (response.error == 29) {
|
||||
this.err_username = true;
|
||||
this.err_mail = true;
|
||||
this.err_unknow = false;
|
||||
this.err_message = 'Le nom d\'utilisateur ou le mail est déjà pris';
|
||||
}
|
||||
else if (!response.registered) {
|
||||
this.err_username = false;
|
||||
this.err_mail = false;
|
||||
this.err_unknow = true;
|
||||
this.err_message = 'Impossible de créer le compte pour le moment, veuillez réessayer plus tard';
|
||||
}
|
||||
/* (2) Close the sign up form authentication */
|
||||
else {
|
||||
infobox._display('Inscription terminée ! Connexion en cours ...', 'info', 3000);
|
||||
|
||||
let request = {
|
||||
username: const_username,
|
||||
password: const_password
|
||||
};
|
||||
|
||||
api.call("POST user/login", request, function (response) {
|
||||
document.location = '';
|
||||
});
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
redirect_login() {
|
||||
this.gstore.signupform = false;
|
||||
this.gstore.loginform = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
|
@ -0,0 +1,47 @@
|
|||
<template>
|
||||
<div id="WRAPPER" :class='gstore.min_menu ? "min" : ""'>
|
||||
|
||||
<!-- Header -->
|
||||
<header-comp></header-comp>
|
||||
|
||||
<!-- Menu -->
|
||||
<menu-comp></menu-comp>
|
||||
|
||||
<!-- Container -->
|
||||
<router-view></router-view>
|
||||
|
||||
|
||||
<!-- Notification Stack -->
|
||||
<notifstack-comp></notifstack-comp>
|
||||
|
||||
<!-- Login form -->
|
||||
<loginform-comp></loginform-comp>
|
||||
|
||||
<!--Sign pu form-->
|
||||
<signupform-comp></signupform-comp>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
import header_vue from './header.vue'
|
||||
import menu_vue from './menu.vue'
|
||||
import notifstack_vue from './notification-stack.vue'
|
||||
import loginform_vue from './login-form.vue'
|
||||
import signupform_vue from './signup-form.vue';
|
||||
|
||||
export default {
|
||||
name: 'wrapper',
|
||||
data(){ return { gstore: gstore.data }; },
|
||||
components: {
|
||||
'HeaderComp': header_vue,
|
||||
'MenuComp': menu_vue,
|
||||
'NotifstackComp': notifstack_vue,
|
||||
'LoginformComp': loginform_vue,
|
||||
'SignupformComp': signupform_vue
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
|
@ -0,0 +1,165 @@
|
|||
// make router usable as it
|
||||
const router = window._router_;
|
||||
|
||||
|
||||
|
||||
/* (1) Emergency channel
|
||||
---------------------------------------------------------*/
|
||||
window.wsc_emergency = wsc.channel('emergency/31').listen(function(msg, err){
|
||||
|
||||
/* (1) Manage error */
|
||||
if( msg == null && err != null )
|
||||
return infobox.show('Erreur de connexion WebSocket@emergency ('+err+')', 'error', 3000);
|
||||
|
||||
/* (2) Manage wsclient error */
|
||||
if( typeof msg.error != 'boolean' || msg.error !== false )
|
||||
return infobox.show('Erreur de connexion WebSocket@emergency', 'warning', 3000);
|
||||
|
||||
/* (3) If message(s) to add */
|
||||
if( msg.add != null ){
|
||||
|
||||
// {1} Play sound if 1msg received + not already on page //
|
||||
// note: 1msg means a new message but not the page load past buffer
|
||||
if( msg.add.length == 1 && router.app.$route.path != '/emergency' )
|
||||
( new Audio('https://notificationsounds.com/message-tones/communication-channel-519/download/mp3') ).play();
|
||||
|
||||
// {2} Add messages to stack //
|
||||
for( var id in msg.add ){
|
||||
|
||||
var tmp = msg.add[id]; // add id to data
|
||||
tmp.id = id;
|
||||
|
||||
gstore.data.notif.emergency.data.push(tmp);
|
||||
|
||||
}
|
||||
|
||||
// {3} Add notification count if not already on page //
|
||||
if( router.app.$route.path != '/emergency' )
|
||||
gstore.data.notif.emergency.count += Object.keys(msg.add).length;
|
||||
|
||||
}
|
||||
|
||||
/* (4) If message(s) to del */
|
||||
if( msg.del != null ){
|
||||
|
||||
// {1} Rem messages from stack //
|
||||
for( var id in gstore.data.notif.emergency.data )
|
||||
if( msg.del[ gstore.data.notif.emergency.data[id].id ] != null )
|
||||
gstore.data.notif.emergency.data[id].message = 'L\'auteur n\'a pas assumé ce message.. Honte à lui !';
|
||||
|
||||
}
|
||||
|
||||
/* (5) If message(s) to update */
|
||||
if( msg.upd != null ){
|
||||
|
||||
// {1} Update messages in stack //
|
||||
for( var id in gstore.data.notif.emergency.data )
|
||||
if( msg.upd[ gstore.data.notif.emergency.data[id].id ] != null )
|
||||
gstore.data.notif.emergency.data[id].message = msg.upd[ gstore.data.notif.emergency.data[id].id ].message;
|
||||
|
||||
}
|
||||
|
||||
/* (6) Remove loader */
|
||||
gstore.data.msg_pending.emergency = false;
|
||||
|
||||
}).send({name: _SERVER.session.name});
|
||||
|
||||
|
||||
|
||||
/* (2) Event channel
|
||||
---------------------------------------------------------*/
|
||||
window.wsc_event = wsc.channel('event/31').listen(function(msg, err){
|
||||
|
||||
/* (1) Manage error */
|
||||
if( msg == null && err != null )
|
||||
return infobox.show('Erreur de connexion WebSocket@event ('+err+')', 'error', 3000);
|
||||
|
||||
/* (2) Manage wsclient error */
|
||||
if( typeof msg.error != 'boolean' || msg.error !== false )
|
||||
return infobox.show('Erreur de connexion WebSocket@event', 'warning', 3000);
|
||||
|
||||
/* (3) If message(s) to add */
|
||||
if( msg.add != null ){
|
||||
|
||||
// {1} Play sound if 1msg received + not already on page //
|
||||
// note: 1msg means a new message but not the page load past buffer
|
||||
if( msg.add.length == 1 && router.app.$route.path != '/event' )
|
||||
( new Audio('https://notificationsounds.com/message-tones/communication-channel-519/download/mp3') ).play();
|
||||
|
||||
// {2} Add messages to stack //
|
||||
for( var id in msg.add ){
|
||||
|
||||
var tmp = msg.add[id]; // add id to data
|
||||
tmp.id = id;
|
||||
|
||||
gstore.data.notif.event.data.push(tmp);
|
||||
|
||||
}
|
||||
|
||||
// {3} Add notification count if not already on page //
|
||||
if( router.app.$route.path != '/event' )
|
||||
gstore.data.notif.event.count += Object.keys(msg.add).length;
|
||||
|
||||
}
|
||||
|
||||
/* (4) If message(s) to del */
|
||||
if( msg.del != null ){
|
||||
|
||||
// {1} Rem messages from stack //
|
||||
for( var id in gstore.data.notif.event.data )
|
||||
if( msg.del[ gstore.data.notif.event.data[id].id ] != null )
|
||||
gstore.data.notif.event.data[id].message = 'L\'auteur n\'a pas assumé ce message.. Honte à lui !';
|
||||
|
||||
}
|
||||
|
||||
/* (5) If message(s) to update */
|
||||
if( msg.upd != null ){
|
||||
|
||||
// {1} Update messages in stack //
|
||||
for( var id in gstore.data.notif.event.data )
|
||||
if( msg.upd[ gstore.data.notif.event.data[id].id ] != null )
|
||||
gstore.data.notif.event.data[id].message = msg.upd[ gstore.data.notif.event.data[id].id ].message;
|
||||
|
||||
}
|
||||
|
||||
/* (6) Remove loader */
|
||||
gstore.data.msg_pending.event = false;
|
||||
|
||||
|
||||
}).send({name: _SERVER.session.name});
|
||||
|
||||
|
||||
|
||||
/* (3) Message channel
|
||||
---------------------------------------------------------*/
|
||||
window.wsc_chat = wsc.channel('chat').listen(function(msg, err){
|
||||
|
||||
/* (1) Manage error */
|
||||
if( msg == null && err != null )
|
||||
return infobox.show('Erreur de connexion WebSocket@chat ('+err+')', 'error', 3000);
|
||||
|
||||
/* (2) Manage wsclient error */
|
||||
if( typeof msg.error != 'boolean' || msg.error !== false )
|
||||
return infobox.show('Erreur de connexion WebSocket@chat', 'warning', 3000);
|
||||
|
||||
/* (3) If no message -> exit */
|
||||
if( msg.msg == null )
|
||||
return;
|
||||
|
||||
/* (4) Play sound if 1msg received + not already on page */
|
||||
// note: 1msg means a new message but not the page load past buffer
|
||||
if( msg.msg.length == 1 && router.app.$route.path != '/inbox' )
|
||||
( new Audio('https://notificationsounds.com/message-tones/communication-channel-519/download/mp3') ).play();
|
||||
|
||||
/* (5) Add messages to stack */
|
||||
gstore.data.notif.inbox.data = gstore.data.notif.inbox.data.concat( msg.msg );
|
||||
|
||||
/* (6) Add notification count if not already on page */
|
||||
if( router.app.$route.path != '/inbox' )
|
||||
gstore.data.notif.inbox.count += msg.msg.length;
|
||||
|
||||
/* (7) Remove loader */
|
||||
gstore.data.msg_pending.inbox = false;
|
||||
|
||||
|
||||
}).send({name: _SERVER.session.name});
|
|
@ -6,7 +6,7 @@ module.exports = {
|
|||
output: {
|
||||
path: path.resolve(__dirname, './public_html/js'),
|
||||
publicPath: '/js/',
|
||||
filename: 'bundle.js'
|
||||
filename: 'bundle@[hash].js'
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
|
|