Browse Source

Change Todo, remove code

master
Nero 5 years ago
parent
commit
9ca05db5e4
  1. 1
      .gitignore
  2. 2
      README.md
  3. 93
      addReactions.html
  4. 85
      addReponse.js
  5. 119
      app.css
  6. 1044
      app.js
  7. 1
      css/lightbox.min.css
  8. 95
      documentation.md
  9. BIN
      images/close.png
  10. BIN
      images/loading.gif
  11. BIN
      images/next.png
  12. BIN
      images/prev.png
  13. BIN
      img/1.png
  14. BIN
      img/2.png
  15. BIN
      img/3.png
  16. BIN
      img/4.png
  17. BIN
      img/5.png
  18. BIN
      img/6.png
  19. BIN
      img/luna.png
  20. 211
      index.html
  21. 15
      js/lightbox.min.js
  22. 16
      manifest/kara.json

1
.gitignore vendored

@ -1 +0,0 @@
.idea

2
README.md

@ -0,0 +1,2 @@
Kara has been moved to luna-development core repository.
This repository is only for issues.

93
addReactions.html

@ -1,93 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Kara - Add reponses
</title>
<meta charset="utf8">
<link rel="icon" href="/favicon.ico">
<link rel="manifest" href="manifest/kara.json">
<link href="https://bootswatch.com/4/slate/bootstrap.min.css" rel="stylesheet" type="text/css"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no"
name="viewport">
</head>
<body>
<div class="container-fluid" id="kara">
<div id="kara-banner" class="bg-dark text-light">
<img src="/img/logo/luna/icon.ico" class="header-logo" alt="logo-header"/>
{{ this.name }}
</div>
<div class="row" id="addForm">
<div class="col">
<h5>Add Reaction</h5>
<div class="form-group">
<label for="includeAll">Message must include all search-terms</label>
<input type="checkbox" id="includeALl" v-model="addModal.includeAll">
</div>
<div class="form-group">
<label for="keywords">Keywords (separated with comma)</label>
<input type="text" id="keywords" v-model="addModal.keywords" class="form-control">
</div>
<div class="form-group">
<label>Responses</label>
<small>(Wildcards: $username$, $botname$)</small>
<template v-for="(key, responseOption) in addModal.responses">
<input type="text" v-model="addModal.responses[responseOption]" class="form-control response-input">
</template>
<div class="float-right">
<button class="btn-sm btn-success" @click="addResponseToInput">+</button>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
<button type="button" class="btn btn-primary" data-dismiss="modal" @click="addNewReaction">Add
</button>
</div>
</div>
<link rel="stylesheet"
:href="'https://maxcdn.bootstrapcdn.com/bootswatch/4.3.1/' + activeTheme + '/bootstrap.min.css'">
<link href="app.css" rel="stylesheet" type="text/css"/>
</div>
<script src="https://kit.fontawesome.com/b54a4cceff.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js"
crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="addReponse.js"></script>
<!-- JavaScript -->
<script src="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/alertify.min.js"></script>
<!-- CSS -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/alertify.min.css"/>
<!-- Default theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/default.min.css"/>
<!-- Semantic UI theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/semantic.min.css"/>
<!-- Bootstrap theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/bootstrap.min.css"/>
<!--
RTL version
-->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/alertify.rtl.min.css"/>
<!-- Default theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/default.rtl.min.css"/>
<!-- Semantic UI theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/semantic.rtl.min.css"/>
<!-- Bootstrap theme -->
<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/bootstrap.rtl.min.css"/>
</body>
</html>

85
addReponse.js

