├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── composer.json ├── composer.lock ├── config.template.php ├── controllers ├── API.php ├── Auth.php └── Controller.php ├── data └── unsupported-domains.txt ├── lib ├── Telegraph │ ├── FindLinks.php │ ├── HTTP.php │ ├── HTTPTest.php │ ├── ProfileFetcher.php │ └── Webmention.php └── helpers.php ├── migrations ├── 20160204131300.sql ├── 20160929174900.sql └── schema.sql ├── phpunit.xml ├── public ├── assets │ ├── dashboard-screenshot.jpg │ ├── default-user.jpg │ ├── jquery-1.11.3.min.js │ ├── styles.css │ ├── superfeedr │ │ ├── create-new-website.png │ │ ├── new-site-form.png │ │ ├── site-created.png │ │ ├── site-settings.png │ │ ├── superfeedr-configuration.png │ │ ├── superfeedr-signup.png │ │ └── telegraph-dashboard-mentions.png │ ├── telegraph-header.jpg │ ├── telegraph-icon-white.png │ └── telegraph-logo-256.png ├── favicon.ico ├── index.php ├── robots.txt └── semantic-ui │ ├── .versions │ ├── LICENSE │ ├── README.md │ ├── components │ ├── accordion.css │ ├── accordion.js │ ├── accordion.min.css │ ├── accordion.min.js │ ├── ad.css │ ├── ad.min.css │ ├── api.js │ ├── api.min.js │ ├── breadcrumb.css │ ├── breadcrumb.min.css │ ├── button.css │ ├── button.min.css │ ├── card.css │ ├── card.min.css │ ├── checkbox.css │ ├── checkbox.js │ ├── checkbox.min.css │ ├── checkbox.min.js │ ├── colorize.js │ ├── colorize.min.js │ ├── comment.css │ ├── comment.min.css │ ├── container.css │ ├── container.min.css │ ├── dimmer.css │ ├── dimmer.js │ ├── dimmer.min.css │ ├── dimmer.min.js │ ├── divider.css │ ├── divider.min.css │ ├── dropdown.css │ ├── dropdown.js │ ├── dropdown.min.css │ ├── dropdown.min.js │ ├── embed.css │ ├── embed.js │ ├── embed.min.css │ ├── embed.min.js │ ├── feed.css │ ├── feed.min.css │ ├── flag.css │ ├── flag.min.css │ ├── form.css │ ├── form.js │ ├── form.min.css │ ├── form.min.js │ ├── grid.css │ ├── grid.min.css │ ├── header.css │ ├── header.min.css │ ├── icon.css │ ├── icon.min.css │ ├── image.css │ ├── image.min.css │ ├── input.css │ ├── input.min.css │ ├── item.css │ ├── item.min.css │ ├── label.css │ ├── label.min.css │ ├── list.css │ ├── list.min.css │ ├── loader.css │ ├── loader.min.css │ ├── menu.css │ ├── menu.min.css │ ├── message.css │ ├── message.min.css │ ├── modal.css │ ├── modal.js │ ├── modal.min.css │ ├── modal.min.js │ ├── nag.css │ ├── nag.js │ ├── nag.min.css │ ├── nag.min.js │ ├── popup.css │ ├── popup.js │ ├── popup.min.css │ ├── popup.min.js │ ├── progress.css │ ├── progress.js │ ├── progress.min.css │ ├── progress.min.js │ ├── rail.css │ ├── rail.min.css │ ├── rating.css │ ├── rating.js │ ├── rating.min.css │ ├── rating.min.js │ ├── reset.css │ ├── reset.min.css │ ├── reveal.css │ ├── reveal.min.css │ ├── search.css │ ├── search.js │ ├── search.min.css │ ├── search.min.js │ ├── segment.css │ ├── segment.min.css │ ├── shape.css │ ├── shape.js │ ├── shape.min.css │ ├── shape.min.js │ ├── sidebar.css │ ├── sidebar.js │ ├── sidebar.min.css │ ├── sidebar.min.js │ ├── site.css │ ├── site.js │ ├── site.min.css │ ├── site.min.js │ ├── state.js │ ├── state.min.js │ ├── statistic.css │ ├── statistic.min.css │ ├── step.css │ ├── step.min.css │ ├── sticky.css │ ├── sticky.js │ ├── sticky.min.css │ ├── sticky.min.js │ ├── tab.css │ ├── tab.js │ ├── tab.min.css │ ├── tab.min.js │ ├── table.css │ ├── table.min.css │ ├── transition.css │ ├── transition.js │ ├── transition.min.css │ ├── transition.min.js │ ├── video.css │ ├── video.js │ ├── video.min.css │ ├── video.min.js │ ├── visibility.js │ ├── visibility.min.js │ ├── visit.js │ └── visit.min.js │ ├── dist.zip │ ├── package.js │ ├── package.json │ ├── semantic.css │ ├── semantic.js │ ├── semantic.min.css │ ├── semantic.min.js │ └── themes │ └── default │ └── assets │ ├── fonts │ ├── icons.eot │ ├── icons.otf │ ├── icons.svg │ ├── icons.ttf │ ├── icons.woff │ └── icons.woff2 │ └── images │ └── flags.png ├── scripts └── telegraph.php ├── tests ├── APITest.php ├── FindLinksTest.php ├── ProcessTest.php ├── bootstrap.php └── data │ ├── 404.response.txt │ ├── pingback.example.com │ ├── error │ └── success │ ├── source.example.com │ ├── basictest │ ├── callback │ ├── invalidhtml │ ├── multipletest │ ├── no-endpoint │ ├── nolink │ ├── nothtml │ ├── pingback-failed │ ├── pingback-success │ ├── webmention-and-pingback │ ├── webmention-failed │ ├── webmention-status-url │ └── webmention-success │ ├── target.example.com │ ├── no-endpoint │ ├── pingback-failed │ ├── pingback-success │ ├── webmention-failed │ ├── webmention-status-url │ └── webmention-success │ └── webmention.example.com │ ├── error │ ├── success │ └── success-with-status └── views ├── api.php ├── dashboard.php ├── footer-block.php ├── index.php ├── layout-loggedin.php ├── layout.php ├── login.php ├── new-site.php ├── not-found.php ├── send-a-webmention.php ├── superfeedr.php ├── webmention-details.php └── webmention-send.php /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | vendor/ 3 | config.php 4 | config.test.php 5 | scripts/logs/ 6 | php_errors.log 7 | phpunit 8 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | By submitting code to this project, you agree to irrevocably release it under the same license as this project. See README.md for more details. 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Telegraph 2 | 3 | Telegraph is an API for sending [Webmentions](http://webmention.net). 4 | 5 | ## API 6 | 7 | See https://telegraph.p3k.io/api 8 | 9 | ## Developing 10 | 11 | * Fork and clone this repo. 12 | * Install MySQL, composer, beanstalk, and phpunit if they're not already 13 | installed, e.g. `brew install mysql composer beanstalk phpunit`. 14 | * Start MySQL and `beanstalkd`. 15 | * Copy `config.template.php` to `config.test.php`. Update the appropriate values 16 | for your local environment if necessary. 17 | * Run these commands to install the dependencies, create a local database, and 18 | run the tests: 19 | 20 | ```sh 21 | $ composer install 22 | $ mysql [ARGS] -e 'CREATE DATABASE telegraph;' 23 | $ mysql [ARGS] < migrations/schema.sql 24 | $ phpunit 25 | # Hack hack hack! 26 | ``` 27 | 28 | ## Credits 29 | 30 | Telegraph photo: https://www.flickr.com/photos/nostri-imago/3407786186 31 | 32 | Telegraph icon: https://thenounproject.com/search/?q=telegraph&i=22058 33 | 34 | ## License 35 | 36 | Copyright 2016-2018 by Aaron Parecki 37 | 38 | Available under the Apache 2.0 license. See [LICENSE](LICENSE). 39 | 40 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require": { 3 | "php": ">=5.5", 4 | "mf2/mf2": "^0.4.3", 5 | "indieweb/mention-client": "~1.1", 6 | "indieweb/representative-h-card": "0.1.*", 7 | "indieauth/client": "^1.0", 8 | "firebase/php-jwt": "~3.0", 9 | "league/route": "~1.2", 10 | "league/plates": "~3.1", 11 | "j4mie/idiorm": "1.5.*", 12 | "p3k/caterpillar": "0.1.*", 13 | "predis/predis": "1.*", 14 | "michelf/php-markdown": "1.6.*", 15 | "camspiers/json-pretty": "1.0.*", 16 | "monolog/monolog": "1.*", 17 | "emgiezet/errbit-php": "1.1.*", 18 | "p3k/utils": "^1.2", 19 | "p3k/xray": "^1.4" 20 | }, 21 | "require-dev": { 22 | "phpunit/phpunit": "*" 23 | }, 24 | "autoload": { 25 | "psr-4": { 26 | "Telegraph\\": "lib/Telegraph/" 27 | }, 28 | "files": [ 29 | "lib/helpers.php", 30 | "controllers/Controller.php", 31 | "controllers/Auth.php", 32 | "controllers/API.php" 33 | ] 34 | }, 35 | "autoload-dev": { 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /config.template.php: -------------------------------------------------------------------------------- 1 | '127.0.0.1', 16 | 'database' => 'telegraph', 17 | 'username' => 'root', 18 | 'password' => '' 19 | ]; 20 | } 21 | -------------------------------------------------------------------------------- /lib/Telegraph/FindLinks.php: -------------------------------------------------------------------------------- 1 | $value) { 18 | if($key === 'html') { 19 | $links = array_merge($links, self::inHTML($value)); 20 | } 21 | else { 22 | $links = array_merge($links, self::inText($value)); 23 | } 24 | } 25 | return array_unique($links); 26 | } else { 27 | return []; 28 | } 29 | } 30 | 31 | /** 32 | * find all links in text. 33 | * @param $input string text block 34 | * @return mixed array of links in text block. 35 | */ 36 | public static function inText($input) { 37 | if(!is_string($input)) return []; 38 | preg_match_all('/https?:\/\/[^ ]+/', $input, $matches); 39 | return array_unique($matches[0]); 40 | } 41 | 42 | /** 43 | * find all links in text. 44 | * @param $input string text block 45 | * @return mixed array of links in text block. 46 | */ 47 | public static function inHTML($html) { 48 | if(!is_string($html)) return []; 49 | 50 | $doc = new DOMDocument(); 51 | libxml_use_internal_errors(true); # suppress parse errors and warnings 52 | @$doc->loadHTML(self::toHtmlEntities($html), LIBXML_NOWARNING|LIBXML_NOERROR); 53 | libxml_clear_errors(); 54 | if(!$doc) return []; 55 | $xpath = new DOMXPath($doc); 56 | 57 | $links = []; 58 | foreach($xpath->query('//a[@href]') as $href) { 59 | $links[] = $href->getAttribute('href'); 60 | } 61 | 62 | return array_unique($links); 63 | } 64 | 65 | private static function toHtmlEntities($input) { 66 | return mb_convert_encoding($input, 'HTML-ENTITIES', mb_detect_encoding($input)); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /lib/Telegraph/HTTP.php: -------------------------------------------------------------------------------- 1 | curl_getinfo($ch, CURLINFO_HTTP_CODE), 17 | 'headers' => self::parse_headers(trim(substr($response, 0, $header_size))), 18 | 'body' => substr($response, $header_size) 19 | ); 20 | } 21 | 22 | public function post($url, $body, $headers=array()) { 23 | $ch = curl_init($url); 24 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 25 | curl_setopt($ch, CURLOPT_POST, true); 26 | curl_setopt($ch, CURLOPT_POSTFIELDS, $body); 27 | curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 28 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 29 | curl_setopt($ch, CURLOPT_HEADER, true); 30 | $response = curl_exec($ch); 31 | $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 32 | return array( 33 | 'code' => curl_getinfo($ch, CURLINFO_HTTP_CODE), 34 | 'headers' => self::parse_headers(trim(substr($response, 0, $header_size))), 35 | 'body' => substr($response, $header_size) 36 | ); 37 | } 38 | 39 | public function head($url) { 40 | $ch = curl_init($url); 41 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 42 | curl_setopt($ch, CURLOPT_HEADER, true); 43 | curl_setopt($ch, CURLOPT_NOBODY, true); 44 | curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 45 | $response = curl_exec($ch); 46 | return array( 47 | 'code' => curl_getinfo($ch, CURLINFO_HTTP_CODE), 48 | 'headers' => self::parse_headers(trim($response)), 49 | ); 50 | } 51 | 52 | public static function parse_headers($headers) { 53 | $retVal = array(); 54 | $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $headers)); 55 | foreach($fields as $field) { 56 | if(preg_match('/([^:]+): (.+)/m', $field, $match)) { 57 | $match[1] = preg_replace_callback('/(?<=^|[\x09\x20\x2D])./', function($m) { 58 | return strtoupper($m[0]); 59 | }, strtolower(trim($match[1]))); 60 | // If there's already a value set for the header name being returned, turn it into an array and add the new value 61 | $match[1] = preg_replace_callback('/(?<=^|[\x09\x20\x2D])./', function($m) { 62 | return strtoupper($m[0]); 63 | }, strtolower(trim($match[1]))); 64 | if(isset($retVal[$match[1]])) { 65 | if(!is_array($retVal[$match[1]])) 66 | $retVal[$match[1]] = array($retVal[$match[1]]); 67 | $retVal[$match[1]][] = $match[2]; 68 | } else { 69 | $retVal[$match[1]] = trim($match[2]); 70 | } 71 | } 72 | } 73 | return $retVal; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /lib/Telegraph/HTTPTest.php: -------------------------------------------------------------------------------- 1 | _testDataPath = $testDataPath; 10 | } 11 | 12 | public function get($url, $headers=array()) { 13 | return $this->_read_file($url); 14 | } 15 | 16 | public function post($url, $body, $headers=array()) { 17 | return $this->_read_file($url); 18 | } 19 | 20 | public function head($url) { 21 | $response = $this->_read_file($url); 22 | return array( 23 | 'code' => $response['code'], 24 | 'headers' => $response['headers'] 25 | ); 26 | } 27 | 28 | private function _read_file($url) { 29 | $filename = $this->_testDataPath.preg_replace('/https?:\/\//', '', $url); 30 | if(!file_exists($filename)) { 31 | $filename = $this->_testDataPath.'404.response.txt'; 32 | } 33 | $response = file_get_contents($filename); 34 | 35 | $split = explode("\r\n\r\n", $response); 36 | if(count($split) != 2) { 37 | throw new \Exception("Invalid file contents in test data, check that newlines are CRLF: $url"); 38 | } 39 | list($headers, $body) = $split; 40 | 41 | if(preg_match('/HTTP\/1\.1 (\d+)/', $headers, $match)) { 42 | $code = $match[1]; 43 | } 44 | 45 | $headers = preg_replace('/HTTP\/1\.1 \d+ .+/', '', $headers); 46 | 47 | return array( 48 | 'code' => $code, 49 | 'headers' => self::parse_headers($headers), 50 | 'body' => $body 51 | ); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /lib/Telegraph/ProfileFetcher.php: -------------------------------------------------------------------------------- 1 | where_id_is($id)->find_one(); 12 | echo "Looking for representative h-card for ".$user->url."\n"; 13 | 14 | $client = new HTTP(); 15 | $data = $client->get($user->url); 16 | $parsed = Mf2\parse($data['body'], $user->url); 17 | $representative = Mf2\HCard\representative($parsed, $user->url); 18 | if($representative) { 19 | echo "Found it!\n"; 20 | print_r($representative); 21 | if(array_key_exists('name', $representative['properties'])) { 22 | $user->name = $representative['properties']['name'][0]; 23 | } 24 | if(array_key_exists('photo', $representative['properties'])) { 25 | $user->photo = $representative['properties']['photo'][0]; 26 | } 27 | $user->save(); 28 | } else { 29 | echo "Couldn't find one\n"; 30 | } 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /lib/Telegraph/Webmention.php: -------------------------------------------------------------------------------- 1 | create(); 34 | $status->webmention_id = $webmention->id; 35 | $status->created_at = date('Y-m-d H:i:s'); 36 | if($http_code) 37 | $status->http_code = $http_code; 38 | $status->status = $code; 39 | if($raw) 40 | $status->raw_response = $raw; 41 | $status->save(); 42 | 43 | // Post to the callback URL if one is set 44 | if($webmention->callback) { 45 | $payload = [ 46 | 'source' => $webmention->source, 47 | 'target' => $webmention->target, 48 | 'status' => $code, 49 | ]; 50 | if($webmention->webmention_endpoint) { 51 | $payload['type'] = 'webmention'; 52 | } elseif($webmention->pingback_endpoint) { 53 | $payload['type'] = 'pingback'; 54 | } 55 | 56 | if($status->http_code) { 57 | $payload['http_code'] = $status->http_code; 58 | } 59 | if($raw) { 60 | $payload['http_body'] = $raw; 61 | } 62 | 63 | echo "Sending result to callback URL: $webmention->callback\n"; 64 | return self::$http->post($webmention->callback, $payload); 65 | } 66 | } 67 | 68 | public static function send($id, $client=false, $http=false) { 69 | initdb(); 70 | 71 | $webmention = ORM::for_table('webmentions')->where('id', $id)->find_one(); 72 | if(!$webmention) { 73 | echo 'Webmention '.$id.' was not found'."\n"; 74 | return; 75 | } 76 | 77 | echo "Processing webmention $id from ".$webmention->source."\n"; 78 | 79 | if(!$client) 80 | $client = new MentionClient(); 81 | 82 | if(!$http) 83 | $http = new HTTP(); 84 | 85 | self::$http = $http; 86 | 87 | echo "Finding webmention endpoint for $webmention->target\n"; 88 | 89 | // Discover the webmention or pingback endpoint 90 | $endpoint = $client->discoverWebmentionEndpoint($webmention->target); 91 | 92 | if(!$endpoint) { 93 | echo "No webmention endpoint, checking for pingback\n"; 94 | 95 | // If no webmention endpoint found, try to send a pingback 96 | $pingbackEndpoint = $client->discoverPingbackEndpoint($webmention->target); 97 | 98 | // If no pingback endpoint was found, we can't do anything else 99 | if(!$pingbackEndpoint) { 100 | echo "No webmention or pingback endpoint found\n"; 101 | return self::updateStatus($webmention, null, 'not_supported'); 102 | } 103 | 104 | echo "Found pingback endpoint $pingbackEndpoint\n"; 105 | $webmention->pingback_endpoint = $pingbackEndpoint; 106 | $webmention->save(); 107 | 108 | echo "Sending pingback now...\n"; 109 | $success = $client->sendPingbackToEndpoint($pingbackEndpoint, $webmention->source, $webmention->target); 110 | echo "Result: ".($success?'accepted':'error')."\n"; 111 | return self::updateStatus($webmention, null, ($success ? 'accepted' : 'error')); 112 | } 113 | 114 | echo "Found webmention endpoint $endpoint\n"; 115 | 116 | // There is a webmention endpoint, send the webmention now 117 | 118 | $webmention->webmention_endpoint = $endpoint; 119 | $webmention->save(); 120 | 121 | $params = []; 122 | if($webmention->code) { 123 | $params['code'] = $webmention->code; 124 | if($webmention->realm) 125 | $params['realm'] = $webmention->realm; 126 | } 127 | if($webmention->vouch) { 128 | $params['vouch'] = $webmention->vouch; 129 | } 130 | 131 | echo "Sending webmention now...\n"; 132 | 133 | $response = $client->sendWebmentionToEndpoint($endpoint, $webmention->source, $webmention->target, $params); 134 | 135 | echo "Response code: ".$response['code']."\n"; 136 | 137 | if(in_array($response['code'], [200,201,202])) { 138 | $status = 'accepted'; 139 | 140 | $webmention->complete = $response['code'] == 200 ? 1 : 0; 141 | 142 | // Check if the endpoint returned a status URL 143 | if(array_key_exists('Location', $response['headers'])) { 144 | $webmention->webmention_status_url = \Mf2\resolveUrl($endpoint, $response['headers']['Location']); 145 | echo "Endpoint returned a status URL: ".$webmention->webmention_status_url."\n"; 146 | // TODO: queue a job to poll the endpoint for updates and deliver to the callback URL 147 | } else { 148 | // No status URL was returned, so we can't follow up with this later. Mark as complete. 149 | $webmention->complete = 1; 150 | } 151 | 152 | } else { 153 | $webmention->complete = 1; 154 | $status = 'error'; 155 | } 156 | 157 | $webmention->save(); 158 | 159 | $result = self::updateStatus($webmention, $response['code'], $status, $response['body']); 160 | echo "Done\n"; 161 | $pdo = ORM::get_db(); 162 | $pdo = null; 163 | return $result; 164 | } 165 | 166 | } 167 | -------------------------------------------------------------------------------- /lib/helpers.php: -------------------------------------------------------------------------------- 1 | pushHandler(new StreamHandler(dirname(__FILE__).'/../logs/telegraph.log', Logger::DEBUG)); 24 | } 25 | return $log; 26 | } 27 | 28 | function log_info($msg) { 29 | logger()->addInfo($msg); 30 | } 31 | 32 | function log_warning($msg) { 33 | logger()->addWarning($msg); 34 | } 35 | 36 | function view($template, $data=[]) { 37 | global $templates; 38 | return $templates->render($template, $data); 39 | } 40 | 41 | function q() { 42 | static $caterpillar = false; 43 | if(!$caterpillar) { 44 | $logdir = __DIR__.'/../scripts/logs/'; 45 | $caterpillar = new Caterpillar('telegraph', '127.0.0.1', 11300, $logdir); 46 | } 47 | return $caterpillar; 48 | } 49 | 50 | function redis() { 51 | static $client = false; 52 | if(!$client) 53 | $client = new Predis\Client('tcp://127.0.0.1:6379'); 54 | return $client; 55 | } 56 | 57 | function random_string($len) { 58 | $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 59 | $str = ''; 60 | $c = strlen($charset)-1; 61 | for($i=0; $i<$len; $i++) { 62 | $str .= $charset[mt_rand(0, $c)]; 63 | } 64 | return $str; 65 | } 66 | 67 | // Returns true if $needle is the end of the $haystack 68 | function str_ends_with($haystack, $needle) { 69 | if($needle == '' || $haystack == '') return false; 70 | return strpos(strrev($haystack), strrev($needle)) === 0; 71 | } 72 | 73 | function display_url($url) { 74 | return preg_replace(['/^https?:\/\//','/\/$/'], '', $url); 75 | } 76 | 77 | function session($k, $default=null) { 78 | if(!isset($_SESSION)) return $default; 79 | return array_key_exists($k, $_SESSION) ? $_SESSION[$k] : $default; 80 | } 81 | -------------------------------------------------------------------------------- /migrations/20160204131300.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE sites 2 | ADD COLUMN url VARCHAR(255) DEFAULT NULL AFTER name; 3 | 4 | UPDATE sites 5 | JOIN roles ON sites.id = roles.site_id 6 | JOIN users ON users.id = roles.user_id 7 | SET sites.url = users.url; 8 | -------------------------------------------------------------------------------- /migrations/20160929174900.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE webmentions 2 | ADD COLUMN `code` TEXT DEFAULT NULL AFTER `vouch`, 3 | ADD COLUMN `realm` TEXT DEFAULT NULL AFTER `code`; 4 | -------------------------------------------------------------------------------- /migrations/schema.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE `roles` ( 2 | `site_id` int(11) unsigned NOT NULL, 3 | `user_id` int(11) unsigned NOT NULL, 4 | `role` varchar(30) DEFAULT 'owner', 5 | `token` varchar(255) DEFAULT NULL, 6 | PRIMARY KEY (`site_id`,`user_id`), 7 | KEY `apikey` (`token`(191)) 8 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 9 | 10 | CREATE TABLE `sites` ( 11 | `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 12 | `name` varchar(255) DEFAULT NULL, 13 | `url` VARCHAR(255) DEFAULT NULL, 14 | `created_by` int(10) unsigned DEFAULT NULL, 15 | `created_at` datetime DEFAULT NULL, 16 | PRIMARY KEY (`id`) 17 | ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4; 18 | 19 | CREATE TABLE `users` ( 20 | `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 21 | `url` varchar(255) DEFAULT NULL, 22 | `name` varchar(255) DEFAULT NULL, 23 | `photo` varchar(255) DEFAULT NULL, 24 | `created_at` datetime DEFAULT NULL, 25 | `last_login` datetime DEFAULT NULL, 26 | PRIMARY KEY (`id`) 27 | ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4; 28 | 29 | CREATE TABLE `webmention_status` ( 30 | `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 31 | `webmention_id` bigint(20) unsigned DEFAULT NULL, 32 | `created_at` datetime DEFAULT NULL, 33 | `http_code` int(11) DEFAULT NULL, 34 | `status` varchar(100) DEFAULT NULL, 35 | `raw_response` text, 36 | PRIMARY KEY (`id`), 37 | KEY `webmention_id` (`webmention_id`,`created_at`) 38 | ) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8mb4; 39 | 40 | CREATE TABLE `webmentions` ( 41 | `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 42 | `site_id` int(10) unsigned NOT NULL, 43 | `token` varchar(20) DEFAULT NULL, 44 | `created_by` int(10) unsigned DEFAULT NULL, 45 | `created_at` datetime DEFAULT NULL, 46 | `complete` tinyint(4) NOT NULL DEFAULT '0', 47 | `source` varchar(255) DEFAULT NULL, 48 | `target` varchar(255) DEFAULT NULL, 49 | `vouch` varchar(255) DEFAULT NULL, 50 | `code` text DEFAULT NULL, 51 | `realm` text DEFAULT NULL, 52 | `callback` varchar(255) DEFAULT NULL, 53 | `webmention_endpoint` varchar(255) DEFAULT NULL, 54 | `webmention_status_url` varchar(255) DEFAULT NULL, 55 | `pingback_endpoint` varchar(255) DEFAULT NULL, 56 | PRIMARY KEY (`id`), 57 | KEY `token` (`token`), 58 | KEY `site_id` (`site_id`) 59 | ) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8mb4; 60 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | tests 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/assets/dashboard-screenshot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/dashboard-screenshot.jpg -------------------------------------------------------------------------------- /public/assets/default-user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/default-user.jpg -------------------------------------------------------------------------------- /public/assets/styles.css: -------------------------------------------------------------------------------- 1 | .footer.segment { 2 | padding: 5em 0em; 3 | } 4 | 5 | .api-docs pre { 6 | padding: 8px 12px; 7 | border-radius: 4px; 8 | border: 1px #ddd solid; 9 | background-color: rgba(248,246,255,1); 10 | font-size: 0.9em; 11 | } 12 | 13 | .status-table .status { 14 | width: 70px; 15 | } 16 | .status-table .date { 17 | width: 135px; 18 | } 19 | .status-table .urls { 20 | width: 495px; 21 | max-width: 495px; 22 | word-wrap: break-word; 23 | } 24 | 25 | .details-table .left { 26 | width: 80px; 27 | } 28 | .details-table .right { 29 | max-width: 620px; 30 | word-wrap: break-word; 31 | } 32 | 33 | .tutorial-image { 34 | max-width: 100%; 35 | -webkit-box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.5); 36 | -moz-box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.5); 37 | box-shadow: 0px 0px 8px 0px rgba(0,0,0,0.5); 38 | } 39 | 40 | table.logs pre { 41 | word-wrap: break-word; 42 | word-break: break-all; 43 | } 44 | -------------------------------------------------------------------------------- /public/assets/superfeedr/create-new-website.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/create-new-website.png -------------------------------------------------------------------------------- /public/assets/superfeedr/new-site-form.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/new-site-form.png -------------------------------------------------------------------------------- /public/assets/superfeedr/site-created.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/site-created.png -------------------------------------------------------------------------------- /public/assets/superfeedr/site-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/site-settings.png -------------------------------------------------------------------------------- /public/assets/superfeedr/superfeedr-configuration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/superfeedr-configuration.png -------------------------------------------------------------------------------- /public/assets/superfeedr/superfeedr-signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/superfeedr-signup.png -------------------------------------------------------------------------------- /public/assets/superfeedr/telegraph-dashboard-mentions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/superfeedr/telegraph-dashboard-mentions.png -------------------------------------------------------------------------------- /public/assets/telegraph-header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/telegraph-header.jpg -------------------------------------------------------------------------------- /public/assets/telegraph-icon-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/telegraph-icon-white.png -------------------------------------------------------------------------------- /public/assets/telegraph-logo-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/assets/telegraph-logo-256.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/favicon.ico -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | configure(array( 10 | 'api_key' => Config::$errbitKey, 11 | 'host' => Config::$errbitHost, 12 | 'port' => 443, 13 | 'secure' => true 14 | )) 15 | ->start(); 16 | } 17 | 18 | initdb(); 19 | 20 | use Symfony\Component\HttpFoundation\Request; 21 | use Symfony\Component\HttpFoundation\Response; 22 | $router = new League\Route\RouteCollection; 23 | $templates = new League\Plates\Engine(dirname(__FILE__).'/../views'); 24 | 25 | $router->addRoute('GET', '/', 'Controller::index'); 26 | $router->addRoute('GET', '/dashboard', 'Controller::dashboard'); 27 | $router->addRoute('GET', '/send-a-webmention', 'Controller::send_a_webmention'); 28 | $router->addRoute('GET', '/site/new', 'Controller::new_site'); 29 | $router->addRoute('GET', '/site/edit', 'Controller::new_site'); 30 | $router->addRoute('POST', '/site/save', 'Controller::save_site'); 31 | $router->addRoute('GET', '/api', 'Controller::api'); 32 | $router->addRoute('GET', '/superfeedr', 'Controller::superfeedr'); 33 | 34 | $router->addRoute('GET', '/webmention/{code}/details', 'Controller::webmention_details'); 35 | $router->addRoute('GET', '/dashboard/send', 'Controller::dashboard_send'); 36 | $router->addRoute('POST', '/dashboard/get_outgoing_links.json', 'Controller::get_outgoing_links'); 37 | $router->addRoute('POST', '/dashboard/discover_endpoint.json', 'Controller::discover_endpoint'); 38 | 39 | $router->addRoute('POST', '/webmention', 'API::webmention'); 40 | $router->addRoute('POST', '/superfeedr/{token}', 'API::superfeedr_tracker'); 41 | $router->addRoute('GET', '/webmention/{code}', 'API::webmention_status'); 42 | 43 | $router->addRoute('GET', '/login', 'Auth::login'); 44 | $router->addRoute('GET', '/logout', 'Auth::logout'); 45 | $router->addRoute('POST', '/login/start', 'Auth::login_start'); 46 | $router->addRoute('GET', '/login/callback', 'Auth::login_callback'); 47 | 48 | $dispatcher = $router->getDispatcher(); 49 | $request = Request::createFromGlobals(); 50 | 51 | try { 52 | $response = $dispatcher->dispatch($request->getMethod(), $request->getPathInfo()); 53 | $response->send(); 54 | } catch(League\Route\Http\Exception\NotFoundException $e) { 55 | $response = new Response; 56 | $response->setStatusCode(404); 57 | $response->setContent("Not Found\n"); 58 | $response->send(); 59 | } catch(League\Route\Http\Exception\MethodNotAllowedException $e) { 60 | $response = new Response; 61 | $response->setStatusCode(405); 62 | $response->setContent("Method not allowed\n"); 63 | $response->send(); 64 | } 65 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/robots.txt -------------------------------------------------------------------------------- /public/semantic-ui/.versions: -------------------------------------------------------------------------------- 1 | jquery@1.11.3_2 2 | meteor@1.1.6 3 | semantic:ui-css@2.0.7 4 | underscore@1.0.3 5 | -------------------------------------------------------------------------------- /public/semantic-ui/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Semantic Org 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /public/semantic-ui/README.md: -------------------------------------------------------------------------------- 1 | # CSS Distribution 2 | 3 | This repository is automatically synced with the main [Semantic UI](https://github.com/Semantic-Org/Semantic-UI) repository to provide lightweight CSS only version of Semantic UI. 4 | 5 | This package **does not support theming** and includes generated CSS files of the default theme only. 6 | 7 | You can view more on Semantic UI at [LearnSemantic.com](http://www.learnsemantic.com) and [Semantic-UI.com](http://www.semantic-ui.com) 8 | -------------------------------------------------------------------------------- /public/semantic-ui/components/ad.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Ad 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2013 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Advertisement 15 | *******************************/ 16 | 17 | .ui.ad { 18 | display: block; 19 | overflow: hidden; 20 | margin: 1em 0em; 21 | } 22 | .ui.ad:first-child { 23 | margin: 0em; 24 | } 25 | .ui.ad:last-child { 26 | margin: 0em; 27 | } 28 | .ui.ad iframe { 29 | margin: 0em; 30 | padding: 0em; 31 | border: none; 32 | overflow: hidden; 33 | } 34 | 35 | /*-------------- 36 | Common 37 | ---------------*/ 38 | 39 | 40 | /* Leaderboard */ 41 | .ui.leaderboard.ad { 42 | width: 728px; 43 | height: 90px; 44 | } 45 | 46 | /* Medium Rectangle */ 47 | .ui[class*="medium rectangle"].ad { 48 | width: 300px; 49 | height: 250px; 50 | } 51 | 52 | /* Large Rectangle */ 53 | .ui[class*="large rectangle"].ad { 54 | width: 336px; 55 | height: 280px; 56 | } 57 | 58 | /* Half Page */ 59 | .ui[class*="half page"].ad { 60 | width: 300px; 61 | height: 600px; 62 | } 63 | 64 | /*-------------- 65 | Square 66 | ---------------*/ 67 | 68 | 69 | /* Square */ 70 | .ui.square.ad { 71 | width: 250px; 72 | height: 250px; 73 | } 74 | 75 | /* Small Square */ 76 | .ui[class*="small square"].ad { 77 | width: 200px; 78 | height: 200px; 79 | } 80 | 81 | /*-------------- 82 | Rectangle 83 | ---------------*/ 84 | 85 | 86 | /* Small Rectangle */ 87 | .ui[class*="small rectangle"].ad { 88 | width: 180px; 89 | height: 150px; 90 | } 91 | 92 | /* Vertical Rectangle */ 93 | .ui[class*="vertical rectangle"].ad { 94 | width: 240px; 95 | height: 400px; 96 | } 97 | 98 | /*-------------- 99 | Button 100 | ---------------*/ 101 | 102 | .ui.button.ad { 103 | width: 120px; 104 | height: 90px; 105 | } 106 | .ui[class*="square button"].ad { 107 | width: 125px; 108 | height: 125px; 109 | } 110 | .ui[class*="small button"].ad { 111 | width: 120px; 112 | height: 60px; 113 | } 114 | 115 | /*-------------- 116 | Skyscrapers 117 | ---------------*/ 118 | 119 | 120 | /* Skyscraper */ 121 | .ui.skyscraper.ad { 122 | width: 120px; 123 | height: 600px; 124 | } 125 | 126 | /* Wide Skyscraper */ 127 | .ui[class*="wide skyscraper"].ad { 128 | width: 160px; 129 | } 130 | 131 | /*-------------- 132 | Banners 133 | ---------------*/ 134 | 135 | 136 | /* Banner */ 137 | .ui.banner.ad { 138 | width: 468px; 139 | height: 60px; 140 | } 141 | 142 | /* Vertical Banner */ 143 | .ui[class*="vertical banner"].ad { 144 | width: 120px; 145 | height: 240px; 146 | } 147 | 148 | /* Top Banner */ 149 | .ui[class*="top banner"].ad { 150 | width: 930px; 151 | height: 180px; 152 | } 153 | 154 | /* Half Banner */ 155 | .ui[class*="half banner"].ad { 156 | width: 234px; 157 | height: 60px; 158 | } 159 | 160 | /*-------------- 161 | Boards 162 | ---------------*/ 163 | 164 | 165 | /* Leaderboard */ 166 | .ui[class*="large leaderboard"].ad { 167 | width: 970px; 168 | height: 90px; 169 | } 170 | 171 | /* Billboard */ 172 | .ui.billboard.ad { 173 | width: 970px; 174 | height: 250px; 175 | } 176 | 177 | /*-------------- 178 | Panorama 179 | ---------------*/ 180 | 181 | 182 | /* Panorama */ 183 | .ui.panorama.ad { 184 | width: 980px; 185 | height: 120px; 186 | } 187 | 188 | /*-------------- 189 | Netboard 190 | ---------------*/ 191 | 192 | 193 | /* Netboard */ 194 | .ui.netboard.ad { 195 | width: 580px; 196 | height: 400px; 197 | } 198 | 199 | /*-------------- 200 | Mobile 201 | ---------------*/ 202 | 203 | 204 | /* Large Mobile Banner */ 205 | .ui[class*="large mobile banner"].ad { 206 | width: 320px; 207 | height: 100px; 208 | } 209 | 210 | /* Mobile Leaderboard */ 211 | .ui[class*="mobile leaderboard"].ad { 212 | width: 320px; 213 | height: 50px; 214 | } 215 | 216 | 217 | /******************************* 218 | Types 219 | *******************************/ 220 | 221 | 222 | /* Mobile Sizes */ 223 | .ui.mobile.ad { 224 | display: none; 225 | } 226 | @media only screen and (max-width: 767px) { 227 | .ui.mobile.ad { 228 | display: block; 229 | } 230 | } 231 | 232 | 233 | /******************************* 234 | Variations 235 | *******************************/ 236 | 237 | .ui.centered.ad { 238 | margin-left: auto; 239 | margin-right: auto; 240 | } 241 | .ui.test.ad { 242 | position: relative; 243 | background: #545454; 244 | } 245 | .ui.test.ad:after { 246 | position: absolute; 247 | top: 50%; 248 | left: 50%; 249 | width: 100%; 250 | text-align: center; 251 | -webkit-transform: translateX(-50%) translateY(-50%); 252 | -ms-transform: translateX(-50%) translateY(-50%); 253 | transform: translateX(-50%) translateY(-50%); 254 | content: 'Ad'; 255 | color: #FFFFFF; 256 | font-size: 1em; 257 | font-weight: bold; 258 | } 259 | .ui.mobile.test.ad:after { 260 | font-size: 0.85714286em; 261 | } 262 | .ui.test.ad[data-text]:after { 263 | content: attr(data-text); 264 | } 265 | 266 | 267 | /******************************* 268 | Theme Overrides 269 | *******************************/ 270 | 271 | 272 | 273 | /******************************* 274 | User Variable Overrides 275 | *******************************/ 276 | 277 | -------------------------------------------------------------------------------- /public/semantic-ui/components/ad.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Ad 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2013 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.ad{display:block;overflow:hidden;margin:1em 0}.ui.ad:first-child,.ui.ad:last-child{margin:0}.ui.ad iframe{margin:0;padding:0;border:none;overflow:hidden}.ui.leaderboard.ad{width:728px;height:90px}.ui[class*="medium rectangle"].ad{width:300px;height:250px}.ui[class*="large rectangle"].ad{width:336px;height:280px}.ui[class*="half page"].ad{width:300px;height:600px}.ui.square.ad{width:250px;height:250px}.ui[class*="small square"].ad{width:200px;height:200px}.ui[class*="small rectangle"].ad{width:180px;height:150px}.ui[class*="vertical rectangle"].ad{width:240px;height:400px}.ui.button.ad{width:120px;height:90px}.ui[class*="square button"].ad{width:125px;height:125px}.ui[class*="small button"].ad{width:120px;height:60px}.ui.skyscraper.ad{width:120px;height:600px}.ui[class*="wide skyscraper"].ad{width:160px}.ui.banner.ad{width:468px;height:60px}.ui[class*="vertical banner"].ad{width:120px;height:240px}.ui[class*="top banner"].ad{width:930px;height:180px}.ui[class*="half banner"].ad{width:234px;height:60px}.ui[class*="large leaderboard"].ad{width:970px;height:90px}.ui.billboard.ad{width:970px;height:250px}.ui.panorama.ad{width:980px;height:120px}.ui.netboard.ad{width:580px;height:400px}.ui[class*="large mobile banner"].ad{width:320px;height:100px}.ui[class*="mobile leaderboard"].ad{width:320px;height:50px}.ui.mobile.ad{display:none}@media only screen and (max-width:767px){.ui.mobile.ad{display:block}}.ui.centered.ad{margin-left:auto;margin-right:auto}.ui.test.ad{position:relative;background:#545454}.ui.test.ad:after{position:absolute;top:50%;left:50%;width:100%;text-align:center;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);content:'Ad';color:#FFF;font-size:1em;font-weight:700}.ui.mobile.test.ad:after{font-size:.85714286em}.ui.test.ad[data-text]:after{content:attr(data-text)} -------------------------------------------------------------------------------- /public/semantic-ui/components/breadcrumb.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Breadcrumb 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Breadcrumb 15 | *******************************/ 16 | 17 | .ui.breadcrumb { 18 | line-height: 1; 19 | display: inline-block; 20 | margin: 0em 0em; 21 | vertical-align: middle; 22 | } 23 | .ui.breadcrumb:first-child { 24 | margin-top: 0em; 25 | } 26 | .ui.breadcrumb:last-child { 27 | margin-bottom: 0em; 28 | } 29 | 30 | 31 | /******************************* 32 | Content 33 | *******************************/ 34 | 35 | 36 | /* Divider */ 37 | .ui.breadcrumb .divider { 38 | display: inline-block; 39 | opacity: 0.7; 40 | margin: 0em 0.21428571rem 0em; 41 | font-size: 0.92857143em; 42 | color: rgba(0, 0, 0, 0.4); 43 | vertical-align: baseline; 44 | } 45 | 46 | /* Link */ 47 | .ui.breadcrumb a { 48 | color: #4183C4; 49 | } 50 | .ui.breadcrumb a:hover { 51 | color: #1e70bf; 52 | } 53 | 54 | /* Icon Divider */ 55 | .ui.breadcrumb .icon.divider { 56 | font-size: 0.85714286em; 57 | vertical-align: baseline; 58 | } 59 | 60 | /* Section */ 61 | .ui.breadcrumb a.section { 62 | cursor: pointer; 63 | } 64 | .ui.breadcrumb .section { 65 | display: inline-block; 66 | margin: 0em; 67 | padding: 0em; 68 | } 69 | 70 | /* Loose Coupling */ 71 | .ui.breadcrumb.segment { 72 | display: inline-block; 73 | padding: 0.71428571em 1em; 74 | } 75 | 76 | 77 | /******************************* 78 | States 79 | *******************************/ 80 | 81 | .ui.breadcrumb .active.section { 82 | font-weight: bold; 83 | } 84 | 85 | 86 | /******************************* 87 | Variations 88 | *******************************/ 89 | 90 | .ui.mini.breadcrumb { 91 | font-size: 0.71428571rem; 92 | } 93 | .ui.tiny.breadcrumb { 94 | font-size: 0.85714286rem; 95 | } 96 | .ui.small.breadcrumb { 97 | font-size: 0.92857143rem; 98 | } 99 | .ui.breadcrumb { 100 | font-size: 1rem; 101 | } 102 | .ui.large.breadcrumb { 103 | font-size: 1.14285714rem; 104 | } 105 | .ui.big.breadcrumb { 106 | font-size: 1.28571429rem; 107 | } 108 | .ui.huge.breadcrumb { 109 | font-size: 1.42857143rem; 110 | } 111 | .ui.massive.breadcrumb { 112 | font-size: 1.71428571rem; 113 | } 114 | 115 | 116 | /******************************* 117 | Theme Overrides 118 | *******************************/ 119 | 120 | 121 | 122 | /******************************* 123 | Site Overrides 124 | *******************************/ 125 | 126 | -------------------------------------------------------------------------------- /public/semantic-ui/components/breadcrumb.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Breadcrumb 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.breadcrumb{line-height:1;display:inline-block;margin:0;vertical-align:middle}.ui.breadcrumb:first-child{margin-top:0}.ui.breadcrumb:last-child{margin-bottom:0}.ui.breadcrumb .divider{display:inline-block;opacity:.7;margin:0 .21428571rem;font-size:.92857143em;color:rgba(0,0,0,.4);vertical-align:baseline}.ui.breadcrumb a{color:#4183C4}.ui.breadcrumb a:hover{color:#1e70bf}.ui.breadcrumb .icon.divider{font-size:.85714286em;vertical-align:baseline}.ui.breadcrumb a.section{cursor:pointer}.ui.breadcrumb .section{display:inline-block;margin:0;padding:0}.ui.breadcrumb.segment{display:inline-block;padding:.71428571em 1em}.ui.breadcrumb .active.section{font-weight:700}.ui.mini.breadcrumb{font-size:.71428571rem}.ui.tiny.breadcrumb{font-size:.85714286rem}.ui.small.breadcrumb{font-size:.92857143rem}.ui.breadcrumb{font-size:1rem}.ui.large.breadcrumb{font-size:1.14285714rem}.ui.big.breadcrumb{font-size:1.28571429rem}.ui.huge.breadcrumb{font-size:1.42857143rem}.ui.massive.breadcrumb{font-size:1.71428571rem} -------------------------------------------------------------------------------- /public/semantic-ui/components/colorize.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.0.0 - Colorize 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | !function(e,n,i,t){"use strict";e.fn.colorize=function(n){var i=e.isPlainObject(n)?e.extend(!0,{},e.fn.colorize.settings,n):e.extend({},e.fn.colorize.settings),o=arguments||!1;return e(this).each(function(n){var a,r,c,s,d,g,u,l,m=e(this),f=e("")[0],h=e("")[0],p=e("")[0],v=new Image,w=i.colors,b=(i.paths,i.namespace),y=i.error,C=m.data("module-"+b);return l={checkPreconditions:function(){return l.debug("Checking pre-conditions"),!e.isPlainObject(w)||e.isEmptyObject(w)?(l.error(y.undefinedColors),!1):!0},async:function(e){i.async?setTimeout(e,0):e()},getMetadata:function(){l.debug("Grabbing metadata"),s=m.data("image")||i.image||t,d=m.data("name")||i.name||n,g=i.width||m.width(),u=i.height||m.height(),(0===g||0===u)&&l.error(y.undefinedSize)},initialize:function(){l.debug("Initializing with colors",w),l.checkPreconditions()&&l.async(function(){l.getMetadata(),l.canvas.create(),l.draw.image(function(){l.draw.colors(),l.canvas.merge()}),m.data("module-"+b,l)})},redraw:function(){l.debug("Redrawing image"),l.async(function(){l.canvas.clear(),l.draw.colors(),l.canvas.merge()})},change:{color:function(e,n){return l.debug("Changing color",e),w[e]===t?(l.error(y.missingColor),!1):(w[e]=n,void l.redraw())}},canvas:{create:function(){l.debug("Creating canvases"),f.width=g,f.height=u,h.width=g,h.height=u,p.width=g,p.height=u,a=f.getContext("2d"),r=h.getContext("2d"),c=p.getContext("2d"),m.append(f),a=m.children("canvas")[0].getContext("2d")},clear:function(e){l.debug("Clearing canvas"),c.fillStyle="#FFFFFF",c.fillRect(0,0,g,u)},merge:function(){return e.isFunction(a.blendOnto)?(a.putImageData(r.getImageData(0,0,g,u),0,0),void c.blendOnto(a,"multiply")):void l.error(y.missingPlugin)}},draw:{image:function(e){l.debug("Drawing image"),e=e||function(){},s?(v.src=s,v.onload=function(){r.drawImage(v,0,0),e()}):(l.error(y.noImage),e())},colors:function(){l.debug("Drawing color overlays",w),e.each(w,function(e,n){i.onDraw(c,d,e,n)})}},debug:function(e,n){i.debug&&(n!==t?console.info(i.name+": "+e,n):console.info(i.name+": "+e))},error:function(e){console.warn(i.name+": "+e)},invoke:function(n,o,a){var r;return a=a||Array.prototype.slice.call(arguments,2),"string"==typeof n&&C!==t&&(n=n.split("."),e.each(n,function(n,t){return e.isPlainObject(C[t])?(C=C[t],!0):e.isFunction(C[t])?(r=C[t],!0):(l.error(i.error.method),!1)})),e.isFunction(r)?r.apply(o,a):!1}},C!==t&&o?("invoke"==o[0]&&(o=Array.prototype.slice.call(o,1)),l.invoke(o[0],this,Array.prototype.slice.call(o,1))):void l.initialize()}),this},e.fn.colorize.settings={name:"Image Colorizer",debug:!0,namespace:"colorize",onDraw:function(e,n,i,t){},async:!0,colors:{},metadata:{image:"image",name:"name"},error:{noImage:"No tracing image specified",undefinedColors:"No default colors specified.",missingColor:"Attempted to change color that does not exist",missingPlugin:"Blend onto plug-in must be included",undefinedHeight:"The width or height of image canvas could not be automatically determined. Please specify a height."}}}(jQuery,window,document); -------------------------------------------------------------------------------- /public/semantic-ui/components/comment.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Comment 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Standard 15 | *******************************/ 16 | 17 | 18 | /*-------------- 19 | Comments 20 | ---------------*/ 21 | 22 | .ui.comments { 23 | margin: 1.5em 0em; 24 | max-width: 650px; 25 | } 26 | .ui.comments:first-child { 27 | margin-top: 0em; 28 | } 29 | .ui.comments:last-child { 30 | margin-bottom: 0em; 31 | } 32 | 33 | /*-------------- 34 | Comment 35 | ---------------*/ 36 | 37 | .ui.comments .comment { 38 | position: relative; 39 | background: none; 40 | margin: 0.5em 0em 0em; 41 | padding: 0.5em 0em 0em; 42 | border: none; 43 | border-top: none; 44 | line-height: 1.2; 45 | } 46 | .ui.comments .comment:first-child { 47 | margin-top: 0em; 48 | padding-top: 0em; 49 | } 50 | 51 | /*-------------------- 52 | Nested Comments 53 | ---------------------*/ 54 | 55 | .ui.comments .comment .comments { 56 | margin: 0em 0em 0.5em 0.5em; 57 | padding: 1em 0em 1em 1em; 58 | } 59 | .ui.comments .comment .comments:before { 60 | position: absolute; 61 | top: 0px; 62 | left: 0px; 63 | } 64 | .ui.comments .comment .comments .comment { 65 | border: none; 66 | border-top: none; 67 | background: none; 68 | } 69 | 70 | /*-------------- 71 | Avatar 72 | ---------------*/ 73 | 74 | .ui.comments .comment .avatar { 75 | display: block; 76 | width: 2.5em; 77 | height: auto; 78 | float: left; 79 | margin: 0.2em 0em 0em; 80 | } 81 | .ui.comments .comment img.avatar, 82 | .ui.comments .comment .avatar img { 83 | display: block; 84 | margin: 0em auto; 85 | width: 100%; 86 | height: 100%; 87 | border-radius: 0.25rem; 88 | } 89 | 90 | /*-------------- 91 | Content 92 | ---------------*/ 93 | 94 | .ui.comments .comment > .content { 95 | display: block; 96 | } 97 | 98 | /* If there is an avatar move content over */ 99 | .ui.comments .comment > .avatar ~ .content { 100 | margin-left: 3.5em; 101 | } 102 | 103 | /*-------------- 104 | Author 105 | ---------------*/ 106 | 107 | .ui.comments .comment .author { 108 | font-size: 1em; 109 | color: rgba(0, 0, 0, 0.87); 110 | font-weight: bold; 111 | } 112 | .ui.comments .comment a.author { 113 | cursor: pointer; 114 | } 115 | .ui.comments .comment a.author:hover { 116 | color: #1e70bf; 117 | } 118 | 119 | /*-------------- 120 | Metadata 121 | ---------------*/ 122 | 123 | .ui.comments .comment .metadata { 124 | display: inline-block; 125 | margin-left: 0.5em; 126 | color: rgba(0, 0, 0, 0.4); 127 | font-size: 0.875em; 128 | } 129 | .ui.comments .comment .metadata > * { 130 | display: inline-block; 131 | margin: 0em 0.5em 0em 0em; 132 | } 133 | .ui.comments .comment .metadata > :last-child { 134 | margin-right: 0em; 135 | } 136 | 137 | /*-------------------- 138 | Comment Text 139 | ---------------------*/ 140 | 141 | .ui.comments .comment .text { 142 | margin: 0.25em 0em 0.5em; 143 | font-size: 1em; 144 | word-wrap: break-word; 145 | color: rgba(0, 0, 0, 0.87); 146 | line-height: 1.3; 147 | } 148 | 149 | /*-------------------- 150 | User Actions 151 | ---------------------*/ 152 | 153 | .ui.comments .comment .actions { 154 | font-size: 0.875em; 155 | } 156 | .ui.comments .comment .actions a { 157 | cursor: pointer; 158 | display: inline-block; 159 | margin: 0em 0.75em 0em 0em; 160 | color: rgba(0, 0, 0, 0.4); 161 | } 162 | .ui.comments .comment .actions a:last-child { 163 | margin-right: 0em; 164 | } 165 | .ui.comments .comment .actions a.active, 166 | .ui.comments .comment .actions a:hover { 167 | color: rgba(0, 0, 0, 0.8); 168 | } 169 | 170 | /*-------------------- 171 | Reply Form 172 | ---------------------*/ 173 | 174 | .ui.comments > .reply.form { 175 | margin-top: 1em; 176 | } 177 | .ui.comments .comment .reply.form { 178 | width: 100%; 179 | margin-top: 1em; 180 | } 181 | .ui.comments .reply.form textarea { 182 | font-size: 1em; 183 | height: 12em; 184 | } 185 | 186 | 187 | /******************************* 188 | State 189 | *******************************/ 190 | 191 | .ui.collapsed.comments, 192 | .ui.comments .collapsed.comments, 193 | .ui.comments .collapsed.comment { 194 | display: none; 195 | } 196 | 197 | 198 | /******************************* 199 | Variations 200 | *******************************/ 201 | 202 | 203 | /*-------------------- 204 | Threaded 205 | ---------------------*/ 206 | 207 | .ui.threaded.comments .comment .comments { 208 | margin: -1.5em 0 -1em 1.25em; 209 | padding: 3em 0em 2em 2.25em; 210 | box-shadow: -1px 0px 0px rgba(34, 36, 38, 0.15); 211 | } 212 | 213 | /*-------------------- 214 | Minimal 215 | ---------------------*/ 216 | 217 | .ui.minimal.comments .comment .actions { 218 | opacity: 0; 219 | position: absolute; 220 | top: 0px; 221 | right: 0px; 222 | left: auto; 223 | -webkit-transition: opacity 0.2s ease; 224 | transition: opacity 0.2s ease; 225 | -webkit-transition-delay: 0.1s; 226 | transition-delay: 0.1s; 227 | } 228 | .ui.minimal.comments .comment > .content:hover > .actions { 229 | opacity: 1; 230 | } 231 | 232 | /*-------------------- 233 | Sizes 234 | ---------------------*/ 235 | 236 | .ui.small.comments { 237 | font-size: 0.9em; 238 | } 239 | .ui.comments { 240 | font-size: 1em; 241 | } 242 | .ui.large.comments { 243 | font-size: 1.1em; 244 | } 245 | .ui.huge.comments { 246 | font-size: 1.2em; 247 | } 248 | 249 | 250 | /******************************* 251 | Theme Overrides 252 | *******************************/ 253 | 254 | 255 | 256 | /******************************* 257 | User Variable Overrides 258 | *******************************/ 259 | 260 | -------------------------------------------------------------------------------- /public/semantic-ui/components/comment.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Comment 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.comments{margin:1.5em 0;max-width:650px}.ui.comments:first-child{margin-top:0}.ui.comments:last-child{margin-bottom:0}.ui.comments .comment{position:relative;background:0 0;margin:.5em 0 0;padding:.5em 0 0;border:none;border-top:none;line-height:1.2}.ui.comments .comment:first-child{margin-top:0;padding-top:0}.ui.comments .comment .comments{margin:0 0 .5em .5em;padding:1em 0 1em 1em}.ui.comments .comment .comments:before{position:absolute;top:0;left:0}.ui.comments .comment .comments .comment{border:none;border-top:none;background:0 0}.ui.comments .comment .avatar{display:block;width:2.5em;height:auto;float:left;margin:.2em 0 0}.ui.comments .comment .avatar img,.ui.comments .comment img.avatar{display:block;margin:0 auto;width:100%;height:100%;border-radius:.25rem}.ui.comments .comment>.content{display:block}.ui.comments .comment>.avatar~.content{margin-left:3.5em}.ui.comments .comment .author{font-size:1em;color:rgba(0,0,0,.87);font-weight:700}.ui.comments .comment a.author{cursor:pointer}.ui.comments .comment a.author:hover{color:#1e70bf}.ui.comments .comment .metadata{display:inline-block;margin-left:.5em;color:rgba(0,0,0,.4);font-size:.875em}.ui.comments .comment .metadata>*{display:inline-block;margin:0 .5em 0 0}.ui.comments .comment .metadata>:last-child{margin-right:0}.ui.comments .comment .text{margin:.25em 0 .5em;font-size:1em;word-wrap:break-word;color:rgba(0,0,0,.87);line-height:1.3}.ui.comments .comment .actions{font-size:.875em}.ui.comments .comment .actions a{cursor:pointer;display:inline-block;margin:0 .75em 0 0;color:rgba(0,0,0,.4)}.ui.comments .comment .actions a:last-child{margin-right:0}.ui.comments .comment .actions a.active,.ui.comments .comment .actions a:hover{color:rgba(0,0,0,.8)}.ui.comments>.reply.form{margin-top:1em}.ui.comments .comment .reply.form{width:100%;margin-top:1em}.ui.comments .reply.form textarea{font-size:1em;height:12em}.ui.collapsed.comments,.ui.comments .collapsed.comment,.ui.comments .collapsed.comments{display:none}.ui.threaded.comments .comment .comments{margin:-1.5em 0 -1em 1.25em;padding:3em 0 2em 2.25em;box-shadow:-1px 0 0 rgba(34,36,38,.15)}.ui.minimal.comments .comment .actions{opacity:0;position:absolute;top:0;right:0;left:auto;-webkit-transition:opacity .2s ease;transition:opacity .2s ease;-webkit-transition-delay:.1s;transition-delay:.1s}.ui.minimal.comments .comment>.content:hover>.actions{opacity:1}.ui.small.comments{font-size:.9em}.ui.comments{font-size:1em}.ui.large.comments{font-size:1.1em}.ui.huge.comments{font-size:1.2em} -------------------------------------------------------------------------------- /public/semantic-ui/components/container.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Container 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Container 15 | *******************************/ 16 | 17 | 18 | /* All Sizes */ 19 | .ui.container { 20 | display: block; 21 | max-width: 100% !important; 22 | } 23 | 24 | /* Mobile */ 25 | @media only screen and (max-width: 767px) { 26 | .ui.container { 27 | width: auto !important; 28 | margin-left: 1em !important; 29 | margin-right: 1em !important; 30 | } 31 | .ui.grid.container { 32 | width: auto !important; 33 | } 34 | .ui.relaxed.grid.container { 35 | width: auto !important; 36 | } 37 | .ui.very.relaxed.grid.container { 38 | width: auto !important; 39 | } 40 | } 41 | 42 | /* Tablet */ 43 | @media only screen and (min-width: 768px) and (max-width: 991px) { 44 | .ui.container { 45 | width: 723px; 46 | margin-left: auto !important; 47 | margin-right: auto !important; 48 | } 49 | .ui.grid.container { 50 | width: calc( 723px + 2rem ) !important; 51 | } 52 | .ui.relaxed.grid.container { 53 | width: calc( 723px + 3rem ) !important; 54 | } 55 | .ui.very.relaxed.grid.container { 56 | width: calc( 723px + 5rem ) !important; 57 | } 58 | } 59 | 60 | /* Small Monitor */ 61 | @media only screen and (min-width: 992px) and (max-width: 1199px) { 62 | .ui.container { 63 | width: 933px; 64 | margin-left: auto !important; 65 | margin-right: auto !important; 66 | } 67 | .ui.grid.container { 68 | width: calc( 933px + 2rem ) !important; 69 | } 70 | .ui.relaxed.grid.container { 71 | width: calc( 933px + 3rem ) !important; 72 | } 73 | .ui.very.relaxed.grid.container { 74 | width: calc( 933px + 5rem ) !important; 75 | } 76 | } 77 | 78 | /* Large Monitor */ 79 | @media only screen and (min-width: 1200px) { 80 | .ui.container { 81 | width: 1127px; 82 | margin-left: auto !important; 83 | margin-right: auto !important; 84 | } 85 | .ui.grid.container { 86 | width: calc( 1127px + 2rem ) !important; 87 | } 88 | .ui.relaxed.grid.container { 89 | width: calc( 1127px + 3rem ) !important; 90 | } 91 | .ui.very.relaxed.grid.container { 92 | width: calc( 1127px + 5rem ) !important; 93 | } 94 | } 95 | 96 | 97 | /******************************* 98 | Types 99 | *******************************/ 100 | 101 | 102 | /* Text Container */ 103 | .ui.text.container { 104 | font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; 105 | max-width: 700px !important; 106 | line-height: 1.5; 107 | } 108 | .ui.text.container { 109 | font-size: 1.14285714rem; 110 | } 111 | 112 | /* Fluid */ 113 | .ui.fluid.container { 114 | width: 100%; 115 | } 116 | 117 | 118 | /******************************* 119 | Variations 120 | *******************************/ 121 | 122 | .ui[class*="left aligned"].container { 123 | text-align: left; 124 | } 125 | .ui[class*="center aligned"].container { 126 | text-align: center; 127 | } 128 | .ui[class*="right aligned"].container { 129 | text-align: right; 130 | } 131 | .ui.justified.container { 132 | text-align: justify; 133 | -webkit-hyphens: auto; 134 | -moz-hyphens: auto; 135 | -ms-hyphens: auto; 136 | hyphens: auto; 137 | } 138 | 139 | 140 | /******************************* 141 | Theme Overrides 142 | *******************************/ 143 | 144 | 145 | 146 | /******************************* 147 | Site Overrides 148 | *******************************/ 149 | 150 | -------------------------------------------------------------------------------- /public/semantic-ui/components/container.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Container 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.container{display:block;max-width:100%!important}@media only screen and (max-width:767px){.ui.container{width:auto!important;margin-left:1em!important;margin-right:1em!important}.ui.grid.container,.ui.relaxed.grid.container,.ui.very.relaxed.grid.container{width:auto!important}}@media only screen and (min-width:768px) and (max-width:991px){.ui.container{width:723px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(723px + 2rem)!important}.ui.relaxed.grid.container{width:calc(723px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(723px + 5rem)!important}}@media only screen and (min-width:992px) and (max-width:1199px){.ui.container{width:933px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(933px + 2rem)!important}.ui.relaxed.grid.container{width:calc(933px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(933px + 5rem)!important}}@media only screen and (min-width:1200px){.ui.container{width:1127px;margin-left:auto!important;margin-right:auto!important}.ui.grid.container{width:calc(1127px + 2rem)!important}.ui.relaxed.grid.container{width:calc(1127px + 3rem)!important}.ui.very.relaxed.grid.container{width:calc(1127px + 5rem)!important}}.ui.text.container{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;max-width:700px!important;line-height:1.5;font-size:1.14285714rem}.ui.fluid.container{width:100%}.ui[class*="left aligned"].container{text-align:left}.ui[class*="center aligned"].container{text-align:center}.ui[class*="right aligned"].container{text-align:right}.ui.justified.container{text-align:justify;-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto} -------------------------------------------------------------------------------- /public/semantic-ui/components/dimmer.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Dimmer 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Dimmer 15 | *******************************/ 16 | 17 | .dimmable { 18 | position: relative; 19 | } 20 | .ui.dimmer { 21 | display: none; 22 | position: absolute; 23 | top: 0em !important; 24 | left: 0em !important; 25 | width: 100%; 26 | height: 100%; 27 | text-align: center; 28 | vertical-align: middle; 29 | background-color: rgba(0, 0, 0, 0.85); 30 | opacity: 0; 31 | line-height: 1; 32 | -webkit-animation-fill-mode: both; 33 | animation-fill-mode: both; 34 | -webkit-animation-duration: 0.5s; 35 | animation-duration: 0.5s; 36 | -webkit-transition: background-color 0.5s linear; 37 | transition: background-color 0.5s linear; 38 | -webkit-user-select: none; 39 | -moz-user-select: none; 40 | -ms-user-select: none; 41 | user-select: none; 42 | will-change: opacity; 43 | z-index: 1000; 44 | } 45 | 46 | /* Dimmer Content */ 47 | .ui.dimmer > .content { 48 | width: 100%; 49 | height: 100%; 50 | display: table; 51 | -webkit-user-select: text; 52 | -moz-user-select: text; 53 | -ms-user-select: text; 54 | user-select: text; 55 | } 56 | .ui.dimmer > .content > * { 57 | display: table-cell; 58 | vertical-align: middle; 59 | color: #FFFFFF; 60 | } 61 | 62 | /* Loose Coupling */ 63 | .ui.segment > .ui.dimmer { 64 | border-radius: inherit !important; 65 | } 66 | 67 | 68 | /******************************* 69 | States 70 | *******************************/ 71 | 72 | .animating.dimmable:not(body), 73 | .dimmed.dimmable:not(body) { 74 | overflow: hidden; 75 | } 76 | .dimmed.dimmable > .ui.animating.dimmer, 77 | .dimmed.dimmable > .ui.visible.dimmer, 78 | .ui.active.dimmer { 79 | display: block; 80 | opacity: 1; 81 | } 82 | .ui.disabled.dimmer { 83 | width: 0 !important; 84 | height: 0 !important; 85 | } 86 | 87 | 88 | /******************************* 89 | Variations 90 | *******************************/ 91 | 92 | 93 | /*-------------- 94 | Page 95 | ---------------*/ 96 | 97 | .ui.page.dimmer { 98 | position: fixed; 99 | -webkit-transform-style: ''; 100 | transform-style: ''; 101 | -webkit-perspective: 2000px; 102 | perspective: 2000px; 103 | -webkit-transform-origin: center center; 104 | -ms-transform-origin: center center; 105 | transform-origin: center center; 106 | } 107 | body.animating.in.dimmable, 108 | body.dimmed.dimmable { 109 | overflow: hidden; 110 | } 111 | body.dimmable > .dimmer { 112 | position: fixed; 113 | } 114 | 115 | /*-------------- 116 | Blurring 117 | ---------------*/ 118 | 119 | .blurring.dimmable > :not(.dimmer) { 120 | -webkit-filter: blur(0px) grayscale(0); 121 | filter: blur(0px) grayscale(0); 122 | -webkit-transition: 800ms -webkit-filter ease, 800ms filter ease; 123 | transition: 800ms filter ease; 124 | } 125 | .blurring.dimmed.dimmable > :not(.dimmer) { 126 | -webkit-filter: blur(5px) grayscale(0.7); 127 | filter: blur(5px) grayscale(0.7); 128 | } 129 | 130 | /* Dimmer Color */ 131 | .blurring.dimmable > .dimmer { 132 | background-color: rgba(0, 0, 0, 0.6); 133 | } 134 | .blurring.dimmable > .inverted.dimmer { 135 | background-color: rgba(255, 255, 255, 0.6); 136 | } 137 | 138 | /*-------------- 139 | Aligned 140 | ---------------*/ 141 | 142 | .ui.dimmer > .top.aligned.content > * { 143 | vertical-align: top; 144 | } 145 | .ui.dimmer > .bottom.aligned.content > * { 146 | vertical-align: bottom; 147 | } 148 | 149 | /*-------------- 150 | Inverted 151 | ---------------*/ 152 | 153 | .ui.inverted.dimmer { 154 | background-color: rgba(255, 255, 255, 0.85); 155 | } 156 | .ui.inverted.dimmer > .content > * { 157 | color: #FFFFFF; 158 | } 159 | 160 | /*-------------- 161 | Simple 162 | ---------------*/ 163 | 164 | 165 | /* Displays without javascript */ 166 | .ui.simple.dimmer { 167 | display: block; 168 | overflow: hidden; 169 | opacity: 1; 170 | width: 0%; 171 | height: 0%; 172 | z-index: -100; 173 | background-color: rgba(0, 0, 0, 0); 174 | } 175 | .dimmed.dimmable > .ui.simple.dimmer { 176 | overflow: visible; 177 | opacity: 1; 178 | width: 100%; 179 | height: 100%; 180 | background-color: rgba(0, 0, 0, 0.85); 181 | z-index: 1; 182 | } 183 | .ui.simple.inverted.dimmer { 184 | background-color: rgba(255, 255, 255, 0); 185 | } 186 | .dimmed.dimmable > .ui.simple.inverted.dimmer { 187 | background-color: rgba(255, 255, 255, 0.85); 188 | } 189 | 190 | 191 | /******************************* 192 | Theme Overrides 193 | *******************************/ 194 | 195 | 196 | 197 | /******************************* 198 | User Overrides 199 | *******************************/ 200 | 201 | -------------------------------------------------------------------------------- /public/semantic-ui/components/dimmer.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Dimmer 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.dimmable{position:relative}.ui.dimmer{display:none;position:absolute;top:0!important;left:0!important;width:100%;height:100%;text-align:center;vertical-align:middle;background-color:rgba(0,0,0,.85);opacity:0;line-height:1;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-transition:background-color .5s linear;transition:background-color .5s linear;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:opacity;z-index:1000}.ui.dimmer>.content{width:100%;height:100%;display:table;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.dimmer>.content>*{display:table-cell;vertical-align:middle;color:#FFF}.ui.segment>.ui.dimmer{border-radius:inherit!important}.animating.dimmable:not(body),.dimmed.dimmable:not(body){overflow:hidden}.dimmed.dimmable>.ui.animating.dimmer,.dimmed.dimmable>.ui.visible.dimmer,.ui.active.dimmer{display:block;opacity:1}.ui.disabled.dimmer{width:0!important;height:0!important}.ui.page.dimmer{position:fixed;-webkit-transform-style:'';transform-style:'';-webkit-perspective:2000px;perspective:2000px;-webkit-transform-origin:center center;-ms-transform-origin:center center;transform-origin:center center}body.animating.in.dimmable,body.dimmed.dimmable{overflow:hidden}body.dimmable>.dimmer{position:fixed}.blurring.dimmable>:not(.dimmer){-webkit-filter:blur(0) grayscale(0);filter:blur(0) grayscale(0);-webkit-transition:.8s -webkit-filter ease,.8s filter ease;transition:.8s filter ease}.blurring.dimmed.dimmable>:not(.dimmer){-webkit-filter:blur(5px) grayscale(.7);filter:blur(5px) grayscale(.7)}.blurring.dimmable>.dimmer{background-color:rgba(0,0,0,.6)}.blurring.dimmable>.inverted.dimmer{background-color:rgba(255,255,255,.6)}.ui.dimmer>.top.aligned.content>*{vertical-align:top}.ui.dimmer>.bottom.aligned.content>*{vertical-align:bottom}.ui.inverted.dimmer{background-color:rgba(255,255,255,.85)}.ui.inverted.dimmer>.content>*{color:#FFF}.ui.simple.dimmer{display:block;overflow:hidden;opacity:1;width:0;height:0%;z-index:-100;background-color:transparent}.dimmed.dimmable>.ui.simple.dimmer{overflow:visible;opacity:1;width:100%;height:100%;background-color:rgba(0,0,0,.85);z-index:1}.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,0)}.dimmed.dimmable>.ui.simple.inverted.dimmer{background-color:rgba(255,255,255,.85)} -------------------------------------------------------------------------------- /public/semantic-ui/components/divider.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Divider 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.divider{margin:1rem 0;line-height:1;height:0;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:rgba(0,0,0,.85);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;font-size:1rem}.ui.divider:not(.vertical):not(.horizontal){border-top:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(255,255,255,.1)}.ui.grid>.column+.divider,.ui.grid>.row>.column+.divider{left:auto}.ui.horizontal.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center}.ui.horizontal.divider:after,.ui.horizontal.divider:before{content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}.ui.horizontal.divider:before{background-position:right 1em top 50%}.ui.horizontal.divider:after{background-position:left 1em top 50%}.ui.vertical.divider{position:absolute;z-index:2;top:50%;left:50%;margin:0;padding:0;width:auto;height:50%;line-height:0;text-align:center;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ui.vertical.divider:after,.ui.vertical.divider:before{position:absolute;left:50%;content:'';z-index:3;border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(255,255,255,.1);width:0;height:calc(100% - 1rem)}.ui.vertical.divider:before{top:-100%}.ui.vertical.divider:after{top:auto;bottom:0}@media only screen and (max-width:767px){.ui.grid .stackable.row .ui.vertical.divider,.ui.stackable.grid .ui.vertical.divider{display:table;white-space:nowrap;height:auto;margin:'';overflow:hidden;line-height:1;text-align:center;position:static;top:0;left:0;-webkit-transform:none;-ms-transform:none;transform:none}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:before{left:0;border-left:none;border-right:none;content:'';display:table-cell;position:relative;top:50%;width:50%;background-repeat:no-repeat;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC)}.ui.grid .stackable.row .ui.vertical.divider:before,.ui.stackable.grid .ui.vertical.divider:before{background-position:right 1em top 50%}.ui.grid .stackable.row .ui.vertical.divider:after,.ui.stackable.grid .ui.vertical.divider:after{background-position:left 1em top 50%}}.ui.divider>.icon{margin:0;font-size:1rem;height:1em;vertical-align:middle}.ui.hidden.divider{border-color:transparent!important}.ui.hidden.divider:after,.ui.hidden.divider:before{display:none}.ui.divider.inverted,.ui.horizontal.inverted.divider,.ui.vertical.inverted.divider{color:#FFF}.ui.divider.inverted,.ui.divider.inverted:after,.ui.divider.inverted:before{border-top-color:rgba(34,36,38,.15)!important;border-left-color:rgba(34,36,38,.15)!important;border-bottom-color:rgba(255,255,255,.15)!important;border-right-color:rgba(255,255,255,.15)!important}.ui.fitted.divider{margin:0}.ui.clearing.divider{clear:both}.ui.section.divider{margin-top:2rem;margin-bottom:2rem} -------------------------------------------------------------------------------- /public/semantic-ui/components/embed.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Types 15 | *******************************/ 16 | 17 | .ui.embed { 18 | position: relative; 19 | max-width: 100%; 20 | height: 0px; 21 | overflow: hidden; 22 | background: #DCDDDE; 23 | padding-bottom: 56.25%; 24 | } 25 | 26 | /*----------------- 27 | Embedded Content 28 | ------------------*/ 29 | 30 | .ui.embed iframe, 31 | .ui.embed embed, 32 | .ui.embed object { 33 | position: absolute; 34 | border: none; 35 | width: 100%; 36 | height: 100%; 37 | top: 0px; 38 | left: 0px; 39 | margin: 0em; 40 | padding: 0em; 41 | } 42 | 43 | /*----------------- 44 | Embed 45 | ------------------*/ 46 | 47 | .ui.embed > .embed { 48 | display: none; 49 | } 50 | 51 | /*-------------- 52 | Placeholder 53 | ---------------*/ 54 | 55 | .ui.embed > .placeholder { 56 | position: absolute; 57 | cursor: pointer; 58 | top: 0px; 59 | left: 0px; 60 | display: block; 61 | width: 100%; 62 | height: 100%; 63 | background-color: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 64 | } 65 | 66 | /*-------------- 67 | Icon 68 | ---------------*/ 69 | 70 | .ui.embed > .icon { 71 | cursor: pointer; 72 | position: absolute; 73 | top: 0px; 74 | left: 0px; 75 | width: 100%; 76 | height: 100%; 77 | z-index: 2; 78 | } 79 | .ui.embed > .icon:after { 80 | position: absolute; 81 | top: 0%; 82 | left: 0%; 83 | width: 100%; 84 | height: 100%; 85 | z-index: 3; 86 | content: ''; 87 | background: -webkit-radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 88 | background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 89 | opacity: 0.5; 90 | -webkit-transition: opacity 0.5s ease; 91 | transition: opacity 0.5s ease; 92 | } 93 | .ui.embed > .icon:before { 94 | position: absolute; 95 | top: 50%; 96 | left: 50%; 97 | z-index: 4; 98 | -webkit-transform: translateX(-50%) translateY(-50%); 99 | -ms-transform: translateX(-50%) translateY(-50%); 100 | transform: translateX(-50%) translateY(-50%); 101 | color: #FFFFFF; 102 | font-size: 6rem; 103 | text-shadow: 0px 2px 10px rgba(34, 36, 38, 0.2); 104 | -webkit-transition: opacity 0.5s ease, color 0.5s ease; 105 | transition: opacity 0.5s ease, color 0.5s ease; 106 | z-index: 10; 107 | } 108 | 109 | 110 | /******************************* 111 | States 112 | *******************************/ 113 | 114 | 115 | /*-------------- 116 | Hover 117 | ---------------*/ 118 | 119 | .ui.embed .icon:hover:after { 120 | background: -webkit-radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 121 | background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 122 | opacity: 1; 123 | } 124 | .ui.embed .icon:hover:before { 125 | color: #FFFFFF; 126 | } 127 | 128 | /*-------------- 129 | Active 130 | ---------------*/ 131 | 132 | .ui.active.embed > .icon, 133 | .ui.active.embed > .placeholder { 134 | display: none; 135 | } 136 | .ui.active.embed > .embed { 137 | display: block; 138 | } 139 | 140 | 141 | /******************************* 142 | Video Overrides 143 | *******************************/ 144 | 145 | 146 | 147 | /******************************* 148 | Site Overrides 149 | *******************************/ 150 | 151 | 152 | 153 | /******************************* 154 | Variations 155 | *******************************/ 156 | 157 | .ui.square.embed { 158 | padding-bottom: 100%; 159 | } 160 | .ui[class*="4:3"].embed { 161 | padding-bottom: 75%; 162 | } 163 | .ui[class*="16:9"].embed { 164 | padding-bottom: 56.25%; 165 | } 166 | .ui[class*="21:9"].embed { 167 | padding-bottom: 42.85714286%; 168 | } 169 | -------------------------------------------------------------------------------- /public/semantic-ui/components/embed.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.embed{position:relative;max-width:100%;height:0;overflow:hidden;background:#DCDDDE;padding-bottom:56.25%}.ui.embed embed,.ui.embed iframe,.ui.embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0}.ui.embed>.embed{display:none}.ui.embed>.placeholder{position:absolute;cursor:pointer;top:0;left:0;display:block;width:100%;height:100%;background-color:radial-gradient(transparent 45%,rgba(0,0,0,.3))}.ui.embed>.icon{cursor:pointer;position:absolute;top:0;left:0;width:100%;height:100%;z-index:2}.ui.embed>.icon:after{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3;content:'';background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:.5;-webkit-transition:opacity .5s ease;transition:opacity .5s ease}.ui.embed>.icon:before{position:absolute;top:50%;left:50%;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%);color:#FFF;font-size:6rem;text-shadow:0 2px 10px rgba(34,36,38,.2);-webkit-transition:opacity .5s ease,color .5s ease;transition:opacity .5s ease,color .5s ease;z-index:10}.ui.embed .icon:hover:after{background:-webkit-radial-gradient(transparent 45%,rgba(0,0,0,.3));background:radial-gradient(transparent 45%,rgba(0,0,0,.3));opacity:1}.ui.embed .icon:hover:before{color:#FFF}.ui.active.embed>.icon,.ui.active.embed>.placeholder{display:none}.ui.active.embed>.embed{display:block}.ui.square.embed{padding-bottom:100%}.ui[class*="4:3"].embed{padding-bottom:75%}.ui[class*="16:9"].embed{padding-bottom:56.25%}.ui[class*="21:9"].embed{padding-bottom:42.85714286%} -------------------------------------------------------------------------------- /public/semantic-ui/components/feed.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Feed 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.feed{margin:1em 0}.ui.feed:first-child{margin-top:0}.ui.feed:last-child{margin-bottom:0}.ui.feed>.event{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;width:100%;padding:.21428571rem 0;margin:0;background:0 0;border-top:none}.ui.feed>.event:first-child{border-top:0;padding-top:0}.ui.feed>.event:last-child{padding-bottom:0}.ui.feed>.event>.label{display:block;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:2.5em;height:auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;text-align:left}.ui.feed>.event>.label .icon{opacity:1;font-size:1.5em;width:100%;padding:.25em;background:0 0;border:none;border-radius:none;color:rgba(0,0,0,.6)}.ui.feed>.event>.label img{width:100%;height:auto;border-radius:500rem}.ui.feed>.event>.label+.content{margin:.5em 0 .35714286em 1.14285714em}.ui.feed>.event>.content{display:block;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;text-align:left;word-wrap:break-word}.ui.feed>.event:last-child>.content{padding-bottom:0}.ui.feed>.event>.content a{cursor:pointer}.ui.feed>.event>.content .date{margin:-.5rem 0 0;padding:0;font-weight:400;font-size:1em;font-style:normal;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .summary{margin:0;font-size:1em;font-weight:700;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .summary img{display:inline-block;width:auto;height:10em;margin:-.25em .25em 0 0;border-radius:.25em;vertical-align:middle}.ui.feed>.event>.content .user{display:inline-block;font-weight:700;margin-right:0;vertical-align:baseline}.ui.feed>.event>.content .user img{margin:-.25em .25em 0 0;width:auto;height:10em;vertical-align:middle}.ui.feed>.event>.content .summary>.date{display:inline-block;float:none;font-weight:400;font-size:.85714286em;font-style:normal;margin:0 0 0 .5em;padding:0;color:rgba(0,0,0,.4)}.ui.feed>.event>.content .extra{margin:.5em 0 0;background:0 0;padding:0;color:rgba(0,0,0,.87)}.ui.feed>.event>.content .extra.images img{display:inline-block;margin:0 .25em 0 0;width:6em}.ui.feed>.event>.content .extra.text{padding:0;border-left:none;font-size:1em;max-width:500px;line-height:1.4285em}.ui.feed>.event>.content .meta{display:inline-block;font-size:.85714286em;margin:.5em 0 0;background:0 0;border:none;border-radius:0;box-shadow:none;padding:0;color:rgba(0,0,0,.6)}.ui.feed>.event>.content .meta>*{position:relative;margin-left:.75em}.ui.feed>.event>.content .meta>:after{content:'';color:rgba(0,0,0,.2);top:0;left:-1em;opacity:1;position:absolute;vertical-align:top}.ui.feed>.event>.content .meta .like{color:'';-webkit-transition:.2s color ease;transition:.2s color ease}.ui.feed>.event>.content .meta .like:hover .icon{color:#FF2733}.ui.feed>.event>.content .meta .active.like .icon{color:#EF404A}.ui.feed>.event>.content .meta>:first-child{margin-left:0}.ui.feed>.event>.content .meta>:first-child::after{display:none}.ui.feed>.event>.content .meta a,.ui.feed>.event>.content .meta>.icon{cursor:pointer;opacity:1;color:rgba(0,0,0,.5);-webkit-transition:color .1s ease;transition:color .1s ease}.ui.feed>.event>.content .meta a:hover,.ui.feed>.event>.content .meta a:hover .icon,.ui.feed>.event>.content .meta>.icon:hover{color:rgba(0,0,0,.95)}.ui.small.feed{font-size:.92857143rem}.ui.feed{font-size:1rem}.ui.large.feed{font-size:1.14285714rem} -------------------------------------------------------------------------------- /public/semantic-ui/components/image.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Image 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.image{position:relative;display:inline-block;vertical-align:middle;max-width:100%;background-color:transparent}img.ui.image{display:block}.ui.image img,.ui.image svg{display:block;max-width:100%;height:auto}.ui.hidden.image,.ui.hidden.images{display:none}.ui.disabled.image,.ui.disabled.images{cursor:default;opacity:.45}.ui.inline.image,.ui.inline.image img,.ui.inline.image svg{display:inline-block}.ui.top.aligned.image,.ui.top.aligned.image img,.ui.top.aligned.image svg,.ui.top.aligned.images .image{display:inline-block;vertical-align:top}.ui.middle.aligned.image,.ui.middle.aligned.image img,.ui.middle.aligned.image svg,.ui.middle.aligned.images .image{display:inline-block;vertical-align:middle}.ui.bottom.aligned.image,.ui.bottom.aligned.image img,.ui.bottom.aligned.image svg,.ui.bottom.aligned.images .image{display:inline-block;vertical-align:bottom}.ui.rounded.image,.ui.rounded.image>*,.ui.rounded.images .image,.ui.rounded.images .image>*{border-radius:.3125em}.ui.bordered.image img,.ui.bordered.image svg,.ui.bordered.images .image,.ui.bordered.images img,.ui.bordered.images svg,img.ui.bordered.image{border:1px solid rgba(0,0,0,.1)}.ui.circular.image,.ui.circular.images{overflow:hidden}.ui.circular.image,.ui.circular.image>*,.ui.circular.images .image,.ui.circular.images .image>*{border-radius:500rem}.ui.fluid.image,.ui.fluid.image img,.ui.fluid.image svg,.ui.fluid.images,.ui.fluid.images img,.ui.fluid.images svg{display:block;width:100%;height:auto}.ui.avatar.image,.ui.avatar.image img,.ui.avatar.image svg,.ui.avatar.images .image,.ui.avatar.images img,.ui.avatar.images svg{margin-right:.25em;display:inline-block;width:2em;height:2em;border-radius:500rem}.ui.spaced.image{display:inline-block!important;margin-left:.5em;margin-right:.5em}.ui[class*="left spaced"].image{margin-left:.5em;margin-right:0}.ui[class*="right spaced"].image{margin-left:0;margin-right:.5em}.ui.floated.image,.ui.floated.images{float:left;margin-right:1em;margin-bottom:1em}.ui.right.floated.image,.ui.right.floated.images{float:right;margin-right:0;margin-bottom:1em;margin-left:1em}.ui.floated.image:last-child,.ui.floated.images:last-child{margin-bottom:0}.ui.centered.image,.ui.centered.images{margin-left:auto;margin-right:auto}.ui.mini.image,.ui.mini.images .image,.ui.mini.images img,.ui.mini.images svg{width:35px;height:auto;font-size:.71428571rem}.ui.tiny.image,.ui.tiny.images .image,.ui.tiny.images img,.ui.tiny.images svg{width:80px;height:auto;font-size:.85714286rem}.ui.small.image,.ui.small.images .image,.ui.small.images img,.ui.small.images svg{width:150px;height:auto;font-size:.92857143rem}.ui.medium.image,.ui.medium.images .image,.ui.medium.images img,.ui.medium.images svg{width:300px;height:auto;font-size:1rem}.ui.large.image,.ui.large.images .image,.ui.large.images img,.ui.large.images svg{width:450px;height:auto;font-size:1.14285714rem}.ui.big.image,.ui.big.images .image,.ui.big.images img,.ui.big.images svg{width:600px;height:auto;font-size:1.28571429rem}.ui.huge.image,.ui.huge.images .image,.ui.huge.images img,.ui.huge.images svg{width:800px;height:auto;font-size:1.42857143rem}.ui.massive.image,.ui.massive.images .image,.ui.massive.images img,.ui.massive.images svg{width:960px;height:auto;font-size:1.71428571rem}.ui.images{font-size:0;margin:0 -.25rem}.ui.images .image,.ui.images img,.ui.images svg{display:inline-block;margin:0 .25rem .5rem} -------------------------------------------------------------------------------- /public/semantic-ui/components/item.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Item 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.items>.item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1em 0;width:100%;min-height:0;background:0 0;padding:0;border:none;border-radius:0;box-shadow:none;-webkit-transition:box-shadow .1s ease;transition:box-shadow .1s ease;z-index:''}.ui.items>.item a{cursor:pointer}.ui.items{margin:1.5em 0}.ui.items:first-child{margin-top:0!important}.ui.items:last-child{margin-bottom:0!important}.ui.items>.item:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item:first-child{margin-top:0}.ui.items>.item:last-child{margin-bottom:0}.ui.items>.item>.image{position:relative;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;float:none;margin:0;padding:0;max-height:'';-webkit-align-self:top;-ms-flex-item-align:top;align-self:top}.ui.items>.item>.image>img{display:block;width:100%;height:auto;border-radius:.125rem;border:none}.ui.items>.item>.image:only-child>img{border-radius:0}.ui.items>.item>.content{display:block;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;background:0 0;margin:0;padding:0;box-shadow:none;font-size:1em;border:none;border-radius:0}.ui.items>.item>.content:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image+.content{min-width:0;width:auto;display:block;margin-left:0;-webkit-align-self:top;-ms-flex-item-align:top;align-self:top;padding-left:1.5em}.ui.items>.item>.content>.header{display:inline-block;margin:-.21425em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;color:rgba(0,0,0,.85)}.ui.items>.item>.content>.header:not(.ui){font-size:1.28571429em}.ui.items>.item [class*="left floated"]{float:left}.ui.items>.item [class*="right floated"]{float:right}.ui.items>.item .content img{-webkit-align-self:middle;-ms-flex-item-align:middle;align-self:middle;width:''}.ui.items>.item .avatar img,.ui.items>.item img.avatar{width:'';height:'';border-radius:500rem}.ui.items>.item>.content>.description{margin-top:.6em;max-width:auto;font-size:1em;line-height:1.4285em;color:rgba(0,0,0,.87)}.ui.items>.item>.content p{margin:0 0 .5em}.ui.items>.item>.content p:last-child{margin-bottom:0}.ui.items>.item .meta{margin:.5em 0;font-size:1em;line-height:1em;color:rgba(0,0,0,.6)}.ui.items>.item .meta *{margin-right:.3em}.ui.items>.item .meta :last-child{margin-right:0}.ui.items>.item .meta [class*="right floated"]{margin-right:0;margin-left:.3em}.ui.items>.item>.content a:not(.ui){color:'';-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content a:not(.ui):hover{color:''}.ui.items>.item>.content>a.header{color:rgba(0,0,0,.85)}.ui.items>.item>.content>a.header:hover{color:#1e70bf}.ui.items>.item .meta>a:not(.ui){color:rgba(0,0,0,.4)}.ui.items>.item .meta>a:not(.ui):hover{color:rgba(0,0,0,.87)}.ui.items>.item>.content .favorite.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .favorite.icon:hover{opacity:1;color:#FFB70A}.ui.items>.item>.content .active.favorite.icon{color:#FFE623}.ui.items>.item>.content .like.icon{cursor:pointer;opacity:.75;-webkit-transition:color .1s ease;transition:color .1s ease}.ui.items>.item>.content .like.icon:hover{opacity:1;color:#FF2733}.ui.items>.item>.content .active.like.icon{color:#FF2733}.ui.items>.item .extra{display:block;position:relative;background:0 0;margin:.5rem 0 0;width:100%;padding:0;top:0;left:0;color:rgba(0,0,0,.4);box-shadow:none;-webkit-transition:color .1s ease;transition:color .1s ease;border-top:none}.ui.items>.item .extra>*{margin:.25rem .5rem .25rem 0}.ui.items>.item .extra>[class*="right floated"]{margin:.25rem 0 .25rem .5rem}.ui.items>.item .extra:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.items>.item>.image:not(.ui){width:175px}@media only screen and (min-width:768px) and (max-width:991px){.ui.items>.item{margin:1em 0}.ui.items>.item>.image:not(.ui){width:150px}.ui.items>.item>.image+.content{display:block;padding:0 0 0 1em}}@media only screen and (max-width:767px){.ui.items>.item{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;margin:2em 0}.ui.items>.item>.image{display:block;margin-left:auto;margin-right:auto}.ui.items>.item>.image,.ui.items>.item>.image>img{max-width:100%!important;width:auto!important;max-height:250px!important}.ui.items>.item>.image+.content{display:block;padding:1.5em 0 0}}.ui.items>.item>.image+[class*="top aligned"].content{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.ui.items>.item>.image+[class*="middle aligned"].content{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.ui.items>.item>.image+[class*="bottom aligned"].content{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.ui.relaxed.items>.item{margin:1.5em 0}.ui[class*="very relaxed"].items>.item{margin:2em 0}.ui.divided.items>.item{border-top:1px solid rgba(34,36,38,.15);margin:0;padding:1em 0}.ui.divided.items>.item:first-child{border-top:none;margin-top:0!important;padding-top:0!important}.ui.divided.items>.item:last-child{margin-bottom:0!important;padding-bottom:0!important}.ui.relaxed.divided.items>.item{margin:0;padding:1.5em 0}.ui[class*="very relaxed"].divided.items>.item{margin:0;padding:2em 0}.ui.items a.item:hover,.ui.link.items>.item:hover{cursor:pointer}.ui.items a.item:hover .content .header,.ui.link.items>.item:hover .content .header{color:#1e70bf}.ui.items>.item{font-size:1em} -------------------------------------------------------------------------------- /public/semantic-ui/components/loader.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Loader 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.loader{display:none;position:absolute;top:50%;left:50%;margin:0;text-align:center;z-index:1000;-webkit-transform:translateX(-50%) translateY(-50%);-ms-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.ui.loader:before{position:absolute;content:'';top:0;left:50%;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loader:after{position:absolute;content:'';top:0;left:50%;-webkit-animation:loader .6s linear;animation:loader .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}@-webkit-keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loader{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.ui.loader:after,.ui.loader:before{width:2.2585em;height:2.2585em;margin:0 0 0 -1.12925em}.ui.mini.loader:after,.ui.mini.loader:before{width:1.2857em;height:1.2857em;margin:0 0 0 -.64285em}.ui.small.loader:after,.ui.small.loader:before{width:1.7142em;height:1.7142em;margin:0 0 0 -.8571em}.ui.large.loader:after,.ui.large.loader:before{width:4.5714em;height:4.5714em;margin:0 0 0 -2.2857em}.ui.dimmer .loader{display:block}.ui.dimmer .ui.loader{color:rgba(255,255,255,.9)}.ui.dimmer .ui.loader:before{border-color:rgba(255,255,255,.15)}.ui.dimmer .ui.loader:after{border-color:#FFF transparent transparent}.ui.inverted.dimmer .ui.loader{color:rgba(0,0,0,.87)}.ui.inverted.dimmer .ui.loader:before{border-color:rgba(0,0,0,.1)}.ui.inverted.dimmer .ui.loader:after{border-color:#767676 transparent transparent}.ui.text.loader{width:auto!important;height:auto!important;text-align:center;font-style:normal}.ui.indeterminate.loader:after{-webkit-animation-direction:reverse;animation-direction:reverse;-webkit-animation-duration:1.2s;animation-duration:1.2s}.ui.loader.active,.ui.loader.visible{display:block}.ui.loader.disabled,.ui.loader.hidden{display:none}.ui.inverted.dimmer .ui.mini.loader,.ui.mini.loader{width:1.2857em;height:1.2857em;font-size:.71428571em}.ui.inverted.dimmer .ui.small.loader,.ui.small.loader{width:1.7142em;height:1.7142em;font-size:.92857143em}.ui.inverted.dimmer .ui.loader,.ui.loader{width:2.2585em;height:2.2585em;font-size:1em}.ui.inverted.dimmer .ui.loader.large,.ui.loader.large{width:4.5714em;height:4.5714em;font-size:1.14285714em}.ui.mini.text.loader{min-width:1.2857em;padding-top:1.99998571em}.ui.small.text.loader{min-width:1.7142em;padding-top:2.42848571em}.ui.text.loader{min-width:2.2585em;padding-top:2.97278571em}.ui.large.text.loader{min-width:4.5714em;padding-top:5.28568571em}.ui.inverted.loader{color:rgba(255,255,255,.9)}.ui.inverted.loader:before{border-color:rgba(255,255,255,.15)}.ui.inverted.loader:after{border-top-color:#FFF}.ui.inline.loader{position:relative;vertical-align:middle;margin:0;left:0;top:0;-webkit-transform:none;-ms-transform:none;transform:none}.ui.inline.loader.active,.ui.inline.loader.visible{display:inline-block}.ui.centered.inline.loader.active,.ui.centered.inline.loader.visible{display:block;margin-left:auto;margin-right:auto} -------------------------------------------------------------------------------- /public/semantic-ui/components/message.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Message 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.message{position:relative;min-height:1em;margin:1em 0;background:#F8F8F9;padding:1em 1.5em;line-height:1.4285em;color:rgba(0,0,0,.87);-webkit-transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;transition:opacity .1s ease,color .1s ease,background .1s ease,box-shadow .1s ease;border-radius:.28571429rem;box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 0 0 0 transparent}.ui.message:first-child{margin-top:0}.ui.message:last-child{margin-bottom:0}.ui.message .header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;margin:-.14285em 0 0}.ui.message .header:not(.ui){font-size:1.14285714em}.ui.message p{opacity:.85;margin:.75em 0}.ui.message p:first-child{margin-top:0}.ui.message p:last-child{margin-bottom:0}.ui.message .header+p{margin-top:.25em}.ui.message .list:not(.ui){text-align:left;padding:0;opacity:.85;list-style-position:inside;margin:.5em 0 0}.ui.message .list:not(.ui):first-child{margin-top:0}.ui.message .list:not(.ui):last-child{margin-bottom:0}.ui.message .list:not(.ui) li{position:relative;list-style-type:none;margin:0 0 .3em 1em;padding:0}.ui.message .list:not(.ui) li:before{position:absolute;content:'•';left:-1em;height:100%;vertical-align:baseline}.ui.message .list:not(.ui) li:last-child{margin-bottom:0}.ui.message>.icon{margin-right:.6em}.ui.message>.close.icon{cursor:pointer;position:absolute;margin:0;top:.78575em;right:.5em;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.message>.close.icon:hover{opacity:1}.ui.message>:first-child{margin-top:0}.ui.message>:last-child{margin-bottom:0}.ui.dropdown .menu>.message{margin:0 -1px}.ui.visible.visible.visible.visible.message{display:block}.ui.icon.visible.visible.visible.visible.message{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ui.hidden.hidden.hidden.hidden.message{display:none}.ui.compact.message{display:inline-block}.ui.attached.message{margin-bottom:-1px;border-radius:.28571429rem .28571429rem 0 0;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset;margin-left:-1px;margin-right:-1px}.ui.attached+.ui.attached.message:not(.top):not(.bottom){margin-top:-1px;border-radius:0}.ui.bottom.attached.message{margin-top:-1px;border-radius:0 0 .28571429rem .28571429rem;box-shadow:0 0 0 1px rgba(34,36,38,.15) inset,0 1px 2px 0 rgba(34,36,38,.15)}.ui.bottom.attached.message:not(:last-child){margin-bottom:1em}.ui.attached.icon.message{width:auto}.ui.icon.message{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.ui.icon.message>.icon:not(.close){display:block;-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;line-height:1;vertical-align:middle;font-size:3em;opacity:.8}.ui.icon.message>.content{display:block;-webkit-box-flex:1;-webkit-flex:1 1 auto;-ms-flex:1 1 auto;flex:1 1 auto;vertical-align:middle}.ui.icon.message .icon:not(.close)+.content{padding-left:0}.ui.icon.message .circular.icon{width:1em}.ui.floating.message{box-shadow:0 0 0 1px rgba(34,36,38,.22) inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08)}.ui.positive.message{background-color:#FCFFF5;color:#2C662D}.ui.attached.positive.message,.ui.positive.message{box-shadow:0 0 0 1px #A3C293 inset,0 0 0 0 transparent}.ui.positive.message .header{color:#1A531B}.ui.negative.message{background-color:#FFF6F6;color:#9F3A38}.ui.attached.negative.message,.ui.negative.message{box-shadow:0 0 0 1px #E0B4B4 inset,0 0 0 0 transparent}.ui.negative.message .header{color:#912D2B}.ui.info.message{background-color:#F8FFFF;color:#276F86}.ui.attached.info.message,.ui.info.message{box-shadow:0 0 0 1px #A9D5DE inset,0 0 0 0 transparent}.ui.info.message .header{color:#0E566C}.ui.warning.message{background-color:#FFFAF3;color:#573A08}.ui.attached.warning.message,.ui.warning.message{box-shadow:0 0 0 1px #C9BA9B inset,0 0 0 0 transparent}.ui.warning.message .header{color:#794B02}.ui.error.message{background-color:#FFF6F6;color:#9F3A38}.ui.attached.error.message,.ui.error.message{box-shadow:0 0 0 1px #E0B4B4 inset,0 0 0 0 transparent}.ui.error.message .header{color:#912D2B}.ui.success.message{background-color:#FCFFF5;color:#2C662D}.ui.attached.success.message,.ui.success.message{box-shadow:0 0 0 1px #A3C293 inset,0 0 0 0 transparent}.ui.success.message .header{color:#1A531B}.ui.black.message,.ui.inverted.message{background-color:#1B1C1D;color:rgba(255,255,255,.9)}.ui.red.message{background-color:#FFE8E6;color:#DB2828}.ui.red.message .header{color:#c82121}.ui.orange.message{background-color:#FFEDDE;color:#F2711C}.ui.orange.message .header{color:#e7640d}.ui.yellow.message{background-color:#FFF8DB;color:#B58105}.ui.yellow.message .header{color:#9c6f04}.ui.olive.message{background-color:#FBFDEF;color:#8ABC1E}.ui.olive.message .header{color:#7aa61a}.ui.green.message{background-color:#E5F9E7;color:#1EBC30}.ui.green.message .header{color:#1aa62a}.ui.teal.message{background-color:#E1F7F7;color:#10A3A3}.ui.teal.message .header{color:#0e8c8c}.ui.blue.message{background-color:#DFF0FF;color:#2185D0}.ui.blue.message .header{color:#1e77ba}.ui.violet.message{background-color:#EAE7FF;color:#6435C9}.ui.violet.message .header{color:#5a30b5}.ui.purple.message{background-color:#F6E7FF;color:#A333C8}.ui.purple.message .header{color:#922eb4}.ui.pink.message{background-color:#FFE3FB;color:#E03997}.ui.pink.message .header{color:#dd238b}.ui.brown.message{background-color:#F1E2D3;color:#A5673F}.ui.brown.message .header{color:#935b38}.ui.small.message{font-size:.92857143em}.ui.message{font-size:1em}.ui.large.message{font-size:1.14285714em}.ui.huge.message{font-size:1.42857143em}.ui.massive.message{font-size:1.71428571em} -------------------------------------------------------------------------------- /public/semantic-ui/components/nag.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Nag 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Nag 15 | *******************************/ 16 | 17 | .ui.nag { 18 | display: none; 19 | opacity: 0.95; 20 | position: relative; 21 | top: 0em; 22 | left: 0px; 23 | z-index: 999; 24 | min-height: 0em; 25 | width: 100%; 26 | margin: 0em; 27 | padding: 0.75em 1em; 28 | background: #555555; 29 | box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.2); 30 | font-size: 1rem; 31 | text-align: center; 32 | color: rgba(0, 0, 0, 0.87); 33 | border-radius: 0em 0em 0.28571429rem 0.28571429rem; 34 | -webkit-transition: 0.2s background ease; 35 | transition: 0.2s background ease; 36 | } 37 | a.ui.nag { 38 | cursor: pointer; 39 | } 40 | .ui.nag > .title { 41 | display: inline-block; 42 | margin: 0em 0.5em; 43 | color: #FFFFFF; 44 | } 45 | .ui.nag > .close.icon { 46 | cursor: pointer; 47 | opacity: 0.4; 48 | position: absolute; 49 | top: 50%; 50 | right: 1em; 51 | font-size: 1em; 52 | margin: -0.5em 0em 0em; 53 | color: #FFFFFF; 54 | -webkit-transition: opacity 0.2s ease; 55 | transition: opacity 0.2s ease; 56 | } 57 | 58 | 59 | /******************************* 60 | States 61 | *******************************/ 62 | 63 | 64 | /* Hover */ 65 | .ui.nag:hover { 66 | background: #555555; 67 | opacity: 1; 68 | } 69 | .ui.nag .close:hover { 70 | opacity: 1; 71 | } 72 | 73 | 74 | /******************************* 75 | Variations 76 | *******************************/ 77 | 78 | 79 | /*-------------- 80 | Static 81 | ---------------*/ 82 | 83 | .ui.overlay.nag { 84 | position: absolute; 85 | display: block; 86 | } 87 | 88 | /*-------------- 89 | Fixed 90 | ---------------*/ 91 | 92 | .ui.fixed.nag { 93 | position: fixed; 94 | } 95 | 96 | /*-------------- 97 | Bottom 98 | ---------------*/ 99 | 100 | .ui.bottom.nags, 101 | .ui.bottom.nag { 102 | border-radius: 0.28571429rem 0.28571429rem 0em 0em; 103 | top: auto; 104 | bottom: 0em; 105 | } 106 | 107 | /*-------------- 108 | White 109 | ---------------*/ 110 | 111 | .ui.inverted.nags .nag, 112 | .ui.inverted.nag { 113 | background-color: #F3F4F5; 114 | color: rgba(0, 0, 0, 0.85); 115 | } 116 | .ui.inverted.nags .nag .close, 117 | .ui.inverted.nags .nag .title, 118 | .ui.inverted.nag .close, 119 | .ui.inverted.nag .title { 120 | color: rgba(0, 0, 0, 0.4); 121 | } 122 | 123 | 124 | /******************************* 125 | Groups 126 | *******************************/ 127 | 128 | .ui.nags .nag { 129 | border-radius: 0em !important; 130 | } 131 | .ui.nags .nag:last-child { 132 | border-radius: 0em 0em 0.28571429rem 0.28571429rem; 133 | } 134 | .ui.bottom.nags .nag:last-child { 135 | border-radius: 0.28571429rem 0.28571429rem 0em 0em; 136 | } 137 | 138 | 139 | /******************************* 140 | Theme Overrides 141 | *******************************/ 142 | 143 | 144 | 145 | /******************************* 146 | User Overrides 147 | *******************************/ 148 | 149 | -------------------------------------------------------------------------------- /public/semantic-ui/components/nag.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Nag 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#555;box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:.2s background ease;transition:.2s background ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#FFF}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#FFF;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:hover{background:#555;opacity:1}.ui.nag .close:hover{opacity:1}.ui.overlay.nag{position:absolute;display:block}.ui.fixed.nag{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#F3F4F5;color:rgba(0,0,0,.85)}.ui.inverted.nag .close,.ui.inverted.nag .title,.ui.inverted.nags .nag .close,.ui.inverted.nags .nag .title{color:rgba(0,0,0,.4)}.ui.nags .nag{border-radius:0!important}.ui.nags .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:last-child{border-radius:.28571429rem .28571429rem 0 0} -------------------------------------------------------------------------------- /public/semantic-ui/components/nag.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Nag 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | !function(e,o,t,n){"use strict";e.fn.nag=function(t){var i,s=e(this),a=s.selector||"",r=(new Date).getTime(),c=[],l=arguments[0],g="string"==typeof l,u=[].slice.call(arguments,1);return s.each(function(){var s,d=e.isPlainObject(t)?e.extend(!0,{},e.fn.nag.settings,t):e.extend({},e.fn.nag.settings),m=(d.className,d.selector),f=d.error,p=d.namespace,h="."+p,b=p+"-module",v=e(this),y=(v.find(m.close),e(d.context?d.context:"body")),k=this,S=v.data(b);o.requestAnimationFrame||o.mozRequestAnimationFrame||o.webkitRequestAnimationFrame||o.msRequestAnimationFrame||function(e){setTimeout(e,0)};s={initialize:function(){s.verbose("Initializing element"),v.on("click"+h,m.close,s.dismiss).data(b,s),d.detachable&&v.parent()[0]!==y[0]&&v.detach().prependTo(y),d.displayTime>0&&setTimeout(s.hide,d.displayTime),s.show()},destroy:function(){s.verbose("Destroying instance"),v.removeData(b).off(h)},show:function(){s.should.show()&&!v.is(":visible")&&(s.debug("Showing nag",d.animation.show),"fade"==d.animation.show?v.fadeIn(d.duration,d.easing):v.slideDown(d.duration,d.easing))},hide:function(){s.debug("Showing nag",d.animation.hide),"fade"==d.animation.show?v.fadeIn(d.duration,d.easing):v.slideUp(d.duration,d.easing)},onHide:function(){s.debug("Removing nag",d.animation.hide),v.remove(),d.onHide&&d.onHide()},dismiss:function(e){d.storageMethod&&s.storage.set(d.key,d.value),s.hide(),e.stopImmediatePropagation(),e.preventDefault()},should:{show:function(){return d.persist?(s.debug("Persistent nag is set, can show nag"),!0):s.storage.get(d.key)!=d.value.toString()?(s.debug("Stored value is not set, can show nag",s.storage.get(d.key)),!0):(s.debug("Stored value is set, cannot show nag",s.storage.get(d.key)),!1)}},get:{storageOptions:function(){var e={};return d.expires&&(e.expires=d.expires),d.domain&&(e.domain=d.domain),d.path&&(e.path=d.path),e}},clear:function(){s.storage.remove(d.key)},storage:{set:function(t,i){var a=s.get.storageOptions();if("localstorage"==d.storageMethod&&o.localStorage!==n)o.localStorage.setItem(t,i),s.debug("Value stored using local storage",t,i);else if("sessionstorage"==d.storageMethod&&o.sessionStorage!==n)o.sessionStorage.setItem(t,i),s.debug("Value stored using session storage",t,i);else{if(e.cookie===n)return void s.error(f.noCookieStorage);e.cookie(t,i,a),s.debug("Value stored using cookie",t,i,a)}},get:function(t,i){var a;return"localstorage"==d.storageMethod&&o.localStorage!==n?a=o.localStorage.getItem(t):"sessionstorage"==d.storageMethod&&o.sessionStorage!==n?a=o.sessionStorage.getItem(t):e.cookie!==n?a=e.cookie(t):s.error(f.noCookieStorage),("undefined"==a||"null"==a||a===n||null===a)&&(a=n),a},remove:function(t){var i=s.get.storageOptions();"localstorage"==d.storageMethod&&o.localStorage!==n?o.localStorage.removeItem(t):"sessionstorage"==d.storageMethod&&o.sessionStorage!==n?o.sessionStorage.removeItem(t):e.cookie!==n?e.removeCookie(t,i):s.error(f.noStorage)}},setting:function(o,t){if(s.debug("Changing setting",o,t),e.isPlainObject(o))e.extend(!0,d,o);else{if(t===n)return d[o];d[o]=t}},internal:function(o,t){if(e.isPlainObject(o))e.extend(!0,s,o);else{if(t===n)return s[o];s[o]=t}},debug:function(){d.debug&&(d.performance?s.performance.log(arguments):(s.debug=Function.prototype.bind.call(console.info,console,d.name+":"),s.debug.apply(console,arguments)))},verbose:function(){d.verbose&&d.debug&&(d.performance?s.performance.log(arguments):(s.verbose=Function.prototype.bind.call(console.info,console,d.name+":"),s.verbose.apply(console,arguments)))},error:function(){s.error=Function.prototype.bind.call(console.error,console,d.name+":"),s.error.apply(console,arguments)},performance:{log:function(e){var o,t,n;d.performance&&(o=(new Date).getTime(),n=r||o,t=o-n,r=o,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:k,"Execution Time":t})),clearTimeout(s.performance.timer),s.performance.timer=setTimeout(s.performance.display,500)},display:function(){var o=d.name+":",t=0;r=!1,clearTimeout(s.performance.timer),e.each(c,function(e,o){t+=o["Execution Time"]}),o+=" "+t+"ms",a&&(o+=" '"+a+"'"),(console.group!==n||console.table!==n)&&c.length>0&&(console.groupCollapsed(o),console.table?console.table(c):e.each(c,function(e,o){console.log(o.Name+": "+o["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(o,t,a){var r,c,l,g=S;return t=t||u,a=k||a,"string"==typeof o&&g!==n&&(o=o.split(/[\. ]/),r=o.length-1,e.each(o,function(t,i){var a=t!=r?i+o[t+1].charAt(0).toUpperCase()+o[t+1].slice(1):o;if(e.isPlainObject(g[a])&&t!=r)g=g[a];else{if(g[a]!==n)return c=g[a],!1;if(!e.isPlainObject(g[i])||t==r)return g[i]!==n?(c=g[i],!1):(s.error(f.method,o),!1);g=g[i]}})),e.isFunction(c)?l=c.apply(a,t):c!==n&&(l=c),e.isArray(i)?i.push(l):i!==n?i=[i,l]:l!==n&&(i=l),c}},g?(S===n&&s.initialize(),s.invoke(l)):(S!==n&&S.invoke("destroy"),s.initialize())}),i!==n?i:this},e.fn.nag.settings={name:"Nag",debug:!1,verbose:!1,performance:!0,namespace:"Nag",persist:!1,displayTime:0,animation:{show:"slide",hide:"slide"},context:!1,detachable:!1,expires:30,domain:!1,path:"/",storageMethod:"cookie",key:"nag",value:"dismiss",error:{noCookieStorage:"$.cookie is not included. A storage solution is required.",noStorage:"Neither $.cookie or store is defined. A storage solution is required for storing state",method:"The method you called is not defined."},className:{bottom:"bottom",fixed:"fixed"},selector:{close:".close.icon"},speed:500,easing:"easeOutQuad",onHide:function(){}}}(jQuery,window,document); -------------------------------------------------------------------------------- /public/semantic-ui/components/popup.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Popup 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;z-index:1900;border:1px solid #D4D4D5;line-height:1.4285em;max-width:250px;background:#FFF;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);margin:0}.ui.popup>.header{padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.125em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:'';width:.75em;height:.75em;background:#FFF;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);z-index:2;box-shadow:1px 1px 0 0 #bababc}.ui.top.popup{margin:0 0 .75em}.ui.top.left.popup{-webkit-transform-origin:left bottom;-ms-transform-origin:left bottom;transform-origin:left bottom}.ui.top.center.popup{-webkit-transform-origin:center bottom;-ms-transform-origin:center bottom;transform-origin:center bottom}.ui.top.right.popup{-webkit-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}.ui.left.center.popup{margin:0 .75em 0 0;-webkit-transform-origin:right 50%;-ms-transform-origin:right 50%;transform-origin:right 50%}.ui.right.center.popup{margin:0 0 0 .75em;-webkit-transform-origin:left 50%;-ms-transform-origin:left 50%;transform-origin:left 50%}.ui.bottom.popup{margin:.75em 0 0}.ui.bottom.left.popup{-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ui.bottom.center.popup{-webkit-transform-origin:center top;-ms-transform-origin:center top;transform-origin:center top}.ui.bottom.right.popup{-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top;margin-right:0}.ui.bottom.center.popup:before{margin-left:-.325em;top:-.325em;left:50%;right:auto;bottom:auto;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.left.popup{margin-left:0}.ui.bottom.left.popup:before{top:-.325em;left:1em;right:auto;bottom:auto;margin-left:0;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup:before{top:-.325em;right:1em;bottom:auto;left:auto;margin-left:0;box-shadow:-1px -1px 0 0 #bababc}.ui.top.center.popup:before{top:auto;right:auto;bottom:-.325em;left:50%;margin-left:-.325em}.ui.top.left.popup{margin-left:0}.ui.top.left.popup:before{bottom:-.325em;left:1em;top:auto;right:auto;margin-left:0}.ui.top.right.popup{margin-right:0}.ui.top.right.popup:before{bottom:-.325em;right:1em;top:auto;left:auto;margin-left:0}.ui.left.center.popup:before{top:50%;right:-.325em;bottom:auto;left:auto;margin-top:-.325em;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.325em;bottom:auto;right:auto;margin-top:-.325em;box-shadow:-1px 1px 0 0 #bababc}.ui.bottom.popup:before,.ui.left.center.popup:before,.ui.right.center.popup:before,.ui.top.popup:before{background:#FFF}.ui.inverted.bottom.popup:before,.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before,.ui.inverted.top.popup:before{background:#1B1C1D}.ui.popup>.ui.grid:not(.padded){width:calc(100% + 1.75rem);margin:-.7rem -.875rem}.ui.loading.popup{display:block;visibility:hidden;z-index:-1}.ui.animating.popup,.ui.visible.popup{display:block}.ui.visible.popup{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.basic.popup:before{display:none}.ui.wide.popup{max-width:350px}.ui[class*="very wide"].popup{max-width:550px}@media only screen and (max-width:767px){.ui.wide.popup,.ui[class*="very wide"].popup{max-width:250px}}.ui.fluid.popup{width:100%;max-width:none}.ui.inverted.popup{background:#1B1C1D;color:#FFF;border:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#FFF}.ui.inverted.popup:before{background-color:#1B1C1D;box-shadow:none!important}.ui.flowing.popup{max-width:none}.ui.mini.popup{font-size:.71428571rem}.ui.tiny.popup{font-size:.85714286rem}.ui.small.popup{font-size:.92857143rem}.ui.popup{font-size:1rem}.ui.large.popup{font-size:1.14285714rem}.ui.huge.popup{font-size:1.42857143rem} -------------------------------------------------------------------------------- /public/semantic-ui/components/rail.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Rail 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Rails 15 | *******************************/ 16 | 17 | .ui.rail { 18 | position: absolute; 19 | top: 0%; 20 | width: 300px; 21 | height: 100%; 22 | } 23 | .ui.left.rail { 24 | left: auto; 25 | right: 100%; 26 | padding: 0em 2rem 0em 0em; 27 | margin: 0em 2rem 0em 0em; 28 | } 29 | .ui.right.rail { 30 | left: 100%; 31 | right: auto; 32 | padding: 0em 0em 0em 2rem; 33 | margin: 0em 0em 0em 2rem; 34 | } 35 | 36 | 37 | /******************************* 38 | Variations 39 | *******************************/ 40 | 41 | 42 | /*-------------- 43 | Internal 44 | ---------------*/ 45 | 46 | .ui.left.internal.rail { 47 | left: 0%; 48 | right: auto; 49 | padding: 0em 0em 0em 2rem; 50 | margin: 0em 0em 0em 2rem; 51 | } 52 | .ui.right.internal.rail { 53 | left: auto; 54 | right: 0%; 55 | padding: 0em 2rem 0em 0em; 56 | margin: 0em 2rem 0em 0em; 57 | } 58 | 59 | /*-------------- 60 | Dividing 61 | ---------------*/ 62 | 63 | .ui.dividing.rail { 64 | width: 302.5px; 65 | } 66 | .ui.left.dividing.rail { 67 | padding: 0em 2.5rem 0em 0em; 68 | margin: 0em 2.5rem 0em 0em; 69 | border-right: 1px solid rgba(34, 36, 38, 0.15); 70 | } 71 | .ui.right.dividing.rail { 72 | border-left: 1px solid rgba(34, 36, 38, 0.15); 73 | padding: 0em 0em 0em 2.5rem; 74 | margin: 0em 0em 0em 2.5rem; 75 | } 76 | 77 | /*-------------- 78 | Distance 79 | ---------------*/ 80 | 81 | .ui.close.rail { 82 | width: 301px; 83 | } 84 | .ui.close.left.rail { 85 | padding: 0em 1em 0em 0em; 86 | margin: 0em 1em 0em 0em; 87 | } 88 | .ui.close.right.rail { 89 | padding: 0em 0em 0em 1em; 90 | margin: 0em 0em 0em 1em; 91 | } 92 | .ui.very.close.rail { 93 | width: 300.5px; 94 | } 95 | .ui.very.close.left.rail { 96 | padding: 0em 0.5em 0em 0em; 97 | margin: 0em 0.5em 0em 0em; 98 | } 99 | .ui.very.close.right.rail { 100 | padding: 0em 0em 0em 0.5em; 101 | margin: 0em 0em 0em 0.5em; 102 | } 103 | 104 | /*-------------- 105 | Attached 106 | ---------------*/ 107 | 108 | .ui.attached.left.rail, 109 | .ui.attached.right.rail { 110 | padding: 0em; 111 | margin: 0em; 112 | } 113 | 114 | /*-------------- 115 | Sizing 116 | ---------------*/ 117 | 118 | .ui.rail { 119 | font-size: 1rem; 120 | } 121 | 122 | 123 | /******************************* 124 | Theme Overrides 125 | *******************************/ 126 | 127 | 128 | 129 | /******************************* 130 | Site Overrides 131 | *******************************/ 132 | 133 | -------------------------------------------------------------------------------- /public/semantic-ui/components/rail.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Rail 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.rail{position:absolute;top:0;width:300px;height:100%;font-size:1rem}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:301px}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:300.5px}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0} -------------------------------------------------------------------------------- /public/semantic-ui/components/rating.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Rating 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | !function(e,n,t,i){"use strict";e.fn.rating=function(n){var t,a=e(this),o=a.selector||"",r=(new Date).getTime(),s=[],l=arguments[0],c="string"==typeof l,u=[].slice.call(arguments,1);return a.each(function(){var g,m=e.isPlainObject(n)?e.extend(!0,{},e.fn.rating.settings,n):e.extend({},e.fn.rating.settings),d=m.namespace,f=m.className,v=m.metadata,p=m.selector,b=(m.error,"."+d),h="module-"+d,y=this,x=e(this).data(h),R=e(this),C=R.find(p.icon);g={initialize:function(){g.verbose("Initializing rating module",m),0===C.length&&g.setup.layout(),m.interactive?g.enable():g.disable(),g.set.rating(g.get.initialRating()),g.instantiate()},instantiate:function(){g.verbose("Instantiating module",m),x=g,R.data(h,g)},destroy:function(){g.verbose("Destroying previous instance",x),g.remove.events(),R.removeData(h)},refresh:function(){C=R.find(p.icon)},setup:{layout:function(){var n=g.get.maxRating(),t=e.fn.rating.settings.templates.icon(n);g.debug("Generating icon html dynamically"),R.html(t),g.refresh()}},event:{mouseenter:function(){var n=e(this);n.nextAll().removeClass(f.selected),R.addClass(f.selected),n.addClass(f.selected).prevAll().addClass(f.selected)},mouseleave:function(){R.removeClass(f.selected),C.removeClass(f.selected)},click:function(){var n=e(this),t=g.get.rating(),i=C.index(n)+1,a="auto"==m.clearable?1===C.length:m.clearable;a&&t==i?g.clearRating():g.set.rating(i)}},clearRating:function(){g.debug("Clearing current rating"),g.set.rating(0)},bind:{events:function(){g.verbose("Binding events"),R.on("mouseenter"+b,p.icon,g.event.mouseenter).on("mouseleave"+b,p.icon,g.event.mouseleave).on("click"+b,p.icon,g.event.click)}},remove:{events:function(){g.verbose("Removing events"),R.off(b)}},enable:function(){g.debug("Setting rating to interactive mode"),g.bind.events(),R.removeClass(f.disabled)},disable:function(){g.debug("Setting rating to read-only mode"),g.remove.events(),R.addClass(f.disabled)},get:{initialRating:function(){return R.data(v.rating)!==i?(R.removeData(v.rating),R.data(v.rating)):m.initialRating},maxRating:function(){return R.data(v.maxRating)!==i?(R.removeData(v.maxRating),R.data(v.maxRating)):m.maxRating},rating:function(){var e=C.filter("."+f.active).length;return g.verbose("Current rating retrieved",e),e}},set:{rating:function(e){var n=e-1>=0?e-1:0,t=C.eq(n);R.removeClass(f.selected),C.removeClass(f.selected).removeClass(f.active),e>0&&(g.verbose("Setting current rating to",e),t.prevAll().andSelf().addClass(f.active)),m.onRate.call(y,e)}},setting:function(n,t){if(g.debug("Changing setting",n,t),e.isPlainObject(n))e.extend(!0,m,n);else{if(t===i)return m[n];m[n]=t}},internal:function(n,t){if(e.isPlainObject(n))e.extend(!0,g,n);else{if(t===i)return g[n];g[n]=t}},debug:function(){m.debug&&(m.performance?g.performance.log(arguments):(g.debug=Function.prototype.bind.call(console.info,console,m.name+":"),g.debug.apply(console,arguments)))},verbose:function(){m.verbose&&m.debug&&(m.performance?g.performance.log(arguments):(g.verbose=Function.prototype.bind.call(console.info,console,m.name+":"),g.verbose.apply(console,arguments)))},error:function(){g.error=Function.prototype.bind.call(console.error,console,m.name+":"),g.error.apply(console,arguments)},performance:{log:function(e){var n,t,i;m.performance&&(n=(new Date).getTime(),i=r||n,t=n-i,r=n,s.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:y,"Execution Time":t})),clearTimeout(g.performance.timer),g.performance.timer=setTimeout(g.performance.display,500)},display:function(){var n=m.name+":",t=0;r=!1,clearTimeout(g.performance.timer),e.each(s,function(e,n){t+=n["Execution Time"]}),n+=" "+t+"ms",o&&(n+=" '"+o+"'"),a.length>1&&(n+=" ("+a.length+")"),(console.group!==i||console.table!==i)&&s.length>0&&(console.groupCollapsed(n),console.table?console.table(s):e.each(s,function(e,n){console.log(n.Name+": "+n["Execution Time"]+"ms")}),console.groupEnd()),s=[]}},invoke:function(n,a,o){var r,s,l,c=x;return a=a||u,o=y||o,"string"==typeof n&&c!==i&&(n=n.split(/[\. ]/),r=n.length-1,e.each(n,function(t,a){var o=t!=r?a+n[t+1].charAt(0).toUpperCase()+n[t+1].slice(1):n;if(e.isPlainObject(c[o])&&t!=r)c=c[o];else{if(c[o]!==i)return s=c[o],!1;if(!e.isPlainObject(c[a])||t==r)return c[a]!==i?(s=c[a],!1):!1;c=c[a]}})),e.isFunction(s)?l=s.apply(o,a):s!==i&&(l=s),e.isArray(t)?t.push(l):t!==i?t=[t,l]:l!==i&&(t=l),s}},c?(x===i&&g.initialize(),g.invoke(l)):(x!==i&&x.invoke("destroy"),g.initialize())}),t!==i?t:this},e.fn.rating.settings={name:"Rating",namespace:"rating",debug:!1,verbose:!1,performance:!0,initialRating:0,interactive:!0,maxRating:4,clearable:"auto",onRate:function(e){},error:{method:"The method you called is not defined",noMaximum:"No maximum rating specified. Cannot generate HTML automatically"},metadata:{rating:"rating",maxRating:"maxRating"},className:{active:"active",disabled:"disabled",selected:"selected",loading:"loading"},selector:{icon:".icon"},templates:{icon:function(e){for(var n=1,t="";e>=n;)t+='',n++;return t}}}}(jQuery,window,document); -------------------------------------------------------------------------------- /public/semantic-ui/components/reset.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Reset 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */*,:after,:before{box-sizing:inherit}html{box-sizing:border-box;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}input[type=text],input[type=email],input[type=search],input[type=password]{-webkit-appearance:none;-moz-appearance:none}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre,textarea{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0} -------------------------------------------------------------------------------- /public/semantic-ui/components/reveal.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Reveal 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.reveal{display:inherit;position:relative!important;font-size:0!important}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;-ms-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;-ms-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content,.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;-ms-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;-ms-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;-ms-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;-ms-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;-ms-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;-ms-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;-ms-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;-ms-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;-ms-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;-ms-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;-ms-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;-ms-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;-ms-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;-ms-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}.ui.rotate.reveal>.visible.content,.ui.rotate.right.reveal>.visible.content{-webkit-transform-origin:bottom right;-ms-transform-origin:bottom right;transform-origin:bottom right}.ui.rotate.active.reveal>.visible.conten,.ui.rotate.reveal:hover>.visible.content,.ui.rotate.right.active.reveal>.visible.content,.ui.rotate.right.reveal:hover>.visible.content{-webkit-transform:rotate(110deg);-ms-transform:rotate(110deg);transform:rotate(110deg)}.ui.rotate.left.reveal>.visible.content{-webkit-transform-origin:bottom left;-ms-transform-origin:bottom left;transform-origin:bottom left}.ui.rotate.left.active.reveal>.visible.content,.ui.rotate.left.reveal:hover>.visible.content{-webkit-transform:rotate(-110deg);-ms-transform:rotate(-110deg);transform:rotate(-110deg)}.ui.disabled.reveal:hover>.visible.visible.content{position:static!important;display:block!important;opacity:1!important;top:0!important;left:0!important;right:auto!important;bottom:auto!important;-webkit-transform:none!important;-ms-transform:none!important;transform:none!important}.ui.disabled.reveal:hover>.hidden.hidden.content{display:none!important}.ui.visible.reveal{overflow:visible}.ui.instant.reveal>.content{-webkit-transition-delay:0s!important;transition-delay:0s!important}.ui.reveal>.content{font-size:1rem!important} -------------------------------------------------------------------------------- /public/semantic-ui/components/search.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Search 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.2142em;padding:.67861429em 1em;font-size:1em;background:#FFF;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;-ms-transform-origin:center top;transform-origin:center top;background:#FFF;margin-top:.5em;width:18em;border-radius:.28571429rem;box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);border:1px solid #D4D4D5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21BA45}.ui.search>.results>.message{padding:1em}.ui.search>.results>.message .header{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#F3F4F5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#FFF;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#F9FAFB}.ui.search .action:hover{background:#E0E0E0}.ui.category.search>.results .category.active{background:#F3F4F5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#F3F4F5;box-shadow:none}.ui.search>.results .result.active .description,.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.category.search .results{width:28em}.ui.category.search>.results .category{background:#F3F4F5;box-shadow:none;border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease}.ui.category.search>.results .category:last-child{border-bottom:none}.ui.category.search>.results .category:first-child .name+.result{border-radius:0 .28571429rem 0 0}.ui.category.search>.results .category .result{background:#FFF;margin-left:100px;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease;padding:.85714286em 1.14285714em}.ui.category.search>.results .category:last-child .result:last-child{border-radius:0 0 .28571429rem;border-bottom:none}.ui.category.search>.results .category>.name{width:100px;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;float:1em;float:left;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4)}.ui[class*="left aligned"].search>.results{right:auto;left:0}.ui[class*="right aligned"].search>.results{right:0;left:auto}.ui.fluid.search .results{width:100%}.ui.mini.search{font-size:.71428571em}.ui.small.search{font-size:.92857143em}.ui.search{font-size:1em}.ui.large.search{font-size:1.14285714em}.ui.big.search{font-size:1.28571429em}.ui.huge.search{font-size:1.42857143em}.ui.massive.search{font-size:1.71428571em} -------------------------------------------------------------------------------- /public/semantic-ui/components/shape.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Shape 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Shape 15 | *******************************/ 16 | 17 | .ui.shape { 18 | position: relative; 19 | vertical-align: top; 20 | display: inline-block; 21 | -webkit-perspective: 2000px; 22 | perspective: 2000px; 23 | -webkit-transition: -webkit-transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 24 | transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 25 | } 26 | .ui.shape .sides { 27 | -webkit-transform-style: preserve-3d; 28 | transform-style: preserve-3d; 29 | } 30 | .ui.shape .side { 31 | opacity: 1; 32 | width: 100%; 33 | margin: 0em !important; 34 | -webkit-backface-visibility: hidden; 35 | backface-visibility: hidden; 36 | } 37 | .ui.shape .side { 38 | display: none; 39 | } 40 | .ui.shape .side * { 41 | -webkit-backface-visibility: visible !important; 42 | backface-visibility: visible !important; 43 | } 44 | 45 | 46 | /******************************* 47 | Types 48 | *******************************/ 49 | 50 | .ui.cube.shape .side { 51 | min-width: 15em; 52 | height: 15em; 53 | padding: 2em; 54 | background-color: #E6E6E6; 55 | color: rgba(0, 0, 0, 0.87); 56 | box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.3); 57 | } 58 | .ui.cube.shape .side > .content { 59 | width: 100%; 60 | height: 100%; 61 | display: table; 62 | text-align: center; 63 | -webkit-user-select: text; 64 | -moz-user-select: text; 65 | -ms-user-select: text; 66 | user-select: text; 67 | } 68 | .ui.cube.shape .side > .content > div { 69 | display: table-cell; 70 | vertical-align: middle; 71 | font-size: 2em; 72 | } 73 | 74 | 75 | /******************************* 76 | Variations 77 | *******************************/ 78 | 79 | .ui.text.shape.animating .sides { 80 | position: static; 81 | } 82 | .ui.text.shape .side { 83 | white-space: nowrap; 84 | } 85 | .ui.text.shape .side > * { 86 | white-space: normal; 87 | } 88 | 89 | 90 | /******************************* 91 | States 92 | *******************************/ 93 | 94 | 95 | /*-------------- 96 | Loading 97 | ---------------*/ 98 | 99 | .ui.loading.shape { 100 | position: absolute; 101 | top: -9999px; 102 | left: -9999px; 103 | } 104 | 105 | /*-------------- 106 | Animating 107 | ---------------*/ 108 | 109 | .ui.shape .animating.side { 110 | position: absolute; 111 | top: 0px; 112 | left: 0px; 113 | display: block; 114 | z-index: 100; 115 | } 116 | .ui.shape .hidden.side { 117 | opacity: 0.6; 118 | } 119 | 120 | /*-------------- 121 | CSS 122 | ---------------*/ 123 | 124 | .ui.shape.animating .sides { 125 | position: absolute; 126 | } 127 | .ui.shape.animating .sides { 128 | -webkit-transition: -webkit-transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 129 | transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 130 | } 131 | .ui.shape.animating .side { 132 | -webkit-transition: opacity 0.6s ease-in-out; 133 | transition: opacity 0.6s ease-in-out; 134 | } 135 | 136 | /*-------------- 137 | Active 138 | ---------------*/ 139 | 140 | .ui.shape .active.side { 141 | display: block; 142 | } 143 | 144 | 145 | /******************************* 146 | Theme Overrides 147 | *******************************/ 148 | 149 | 150 | 151 | /******************************* 152 | User Overrides 153 | *******************************/ 154 | 155 | -------------------------------------------------------------------------------- /public/semantic-ui/components/shape.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Shape 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:-webkit-transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out}.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#E6E6E6;color:rgba(0,0,0,.87);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute;-webkit-transition:-webkit-transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .active.side{display:block} -------------------------------------------------------------------------------- /public/semantic-ui/components/site.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Site 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Page 15 | *******************************/ 16 | 17 | @import url('https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin'); 18 | html, 19 | body { 20 | height: 100%; 21 | } 22 | html { 23 | font-size: 14px; 24 | } 25 | body { 26 | margin: 0px; 27 | padding: 0px; 28 | overflow-x: hidden; 29 | min-width: 320px; 30 | background: #FFFFFF; 31 | font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; 32 | font-size: 14px; 33 | line-height: 1.4285em; 34 | color: rgba(0, 0, 0, 0.87); 35 | font-smoothing: antialiased; 36 | } 37 | 38 | 39 | /******************************* 40 | Headers 41 | *******************************/ 42 | 43 | h1, 44 | h2, 45 | h3, 46 | h4, 47 | h5 { 48 | font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; 49 | line-height: 1.2857em; 50 | margin: calc(2rem - 0.14285em ) 0em 1rem; 51 | font-weight: bold; 52 | padding: 0em; 53 | } 54 | h1 { 55 | min-height: 1rem; 56 | font-size: 2rem; 57 | } 58 | h2 { 59 | font-size: 1.714rem; 60 | } 61 | h3 { 62 | font-size: 1.28rem; 63 | } 64 | h4 { 65 | font-size: 1.071rem; 66 | } 67 | h5 { 68 | font-size: 1rem; 69 | } 70 | h1:first-child, 71 | h2:first-child, 72 | h3:first-child, 73 | h4:first-child, 74 | h5:first-child { 75 | margin-top: 0em; 76 | } 77 | h1:last-child, 78 | h2:last-child, 79 | h3:last-child, 80 | h4:last-child, 81 | h5:last-child { 82 | margin-bottom: 0em; 83 | } 84 | 85 | 86 | /******************************* 87 | Text 88 | *******************************/ 89 | 90 | p { 91 | margin: 0em 0em 1em; 92 | line-height: 1.4285em; 93 | } 94 | p:first-child { 95 | margin-top: 0em; 96 | } 97 | p:last-child { 98 | margin-bottom: 0em; 99 | } 100 | 101 | /*------------------- 102 | Links 103 | --------------------*/ 104 | 105 | a { 106 | color: #4183C4; 107 | text-decoration: none; 108 | } 109 | a:hover { 110 | color: #1e70bf; 111 | text-decoration: none; 112 | } 113 | 114 | 115 | /******************************* 116 | Highlighting 117 | *******************************/ 118 | 119 | 120 | /* Site */ 121 | ::-webkit-selection { 122 | background-color: #CCE2FF; 123 | color: rgba(0, 0, 0, 0.87); 124 | } 125 | ::-moz-selection { 126 | background-color: #CCE2FF; 127 | color: rgba(0, 0, 0, 0.87); 128 | } 129 | ::selection { 130 | background-color: #CCE2FF; 131 | color: rgba(0, 0, 0, 0.87); 132 | } 133 | 134 | /* Form */ 135 | textarea::-webkit-selection, 136 | input::-webkit-selection { 137 | background-color: rgba(100, 100, 100, 0.4); 138 | color: rgba(0, 0, 0, 0.87); 139 | } 140 | textarea::-moz-selection, 141 | input::-moz-selection { 142 | background-color: rgba(100, 100, 100, 0.4); 143 | color: rgba(0, 0, 0, 0.87); 144 | } 145 | textarea::selection, 146 | input::selection { 147 | background-color: rgba(100, 100, 100, 0.4); 148 | color: rgba(0, 0, 0, 0.87); 149 | } 150 | 151 | 152 | /******************************* 153 | Global Overrides 154 | *******************************/ 155 | 156 | 157 | 158 | /******************************* 159 | Site Overrides 160 | *******************************/ 161 | 162 | -------------------------------------------------------------------------------- /public/semantic-ui/components/site.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Site 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic&subset=latin);body,html{height:100%}html{font-size:14px}body{margin:0;padding:0;overflow-x:hidden;min-width:320px;background:#FFF;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87);font-smoothing:antialiased}h1,h2,h3,h4,h5{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.2857em;margin:calc(2rem - .14285em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.714rem}h3{font-size:1.28rem}h4{font-size:1.071rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,p:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,p:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}a{color:#4183C4;text-decoration:none}a:hover{color:#1e70bf;text-decoration:none}::-webkit-selection{background-color:#CCE2FF;color:rgba(0,0,0,.87)}::-moz-selection{background-color:#CCE2FF;color:rgba(0,0,0,.87)}::selection{background-color:#CCE2FF;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::-moz-selection,textarea::-moz-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)} -------------------------------------------------------------------------------- /public/semantic-ui/components/sticky.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Sticky 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Sticky 15 | *******************************/ 16 | 17 | .ui.sticky { 18 | position: static; 19 | -webkit-transition: none; 20 | transition: none; 21 | z-index: 800; 22 | } 23 | 24 | 25 | /******************************* 26 | States 27 | *******************************/ 28 | 29 | 30 | /* Bound */ 31 | .ui.sticky.bound { 32 | position: absolute; 33 | left: auto; 34 | right: auto; 35 | } 36 | 37 | /* Fixed */ 38 | .ui.sticky.fixed { 39 | position: fixed; 40 | left: auto; 41 | right: auto; 42 | } 43 | 44 | /* Bound/Fixed Position */ 45 | .ui.sticky.bound.top, 46 | .ui.sticky.fixed.top { 47 | top: 0px; 48 | bottom: auto; 49 | } 50 | .ui.sticky.bound.bottom, 51 | .ui.sticky.fixed.bottom { 52 | top: auto; 53 | bottom: 0px; 54 | } 55 | 56 | 57 | /******************************* 58 | Types 59 | *******************************/ 60 | 61 | .ui.native.sticky { 62 | position: -webkit-sticky; 63 | position: -moz-sticky; 64 | position: -ms-sticky; 65 | position: -o-sticky; 66 | position: sticky; 67 | } 68 | 69 | 70 | /******************************* 71 | Theme Overrides 72 | *******************************/ 73 | 74 | 75 | 76 | /******************************* 77 | Site Overrides 78 | *******************************/ 79 | 80 | -------------------------------------------------------------------------------- /public/semantic-ui/components/sticky.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Sticky 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.sticky{position:static;-webkit-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky} -------------------------------------------------------------------------------- /public/semantic-ui/components/tab.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Tab 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | UI Tabs 15 | *******************************/ 16 | 17 | .ui.tab { 18 | display: none; 19 | } 20 | 21 | 22 | /******************************* 23 | States 24 | *******************************/ 25 | 26 | 27 | /*-------------------- 28 | Active 29 | ---------------------*/ 30 | 31 | .ui.tab.active, 32 | .ui.tab.open { 33 | display: block; 34 | } 35 | 36 | /*-------------------- 37 | Loading 38 | ---------------------*/ 39 | 40 | .ui.tab.loading { 41 | position: relative; 42 | overflow: hidden; 43 | display: block; 44 | min-height: 250px; 45 | } 46 | .ui.tab.loading * { 47 | position: relative !important; 48 | left: -10000px !important; 49 | } 50 | .ui.tab.loading:before, 51 | .ui.tab.loading.segment:before { 52 | position: absolute; 53 | content: ''; 54 | top: 100px; 55 | left: 50%; 56 | margin: -1.25em 0em 0em -1.25em; 57 | width: 2.5em; 58 | height: 2.5em; 59 | border-radius: 500rem; 60 | border: 0.2em solid rgba(0, 0, 0, 0.1); 61 | } 62 | .ui.tab.loading:after, 63 | .ui.tab.loading.segment:after { 64 | position: absolute; 65 | content: ''; 66 | top: 100px; 67 | left: 50%; 68 | margin: -1.25em 0em 0em -1.25em; 69 | width: 2.5em; 70 | height: 2.5em; 71 | -webkit-animation: button-spin 0.6s linear; 72 | animation: button-spin 0.6s linear; 73 | -webkit-animation-iteration-count: infinite; 74 | animation-iteration-count: infinite; 75 | border-radius: 500rem; 76 | border-color: #767676 transparent transparent; 77 | border-style: solid; 78 | border-width: 0.2em; 79 | box-shadow: 0px 0px 0px 1px transparent; 80 | } 81 | 82 | 83 | /******************************* 84 | Tab Overrides 85 | *******************************/ 86 | 87 | 88 | 89 | /******************************* 90 | User Overrides 91 | *******************************/ 92 | 93 | -------------------------------------------------------------------------------- /public/semantic-ui/components/tab.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.6 - Tab 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:100px;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:button-spin .6s linear;animation:button-spin .6s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;border-radius:500rem;border-color:#767676 transparent transparent;border-style:solid;border-width:.2em;box-shadow:0 0 0 1px transparent} -------------------------------------------------------------------------------- /public/semantic-ui/components/video.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.0.0 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2014 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Video 15 | *******************************/ 16 | 17 | .ui.video { 18 | background-color: #dddddd; 19 | position: relative; 20 | max-width: 100%; 21 | padding-bottom: 56.25%; 22 | height: 0px; 23 | overflow: hidden; 24 | } 25 | 26 | /*-------------- 27 | Content 28 | ---------------*/ 29 | 30 | 31 | /* Placeholder Image */ 32 | .ui.video .placeholder { 33 | background-color: #333333; 34 | } 35 | 36 | /* Play Icon Overlay */ 37 | .ui.video .play { 38 | cursor: pointer; 39 | position: absolute; 40 | top: 0px; 41 | left: 0px; 42 | z-index: 10; 43 | width: 100%; 44 | height: 100%; 45 | background: transparent; 46 | -webkit-transition: background 0.2s ease; 47 | transition: background 0.2s ease; 48 | } 49 | .ui.video .play.icon:before { 50 | position: absolute; 51 | top: 50%; 52 | left: 50%; 53 | z-index: 11; 54 | -webkit-transform: translateX(-50%) translateY(-50%); 55 | -ms-transform: translateX(-50%) translateY(-50%); 56 | transform: translateX(-50%) translateY(-50%); 57 | color: rgba(255, 255, 255, 0.7); 58 | font-size: 7rem; 59 | text-shadow: 2px 2px 0px rgba(0, 0, 0, 0.15); 60 | -webkit-transition: color 0.2s ease; 61 | transition: color 0.2s ease; 62 | } 63 | .ui.video .placeholder { 64 | position: absolute; 65 | top: 0px; 66 | left: 0px; 67 | display: block; 68 | width: 100%; 69 | height: 100%; 70 | } 71 | 72 | /* IFrame Embed */ 73 | .ui.video .embed iframe, 74 | .ui.video .embed embed, 75 | .ui.video .embed object { 76 | position: absolute; 77 | border: none; 78 | width: 100%; 79 | height: 100%; 80 | top: 0px; 81 | left: 0px; 82 | margin: 0em; 83 | padding: 0em; 84 | } 85 | 86 | 87 | /******************************* 88 | States 89 | *******************************/ 90 | 91 | 92 | /*-------------- 93 | Hover 94 | ---------------*/ 95 | 96 | .ui.video .play:hover { 97 | background: rgba(0, 0, 0, 0); 98 | } 99 | .ui.video .play:hover:before { 100 | color: #ffffff; 101 | } 102 | 103 | /*-------------- 104 | Active 105 | ---------------*/ 106 | 107 | .ui.active.video .play, 108 | .ui.active.video .placeholder { 109 | display: none; 110 | } 111 | .ui.active.video .embed { 112 | display: inline; 113 | } 114 | 115 | 116 | /******************************* 117 | Video Overrides 118 | *******************************/ 119 | 120 | 121 | 122 | /******************************* 123 | Site Overrides 124 | *******************************/ 125 | 126 | -------------------------------------------------------------------------------- /public/semantic-ui/components/video.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.0.0 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2014 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */.ui.video{background-color:#ddd;position:relative;max-width:100%;padding-bottom:56.25%;height:0;overflow:hidden}.ui.video .placeholder{background-color:#333}.ui.video .play{cursor:pointer;position:absolute;top:0;left:0;z-index:10;width:100%;height:100%;background:0 0;-webkit-transition:background .2s ease;transition:background .2s ease}.ui.video .play.icon:before{position:absolute;top:50%;left:50%;z-index:11;-webkit-transform:translateX(-50%)translateY(-50%);-ms-transform:translateX(-50%)translateY(-50%);transform:translateX(-50%)translateY(-50%);color:rgba(255,255,255,.7);font-size:7rem;text-shadow:2px 2px 0 rgba(0,0,0,.15);-webkit-transition:color .2s ease;transition:color .2s ease}.ui.video .placeholder{position:absolute;top:0;left:0;display:block;width:100%;height:100%}.ui.video .embed embed,.ui.video .embed iframe,.ui.video .embed object{position:absolute;border:none;width:100%;height:100%;top:0;left:0;margin:0;padding:0}.ui.video .play:hover{background:0 0}.ui.video .play:hover:before{color:#fff}.ui.active.video .placeholder,.ui.active.video .play{display:none}.ui.active.video .embed{display:inline} -------------------------------------------------------------------------------- /public/semantic-ui/components/video.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.0.0 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2014 Contributorss 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | !function(e,o,t,n){"use strict";e.fn.video=function(t){{var a,i=e(this),r=i.selector||"",l=(new Date).getTime(),c=[],u=arguments[0],s="string"==typeof u,m=[].slice.call(arguments,1);o.requestAnimationFrame||o.mozRequestAnimationFrame||o.webkitRequestAnimationFrame||o.msRequestAnimationFrame||function(e){setTimeout(e,0)}}return i.each(function(){var d,p=e.isPlainObject(t)?e.extend(!0,{},e.fn.video.settings,t):e.extend({},e.fn.video.settings),f=p.selector,g=p.className,h=p.error,v=p.metadata,b=p.namespace,y=p.templates,w="."+b,x="module-"+b,F=(e(o),e(this)),C=F.find(f.placeholder),E=F.find(f.playButton),T=F.find(f.embed),A=this,P=F.data(x);d={initialize:function(){d.debug("Initializing video"),d.create(),F.on("click"+w,f.placeholder,d.play).on("click"+w,f.playButton,d.play),d.instantiate()},instantiate:function(){d.verbose("Storing instance of module",d),P=d,F.data(x,d)},create:function(){var e=F.data(v.image),o=y.video(e);F.html(o),d.refresh(),e||d.play(),d.debug("Creating html for video element",o)},destroy:function(){d.verbose("Destroying previous instance of video"),d.reset(),F.removeData(x).off(w)},refresh:function(){d.verbose("Refreshing selector cache"),C=F.find(f.placeholder),E=F.find(f.playButton),T=F.find(f.embed)},change:function(e,o,t){d.debug("Changing video to ",e,o,t),F.data(v.source,e).data(v.id,o).data(v.url,t),p.onChange()},reset:function(){d.debug("Clearing video embed and showing placeholder"),F.removeClass(g.active),T.html(" "),C.show(),p.onReset()},play:function(){d.debug("Playing video");var e=F.data(v.source)||!1,o=F.data(v.url)||!1,t=F.data(v.id)||!1;T.html(d.generate.html(e,t,o)),F.addClass(g.active),p.onPlay()},get:{source:function(e){return"string"!=typeof e?!1:-1!==e.search("youtube.com")?"youtube":-1!==e.search("vimeo.com")?"vimeo":!1},id:function(e){return e.match(p.regExp.youtube)?e.match(p.regExp.youtube)[1]:e.match(p.regExp.vimeo)?e.match(p.regExp.vimeo)[2]:!1}},generate:{html:function(e,o,t){d.debug("Generating embed html");var n;return e=e||p.source,o=o||p.id,e&&o||t?(e&&o||(e=d.get.source(t),o=d.get.id(t)),"vimeo"==e?n='':"youtube"==e&&(n='')):d.error(h.noVideo),n},url:function(e){var o=p.api?1:0,t="auto"===p.autoplay?F.data("image")!==n:p.autoplay,a=p.hd?1:0,i=p.showUI?1:0,r=p.showUI?0:1,l="";return"vimeo"==e&&(l="api="+o+"&title="+i+"&byline="+i+"&portrait="+i+"&autoplay="+t,p.color&&(l+="&color="+p.color)),"ustream"==e?(l="autoplay="+t,p.color&&(l+="&color="+p.color)):"youtube"==e&&(l="enablejsapi="+o+"&autoplay="+t+"&autohide="+r+"&hq="+a+"&modestbranding=1",p.color&&(l+="&color="+p.color)),l}},setting:function(o,t){if(d.debug("Changing setting",o,t),e.isPlainObject(o))e.extend(!0,p,o);else{if(t===n)return p[o];p[o]=t}},internal:function(o,t){if(e.isPlainObject(o))e.extend(!0,d,o);else{if(t===n)return d[o];d[o]=t}},debug:function(){p.debug&&(p.performance?d.performance.log(arguments):(d.debug=Function.prototype.bind.call(console.info,console,p.name+":"),d.debug.apply(console,arguments)))},verbose:function(){p.verbose&&p.debug&&(p.performance?d.performance.log(arguments):(d.verbose=Function.prototype.bind.call(console.info,console,p.name+":"),d.verbose.apply(console,arguments)))},error:function(){d.error=Function.prototype.bind.call(console.error,console,p.name+":"),d.error.apply(console,arguments)},performance:{log:function(e){var o,t,n;p.performance&&(o=(new Date).getTime(),n=l||o,t=o-n,l=o,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:A,"Execution Time":t})),clearTimeout(d.performance.timer),d.performance.timer=setTimeout(d.performance.display,500)},display:function(){var o=p.name+":",t=0;l=!1,clearTimeout(d.performance.timer),e.each(c,function(e,o){t+=o["Execution Time"]}),o+=" "+t+"ms",r&&(o+=" '"+r+"'"),i.length>1&&(o+=" ("+i.length+")"),(console.group!==n||console.table!==n)&&c.length>0&&(console.groupCollapsed(o),console.table?console.table(c):e.each(c,function(e,o){console.log(o.Name+": "+o["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(o,t,i){var r,l,c,u=P;return t=t||m,i=A||i,"string"==typeof o&&u!==n&&(o=o.split(/[\. ]/),r=o.length-1,e.each(o,function(t,a){var i=t!=r?a+o[t+1].charAt(0).toUpperCase()+o[t+1].slice(1):o;if(e.isPlainObject(u[i])&&t!=r)u=u[i];else{if(u[i]!==n)return l=u[i],!1;if(!e.isPlainObject(u[a])||t==r)return u[a]!==n?(l=u[a],!1):(d.error(h.method,o),!1);u=u[a]}})),e.isFunction(l)?c=l.apply(i,t):l!==n&&(c=l),e.isArray(a)?a.push(c):a!==n?a=[a,c]:c!==n&&(a=c),l}},s?(P===n&&d.initialize(),d.invoke(u)):(P!==n&&P.invoke("destroy"),d.initialize())}),a!==n?a:this},e.fn.video.settings={name:"Video",namespace:"video",debug:!1,verbose:!1,performance:!0,metadata:{id:"id",image:"image",source:"source",url:"url"},source:!1,url:!1,id:!1,aspectRatio:16/9,onPlay:function(){},onReset:function(){},onChange:function(){},onPause:function(){},onStop:function(){},width:"auto",height:"auto",autoplay:"auto",color:"#442359",hd:!0,showUI:!1,api:!0,regExp:{youtube:/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$/,vimeo:/http:\/\/(www\.)?vimeo.com\/(\d+)($|\/)/},error:{noVideo:"No video specified",method:"The method you called is not defined"},className:{active:"active"},selector:{embed:".embed",placeholder:".placeholder",playButton:".play"}},e.fn.video.settings.templates={video:function(e){var o="";return e&&(o+=''),o+='
'}}}(jQuery,window,document); -------------------------------------------------------------------------------- /public/semantic-ui/components/visit.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.0.0 - Visit 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | !function(e,t,i,n){"use strict";e.visit=e.fn.visit=function(i){var o,r=e(e.isFunction(this)?t:this),s=r.selector||"",a=(new Date).getTime(),c=[],u=arguments[0],l="string"==typeof u,d=[].slice.call(arguments,1);return r.each(function(){var g,m=e.isPlainObject(i)?e.extend(!0,{},e.fn.visit.settings,i):e.extend({},e.fn.visit.settings),f=m.error,p=m.namespace,v=p+"-module",h=e(this),b=e(),y=this,k=h.data(v);g={initialize:function(){m.count?g.store(m.key.count,m.count):m.id?g.add.id(m.id):m.increment&&"increment"!==l&&g.increment(),g.add.display(h),g.instantiate()},instantiate:function(){g.verbose("Storing instance of visit module",g),k=g,h.data(v,g)},destroy:function(){g.verbose("Destroying instance"),h.removeData(v)},increment:function(e){var t=g.get.count(),i=+t+1;e?g.add.id(e):(i>m.limit&&!m.surpass&&(i=m.limit),g.debug("Incrementing visits",i),g.store(m.key.count,i))},decrement:function(e){var t=g.get.count(),i=+t-1;e?g.remove.id(e):(g.debug("Removing visit"),g.store(m.key.count,i))},get:{count:function(){return+g.retrieve(m.key.count)||0},idCount:function(e){return e=e||g.get.ids(),e.length},ids:function(e){var t=[];return e=e||g.retrieve(m.key.ids),"string"==typeof e&&(t=e.split(m.delimiter)),g.verbose("Found visited ID list",t),t},storageOptions:function(e){var t={};return m.expires&&(t.expires=m.expires),m.domain&&(t.domain=m.domain),m.path&&(t.path=m.path),t}},has:{visited:function(t,i){var o=!1;return i=i||g.get.ids(),t!==n&&i&&e.each(i,function(e,i){i==t&&(o=!0)}),o}},set:{count:function(e){g.store(m.key.count,e)},ids:function(e){g.store(m.key.ids,e)}},reset:function(){g.store(m.key.count,0),g.store(m.key.ids,null)},add:{id:function(e){var t=g.retrieve(m.key.ids),i=t===n||""===t?e:t+m.delimiter+e;g.has.visited(e)?g.debug("Unique content already visited, not adding visit",e,t):e===n?g.debug("ID is not defined"):(g.debug("Adding visit to unique content",e),g.store(m.key.ids,i)),g.set.count(g.get.idCount())},display:function(t){var i=e(t);i.length>0&&!e.isWindow(i[0])&&(g.debug("Updating visit count for element",i),b=b.length>0?b.add(i):i)}},remove:{id:function(t){var i=g.get.ids(),o=[];t!==n&&i!==n&&(g.debug("Removing visit to unique content",t,i),e.each(i,function(e,i){i!==t&&o.push(i)}),o=o.join(m.delimiter),g.store(m.key.ids,o)),g.set.count(g.get.idCount())}},check:{limit:function(e){e=e||g.get.count(),m.limit&&(e>=m.limit&&(g.debug("Pages viewed exceeded limit, firing callback",e,m.limit),m.onLimit.call(y,e)),g.debug("Limit not reached",e,m.limit),m.onChange.call(y,e)),g.update.display(e)}},update:{display:function(e){e=e||g.get.count(),b.length>0&&(g.debug("Updating displayed view count",b),b.html(e))}},store:function(i,o){var r=g.get.storageOptions(o);if("localstorage"==m.storageMethod&&t.localStorage!==n)t.localStorage.setItem(i,o),g.debug("Value stored using local storage",i,o);else{if(e.cookie===n)return void g.error(f.noCookieStorage);e.cookie(i,o,r),g.debug("Value stored using cookie",i,o,r)}i==m.key.count&&g.check.limit(o)},retrieve:function(i,o){var r;return"localstorage"==m.storageMethod&&t.localStorage!==n?r=t.localStorage.getItem(i):e.cookie!==n?r=e.cookie(i):g.error(f.noCookieStorage),("undefined"==r||"null"==r||r===n||null===r)&&(r=n),r},setting:function(t,i){if(e.isPlainObject(t))e.extend(!0,m,t);else{if(i===n)return m[t];m[t]=i}},internal:function(t,i){return g.debug("Changing internal",t,i),i===n?g[t]:void(e.isPlainObject(t)?e.extend(!0,g,t):g[t]=i)},debug:function(){m.debug&&(m.performance?g.performance.log(arguments):(g.debug=Function.prototype.bind.call(console.info,console,m.name+":"),g.debug.apply(console,arguments)))},verbose:function(){m.verbose&&m.debug&&(m.performance?g.performance.log(arguments):(g.verbose=Function.prototype.bind.call(console.info,console,m.name+":"),g.verbose.apply(console,arguments)))},error:function(){g.error=Function.prototype.bind.call(console.error,console,m.name+":"),g.error.apply(console,arguments)},performance:{log:function(e){var t,i,n;m.performance&&(t=(new Date).getTime(),n=a||t,i=t-n,a=t,c.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:y,"Execution Time":i})),clearTimeout(g.performance.timer),g.performance.timer=setTimeout(g.performance.display,500)},display:function(){var t=m.name+":",i=0;a=!1,clearTimeout(g.performance.timer),e.each(c,function(e,t){i+=t["Execution Time"]}),t+=" "+i+"ms",s&&(t+=" '"+s+"'"),r.length>1&&(t+=" ("+r.length+")"),(console.group!==n||console.table!==n)&&c.length>0&&(console.groupCollapsed(t),console.table?console.table(c):e.each(c,function(e,t){console.log(t.Name+": "+t["Execution Time"]+"ms")}),console.groupEnd()),c=[]}},invoke:function(t,i,r){var s,a,c,u=k;return i=i||d,r=y||r,"string"==typeof t&&u!==n&&(t=t.split(/[\. ]/),s=t.length-1,e.each(t,function(i,o){var r=i!=s?o+t[i+1].charAt(0).toUpperCase()+t[i+1].slice(1):t;if(e.isPlainObject(u[r])&&i!=s)u=u[r];else{if(u[r]!==n)return a=u[r],!1;if(!e.isPlainObject(u[o])||i==s)return u[o]!==n?(a=u[o],!1):!1;u=u[o]}})),e.isFunction(a)?c=a.apply(r,i):a!==n&&(c=a),e.isArray(o)?o.push(c):o!==n?o=[o,c]:c!==n&&(o=c),a}},l?(k===n&&g.initialize(),g.invoke(u)):(k!==n&&k.invoke("destroy"),g.initialize())}),o!==n?o:this},e.fn.visit.settings={name:"Visit",debug:!1,verbose:!1,performance:!0,namespace:"visit",increment:!1,surpass:!1,count:!1,limit:!1,delimiter:"&",storageMethod:"localstorage",key:{count:"visit-count",ids:"visit-ids"},expires:30,domain:!1,path:"/",onLimit:function(){},onChange:function(){},error:{method:"The method you called is not defined",missingPersist:"Using the persist setting requires the inclusion of PersistJS",noCookieStorage:"The default storage cookie requires $.cookie to be included."}}}(jQuery,window,document); -------------------------------------------------------------------------------- /public/semantic-ui/dist.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/dist.zip -------------------------------------------------------------------------------- /public/semantic-ui/package.js: -------------------------------------------------------------------------------- 1 | var 2 | where = 'client' // Adds files only to the client 3 | ; 4 | 5 | Package.describe({ 6 | name : 'semantic:ui-css', 7 | summary : 'Semantic UI - CSS Release of Semantic UI', 8 | version : '2.1.6', 9 | git : 'git://github.com/Semantic-Org/Semantic-UI-CSS.git', 10 | }); 11 | 12 | Package.onUse(function(api) { 13 | 14 | api.versionsFrom('1.0'); 15 | 16 | api.use('jquery', 'client'); 17 | 18 | api.addFiles([ 19 | // icons 20 | 'themes/default/assets/fonts/icons.eot', 21 | 'themes/default/assets/fonts/icons.svg', 22 | 'themes/default/assets/fonts/icons.ttf', 23 | 'themes/default/assets/fonts/icons.woff', 24 | 'themes/default/assets/fonts/icons.woff2', 25 | 26 | // flags 27 | 'themes/default/assets/images/flags.png', 28 | 29 | // release 30 | 'semantic.css', 31 | 'semantic.js' 32 | ], 'client'); 33 | 34 | }); 35 | -------------------------------------------------------------------------------- /public/semantic-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "semantic-ui-css", 3 | "version": "2.1.6", 4 | "title": "Semantic UI", 5 | "description": "CSS Only distribution of Semantic UI", 6 | "homepage": "http://www.semantic-ui.com", 7 | "author": "Jack Lukic ", 8 | "license": "MIT", 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/Semantic-Org/Semantic-UI-CSS.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/Semantic-Org/Semantic-UI/issues" 15 | }, 16 | "dependencies": { 17 | "jquery": "x.*" 18 | } 19 | } -------------------------------------------------------------------------------- /public/semantic-ui/themes/default/assets/fonts/icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/themes/default/assets/fonts/icons.eot -------------------------------------------------------------------------------- /public/semantic-ui/themes/default/assets/fonts/icons.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/themes/default/assets/fonts/icons.otf -------------------------------------------------------------------------------- /public/semantic-ui/themes/default/assets/fonts/icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/themes/default/assets/fonts/icons.ttf -------------------------------------------------------------------------------- /public/semantic-ui/themes/default/assets/fonts/icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/themes/default/assets/fonts/icons.woff -------------------------------------------------------------------------------- /public/semantic-ui/themes/default/assets/fonts/icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/themes/default/assets/fonts/icons.woff2 -------------------------------------------------------------------------------- /public/semantic-ui/themes/default/assets/images/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aaronpk/Telegraph/a66990e037844a6dd13275d6c22032ea565f582b/public/semantic-ui/themes/default/assets/images/flags.png -------------------------------------------------------------------------------- /scripts/telegraph.php: -------------------------------------------------------------------------------- 1 | run_workers(array_key_exists(1, $argv) ? $argv[1] : 4); 6 | -------------------------------------------------------------------------------- /tests/FindLinksTest.php: -------------------------------------------------------------------------------- 1 | assertContains('http://example.com/', $links); 9 | } 10 | 11 | public function testFindLinksInHTML() { 12 | $links = FindLinks::inHTML('Hello'); 13 | $this->assertContains('http://example.com/', $links); 14 | } 15 | 16 | public function testFindLinksInJSONArray() { 17 | $links = FindLinks::all([ 18 | 'link' => 'http://example.com/', 19 | 'nested' => [ 20 | 'foo' => 'http://example.net/', 21 | 'html' => 'This is some html with a link', 22 | 'photo' => [ 23 | 'http://example.com/img.jpg' 24 | ], 25 | 'bar' => [ 26 | 'baz' => [ 27 | 'http://example.org/' 28 | ] 29 | ], 30 | [[['http://example.io/']]] 31 | ] 32 | ]); 33 | $this->assertContains('http://example.com/', $links); 34 | $this->assertContains('http://example.com/img.jpg', $links); 35 | $this->assertContains('http://example.net/', $links); 36 | $this->assertContains('http://example.org/', $links); 37 | $this->assertContains('http://example.io/', $links); 38 | $this->assertContains('http://example.html/', $links); 39 | } 40 | 41 | public function testFindLinksInXRayResult() { 42 | $data = json_decode(' 43 | {"data":{"type":"entry","published":"2018-06-19T14:32:44-07:00","url":"https://aaronparecki.com/2018/06/19/12/indiewebsummit","category":["indieweb"],"syndication":["https://twitter.com/aaronpk/status/1009187255204732928"],"content":{"text":"I\'m excited to announce that @namedotcom is our newest sponsor of @IndieWebSummit and they\'ll be joining us next week! It\'s not too late to register! \ud83d\udd1c https://2018.indieweb.org","html":"I\'m excited to announce that @namedotcom is our newest sponsor of @IndieWebSummit and they\'ll be joining us next week! It\'s not too late to register! \ud83d\udd1c https://2018.indieweb.org"},"author":{"type":"card","name":"Aaron Parecki","url":"https://aaronparecki.com/","photo":"https://aaronparecki.com/images/profile.jpg"}},"url":"https://aaronparecki.com/2018/06/19/12/indiewebsummit","code":200} 44 | ', true); 45 | unset($data['data']['author']); 46 | $links = FindLinks::all($data['data']); 47 | $this->assertContains('https://aaronparecki.com/2018/06/19/12/indiewebsummit', $links); 48 | $this->assertContains('https://twitter.com/aaronpk/status/1009187255204732928', $links); 49 | $this->assertContains('https://2018.indieweb.org', $links); 50 | $this->assertContains('https://twitter.com/namedotcom', $links); 51 | $this->assertContains('https://twitter.com/IndieWebSummit', $links); 52 | $this->assertContains('https://aaronparecki.com/emoji/%F0%9F%94%9C', $links); 53 | } 54 | 55 | } 56 | 57 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | faultCode 14 | 17 15 | 16 | 17 | faultString 18 | The source does not link to the target 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /tests/data/pingback.example.com/success: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/xml; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | 10 | 11 | 12 | pingback was successful 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/basictest: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

This page has links to target.example.com and target2.example.com.

13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/data/source.example.com/callback: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | Callback was successful 8 | -------------------------------------------------------------------------------- /tests/data/source.example.com/invalidhtml: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

This page has a link to target.example.com but is broken HTML

13 |

14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/multipletest: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

This page has links to 13 | target.example.com 14 | and target2.example.com 15 | and should not send a mention to 16 | target.example.org 17 | or this. 18 |

19 | 20 | 21 | -------------------------------------------------------------------------------- /tests/data/source.example.com/no-endpoint: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/nolink: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

This page doesn't have a link to target.example.com

13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/data/source.example.com/pingback-failed: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/pingback-success: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/webmention-and-pingback: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/webmention-failed: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/webmention-status-url: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/source.example.com/webmention-success: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

13 | target 14 |

15 | 16 | 17 | -------------------------------------------------------------------------------- /tests/data/target.example.com/no-endpoint: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 |

This page has no webmention or pingback endpoint configured

13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/data/target.example.com/pingback-failed: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 | 13 |

This has a pingback endpoint that will return an error

14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/data/target.example.com/pingback-success: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 | 13 |

This has a pingback endpoint that will return success

14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/data/target.example.com/webmention-failed: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 | 13 |

This has a webmention endpoint that will return an error

14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/data/target.example.com/webmention-status-url: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 | 13 |

This has a webmention endpoint that will return a status URL

14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/data/target.example.com/webmention-success: -------------------------------------------------------------------------------- 1 | HTTP/1.1 200 OK 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/html; charset=utf-8 5 | Connection: keep-alive 6 | 7 | 8 | 9 | Test 10 | 11 | 12 | 13 |

This has a webmention endpoint that will return success

14 | 15 | 16 | -------------------------------------------------------------------------------- /tests/data/webmention.example.com/error: -------------------------------------------------------------------------------- 1 | HTTP/1.1 400 Bad Request 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/plain; charset=utf-8 5 | Connection: keep-alive 6 | 7 | The webmention was not accepted 8 | -------------------------------------------------------------------------------- /tests/data/webmention.example.com/success: -------------------------------------------------------------------------------- 1 | HTTP/1.1 202 Accepted 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/plain; charset=utf-8 5 | Connection: keep-alive 6 | 7 | Webmention was accepted 8 | -------------------------------------------------------------------------------- /tests/data/webmention.example.com/success-with-status: -------------------------------------------------------------------------------- 1 | HTTP/1.1 201 Created 2 | Server: Apache 3 | Date: Wed, 09 Dec 2015 03:29:14 GMT 4 | Content-Type: text/plain; charset=utf-8 5 | Connection: keep-alive 6 | Location: /webmention/1000 7 | 8 | Webmention was accepted 9 | -------------------------------------------------------------------------------- /views/dashboard.php: -------------------------------------------------------------------------------- 1 | layout('layout-loggedin', ['title' => $title, 'accounts' => $accounts, 'user' => $user]); ?> 2 | 3 |
4 | 5 |

name ?>

6 | 7 | 11 |
12 |
13 |
14 | 15 | 16 |
17 | 18 |
19 |
Enter a URL above to preview and send webmentions from all the links found on the page.
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | 29 |
30 |
31 |
32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | > 43 | 50 | 55 | 59 | 60 | 61 | 62 |
StatusDateSource & Target
44 | 49 | 51 | 52 | created_at)) ?> 53 | 54 | 56 | source=e($mention['webmention']->source) ?>
57 | target=e($mention['webmention']->target) ?> 58 |
63 | 64 |
It looks like you haven't sent any webmentions yet! Try entering one of your post URLs above and send some.
65 | 66 | 67 |
68 | 69 | 103 | -------------------------------------------------------------------------------- /views/footer-block.php: -------------------------------------------------------------------------------- 1 | 34 | -------------------------------------------------------------------------------- /views/layout-loggedin.php: -------------------------------------------------------------------------------- 1 | layout('layout', ['title' => $title]); ?> 2 | 3 | 36 | 37 | section('content') ?> 38 | 39 | insert('footer-block') ?> 40 | -------------------------------------------------------------------------------- /views/layout.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <?= $this->e($title) ?> 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | section('content') ?> 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /views/login.php: -------------------------------------------------------------------------------- 1 | layout('layout', ['title' => $title]); ?> 2 | 3 | 17 | 18 |
19 |
20 |

