Browse Source

user edit form

Ondřej Hruška 2 years ago
parent
commit
1c6dedbb34
Signed by: Ondřej Hruška <ondra@ondrovo.com> GPG key ID: 2C5FD5035250423D

+ 4 - 6
app/Http/Controllers/Auth/RegisterController.php View File

@@ -49,16 +49,14 @@ class RegisterController extends Controller
49 49
      */
50 50
     protected function validator(array $data)
51 51
     {
52
-        return Validator::make($data, [
52
+        return $this->makeValidator($data, [
53 53
             'name' => [
54
-                'regex:/^[a-zA-Z0-9_.-]+$/',
55 54
                 'required',
56
-                'string',
57
-                'max:255',
55
+                VALI_NAME,
58 56
                 'unique:users'
59 57
             ],
60
-            'email' => 'required|string|email|max:255|unique:users',
61
-            'password' => 'required|string|min:6|max:1000|confirmed', // max len to foil DOS attempts
58
+            'email' => ['required', 'unique:users', VALI_EMAIL],
59
+            'password' => ['required', 'confirmed', VALI_PASSWORD],
62 60
         ]);
63 61
     }
64 62
 

+ 27 - 1
app/Http/Controllers/Controller.php View File

@@ -3,13 +3,39 @@
3 3
 namespace App\Http\Controllers;
4 4
 
5 5
 use Illuminate\Foundation\Bus\DispatchesJobs;
6
+use Illuminate\Http\Request;
6 7
 use Illuminate\Routing\Controller as BaseController;
7 8
 use Illuminate\Foundation\Validation\ValidatesRequests;
8 9
 use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
9 10
 
10 11
 class Controller extends BaseController
11 12
 {
12
-    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
13
+    use AuthorizesRequests,
14
+        DispatchesJobs,
15
+        ValidatesRequests {
16
+        ValidatesRequests::validate as validate_orig;
17
+        ValidatesRequests::validateWithBag as validateWithBag_orig;
18
+    }
19
+
20
+    // Hacks to allow recursive nesting of validations in string and array format
21
+
22
+    public function makeValidator($data, $rules, $messages = array(), $customAttributes = array())
23
+    {
24
+        return \Validator::make($data, vali($rules), $messages, $customAttributes);
25
+    }
26
+
27
+    public function validate(Request $request, array $rules,
28
+                             array $messages = [], array $customAttributes = [])
29
+    {
30
+        return objBag($this->validate_orig($request, vali($rules), $messages, $customAttributes));
31
+    }
32
+
33
+    public function validateWithBag($errorBag, Request $request, array $rules,
34
+                                    array $messages = [], array $customAttributes = [])
35
+    {
36
+        return objBag($this->validateWithBag_orig($errorBag, $request, vali($rules),
37
+            $messages, $customAttributes));
38
+    }
13 39
 
14 40
     protected function backWithErrors($errors)
15 41
     {

+ 25 - 18
app/Http/Controllers/TableController.php View File

@@ -54,21 +54,24 @@ class TableController extends Controller
54 54
         /** @var User $u */
55 55
         $u = \Auth::user();
56 56
 
57
-        $this->validate($request, [
58
-            'name' => 'required|string|max:255',
59
-            'title' => 'string|string|max:255',
60
-            'description' => 'string|nullable|max:4000',
61
-            'license' => 'string|nullable|max:4000',
62
-            'origin' => 'string|nullable|max:4000',
57
+        $input = $this->validate($request, [
58
+            'name' => [
59
+                'required',
60
+                VALI_NAME,
61
+                Rule::unique('tables'),
62
+            ],
63
+            'title' => ['required', VALI_LINE],
64
+            'description' => ['nullable', VALI_TEXT],
65
+            'license' => ['nullable', VALI_TEXT],
66
+            'origin' => ['nullable', VALI_TEXT],
63 67
             'columns' => 'required|string',
64 68
             'data' => 'string|nullable',
65 69
         ]);
66 70
 
67 71
         // Check if table name is unique for user
68
-        $tabName = $request->get('name');
69
-        if ($u->tables()->where('name', $tabName)->exists()) {
72
+        if ($u->tables()->where('name', $input->name)->exists()) {
70 73
             return $this->backWithErrors([
71
-                'name' => "A table called \"$tabName\" already exists in your account.",
74
+                'name' => "A table called \"$input->name\" already exists in your account.",
72 75
             ]);
73 76
         }
74 77
 
@@ -76,7 +79,7 @@ class TableController extends Controller
76 79
         /** @var Column[] $columns */
77 80
         $columns = [];
78 81
         $column_keys = []; // for checking duplicates
79
-        $colTable = array_map('str_getcsv', explode("\n", $request->get('columns')));
82
+        $colTable = array_map('str_getcsv', explode("\n", $input->columns));
80 83
 
81 84
         // prevent griefing via long list of columns
82 85
         if (count($colTable) > 100) return $this->backWithErrors(['columns' => "Too many columns"]);
@@ -104,7 +107,7 @@ class TableController extends Controller
104 107
         }
105 108
         if (count($columns) == 0) return $this->backWithErrors(['columns' => "Define at least one column"]);
106 109
 
107
-        $rowTable = array_map('str_getcsv', explode("\n", $request->get('data')));
110
+        $rowTable = array_map('str_getcsv', explode("\n", $input->data));
108 111
 
109 112
         // Preparing data to insert into the Rows table
110 113
         $rowsData = null;
@@ -116,6 +119,10 @@ class TableController extends Controller
116 119
                 $parsed = [];
117 120
                 foreach ($row as $i => $val) {
118 121
                     $key = $columns[$i]->name;
122
+                    if (strlen($val) > 255) {
123
+                        // try to stop people inserting unstructured crap / malformed CSV
124
+                        throw new NotApplicableException("Value for column $key too long.");
125
+                    }
119 126
                     $parsed[$key] = $columns[$i]->cast($val);
120 127
                 }
121 128
                 return [
@@ -127,7 +134,7 @@ class TableController extends Controller
127 134
         }
128 135
 
129 136
         $revisionFields = [
130
-            'note' => "Initial revision of table $u->name/$tabName",
137
+            'note' => "Initial revision of table $u->name/$input->name",
131 138
             'columns' => json_encode($columns),
132 139
             'row_count' => count($rowsData),
133 140
         ];
@@ -135,11 +142,11 @@ class TableController extends Controller
135 142
         $tableFields = [
136 143
             'owner_id' => $u->id,
137 144
             'revision_id' => 0,
138
-            'name' => $tabName,
139
-            'title' => $request->get('title'),
140
-            'description' => $request->get('description'),
141
-            'license' => $request->get('license'),
142
-            'origin' => $request->get('origin'),
145
+            'name' => $input->name,
146
+            'title' => $input->title,
147
+            'description' => $input->description,
148
+            'license' => $input->license,
149
+            'origin' => $input->origin,
143 150
         ];
144 151
 
145 152
         \DB::transaction(function () use ($revisionFields, $tableFields, $rowsData) {
@@ -156,6 +163,6 @@ class TableController extends Controller
156 163
             $revision->rows()->createMany($rowsData);
157 164
         });
158 165
 
159
-        return redirect(route('table.view', ['user' => $u, 'table' => $tabName]));
166
+        return redirect(route('table.view', ['user' => $u, 'table' => $input->name]));
160 167
     }
161 168
 }

+ 57 - 4
app/Http/Controllers/UserController.php View File

@@ -3,7 +3,12 @@
3 3
 
4 4
 namespace App\Http\Controllers;
5 5
 
6
+use App\Models\EmailConfirmation;
6 7
 use App\Models\User;
8
+use Hash;
9
+use Illuminate\Http\Request;
10
+use Illuminate\Validation\Rule;
11
+use MightyPork\Utils\Str;
7 12
 
8 13
 class UserController extends Controller
9 14
 {
@@ -22,18 +27,66 @@ class UserController extends Controller
22 27
     }
23 28
 
24 29
     /**
25
-     * Edit user profile
30
+     * Edit own profile
26 31
      *
27 32
      * @param User $user
28 33
      * @return \Illuminate\View\View
29 34
      */
30 35
     public function edit()
31 36
     {
32
-        return view('user.edit')->with('user', \Auth::user());
37
+        return view('user.edit')->with('user', \user());
33 38
     }
34 39
 
35
-    public function store()
40
+    /**
41
+     * Store changed profile
42
+     */
43
+    public function store(Request $request)
36 44
     {
37
-        echo "Not impl";
45
+        $input = $this->validate($request, [
46
+            'name' => [
47
+                'required',
48
+                VALI_NAME,
49
+                Rule::unique('users')->ignoreModel(\user()),
50
+            ],
51
+            'email' => [
52
+                'required',
53
+                VALI_EMAIL,
54
+                Rule::unique('users')->ignoreModel(\user()),
55
+            ],
56
+            'bio' => ['nullable', VALI_TEXT],
57
+            'title' => ['required', VALI_LINE],
58
+            'website' => ['required', VALI_LINE],
59
+            'new_password' => ['nullable', 'confirmed', VALI_PASSWORD],
60
+        ]);
61
+
62
+        $user = user();
63
+
64
+        if ($input->email != $user->email) {
65
+            $confirmation = EmailConfirmation::create([
66
+                'user_id' => $user->id,
67
+                'email' => $input->email,
68
+                'token' => Str::random(60),
69
+            ]);
70
+
71
+            flash()->warning("New e-mail confirmation sent to $input->email.")->important();
72
+
73
+            // TODO send the e-mail
74
+
75
+            unset($input->email);
76
+        }
77
+
78
+        $user->fill($input->all());
79
+
80
+        if ($input->has('new_password')) {
81
+            $user->password = Hash::make($input->new_password);
82
+
83
+            flash()->warning('Password changed');
84
+        }
85
+
86
+        $user->save();
87
+
88
+        flash()->success('Settings saved');
89
+
90
+        return back();
38 91
     }
39 92
 }

+ 1 - 0
app/Models/EmailConfirmation.php View File

@@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Model;
11 11
  * @property \Carbon\Carbon $created_at
12 12
  * @property int $user_id
13 13
  * @property string $token
14
+ * @property string $email
14 15
  * @property-read User $user
15 16
  */
16 17
 class EmailConfirmation extends Model

+ 2 - 1
app/Models/User.php View File

@@ -21,6 +21,7 @@ use MightyPork\Exceptions\NotExistException;
21 21
  * @property string $name - unique, for vanity URL
22 22
  * @property string $title - for display
23 23
  * @property string $bio - user bio
24
+ * @property string $website - custom url
24 25
  * @property string $email - unique, for login and social auth chaining
25 26
  * @property string $password - hashed pw
26 27
  * @property bool $confirmed - user e-mail is confirmed
@@ -48,7 +49,7 @@ class User extends Authenticatable
48 49
      * @var array
49 50
      */
50 51
     protected $fillable = [
51
-        'name', 'title', 'email', 'password',
52
+        'name', 'title', 'email', 'password', 'bio', 'website'
52 53
     ];
53 54
 
54 55
     /**

+ 29 - 0
app/Providers/ValidationServiceProvider.php View File

@@ -0,0 +1,29 @@
1
+<?php
2
+
3
+namespace App\Providers;
4
+
5
+use Illuminate\Support\ServiceProvider;
6
+use Validator;
7
+
8
+class ValidationServiceProvider extends ServiceProvider
9
+{
10
+    /**
11
+     * Bootstrap services.
12
+     *
13
+     * @return void
14
+     */
15
+    public function boot()
16
+    {
17
+        //
18
+    }
19
+
20
+    /**
21
+     * Register services.
22
+     *
23
+     * @return void
24
+     */
25
+    public function register()
26
+    {
27
+        //
28
+    }
29
+}

+ 2 - 0
app/View/Widget.php View File

@@ -9,6 +9,8 @@ namespace App\View;
9 9
  * @property-read string $name
10 10
  * @property-read string $id
11 11
  * @property-read string $label
12
+ * @property-read string $prepend
13
+ * @property-read string $append
12 14
  * @property-read string|null $help
13 15
  * @property-read string|null $value
14 16
  * @property-read string $attributes

+ 42 - 0
app/helpers.php View File

@@ -1,5 +1,11 @@
1 1
 <?php
2 2
 
3
+const VALI_NAME = 'string|regex:/^[a-z0-9_.-]+$/i|max:255';
4
+const VALI_PASSWORD = 'string|min:6|max:1024';
5
+const VALI_EMAIL = 'string|email|max:255';
6
+const VALI_TEXT = 'string|max:4095';
7
+const VALI_LINE = 'string|max:255';
8
+
3 9
 // global helpers
4 10
 function authed() {
5 11
     return ! \Auth::guest();
@@ -22,3 +28,39 @@ function faker() {
22 28
     if ($fac !== null) return $fac;
23 29
     return $fac = Faker\Factory::create();
24 30
 }
31
+
32
+/**
33
+ * Recursively expand validation rules
34
+ *
35
+ * @param $arr
36
+ * @return array
37
+ */
38
+function vali($arr) {
39
+    $result = [];
40
+    foreach ($arr as $key => $rules) {
41
+        // top level
42
+        if (is_array($rules)) {
43
+            $ar = [];
44
+            foreach ($rules as $rule) {
45
+                if (is_string($rule) && strpos($rule, '|') !== false) {
46
+                    foreach (explode('|', $rule) as $rr) {
47
+                        $ar[] = $rr;
48
+                    }
49
+                } else if (is_array($rule)) {
50
+                    // nested array, assume no further recursion
51
+                    foreach ($rule as $rr) {
52
+                        $ar[] = $rr;
53
+                    }
54
+                } else {
55
+                    // Rule
56
+                    $ar[] = $rule;
57
+                }
58
+            }
59
+            $result[$key] = $ar;
60
+        } else {
61
+            // string or Rule
62
+            $result[$key] = $rules;
63
+        }
64
+    }
65
+    return $result;
66
+}

+ 1 - 0
composer.json View File

@@ -14,6 +14,7 @@
14 14
     "doctrine/dbal": "^2.7",
15 15
     "fideloper/proxy": "^4.0",
16 16
     "guzzlehttp/guzzle": "^6.0",
17
+    "laracasts/flash": "^3.0",
17 18
     "laravel/framework": "5.6.*",
18 19
     "laravel/socialite": "^3.0",
19 20
     "laravel/tinker": "^1.0",

+ 55 - 1
composer.lock View File

@@ -4,7 +4,7 @@
4 4
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
5 5
         "This file is @generated automatically"
6 6
     ],
7
-    "content-hash": "1bb552d1b383427434286ed0ced8293b",
7
+    "content-hash": "4a71a6ea4e0158136c11e0a93170b0c3",
8 8
     "packages": [
9 9
         {
10 10
             "name": "barryvdh/laravel-debugbar",
@@ -1052,6 +1052,60 @@
1052 1052
             "time": "2015-04-20T18:58:01+00:00"
1053 1053
         },
1054 1054
         {
1055
+            "name": "laracasts/flash",
1056
+            "version": "3.0.2",
1057
+            "source": {
1058
+                "type": "git",
1059
+                "url": "https://github.com/laracasts/flash.git",
1060
+                "reference": "10cd420ab63fd0796bf5e1e5b99f87636d2f4333"
1061
+            },
1062
+            "dist": {
1063
+                "type": "zip",
1064
+                "url": "https://api.github.com/repos/laracasts/flash/zipball/10cd420ab63fd0796bf5e1e5b99f87636d2f4333",
1065
+                "reference": "10cd420ab63fd0796bf5e1e5b99f87636d2f4333",
1066
+                "shasum": ""
1067
+            },
1068
+            "require": {
1069
+                "illuminate/support": "~5.0",
1070
+                "php": ">=5.4.0"
1071
+            },
1072
+            "require-dev": {
1073
+                "mockery/mockery": "dev-master",
1074
+                "phpunit/phpunit": "^6.1"
1075
+            },
1076
+            "type": "library",
1077
+            "extra": {
1078
+                "laravel": {
1079
+                    "providers": [
1080
+                        "Laracasts\\Flash\\FlashServiceProvider"
1081
+                    ],
1082
+                    "aliases": {
1083
+                        "Flash": "Laracasts\\Flash\\Flash"
1084
+                    }
1085
+                }
1086
+            },
1087
+            "autoload": {
1088
+                "psr-0": {
1089
+                    "Laracasts\\Flash": "src/"
1090
+                },
1091
+                "files": [
1092
+                    "src/Laracasts/Flash/functions.php"
1093
+                ]
1094
+            },
1095
+            "notification-url": "https://packagist.org/downloads/",
1096
+            "license": [
1097
+                "MIT"
1098
+            ],
1099
+            "authors": [
1100
+                {
1101
+                    "name": "Jeffrey Way",
1102
+                    "email": "jeffrey@laracasts.com"
1103
+                }
1104
+            ],
1105
+            "description": "Easy flash notifications",
1106
+            "time": "2017-06-22T19:01:19+00:00"
1107
+        },
1108
+        {
1055 1109
             "name": "laravel/framework",
1056 1110
             "version": "v5.6.27",
1057 1111
             "source": {

+ 1 - 0
config/app.php View File

@@ -159,6 +159,7 @@ return [
159 159
         // App\Providers\BroadcastServiceProvider::class,
160 160
         App\Providers\EventServiceProvider::class,
161 161
         App\Providers\RouteServiceProvider::class,
162
+        App\Providers\ValidationServiceProvider::class,
162 163
 
163 164
         MightyPork\Providers\BladeExtensionsProvider::class,
164 165
         MightyPork\Providers\MacroServiceProvider::class,

+ 1 - 0
database/migrations/2018_07_22_083900_create_email_confirmations_table.php View File

@@ -14,6 +14,7 @@ class CreateEmailConfirmationsTable extends Migration
14 14
     public function up()
15 15
     {
16 16
         Schema::create('email_confirmations', function (Blueprint $table) {
17
+            $table->increments('id');
17 18
             $table->unsignedInteger('user_id')->index();
18 19
             $table->timestamp('created_at')->nullable();
19 20
             $table->string('email');

+ 48 - 3
porklib/helpers.php View File

@@ -65,7 +65,8 @@ function unless($cond, $then, $else = '')
65 65
  * - Undefined keys are returned as null.
66 66
  * - array and object values are wrapped in objBag when returned.
67 67
  */
68
-class objBag implements JsonSerializable {
68
+class objBag implements JsonSerializable, ArrayAccess {
69
+    /** @var object */
69 70
 	private $wrapped;
70 71
 
71 72
 	public function __construct($wrapped)
@@ -86,7 +87,21 @@ class objBag implements JsonSerializable {
86 87
 		return null;
87 88
 	}
88 89
 
89
-	public function __isset($name)
90
+	public function __set($name, $value)
91
+    {
92
+        if ($this->wrapped) {
93
+            $this->wrapped->$name = $value;
94
+        }
95
+    }
96
+
97
+    public function __unset($name)
98
+    {
99
+        if ($this->wrapped) {
100
+            unset($this->wrapped->$name);
101
+        }
102
+    }
103
+
104
+    public function __isset($name)
90 105
 	{
91 106
 		return isset($this->wrapped->$name);
92 107
 	}
@@ -99,7 +114,7 @@ class objBag implements JsonSerializable {
99 114
 
100 115
 	public function has($name)
101 116
 	{
102
-		return isset($this->$name);
117
+		return isset($this->$name) && $this->$name !== null;
103 118
 	}
104 119
 
105 120
 	public function unpack()
@@ -107,6 +122,16 @@ class objBag implements JsonSerializable {
107 122
 		return $this->wrapped;
108 123
 	}
109 124
 
125
+    public function toArray()
126
+    {
127
+        return(array)$this->wrapped;
128
+	}
129
+
130
+    public function all()
131
+    {
132
+        return $this->toArray();
133
+    }
134
+
110 135
 	/**
111 136
 	 * Specify data which should be serialized to JSON
112 137
 	 *
@@ -119,6 +144,26 @@ class objBag implements JsonSerializable {
119 144
 	{
120 145
 		return $this->wrapped;
121 146
 	}
147
+
148
+    public function offsetExists($offset)
149
+    {
150
+        return isset($this->$offset);
151
+    }
152
+
153
+    public function offsetGet($offset)
154
+    {
155
+        return $this->$offset;
156
+    }
157
+
158
+    public function offsetSet($offset, $value)
159
+    {
160
+        $this->$offset = $value;
161
+    }
162
+
163
+    public function offsetUnset($offset)
164
+    {
165
+        unset($this->$offset);
166
+    }
122 167
 }
123 168
 
124 169
 function objBag($obj) {

+ 129 - 84
public/fonts/fa-dtbl-1-preview.html View File

@@ -161,7 +161,8 @@
161 161
       [data-icon]:before { content: attr(data-icon); }
162 162
 
163 163
       [data-icon]:before,
164
-      .fa-bell:before,
164
+      .fa-at:before,
165
+.fa-bell:before,
165 166
 .fa-bell-o:before,
166 167
 .fa-calendar:before,
167 168
 .fa-check:before,
@@ -177,8 +178,10 @@
177 178
 .fa-floppy-o:before,
178 179
 .fa-gavel:before,
179 180
 .fa-github:before,
181
+.fa-globe:before,
180 182
 .fa-google:before,
181 183
 .fa-history:before,
184
+.fa-key-modern:before,
182 185
 .fa-link:before,
183 186
 .fa-pencil-square-o:before,
184 187
 .fa-question-circle:before,
@@ -216,47 +219,50 @@
216 219
   font-smoothing: antialiased;
217 220
       }
218 221
 
219
-      .fa-bell:before { content: "\f100"; }
220
-.fa-bell-o:before { content: "\f101"; }
221
-.fa-calendar:before { content: "\f102"; }
222
-.fa-check:before { content: "\f103"; }
223
-.fa-clock-o:before { content: "\f104"; }
224
-.fa-cloud-upload:before { content: "\f105"; }
225
-.fa-code-fork:before { content: "\f106"; }
226
-.fa-download:before { content: "\f107"; }
227
-.fa-eye:before { content: "\f108"; }
228
-.fa-eye-slash:before { content: "\f109"; }
229
-.fa-facebook-square:before { content: "\f10a"; }
230
-.fa-filter:before { content: "\f10b"; }
231
-.fa-flag:before { content: "\f10c"; }
232
-.fa-floppy-o:before { content: "\f10d"; }
233
-.fa-gavel:before { content: "\f10e"; }
234
-.fa-github:before { content: "\f10f"; }
235
-.fa-google:before { content: "\f110"; }
236
-.fa-history:before { content: "\f111"; }
237
-.fa-link:before { content: "\f112"; }
238
-.fa-pencil-square-o:before { content: "\f113"; }
239
-.fa-question-circle:before { content: "\f114"; }
240
-.fa-quote-left:before { content: "\f115"; }
241
-.fa-reply:before { content: "\f116"; }
242
-.fa-rss:before { content: "\f117"; }
243
-.fa-search:before { content: "\f118"; }
244
-.fa-share-alt:before { content: "\f119"; }
245
-.fa-sign-in:before { content: "\f11a"; }
246
-.fa-sign-out:before { content: "\f11b"; }
247
-.fa-sliders:before { content: "\f11c"; }
248
-.fa-sort:before { content: "\f11d"; }
249
-.fa-sort-asc:before { content: "\f11e"; }
250
-.fa-sort-desc:before { content: "\f11f"; }
251
-.fa-star:before { content: "\f120"; }
252
-.fa-star-o:before { content: "\f121"; }
253
-.fa-table:before { content: "\f122"; }
254
-.fa-times:before { content: "\f123"; }
255
-.fa-trash:before { content: "\f124"; }
256
-.fa-trash-o:before { content: "\f125"; }
257
-.fa-user-circle-o:before { content: "\f126"; }
258
-.fa-user-plus:before { content: "\f127"; }
259
-.fa-wrench:before { content: "\f128"; }
222
+      .fa-at:before { content: "\f100"; }
223
+.fa-bell:before { content: "\f101"; }
224
+.fa-bell-o:before { content: "\f102"; }
225
+.fa-calendar:before { content: "\f103"; }
226
+.fa-check:before { content: "\f104"; }
227
+.fa-clock-o:before { content: "\f105"; }
228
+.fa-cloud-upload:before { content: "\f106"; }
229
+.fa-code-fork:before { content: "\f107"; }
230
+.fa-download:before { content: "\f108"; }
231
+.fa-eye:before { content: "\f109"; }
232
+.fa-eye-slash:before { content: "\f10a"; }
233
+.fa-facebook-square:before { content: "\f10b"; }
234
+.fa-filter:before { content: "\f10c"; }
235
+.fa-flag:before { content: "\f10d"; }
236
+.fa-floppy-o:before { content: "\f10e"; }
237
+.fa-gavel:before { content: "\f10f"; }
238
+.fa-github:before { content: "\f110"; }
239
+.fa-globe:before { content: "\f111"; }
240
+.fa-google:before { content: "\f112"; }
241
+.fa-history:before { content: "\f113"; }
242
+.fa-key-modern:before { content: "\f114"; }
243
+.fa-link:before { content: "\f115"; }
244
+.fa-pencil-square-o:before { content: "\f116"; }
245
+.fa-question-circle:before { content: "\f117"; }
246
+.fa-quote-left:before { content: "\f118"; }
247
+.fa-reply:before { content: "\f119"; }
248
+.fa-rss:before { content: "\f11a"; }
249
+.fa-search:before { content: "\f11b"; }
250
+.fa-share-alt:before { content: "\f11c"; }
251
+.fa-sign-in:before { content: "\f11d"; }
252
+.fa-sign-out:before { content: "\f11e"; }
253
+.fa-sliders:before { content: "\f11f"; }
254
+.fa-sort:before { content: "\f120"; }
255
+.fa-sort-asc:before { content: "\f121"; }
256
+.fa-sort-desc:before { content: "\f122"; }
257
+.fa-star:before { content: "\f123"; }
258
+.fa-star-o:before { content: "\f124"; }
259
+.fa-table:before { content: "\f125"; }
260
+.fa-times:before { content: "\f126"; }
261
+.fa-trash:before { content: "\f127"; }
262
+.fa-trash-o:before { content: "\f128"; }
263
+.fa-user-circle-o:before { content: "\f129"; }
264
+.fa-user-plus:before { content: "\f12a"; }
265
+.fa-wrench:before { content: "\f12b"; }
260 266
     </style>
261 267
 
262 268
     <!--[if lte IE 8]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
@@ -272,13 +278,26 @@
272 278
   <body class="characters-off">
273 279
     <div id="page" class="container">
274 280
       <header>
275
-        <h1>fa-dtbl-1 contains 41 glyphs:</h1>
281
+        <h1>fa-dtbl-1 contains 44 glyphs:</h1>
276 282
         <a onclick="toggleCharacters(); return false;" href="#">Toggle Preview Characters</a>
277 283
       </header>
278 284
 
279 285
       
280 286
       <div class="glyph">
281 287
         <div class="preview-glyphs">
288
+          <span class="step size-12"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-14"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-16"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-18"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-21"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-24"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-36"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-48"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-60"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span><span class="step size-72"><span class="letters">Pp</span><i id="fa-at" class="fa-at"></i></span>
289
+        </div>
290
+        <div class="preview-scale">
291
+          <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span>
292
+        </div>
293
+        <div class="usage">
294
+          <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-at" />
295
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf100;" />
296
+        </div>
297
+      </div>
298
+      
299
+      <div class="glyph">
300
+        <div class="preview-glyphs">
282 301
           <span class="step size-12"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-14"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-16"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-18"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-21"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-24"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-36"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-48"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-60"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span><span class="step size-72"><span class="letters">Pp</span><i id="fa-bell" class="fa-bell"></i></span>
283 302
         </div>
284 303
         <div class="preview-scale">
@@ -286,7 +305,7 @@
286 305
         </div>
287 306
         <div class="usage">
288 307
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-bell" />
289
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf100;" />
308
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf101;" />
290 309
         </div>
291 310
       </div>
292 311
       
@@ -299,7 +318,7 @@
299 318
         </div>
300 319
         <div class="usage">
301 320
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-bell-o" />
302
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf101;" />
321
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf102;" />
303 322
         </div>
304 323
       </div>
305 324
       
@@ -312,7 +331,7 @@
312 331
         </div>
313 332
         <div class="usage">
314 333
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-calendar" />
315
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf102;" />
334
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf103;" />
316 335
         </div>
317 336
       </div>
318 337
       
@@ -325,7 +344,7 @@
325 344
         </div>
326 345
         <div class="usage">
327 346
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-check" />
328
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf103;" />
347
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf104;" />
329 348
         </div>
330 349
       </div>
331 350
       
@@ -338,7 +357,7 @@
338 357
         </div>
339 358
         <div class="usage">
340 359
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-clock-o" />
341
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf104;" />
360
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf105;" />
342 361
         </div>
343 362
       </div>
344 363
       
@@ -351,7 +370,7 @@
351 370
         </div>
352 371
         <div class="usage">
353 372
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-cloud-upload" />
354
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf105;" />
373
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf106;" />
355 374
         </div>
356 375
       </div>
357 376
       
@@ -364,7 +383,7 @@
364 383
         </div>
365 384
         <div class="usage">
366 385
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-code-fork" />
367
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf106;" />
386
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf107;" />
368 387
         </div>
369 388
       </div>
370 389
       
@@ -377,7 +396,7 @@
377 396
         </div>
378 397
         <div class="usage">
379 398
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-download" />
380
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf107;" />
399
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf108;" />
381 400
         </div>
382 401
       </div>
383 402
       
@@ -390,7 +409,7 @@
390 409
         </div>
391 410
         <div class="usage">
392 411
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-eye" />
393
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf108;" />
412
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf109;" />
394 413
         </div>
395 414
       </div>
396 415
       
@@ -403,7 +422,7 @@
403 422
         </div>
404 423
         <div class="usage">
405 424
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-eye-slash" />
406
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf109;" />
425
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10a;" />
407 426
         </div>
408 427
       </div>
409 428
       
@@ -416,7 +435,7 @@
416 435
         </div>
417 436
         <div class="usage">
418 437
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-facebook-square" />
419
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10a;" />
438
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10b;" />
420 439
         </div>
421 440
       </div>
422 441
       
@@ -429,7 +448,7 @@
429 448
         </div>
430 449
         <div class="usage">
431 450
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-filter" />
432
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10b;" />
451
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10c;" />
433 452
         </div>
434 453
       </div>
435 454
       
@@ -442,7 +461,7 @@
442 461
         </div>
443 462
         <div class="usage">
444 463
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-flag" />
445
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10c;" />
464
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10d;" />
446 465
         </div>
447 466
       </div>
448 467
       
@@ -456,7 +475,7 @@
456 475
         <div class="usage">
457 476
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-floppy-o" />
458 477
        <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-save" />
459
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10d;" />
478
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10e;" />
460 479
         </div>
461 480
       </div>
462 481
       
@@ -470,7 +489,7 @@
470 489
         <div class="usage">
471 490
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-gavel" />
472 491
        <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-legal" />
473
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10e;" />
492
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10f;" />
474 493
         </div>
475 494
       </div>
476 495
       
@@ -483,7 +502,20 @@
483 502
         </div>
484 503
         <div class="usage">
485 504
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-github" />
486
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf10f;" />
505
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf110;" />
506
+        </div>
507
+      </div>
508
+      
509
+      <div class="glyph">
510
+        <div class="preview-glyphs">
511
+          <span class="step size-12"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-14"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-16"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-18"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-21"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-24"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-36"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-48"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-60"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span><span class="step size-72"><span class="letters">Pp</span><i id="fa-globe" class="fa-globe"></i></span>
512
+        </div>
513
+        <div class="preview-scale">
514
+          <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span>
515
+        </div>
516
+        <div class="usage">
517
+          <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-globe" />
518
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf111;" />
487 519
         </div>
488 520
       </div>
489 521
       
@@ -496,7 +528,7 @@
496 528
         </div>
497 529
         <div class="usage">
498 530
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-google" />
499
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf110;" />
531
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf112;" />
500 532
         </div>
501 533
       </div>
502 534
       
@@ -509,7 +541,20 @@
509 541
         </div>
510 542
         <div class="usage">
511 543
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-history" />
512
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf111;" />
544
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf113;" />
545
+        </div>
546
+      </div>
547
+      
548
+      <div class="glyph">
549
+        <div class="preview-glyphs">
550
+          <span class="step size-12"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-14"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-16"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-18"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-21"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-24"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-36"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-48"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-60"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span><span class="step size-72"><span class="letters">Pp</span><i id="fa-key-modern" class="fa-key-modern"></i></span>
551
+        </div>
552
+        <div class="preview-scale">
553
+          <span class="step">12</span><span class="step">14</span><span class="step">16</span><span class="step">18</span><span class="step">21</span><span class="step">24</span><span class="step">36</span><span class="step">48</span><span class="step">60</span><span class="step">72</span>
554
+        </div>
555
+        <div class="usage">
556
+          <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-key-modern" />
557
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf114;" />
513 558
         </div>
514 559
       </div>
515 560
       
@@ -522,7 +567,7 @@
522 567
         </div>
523 568
         <div class="usage">
524 569
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-link" />
525
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf112;" />
570
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf115;" />
526 571
         </div>
527 572
       </div>
528 573
       
@@ -536,7 +581,7 @@
536 581
         <div class="usage">
537 582
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-pencil-square-o" />
538 583
        <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-edit" />
539
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf113;" />
584
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf116;" />
540 585
         </div>
541 586
       </div>
542 587
       
@@ -549,7 +594,7 @@
549 594
         </div>
550 595
         <div class="usage">
551 596
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-question-circle" />
552
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf114;" />
597
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf117;" />
553 598
         </div>
554 599
       </div>
555 600
       
@@ -562,7 +607,7 @@
562 607
         </div>
563 608
         <div class="usage">
564 609
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-quote-left" />
565
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf115;" />
610
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf118;" />
566 611
         </div>
567 612
       </div>
568 613
       
@@ -575,7 +620,7 @@
575 620
         </div>
576 621
         <div class="usage">
577 622
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-reply" />
578
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf116;" />
623
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf119;" />
579 624
         </div>
580 625
       </div>
581 626
       
@@ -588,7 +633,7 @@
588 633
         </div>
589 634
         <div class="usage">
590 635
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-rss" />
591
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf117;" />
636
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11a;" />
592 637
         </div>
593 638
       </div>
594 639
       
@@ -601,7 +646,7 @@
601 646
         </div>
602 647
         <div class="usage">
603 648
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-search" />
604
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf118;" />
649
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11b;" />
605 650
         </div>
606 651
       </div>
607 652
       
@@ -614,7 +659,7 @@
614 659
         </div>
615 660
         <div class="usage">
616 661
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-share-alt" />
617
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf119;" />
662
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11c;" />
618 663
         </div>
619 664
       </div>
620 665
       
@@ -627,7 +672,7 @@
627 672
         </div>
628 673
         <div class="usage">
629 674
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-sign-in" />
630
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11a;" />
675
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11d;" />
631 676
         </div>
632 677
       </div>
633 678
       
@@ -640,7 +685,7 @@
640 685
         </div>
641 686
         <div class="usage">
642 687
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-sign-out" />
643
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11b;" />
688
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11e;" />
644 689
         </div>
645 690
       </div>
646 691
       
@@ -653,7 +698,7 @@
653 698
         </div>
654 699
         <div class="usage">
655 700
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-sliders" />
656
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11c;" />
701
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11f;" />
657 702
         </div>
658 703
       </div>
659 704
       
@@ -666,7 +711,7 @@
666 711
         </div>
667 712
         <div class="usage">
668 713
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-sort" />
669
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11d;" />
714
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf120;" />
670 715
         </div>
671 716
       </div>
672 717
       
@@ -679,7 +724,7 @@
679 724
         </div>
680 725
         <div class="usage">
681 726
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-sort-asc" />
682
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11e;" />
727
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf121;" />
683 728
         </div>
684 729
       </div>
685 730
       
@@ -692,7 +737,7 @@
692 737
         </div>
693 738
         <div class="usage">
694 739
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-sort-desc" />
695
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf11f;" />
740
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf122;" />
696 741
         </div>
697 742
       </div>
698 743
       
@@ -705,7 +750,7 @@
705 750
         </div>
706 751
         <div class="usage">
707 752
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-star" />
708
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf120;" />
753
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf123;" />
709 754
         </div>
710 755
       </div>
711 756
       
@@ -718,7 +763,7 @@
718 763
         </div>
719 764
         <div class="usage">
720 765
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-star-o" />
721
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf121;" />
766
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf124;" />
722 767
         </div>
723 768
       </div>
724 769
       
@@ -731,7 +776,7 @@
731 776
         </div>
732 777
         <div class="usage">
733 778
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-table" />
734
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf122;" />
779
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf125;" />
735 780
         </div>
736 781
       </div>
737 782
       
@@ -745,7 +790,7 @@
745 790
         <div class="usage">
746 791
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-times" />
747 792
        <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-close" />
748
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf123;" />
793
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf126;" />
749 794
         </div>
750 795
       </div>
751 796
       
@@ -758,7 +803,7 @@
758 803
         </div>
759 804
         <div class="usage">
760 805
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-trash" />
761
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf124;" />
806
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf127;" />
762 807
         </div>
763 808
       </div>
764 809
       
@@ -771,7 +816,7 @@
771 816
         </div>
772 817
         <div class="usage">
773 818
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-trash-o" />
774
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf125;" />
819
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf128;" />
775 820
         </div>
776 821
       </div>
777 822
       
@@ -784,7 +829,7 @@
784 829
         </div>
785 830
         <div class="usage">
786 831
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-user-circle-o" />
787
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf126;" />
832
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf129;" />
788 833
         </div>
789 834
       </div>
790 835
       
@@ -797,7 +842,7 @@
797 842
         </div>
798 843
         <div class="usage">
799 844
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-user-plus" />
800
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf127;" />
845
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf12a;" />
801 846
         </div>
802 847
       </div>
803 848
       
@@ -810,7 +855,7 @@
810 855
         </div>
811 856
         <div class="usage">
812 857
           <input class="class" type="text" readonly="readonly" onClick="this.select();" value=".fa-wrench" />
813
-          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf128;" />
858
+          <input class="point" type="text" readonly="readonly" onClick="this.select();" value="&amp;#xf12b;" />
814 859
         </div>
815 860
       </div>
816 861
       

+ 44 - 41
public/fonts/fa-dtbl-1.css View File

@@ -38,44 +38,47 @@
38 38
   font-smoothing: antialiased;
39 39
 }
40 40
 
41
-.fa-bell::before { content: "\f100"; }
42
-.fa-bell-o::before { content: "\f101"; }
43
-.fa-calendar::before { content: "\f102"; }
44
-.fa-check::before { content: "\f103"; }
45
-.fa-clock-o::before { content: "\f104"; }
46
-.fa-cloud-upload::before { content: "\f105"; }
47
-.fa-code-fork::before { content: "\f106"; }
48
-.fa-download::before { content: "\f107"; }
49
-.fa-eye::before { content: "\f108"; }
50
-.fa-eye-slash::before { content: "\f109"; }
51
-.fa-facebook-square::before { content: "\f10a"; }
52
-.fa-filter::before { content: "\f10b"; }
53
-.fa-flag::before { content: "\f10c"; }
54
-.fa-floppy-o::before, .fa-save::before { content: "\f10d"; }
55
-.fa-gavel::before, .fa-legal::before { content: "\f10e"; }
56
-.fa-github::before { content: "\f10f"; }
57
-.fa-google::before { content: "\f110"; }
58
-.fa-history::before { content: "\f111"; }
59
-.fa-link::before { content: "\f112"; }
60
-.fa-pencil-square-o::before, .fa-edit::before { content: "\f113"; }
61
-.fa-question-circle::before { content: "\f114"; }
62
-.fa-quote-left::before { content: "\f115"; }
63
-.fa-reply::before { content: "\f116"; }
64
-.fa-rss::before { content: "\f117"; }
65
-.fa-search::before { content: "\f118"; }
66
-.fa-share-alt::before { content: "\f119"; }
67
-.fa-sign-in::before { content: "\f11a"; }
68
-.fa-sign-out::before { content: "\f11b"; }
69
-.fa-sliders::before { content: "\f11c"; }
70
-.fa-sort::before { content: "\f11d"; }
71
-.fa-sort-asc::before { content: "\f11e"; }
72
-.fa-sort-desc::before { content: "\f11f"; }
73
-.fa-star::before { content: "\f120"; }
74
-.fa-star-o::before { content: "\f121"; }
75
-.fa-table::before { content: "\f122"; }
76
-.fa-times::before, .fa-close::before { content: "\f123"; }
77
-.fa-trash::before { content: "\f124"; }
78
-.fa-trash-o::before { content: "\f125"; }
79
-.fa-user-circle-o::before { content: "\f126"; }
80
-.fa-user-plus::before { content: "\f127"; }
81
-.fa-wrench::before { content: "\f128"; }
41
+.fa-at::before { content: "\f100"; }
42
+.fa-bell::before { content: "\f101"; }
43
+.fa-bell-o::before { content: "\f102"; }
44
+.fa-calendar::before { content: "\f103"; }
45
+.fa-check::before { content: "\f104"; }
46
+.fa-clock-o::before { content: "\f105"; }
47
+.fa-cloud-upload::before { content: "\f106"; }
48
+.fa-code-fork::before { content: "\f107"; }
49
+.fa-download::before { content: "\f108"; }
50
+.fa-eye::before { content: "\f109"; }
51
+.fa-eye-slash::before { content: "\f10a"; }
52
+.fa-facebook-square::before { content: "\f10b"; }
53
+.fa-filter::before { content: "\f10c"; }
54
+.fa-flag::before { content: "\f10d"; }
55
+.fa-floppy-o::before, .fa-save::before { content: "\f10e"; }
56
+.fa-gavel::before, .fa-legal::before { content: "\f10f"; }
57
+.fa-github::before { content: "\f110"; }
58
+.fa-globe::before { content: "\f111"; }
59
+.fa-google::before { content: "\f112"; }
60
+.fa-history::before { content: "\f113"; }
61
+.fa-key-modern::before { content: "\f114"; }
62
+.fa-link::before { content: "\f115"; }
63
+.fa-pencil-square-o::before, .fa-edit::before { content: "\f116"; }
64
+.fa-question-circle::before { content: "\f117"; }
65
+.fa-quote-left::before { content: "\f118"; }
66
+.fa-reply::before { content: "\f119"; }
67
+.fa-rss::before { content: "\f11a"; }
68
+.fa-search::before { content: "\f11b"; }
69
+.fa-share-alt::before { content: "\f11c"; }
70
+.fa-sign-in::before { content: "\f11d"; }
71
+.fa-sign-out::before { content: "\f11e"; }
72
+.fa-sliders::before { content: "\f11f"; }
73
+.fa-sort::before { content: "\f120"; }
74
+.fa-sort-asc::before { content: "\f121"; }
75
+.fa-sort-desc::before { content: "\f122"; }
76
+.fa-star::before { content: "\f123"; }
77
+.fa-star-o::before { content: "\f124"; }
78
+.fa-table::before { content: "\f125"; }
79
+.fa-times::before, .fa-close::before { content: "\f126"; }
80
+.fa-trash::before { content: "\f127"; }
81
+.fa-trash-o::before { content: "\f128"; }
82
+.fa-user-circle-o::before { content: "\f129"; }
83
+.fa-user-plus::before { content: "\f12a"; }
84
+.fa-wrench::before { content: "\f12b"; }

BIN
public/fonts/fa-dtbl-1.eot View File


+ 58 - 44
public/fonts/fa-dtbl-1.svg View File

@@ -5,7 +5,7 @@
5 5
 -->
6 6
 <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
7 7
 <metadata>
8
-Created by FontForge 20170805 at Sun Jul 22 15:14:07 2018
8
+Created by FontForge 20170805 at Sun Jul 22 23:07:59 2018
9 9
  By ondra
10 10
 The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/OFL). Fork Awesome is a fork based of off Font Awesome 4.7.0 by Dave Gandy. More info on licenses at https://forkawesome.github.io
11 11
 </metadata>
@@ -19,154 +19,168 @@ The Fork Awesome font is licensed under the SIL OFL 1.1 (http://scripts.sil.org/
19 19
     panose-1="2 0 5 3 0 0 0 0 0 0"
20 20
     ascent="1536"
21 21
     descent="-256"
22
-    bbox="-0.0376684 -256 2048 1536"
22
+    bbox="-0.0376684 -256 2048 1536.01"
23 23
     underline-thickness="89.6"
24 24
     underline-position="-179.2"
25
-    unicode-range="U+0020-F128"
25
+    unicode-range="U+0020-F12B"
26 26
   />
27 27
     <missing-glyph />
28 28
     <glyph glyph-name="space" unicode=" " horiz-adv-x="200" 
29 29
  />
30
-    <glyph glyph-name="bell" unicode="&#xf100;" horiz-adv-x="1664" 
30
+    <glyph glyph-name="at" unicode="&#xf100;" 
31
+d="M972 761c0 144 -75 230 -201 230c-166 0 -344 -165 -344 -432c0 -149 74 -234 204 -234c201 0 341 230 341 436zM1536 640c0 -311 -222 -428 -412 -434c-13 0 -18 -1 -32 -1c-62 0 -111 18 -142 53c-19 22 -30 50 -33 83c-62 -78 -170 -154 -305 -154
32
+c-215 0 -338 133 -338 365c0 319 221 578 491 578c117 0 211 -50 261 -135l2 19l11 56c1 8 8 18 15 18h118c5 0 10 -7 13 -11c3 -3 4 -11 3 -16l-120 -614c-4 -19 -5 -34 -5 -48c0 -54 16 -65 57 -65c68 2 288 30 288 306c0 389 -251 640 -640 640
33
+c-353 0 -640 -287 -640 -640s287 -640 640 -640c147 0 291 51 405 144c14 12 34 10 45 -4l41 -49c5 -7 8 -15 7 -24c-1 -8 -5 -16 -12 -22c-136 -111 -309 -173 -486 -173c-423 0 -768 345 -768 768s345 768 768 768c459 0 768 -309 768 -768z" />
34
+    <glyph glyph-name="bell" unicode="&#xf101;" horiz-adv-x="1664" 
31 35
 d="M848 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM182 128h1300c-179 202 -266 476 -266 832c0 129 -122 320 -384 320s-384 -191 -384 -320c0 -356 -87 -630 -266 -832zM1664 128
32 36
 c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-256 115 -256 256h-448c-70 0 -128 58 -128 128c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c265 -39 424 -249 424 -441
33 37
 c0 -483 172 -707 320 -832z" />
34
-    <glyph glyph-name="bell-o" unicode="&#xf101;" horiz-adv-x="1664" 
38
+    <glyph glyph-name="bell-o" unicode="&#xf102;" horiz-adv-x="1664" 
35 39
 d="M848 -160c0 9 -7 16 -16 16c-79 0 -144 65 -144 144c0 9 -7 16 -16 16s-16 -7 -16 -16c0 -97 79 -176 176 -176c9 0 16 7 16 16zM1664 128c0 -70 -58 -128 -128 -128h-448c0 -141 -115 -256 -256 -256s-256 115 -256 256h-448c-70 0 -128 58 -128 128
36 40
 c148 125 320 349 320 832c0 192 159 402 424 441c-5 12 -8 25 -8 39c0 53 43 96 96 96s96 -43 96 -96c0 -14 -3 -27 -8 -39c265 -39 424 -249 424 -441c0 -483 172 -707 320 -832z" />
37
-    <glyph glyph-name="calendar" unicode="&#xf102;" horiz-adv-x="1664" 
41
+    <glyph glyph-name="calendar" unicode="&#xf103;" horiz-adv-x="1664" 
38 42
 d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z
39 43
 M512 1088v288c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-288c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288c0 17 -15 32 -32 32h-64c-17 0 -32 -15 -32 -32v-288
40 44
 c0 -17 15 -32 32 -32h64c17 0 32 15 32 32zM1664 1152v-1280c0 -70 -58 -128 -128 -128h-1408c-70 0 -128 58 -128 128v1280c0 70 58 128 128 128h128v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h384v96c0 88 72 160 160 160h64c88 0 160 -72 160 -160v-96h128
41 45
 c70 0 128 -58 128 -128z" />
42
-    <glyph glyph-name="check" unicode="&#xf103;" horiz-adv-x="1550" 
46
+    <glyph glyph-name="check" unicode="&#xf104;" horiz-adv-x="1550" 
43 47
 d="M1550 970c0 -25 -10 -50 -28 -68l-724 -724l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136l-362 362c-18 18 -28 43 -28 68s10 50 28 68l136 136c18 18 43 28 68 28s50 -10 68 -28l294 -295l656 657c18 18 43 28 68 28s50 -10 68 -28l136 -136
44 48
 c18 -18 28 -43 28 -68z" />
45
-    <glyph glyph-name="clock-o" unicode="&#xf104;" 
49
+    <glyph glyph-name="clock-o" unicode="&#xf105;" 
46 50
 d="M896 992v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1312 640c0 300 -244 544 -544 544s-544 -244 -544 -544s244 -544 544 -544s544 244 544 544zM1536 640
47 51
 c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768s768 -344 768 -768z" />
48
-    <glyph glyph-name="cloud-upload" unicode="&#xf105;" horiz-adv-x="1920" 
52
+    <glyph glyph-name="cloud-upload" unicode="&#xf106;" horiz-adv-x="1920" 
49 53
 d="M1280 672c0 8 -3 17 -9 23l-352 352c-6 6 -14 9 -23 9c-8 0 -17 -3 -23 -9l-351 -351c-6 -7 -10 -15 -10 -24c0 -18 14 -32 32 -32h224v-352c0 -17 15 -32 32 -32h192c17 0 32 15 32 32v352h224c18 0 32 15 32 32zM1920 384c0 -212 -172 -384 -384 -384h-1088
50 54
 c-247 0 -448 201 -448 448c0 174 101 332 258 405c-1 15 -2 29 -2 43c0 283 229 512 512 512c208 0 395 -126 474 -318c46 40 105 62 166 62c141 0 256 -115 256 -256c0 -49 -14 -97 -41 -138c174 -41 297 -196 297 -374z" />
51
-    <glyph glyph-name="code-fork" unicode="&#xf106;" horiz-adv-x="1024" 
55
+    <glyph glyph-name="code-fork" unicode="&#xf107;" horiz-adv-x="1024" 
52 56
 d="M288 64c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM288 1216c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM928 1088c0 53 -43 96 -96 96s-96 -43 -96 -96s43 -96 96 -96s96 43 96 96zM1024 1088c0 -71 -39 -133 -96 -166
53 57
 c-3 -361 -259 -441 -429 -495c-159 -50 -211 -74 -211 -171v-26c57 -33 96 -95 96 -166c0 -106 -86 -192 -192 -192s-192 86 -192 192c0 71 39 133 96 166v820c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192c0 -71 -39 -133 -96 -166v-497
54 58
 c51 25 105 42 154 57c186 59 292 103 294 312c-57 33 -96 95 -96 166c0 106 86 192 192 192s192 -86 192 -192z" />
55
-    <glyph glyph-name="download" unicode="&#xf107;" horiz-adv-x="1664" 
59
+    <glyph glyph-name="download" unicode="&#xf108;" horiz-adv-x="1664" 
56 60
 d="M1280 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1536 192c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1664 416v-320c0 -53 -43 -96 -96 -96h-1472c-53 0 -96 43 -96 96v320c0 53 43 96 96 96h465l135 -136
57 61
 c37 -36 85 -56 136 -56s99 20 136 56l136 136h464c53 0 96 -43 96 -96zM1339 985c10 -24 5 -52 -14 -70l-448 -448c-12 -13 -29 -19 -45 -19s-33 6 -45 19l-448 448c-19 18 -24 46 -14 70c10 23 33 39 59 39h256v448c0 35 29 64 64 64h256c35 0 64 -29 64 -64v-448h256
58 62
 c26 0 49 -16 59 -39z" />
59
-    <glyph glyph-name="eye" unicode="&#xf108;" horiz-adv-x="1792" 
63
+    <glyph glyph-name="eye" unicode="&#xf109;" horiz-adv-x="1792" 
60 64
 d="M1664 576c-95 147 -225 273 -381 353c40 -68 61 -146 61 -225c0 -247 -201 -448 -448 -448s-448 201 -448 448c0 79 21 157 61 225c-156 -80 -286 -206 -381 -353c171 -264 447 -448 768 -448s597 184 768 448zM944 960c0 26 -22 48 -48 48c-167 0 -304 -137 -304 -304
61 65
 c0 -26 22 -48 48 -48s48 22 48 48c0 114 94 208 208 208c26 0 48 22 48 48zM1792 576c0 -25 -8 -48 -20 -69c-184 -303 -521 -507 -876 -507s-692 205 -876 507c-12 21 -20 44 -20 69s8 48 20 69c184 302 521 507 876 507s692 -205 876 -507c12 -21 20 -44 20 -69z" />
62
-    <glyph glyph-name="eye-slash" unicode="&#xf109;" horiz-adv-x="1792" 
66
+    <glyph glyph-name="eye-slash" unicode="&#xf10a;" horiz-adv-x="1792" 
63 67
 d="M555 201l78 141c-116 84 -185 219 -185 362c0 79 21 157 61 225c-156 -80 -286 -206 -381 -353c104 -161 251 -296 427 -375zM944 960c0 26 -22 48 -48 48c-167 0 -304 -137 -304 -304c0 -26 22 -48 48 -48s48 22 48 48c0 115 94 208 208 208c26 0 48 22 48 48z
64 68
 M1307 1151c0 -2 0 -7 -1 -9c-211 -377 -420 -756 -631 -1133l-49 -89c-6 -10 -17 -16 -28 -16c-18 0 -113 58 -134 70c-10 6 -16 16 -16 28c0 16 34 70 44 87c-194 88 -357 238 -472 418c-13 20 -20 44 -20 69c0 24 7 49 20 69c198 304 507 507 876 507c60 0 121 -6 180 -17
65 69
 l54 97c6 10 16 16 28 16c18 0 112 -58 133 -70c10 -6 16 -16 16 -27zM1344 704c0 -186 -115 -352 -288 -418l280 502c5 -28 8 -56 8 -84zM1792 576c0 -26 -7 -47 -20 -69c-31 -51 -70 -100 -109 -145c-196 -225 -466 -362 -767 -362l74 132c291 25 538 202 694 444
66 70
 c-74 115 -169 216 -282 294l63 112c124 -83 249 -208 327 -337c13 -22 20 -43 20 -69z" />
67
-    <glyph glyph-name="facebook-square" unicode="&#xf10a;" 
71
+    <glyph glyph-name="facebook-square" unicode="&#xf10b;" 
68 72
 d="M1248 1408c159 0 288 -129 288 -288v-960c0 -159 -129 -288 -288 -288h-188v595h199l30 232h-229v148c0 67 18 112 115 112l122 1v207c-21 3 -94 9 -178 9c-177 0 -299 -108 -299 -306v-171h-200v-232h200v-595h-532c-159 0 -288 129 -288 288v960c0 159 129 288 288 288
69 73
 h960z" />
70
-    <glyph glyph-name="filter" unicode="&#xf10b;" horiz-adv-x="1408" 
74
+    <glyph glyph-name="filter" unicode="&#xf10c;" horiz-adv-x="1408" 
71 75
 d="M1403 1241c10 -24 5 -52 -14 -70l-493 -493v-742c0 -26 -16 -49 -39 -59c-8 -3 -17 -5 -25 -5c-17 0 -33 6 -45 19l-256 256c-12 12 -19 28 -19 45v486l-493 493c-19 18 -24 46 -14 70c10 23 33 39 59 39h1280c26 0 49 -16 59 -39z" />
72
-    <glyph glyph-name="flag" unicode="&#xf10c;" horiz-adv-x="1728" 
76
+    <glyph glyph-name="flag" unicode="&#xf10d;" horiz-adv-x="1728" 
73 77
 d="M256 1280c0 -46 -25 -87 -64 -110v-1266c0 -17 -15 -32 -32 -32h-64c-17 0 -32 15 -32 32v1266c-39 23 -64 64 -64 110c0 71 57 128 128 128s128 -57 128 -128zM1728 1216v-763c0 -37 -23 -51 -52 -66c-113 -61 -238 -116 -369 -116c-184 0 -272 140 -490 140
74 78
 c-159 0 -326 -72 -464 -146c-11 -6 -21 -9 -33 -9c-35 0 -64 29 -64 64v742c0 24 12 41 31 55c24 16 53 30 79 43c126 64 279 120 421 120c157 0 280 -52 419 -117c28 -14 57 -19 88 -19c157 0 326 136 370 136c35 0 64 -29 64 -64z" />
75
-    <glyph glyph-name="floppy-o" unicode="&#xf10d;" 
79
+    <glyph glyph-name="floppy-o" unicode="&#xf10e;" 
76 80
 d="M384 0h768v384h-768v-384zM1280 0h128v896c0 19 -17 60 -30 73l-281 281c-14 14 -53 30 -73 30v-416c0 -53 -43 -96 -96 -96h-576c-53 0 -96 43 -96 96v416h-128v-1280h128v416c0 53 43 96 96 96h832c53 0 96 -43 96 -96v-416zM896 928v320c0 17 -15 32 -32 32h-192
77 81
 c-17 0 -32 -15 -32 -32v-320c0 -17 15 -32 32 -32h192c17 0 32 15 32 32zM1536 896v-928c0 -53 -43 -96 -96 -96h-1344c-53 0 -96 43 -96 96v1344c0 53 43 96 96 96h928c53 0 126 -30 164 -68l280 -280c38 -38 68 -111 68 -164z" />
78
-    <glyph glyph-name="gavel" unicode="&#xf10e;" horiz-adv-x="1731" 
82
+    <glyph glyph-name="gavel" unicode="&#xf10f;" horiz-adv-x="1731" 
79 83
 d="M1731 0c0 -34 -14 -67 -37 -90l-107 -108c-24 -23 -57 -37 -91 -37s-67 14 -90 37l-363 364c-24 23 -38 56 -38 90c0 38 16 69 43 96l-256 256l-126 -126c-9 -9 -21 -14 -34 -14s-25 5 -34 14c30 -30 58 -52 58 -98c0 -26 -10 -49 -28 -68c-34 -36 -70 -84 -124 -84
80 84
 c-25 0 -50 10 -68 28l-408 408c-18 18 -28 43 -28 68c0 54 48 90 84 124c19 18 42 28 68 28c46 0 68 -28 98 -58c-9 9 -14 21 -14 34s5 25 14 34l348 348c9 9 21 14 34 14s25 -5 34 -14c-30 30 -58 52 -58 98c0 26 10 49 28 68c34 36 70 84 124 84c25 0 50 -10 68 -28
81 85
 l408 -408c18 -18 28 -43 28 -68c0 -54 -48 -90 -84 -124c-19 -18 -42 -28 -68 -28c-46 0 -68 28 -98 58c9 -9 14 -21 14 -34s-5 -25 -14 -34l-126 -126l256 -256c27 27 58 43 96 43c34 0 67 -14 91 -37l363 -363c23 -24 37 -57 37 -91z" />
82
-    <glyph glyph-name="github" unicode="&#xf10f;" 
86
+    <glyph glyph-name="github" unicode="&#xf110;" 
83 87
 d="M768 1408c424 0 768 -344 768 -768c0 -339 -220 -627 -525 -729c-39 -7 -53 17 -53 37c0 25 1 108 1 211c0 72 -24 118 -52 142c171 19 351 84 351 379c0 84 -30 152 -79 206c8 20 34 98 -8 204c-64 20 -211 -79 -211 -79c-61 17 -127 26 -192 26s-131 -9 -192 -26
84 88
 c0 0 -147 99 -211 79c-42 -106 -16 -184 -8 -204c-49 -54 -79 -122 -79 -206c0 -294 179 -360 350 -379c-22 -20 -42 -54 -49 -103c-44 -20 -156 -54 -223 64c-42 73 -118 79 -118 79c-75 1 -5 -47 -5 -47c50 -23 85 -112 85 -112c45 -137 259 -91 259 -91
85 89
 c0 -64 1 -124 1 -143c0 -20 -14 -44 -53 -37c-305 102 -525 390 -525 729c0 424 344 768 768 768zM291 305c-2 -4 -8 -5 -13 -2c-6 3 -9 8 -7 12c2 3 7 4 13 2c6 -3 9 -8 7 -12zM322 271c-4 -4 -11 -2 -16 3c-5 6 -6 13 -2 16c4 4 11 2 16 -3c5 -6 6 -13 2 -16zM352 226
86 90
 c-4 -3 -12 0 -17 7s-5 15 0 18c5 4 13 1 17 -6c5 -7 5 -15 0 -19zM394 184c-4 -5 -13 -4 -20 3c-7 6 -9 15 -4 19c4 5 13 4 20 -3c6 -6 8 -15 4 -19zM451 159c-2 -6 -11 -9 -19 -6c-9 2 -15 9 -13 15s11 9 19 7c9 -3 15 -10 13 -16zM514 154c0 -6 -7 -11 -16 -11
87 91
 c-10 -1 -17 4 -17 11c0 6 7 11 16 11c9 1 17 -4 17 -11zM572 164c1 -6 -5 -12 -14 -14s-17 2 -18 8c-1 7 5 13 14 15c9 1 17 -3 18 -9z" />
88
-    <glyph glyph-name="google" unicode="&#xf110;" horiz-adv-x="1505" 
92
+    <glyph glyph-name="globe" unicode="&#xf111;" 
93
+d="M768 1404c424 0 768 -344 768 -768s-344 -768 -768 -768s-768 344 -768 768s344 768 768 768zM737 1186v0c-18 0 -40 -7 -58 -7c-27 0 -61 12 -81 0s-18 -37 -27 -55s-28 -34 -28 -54s19 -36 28 -54s2 -47 27 -54s54 36 81 54s69 32 81 54s0 36 0 54s16 39 0 55
94
+c-5 5 -14 7 -23 7zM491 1178h-6s-44 -8 -76 -13c-136 -92 -261 -300 -278 -464c23 -12 46 -22 60 -36c27 -27 83 -27 88 -56s-24 -62 -33 -80s-31 -31 -27 -54s36 -36 54 -54s37 -22 54 -54s20 -98 27 -135c9 -47 23 -85 44 -118c27 -19 72 -44 102 -58c10 28 10 93 16 122
95
+c7 37 13 109 27 135s19 19 28 28s18 15 28 28s17 34 26 52s30 31 26 53s-36 37 -54 55s-29 39 -55 54s-73 18 -101 25s-127 12 -129 13c-2 0 -1 -6 -7 2s-2 39 -2 57s11 34 24 66c13 18 5 10 25 24c10 9 43 -44 57 -44s-3 91 6 100c36 36 128 98 128 136s-37 36 -55 54
96
+s-46 -30 -111 -30s76 103 85 112s23 17 27 27s0 18 0 27s12 22 8 25c-2 1 -4 1 -6 1zM1212 1096c-62 -8 -139 -10 -182 -26c-45 -17 -54 -36 -81 -54s-67 -28 -81 -54s0 -54 0 -81s-26 -68 0 -82s55 37 82 55s63 64 81 54s6 -7 0 -27s-51 -41 -52 -81s102 -73 68 -126
97
+s-188 46 -232 17s-19 -54 -28 -81s-37 -52 -27 -81s52 -34 81 -54s81 -56 82 -58s20 -99 27 -135c14 -73 -27 -199 76 -231c31 14 78 41 106 60c13 34 24 72 35 94c22 44 71 123 80 161s0 37 0 55s7 30 0 54s-36 54 -54 81s-34 64 -54 81s-46 18 -54 27s-4 8 -4 13
98
+s-4 7 5 14s34 8 54 0s36 -36 54 -54s25 -51 54 -54s54 36 81 54c25 17 52 56 76 55c-12 131 -98 312 -193 404z" />
99
+    <glyph glyph-name="google" unicode="&#xf112;" horiz-adv-x="1505" 
89 100
 d="M768 750h725c7 -39 12 -77 12 -128c0 -438 -294 -750 -737 -750c-425 0 -768 343 -768 768s343 768 768 768c207 0 381 -76 515 -201l-209 -201c-57 55 -157 119 -306 119c-262 0 -476 -217 -476 -485s214 -485 476 -485c304 0 418 218 436 331h-436v264z" />
90
-    <glyph glyph-name="history" unicode="&#xf111;" 
101
+    <glyph glyph-name="history" unicode="&#xf113;" 
91 102
 d="M1536 640c0 -423 -345 -768 -768 -768c-229 0 -445 101 -591 277c-10 13 -9 32 2 43l137 138c7 6 16 9 25 9c9 -1 18 -5 23 -12c98 -127 245 -199 404 -199c282 0 512 230 512 512s-230 512 -512 512c-131 0 -255 -50 -348 -137l137 -138c19 -18 24 -46 14 -69
92 103
 c-10 -24 -33 -40 -59 -40h-448c-35 0 -64 29 -64 64v448c0 26 16 49 40 59c23 10 51 5 69 -14l130 -129c141 133 332 212 529 212c423 0 768 -345 768 -768zM896 928v-448c0 -18 -14 -32 -32 -32h-320c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h224v352c0 18 14 32 32 32h64
93 104
 c18 0 32 -14 32 -32z" />
94
-    <glyph glyph-name="link" unicode="&#xf112;" horiz-adv-x="1632" 
105
+    <glyph glyph-name="key-modern" unicode="&#xf114;" horiz-adv-x="1792" 
106
+d="M546 1536v0c139 1 278 -52 383 -158c142 -141 187 -343 137 -525l726 -726v-319c0 -35 -29 -64 -64 -64h-300l-45 45l135 226l-46 45l-225 -135l-45 46l134 225l-45 45l-225 -134l-46 45l135 225l-45 46l-243 -139l-186 186c-182 -50 -382 -5 -524 136
107
+c-211 212 -209 556 4 770c107 106 246 159 385 160zM405 1290v0c-41 0 -82 -16 -113 -47c-63 -63 -63 -163 0 -226s164 -63 227 0s63 163 0 226c-31 31 -73 47 -114 47z" />
108
+    <glyph glyph-name="link" unicode="&#xf115;" horiz-adv-x="1632" 
95 109
 d="M1440 320c0 26 -10 50 -28 68l-208 208c-18 18 -43 28 -68 28c-29 0 -52 -11 -72 -32c33 -33 72 -61 72 -112c0 -53 -43 -96 -96 -96c-51 0 -79 39 -112 72c-21 -20 -33 -43 -33 -73c0 -25 10 -50 28 -68l206 -207c18 -18 43 -27 68 -27s50 9 68 26l147 146
96 110
 c18 18 28 42 28 67zM737 1025c0 25 -10 50 -28 68l-206 207c-18 18 -43 28 -68 28s-50 -10 -68 -27l-147 -146c-18 -18 -28 -42 -28 -67c0 -26 10 -50 28 -68l208 -208c18 -18 43 -27 68 -27c29 0 52 10 72 31c-33 33 -72 61 -72 112c0 53 43 96 96 96c51 0 79 -39 112 -72
97 111
 c21 20 33 43 33 73zM1632 320c0 -76 -31 -150 -85 -203l-147 -146c-54 -54 -127 -83 -203 -83c-77 0 -150 30 -204 85l-206 207c-54 54 -83 127 -83 203c0 79 32 154 88 209l-88 88c-55 -56 -129 -88 -208 -88c-76 0 -150 30 -204 84l-208 208c-55 55 -84 127 -84 204
98 112
 c0 76 31 150 85 203l147 146c54 54 127 83 203 83c77 0 150 -30 204 -85l206 -207c54 -54 83 -127 83 -203c0 -79 -32 -154 -88 -209l88 -88c55 56 129 88 208 88c76 0 150 -30 204 -84l208 -208c55 -55 84 -127 84 -204z" />
99
-    <glyph glyph-name="pencil-square-o" unicode="&#xf113;" horiz-adv-x="1784" 
113
+    <glyph glyph-name="pencil-square-o" unicode="&#xf116;" horiz-adv-x="1784" 
100 114
 d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072c-9 9 -24 8 -33 -1l-350 -350c-9 -9 -10 -24 -1 -33s24 -8 33 1l350 350c9 9 10 24 1 33zM1408 478v-190c0 -159 -129 -288 -288 -288h-832c-159 0 -288 129 -288 288v832c0 159 129 288 288 288h832
101 115
 c40 0 80 -8 117 -25c9 -4 16 -13 18 -23c2 -11 -1 -21 -9 -29l-49 -49c-9 -9 -21 -12 -32 -8c-15 4 -30 6 -45 6h-832c-88 0 -160 -72 -160 -160v-832c0 -88 72 -160 160 -160h832c88 0 160 72 160 160v126c0 8 3 16 9 22l64 64c10 10 23 12 35 7s20 -16 20 -29zM1312 1216
102 116
 l288 -288l-672 -672h-288v288zM1756 1084l-92 -92l-288 288l92 92c37 37 99 37 136 0l152 -152c37 -37 37 -99 0 -136z" />
103
-    <glyph glyph-name="question-circle" unicode="&#xf114;" 
117
+    <glyph glyph-name="question-circle" unicode="&#xf117;" 
104 118
 d="M896 160v192c0 18 -14 32 -32 32h-192c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h192c18 0 32 14 32 32zM1152 832c0 183 -192 320 -364 320c-163 0 -285 -70 -371 -213c-9 -14 -5 -32 8 -42l132 -100c5 -4 12 -6 19 -6c9 0 19 4 25 12c47 60 67 78 86 92
105 119
 c17 12 50 24 86 24c64 0 123 -41 123 -85c0 -52 -27 -78 -88 -106c-71 -32 -168 -115 -168 -212v-36c0 -18 14 -32 32 -32h192c18 0 32 14 32 32c0 23 29 72 76 99c76 43 180 101 180 253zM1536 640c0 -424 -344 -768 -768 -768s-768 344 -768 768s344 768 768 768
106 120
 s768 -344 768 -768z" />
107
-    <glyph glyph-name="quote-left" unicode="&#xf115;" horiz-adv-x="1664" 
121
+    <glyph glyph-name="quote-left" unicode="&#xf118;" horiz-adv-x="1664" 
108 122
 d="M768 576v-384c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v704c0 282 230 512 512 512h64c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-64c-141 0 -256 -115 -256 -256v-32c0 -53 43 -96 96 -96h224c106 0 192 -86 192 -192zM1664 576v-384
109 123
 c0 -106 -86 -192 -192 -192h-384c-106 0 -192 86 -192 192v704c0 282 230 512 512 512h64c35 0 64 -29 64 -64v-128c0 -35 -29 -64 -64 -64h-64c-141 0 -256 -115 -256 -256v-32c0 -53 43 -96 96 -96h224c106 0 192 -86 192 -192z" />
110
-    <glyph glyph-name="reply" unicode="&#xf116;" horiz-adv-x="1792" 
124
+    <glyph glyph-name="reply" unicode="&#xf119;" horiz-adv-x="1792" 
111 125
 d="M1792 416c0 -140 -70 -323 -127 -451c-11 -23 -22 -55 -37 -76c-7 -10 -14 -17 -28 -17c-20 0 -32 16 -32 35c0 16 4 34 5 50c3 41 5 82 5 123c0 477 -283 560 -714 560h-224v-256c0 -35 -29 -64 -64 -64c-17 0 -33 7 -45 19l-512 512c-12 12 -19 28 -19 45s7 33 19 45
112 126
 l512 512c12 12 28 19 45 19c35 0 64 -29 64 -64v-256h224c328 0 736 -58 875 -403c42 -106 53 -221 53 -333z" />
113
-    <glyph glyph-name="rss" unicode="&#xf117;" horiz-adv-x="1408" 
127
+    <glyph glyph-name="rss" unicode="&#xf11a;" horiz-adv-x="1408" 
114 128
 d="M384 192c0 -106 -86 -192 -192 -192s-192 86 -192 192s86 192 192 192s192 -86 192 -192zM896 69c1 -18 -5 -35 -17 -48c-12 -14 -29 -21 -47 -21h-135c-33 0 -60 25 -63 58c-29 305 -271 547 -576 576c-33 3 -58 30 -58 63v135c0 18 7 35 21 47c11 11 27 17 43 17h5
115 129
 c213 -17 414 -110 565 -262c152 -151 245 -352 262 -565zM1408 67c1 -17 -5 -34 -18 -47c-12 -13 -28 -20 -46 -20h-143c-34 0 -62 26 -64 60c-33 581 -496 1044 -1077 1078c-34 2 -60 30 -60 63v143c0 18 7 34 20 46c12 12 28 18 44 18h3c350 -18 679 -165 927 -414
116 130
 c249 -248 396 -577 414 -927z" />
117
-    <glyph glyph-name="search" unicode="&#xf118;" horiz-adv-x="1664" 
131
+    <glyph glyph-name="search" unicode="&#xf11b;" horiz-adv-x="1664" 
118 132
 d="M1152 704c0 247 -201 448 -448 448s-448 -201 -448 -448s201 -448 448 -448s448 201 448 448zM1664 -128c0 -70 -58 -128 -128 -128c-34 0 -67 14 -90 38l-343 342c-117 -81 -257 -124 -399 -124c-389 0 -704 315 -704 704s315 704 704 704s704 -315 704 -704
119 133
 c0 -142 -43 -282 -124 -399l343 -343c23 -23 37 -56 37 -90z" />
120
-    <glyph glyph-name="share-alt" unicode="&#xf119;" 
134
+    <glyph glyph-name="share-alt" unicode="&#xf11c;" 
121 135
 d="M1216 512c177 0 320 -143 320 -320s-143 -320 -320 -320s-320 143 -320 320c0 11 1 23 2 34l-360 180c-57 -53 -134 -86 -218 -86c-177 0 -320 143 -320 320s143 320 320 320c84 0 161 -33 218 -86l360 180c-1 11 -2 23 -2 34c0 177 143 320 320 320s320 -143 320 -320
122 136
 s-143 -320 -320 -320c-84 0 -161 33 -218 86l-360 -180c1 -11 2 -23 2 -34s-1 -23 -2 -34l360 -180c57 53 134 86 218 86z" />
123
-    <glyph glyph-name="sign-in" unicode="&#xf11a;" 
137
+    <glyph glyph-name="sign-in" unicode="&#xf11d;" 
124 138
 d="M1184 640c0 -17 -7 -33 -19 -45l-544 -544c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v288h-448c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h448v288c0 35 29 64 64 64c17 0 33 -7 45 -19l544 -544c12 -12 19 -28 19 -45zM1536 992v-704c0 -159 -129 -288 -288 -288
125 139
 h-320c-17 0 -32 15 -32 32c0 28 -13 96 32 96h320c88 0 160 72 160 160v704c0 88 -72 160 -160 160h-288c-25 0 -64 -5 -64 32c0 28 -13 96 32 96h320c159 0 288 -129 288 -288z" />
126
-    <glyph glyph-name="sign-out" unicode="&#xf11b;" horiz-adv-x="1568" 
140
+    <glyph glyph-name="sign-out" unicode="&#xf11e;" horiz-adv-x="1568" 
127 141
 d="M640 96c0 -28 13 -96 -32 -96h-320c-159 0 -288 129 -288 288v704c0 159 129 288 288 288h320c17 0 32 -15 32 -32c0 -28 13 -96 -32 -96h-320c-88 0 -160 -72 -160 -160v-704c0 -88 72 -160 160 -160h288c25 0 64 5 64 -32zM1568 640c0 -17 -7 -33 -19 -45l-544 -544
128 142
 c-12 -12 -28 -19 -45 -19c-35 0 -64 29 -64 64v288h-448c-35 0 -64 29 -64 64v384c0 35 29 64 64 64h448v288c0 35 29 64 64 64c17 0 33 -7 45 -19l544 -544c12 -12 19 -28 19 -45z" />
129
-    <glyph glyph-name="sliders" unicode="&#xf11c;" 
143
+    <glyph glyph-name="sliders" unicode="&#xf11f;" 
130 144
 d="M352 128v-128h-352v128h352zM704 256c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280c35 0 64 -29 64 -64v-256
131 145
 c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM1216 768c35 0 64 -29 64 -64v-256c0 -35 -29 -64 -64 -64h-256c-35 0 -64 29 -64 64v256c0 35 29 64 64 64h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
132
-    <glyph glyph-name="sort" unicode="&#xf11d;" horiz-adv-x="1024" 
146
+    <glyph glyph-name="sort" unicode="&#xf120;" horiz-adv-x="1024" 
133 147
 d="M1024 448c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64zM1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19
134 148
 s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
135
-    <glyph glyph-name="sort-asc" unicode="&#xf11e;" horiz-adv-x="1024" 
149
+    <glyph glyph-name="sort-asc" unicode="&#xf121;" horiz-adv-x="1024" 
136 150
 d="M1024 832c0 -35 -29 -64 -64 -64h-896c-35 0 -64 29 -64 64c0 17 7 33 19 45l448 448c12 12 28 19 45 19s33 -7 45 -19l448 -448c12 -12 19 -28 19 -45z" />
137
-    <glyph glyph-name="sort-desc" unicode="&#xf11f;" horiz-adv-x="1024" 
151
+    <glyph glyph-name="sort-desc" unicode="&#xf122;" horiz-adv-x="1024" 
138 152
 d="M1024 448c0 -17 -7 -33 -19 -45l-448 -448c-12 -12 -28 -19 -45 -19s-33 7 -45 19l-448 448c-12 12 -19 28 -19 45c0 35 29 64 64 64h896c35 0 64 -29 64 -64z" />
139
-    <glyph glyph-name="star" unicode="&#xf120;" horiz-adv-x="1664" 
153
+    <glyph glyph-name="star" unicode="&#xf123;" horiz-adv-x="1664" 
140 154
 d="M1664 889c0 -18 -13 -35 -26 -48l-363 -354l86 -500c1 -7 1 -13 1 -20c0 -26 -12 -50 -41 -50c-14 0 -28 5 -40 12l-449 236l-449 -236c-13 -7 -26 -12 -40 -12c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73
141 155
 l225 455c9 19 26 41 49 41s40 -22 49 -41l225 -455l502 -73c24 -4 56 -16 56 -46z" />
142
-    <glyph glyph-name="star-o" unicode="&#xf121;" horiz-adv-x="1664" 
156
+    <glyph glyph-name="star-o" unicode="&#xf124;" horiz-adv-x="1664" 
143 157
 d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889c0 -18 -13 -35 -26 -48l-363 -354l86 -500c1 -7 1 -13 1 -20c0 -27 -12 -50 -41 -50c-14 0 -28 5 -40 12l-449 236l-449 -236c-13 -7 -26 -12 -40 -12
144 158
 c-29 0 -42 24 -42 50c0 7 1 13 2 20l86 500l-364 354c-12 13 -25 30 -25 48c0 30 31 42 56 46l502 73l225 455c9 19 26 41 49 41s40 -22 49 -41l225 -455l502 -73c24 -4 56 -16 56 -46z" />
145
-    <glyph glyph-name="table" unicode="&#xf122;" horiz-adv-x="1664" 
159
+    <glyph glyph-name="table" unicode="&#xf125;" horiz-adv-x="1664" 
146 160
 d="M512 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 160v192c0 18 -14 32 -32 32h-320
147 161
 c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM512 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192
148 162
 c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 160v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1024 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32z
149 163
 M1536 544v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1536 928v192c0 18 -14 32 -32 32h-320c-18 0 -32 -14 -32 -32v-192c0 -18 14 -32 32 -32h320c18 0 32 14 32 32zM1664 1248v-1088c0 -88 -72 -160 -160 -160
150 164
 h-1344c-88 0 -160 72 -160 160v1088c0 88 72 160 160 160h1344c88 0 160 -72 160 -160z" />
151
-    <glyph glyph-name="times" unicode="&#xf123;" horiz-adv-x="1188" 
165
+    <glyph glyph-name="times" unicode="&#xf126;" horiz-adv-x="1188" 
152 166
 d="M1188 214c0 -25 -10 -50 -28 -68l-136 -136c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-294 294l-294 -294c-18 -18 -43 -28 -68 -28s-50 10 -68 28l-136 136c-18 18 -28 43 -28 68s10 50 28 68l294 294l-294 294c-18 18 -28 43 -28 68s10 50 28 68l136 136
153 167
 c18 18 43 28 68 28s50 -10 68 -28l294 -294l294 294c18 18 43 28 68 28s50 -10 68 -28l136 -136c18 -18 28 -43 28 -68s-10 -50 -28 -68l-294 -294l294 -294c18 -18 28 -43 28 -68z" />
154
-    <glyph glyph-name="trash" unicode="&#xf124;" horiz-adv-x="1408" 
168
+    <glyph glyph-name="trash" unicode="&#xf127;" horiz-adv-x="1408" 
155 169
 d="M512 160v704c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM768 160v704c0 18 -14 32 -32 32h-64c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM1024 160v704c0 18 -14 32 -32 32h-64
156 170
 c-18 0 -32 -14 -32 -32v-704c0 -18 14 -32 32 -32h64c18 0 32 14 32 32zM480 1152h448l-48 117c-3 4 -12 10 -17 11h-317c-6 -1 -14 -7 -17 -11zM1408 1120v-64c0 -18 -14 -32 -32 -32h-96v-948c0 -110 -72 -204 -160 -204h-832c-88 0 -160 90 -160 200v952h-96
157 171
 c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h309l70 167c20 49 80 89 133 89h320c53 0 113 -40 133 -89l70 -167h309c18 0 32 -14 32 -32z" />
158
-    <glyph glyph-name="trash-o" unicode="&#xf125;" horiz-adv-x="1408" 
172
+    <glyph glyph-name="trash-o" unicode="&#xf128;" horiz-adv-x="1408" 
159 173
 d="M512 800v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM768 800v-576c0 -18 -14 -32 -32 -32h-64c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1024 800v-576c0 -18 -14 -32 -32 -32h-64
160 174
 c-18 0 -32 14 -32 32v576c0 18 14 32 32 32h64c18 0 32 -14 32 -32zM1152 76v948h-896v-948c0 -48 27 -76 32 -76h832c5 0 32 28 32 76zM480 1152h448l-48 117c-3 4 -12 10 -17 11h-317c-6 -1 -14 -7 -17 -11zM1408 1120v-64c0 -18 -14 -32 -32 -32h-96v-948
161 175
 c0 -110 -72 -204 -160 -204h-832c-88 0 -160 90 -160 200v952h-96c-18 0 -32 14 -32 32v64c0 18 14 32 32 32h309l70 167c20 49 80 89 133 89h320c53 0 113 -40 133 -89l70 -167h309c18 0 32 -14 32 -32z" />
162
-    <glyph glyph-name="user-circle-o" unicode="&#xf126;" horiz-adv-x="1792" 
176
+    <glyph glyph-name="user-circle-o" unicode="&#xf129;" horiz-adv-x="1792" 
163 177
 d="M896 1536c495 0 896 -401 896 -896c0 -492 -399 -896 -896 -896c-496 0 -896 403 -896 896c0 495 401 896 896 896zM1515 185c93 128 149 285 149 455c0 423 -345 768 -768 768s-768 -345 -768 -768c0 -170 56 -327 149 -455c36 179 123 327 306 327
164 178
 c81 -79 191 -128 313 -128s232 49 313 128c183 0 270 -148 306 -327zM1280 832c0 -212 -172 -384 -384 -384s-384 172 -384 384s172 384 384 384s384 -172 384 -384z" />
165
-    <glyph glyph-name="user-plus" unicode="&#xf127;" horiz-adv-x="2048" 
179
+    <glyph glyph-name="user-plus" unicode="&#xf12a;" horiz-adv-x="2048" 
166 180
 d="M704 640c-212 0 -384 172 -384 384s172 384 384 384s384 -172 384 -384s-172 -384 -384 -384zM1664 512h352c17 0 32 -15 32 -32v-192c0 -17 -15 -32 -32 -32h-352v-352c0 -17 -15 -32 -32 -32h-192c-17 0 -32 15 -32 32v352h-352c-17 0 -32 15 -32 32v192
167 181
 c0 17 15 32 32 32h352v352c0 17 15 32 32 32h192c17 0 32 -15 32 -32v-352zM928 288c0 -70 58 -128 128 -128h256v-238c-49 -36 -111 -50 -171 -50h-874c-160 0 -267 96 -267 259c0 226 53 573 346 573c16 0 27 -7 39 -17c98 -75 193 -122 319 -122s221 47 319 122
168 182
 c12 10 23 17 39 17c85 0 160 -32 217 -96h-223c-70 0 -128 -58 -128 -128v-192z" />
169
-    <glyph glyph-name="wrench" unicode="&#xf128;" horiz-adv-x="1641" 
183
+    <glyph glyph-name="wrench" unicode="&#xf12b;" horiz-adv-x="1641" 
170 184
 d="M363 64c0 35 -29 64 -64 64s-64 -29 -64 -64s29 -64 64 -64s64 29 64 64zM1007 484l-682 -682c-23 -23 -56 -37 -90 -37s-67 14 -91 37l-106 108c-24 23 -38 56 -38 90s14 67 38 91l681 681c52 -131 157 -236 288 -288zM1641 919c0 -33 -12 -74 -23 -106
171 185
 c-63 -178 -234 -301 -423 -301c-247 0 -448 201 -448 448s201 448 448 448c73 0 168 -22 229 -63c10 -7 16 -16 16 -28c0 -11 -7 -22 -16 -28l-293 -169v-224l193 -107c33 19 265 165 285 165s32 -15 32 -35z" />
172 186
   </font>

BIN
public/fonts/fa-dtbl-1.ttf View File


BIN
public/fonts/fa-dtbl-1.woff2 View File


+ 14 - 6
resources/assets/js/app.js View File

@@ -1,19 +1,28 @@
1
-
2 1
 /**
3 2
  * First we will load all of this project's JavaScript dependencies which
4 3
  * includes Vue and other libraries. It is a great starting point when
5 4
  * building robust, powerful web applications using Vue and Laravel.
6 5
  */
7 6
 
8
-require('./bootstrap');
7
+require('./bootstrap')
9 8
 let url_slug = require('./url-slug')
10 9
 
11 10
 $(function () {
12
-    $('[data-toggle="tooltip"]').tooltip({
13
-      container: 'body'
14
-    })
11
+  $('[data-toggle="tooltip"]').tooltip({
12
+    container: 'body'
13
+  })
14
+
15
+  // auto hide flash alerts
16
+  let $notifs = $('div.alert').not('.alert-important').addClass('fadeout')
17
+  setTimeout(() => {
18
+    $notifs.addClass('fade')
19
+    setTimeout(() => {
20
+      $notifs.addClass('hidden')
21
+    }, 500)
22
+  }, 2500)
15 23
 })
16 24
 
25
+// auto-alias
17 26
 $(document).on('input keypress paste keyup', 'input[data-autoalias]', function () {
18 27
   const $this = $(this)
19 28
   const target_name = $this.data('autoalias')
@@ -31,7 +40,6 @@ $(document).on('input keypress paste keyup', 'input[data-autoalias]', function (
31 40
   }
32 41
 })
33 42
 
34
-
35 43
 //
36 44
 // window.Vue = require('vue');
37 45
 //

+ 9 - 0
resources/assets/sass/app.scss View File

@@ -159,3 +159,12 @@ html {
159 159
 	@extend .btn-sm;
160 160
 	@extend .btn-outline-light;
161 161
 }
162
+
163
+.fadeout {
164
+	transition: opacity .5s ease-in-out;
165
+	opacity: 1;
166
+
167
+	&.fade {
168
+		opacity: 0;
169
+	}
170
+}

+ 5 - 5
resources/views/form/input.blade.php View File

@@ -11,26 +11,26 @@
11 11
     <div class="input-group">
12 12
       @if($w->prepend)
13 13
         <div class="input-group-prepend">
14
-          <span class="input-group-text">{{$w->prepend}}</span>
14
+          <span class="input-group-text">{!! $w->prepend !!}</span>
15 15
         </div>
16 16
       @endif
17 17
 
18 18
       <input id="field-{{ $w->name }}"
19 19
              name="{{ $w->name }}"
20
-             class="form-control{{ $errors->has($w->name) ? ' is-invalid' : '' }}"
20
+             class="form-control rounded-right {{ $errors->has($w->name) ? ' is-invalid' : '' }}"
21 21
              value="{{ $w->value }}"
22 22
              {!! $w->attributes !!}>
23 23
 
24 24
       @if($w->append)
25 25
         <div class="input-group-append">
26
-          <span class="input-group-text">{{$w->append}}</span>
26
+          <span class="input-group-text">{!! $w->append !!}</span>
27 27
         </div>
28 28
       @endif
29 29
 
30 30
       @if ($errors->has($w->name))
31 31
         <span class="invalid-feedback" role="alert">
32
-          <strong>{{ $errors->first($w->name) }}</strong>
33
-        </span>
32
+        <strong>{{ $errors->first($w->name) }}</strong>
33
+      </span>
34 34
       @endif
35 35
     </div>
36 36
   </div>

+ 4 - 1
resources/views/layouts/app.blade.php View File

@@ -22,7 +22,10 @@
22 22
   @include('layouts.main-nav')
23 23
 
24 24
   <main class="py-4">
25
-    @yield('content')
25
+    <div class="container">
26
+      @include('flash::message')
27
+      @yield('content')
28
+    </div>
26 29
   </main>
27 30
 
28 31
   @include('layouts.footer')

+ 50 - 52
resources/views/table/create.blade.php View File

@@ -3,58 +3,56 @@
3 3
 @extends('layouts.app')
4 4
 
5 5
 @section('content')
6
-  <div class="container">
7
-    <form method="POST" action="{{route('table.storeNew')}}" class="row justify-content-center"
8
-          aria-label="New Table">
9
-
10
-      @csrf
11
-      <div class="col-md-10">
12
-        @php(Widget::setLayout(3, 7))
13
-
14
-        {!! Widget::header(1, 'New Table') !!}
15
-
16
-        {!! Widget::text('title', 'Title')->autoAlias('name', '-')
17
-              ->help('Unique among your tables') !!}
18
-
19
-        {!! Widget::text('name', 'Name')->value('')->prepend(user()->handle.' /')
20
-              ->help('Unique among your tables, and part of the URL; only letters, digits and
21
-                      some symbols are allowed.') !!}
22
-
23
-        {!! Widget::textarea('description', 'Description')->height('8em')
24
-              ->help('Description of the table. URLs in a full format will be clickable.') !!}
25
-
26
-        {!! Widget::text('license', 'License')
27
-              ->help('License applicable to the table\'s data, if any. By default, all
28
-                tables are CC0 or Public Domain.') !!}
29
-
30
-        {!! Widget::text('origin', 'Adapted from')
31
-              ->help('If you took the data from some external site, a book, etc., write it here.
32
-                 URLs in a full format will be clickable.') !!}
33
-
34
-        {!! Widget::textarea('columns', 'Columns')->value($exampleColumns)->height('8em')
35
-              ->help('
36
-                <div class="text-left">
37
-                  Column parameters in CSV format:
38
-                  <ul class="pl-3 mb-0">
39
-                    <li><b>column identifier</b><br>letters, numbers, underscore
40
-                    <li><b>column data type</b><br>int, string, float, bool
41
-                    <li><b>column title</b><br>used for display (optional)
42
-                  </ul>
43
-                </div>') !!}
44
-
45
-        {!! Widget::textarea('data', 'Initial data')->value($exampleData)->height('12em')
46
-              ->help('
47
-                Initial table data in CSV format, columns corresponding to the
48
-                specification you entered above.') !!}
49
-
50
-        <div class="row form-group">
51
-          <div class="col-md-7 offset-md-3">
52
-            <button type="submit" class="btn btn-primary">
53
-              <i class="fa-save pr-2"></i>Create Table
54
-            </button>
55
-          </div>
6
+  <form method="POST" action="{{route('table.storeNew')}}" class="row justify-content-center"
7
+        aria-label="New Table">
8
+
9
+    @csrf
10
+    <div class="col-md-10">
11
+      @php(Widget::setLayout(3, 7))
12
+
13
+      {!! Widget::header(1, 'New Table') !!}
14
+
15
+      {!! Widget::text('title', 'Title')->autoAlias('name', '-')
16
+            ->help('Unique among your tables') !!}
17
+
18
+      {!! Widget::text('name', 'Name')->value('')->prepend(user()->handle.' /')
19
+            ->help('Unique among your tables, and part of the URL; only letters, digits and
20
+                    some symbols are allowed.') !!}
21
+
22
+      {!! Widget::textarea('description', 'Description')->height('8em')
23
+            ->help('Description of the table. URLs in a full format will be clickable.') !!}
24
+
25
+      {!! Widget::text('license', 'License')
26
+            ->help('License applicable to the table\'s data, if any. By default, all
27
+              tables are CC0 or Public Domain.') !!}
28
+
29
+      {!! Widget::text('origin', 'Adapted from')
30
+            ->help('If you took the data from some external site, a book, etc., write it here.
31
+               URLs in a full format will be clickable.') !!}
32
+
33
+      {!! Widget::textarea('columns', 'Columns')->value($exampleColumns)->height('8em')
34
+            ->help('
35
+              <div class="text-left">
36
+                Column parameters in CSV format:
37
+                <ul class="pl-3 mb-0">
38
+                  <li><b>column identifier</b><br>letters, numbers, underscore
39
+                  <li><b>column data type</b><br>int, string, float, bool
40
+                  <li><b>column title</b><br>used for display (optional)
41
+                </ul>
42
+              </div>') !!}
43
+
44
+      {!! Widget::textarea('data', 'Initial data')->value($exampleData)->height('12em')
45
+            ->help('
46
+              Initial table data in CSV format, columns corresponding to the
47
+              specification you entered above.') !!}
48
+
49
+      <div class="row form-group">
50
+        <div class="col-md-7 offset-md-3">
51
+          <button type="submit" class="btn btn-primary">
52
+            <i class="fa-save pr-2"></i>Create Table
53
+          </button>
56 54
         </div>
57 55
       </div>
58
-    </form>
59
-  </div>
56
+    </div>
57
+  </form>
60 58
 @endsection

+ 26 - 28
resources/views/table/view.blade.php View File

@@ -7,35 +7,33 @@
7 7
 @endphp
8 8
 
9 9
 @section('content')
10
-  <div class="container">
11
-    <div class="row justify-content-center">
12
-      <h2>{{ $table->title }}</h2>
13
-    </div>
14
-    <div class="row justify-content-center">
10
+  <div class="row justify-content-center">
11
+    <h2>{{ $table->title }}</h2>
12
+  </div>
13
+  <div class="row justify-content-center">
15 14
 
16
-      <div class="col-md-10">
17
-        <table class="table table-hover table-sm">
18
-          <thead>
19
-          <tr>
20
-            <th>ID</th>
21
-            @foreach($columns as $col)
22
-              <th>{{ $col->title }}</th>
23
-            @endforeach
24
-          </tr>
25
-          </thead>
26
-          <tbody>
27
-            @foreach($rows as $row)
28
-              <tr>
29
-                <td>#{{ $row->id }}</td>
30
-                @php($rdata = json_decode($row['data'], true))
31
-                @foreach($columns as $col)
32
-                  <td data-id="{{ $row->id }}">{{ $rdata[$col->name] }}</td>
33
-                @endforeach
34
-              </tr>
35
-            @endforeach
36
-          </tbody>
37
-        </table>
38
-      </div>
15
+    <div class="col-md-10">
16
+      <table class="table table-hover table-sm">
17
+        <thead>
18
+        <tr>
19
+          <th>ID</th>
20
+          @foreach($columns as $col)
21
+            <th>{{ $col->title }}</th>
22
+          @endforeach
23
+        </tr>
24
+        </thead>
25
+        <tbody>
26
+          @foreach($rows as $row)
27
+            <tr>
28
+              <td>#{{ $row->id }}</td>
29
+              @php($rdata = json_decode($row['data'], true))
30
+              @foreach($columns as $col)
31
+                <td data-id="{{ $row->id }}">{{ $rdata[$col->name] }}</td>
32
+              @endforeach
33
+            </tr>
34
+          @endforeach
35
+        </tbody>
36
+      </table>
39 37
     </div>
40 38
   </div>
41 39
 @endsection

+ 31 - 30
resources/views/user/edit.blade.php View File

@@ -3,46 +3,47 @@
3 3
 @extends('layouts.app')
4 4
 
5 5
 @section('content')
6
-  <div class="container">
7
-    <form method="POST" action="{{route('user.store')}}" class="row justify-content-center"
8
-          aria-label="Your Profile">
9
-      @csrf
6
+  <form method="POST" action="{{route('user.store')}}" class="row justify-content-center"
7
+        aria-label="Your Profile">
8
+    @csrf
10 9
 
11
-      <div class="col-md-10">
12
-        @php(Widget::setLayout(3, 7))
10
+    <div class="col-md-10">
11
+      @php(Widget::setLayout(3, 7))
13 12
 
14
-        {!! Widget::header(1, 'Settings') !!}
13
+      {!! Widget::header(1, 'Settings') !!}
15 14
 
16
-        {!! Widget::text('title', 'Display Name')->value($user->title)->required()->autofocus()
17
-              ->help('Shown on your profile page, tables, comments, etc.') !!}
15
+      {!! Widget::text('title', 'Display Name')->value($user->title)->required()->autofocus()
16
+            ->help('Shown on your profile page, tables, comments, etc.') !!}
18 17
 
19
-        {!! Widget::textarea('bio', 'About Me')->value($user->bio)->required()->height('8em')
20
-              ->help('This is shown in your profile box') !!}
18
+      {!! Widget::text('name', 'Username')->value($user->name)->required()
19
+            ->prepend('@')
20
+            ->help('Part of your vanity URL. Caution: changing this will alter URLs of your tables.') !!}
21 21
 
22
-        {!! Widget::text('name', 'Username')->value($user->name)->required()
23
-              ->prepend('@')
24
-              ->help('Part of your vanity URL. Caution: changing this will alter URLs of your tables.') !!}
22
+      {!! Widget::textarea('bio', 'About Me')->value($user->bio)->height('8em')
23
+            ->help('This is shown in your profile box') !!}
25 24
 
26
-        {!! Widget::email('email', 'E-Mail Address')->value($user->email)->required()
27
-              ->help('Used to login and for password resets.
28
-              This field is protected; a change will be applied only after you confirm
29
-              the new e-mail address via a confirmation link we\'ll send you to it.') !!}
25
+      {!! Widget::text('website', 'Website')->value($user->website)->prepend('<i class="fa-globe"></i>')
26
+            ->help('Custom clickable link shown on your profile page.') !!}
30 27
 
31
-        {!! Widget::header(3, 'Password Change') !!}
32
-        {!! Widget::par('Leave empty to keep your current password (if any).') !!}
28
+      {!! Widget::email('email', 'E-Mail Address')->value($user->email)->required()
29
+            ->help('Used to login and for password resets.
30
+            This field is protected; a change will be applied only after you confirm
31
+            the new e-mail address via a confirmation link we\'ll send you to it.') !!}
33 32
 
34
-        {!! Widget::password('new_password', 'New Password') !!}
33
+      {!! Widget::header(3, 'Password Change') !!}
34
+      {!! Widget::par('Leave empty to keep your current password (if any).') !!}
35 35
 
36
-        {!! Widget::password('new_password_confirmation', 'Confirm New Password') !!}
36
+      {!! Widget::password('new_password', 'New Password') !!}
37 37
 
38
-        <div class="row form-group">
39
-          <div class="col-md-7 offset-md-3">
40
-            <button type="submit" class="btn btn-primary">
41
-              <i class="fa-save pr-2"></i>Apply Changes
42
-            </button>
43
-          </div>
38
+      {!! Widget::password('new_password_confirmation', 'Confirm New Password') !!}
39
+
40
+      <div class="row form-group">
41
+        <div class="col-md-7 offset-md-3">
42
+          <button type="submit" class="btn btn-primary">
43
+            <i class="fa-save pr-2"></i>Apply Changes
44
+          </button>
44 45
         </div>
45 46
       </div>
46
-    </form>
47
-  </div>
47
+    </div>
48
+  </form>
48 49
 @endsection

+ 63 - 66
resources/views/user/view.blade.php View File

@@ -7,89 +7,86 @@
7 7
 @endphp
8 8
 
9 9
 @section('content')
10
-  <div class="container">
10
+  <div class="row justify-content-center">
11 11
 
12
-    <div class="row justify-content-center">
12
+    {{-- Dash card --}}
13
+    <div class="col-md-4">
14
+      <div class="card">
15
+        <div class="card-header card-header-extra">
16
+          <i class="fa-user-circle-o fa-pr fa-large"></i>{{ $user->title }}
13 17
 
14
-      {{-- Dash card --}}
15
-      <div class="col-md-4">
16
-        <div class="card">
17
-          <div class="card-header card-header-extra">
18
-            <i class="fa-user-circle-o fa-pr fa-large"></i>{{ $user->title }}
19
-
20
-            @if(authed() && user()->is($user))
21
-              <a href="{{route('user.edit')}}" class="btn ml-auto">Edit</a>
22
-            @endif
23
-          </div>
24
-
25
-          <div class="card-body">
26
-            @if (session('status'))
27
-              <div class="alert alert-success" role="alert">
28
-                {{ session('status') }}
29
-              </div>
30
-            @endif
18
+          @if(authed() && user()->is($user))
19
+            <a href="{{route('user.edit')}}" class="btn ml-auto">Edit</a>
20
+          @endif
21
+        </div>
31 22
 
32
-            @if($user->bio)
33
-              @if(mb_strlen($user->bio) > 250)
34
-                <p id="bio-short" aria-hidden=true>
35
-                  {{mb_substr($user->bio, 0, 250)}}…
36
-                  <a class="text-muted small" title="Show more" href="#" onclick="$('#bio-short').addClass('hidden'); $('#bio-full').removeClass('hidden'); return false;">
37
-                    [more]
38
-                  </a>
39
-                </p>
40
-                <p id="bio-full" class="hidden">
41
-                  {{ $user->bio }}
42
-                  <a class="text-muted small" title="Collapse" href="#" onclick="$('#bio-full').addClass('hidden'); $('#bio-short').removeClass('hidden'); return false;">
43
-                    [collapse]
44
-                  </a>
45
-                </p>
46
-              @else
47
-                <p>
48
-                  {{ $user->bio }}
49
-                </p>
50
-              @endif
51
-            @endif
23
+        <div class="card-body">
24
+          @if (session('status'))
25
+            <div class="alert alert-success" role="alert">
26
+              {{ session('status') }}
27
+            </div>
28
+          @endif
52 29
 
53
-            @if($user->website)
30
+          @if($user->bio)
31
+            @if(mb_strlen($user->bio) > 250)
32
+              <p id="bio-short" aria-hidden=true>
33
+                {{mb_substr($user->bio, 0, 250)}}…
34
+                <a class="text-muted small" title="Show more" href="#" onclick="$('#bio-short').addClass('hidden'); $('#bio-full').removeClass('hidden'); return false;">
35
+                  [more]
36
+                </a>
37
+              </p>
38
+              <p id="bio-full" class="hidden">
39
+                {{ $user->bio }}
40
+                <a class="text-muted small" title="Collapse" href="#" onclick="$('#bio-full').addClass('hidden'); $('#bio-short').removeClass('hidden'); return false;">
41
+                  [collapse]
42
+                </a>
43
+              </p>
44
+            @else
54 45
               <p>
55
-                <i class="fa-link fa-pr" aria-label="User's Website" title="User's Website"></i>{{--
56
-                --}}<a href="{{ $user->website }}">{{ $user->website }}</a>
46
+                {{ $user->bio }}
57 47
               </p>
58 48
             @endif
49
+          @endif
59 50
 
60
-            <p class="mb-0">
61
-              <i class="fa-calendar fa-pr" aria-hidden=true></i>{{--
62
-              --}}Joined {{ $user->created_at->diffForHumans() }}
51
+          @if($user->website)
52
+            <p>
53
+              <i class="fa-link fa-pr" aria-label="User's Website" title="User's Website"></i>{{--
54
+              --}}<a href="{{ $user->website }}">{{ $user->website }}</a>
63 55
             </p>
64
-          </div>
56
+          @endif
57
+
58
+          <p class="mb-0">
59
+            <i class="fa-calendar fa-pr" aria-hidden=true></i>{{--
60
+            --}}Joined {{ $user->created_at->diffForHumans() }}
61
+          </p>
65 62
         </div>
66 63
       </div>
64
+    </div>
67 65
 
68
-      {{-- Table list card --}}
69
-      <div class="col-md-8">
70
-        <div class="card">
71
-          <div class="card-header card-header-extra">
72
-            <span>
73
-              @if(authed() && user()->is($user))
74
-                Your Tables
75
-              @else
76
-                User's Tables
77
-              @endif
78
-            </span>
79
-
80
-            <nav class="ml-auto" aria-label="Pages of the table list">
81
-              {{ $tables->links(null, ['ulClass' => 'pagination-sm mb-0 pagination-outline-light']) }}
82
-            </nav>
83
-
66
+    {{-- Table list card --}}
67
+    <div class="col-md-8">
68
+      <div class="card">
69
+        <div class="card-header card-header-extra">
70
+          <span>
84 71
             @if(authed() && user()->is($user))
85
-              <a href="{{route('table.create')}}" class="btn ml-3">New</a>
72
+              Your Tables
73
+            @else
74
+              User's Tables
86 75
             @endif
87
-          </div>
76
+          </span>
88 77
 
89
-          @include('user._table-list')
78
+          <nav class="ml-auto" aria-label="Pages of the table list">
79
+            {{ $tables->links(null, ['ulClass' => 'pagination-sm mb-0 pagination-outline-light']) }}
80
+          </nav>
81
+
82
+          @if(authed() && user()->is($user))
83
+            <a href="{{route('table.create')}}" class="btn ml-3">New</a>
84
+          @endif
90 85
         </div>
91
-      </div>
92 86
 
87
+        @include('user._table-list')
88
+      </div>
93 89
     </div>
90
+
94 91
   </div>
95 92
 @endsection

+ 6 - 8
resources/views/welcome.blade.php View File

@@ -3,15 +3,13 @@
3 3
 @extends('layouts.app')
4 4
 
5 5
 @section('content')
6
-  <div class="container">
7
-    <div class="row justify-content-center">
8
-      <div class="col-md-8">
9
-        <div class="card">
10
-          <div class="card-header">Dashboard</div>
6
+  <div class="row justify-content-center">
7
+    <div class="col-md-8">
8
+      <div class="card">
9
+        <div class="card-header">Dashboard</div>
11 10
 
12
-          <div class="card-body">
13
-            <h1>Welcome to the public landing page.</h1>
14
-          </div>
11
+        <div class="card-body">
12
+          <h1>Welcome to the public landing page.</h1>
15 13
         </div>
16 14
       </div>
17 15
     </div>