@ -1,85 +0,0 @@
let responses = new Vue({
el: '#kara',
data: {
name: 'Kara',
activeTheme: 'slate',
addModal: {
includeAll: false,
keywords: 'keyword',
responses: [
'Answer #1'
]
},
defaultAddModal: {
includeAll: false,
keywords: 'keyword',
responses: [
'Answer #1'
]
}
},
mounted() {
this.addModal = this.defaultAddModal;
},
methods: {
addMessage(body, bot, me = false) {
this.messages.push({
body: body,
bot: bot,
command: body.search('/') === 0,
me: me,
time: Date.now()
})
},
addResponseToInput() {
this.addModal.responses.push('');
},
addNewReaction() {
let includeAll = this.addModal.includeAll;
let keywords = this.addModal.keywords.split(',');
let responses = this.addModal.responses;
let newReaction = {
includeAll: includeAll,
keywords: keywords,
responses: responses
};
axios.post('/reactions/create', {
reaction: newReaction
}).then((response) => {
alertify.notify('Reaction saved!', 'success');
this.addModal = this.defaultAddModal;
}).catch((error) => {
console.log(error);
alertify.notify(error, 'danger');
});
},
cleanupMessage(message) {
message = message.toLowerCase();
return message.replace('?', '')
.replace('!', '')
.replace('.', '')
.replace(',', '')
.replace('-', '')
.replace('_', '')
.replace('#', '')
.replace('\'', '')
.replace('"', '')
.replace('+', '')
.replace('*', '')
.replace('§', '')
.replace('$', '')
.replace('%', '')
.replace('&', '')
.replace('/', '')
.replace('(', '')
.replace(')', '')
.replace('=', '')
.replace('\\', '')
.replace('@', '')
.replace('~', '')
.replace('…', '');
}
}
});

119
app.css

@ -1,119 +0,0 @@
body {
margin: 15px;
padding: 0;
}
#kara {
margin: 0;
padding: 0;
width: auto;
}
@media (min-width: 40em) {
#kara,
#kara-banner,
#chatbox-wrapper {
margin-left: auto;
margin-right: auto;
padding: 0;
width: 40em;
}
}
.message {
color: black;
padding: 10px;
margin-bottom: 5px;
min-width: 55%;
max-width: 80%;
}
img.message-image {
max-width: 60%;
border-radius: 0 15px 15px 15px;
margin-bottom: 5px;
clear: top;
}
.bot-message {
border-radius: 0 15px 15px 15px;
background-color: lightgreen;
}
.user-message {
border-radius: 15px 0 15px 15px;
background-color: lightblue;
}
#chat-box {
margin-top: 4em;
padding-right: 15px;
overflow-y: scroll;
height: 65vh;
padding-bottom: 2em;
}
#chatbox-wrapper {
position: fixed;
padding: 1em;
bottom: 0;
left: 0;
right: 0;
}
#kara-banner {
position: fixed;
height: 3.2em;
top: 0;
left: 0;
right: 0;
text-align: center;
padding: 0.7em;
}
#kara-banner .btn, .add-response-input-button {
margin-top: -0.3em;
}
.response-input {
margin-bottom: 3px;
}
.form-button {
width: 100%;
}
.command-message {
color: grey;
}
.command-message::before {
content: '$: ';
}
.header-logo {
max-height: 32px;
max-width: 32px;
width: 32px;
height: 32px;
margin-right: 5px;
}
.me-message {
background-color: orange;
}
#addForm {
margin-top: 60px;
}
.fa-check-circle {
color: green;
}
.message-container {
overflow-y: auto;
overflow-x: hidden;
max-height: 300px
}

1044
app.js

File diff suppressed because it is too large Load Diff

1
css/lightbox.min.css vendored