21 | 22 |
23 | Sign in to Telegraph 24 |
25 |

26 | 27 | 28 |
29 |
30 | 31 |
32 | 33 | 34 |
35 |
36 |
37 |
38 | 39 | 40 |
41 |
42 | 43 | 44 |
45 | 46 |
47 | 48 |
49 | 50 |
51 | What's this? About Web Sign-In 52 |
53 |
54 |
55 | 56 | 77 | -------------------------------------------------------------------------------- /views/new-site.php: -------------------------------------------------------------------------------- 1 | layout('layout-loggedin', ['title' => $title, 'accounts' => $accounts, 'user' => $user]); ?> 2 | 3 |
4 | 5 | 6 |

Edit Site

7 | 8 | 9 |

Create a New Site

10 | 11 |

Create a new site to help organize your webmentions. Each site has its own API key for sending webmentions, or for receiving mentions from Superfeedr.

12 | 13 | 14 |
15 |
16 | 17 | 18 |
19 |
20 | 21 | 22 |
23 | 24 | 25 |
26 | 27 |

Enter your website's home page URL above, and you will be able to receive webmentions from a Superfeedr tracking feed to that domain.

28 | 29 | 30 | 31 |
32 |
33 | 34 | 35 |

Use this key when sending webmentions using the API.

