diff --git a/config.php b/config.php index 946c3a8..35ff744 100644 --- a/config.php +++ b/config.php @@ -39,6 +39,7 @@ // Local timezone. Default one is "Europe/Paris". #$config->timezone = "Europe/Paris"; +setlocale(LC_TIME, 'fr_FR.utf8','fra'); // If you want to inject a tracking code (or anything really) in your pages , use this to refer to a file containing that: #$config->tracking_code_include = '/path/to/something.html'; diff --git a/inc/loc/default.ini b/inc/loc/default.ini index 8a57bb6..3d07966 100644 --- a/inc/loc/default.ini +++ b/inc/loc/default.ini @@ -27,6 +27,7 @@ numcomments = "Number of comments in Admin Stats" numcomm = "Comments" sens = "Max number of images displayed when hovering an album" thumbs_size = "Thumbnails size (px)" +album_coverfilename = "Album cover filename" images = "Images" language = "Language" user_theme = "Theme" @@ -139,6 +140,7 @@ new = "New Folder" create = "Create" upload_heading = "Upload" upload = "Upload images here" +cover = "Set as album cover" [boardheader] download = "DOWNLOAD" diff --git a/inc/loc/francais.ini b/inc/loc/francais.ini index 78995c8..1e3a03f 100644 --- a/inc/loc/francais.ini +++ b/inc/loc/francais.ini @@ -26,6 +26,7 @@ numcomments = "Nombre de commentaires sur la page de stats" numcomm = "Comms" sens = "Nombre maximal d'images affichées au survol d'album" thumbs_size = "Taille des miniatures (px)" +album_coverfilename = "Miniatures des albums" images = "Images" language = "Langue" user_theme = "Thème" @@ -134,6 +135,7 @@ new = "Nouveau dossier" create = "Créer" upload_heading = "Ajout" upload = "Ajouter des images" +cover = "Définir comme miniature de l'album" [boardheader] download = "TÉLÉCHARGER" diff --git a/inc/ui.js b/inc/ui.js index 71e4b14..4fe762d 100644 --- a/inc/ui.js +++ b/inc/ui.js @@ -11,4 +11,6 @@ $(this).parent().children(".button-hidden").toggleClass("hidden"); }); - + $('#menu').animate({ + scrollTop: ($('li.menu_title ul.selected').offset().top-$(window).height()/2) + }, 500); \ No newline at end of file diff --git a/src/classes/Account.php b/src/classes/Account.php index b424ef6..c321024 100644 --- a/src/classes/Account.php +++ b/src/classes/Account.php @@ -111,14 +111,15 @@ public function __construct($login=NULL,$key=NULL){ //throw new Exception("Login $login not found"); return false; } - - /** - * Creates a new account in the base - * - * @param string $login - * @param string $password - * @author Thibaud Rohmer - */ + + /** + * Creates a new account in the base + * + * @param string $login + * @param string $password + * @author Thibaud Rohmer + * @return bool + */ public static function create($login, $password, $verif, $groups=array(),$name='',$email=''){ // Check if login already exists @@ -162,7 +163,7 @@ public static function create($login, $password, $verif, $groups=array(),$name=' * Encrypt password * * @param string $password - * @return void + * @return string * @author Thibaud Rohmer */ public static function password($password){ @@ -172,7 +173,7 @@ public static function password($password){ /** * Generate key * - * @return void + * @return string * @author Thibaud Rohmer */ private function key(){ @@ -265,24 +266,30 @@ public function save(){ $xml->asXML($xml_infos); } - /** - * Edit an account - * - * @param string $login - * @param string $old_password - * @param string $password - * @param string $name - * @param string $email - * @author Thibaud Rohmer - */ + /** + * Edit an account + * + * @param string $login + * @param string $old_password + * @param string $password + * @param string $name + * @param string $email + * @param array $groups + * @param string|null $language + * @throws Exception + * @author Thibaud Rohmer + */ public static function edit($login=NULL, $old_password=NULL, $password=NULL, $name=NULL, $email=NULL, $groups=array(), $language=NULL){ /// Only the admin can modify other accounts if( !CurrentUser::$admin && $login != CurrentUser::$account->login ){ return; } - if(isset($login) && (preg_match("/^[A-Z][a-zA-Z -]+$/", $login) === 0) ){ - $acc = new Account($login); + if(isset($login)){ + $acc = new Account($login); + if(!$acc){ + throw new Exception("Error: user with username '$login' not found."); + } }else{ $acc = CurrentUser::$account; } @@ -415,7 +422,7 @@ public static function findAll(){ * Returns the rights of an account * * @param string $login - * @return void + * @return array * @author Thibaud Rohmer */ public static function rights($login){ @@ -537,6 +544,13 @@ public function toHTML(){ "; echo "\n"; + echo "
\n"; + echo "
+ login, ENT_QUOTES ,'UTF-8')."\"> + + +
"; + echo "
\n"; echo "\n"; } diff --git a/src/classes/Admin.php b/src/classes/Admin.php index 7b8e812..971d516 100644 --- a/src/classes/Admin.php +++ b/src/classes/Admin.php @@ -107,6 +107,27 @@ public function __construct(){ Admin::delete(); } break; + + case "Cpy" : if(isset($_POST['pathFrom'])){ + try{ + CurrentUser::$path = File::r2a(dirname(stripslashes($_POST['pathFrom']))); + }catch(Exception $e){ + CurrentUser::$path = Settings::$photos_dir; + } + } + Admin::copyFile(); + + if(isset($_POST['copy']) && $_POST['copy']=="copy"){ + try{ + if(is_dir(File::r2a(stripslashes($_POST['pathFrom'])))){ + CurrentUser::$path = dirname(File::r2a(stripslashes($_POST['pathFrom'])))."/".stripslashes($_POST['pathTo']); + } + }catch(Exception $e){ + CurrentUser::$path = Settings::$photos_dir; + } + } + + break; } } @@ -133,6 +154,11 @@ public function __construct(){ case "Acc" : if(isset($_POST['edit'])){ Account::edit($_POST['login'],$_POST['old_password'],$_POST['password'],$_POST['name'],$_POST['email'],NULL,$_POST['language']); } + if(isset($_POST['delete'])){ + if (CurrentUser::$account != $_POST['login']){ + Account::delete($_POST['login']); + } + } if(isset($_POST['login'])){ $this->page = new Account($_POST['login']); }else{ @@ -248,7 +274,48 @@ public static function move(){ return; } + + + /** + * Copy files on the server + * + * @author Alesc from Thibaud Rohmer move() function + */ + public static function copyFile(){ + /// Just to be really sure... + if( !(CurrentUser::$admin || CurrentUser::$uploader) ){ + return; + } + + $from = File::r2a(stripslashes($_POST['pathFrom'])); + $to = dirname($from)."/".stripslashes($_POST['pathTo']); + $type = $_POST['copy']; + + if($from == $to){ + return; + } + + if($type == "copy"){ + /// Metadatas need to be done first: once moved/deleted, + /// we won't be able to compute from the original file + Admin::manage_metadatas(stripslashes($_POST['pathFrom']), stripslashes($_POST['pathTo'])); + @copy($from,$to); + return; + } + + /// We are moving multiple files + $files = scandir($from); + foreach($files as $file){ + if($file != "." && $file!=".."){ + Admin::manage_metadatas(stripslashes($_POST['pathFrom'])."/".$file, + stripslashes($_POST['pathTo'])."/".$file); + @copy($from."/".$file,$to."/".$file); + } + } + + return; + } /** * Delete files on the server diff --git a/src/classes/Board.php b/src/classes/Board.php index 3e0116c..d26c628 100644 --- a/src/classes/Board.php +++ b/src/classes/Board.php @@ -162,7 +162,7 @@ private function grid($type="Image"){ continue; } - $this->boarditems[] = new BoardItem($file); + $this->boarditems[] = new BoardItem($file,0,File::FileDate($file)); } } @@ -176,17 +176,18 @@ private function foldergrid(){ foreach($this->dirs as $d){ if(!Judge::view($d)) //Dir is not accessible (rights) - ignore it for better performance continue; - $firstImg = Judge::searchDir($d); - if(!$firstImg){ + + $albumCover = Judge::searchAlbumImage($d); + if(!$albumCover){ if(CurrentUser::$admin){ - $firstImg = NULL; + $albumCover = NULL; }else{ continue; } } - $item = new BoardDir($d,$firstImg); + $item = new BoardDir($d,$albumCover); $this->boardfolders[] = $item; } @@ -226,10 +227,36 @@ public function toHTML(){ $this->grid("Image"); if(sizeof($this->boarditems)>0){ echo "
"; - echo "