@ -1 +0,0 @@
.lb-loader,.lightbox{text-align:center;line-height:0;position:absolute;left:0}body.lb-disable-scrolling{overflow:hidden}.lightboxOverlay{position:absolute;top:0;left:0;z-index:9999;background-color:#000;filter:alpha(Opacity=80);opacity:.8;display:none}.lightbox{width:100%;z-index:10000;font-weight:400;outline:0}.lightbox .lb-image{display:block;height:auto;max-width:inherit;max-height:none;border-radius:3px;border:4px solid #fff}.lightbox a img{border:none}.lb-outerContainer{position:relative;width:250px;height:250px;margin:0 auto;border-radius:4px;background-color:#fff}.lb-outerContainer:after{content:"";display:table;clear:both}.lb-loader{top:43%;height:25%;width:100%}.lb-cancel{display:block;width:32px;height:32px;margin:0 auto;background:url(../../../../../Desktop/lightbox2-2.11.3/dist/images/loading.gif) no-repeat}.lb-nav{position:absolute;top:0;left:0;height:100%;width:100%;z-index:10}.lb-container>.nav{left:0}.lb-nav a{outline:0;background-image:url(data:image/gif;base64,R0lGODlhAQABAPAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==)}.lb-next,.lb-prev{height:100%;cursor:pointer;display:block}.lb-nav a.lb-prev{width:34%;left:0;float:left;background:url(../../../../../Desktop/lightbox2-2.11.3/dist/images/prev.png) left 48% no-repeat;filter:alpha(Opacity=0);opacity:0;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;-o-transition:opacity .6s;transition:opacity .6s}.lb-nav a.lb-prev:hover{filter:alpha(Opacity=100);opacity:1}.lb-nav a.lb-next{width:64%;right:0;float:right;background:url(../../../../../Desktop/lightbox2-2.11.3/dist/images/next.png) right 48% no-repeat;filter:alpha(Opacity=0);opacity:0;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;-o-transition:opacity .6s;transition:opacity .6s}.lb-nav a.lb-next:hover{filter:alpha(Opacity=100);opacity:1}.lb-dataContainer{margin:0 auto;padding-top:5px;width:100%;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.lb-dataContainer:after{content:"";display:table;clear:both}.lb-data{padding:0 4px;color:#ccc}.lb-data .lb-details{width:85%;float:left;text-align:left;line-height:1.1em}.lb-data .lb-caption{font-size:13px;font-weight:700;line-height:1em}.lb-data .lb-caption a{color:#4ae}.lb-data .lb-number{display:block;clear:left;padding-bottom:1em;font-size:12px;color:#999}.lb-data .lb-close{display:block;float:right;width:30px;height:30px;background:url(../../../../../Desktop/lightbox2-2.11.3/dist/images/close.png) top right no-repeat;text-align:right;outline:0;filter:alpha(Opacity=70);opacity:.7;-webkit-transition:opacity .2s;-moz-transition:opacity .2s;-o-transition:opacity .2s;transition:opacity .2s}.lb-data .lb-close:hover{cursor:pointer;filter:alpha(Opacity=100);opacity:1}

95
documentation.md

@ -1,95 +0,0 @@
#### Commands
##### ```/clear```
Clears the chat.
##### ```/say```
Repeats your message.
##### ```/todo```
Adds a new todo to the list. Todos can be viewed, checked and cleared by clicking on the clipboard-icon (only visible once you have a least one todo) in the upper right.
##### ```/weather```
Tells you the weather in your location.\
Your location can be set in the settings.\
\
Can be triggered by messages like:
- _How is the weather?_
##### ```/joke```
Tells a joke with an opener and a delayed punchline.\
Categories are: general (default), knock-knock, programming
\
Can be triggered by messages like:
- _Tell me a joke_
- _Tell me a knock knock joke_
- _Tell me a programming joke_
##### ```/meme```
Sends a random meme from reddit.\
You can pass a subreddit of your choice (Yes, NSFW too..)
\
Some predefined meme-categories can be triggerd by:
- _Send me a coding meme_
- _Send me a dank meme_
- _Send me a birb meme_
##### ```/me```
Sends a classical "_User farted_" message.
##### ```/lyrics```
Fetch lyrics for songs.\
Usage: ```/lyrics songname```\
(you can also search for things like ```songname artist```)
##### ```/quiz```
Get a quiz-question and guess the answer.\
You can always give up by typing "i give up".
##### ```/jeopardy```
The opposite of ```/quiz```.\
Guess the right question to the given answer.
##### ```/dice```
Roll the dice!
##### Animal images & facts
There are a number of commands to receive random animal images & facts.
Animals:\
_birb, dog, cat, fox, panda, red_panda & koala_
To get a fact or an image, use:
```/youranimalImg``` or ```/youranimalFact```
---
#### Experimental
##### ```/talk```
Activate talking. Kara will now talk to you.\
The voice-language heavily depends on the device used.
---
#### Planned features
- Timetracking for work with unlimited trackers
- Wikipedia lookup
- News integration
- Multilanguage (English, German)
- More natural conversations
- Chrome Extension (_WIP_)
- YouTube integration
- more fun stuff & games
- maybe some quick image-converting & editing in the future.
---
#### Found a bug?
Eat it! Or open an [issue](https://git.luna-development.net/neroignis/kara) 🐞

BIN
images/close.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 B

BIN
images/loading.gif

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

BIN
images/next.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

BIN
images/prev.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

BIN
img/1.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1006 B

BIN
img/2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

BIN
img/3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/5.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

BIN
img/luna.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

211
index.html

@ -1,211 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>
Kara
</title>
<meta charset="utf8">
<link rel="icon" href="/favicon.ico">
<link rel="manifest" href="manifest/kara.json">
<link href="https://bootswatch.com/4/slate/bootstrap.min.css" rel="stylesheet" type="text/css"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/alertify.min.css"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/default.min.css"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/css/themes/bootstrap.min.css"/>
<link rel="stylesheet" href="css/lightbox.min.css"/>
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0, shrink-to-fit=no" name="viewport">
</head>
<body>
<div class="container-fluid" id="kara">
<div id="kara-banner" class="bg-dark text-light">
<img src="/img/logo/luna/icon.ico" class="header-logo" alt="logo-header"/>
<div class="float-right">
<div class="btn btn-sm btn-secondary" data-toggle="modal" data-target="#settingsModal">
<i class="fas fa-sliders-h"></i>
</div>
<div class="btn btn-sm btn-secondary" data-toggle="modal" data-target="#helpModal">
<i class="fas fa-question-circle"></i>
</div>
<div class="btn btn-sm btn-secondary" data-toggle="modal" data-target="#todoModal" v-if="todos.length > 0">
<i class="fas fa-clipboard"></i>
</div>
<div class="btn btn-sm btn-secondary" @click="scrollDown()">
<i class="fas fa-chevron-down"></i>
</div>
</div>
{{ this.name }}
</div>
<div id="chat-box">
<template v-for="message in messages">
<div :class="'message' + (message.bot === true ? ' bot-message float-left' : ' user-message float-right') + (message.command ? ' command-message' : '') + (message.me ? ' me-message' : '')" v-if="message.body">
<template v-if="message.src">
<a :href="message.src" data-lightbox="message-images" :data-title="message.body.length < 500 ? message.body : ''">
<img :src="message.src" :alt="message.body" class="message-image"/><br/>
</a>
</template>
<div v-html="message.body.replace(/(?:\r\n|\r|\n)/g, '<br>')" class="message-container"></div>
</div>
</template>
<div class="message bot-message typing float-left" v-if="isTyping">
<div class="spinner-grow text-secondary" role="status">
<span class="sr-only">
Loading...
</span>
</div>
<div class="spinner-grow text-secondary" role="status">
<span class="sr-only">
Loading...
</span>
</div>
<div class="spinner-grow text-secondary" role="status">
<span class="sr-only">
Loading...
</span>
</div>
</div>
</div>
<div id="chatbox-wrapper" class="bg-dark">
<input class="form-control"
id="chatinput"
type="text"
v-model="chatbox"
v-on:keyup.enter="sendMessage()"
v-on:keyup.38="chatbox = lastMessage"
v-on:keyup.40="chatbox = ''"
required autofocus>
</div>
<div class="modal fade" id="todoModal" tabindex="-1" role="dialog" aria-labelledby="todoModal" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Todos</h5>
<div class="float-right">
<button class="btn btn-sm btn-secondary" @click="clearTodos">
<i class="fas fa-trash"></i>
</button>
</div>
</div>
<div class="modal-body" style="max-height: 800px; overflow-y: scroll">
<ul class="list-group">
<li class="list-group-item" v-for="todo in todos" v-if="!todo.checked">
<i class="far fa-circle" @click="todo.checked = !todo.checked"></i> {{ todo.body }}
</li>
</ul>
<hr/>
<ul class="list-group">
<li class="list-group-item" v-for="todo in todos" v-if="todo.checked">
<i class="fas fa-check-circle" @click="todo.checked = !todo.checked"></i> <span style="text-decoration: line-through;">{{ todo.body }}</span>
</li>
</ul>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="settingsModal" tabindex="-1" role="dialog" aria-labelledby="settingsModal" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Settings</h5>
</div>
<div class="modal-body">
<div class="form-group" v-if="features.changeName">
<label for="name">What's my name?</label>
<input type="text" class="form-control" id="name" v-model="settingsModal.name">
</div>
<div class="form-group" v-if="username !== null">
<label for="username">What's your name?</label>
<input type="text" class="form-control" id="username" v-model="settingsModal.username">
</div>
<div class="form-group">
<label for="location">What city do you live in? <small class="text-muted">(for weather-reports only)</small> </label>
<input type="text" class="form-control" id="location" v-model="settingsModal.location">
</div>
<div class="form-group" v-if="features.themes">
<label for="theme">Pick a theme</label>
<select name="theme" class="form-control" id="theme" v-model="activeTheme" @change="updateStorage()">
<option v-for="theme in themes" :value="theme.name.toLowerCase()" v-text="theme.name"></option>
</select>
</div>
<div class="form-group">
<label>Data</label>
<div class="row">
<div class="col-sm-6">
<button @click="clearChat()" class="btn btn-warning form-button" data-dismiss="modal">
Delete chat
</button>
</div>
<div class="col-sm-6">
<button @click="clearStorage()" class="btn btn-warning form-button">
Delete everything
</button>
</div>
</div>
</div>
<div class="form-group">
<div class="float-right">
<i class="fa fa-code" aria-hidden="true"></i> App by <a href="/" target="_blank">Luna Development</a>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" data-dismiss="modal" @click="saveSettings()">Save</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="helpModal" tabindex="-1" role="dialog" aria-labelledby="helpModal" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Documentation</h5>
</div>
<div class="modal-body" v-html="documentation">
</div>
<div class="modal-footer justify-content-between">
<div>
<i class="fa fa-code"></i> App by <a href="/" target="_blank">Luna Development</a> |
<i aria-hidden="true" class="fas fa-balance-scale"></i> <a href="/impressum" target="_blank">Imprint</a>
</div>
<div class="float-right">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
<link rel="stylesheet" :href="'https://maxcdn.bootstrapcdn.com/bootswatch/4.3.1/' + activeTheme + '/bootstrap.min.css'">
<link href="app.css" rel="stylesheet" type="text/css"/>
</div>
<script src="https://kit.fontawesome.com/b54a4cceff.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js" crossorigin="anonymous"></script>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.6/umd/popper.min.js" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/js/bootstrap.min.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://code.jquery.com/jquery-3.5.1.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="js/lightbox.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/alertifyjs@1.13.1/build/alertify.min.js"></script>
<script src="app.js"></script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-80940725-2"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-80940725-2');
</script>
</body>
</html>

15
js/lightbox.min.js vendored

File diff suppressed because one or more lines are too long

16
manifest/kara.json

@ -1,16 +0,0 @@
{
"short_name": "Kara",
"name": "Kara",
"icons": [
{
"src": "/img/logo/luna/256.png",
"type": "image/png",
"sizes": "256x256"
}
],
"start_url": "/kara/",
"background_color": "#383838",
"display": "standalone",
"scope": "/kara/",
"theme_color": "#383838"
}
Loading…
Cancel
Save