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

master
Skylar Ittner 6 роки тому
джерело 9fc5912d10
коміт c4c387cf62

Бінарний файл не відображається.

@ -0,0 +1,50 @@
<?php
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
require_once __DIR__ . "/../required.php";
define("NICKELBOX", true);
require_once __DIR__ . "/lib/item.php";
$config = $database->select("config", ['key', 'value']);
$settings = [
"sitename" => "Shop",
"theme" => "default",
];
foreach ($config as $c) {
$settings[$c['key']] = $c['value'];
}
$page = "home";
if (isset($_GET['page'])) {
switch ($_GET['page']) {
case "browse":
if (isset($_GET['cat']) && $binstack->has('categories', ['catid' => $_GET['cat']])) {
$page = "browse";
} else {
$page = "404";
}
break;
case "item":
if (isset($_GET['id']) && $binstack->has('items', ['itemid' => $_GET['id']])) {
$page = "item";
} else {
$page = "404";
}
break;
case "home":
default:
$page = "home";
}
}
require __DIR__ . "/parts/head.php";
require __DIR__ . "/parts/nav.php";
require __DIR__ . "/parts/$page.php";
require __DIR__ . "/parts/footer.php";

@ -0,0 +1,112 @@
<?php
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
require_once __DIR__ . "/../../required.php";
class Item {
private $itemid = null;
private $itemdata = [];
function __construct($itemid) {
global $binstack;
$this->itemdata = $binstack->get('items', ['itemid', 'catid', 'name', 'text1', 'qty', 'want', 'cost', 'price'], ['itemid' => $itemid]);
$this->itemid = $itemid;
}
function getId() {
return $this->itemid;
}
function getPrice($customer = null) {
global $database;
$binprice = $this->itemdata['price'];
if (!is_null($customer)) {
if ($database->has('customer_pricing', ['AND' => ['itemid' => $this->itemid, 'customerid' => $customer]])) {
return $database->get('customer_pricing', 'price', ['AND' => ['itemid' => $this->itemid, 'customerid' => $customer]]);
}
}
return $binprice;
}
function getName() {
return $this->itemdata['name'];
}
function getDescription() {
return $this->itemdata['text1'];
}
function getQty() {
return $this->itemdata['qty'];
}
function getWant() {
return $this->itemdata['want'];
}
function getCategoryName() {
global $binstack;
return $binstack->get('items', ['[>]categories' => 'catid'], 'catname', ['itemid' => $this->itemid]);
}
function getCategoryId() {
return $this->itemdata['catid'];
}
}
class RenderItem {
static function card(Item $item) {
$id = $item->getId();
$name = $item->getName();
$catid = $item->getCategoryId();
$catname = $item->getCategoryName();
$price = $item->getPrice();
$html = <<<END
<div class="card m-2">
<div class="card-body text-center">
<a href="./?page=item&id=$id" class="font-weight-bold">$name</a><br />
<span>$$price</span>
</div>
</div>
END;
return $html;
}
static function line(Item $item) {
$id = $item->getId();
$name = $item->getName();
$catid = $item->getCategoryId();
$catname = $item->getCategoryName();
$price = $item->getPrice();
$html = <<<END
<div class="list-group-item d-flex flex-wrap">
<div>
<h4><a href="./?page=item&id=$id">$name</a></h4>
<span>$$price</span>
</div>
<div class="ml-auto">
<form action="./action.php" method="POST">
<div class="input-group">
<input type="number" name="qty" class="form-control mb-2" placeholder="Quantity" value="1" />
<div class="input-group-addon">
<button type="submit" class="btn btn-primary"><i class="fas fa-cart-plus"></i> Add</button>
</div>
</div>
<input type="hidden" name="item" value="<?php echo $id; ?>" />
<input type="hidden" name="action" value="addtocart" />
</form>
</div>
</div>
END;
return $html;
}
}

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

@ -0,0 +1,32 @@
<?php
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
if (!defined('NICKELBOX')) {
die("Direct access denied.");
}
$catid = $_GET['cat'];
$cat = $binstack->get('categories', 'catname', ['catid' => $catid]);
$dbitems = $binstack->select('items', 'itemid', ['AND' => ['price[>]' => 0, 'catid' => $catid], 'LIMIT' => 20]);
$items = [];
foreach ($dbitems as $i) {
$items[] = new Item($i);
}
?>
<div class="container mt-4">
<h1 class="display-4"><?php echo $cat; ?></h1>
<div class="list-group list-group-flush">
<?php
foreach ($items as $i) {
echo RenderItem::line($i);
}
?>
</div>
</div>

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

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

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

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