".Settings::_("board","images")."

"; - echo "
"; + + $years = []; foreach($this->boarditems as $item){ - $item->toHTML(); + $year = substr($item->datefile,0,4); + if(!in_array($year,$years) and $year != '') $years[]=$year; + } + //echo "

".print_r($years)."

"; + + + foreach($years as $year){ + echo "

$year

"; + echo "
"; + foreach($this->boarditems as $item){ + if( $year == substr($item->datefile,0,4)){ + $item->toHTML(); + } + } + echo "
"; + } + + $hideexif = false; + foreach($this->boarditems as $item){ + if (substr($item->datefile,0,4) == ''){ + if($hideexif == false) { + echo "

".Settings::_("board","images")." sans dates exif

"; + echo "
"; + $hideexif = true; + } + $item->toHTML(); + } } echo "
"; echo "
"; diff --git a/src/classes/BoardItem.php b/src/classes/BoardItem.php index 1366806..07655d1 100644 --- a/src/classes/BoardItem.php +++ b/src/classes/BoardItem.php @@ -56,6 +56,9 @@ class BoardItem implements HTMLObject /// Item width public $width; + /// Item date + public $datefile; + /** * Construct BoardItem * @@ -63,10 +66,11 @@ class BoardItem implements HTMLObject * @param string $ratio * @author Thibaud Rohmer */ - public function __construct($file,$ratio=0){ + public function __construct($file,$ratio=0,$datefile=''){ $this->path = $file; $this->file = urlencode(File::a2r($file)); $this->ratio = $ratio; + $this->datefile = $datefile; } /** diff --git a/src/classes/File.php b/src/classes/File.php index 8ee42bd..51b0eb1 100644 --- a/src/classes/File.php +++ b/src/classes/File.php @@ -56,6 +56,9 @@ class File /// File type public $type; + /// File date + public $filedate; + /** * Check that file exists, and parse its infos (extension,name,type) * @@ -74,6 +77,7 @@ public function __construct($path){ $this->name = self::Name($path); $this->type = self::Type($path); $this->root = self::Root(); + $this->filedate = self::FileDate($path); } /** @@ -161,6 +165,15 @@ public static function Type($file){ } + + public static function FileDate($file){ + if (!in_array("exif", get_loaded_extensions())) { + return 'exif error'; + }else{ + return @exif_read_data($file)['DateTimeOriginal']; + } + } + /** * Absolute path comes in, relative path goes out ! * @@ -179,6 +192,10 @@ public static function a2r($file,$dir=NULL){ if($rf==$rd) return ""; + if(Settings::$allow_symlinks_outside_photos_dir && substr($rf,0,strlen($rd)) != $rd && is_file($rf) ){ + return substr($file,strlen($dir) + 1 ); + } + if( substr($rf,0,strlen($rd)) != $rd ){ throw new Exception("This file is not inside the photos folder !
"); } diff --git a/src/classes/Group.php b/src/classes/Group.php index 176029f..991d10a 100644 --- a/src/classes/Group.php +++ b/src/classes/Group.php @@ -53,13 +53,14 @@ class Group { public $name; public $rights; - - /** - * Find group in base. - * - * @param string $name - * @author Thibaud Rohmer - */ + + /** + * Find group in base. + * + * @param string $name + * @throws Exception + * @author Thibaud Rohmer + */ public function __construct($name = NULL){ /// Check if group file exists @@ -98,14 +99,15 @@ public static function create_group_file(){ Group::create("user"); } - /** - * Create group and save into base - * - * @param string $name - * @param string $rights - * @return void - * @author Thibaud Rohmer - */ + /** + * Create group and save into base + * + * @param string $name + * @param array $rights + * @return void + * @throws Exception + * @author Thibaud Rohmer + */ public static function create($name,$rights=array()){ if(!isset($name)||strlen($name)<1){ return; @@ -126,7 +128,7 @@ public static function create($name,$rights=array()){ $xml_rights=$g->addChild('rights'); foreach($rights as $r) - $xml_right->addChild($r); + $xml_rights->addChild($r); $xml->asXML(CurrentUser::$groups_file); } @@ -160,12 +162,12 @@ public static function delete($groupname){ $xml->asXML($xml_infos); } - /** - * Save group into base - * - * @return void - * @author Thibaud Rohmer - */ + /** + * Save group into base + * @return void + * @throws Exception + * @author Thibaud Rohmer + */ public function save(){ /// Load file $xml = simplexml_load_file(CurrentUser::$groups_file); @@ -211,14 +213,15 @@ public static function exists($name){ return false; } - - /** - * Returns the rights of the group - * - * @param string $name - * @return void - * @author Thibaud Rohmer - */ + + /** + * Returns the rights of the group + * + * @param string $name + * @return array + * @throws Exception + * @author Thibaud Rohmer + */ public static function rights($name){ $rights = array(); diff --git a/src/classes/Judge.php b/src/classes/Judge.php index 3c88aad..67ec0ce 100644 --- a/src/classes/Judge.php +++ b/src/classes/Judge.php @@ -181,6 +181,14 @@ private function set_rights(){ } } + public static function searchAlbumImage($dir){ + foreach(Menu::list_files($dir,false,true,true) as $f){ + if(basename($f) == Settings::$album_coverfilename){ + return $f; + } + } + } + /** * Check recursively if a file is viewable in a folder, and returns path to that file. */ @@ -411,6 +419,18 @@ public function toHTML(){ echo "

".Settings::_("judge","infos")."

"; echo $this->infos; + + echo "
+ + + + +
+
+ +
+
+
"; echo "

".Settings::_("judge","access")."

"; if($this->public){ diff --git a/src/classes/Menu.php b/src/classes/Menu.php index 2c67e81..af61f87 100644 --- a/src/classes/Menu.php +++ b/src/classes/Menu.php @@ -166,6 +166,7 @@ public static function list_dirs($dir,$rec=false, $hidden=false){ /// Directory content $dir_content = scandir($dir); + natsort($dir_content); if (empty($dir_content)){ // Directory is empty or no right to read @@ -221,7 +222,8 @@ public static function list_files($dir,$rec = false, $hidden = false, $stopatfir /// Content isn't hidden and is a file if($content[0] != '.' || $hidden){ - if(is_file($path=$dir."/".$content)){ + $path = $dir."/".$content; + if(is_file($path) || is_link($path)){ if((File::Type($path) && (File::Type($path) == "Image" || File::Type($path)=="Video")) || $all_file_type){ /// Add content to list $list[]=$path; diff --git a/src/classes/Provider.php b/src/classes/Provider.php index 2cb8e85..8324df0 100755 --- a/src/classes/Provider.php +++ b/src/classes/Provider.php @@ -470,8 +470,10 @@ public static function Zip($dir){ } - // Get the relative path of the files + $dir = str_replace('//', '/', $dir); + // Get the relative path of the files $delimPosition = strrpos($dir, '/'); + if (strlen($dir) == $delimPosition) { echo "Error: Directory has a slash at the end"; return; @@ -483,9 +485,10 @@ public static function Zip($dir){ foreach($items as $item){ if(Judge::view($item)){ - // Use only the relative path of the filename + // Use only the relative path of the filename $item = str_replace('//', '/', $item); $itemsString.=" \"".str_replace( '"' , '\"' , substr( $item , $delimPosition + 1 ) )."\""; + } } @@ -493,7 +496,7 @@ public static function Zip($dir){ header('Content-Type: application/zip'); header("Content-Disposition: attachment; filename=\"".mb_basename($dir).".zip\""); - // Store the current working directory and change to the albums directory + // Store the current working directory and change to the albums directory $cwd = getcwd(); chdir(substr($dir,0,$delimPosition)); diff --git a/src/classes/Settings.php b/src/classes/Settings.php index 80036b7..410236f 100644 --- a/src/classes/Settings.php +++ b/src/classes/Settings.php @@ -66,6 +66,9 @@ class Settings extends Page /// Quality of mini thumbnails in overview, scala: 0-100 static public $quality_mini = 90; + /// The user can enable this to allow symlinks in his photos_dir to point to files outside his photos_dir + static public $allow_symlinks_outside_photos_dir = false; + /**** Admin Settings ****/ @@ -149,6 +152,9 @@ class Settings extends Page /// Size of the thumbs in pixels static public $thumbs_size = 200; + //// Name of cover image + static public $album_coverfilename = ".cover.jpg"; + /// Max-age of cache for images (and videos), including thumbnails static public $cache_max_age = 1209600; // 14*24*60*60 @@ -215,6 +221,10 @@ static public function init($forced = false, $config_file = NULL){ Settings::$conf_dir = $config->ps_generated."/Conf/"; Settings::$admin_settings_file = $config->ps_generated."/Conf/admin_settings.ini"; + if (isset($config->allow_symlinks_outside_photos_dir)) { + Settings::$allow_symlinks_outside_photos_dir = (bool) $config->allow_symlinks_outside_photos_dir; + } + if (isset($config->cache_max_age)) { Settings::$cache_max_age = (int) $config->cache_max_age; } @@ -305,6 +315,11 @@ static public function init($forced = false, $config_file = NULL){ if(isset($admin_settings['thumbs_size'])){ Settings::$thumbs_size = $admin_settings['thumbs_size'] + 0; } + + if(isset($admin_settings['album_coverfilename'])){ + Settings::$album_coverfilename = $admin_settings['album_coverfilename']; + } + if(isset($admin_settings['loc'])){ Settings::$loc = $admin_settings['loc']; @@ -326,7 +341,7 @@ static public function init($forced = false, $config_file = NULL){ /*** Image ***/ Settings::$rotate_image = isset($admin_settings['rotate_image']); if(isset($admin_settings['exiftran_path'])){ - Settings::$ffmpeg_path = $admin_settings['exiftran_path']; + Settings::$exiftran_path = $admin_settings['exiftran_path']; } } @@ -430,6 +445,7 @@ public static function set(){ "exiftran_path", "user_theme", "thumbs_size", + "album_coverfilename", "rss", "button_title" ); @@ -539,8 +555,18 @@ public function toHTML(){
\n"; + /// Album Cover + + echo "
+ + +
\n"; + + + echo "

".Settings::_("settings","s_networks")."

"; + /// Facebook Button $c = (Settings::$like)?"checked":""; echo "
diff --git a/src/js/confirmation.js b/src/js/confirmation.js index 383f0e7..9412e87 100644 --- a/src/js/confirmation.js +++ b/src/js/confirmation.js @@ -46,6 +46,9 @@ function executeOnSubmit(button) case 'tokenDelete': var res = confirm("Do you want to delete this guest token?") break; + case 'setAlbumCover': + var res = confirm("Do you want to set this image as album cover ?") + break; }; if(res) return true; diff --git a/src/stylesheets/side-menu.css b/src/stylesheets/side-menu.css index 8ca16d5..3f22ac7 100644 --- a/src/stylesheets/side-menu.css +++ b/src/stylesheets/side-menu.css @@ -19,24 +19,34 @@ This is the parent `
` that contains the menu and the content area. #layout { position: relative; padding-left: 0; + margin-left:300px; } #layout.active { position: relative; - left: 240px; + left: 0px; + margin-left:0px; } #layout.active #menu { - left: 240px; - width: 240px; + left: 0px; + width: 0px; } #layout.active .menu-link { - left: 240px; + left: 0px; } + + #layout.active #page { + left: 0px; + } + + #layout.active div.panel > .header { + left: 0px; + } #layout.active #image-panel{ - left:240px; + left:00px; } - + #menuright { margin-right: -240px; /* "#menu" width */ width: 240px; @@ -73,8 +83,8 @@ This is the parent `
` that contains the menu and the content area. #menu { border-right: 1px solid #e0e0e0; - margin-left: -241px; /* "#menu" width */ - width: 240px; + margin-left: -301px; /* "#menu" width */ + width: 300px; position: fixed; top: 0; left: 0; @@ -181,33 +191,34 @@ This is the parent `
` that contains the menu and the content area. } #layout { - padding-left: 240px; /* left col width "#menu" */ + padding-left: 0px; /* left col width "#menu" */ left: 0; } #menu { - left: 241px; + left: 301px; } .menu-link { position: fixed; - left: 240px; - display: none; + left: 300px; + /*display: none;*/ } #layout.active .menu-link { - left: 240px; + left: 0px; } #page{ - left:240px; + left:300px; } .item a{ - opacity:.7; + opacity:.7; } - - .panel > .header{ - left: 240px !important; + + div.panel > .header + { + left: 300px; } } diff --git a/src/stylesheets/structure.css b/src/stylesheets/structure.css index c4ad9eb..5d99aae 100644 --- a/src/stylesheets/structure.css +++ b/src/stylesheets/structure.css @@ -53,6 +53,20 @@ h3{ text-align: center; } + +/* PURE CSS bypass on very small screen */ +@media screen and (max-width: 480px){ + + .pure-form-aligned .pure-control-group label + { + text-align:center; + } + + .pure-control-group input[type=text], .pure-control-group input[type=password] { + margin: auto; + } +} + /* Logo */ span#rss{ position: absolute; @@ -307,6 +321,8 @@ transform: translateY(-50%); div#bigvideo > video { min-width: 100%; min-height: 100%; +width: 100%; +height: 100%; } diff --git a/user/themes/DSLR/DSLR_top.png b/user/themes/DSLR/DSLR_top.png new file mode 100644 index 0000000..1869e41 Binary files /dev/null and b/user/themes/DSLR/DSLR_top.png differ diff --git a/user/themes/DSLR/collimateurs.png b/user/themes/DSLR/collimateurs.png new file mode 100644 index 0000000..8ae5fec Binary files /dev/null and b/user/themes/DSLR/collimateurs.png differ diff --git a/user/themes/DSLR/style.css b/user/themes/DSLR/style.css new file mode 100644 index 0000000..6ab4a6a --- /dev/null +++ b/user/themes/DSLR/style.css @@ -0,0 +1,187 @@ +/* + + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #ee5f5b; + --orange: #fd7e14; + --yellow: #f89406; + --green: #62c462; + --teal: #20c997; + --cyan: #5bc0de; + --white: #fff; + --gray: #7A8288; + --gray-dark: #3A3F44; + --primary: #3A3F44; + --secondary: #7A8288; + --success: #62c462; + --info: #5bc0de; + --warning: #f89406; + --danger: #ee5f5b; + --light: #e9ecef; + --dark: #272B30; + + --white: #fff; + --light: #e9ecef; + --gray: #7A8288; + --gray-dark: #3A3F44; + --dark: #272B30; + --black: #000; + +*/ + +body,#menuright{ + background-color: #272B30; + color: #7A8288; +} +h2, h3, a { + color: #7A8288; +} +#logo, .infos { + color: #e9ecef; +} + +#logo { + border-bottom: 1px solid #272B30; +} + +.header { + background-color: #3A3F44; + + margin-right: 0; +} +div.directory .dirname { + background-color: #3A3F44; + font-family: 'Arial'; + font-size:12px; + color: #fff; +} + + +.item a{ + opacity:1; +} + +.line > .item :hover , +.line > .item-video > a:hover { + opacity: 0.9 + +} +.line > .item { + background: no-repeat center/70% url('/user/themes/DSLR/collimateurs.png'); +} + + + +#menuright { + box-shadow: 0 0px 15px rgba(255,255,255,.50); +} +div#menuright-header, div.infos_img > div.infos_title { + background-color: #3A3F44; +} + +.infos table, #comments_form, #description_form { + margin-left: 5px; +} + +.floating-action { + background-color: #3A3F44; +} +.floating-action:hover { + background-color: #3A3F44; + color: #3A3F44; +} + +li.currentSelected > a { + color: #272B30 !important; + background-color: #7A8288; +} + +li.currentSelected > a:hover { + color: #e9ecef !important; +} + +#menu .pure-menu li a:hover, #menu .pure-menu li a:focus { + background-color: #7A8288; + color: #fff; +} + +#menu{ + border-right: 1px solid #272B30 ; + background-color: #3A3F44; + color: #fff; +} + +#menu1::-webkit-scrollbar-track +{ + -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,0.3); + border-radius: 10px; + background-color: #3A3F44; +} + +#menu::-webkit-scrollbar +{ + width: 6px; + background-color: #3A3F44; +} + +#menu::-webkit-scrollbar-thumb +{ + border-radius: 10px; + -webkit-box-shadow: inset 0 0 3px rgba(0,0,0,.3); + background-color: #7A8288; +} + + +#page::-webkit-scrollbar-track +{ + -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.3); + border-radius: 10px; + background-color: #3A3F44; +} + +#page::-webkit-scrollbar +{ + width: 10px; + background-color: #3A3F44; +} + +#page::-webkit-scrollbar-thumb +{ + border-radius: 10px; + -webkit-box-shadow: inset 0 0 5px rgba(0,0,0,.3); + background-color: #7A8288; +} + + +.pure-menu a { + color: #fff; +} + +.pure-g { + padding: 2%; +} +.pure-button-primary, .pure-button-selected, a.pure-button-primary, a.pure-button-selected { + background-color: #3A3F44; +} +.pure-table-striped tr:nth-child(2n-1) td { + color: #3A3F44; +} + +#logo { + text-align: right; +} + +#logo:before { + content: ""; + display: block; + float: left; + width: 100px; + height: 60px; + background-image: url("/user/themes/DSLR/DSLR_top.png"); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + background-origin: border-box; +} \ No newline at end of file