36 |
37 |
38 | 39 | 40 |

Create a Superfeedr tracker subscription and set this URL as the web hook URL.

41 |

If you are using Telegraph to send webmentions as well as receive webmentions from Superfeedr, it is recommended you create a separate site for Superfeedr so you can more easily separate the two uses of the service.

42 |
43 |
44 | 45 | 46 |

Your Superfeedr tracker subscription should have this topic URL.

47 |
48 |
49 | 50 | 51 | 52 |
53 | -------------------------------------------------------------------------------- /views/not-found.php: -------------------------------------------------------------------------------- 1 | Not found. -------------------------------------------------------------------------------- /views/send-a-webmention.php: -------------------------------------------------------------------------------- 1 | layout('layout-loggedin', ['title' => $title, 'user' => $user, 'accounts' => $accounts]); ?> 2 | 3 |
4 | 5 |

Send a Webmention

6 | 7 |
8 |
9 |
10 |
11 |
12 |
13 | 14 |
15 |
16 | 17 |
18 |

Enter a source URL (your post) and target URL (the post you linked to).

19 |

Telegraph will discover the Webmention endpoint of the target URL and send the Webmention for you.

20 |

You'll be able to see the progress after you click "send".

21 |
22 | 23 |
24 | 25 | 58 | -------------------------------------------------------------------------------- /views/superfeedr.php: -------------------------------------------------------------------------------- 1 | layout('layout-loggedin', ['title' => $title, 'accounts' => $accounts, 'user' => $user, 'return_to' => $return_to]); 4 | ?> 5 | 6 |
7 | 8 |

Superfeedr Integration

9 | 10 | 11 | You can use Telegraph to receive Webmentions when your site is linked to by any website tracked by Superfeedr, even if that site doesn't send Webmentions itself! 12 | 13 |

Setup

14 | 15 | From the top right menu, click the "New Site" link. 16 | 17 | 18 | 19 | Enter "Mentions" for the name (or anything you want, but that's what I use), and enter your home page URL. Entering your URL here is how Telegraph knows which links in the Superfeedr feed to send webmentions for. 20 | 21 | 22 | 23 | After you create the site, click on the settings icon next to the name. 24 | 25 | 26 | 27 | Near the bottom, there is a Superfeedr Webhook URL. Copy that URL since we'll need it in the next step. 28 | 29 | 30 | 31 |

Superfeedr Configuration

32 | 33 | Now we need to sign up with Superfeedr and create a tracking feed. Create an account by visiting the [Superfeedr Tracker page](https://superfeedr.com/tracker). Make sure to choose "Tracker" from the account type dropdown. If you already have a Publisher or Subscriber account, you'll need to make a new Tracker account for this. 34 | 35 | 36 | 37 | Once you've signed up, you'll land on the Superfeedr dashboard. Click "Search and Track" to create a new tracker. 38 | 39 | Enter `link:aaronparecki.com` as the query term, obviously replacing the domain with your own, and set the format to "json". Paste your Telegraph URL from the setup process into the Callback/Webhook URL field. Then click "Subscribe"! 40 | 41 | 42 | 43 | At this point your tracker feed is live, and Superfeedr will begin sending web hooks to Telegraph whenever a new item is found that links to your website! 44 | 45 | Unfortunately nothing will happen right away, so you'll have to wait for someone to publish a blog post that links to you. Check back in a little while and you should see some webmentions show up on your Telegraph dashboard! 46 | 47 | 48 | 49 | Here you can see a few of the mentions I've received from my Superfeedr tracker, including one from Stack Overflow which doesn't yet send webmentions on its own! 50 | 51 | 52 |
53 | 57 | 58 |
59 | -------------------------------------------------------------------------------- /views/webmention-details.php: -------------------------------------------------------------------------------- 1 | layout('layout-loggedin', ['title' => $title, 'accounts' => $accounts, 'user' => $user]); ?> 2 | 3 |
4 | 5 |

Webmention Request

6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | vouch): ?> 28 | 29 | 30 | 31 | 32 | 33 | code): ?> 34 | 35 | 36 | 37 | 38 | 39 | realm): ?> 40 | 41 | 42 | 43 | 44 | 45 | callback): ?> 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 56 | 65 | 66 | 67 |
Status 11 | 12 | 13 |
Datecreated_at)) ?>
Sourcee($webmention->source) ?>
Targete($webmention->target) ?>
Vouche($webmention->vouch) ?>
Codee($webmention->code) ?>
Realme($webmention->realm) ?>
Callback URLe($webmention->callback) ?>
55 | 57 |
58 | 59 | 60 | 61 | 62 | 63 |
64 |
68 | 69 |

