modifications mineures

This commit is contained in:
xdrm-brackets 2015-12-03 09:51:40 +01:00
commit ee160a9f74
14 changed files with 1118 additions and 9 deletions

41
Dashboard.php Executable file
View File

@ -0,0 +1,41 @@
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
<title>Tableau de bord</title>
<meta charset='utf-8'/>
<meta name='description' value='Site de test'/>
<meta name='author' value='{xdrm} & SeekDaSky'/>
<link rel='stylesheet' href='css/global.css'/>
</head>
<body>
<!-- WRAPPER DE LA PAGE -->
<div id='WRAPPER'>
<!-- MENU DE LA PAGE -->
<nav id='MENU'>
<div id='ICON'></div>
<a id='dashboard'>Tableau de bord</a>
<a id='consultations'>Nouvelle consultation</a>
<a>Médecins</a>
</nav>
<!-- CONTAINER DE LA PAGE -->
<section id='CONTAINER'>
<!-- FIL D'ARIANE -->
<div id='BREADCRUMB'><a href='Dashboard.php'>Accueil</a> <a href='Test1.php'>Test1</a> <a href='test2.php'>test2</a> </div>
</section>
</div>
</body>
</html>

84
Docs/BDD.sql Normal file
View File

@ -0,0 +1,84 @@
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema projetphp
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema projetphp
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `projetphp` DEFAULT CHARACTER SET utf8 ;
USE `projetphp` ;
-- -----------------------------------------------------
-- Table `projetphp`.`Medecin`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projetphp`.`Medecin` (
`id` INT NOT NULL AUTO_INCREMENT,
`Civilite` CHAR(1) NOT NULL,
`Prenom` VARCHAR(45) NOT NULL,
`Nom` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `id_UNIQUE` (`id` ASC))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `projetphp`.`Patient`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projetphp`.`Patient` (
`Civilite` CHAR(1) NOT NULL,
`Nom` VARCHAR(45) CHARACTER SET 'big5' NOT NULL,
`Prenom` VARCHAR(45) NOT NULL,
`Adresse` VARCHAR(100) NOT NULL,
`Ville` VARCHAR(50) NOT NULL,
`CodePostal` SMALLINT(4) NOT NULL,
`DateNaissance` DATE NOT NULL,
`LieuNaissance` VARCHAR(50) NOT NULL,
`NumSecuriteSociale` INT(15) NOT NULL,
`Id` INT NOT NULL AUTO_INCREMENT,
`MedecinTraitant` INT NULL,
UNIQUE INDEX `NumSecuriteSociale_UNIQUE` (`NumSecuriteSociale` ASC),
PRIMARY KEY (`Id`),
UNIQUE INDEX `Id_UNIQUE` (`Id` ASC),
INDEX `fk_Patient_Medecin_idx` (`MedecinTraitant` ASC),
CONSTRAINT `fk_Patient_Medecin`
FOREIGN KEY (`MedecinTraitant`)
REFERENCES `projetphp`.`Medecin` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `projetphp`.`RDV`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projetphp`.`RDV` (
`id` INT NOT NULL,
`DateRDV` TIMESTAMP NULL,
`Duree` TIME NULL,
`Patient_Id` INT NOT NULL,
`Medecin_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_RDV_Patient1_idx` (`Patient_Id` ASC),
INDEX `fk_RDV_Medecin1_idx` (`Medecin_id` ASC),
CONSTRAINT `fk_RDV_Patient1`
FOREIGN KEY (`Patient_Id`)
REFERENCES `projetphp`.`Patient` (`Id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_RDV_Medecin1`
FOREIGN KEY (`Medecin_id`)
REFERENCES `projetphp`.`Medecin` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

BIN
Docs/Model.mwb Normal file

Binary file not shown.

View File

@ -4,18 +4,27 @@
* fonction d'autoloading : prend en paramètre le nom de la classe et s'occupe d'inclure les fichiers correspondant aux classes
*/
//pour l'inclusion dans le dossier src
$GLOBALS['managers_dir'] = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';
function autoloader($class) {
//si on charge le StaticRepo
if(strpos($class, 'StaticRepo') !== FALSE){
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'repositories'.DIRECTORY_SEPARATOR.$class . '.php';
}
//si on charge un Repo
elseif(strpos($class, 'Repo') !== FALSE){
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'repositories'.DIRECTORY_SEPARATOR.'repos'.DIRECTORY_SEPARATOR.$class . '.php';
//si on charge le StaticRepo
if(strpos($class, 'StaticRepo') !== FALSE){
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'repositories'.DIRECTORY_SEPARATOR.$class . '.php';
}
//si on charge un Repo
elseif(strpos($class, 'Repo') !== FALSE){
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'repositories'.DIRECTORY_SEPARATOR.'repos'.DIRECTORY_SEPARATOR.$class . '.php';
//cas particuliers pas identifiable par nom de classe
}
//cas particuliers pas identifiable par nom de classe
}else{
//si on charge un manager
if(is_file(dirname(__FILE__).DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR.$class . '.php')){
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'src'.DIRECTORY_SEPARATOR.$class . '.php';
}
}
}
//enregistrememnt de la fonction tout en bas de la pile pour ne pas casser l'autoloader de phpUnit

185
css/global.css Executable file
View File

@ -0,0 +1,185 @@
*{ margin: 0; padding: 0; }
a{
/* remove-a default properties */
text-decoration: none;
color: inherit;
}
body{
/* position */
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* background */
background-color: #e8e8e8;
/* foreground */
font-size: 14px;
font-family: 'Open Sans', 'sans serif';
color: #000;
}
/* WRAPPER DE LA PAGE */
#WRAPPER{
/* position */
display: block;
position: absolute;
top: 1em;
left: calc( 50% - 512px - 1em );
width: 1024px;
min-height: 50%;
margin: 2em;
/* border */
border: 1px solid #e2e2e2;
box-shadow: 0 0 5px #e2e2e2;
/* background */
background-color: #fff;
}
/* MENU DE LA PAGE */
#WRAPPER > #MENU{
/* position */
display: block;
position: absolute;
top: 0;
left: 0;
width: 225px;
height: 100%;
/* border */
border-right: 1px solid #e2e2e2;
border-bottom: 1px solid #e2e2e2;
/* background */
background-color: #fafafa;
}
/* LOGO DANS LE MENU */
#WRAPPER > #MENU > #ICON{
/* position */
position: relative;
width: 100%;
height: 100px;
/* background */
background-color: red;
}
/* LES LIENS DU MENU */
#WRAPPER > #MENU > a{
/* position */
display: inline-block;
position: relative;
width: calc( 100% - 3em );
padding-left: 3em;
padding-bottom: 1px;
/* background */
background-color: transparent;
/* foreground */
line-height: 2.5em;
/* extra */
cursor: pointer;
}
/* :hover / .active */
#WRAPPER > #MENU > a:hover,
#WRAPPER > #MENU > a.active{
background-color: #efefef !important;
color: #818181;
}
/* @first/@last */
#WRAPPER > #MENU > a:nth-child(2){ margin-top: 1em; }
#WRAPPER > #MENU > a:last-child{ margin-bottom: 1em; }
/* icones associées aux liens */
#WRAPPER > #MENU > a#consultations{
background: url(../src/consultation.svg) left 1em center no-repeat;
background-size: auto 1.5em;
}
#WRAPPER > #MENU > a#doctor{
background: url(../src/doctor.svg) left 1em center no-repeat;
background-size: auto 1.5em;
}
#WRAPPER > #MENU > a#dashboard{
background: url(../src/dashboard.svg) left 1em center no-repeat;
background-size: auto 1.5em;
}
/*************/
/* CONTAINER */
/*************/
#WRAPPER > #CONTAINER{
/* position */
display: block;
position: absolute;
top: 0;
left: 225px;
width: calc( 100% - 225px );
height: 100%;
}
/* FIL D'ARIANE */
#WRAPPER > #CONTAINER > #BREADCRUMB{
/* position */
display: inline-block;
position: relative;
width: calc( 100% - 2*2em - 2*.6em );
margin: 2em;
padding: .6em;
/* background */
background-color: #eee;
/* foreground */
color: #333;
}
#WRAPPER > #CONTAINER > #BREADCRUMB a:hover{
text-decoration: underline;
}
/* chevrons */
#WRAPPER > #CONTAINER > #BREADCRUMB a:before{
content: '';
/* position */
display: inline-block;
position: relative;
width: 1em;
height: .7em;
background: url(../src/right-arrow.svg) center center no-repeat;
background-size: 40% auto;
}
/* premier: maison au lien de chevron */
#WRAPPER > #CONTAINER > #BREADCRUMB a:first-child:before{
margin-right: 1em;
height: 1em;
background-image: url(../src/home.svg);
background-size: auto 100%;
}

128
css/login.css Executable file
View File

@ -0,0 +1,128 @@
/*******************************/
/*** RECTIFICATIONS GLOBALES ***/
/*******************************/
*{ margin: 0; padding: 0; }
body{
/* position */
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
/* background */
background-color: #233342;
/* foreground */
font: 16px 'Open Sans';
color: #fff;
}
/*******************/
/*** FORMULAIRES ***/
/*******************/
form{
/* position */
display: block;
position: absolute;
left: calc( 50% - 20em/2 );
width: 20em;
height: auto;
margin: 2em;
padding: 2em;
/* border */
border-radius: 5px;
box-shadow: inset 0 0 10px #0a0f14;
/* background */
background-color: #151f28;
}
/************************/
/*** CHAMPS DE SAISIE ***/
/************************/
input{
/* position */
display: inline-block;
padding: 1em 2em;
margin: 1em;
width: calc( 100% - 2*2em - 5px - 2*1em );
/* border */
border-radius: 3px 0 0 3px;
border: 0;
border-right: 5px solid #aaa;
/* background */
background-color: #ddd;
/* animation */
transition: all .2s ease-in-out;
-moz-transition: all .2s ease-in-out;
-webkit-transition: all .2s ease-in-out;
-ms-transition: all .2s ease-in-out;
-o-transition: all .2s ease-in-out;
}
/* @hover */
input:focus { background-color: #fff; }
input:nth-child(4n+0):focus{ border-right-color: #f45b2a; }
input:nth-child(4n+1):focus{ border-right-color: #1b84db; }
input:nth-child(4n+2):focus{ border-right-color: #f4b92a; }
input:nth-child(4n+3):focus{ border-right-color: #b62af4; }
/*****************************/
/*** BOUTONS DE VALIDATION ***/
/*****************************/
input[type=submit],
input[type=button]{
/* position */
width: auto;
float: right;
/* foreground */
font-weight: bold;
}
input[type=submit]:hover,
input[type=button]:hover{
/* border */
border-right-color: #1b84db;
/* background */
background-color: #fff;
/* foreground */
color: #1b84db;
/* extra */
cursor: pointer;
}
/****************/
/*** MESSAGES ***/
/****************/
.error{
font-size: .8em;
padding: 1em 1em;
color: #f14973;
text-shadow: 1px 1px 0 #000;
}
.success{
font-size: .8em;
padding: 1em 1em;
color: #49f16b;
text-shadow: 1px 1px 0 #000;
}

65
index.php Executable file
View File

@ -0,0 +1,65 @@
<!DOCTYPE html>
<?php
/*
petite explication : on démarre le systeme de session de php, on inclu notre authentification
, on appelle la fonction que vérifie le login et role de l'utilisateur (voir source pour la doc)
si l'utilisateur est logué, on le redirige vers la page d'accueil de l'outil
*/
session_start();
require('autoloader.php');
if(isset($_POST['co'])){
$Auth = new Authentification();
$Auth->authentification($_POST['username'],$_POST['password']);
}
if(Authentification::checkUser(0)){
header("Location: http://".$_SERVER['HTTP_HOST']."/Dashboard.php");
die();
};
?>
<html>
<head>
<title>Tests php</title>
<meta charset='utf-8'/>
<meta name='description' value='Site de test'/>
<meta name='author' value='{xdrm} & SeekDaSky'/>
<link rel='stylesheet' href='globalstylesheet.css'/>
</head>
<body>
<?php /* [1] AFFICHAGE DIFFÉRÉ SI CONNECTÉ
==============================================*/
echo "<form action='#auth' method='POST'>";
/* AFFICHAGE D'ERREURS */
if( $postVariablesAreSet ){ // si formulaire soumis
if( !$postVariablesNEmpty )
echo '<span class=error>Certains champs requis sont vides.</span>';
elseif( !$usernameCheck )
echo '<span class=error>Nom d\'utilisateur incorrect. (3 car. min)</span>';
elseif( !$mailCheck )
echo '<span class=error>Adresse mail incorrecte.</span>';
elseif( !$passwordCheck )
echo '<span class=error>Mot de passe incorrect. (8 car. min)</span>';
elseif( connected($user) )
echo '<span class=success>Vous êtes connectés.</span>';
}
echo "<input type='text' name='username' placeholder='username'>";
echo "<input type='password' name='password' placeholder='password'>";
echo "<input type='submit' name='co' value='Me connecter'>";
echo "</form>";
?>
</body>
</html>

87
src/Authentification.php Executable file
View File

@ -0,0 +1,87 @@
<?php
class Authentification{
private $users;
public function __construct(){
$this->users = json_decode(file_get_contents($GLOBALS['managers_dir'].DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'users.json'),true);
}
/**
* méthode d'authentification, utilise param['identifiant'] et param['mdp'] et les comparent à
* nos utilisateurs enregistrés puis créer une session securisée par token
* @param array $param contiens les infomations de connection
* @return json json contenant le résultat de l'authentification (true si authentification correcte, sinon non)
*/
public function authentification($user,$mdp){
foreach($this->users as $utilisateur=>$infos){
if($utilisateur == $user and $infos['password'] == $mdp){
$this->createSecureSession($user,$infos['role']);
return true;
}
}
return false;
}
/**
* déconnecte l'utilisateur en détruisant la session et le cookie
* @return json renvoie true, il n'y aucune raison que ça foire
*/
public function deconnection(){
$this->destroySecureSession();
Response::quickResponse(200,json_encode(['result' => true]));
}
/**
* créer une session sécurisé , protégé du vol de session par identification de l'utilisateur par navigateur/ip/cookie
* @param String $user nom d'utilisateur
* @param String $role role de l'utilisateur (0=administrateur, 1= prof, 2=scolarité,3=élève)
* @return void
*/
private function createSecureSession($user,$role){
$id = uniqid();
$_SESSION['id'] = $id;
$_SESSION['token'] = sha1($_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR'].$id);
setcookie('UserId',$id,time()+10*60,'/');
$_SESSION['user'] = $user;
$_SESSION['role'] = $role;
}
/**
* Détruit une session
* @return void
*/
private function destroySecureSession(){
session_destroy();
setcookie('token',time()-1);
}
/**
* Vérifie qu'un utilisateur donné a les droits demandés (passés en paramètres)
* @param int $role role minimum
* @param boolean $strict si strict vaut true, seul les utilisateurs avec le role précis seront acceptés, sinon tout les utilisateurs
* avec un role superieur le seront
* @return boolean
*/
public static function checkUser($role, $strict=false){
if(isset($_SESSION['token'])){
foreach($_SESSION['role'] as $roleUser){
if(($strict and $roleUser == $role) or (!$strict and $roleUser<= $role)){
if($_SESSION['token'] == sha1($_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR'].$_SESSION['id'])){
setcookie('UserId',$_COOKIE['UserId'],time()+10*60,'/');
return true;
};
}
}
}
return false;
}
public static function getCurrentUser(){
return $_SESSION['user'];
}
}
?>

202
src/Response.php Normal file
View File

@ -0,0 +1,202 @@
<?php
/*
* La classe Response permet de gérer la réponse envoyée au client (status, contenu, type, encodage)
* son utilitée principale est de pouvoir d'envoyer un pseudo-flux de donnée au client et permettre ainsi de suivre le déroulement
* d'une opération côté serveur par exemple. Son second aventage est qu'une fois la réponse envoyée et féermée, le script PHP peut continuer de s'executer
* permettant ainsi une sensation de vitesse au niveau du client (inutile d'attendre la fin des insertions en base de donnée pour avoir la réponse par exemple)
*/
class Response{
private $status;
private $headers = [];
private $config = [];
private $response = "";
private $Messages = array(
//Informational 1xx
100 => '100 Continue',
101 => '101 Switching Protocols',
//Successful 2xx
200 => '200 OK',
201 => '201 Created',
202 => '202 Accepted',
203 => '203 Non-Authoritative Information',
204 => '204 No Content',
205 => '205 Reset Content',
206 => '206 Partial Content',
226 => '226 IM Used',
//Redirection 3xx
300 => '300 Multiple Choices',
301 => '301 Moved Permanently',
302 => '302 Found',
303 => '303 See Other',
304 => '304 Not Modified',
305 => '305 Use Proxy',
306 => '306 (Unused)',
307 => '307 Temporary Redirect',
//Client Error 4xx
400 => '400 Bad Request',
401 => '401 Unauthorized',
402 => '402 Payment Required',
403 => '403 Forbidden',
404 => '404 Not Found',
405 => '405 Method Not Allowed',
406 => '406 Not Acceptable',
407 => '407 Proxy Authentication Required',
408 => '408 Request Timeout',
409 => '409 Conflict',
410 => '410 Gone',
411 => '411 Length Required',
412 => '412 Precondition Failed',
413 => '413 Request Entity Too Large',
414 => '414 Request-URI Too Long',
415 => '415 Unsupported Media Type',
416 => '416 Requested Range Not Satisfiable',
417 => '417 Expectation Failed',
418 => '418 I\'m a teapot',
422 => '422 Unprocessable Entity',
423 => '423 Locked',
426 => '426 Upgrade Required',
428 => '428 Precondition Required',
429 => '429 Too Many Requests',
431 => '431 Request Header Fields Too Large',
//Server Error 5xx
500 => '500 Internal Server Error',
501 => '501 Not Implemented',
502 => '502 Bad Gateway',
503 => '503 Service Unavailable',
504 => '504 Gateway Timeout',
505 => '505 HTTP Version Not Supported',
506 => '506 Variant Also Negotiates',
510 => '510 Not Extended',
511 => '511 Network Authentication Required'
);
/**
* Constructeur de la Response
* @param int $status status HTTP de la réponse (404,200,500, etc)
* @param bool|false $stream Si la réponse est un stream (avtive/désactive les méthodes send/stream()
* @param string $type type HTTP des données de retour
* @param bool|true $clearBuffer si activé, vide le buffer avant chaque envoi de donnée (a pour effet de ne pas afficher les echo/printf)
*/
public function __construct($status = 200,$stream = false,$type = 'application/json', $clearBuffer = false)
{
$this->status = $status;
array_push($this->headers,['Content-Type',$type]);
$this->config['clearBuffer'] = $clearBuffer;
$this->config['stream'] = $stream;
}
/** Ajoute du contenu a la réponse qui sera envoyé (par stream() ou par send() )
* @param $content contenu a ajouter a la réponse
*/
public function write($content){
$this->response .= $content;
}
/** Envoie une partie de réponse au client (doit être récupéré en ajax, aucun intéret sinon), chaque bloc de donéne envoyé est séparé par
* un délimiteur ("//Block//" par défaut).ATTENTION: stream() vide la réponse (si on write() puis stream(), la réponse qu'il restera dans l'objet sera vide)
* @param string $content contenu a envoyer (optionnel car on peut utiliser la méthode write pour le faire)
* @throws Exception si la réponse n'est pas un stream
*/
public function stream($content="",$delimiter = "//Block//"){
//vérification que la réponse est un stream
if(!$this->config['stream']){
throw new Exception("Stream d'une réponse synchrone");
}
//si les headers ne sont pas encore envoyés, on le fait
if(!headers_sent()){
$this->sendHeader();
}
//si demandé, on clear le buffer avant d'envoyer
if($this->config['clearBuffer']){
ob_end_clean();
if($GLOBALS['compression']){
ob_start("ob_gzhandler");
}else{
ob_start();
}
}
//on envoi le contenu de response et la variable content
if($this->response!=""){
echo $delimiter.$this->response;
}if($content != ""){
echo $delimiter.$content;
}
ob_flush();flush();
$this->response = '';
}
/**
* Envoi les headers de la réponse (status et ceux potentiellement défnini par l'utilisateur)
*/
public function sendHeader(){
//envoie le status de la requete (petit trick suivant l'architecture de PHP)
if (strpos(PHP_SAPI, 'cgi') === 0) {
header(sprintf('Status: %s', $this->Messages[$this->status]));
} else {
header(sprintf('HTTP/1.1 %s', $this->Messages[$this->status]));
}
//les autres headers
foreach($this->headers as $header){
header(sprintf('%s: %s',$header[0],$header[1]));
}
}
/**
* Défini un header qui sera envoyé
* @param $header Nom du header
* @param $value Valeur du header
*/
public function setHeader($header,$value){
array_push($this->headers,[$header,$value]);
}
/** Envoi la réponse et ferme la communication
* @throws Exception si la réponse est un stream
*/
public function send(){
//vérification que la réponse n'est pas un stream
if($this->config['stream']){
throw new Exception("Envoi synchrone d'une réponse stream");
}
//si les headers ne sont pas encore envoyés, on le fait
if(!headers_sent()){
$this->sendHeader();
}
//si demandé, on clear le buffer avant d'envoyer
if($this->config['clearBuffer']){
ob_end_clean();
if($GLOBALS['compression']){
ob_start("ob_gzhandler");
}else{
ob_start();
}
}
//envoi de la réponse
echo $this->response;
//fermeture de la communication
header('Connection: close');
header('Content-Length: '.ob_get_length());
ob_end_flush();
ob_flush();
flush();
//permet au reste du script de s'executer même si la réponse a été envoyé et que l'utilisateur interromp le script (changement de page, etc...)
ignore_user_abort(true);
}
/**
* @param int $status status HTTP de la réponse (404,200,500, etc)
* @param $content
* @param string $type
*/
public static function quickResponse($status,$content,$type = 'application/json'){
$response = new Response($status,false,$type);
$response->write($content);
$response->send();
}
}

6
src/config/users.json Executable file
View File

@ -0,0 +1,6 @@
{
"secretaire": {
"password":"thecakeisalie",
"role":[0]
}
}

84
src/consultation.svg Executable file
View File

@ -0,0 +1,84 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Nouveau document 1">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="-28.667829"
inkscape:cy="386.34941"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-page="true"
inkscape:window-width="1920"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1" />
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-114.28125,-307.375)">
<g
id="g3272"
transform="matrix(0.99258024,0,0,0.99258024,0.84793854,0.43583907)">
<path
inkscape:connector-curvature="0"
id="path3212"
d="m 226.78125,582.375 c -35.23822,0 -66.68483,16.20229 -87.3125,41.5625 L 325.3125,749.21875 c 8.90501,-16.1099 13.96875,-34.63376 13.96875,-54.34375 0,-62.13204 -50.36797,-112.5 -112.5,-112.5 z m -98.5,58.15625 c -8.90639,16.11083 -14,34.63212 -14,54.34375 0,62.13203 50.36796,112.5 112.5,112.5 35.23562,0 66.68475,-16.20551 87.3125,-41.5625 L 128.28125,640.53125 z"
style="fill:#f7a93b;fill-opacity:1;stroke:none" />
<g
transform="matrix(0.90377336,0.42801134,-0.42801134,0.90377336,-245.92875,-350.08603)"
id="g3268">
<path
inkscape:connector-curvature="0"
style="fill:#f04b36;fill-opacity:1;stroke:none"
d="m 782.84375,377.28125 c -61.94433,-0.35946 -112.10929,49.24317 -112.46875,111.1875 -0.35946,61.94433 49.21192,112.07804 111.15625,112.4375 l 127.59375,0.75 0,-223.625 -126.28125,-0.75 z"
id="path3266" />
<path
inkscape:connector-curvature="0"
style="fill:#cfd0d1;fill-opacity:1;stroke:none"
d="m 934.375,378.15625 0,223.65625 129.5,0.75 c 61.9444,0.35946 112.1093,-49.21192 112.4688,-111.15625 0.3594,-61.94433 -49.2432,-112.10929 -111.1876,-112.46875 L 934.375,378.15625 z"
id="rect3235" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

146
src/dashboard.svg Executable file
View File

@ -0,0 +1,146 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="127.99999"
height="127.99999"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="dashboard.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.959798"
inkscape:cx="-16.221622"
inkscape:cy="69.562511"
inkscape:document-units="px"
inkscape:current-layer="g3363"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
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
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-923.62577,-394.41087)">
<g
id="g3363"
transform="matrix(1.0096696,0,0,1.0096696,-8.9311221,-5.0515213)">
<path
style="fill:#e04f5f;fill-opacity:1;stroke:none"
d="M 64 0 C 28.653772 0 0 28.653795 0 64 C 0 99.346228 28.653772 128 64 128 C 99.346228 128 128 99.346228 128 64 C 128 28.653795 99.346228 0 64 0 z M 64 14.28125 C 91.465893 14.28125 113.71875 36.534125 113.71875 64 C 113.71875 91.465893 91.465893 113.71875 64 113.71875 C 36.534107 113.71875 14.28125 91.465893 14.28125 64 C 14.28125 36.534125 36.534107 14.28125 64 14.28125 z "
transform="matrix(0.99042301,0,0,0.99042301,923.6258,395.63674)"
id="path3273" />
<g
id="g3082"
transform="matrix(1.3608093,0,0,1.3608093,-356.12442,-166.23032)">
<rect
style="fill:#afb5b6;fill-opacity:1;stroke:none"
id="rect3275"
width="2.3359859"
height="9.1545153"
x="985.84497"
y="479.85825" />
<g
id="g3335"
transform="translate(-100,0)">
<path
id="path3333"
d="m 1087,431.03125 c -4.5419,0 -8.8204,1.10262 -12.625,3 l 5.9688,12.28125 c 1.9914,-1.05672 4.2421,-1.6875 6.6562,-1.6875 7.95,0 14.4065,6.4563 14.4062,14.40625 0,0.13763 -0.027,0.26954 -0.031,0.40625 l 14.0625,0 c 0,-15.69071 -12.7468,-28.40625 -28.4375,-28.40625 z"
style="fill:#facb1b;fill-opacity:1;stroke:none"
inkscape:connector-curvature="0" />
<path
id="path3311"
d="m 1073.25,434.625 c -0.1431,0.0795 -0.2959,0.13687 -0.4375,0.21875 -8.4925,4.91058 -14.2187,14.07648 -14.2187,24.59375 l 14.0624,0 c 0,-0.13671 -0.031,-0.26862 -0.031,-0.40625 0,-5.0704 2.6362,-9.49668 6.5938,-12.0625 L 1073.25,434.625 z"
style="fill:#fa5655;fill-opacity:1;stroke:none"
inkscape:connector-curvature="0" />
</g>
<g
id="g3343"
transform="translate(140,0)">
<path
transform="translate(0.49107143,-0.80357143)"
d="m 852.00894,459.72824 c 0,2.78608 -2.25857,5.04464 -5.04465,5.04464 -2.78607,0 -5.04464,-2.25856 -5.04464,-5.04464 0,-2.78608 2.25857,-5.04464 5.04464,-5.04464 2.78608,0 5.04465,2.25856 5.04465,5.04464 z"
sodipodi:ry="5.0446429"
sodipodi:rx="5.0446429"
sodipodi:cy="459.72824"
sodipodi:cx="846.96429"
id="path3339"
style="fill:#3e3e3f;fill-opacity:1;stroke:none"
sodipodi:type="arc" />
<path
inkscape:connector-curvature="0"
id="path3341"
d="m 843.96061,455.29731 15.99475,-13.29227 -7.87787,18.95473 z"
style="fill:#3e3e3f;fill-opacity:1;stroke:none"
sodipodi:nodetypes="cccc" />
</g>
<rect
y="1039.9066"
x="375.2605"
height="9.1545153"
width="2.3359859"
id="rect3347"
style="fill:#afb5b6;fill-opacity:1;stroke:none"
transform="matrix(0.71343865,-0.7007177,0.7007177,0.71343865,0,0)" />
<rect
transform="matrix(0.00899507,-0.99995954,0.99995954,0.00899507,0,0)"
style="fill:#afb5b6;fill-opacity:1;stroke:none"
id="rect3349"
width="2.3359859"
height="9.1545153"
x="-460.62106"
y="1006.1044" />
<rect
transform="matrix(-0.71343865,-0.7007177,-0.7007177,0.71343865,0,0)"
style="fill:#afb5b6;fill-opacity:1;stroke:none"
id="rect3359"
width="2.3359859"
height="9.1545153"
x="-1032.8519"
y="-343.09863" />
<rect
y="-967.51373"
x="-478.37454"
height="9.1545153"
width="2.3359859"
id="rect3361"
style="fill:#afb5b6;fill-opacity:1;stroke:none"
transform="matrix(-0.00899507,-0.99995954,-0.99995954,0.00899507,0,0)" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

1
src/home.svg Executable file
View File

@ -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 0 32 32" height="32px" id="Layer_1" version="1.1" viewBox="0 0 32 32" width="32px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><polygon fill="#D0D3D6" points="16,31 28,31 28,15 16,5.7 "/><polygon fill="#EEEDED" points="16,31 4,31 4,15 16,5.7 "/><rect fill="#B6312E" height="8" width="8" x="12" y="20"/><path d="M16,6.4l13.5,9.9l2.5-3.3L16,1" fill="#B6312E"/><path d="M16,1L0,13.1l2.5,3.3L16,6.4" fill="#DF4937"/></g></svg>

After

Width:  |  Height:  |  Size: 634 B

71
src/right-arrow.svg Executable file
View File

@ -0,0 +1,71 @@
<?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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="40.608002"
height="70.991997"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="Nouveau document 1">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="-21.876364"
inkscape:cy="-22.977195"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1056"
inkscape:window-x="0"
inkscape:window-y="24"
inkscape:window-maximized="1"
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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(79.704273,-522.0936)">
<text
xml:space="preserve"
style="font-size:144px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#666666;fill-opacity:1;stroke:none;font-family:Latin Modern Mono Light Cond;-inkscape-font-specification:Latin Modern Mono Light Cond"
x="-84.600273"
y="601.5816"
id="text3146"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3148"
x="-84.600273"
y="601.5816">&gt;</tspan></text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB