Browse Source

Add read-only online shopping site (issue #8)

master
Skylar Ittner 10 months ago
parent
commit
c4c387cf62
39 changed files with 1172 additions and 0 deletions
  1. BIN
      database.mwb
  2. 50
    0
      public/index.php
  3. 112
    0
      public/lib/item.php
  4. 16
    0
      public/parts/404.php
  5. 32
    0
      public/parts/browse.php
  6. 8
    0
      public/parts/cart.php
  7. 8
    0
      public/parts/checkout.php
  8. 14
    0
      public/parts/footer.php
  9. 21
    0
      public/parts/head.php
  10. 51
    0
      public/parts/home.php
  11. 58
    0
      public/parts/item.php
  12. 94
    0
      public/parts/nav.php
  13. 7
    0
      public/static/bootstrap.min.js
  14. 345
    0
      public/static/fa-svg-with-js.css
  15. 5
    0
      public/static/fontawesome-all.min.js
  16. 2
    0
      public/static/jquery-3.3.1.min.js
  17. 12
    0
      public/themes/cerulean/bootstrap.min.css
  18. 12
    0
      public/themes/cosmo/bootstrap.min.css
  19. 12
    0
      public/themes/cyborg/bootstrap.min.css
  20. 12
    0
      public/themes/darkly/bootstrap.min.css
  21. 7
    0
      public/themes/default/bootstrap.min.css
  22. 12
    0
      public/themes/flatly/bootstrap.min.css
  23. 12
    0
      public/themes/journal/bootstrap.min.css
  24. 12
    0
      public/themes/litera/bootstrap.min.css
  25. 12
    0
      public/themes/lumen/bootstrap.min.css
  26. 12
    0
      public/themes/lux/bootstrap.min.css
  27. 12
    0
      public/themes/materia/bootstrap.min.css
  28. 12
    0
      public/themes/minty/bootstrap.min.css
  29. 12
    0
      public/themes/pulse/bootstrap.min.css
  30. 12
    0
      public/themes/sandstone/bootstrap.min.css
  31. 12
    0
      public/themes/simplex/bootstrap.min.css
  32. 12
    0
      public/themes/sketchy/bootstrap.min.css
  33. 12
    0
      public/themes/slate/bootstrap.min.css
  34. 12
    0
      public/themes/solar/bootstrap.min.css
  35. 12
    0
      public/themes/spacelab/bootstrap.min.css
  36. 12
    0
      public/themes/superhero/bootstrap.min.css
  37. 90
    0
      public/themes/themes.json
  38. 12
    0
      public/themes/united/bootstrap.min.css
  39. 12
    0
      public/themes/yeti/bootstrap.min.css

BIN
database.mwb View File


+ 50
- 0
public/index.php View File

@@ -0,0 +1,50 @@
1
+<?php
2
+
3
+/*
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+require_once __DIR__ . "/../required.php";
10
+
11
+define("NICKELBOX", true);
12
+
13
+require_once __DIR__ . "/lib/item.php";
14
+
15
+$config = $database->select("config", ['key', 'value']);
16
+$settings = [
17
+    "sitename" => "Shop",
18
+    "theme" => "default",
19
+];
20
+foreach ($config as $c) {
21
+    $settings[$c['key']] = $c['value'];
22
+}
23
+
24
+$page = "home";
25
+
26
+if (isset($_GET['page'])) {
27
+    switch ($_GET['page']) {
28
+        case "browse":
29
+            if (isset($_GET['cat']) && $binstack->has('categories', ['catid' => $_GET['cat']])) {
30
+                $page = "browse";
31
+            } else {
32
+                $page = "404";
33
+            }
34
+            break;
35
+        case "item":
36
+            if (isset($_GET['id']) && $binstack->has('items', ['itemid' => $_GET['id']])) {
37
+                $page = "item";
38
+            } else {
39
+                $page = "404";
40
+            }
41
+            break;
42
+        case "home":
43
+        default:
44
+            $page = "home";
45
+    }
46
+}
47
+require __DIR__ . "/parts/head.php";
48
+require __DIR__ . "/parts/nav.php";
49
+require __DIR__ . "/parts/$page.php";
50
+require __DIR__ . "/parts/footer.php";

+ 112
- 0
public/lib/item.php View File

@@ -0,0 +1,112 @@
1
+<?php
2
+
3
+/*
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+require_once __DIR__ . "/../../required.php";
10
+
11
+class Item {
12
+
13
+    private $itemid = null;
14
+    private $itemdata = [];
15
+
16
+    function __construct($itemid) {
17
+        global $binstack;
18
+        $this->itemdata = $binstack->get('items', ['itemid', 'catid', 'name', 'text1', 'qty', 'want', 'cost', 'price'], ['itemid' => $itemid]);
19
+        $this->itemid = $itemid;
20
+    }
21
+
22
+    function getId() {
23
+        return $this->itemid;
24
+    }
25
+
26
+    function getPrice($customer = null) {
27
+        global $database;
28
+        $binprice = $this->itemdata['price'];
29
+        if (!is_null($customer)) {
30
+            if ($database->has('customer_pricing', ['AND' => ['itemid' => $this->itemid, 'customerid' => $customer]])) {
31
+                return $database->get('customer_pricing', 'price', ['AND' => ['itemid' => $this->itemid, 'customerid' => $customer]]);
32
+            }
33
+        }
34
+        return $binprice;
35
+    }
36
+
37
+    function getName() {
38
+        return $this->itemdata['name'];
39
+    }
40
+
41
+    function getDescription() {
42
+        return $this->itemdata['text1'];
43
+    }
44
+
45
+    function getQty() {
46
+        return $this->itemdata['qty'];
47
+    }
48
+
49
+    function getWant() {
50
+        return $this->itemdata['want'];
51
+    }
52
+
53
+    function getCategoryName() {
54
+        global $binstack;
55
+        return $binstack->get('items', ['[>]categories' => 'catid'], 'catname', ['itemid' => $this->itemid]);
56
+    }
57
+
58
+    function getCategoryId() {
59
+        return $this->itemdata['catid'];
60
+    }
61
+
62
+}
63
+
64
+class RenderItem {
65
+
66
+    static function card(Item $item) {
67
+        $id = $item->getId();
68
+        $name = $item->getName();
69
+        $catid = $item->getCategoryId();
70
+        $catname = $item->getCategoryName();
71
+        $price = $item->getPrice();
72
+        $html = <<<END
73
+<div class="card m-2">
74
+    <div class="card-body text-center">
75
+        <a href="./?page=item&id=$id" class="font-weight-bold">$name</a><br />
76
+        <span>$$price</span>
77
+    </div>
78
+</div>
79
+END;
80
+        return $html;
81
+    }
82
+
83
+    static function line(Item $item) {
84
+        $id = $item->getId();
85
+        $name = $item->getName();
86
+        $catid = $item->getCategoryId();
87
+        $catname = $item->getCategoryName();
88
+        $price = $item->getPrice();
89
+        $html = <<<END
90
+<div class="list-group-item d-flex flex-wrap">
91
+    <div>
92
+        <h4><a href="./?page=item&id=$id">$name</a></h4>
93
+        <span>$$price</span>
94
+    </div>
95
+    <div class="ml-auto">
96
+        <form action="./action.php" method="POST">
97
+            <div class="input-group">
98
+                <input type="number" name="qty" class="form-control mb-2" placeholder="Quantity" value="1" />
99
+                <div class="input-group-addon">
100
+                    <button type="submit" class="btn btn-primary"><i class="fas fa-cart-plus"></i> Add</button>
101
+                </div>
102
+            </div>
103
+            <input type="hidden" name="item" value="<?php echo $id; ?>" />
104
+            <input type="hidden" name="action" value="addtocart" />
105
+        </form>
106
+    </div>
107
+</div>
108
+END;
109
+        return $html;
110
+    }
111
+
112
+}

+ 16
- 0
public/parts/404.php View File

@@ -0,0 +1,16 @@
1
+<?php
2
+
3
+/*
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+if (!defined('NICKELBOX')) {
9
+    die("Direct access denied.");
10
+}
11
+
12
+?>
13
+<div class="text-center">
14
+    <h1 class="display-1">404</h1>
15
+    <p>The requested page could not be found.</p>
16
+</div>

+ 32
- 0
public/parts/browse.php View File

@@ -0,0 +1,32 @@
1
+<?php
2
+/*
3
+ * This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+ */
7
+
8
+if (!defined('NICKELBOX')) {
9
+    die("Direct access denied.");
10
+}
11
+$catid = $_GET['cat'];
12
+$cat = $binstack->get('categories', 'catname', ['catid' => $catid]);
13
+
14
+$dbitems = $binstack->select('items', 'itemid', ['AND' => ['price[>]' => 0, 'catid' => $catid], 'LIMIT' => 20]);
15
+
16
+$items = [];
17
+
18
+foreach ($dbitems as $i) {
19
+    $items[] = new Item($i);
20
+}
21
+?>
22
+<div class="container mt-4">
23
+    <h1 class="display-4"><?php echo $cat; ?></h1>
24
+
25
+    <div class="list-group list-group-flush">
26
+        <?php
27
+        foreach ($items as $i) {
28
+            echo RenderItem::line($i);
29
+        }
30
+        ?>
31
+    </div>
32
+</div>

+ 8
- 0
public/parts/cart.php View File

@@ -0,0 +1,8 @@
1
+<?php
2
+
3
+/* 
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+

+ 8
- 0
public/parts/checkout.php View File

@@ -0,0 +1,8 @@
1
+<?php
2
+
3
+/* 
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+

+ 14
- 0
public/parts/footer.php View File

@@ -0,0 +1,14 @@
1
+<?php
2
+
3
+/*
4
+ * This Source Code Form is subject to the terms of the Mozilla Public
5
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
6
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
+ */
8
+
9
+if (!defined('NICKELBOX')) {
10
+    die("Direct access denied.");
11
+}
12
+?>
13
+<script src="static/jquery-3.3.1.min.js"></script>
14
+<script src="static/bootstrap.min.js"></script>

+ 21
- 0
public/parts/head.php View File

@@ -0,0 +1,21 @@
1
+<?php
2
+/*
3
+ * This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+ */
7
+
8
+if (!defined('NICKELBOX')) {
9
+    die("Direct access denied.");
10
+}
11
+?>
12
+<!DOCTYPE html>
13
+<meta charset="UTF-8">
14
+<meta name="viewport" content="width=device-width, initial-scale=1">
15
+<title><?php echo $settings['sitename']; ?></title>
16
+<link rel="stylesheet" href="themes/<?php echo $settings['theme']; ?>/bootstrap.min.css" />
17
+<link rel="stylesheet" href="static/fa-svg-with-js.css" />
18
+<script nonce="<?php echo $SECURE_NONCE; ?>">
19
+    FontAwesomeConfig = {autoAddCss: false};
20
+</script>
21
+<script defer src="static/fontawesome-all.min.js"></script>

+ 51
- 0
public/parts/home.php View File

@@ -0,0 +1,51 @@
1
+<?php
2
+/*
3
+ * This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+ */
7
+
8
+if (!defined('NICKELBOX')) {
9
+    die("Direct access denied.");
10
+}   
11
+
12
+$dbitems = $binstack->select('items', 'itemid', ['AND' => ['price[>]' => 0], 'LIMIT' => 20]);
13
+
14
+$items = [];
15
+
16
+foreach ($dbitems as $i) {
17
+    $items[] = new Item($i);
18
+}
19
+?>
20
+<div class="container mt-4">
21
+    <div class="row">
22
+        <div class="col-md-4 col-xl-3 d-none d-md-block">
23
+            <div class="card">
24
+                <div class="card-body">
25
+                    <h5 class="card-title">Categories</h5>
26
+                    <ul class="list-group list-group-flush">
27
+                        <?php
28
+                        foreach ($categories as $c) {
29
+                            ?>
30
+                            <li class="list-group-item">
31
+                                <a href="./?page=browse&cat=<?php echo $c['id']; ?>">
32
+                                    <?php echo $c['name']; ?>
33
+                                </a>
34
+                            </li>
35
+                            <?php
36
+                        }
37
+                        ?>
38
+                    </ul>
39
+                </div>
40
+            </div>
41
+        </div>
42
+
43
+        <div class="col-md-8 col-xl-9 d-flex flex-wrap">
44
+            <?php
45
+            foreach ($items as $i) {
46
+                echo RenderItem::card($i);
47
+            }
48
+            ?>
49
+        </div>
50
+    </div>
51
+</div>

+ 58
- 0
public/parts/item.php View File

@@ -0,0 +1,58 @@
1
+<?php
2
+/*
3
+ * This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+ */
7
+if (!defined('NICKELBOX')) {
8
+    die("Direct access denied.");
9
+}
10
+
11
+$item = new Item($_GET['id']);
12
+?>
13
+
14
+<div class="container">
15
+    <div class="row">
16
+        <div class="col-md-4">
17
+            <!-- Item image(s) go here -->
18
+        </div>
19
+
20
+        <div class="col-md-8">
21
+            <div class="row mt-4">
22
+                <div class="col-sm-7 jumbotron py-4">
23
+                    <h2><?php echo $item->getName(); ?></h2>
24
+                    <p>in <a href="./?page=browse&cat=<?php echo $item->getCategoryId(); ?>"><?php echo $item->getCategoryName(); ?></a></p>
25
+                    <h3>$<?php echo $item->getPrice(); ?></h3>
26
+                </div>
27
+                <div class="col-sm-5">
28
+                    <form action="./action.php" method="POST">
29
+                        <input type="number" name="qty" class="form-control mb-2" placeholder="Quantity" value="1" />
30
+                        <button type="submit" class="btn btn-block btn-primary"><i class="fas fa-cart-plus"></i> Add to Cart</button>
31
+                        <input type="hidden" name="item" value="<?php echo $item->getId(); ?>" />
32
+                        <input type="hidden" name="action" value="addtocart" />
33
+                    </form>
34
+                </div>
35
+            </div>
36
+        </div>
37
+    </div>
38
+    <div class="row mt-4 mt-sm-0">
39
+        <div class="col-12">
40
+            <div class="card">
41
+                <div class="card-body">
42
+                    <h5 class="card-title">Description</h5>
43
+
44
+                    <p>
45
+                        <?php
46
+                        $desc = $item->getDescription();
47
+                        if (empty($desc)) {
48
+                            echo "No item information found.";
49
+                        } else {
50
+                            echo htmlspecialchars($desc);
51
+                        }
52
+                        ?>
53
+                    </p>
54
+                </div>
55
+            </div>
56
+        </div>
57
+    </div>
58
+</div>

+ 94
- 0
public/parts/nav.php View File

@@ -0,0 +1,94 @@
1
+<?php
2
+/*
3
+ * This Source Code Form is subject to the terms of the Mozilla Public
4
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+ */
7
+
8
+if (!defined('NICKELBOX')) {
9
+    die("Direct access denied.");
10
+}
11
+
12
+$cats = $binstack->select('categories', ['catid (id)', 'catname (name)']);
13
+$categories = [];
14
+foreach ($cats as $c) {
15
+    if ($binstack->has('items', ['AND' => ['catid' => $c['id'], 'price[>]' => 0]])) {
16
+        $categories[] = $c;
17
+    }
18
+}
19
+?>
20
+<nav class="navbar navbar-expand navbar-dark bg-dark">
21
+    <a class="navbar-brand" href="./"><?php echo $settings['sitename']; ?></a>
22
+    <div class="collapse navbar-collapse">
23
+        <ul class="navbar-nav d-none d-md-inline">
24
+            <li class="nav-item dropdown">
25
+                <a class="nav-link dropdown-toggle" href="#" id="categorydropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
26
+                    Categories
27
+                </a>
28
+                <div class="dropdown-menu" aria-labelledby="categorydropdown">
29
+                    <?php
30
+                    foreach ($categories as $c) {
31
+                        ?>
32
+                        <a class="dropdown-item" href="./?page=browse&cat=<?php echo $c['id']; ?>"><?php echo $c['name']; ?></a>
33
+                        <?php
34
+                    }
35
+                    ?>
36
+                </div>
37
+            </li>
38
+        </ul>
39
+        <form class="form-inline ml-3">
40
+            <div class="input-group">
41
+                <input class="form-control" type="search" placeholder="Search" aria-label="Search">
42
+                <div class="input-group-addon">
43
+                    <button class="btn btn-success" type="submit"><i class="fas fa-search"></i> <span class="d-none d-md-inline">Search</span></button>
44
+                </div>
45
+            </div>
46
+        </form>
47
+        <div class="d-none d-md-inline ml-auto">
48
+            <ul class="navbar-nav">
49
+                <li class="nav-item">
50
+                    <a class="nav-link" href="./?page=cart">
51
+                        <i class="fas fa-shopping-cart"></i> Cart
52
+                    </a>
53
+                </li>
54
+                <li class="nav-item">
55
+                    <a class="nav-link" href="./?page=account">
56
+                        <i class="fas fa-user-circle"></i> Account
57
+                    </a>
58
+                </li>
59
+            </ul>
60
+        </div>
61
+    </div>
62
+</nav>
63
+<nav class="navbar navbar-expand navbar-dark bg-dark d-md-none">
64
+    <div class="collapse navbar-collapse justify-content-between">
65
+        <ul class="navbar-nav">
66
+            <li class="nav-item dropdown">
67
+                <a class="nav-link dropdown-toggle" href="#" id="categorydropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
68
+                    Categories
69
+                </a>
70
+                <div class="dropdown-menu" aria-labelledby="categorydropdown">
71
+                    <?php
72
+                    foreach ($categories as $c) {
73
+                        ?>
74
+                        <a class="dropdown-item" href="./?page=browse&cat=<?php echo $c['id']; ?>"><?php echo $c['name']; ?></a>
75
+                        <?php
76
+                    }
77
+                    ?>
78
+                </div>
79
+            </li>
80
+        </ul>
81
+        <ul class="navbar-nav ml-auto">
82
+            <li class="nav-item">
83
+                <a class="nav-link" href="./?page=cart">
84
+                    <i class="fas fa-shopping-cart"></i> Cart
85
+                </a>
86
+            </li>
87
+            <li class="nav-item">
88
+                <a class="nav-link" href="./?page=account">
89
+                    <i class="fas fa-user-circle"></i> Account
90
+                </a>
91
+            </li>
92
+        </ul>
93
+    </div>
94
+</nav>

+ 7
- 0
public/static/bootstrap.min.js
File diff suppressed because it is too large
View File


+ 345
- 0
public/static/fa-svg-with-js.css View File

@@ -0,0 +1,345 @@
1
+/*!
2
+ * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com
3
+ * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4
+ */
5
+svg:not(:root).svg-inline--fa {
6
+  overflow: visible; }
7
+
8
+.svg-inline--fa {
9
+  display: inline-block;
10
+  font-size: inherit;
11
+  height: 1em;
12
+  overflow: visible;
13
+  vertical-align: -.125em; }
14
+  .svg-inline--fa.fa-lg {
15
+    vertical-align: -.225em; }
16
+  .svg-inline--fa.fa-w-1 {
17
+    width: 0.0625em; }
18
+  .svg-inline--fa.fa-w-2 {
19
+    width: 0.125em; }
20
+  .svg-inline--fa.fa-w-3 {
21
+    width: 0.1875em; }
22
+  .svg-inline--fa.fa-w-4 {
23
+    width: 0.25em; }
24
+  .svg-inline--fa.fa-w-5 {
25
+    width: 0.3125em; }
26
+  .svg-inline--fa.fa-w-6 {
27
+    width: 0.375em; }
28
+  .svg-inline--fa.fa-w-7 {
29
+    width: 0.4375em; }
30
+  .svg-inline--fa.fa-w-8 {
31
+    width: 0.5em; }
32
+  .svg-inline--fa.fa-w-9 {
33
+    width: 0.5625em; }
34
+  .svg-inline--fa.fa-w-10 {
35
+    width: 0.625em; }
36
+  .svg-inline--fa.fa-w-11 {
37
+    width: 0.6875em; }
38
+  .svg-inline--fa.fa-w-12 {
39
+    width: 0.75em; }
40
+  .svg-inline--fa.fa-w-13 {
41
+    width: 0.8125em; }
42
+  .svg-inline--fa.fa-w-14 {
43
+    width: 0.875em; }
44
+  .svg-inline--fa.fa-w-15 {
45
+    width: 0.9375em; }
46
+  .svg-inline--fa.fa-w-16 {
47
+    width: 1em; }
48
+  .svg-inline--fa.fa-w-17 {
49
+    width: 1.0625em; }
50
+  .svg-inline--fa.fa-w-18 {
51
+    width: 1.125em; }
52
+  .svg-inline--fa.fa-w-19 {
53
+    width: 1.1875em; }
54
+  .svg-inline--fa.fa-w-20 {
55
+    width: 1.25em; }
56
+  .svg-inline--fa.fa-pull-left {
57
+    margin-right: .3em;
58
+    width: auto; }
59
+  .svg-inline--fa.fa-pull-right {
60
+    margin-left: .3em;
61
+    width: auto; }
62
+  .svg-inline--fa.fa-border {
63
+    height: 1.5em; }
64
+  .svg-inline--fa.fa-li {
65
+    width: 2em; }
66
+  .svg-inline--fa.fa-fw {
67
+    width: 1.25em; }
68
+
69
+.fa-layers svg.svg-inline--fa {
70
+  bottom: 0;
71
+  left: 0;
72
+  margin: auto;
73
+  position: absolute;
74
+  right: 0;
75
+  top: 0; }
76
+
77
+.fa-layers {
78
+  display: inline-block;
79
+  height: 1em;
80
+  position: relative;
81
+  text-align: center;
82
+  vertical-align: -.125em;
83
+  width: 1em; }
84
+  .fa-layers svg.svg-inline--fa {
85
+    -webkit-transform-origin: center center;
86
+            transform-origin: center center; }
87
+
88
+.fa-layers-text, .fa-layers-counter {
89
+  display: inline-block;
90
+  position: absolute;
91
+  text-align: center; }
92
+
93
+.fa-layers-text {
94
+  left: 50%;
95
+  top: 50%;
96
+  -webkit-transform: translate(-50%, -50%);
97
+          transform: translate(-50%, -50%);
98
+  -webkit-transform-origin: center center;
99
+          transform-origin: center center; }
100
+
101
+.fa-layers-counter {
102
+  background-color: #ff253a;
103
+  border-radius: 1em;
104
+  -webkit-box-sizing: border-box;
105
+          box-sizing: border-box;
106
+  color: #fff;
107
+  height: 1.5em;
108
+  line-height: 1;
109
+  max-width: 5em;
110
+  min-width: 1.5em;
111
+  overflow: hidden;
112
+  padding: .25em;
113
+  right: 0;
114
+  text-overflow: ellipsis;
115
+  top: 0;
116
+  -webkit-transform: scale(0.25);
117
+          transform: scale(0.25);
118
+  -webkit-transform-origin: top right;
119
+          transform-origin: top right; }
120
+
121
+.fa-layers-bottom-right {
122
+  bottom: 0;
123
+  right: 0;
124
+  top: auto;
125
+  -webkit-transform: scale(0.25);
126
+          transform: scale(0.25);
127
+  -webkit-transform-origin: bottom right;
128
+          transform-origin: bottom right; }
129
+
130
+.fa-layers-bottom-left {
131
+  bottom: 0;
132
+  left: 0;
133
+  right: auto;
134
+  top: auto;
135
+  -webkit-transform: scale(0.25);
136
+          transform: scale(0.25);
137
+  -webkit-transform-origin: bottom left;
138
+          transform-origin: bottom left; }
139
+
140
+.fa-layers-top-right {
141
+  right: 0;
142
+  top: 0;
143
+  -webkit-transform: scale(0.25);
144
+          transform: scale(0.25);
145
+  -webkit-transform-origin: top right;
146
+          transform-origin: top right; }
147
+
148
+.fa-layers-top-left {
149
+  left: 0;
150
+  right: auto;
151
+  top: 0;
152
+  -webkit-transform: scale(0.25);
153
+          transform: scale(0.25);
154
+  -webkit-transform-origin: top left;
155
+          transform-origin: top left; }
156
+
157
+.fa-lg {
158
+  font-size: 1.33333em;
159
+  line-height: 0.75em;
160
+  vertical-align: -.0667em; }
161
+
162
+.fa-xs {
163
+  font-size: .75em; }
164
+
165
+.fa-sm {
166
+  font-size: .875em; }
167
+
168
+.fa-1x {
169
+  font-size: 1em; }
170
+
171
+.fa-2x {
172
+  font-size: 2em; }
173
+
174
+.fa-3x {
175
+  font-size: 3em; }
176
+
177
+.fa-4x {
178
+  font-size: 4em; }
179
+
180
+.fa-5x {
181
+  font-size: 5em; }
182
+
183
+.fa-6x {
184
+  font-size: 6em; }
185
+
186
+.fa-7x {
187
+  font-size: 7em; }
188
+
189
+.fa-8x {
190
+  font-size: 8em; }
191
+
192
+.fa-9x {
193
+  font-size: 9em; }
194
+
195
+.fa-10x {
196
+  font-size: 10em; }
197
+
198
+.fa-fw {
199
+  text-align: center;
200
+  width: 1.25em; }
201
+
202
+.fa-ul {
203
+  list-style-type: none;
204
+  margin-left: 2.5em;
205
+  padding-left: 0; }
206
+  .fa-ul > li {
207
+    position: relative; }
208
+
209
+.fa-li {
210
+  left: -2em;
211
+  position: absolute;
212
+  text-align: center;
213
+  width: 2em;
214
+  line-height: inherit; }
215
+
216
+.fa-border {
217
+  border: solid 0.08em #eee;
218
+  border-radius: .1em;
219
+  padding: .2em .25em .15em; }
220
+
221
+.fa-pull-left {
222
+  float: left; }
223
+
224
+.fa-pull-right {
225
+  float: right; }
226
+
227
+.fa.fa-pull-left,
228
+.fas.fa-pull-left,
229
+.far.fa-pull-left,
230
+.fal.fa-pull-left,
231
+.fab.fa-pull-left {
232
+  margin-right: .3em; }
233
+
234
+.fa.fa-pull-right,
235
+.fas.fa-pull-right,
236
+.far.fa-pull-right,
237
+.fal.fa-pull-right,
238
+.fab.fa-pull-right {
239
+  margin-left: .3em; }
240
+
241
+.fa-spin {
242
+  -webkit-animation: fa-spin 2s infinite linear;
243
+          animation: fa-spin 2s infinite linear; }
244
+
245
+.fa-pulse {
246
+  -webkit-animation: fa-spin 1s infinite steps(8);
247
+          animation: fa-spin 1s infinite steps(8); }
248
+
249
+@-webkit-keyframes fa-spin {
250
+  0% {
251
+    -webkit-transform: rotate(0deg);
252
+            transform: rotate(0deg); }
253
+  100% {
254
+    -webkit-transform: rotate(360deg);
255
+            transform: rotate(360deg); } }
256
+
257
+@keyframes fa-spin {
258
+  0% {
259
+    -webkit-transform: rotate(0deg);
260
+            transform: rotate(0deg); }
261
+  100% {
262
+    -webkit-transform: rotate(360deg);
263
+            transform: rotate(360deg); } }
264
+
265
+.fa-rotate-90 {
266
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
267
+  -webkit-transform: rotate(90deg);
268
+          transform: rotate(90deg); }
269
+
270
+.fa-rotate-180 {
271
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
272
+  -webkit-transform: rotate(180deg);
273
+          transform: rotate(180deg); }
274
+
275
+.fa-rotate-270 {
276
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
277
+  -webkit-transform: rotate(270deg);
278
+          transform: rotate(270deg); }
279
+
280
+.fa-flip-horizontal {
281
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
282
+  -webkit-transform: scale(-1, 1);
283
+          transform: scale(-1, 1); }
284
+
285
+.fa-flip-vertical {
286
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
287
+  -webkit-transform: scale(1, -1);
288
+          transform: scale(1, -1); }
289
+
290
+.fa-flip-horizontal.fa-flip-vertical {
291
+  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
292
+  -webkit-transform: scale(-1, -1);
293
+          transform: scale(-1, -1); }
294
+
295
+:root .fa-rotate-90,
296
+:root .fa-rotate-180,
297
+:root .fa-rotate-270,
298
+:root .fa-flip-horizontal,
299
+:root .fa-flip-vertical {
300
+  -webkit-filter: none;
301
+          filter: none; }
302
+
303
+.fa-stack {
304
+  display: inline-block;
305
+  height: 2em;
306
+  position: relative;
307
+  width: 2em; }
308
+
309
+.fa-stack-1x,
310
+.fa-stack-2x {
311
+  bottom: 0;
312
+  left: 0;
313
+  margin: auto;
314
+  position: absolute;
315
+  right: 0;
316
+  top: 0; }
317
+
318
+.svg-inline--fa.fa-stack-1x {
319
+  height: 1em;
320
+  width: 1em; }
321
+
322
+.svg-inline--fa.fa-stack-2x {
323
+  height: 2em;
324
+  width: 2em; }
325
+
326
+.fa-inverse {
327
+  color: #fff; }
328
+
329
+.sr-only {
330
+  border: 0;
331
+  clip: rect(0, 0, 0, 0);
332
+  height: 1px;
333
+  margin: -1px;
334
+  overflow: hidden;
335
+  padding: 0;
336
+  position: absolute;
337
+  width: 1px; }
338
+
339
+.sr-only-focusable:active, .sr-only-focusable:focus {
340
+  clip: auto;
341
+  height: auto;
342
+  margin: 0;
343
+  overflow: visible;
344
+  position: static;
345
+  width: auto; }

+ 5
- 0
public/static/fontawesome-all.min.js
File diff suppressed because it is too large
View File


+ 2
- 0
public/static/jquery-3.3.1.min.js
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/cerulean/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/cosmo/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/cyborg/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/darkly/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 7
- 0
public/themes/default/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/flatly/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/journal/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/litera/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/lumen/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/lux/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/materia/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/minty/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/pulse/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/sandstone/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/simplex/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/sketchy/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/slate/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/solar/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/spacelab/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/superhero/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 90
- 0
public/themes/themes.json View File

@@ -0,0 +1,90 @@
1
+{
2
+    "default": {
3
+        "title": "Default",
4
+        "description": "Standard Bootstrap theme"
5
+    },
6
+    "cerulean": {
7
+        "title": "Cerulean",
8
+        "description": "A calm blue sky"
9
+    },
10
+    "cosmo": {
11
+        "title": "Cosmo",
12
+        "description": "An ode to Metro"
13
+    },
14
+    "cyborg": {
15
+        "title": "Cyborg",
16
+        "description": "Jet black and electric blue"
17
+    },
18
+    "darkly": {
19
+        "title": "Darkly",
20
+        "description": "Flatly in night mode"
21
+    },
22
+    "flatly": {
23
+        "title": "Flatly",
24
+        "description": "Flat and modern"
25
+    },
26
+    "journal": {
27
+        "title": "Journal",
28
+        "description": "Crisp like a new sheet of paper"
29
+    },
30
+    "litera": {
31
+        "title": "Litera",
32
+        "description": "The medium is the message"
33
+    },
34
+    "lumen": {
35
+        "title": "Lumen",
36
+        "description": "Light and shadow"
37
+    },
38
+    "lux": {
39
+        "title": "Lux",
40
+        "description": "A touch of class"
41
+    },
42
+    "materia": {
43
+        "title": "Materia",
44
+        "description": "Material is the metaphor"
45
+    },
46
+    "minty": {
47
+        "title": "Minty",
48
+        "description": "A fresh feel"
49
+    },
50
+    "pulse": {
51
+        "title": "Pulse",
52
+        "description": "A trace of purple"
53
+    },
54
+    "sandstone": {
55
+        "title": "Sandstone",
56
+        "description": "A touch of warmth"
57
+    },
58
+    "simplex": {
59
+        "title": "Simplex",
60
+        "description": "Mini and minimalist"
61
+    },
62
+    "sketchy": {
63
+        "title": "Sketchy",
64
+        "description": "A hand-drawn look for mockups and mirth"
65
+    },
66
+    "slate": {
67
+        "title": "Slate",
68
+        "description": "Shades of gunmetal gray"
69
+    },
70
+    "solar": {
71
+        "title": "Solar",
72
+        "description": "A spin on Solarized"
73
+    },
74
+    "spacelab": {
75
+        "title": "Spacelab",
76
+        "description": "Silvery and sleek"
77
+    },
78
+    "superhero": {
79
+        "title": "Superhero",
80
+        "description": "The brave and the blue"
81
+    },
82
+    "united": {
83
+        "title": "United",
84
+        "description": "Ubuntu orange and unique font"
85
+    },
86
+    "yeti": {
87
+        "title": "Yeti",
88
+        "description": "A friendly foundation"
89
+    }
90
+}

+ 12
- 0
public/themes/united/bootstrap.min.css
File diff suppressed because it is too large
View File


+ 12
- 0
public/themes/yeti/bootstrap.min.css
File diff suppressed because it is too large
View File


Loading…
Cancel
Save