Details

70 | 71 | 72 |

The request is queued for processing. Refresh this page for updates.

73 | 74 | 75 | 76 | webmention_endpoint): ?> 77 | 78 | 79 | 80 | 81 | 82 | pingback_endpoint): ?> 83 | 84 | 85 | 86 | 87 | 88 | webmention_endpoint == false && $webmention->pingback_endpoint == false): ?> 89 | 90 | 91 | 92 | 93 | 94 | webmention_endpoint): ?> 95 | 96 | 97 | 104 | 105 | 106 |
Webmention Endpointe($webmention->webmention_endpoint) ?>
Pingback Endpointe($webmention->pingback_endpoint) ?>
Webmention EndpointNo webmention endpoint was discovered for this target
Status URL 98 | webmention_status_url): ?> 99 | e($webmention->webmention_status_url) ?> 100 | 101 | The webmention endpoint did not return a status URL 102 | 103 |
107 | 108 |

Logs

109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 136 | 137 | 138 | 139 |
DateStatusHTTP Code
created_at)) ?>status ?>http_code ?>
127 |
raw_response);
129 |               if($json) {
130 |                 echo json_encode($json, JSON_UNESCAPED_SLASHES+JSON_PRETTY_PRINT);
131 |               } else {
132 |                 echo $this->e($status->raw_response);
133 |               }
134 |             ?>
135 |
140 | 141 | 142 | 143 |
144 | -------------------------------------------------------------------------------- /views/webmention-send.php: -------------------------------------------------------------------------------- 1 | layout('layout-loggedin', ['title' => $title, 'accounts' => $accounts, 'user' => $user]); ?> 2 | 3 |
4 | 5 |

Send Webmentions

6 | 7 | Source URL: 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
URLStatus
Looking for URLs...
18 | 19 |
20 | 109 | 117 | --------------------------------------------------------------------------------