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

master
Skylar Ittner 6 jaren geleden
bovenliggende 9fc5912d10
commit c4c387cf62

Binair bestand niet weergegeven.

@ -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>

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

@ -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; }

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

@ -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"
}
}

Bestand-diff onderdrukt omdat een of meer regels te lang zijn

Bestand-diff onderdrukt omdat een of meer regels te lang zijn
Laden…
Annuleren
Opslaan