@ -0,0 +1,51 @@
<?php
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
if (!defined('NICKELBOX')) {
die("Direct access denied.");
}
$dbitems = $binstack->select('items', 'itemid', ['AND' => ['price[>]' => 0], 'LIMIT' => 20]);
$items = [];
foreach ($dbitems as $i) {
$items[] = new Item($i);
}
?>
<div class="container mt-4">
<div class="row">
<div class="col-md-4 col-xl-3 d-none d-md-block">
<div class="card">
<div class="card-body">
<h5 class="card-title">Categories</h5>
<ul class="list-group list-group-flush">
<?php
foreach ($categories as $c) {
?>
<li class="list-group-item">
<a href="./?page=browse&cat=<?php echo $c['id']; ?>">
<?php echo $c['name']; ?>
</a>
</li>
<?php
}
?>
</ul>
</div>
</div>
</div>
<div class="col-md-8 col-xl-9 d-flex flex-wrap">
<?php
foreach ($items as $i) {
echo RenderItem::card($i);
}
?>
</div>
</div>
</div>

@ -0,0 +1,58 @@
<?php
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
if (!defined('NICKELBOX')) {
die("Direct access denied.");
}
$item = new Item($_GET['id']);
?>
<div class="container">
<div class="row">
<div class="col-md-4">
<!-- Item image(s) go here -->
</div>
<div class="col-md-8">
<div class="row mt-4">
<div class="col-sm-7 jumbotron py-4">
<h2><?php echo $item->getName(); ?></h2>
<p>in <a href="./?page=browse&cat=<?php echo $item->getCategoryId(); ?>"><?php echo $item->getCategoryName(); ?></a></p>
<h3>$<?php echo $item->getPrice(); ?></h3>
</div>
<div class="col-sm-5">
<form action="./action.php" method="POST">
<input type="number" name="qty" class="form-control mb-2" placeholder="Quantity" value="1" />
<button type="submit" class="btn btn-block btn-primary"><i class="fas fa-cart-plus"></i> Add to Cart</button>
<input type="hidden" name="item" value="<?php echo $item->getId(); ?>" />
<input type="hidden" name="action" value="addtocart" />
</form>
</div>
</div>
</div>
</div>
<div class="row mt-4 mt-sm-0">
<div class="col-12">
<div class="card">
<div class="card-body">
<h5 class="card-title">Description</h5>
<p>
<?php
$desc = $item->getDescription();
if (empty($desc)) {
echo "No item information found.";
} else {
echo htmlspecialchars($desc);
}
?>
</p>
</div>
</div>
</div>
</div>
</div>

@ -0,0 +1,94 @@
<?php
/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
if (!defined('NICKELBOX')) {
die("Direct access denied.");
}
$cats = $binstack->select('categories', ['catid (id)', 'catname (name)']);
$categories = [];
foreach ($cats as $c) {
if ($binstack->has('items', ['AND' => ['catid' => $c['id'], 'price[>]' => 0]])) {
$categories[] = $c;
}
}
?>
<nav class="navbar navbar-expand navbar-dark bg-dark">
<a class="navbar-brand" href="./"><?php echo $settings['sitename']; ?></a>
<div class="collapse navbar-collapse">
<ul class="navbar-nav d-none d-md-inline">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="categorydropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Categories
</a>
<div class="dropdown-menu" aria-labelledby="categorydropdown">
<?php
foreach ($categories as $c) {
?>
<a class="dropdown-item" href="./?page=browse&cat=<?php echo $c['id']; ?>"><?php echo $c['name']; ?></a>
<?php
}
?>
</div>
</li>
</ul>
<form class="form-inline ml-3">
<div class="input-group">
<input class="form-control" type="search" placeholder="Search" aria-label="Search">
<div class="input-group-addon">
<button class="btn btn-success" type="submit"><i class="fas fa-search"></i> <span class="d-none d-md-inline">Search</span></button>
</div>
</div>
</form>
<div class="d-none d-md-inline ml-auto">
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link" href="./?page=cart">
<i class="fas fa-shopping-cart"></i> Cart
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="./?page=account">
<i class="fas fa-user-circle"></i> Account
</a>
</li>
</ul>
</div>
</div>
</nav>
<nav class="navbar navbar-expand navbar-dark bg-dark d-md-none">
<div class="collapse navbar-collapse justify-content-between">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="categorydropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Categories
</a>
<div class="dropdown-menu" aria-labelledby="categorydropdown">
<?php
foreach ($categories as $c) {
?>
<a class="dropdown-item" href="./?page=browse&cat=<?php echo $c['id']; ?>"><?php echo $c['name']; ?></a>
<?php
}
?>
</div>
</li>
</ul>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="./?page=cart">
<i class="fas fa-shopping-cart"></i> Cart
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="./?page=account">
<i class="fas fa-user-circle"></i> Account
</a>
</li>
</ul>
</div>
</nav>

7
public/static/bootstrap.min.js сторонній

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

@ -0,0 +1,345 @@
/*!
* Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
*/
svg:not(:root).svg-inline--fa {
overflow: visible; }
.svg-inline--fa {
display: inline-block;
font-size: inherit;
height: 1em;
overflow: visible;
vertical-align: -.125em; }
.svg-inline--fa.fa-lg {
vertical-align: -.225em; }
.svg-inline--fa.fa-w-1 {
width: 0.0625em; }
.svg-inline--fa.fa-w-2 {
width: 0.125em; }
.svg-inline--fa.fa-w-3 {
width: 0.1875em; }
.svg-inline--fa.fa-w-4 {
width: 0.25em; }
.svg-inline--fa.fa-w-5 {
width: 0.3125em; }
.svg-inline--fa.fa-w-6 {
width: 0.375em; }
.svg-inline--fa.fa-w-7 {
width: 0.4375em; }
.svg-inline--fa.fa-w-8 {
width: 0.5em; }
.svg-inline--fa.fa-w-9 {
width: 0.5625em; }
.svg-inline--fa.fa-w-10 {
width: 0.625em; }
.svg-inline--fa.fa-w-11 {
width: 0.6875em; }
.svg-inline--fa.fa-w-12 {
width: 0.75em; }
.svg-inline--fa.fa-w-13 {
width: 0.8125em; }
.svg-inline--fa.fa-w-14 {
width: 0.875em; }
.svg-inline--fa.fa-w-15 {
width: 0.9375em; }
.svg-inline--fa.fa-w-16 {
width: 1em; }
.svg-inline--fa.fa-w-17 {
width: 1.0625em; }
.svg-inline--fa.fa-w-18 {
width: 1.125em; }
.svg-inline--fa.fa-w-19 {
width: 1.1875em; }
.svg-inline--fa.fa-w-20 {
width: 1.25em; }
.svg-inline--fa.fa-pull-left {
margin-right: .3em;
width: auto; }
.svg-inline--fa.fa-pull-right {
margin-left: .3em;
width: auto; }
.svg-inline--fa.fa-border {
height: 1.5em; }
.svg-inline--fa.fa-li {
width: 2em; }
.svg-inline--fa.fa-fw {
width: 1.25em; }
.fa-layers svg.svg-inline--fa {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0; }
.fa-layers {
display: inline-block;
height: 1em;
position: relative;
text-align: center;
vertical-align: -.125em;
width: 1em; }
.fa-layers svg.svg-inline--fa {
-webkit-transform-origin: center center;
transform-origin: center center; }
.fa-layers-text, .fa-layers-counter {
display: inline-block;
position: absolute;
text-align: center; }
.fa-layers-text {
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
-webkit-transform-origin: center center;
transform-origin: center center; }
.fa-layers-counter {
background-color: #ff253a;
border-radius: 1em;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: #fff;
height: 1.5em;
line-height: 1;
max-width: 5em;
min-width: 1.5em;
overflow: hidden;
padding: .25em;
right: 0;
text-overflow: ellipsis;
top: 0;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: top right;
transform-origin: top right; }
.fa-layers-bottom-right {
bottom: 0;
right: 0;
top: auto;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: bottom right;
transform-origin: bottom right; }
.fa-layers-bottom-left {
bottom: 0;
left: 0;
right: auto;
top: auto;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: bottom left;
transform-origin: bottom left; }
.fa-layers-top-right {
right: 0;
top: 0;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: top right;
transform-origin: top right; }
.fa-layers-top-left {
left: 0;
right: auto;
top: 0;
-webkit-transform: scale(0.25);
transform: scale(0.25);
-webkit-transform-origin: top left;
transform-origin: top left; }
.fa-lg {
font-size: 1.33333em;
line-height: 0.75em;
vertical-align: -.0667em; }
.fa-xs {
font-size: .75em; }
.fa-sm {
font-size: .875em; }
.fa-1x {
font-size: 1em; }
.fa-2x {
font-size: 2em; }
.fa-3x {
font-size: 3em; }
.fa-4x {
font-size: 4em; }
.fa-5x {
font-size: 5em; }
.fa-6x {
font-size: 6em; }
.fa-7x {
font-size: 7em; }
.fa-8x {
font-size: 8em; }
.fa-9x {
font-size: 9em; }
.fa-10x {
font-size: 10em; }
.fa-fw {
text-align: center;
width: 1.25em; }
.fa-ul {
list-style-type: none;
margin-left: 2.5em;
padding-left: 0; }
.fa-ul > li {
position: relative; }
.fa-li {
left: -2em;
position: absolute;
text-align: center;
width: 2em;
line-height: inherit; }
.fa-border {
border: solid 0.08em #eee;
border-radius: .1em;
padding: .2em .25em .15em; }
.fa-pull-left {
float: left; }
.fa-pull-right {
float: right; }
.fa.fa-pull-left,
.fas.fa-pull-left,
.far.fa-pull-left,
.fal.fa-pull-left,
.fab.fa-pull-left {
margin-right: .3em; }
.fa.fa-pull-right,
.fas.fa-pull-right,
.far.fa-pull-right,
.fal.fa-pull-right,
.fab.fa-pull-right {
margin-left: .3em; }
.fa-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear; }
.fa-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8); }
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
.fa-rotate-90 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";
-webkit-transform: rotate(90deg);
transform: rotate(90deg); }
.fa-rotate-180 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";
-webkit-transform: rotate(180deg);
transform: rotate(180deg); }
.fa-rotate-270 {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";
-webkit-transform: rotate(270deg);
transform: rotate(270deg); }
.fa-flip-horizontal {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";
-webkit-transform: scale(-1, 1);
transform: scale(-1, 1); }
.fa-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(1, -1);
transform: scale(1, -1); }
.fa-flip-horizontal.fa-flip-vertical {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";
-webkit-transform: scale(-1, -1);
transform: scale(-1, -1); }
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical {
-webkit-filter: none;
filter: none; }
.fa-stack {
display: inline-block;
height: 2em;
position: relative;
width: 2em; }
.fa-stack-1x,
.fa-stack-2x {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0; }
.svg-inline--fa.fa-stack-1x {
height: 1em;
width: 1em; }
.svg-inline--fa.fa-stack-2x {
height: 2em;
width: 2em; }
.fa-inverse {
color: #fff; }
.sr-only {
border: 0;
clip: rect(0, 0, 0, 0);
height: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
width: 1px; }
.sr-only-focusable:active, .sr-only-focusable:focus {
clip: auto;
height: auto;
margin: 0;
overflow: visible;
position: static;
width: auto; }

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

@ -0,0 +1,90 @@
{
"default": {
"title": "Default",
"description": "Standard Bootstrap theme"
},
"cerulean": {
"title": "Cerulean",
"description": "A calm blue sky"
},
"cosmo": {
"title": "Cosmo",
"description": "An ode to Metro"
},
"cyborg": {
"title": "Cyborg",
"description": "Jet black and electric blue"
},
"darkly": {
"title": "Darkly",
"description": "Flatly in night mode"
},
"flatly": {
"title": "Flatly",
"description": "Flat and modern"
},
"journal": {
"title": "Journal",
"description": "Crisp like a new sheet of paper"
},
"litera": {
"title": "Litera",
"description": "The medium is the message"
},
"lumen": {
"title": "Lumen",
"description": "Light and shadow"
},
"lux": {
"title": "Lux",
"description": "A touch of class"
},
"materia": {
"title": "Materia",
"description": "Material is the metaphor"
},
"minty": {
"title": "Minty",
"description": "A fresh feel"
},
"pulse": {
"title": "Pulse",
"description": "A trace of purple"
},
"sandstone": {
"title": "Sandstone",
"description": "A touch of warmth"
},
"simplex": {
"title": "Simplex",
"description": "Mini and minimalist"
},
"sketchy": {
"title": "Sketchy",
"description": "A hand-drawn look for mockups and mirth"
},
"slate": {
"title": "Slate",
"description": "Shades of gunmetal gray"
},
"solar": {
"title": "Solar",
"description": "A spin on Solarized"
},
"spacelab": {
"title": "Spacelab",
"description": "Silvery and sleek"
},
"superhero": {
"title": "Superhero",
"description": "The brave and the blue"
},
"united": {
"title": "United",
"description": "Ubuntu orange and unique font"
},
"yeti": {
"title": "Yeti",
"description": "A friendly foundation"
}
}

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі

Різницю між файлами не показано, оскільки один чи декілька рядків занадто довгі
Завантаження…
Відмінити
Зберегти