├── .prettierrc.json
├── images
├── greg.png
├── image-1.png
├── image-2.png
├── image-3.png
├── image-4.png
├── mockup.png
├── paypal.png
├── bitcoin_rcv.png
├── greg_mockup.xcf
├── kaios-marketing-banner.png
└── helper.svg
├── .prettierrc
├── docs
├── assets
│ ├── icons
│ │ ├── intro.png
│ │ ├── icon-56-56.png
│ │ ├── icon-112-112.png
│ │ └── intro.svg
│ ├── image
│ │ ├── caldav.png
│ │ ├── waiting.png
│ │ ├── google_button.png
│ │ ├── 1F503.svg
│ │ ├── E252.svg
│ │ ├── 2B07.svg
│ │ ├── bell.svg
│ │ ├── picture.svg
│ │ ├── E261.svg
│ │ ├── E262.svg
│ │ ├── E264.svg
│ │ ├── E257.svg
│ │ ├── option.svg
│ │ ├── add.svg
│ │ ├── E25C.svg
│ │ ├── calendar.svg
│ │ ├── pencil.svg
│ │ ├── delete-red.svg
│ │ ├── delete.svg
│ │ ├── list.svg
│ │ ├── person.svg
│ │ └── E1D8.svg
│ └── fonts
│ │ └── Roboto-Medium.ttf
├── Roboto-Medium.44d94bd3.ttf
├── E264.fecca750.svg
├── sitemap.xml
├── index.3b283937.css
├── index.html
├── manifest.webmanifest
├── manifest.webapp
├── index.5671dcd7.css
├── about.html
└── datenschutz.html
├── application
├── assets
│ ├── icons
│ │ ├── intro.png
│ │ ├── icon-56-56.png
│ │ ├── icon-112-112.png
│ │ └── intro.svg
│ ├── image
│ │ ├── caldav.png
│ │ ├── waiting.png
│ │ ├── google_button.png
│ │ ├── 1F503.svg
│ │ ├── E252.svg
│ │ ├── 2B07.svg
│ │ ├── bell.svg
│ │ ├── picture.svg
│ │ ├── E261.svg
│ │ ├── E262.svg
│ │ ├── E264.svg
│ │ ├── E257.svg
│ │ ├── option.svg
│ │ ├── add.svg
│ │ ├── E25C.svg
│ │ ├── calendar.svg
│ │ ├── pencil.svg
│ │ ├── delete-red.svg
│ │ ├── delete.svg
│ │ ├── list.svg
│ │ ├── person.svg
│ │ └── E1D8.svg
│ ├── fonts
│ │ └── Roboto-Medium.ttf
│ ├── js
│ │ ├── ads.js
│ │ ├── eximport.js
│ │ ├── scan.js
│ │ ├── shim-xhr-to-fetch.js
│ │ └── kaiads.v5.min.js
│ └── css
│ │ ├── qr-reader.css
│ │ └── grid.css
├── sitemap.xml
├── index.html
├── manifest.webmanifest
├── manifest.webapp
├── about.html
└── datenschutz.html
├── .gitignore
├── webpage-uploader.sh
├── .babelrc
├── LICENSE.md
├── README.md
└── package.json
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "ignore": ["**/@ts-ignore"]
3 | }
4 |
--------------------------------------------------------------------------------
/images/greg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/greg.png
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "ignore": ["**/@ts-ignore"],
3 | "singleQuote": true
4 | }
5 |
--------------------------------------------------------------------------------
/images/image-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-1.png
--------------------------------------------------------------------------------
/images/image-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-2.png
--------------------------------------------------------------------------------
/images/image-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-3.png
--------------------------------------------------------------------------------
/images/image-4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/image-4.png
--------------------------------------------------------------------------------
/images/mockup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/mockup.png
--------------------------------------------------------------------------------
/images/paypal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/paypal.png
--------------------------------------------------------------------------------
/images/bitcoin_rcv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/bitcoin_rcv.png
--------------------------------------------------------------------------------
/images/greg_mockup.xcf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/greg_mockup.xcf
--------------------------------------------------------------------------------
/docs/assets/icons/intro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/icons/intro.png
--------------------------------------------------------------------------------
/docs/assets/image/caldav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/image/caldav.png
--------------------------------------------------------------------------------
/docs/assets/image/waiting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/image/waiting.png
--------------------------------------------------------------------------------
/docs/Roboto-Medium.44d94bd3.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/Roboto-Medium.44d94bd3.ttf
--------------------------------------------------------------------------------
/docs/assets/icons/icon-56-56.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/icons/icon-56-56.png
--------------------------------------------------------------------------------
/images/kaios-marketing-banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/images/kaios-marketing-banner.png
--------------------------------------------------------------------------------
/application/assets/icons/intro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/icons/intro.png
--------------------------------------------------------------------------------
/application/assets/image/caldav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/image/caldav.png
--------------------------------------------------------------------------------
/docs/assets/fonts/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/fonts/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/docs/assets/icons/icon-112-112.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/icons/icon-112-112.png
--------------------------------------------------------------------------------
/docs/assets/image/google_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/docs/assets/image/google_button.png
--------------------------------------------------------------------------------
/application/assets/image/waiting.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/image/waiting.png
--------------------------------------------------------------------------------
/application/assets/icons/icon-56-56.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/icons/icon-56-56.png
--------------------------------------------------------------------------------
/application/assets/fonts/Roboto-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/fonts/Roboto-Medium.ttf
--------------------------------------------------------------------------------
/application/assets/icons/icon-112-112.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/icons/icon-112-112.png
--------------------------------------------------------------------------------
/application/assets/image/google_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/strukturart/greg/HEAD/application/assets/image/google_button.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | node_modules/*
3 | .parcel-cache
4 | build/*
5 | dist/*
6 | dist
7 | build
8 | .cache
9 | application/assets/js/google_cred.js
10 | application/google_cred.js
11 | .env
12 |
13 |
--------------------------------------------------------------------------------
/webpage-uploader.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | npm run web << EOF
4 | ssh perry7@biela.uberspace.de << 'EOF'
5 | cd /var/www/virtual/perry7/greg.strukturart.com/
6 | rm -rf *
7 |
8 |
9 | EOF
10 | if [ -d "docs" ]; then
11 | cd docs/
12 | rsync -avz . perry7@biela.uberspace.de:/var/www/virtual/perry7/greg.strukturart.com/
13 | fi
14 |
15 |
16 |
--------------------------------------------------------------------------------
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "exclude": ["node_modules/@babel/**"],
3 | "presets": [],
4 | "plugins": [
5 | "@babel/plugin-transform-named-capturing-groups-regex",
6 | "@babel/plugin-syntax-dynamic-import",
7 | [
8 | "@babel/plugin-transform-runtime",
9 | {
10 | "regenerator": false,
11 | "useESModules": true
12 | }
13 | ]
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/docs/E264.fecca750.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/docs/assets/image/1F503.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/application/assets/image/1F503.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/docs/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | https://greg.strukturart.com/index
6 | 2024-10-17
7 | 1.00
8 | weekly
9 |
10 |
11 |
12 | https://greg.strukturart.com/about
13 | 2024-10-17
14 | 0.80
15 | monthly
16 |
17 |
18 |
19 | https://greg.strukturart.com/datenschutz
20 | 2024-10-17
21 | 0.85
22 | monthly
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/application/sitemap.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | https://greg.strukturart.com/index
6 | 2024-10-17
7 | 1.00
8 | weekly
9 |
10 |
11 |
12 | https://greg.strukturart.com/about
13 | 2024-10-17
14 | 0.80
15 | monthly
16 |
17 |
18 |
19 | https://greg.strukturart.com/datenschutz
20 | 2024-10-17
21 | 0.85
22 | monthly
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/docs/assets/image/E252.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/application/assets/image/E252.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/assets/image/2B07.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/application/assets/image/2B07.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/docs/assets/image/bell.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/application/assets/image/bell.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/application/assets/js/ads.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | export let load_ads = function () {
4 | getKaiAd({
5 | publisher: '4408b6fa-4e1d-438f-af4d-f3be2fa97208',
6 | app: 'greg',
7 | slot: 'greg',
8 | test: 0,
9 | timeout: 10000,
10 | h: 120,
11 | w: 240,
12 | container: document.getElementById('KaiOSAds-Wrapper'),
13 | onerror: (err) => console.error('Error:', err),
14 | onready: (ad) => {
15 | // user clicked the ad
16 | ad.on('click', () => console.log('click event'));
17 |
18 | // user closed the ad (currently only with fullscreen)
19 | ad.on('close', () => console.log('close event'));
20 |
21 | // the ad succesfully displayed
22 | ad.on('display', () => {
23 | console.log('yeah');
24 | });
25 |
26 | // Ad is ready to be displayed
27 | // calling 'display' will display the ad
28 | ad.call('display', {
29 | navClass: 'item',
30 | display: 'block',
31 | });
32 | },
33 | });
34 | };
35 |
--------------------------------------------------------------------------------
/docs/assets/image/picture.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/docs/index.3b283937.css:
--------------------------------------------------------------------------------
1 | div#qr-screen{z-index:200000;z-index:2147483647;min-width:100vw;min-height:100vh;display:none;position:fixed;top:0;left:0}#video{width:auto;min-width:100%;height:auto;min-height:100%;position:fixed;bottom:0;right:0}#startDecoding{color:#fff;text-align:center;background:#0095dd;-moz-border-radius:40px;border-radius:40px;width:150px;margin:-30px 0 0 -95px;padding:20px;font-family:Arial,sans;font-size:20px;position:fixed;top:50%;left:50%}#corner-nw,#corner-no,#corner-so,#corner-sw{border:6px solid #fff;width:30px;height:30px;position:fixed}#corner-nw{border-bottom:0;border-right:0;-moz-border-top-left-radius:20px;border-top-left-radius:20px;top:20px;left:20px}#corner-no{border-bottom:0;border-left:0;-moz-border-top-right-radius:20px;border-top-right-radius:20px;top:20px;right:20px}#corner-so{border-top:0;border-left:0;-moz-border-bottom-right-radius:20px;border-bottom-right-radius:20px;bottom:20px;right:20px}#corner-sw{border-top:0;border-right:0;-moz-border-bottom-left-radius:20px;border-bottom-left-radius:20px;bottom:20px;left:20px}
--------------------------------------------------------------------------------
/application/assets/image/picture.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2019
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/application/assets/js/eximport.js:
--------------------------------------------------------------------------------
1 | export let export_ical = function (filename, data, callback) {
2 | let file = new Blob([data.trim()], { type: 'text/calendar' });
3 |
4 | function writeFile(sdcard) {
5 | let del = sdcard.delete(filename);
6 | del.onsuccess = function () {
7 | let add = sdcard.addNamed(file, filename);
8 | add.onsuccess = () => callback('backup written');
9 | add.onerror = () => callback('Unable to write the file');
10 | };
11 | del.onerror = function () {
12 | // Falls Datei nicht existiert → trotzdem schreiben
13 | let add = sdcard.addNamed(file, filename);
14 | add.onsuccess = () => callback('backup written');
15 | add.onerror = () => callback('Unable to write the file');
16 | };
17 | }
18 |
19 | try {
20 | if ('b2g' in navigator) {
21 | // KaiOS 3.x
22 | let sdcard = navigator.b2g.getDeviceStorage('sdcard');
23 | writeFile(sdcard);
24 | } else {
25 | // KaiOS 2.x
26 | let sdcard = navigator.getDeviceStorage('sdcard');
27 | writeFile(sdcard);
28 | }
29 | } catch (e) {
30 | console.log('DeviceStorage error:', e);
31 | callback('Storage access failed');
32 | }
33 | };
34 |
--------------------------------------------------------------------------------
/docs/index.html:
--------------------------------------------------------------------------------
1 |
greg
--------------------------------------------------------------------------------
/application/assets/css/qr-reader.css:
--------------------------------------------------------------------------------
1 | div#qr-screen {
2 | top: 0;
3 | left: 0;
4 | position: fixed;
5 | z-index: 200000;
6 | display: block;
7 | min-height: 100vh;
8 | min-width: 100vw;
9 | z-index: 2000000000000;
10 | display: none;
11 | }
12 |
13 | #video {
14 | bottom: 0;
15 | height: auto;
16 | min-height: 100%;
17 | min-width: 100%;
18 | position: fixed;
19 | right: 0;
20 | width: auto;
21 | }
22 |
23 | #startDecoding {
24 | background: #0095dd;
25 | border-radius: 40px;
26 | color: #fff;
27 | font-family: Arial, sans;
28 | font-size: 20px;
29 | left: 50%;
30 | margin: -30px 0 0 -95px;
31 | padding: 20px;
32 | position: fixed;
33 | text-align: center;
34 | top: 50%;
35 | width: 150px;
36 | }
37 |
38 | #corner-nw,
39 | #corner-no,
40 | #corner-so,
41 | #corner-sw {
42 | border: #fff 6px solid;
43 | height: 30px;
44 | position: fixed;
45 | width: 30px;
46 | }
47 |
48 | #corner-nw {
49 | border-bottom: 0;
50 | border-right: 0;
51 | border-top-left-radius: 20px;
52 | left: 20px;
53 | top: 20px;
54 | }
55 |
56 | #corner-no {
57 | border-bottom: 0;
58 | border-left: 0;
59 | border-top-right-radius: 20px;
60 | right: 20px;
61 | top: 20px;
62 | }
63 |
64 | #corner-so {
65 | border-bottom-right-radius: 20px;
66 | border-left: 0;
67 | border-top: 0;
68 | bottom: 20px;
69 | right: 20px;
70 | }
71 |
72 | #corner-sw {
73 | border-bottom-left-radius: 20px;
74 | border-right: 0;
75 | border-top: 0;
76 | bottom: 20px;
77 | left: 20px;
78 | }
79 |
--------------------------------------------------------------------------------
/docs/assets/image/E261.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/application/assets/image/E261.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/docs/assets/image/E262.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/application/assets/image/E262.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/docs/assets/image/E264.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
34 |
38 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/application/assets/image/E264.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
34 |
38 |
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/docs/assets/image/E257.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
16 |
38 |
41 |
48 |
49 |
52 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/application/assets/image/E257.svg:
--------------------------------------------------------------------------------
1 |
2 |
14 |
16 |
38 |
41 |
48 |
49 |
52 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/application/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | greg
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
23 |
24 |
31 |
32 |
37 |
38 |
39 |
45 |
46 |
47 |
48 |
49 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
Start Scanning
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
--------------------------------------------------------------------------------
/application/assets/js/scan.js:
--------------------------------------------------------------------------------
1 | import jsQR from "jsqr";
2 |
3 | let video = document.querySelector("video");
4 | let intv;
5 | let mediaStream;
6 |
7 | export let stop_scan = function (callback) {
8 | mediaStream.getTracks().map(function (val) {
9 | val.stop();
10 | });
11 |
12 | document.getElementById("qr-screen").style.display = "none";
13 |
14 | callback();
15 | };
16 |
17 | export let start_scan = function (callback) {
18 | document.getElementById("qr-screen").style.display = "block";
19 |
20 | navigator.getUserMedia =
21 | navigator.getUserMedia ||
22 | navigator.webkitGetUserMedia ||
23 | navigator.mozGetUserMedia;
24 |
25 | if (navigator.getUserMedia) {
26 | navigator.getUserMedia(
27 | {
28 | audio: false,
29 | video: {
30 | width: 200,
31 | height: 200,
32 | },
33 | },
34 | function (stream) {
35 | video.srcObject = stream;
36 | console.log(stream);
37 | mediaStream = stream;
38 |
39 | video.onloadedmetadata = function (e) {
40 | video.play();
41 |
42 | var barcodeCanvas = document.createElement("canvas");
43 | intv = setInterval(() => {
44 | barcodeCanvas.width = video.videoWidth;
45 | barcodeCanvas.height = video.videoHeight;
46 | var barcodeContext = barcodeCanvas.getContext("2d");
47 | var imageWidth = Math.max(1, Math.floor(video.videoWidth)),
48 | imageHeight = Math.max(1, Math.floor(video.videoHeight));
49 |
50 | barcodeContext.drawImage(video, 0, 0, imageWidth, imageHeight);
51 |
52 | var imageData = barcodeContext.getImageData(
53 | 0,
54 | 0,
55 | imageWidth,
56 | imageHeight,
57 | );
58 | var idd = imageData.data;
59 |
60 | let code = jsQR(idd, imageWidth, imageHeight);
61 |
62 | if (code) {
63 | clearInterval(intv);
64 | callback(code.data);
65 | stop_scan();
66 | }
67 | }, 1000);
68 | };
69 | },
70 | function (err) {
71 | console.log("The following error occurred: " + err.name);
72 | },
73 | );
74 | } else {
75 | console.log("getUserMedia not supported");
76 | }
77 | };
78 |
--------------------------------------------------------------------------------
/docs/assets/image/option.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 |
61 |
67 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/application/assets/image/option.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 |
61 |
67 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/docs/assets/image/add.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 | +
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/application/assets/image/add.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 | +
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/docs/manifest.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Greg",
3 | "id": "greg",
4 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.",
5 | "lang": "en-US",
6 | "start_url": "/index.html",
7 | "short_name": "Greg",
8 | "categories": ["utilities"],
9 | "theme_color": "#ffffff",
10 | "orientation": "natural",
11 | "userAgentInfo": "greg written by strukturart@gmail.com",
12 |
13 | "icons": [
14 | {
15 | "src": "/assets/icons/icon-56-56.png",
16 | "type": "image/png",
17 | "sizes": "56x56"
18 | },
19 | {
20 | "src": "/assets/icons/icon-112-112.png",
21 | "type": "image/png",
22 | "sizes": "112x112"
23 | }
24 | ],
25 |
26 | "b2g_features": {
27 | "version": "3.0.773",
28 | "id": "greg",
29 | "subtitle": "easy to use calendar",
30 | "core": true,
31 | "type": "privileged",
32 | "display": "fullscreen",
33 |
34 | "developer": {
35 | "name": "strukturart",
36 | "url": "https://github.com/strukturart/greg"
37 | },
38 |
39 | "dependencies": {
40 | "ads-sdk": "1.5.8"
41 | },
42 | "messages": [{ "serviceworker-notification": "index.html" }, "alarm"],
43 |
44 | "activities": {
45 | "greg-oauth": {}
46 | },
47 |
48 | "serviceworker": {
49 | "script_url": "sw.js"
50 | },
51 |
52 | "permissions": {
53 | "desktop-notification": {
54 | "description": "Needed to fire system notifications"
55 | },
56 | "alarms": {
57 | "description": "Required to schedule alarms"
58 | },
59 | "feature-detection": {
60 | "description": "query which keys are available"
61 | },
62 | "mobiledata": {},
63 | "wifidata": {},
64 | "calllog": {},
65 |
66 | "audio-channel-content": {
67 | "description": "Allow background audio playback."
68 | },
69 | "volumemanager": { "description": "" },
70 | "device-storage:sdcard": {
71 | "description": "Read/Write from/to sd-card",
72 | "access": "readwrite"
73 | },
74 | "spatialnavigation-app-manage": {
75 | "navigator.spatialNavigationEnabled": false
76 | },
77 | "systemXHR": {
78 | "description": "Required to load remote content"
79 | }
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Greg
4 |
5 | An easy to use calendar for KaiOs
6 |
7 | 
8 |
9 | ## How to use
10 |
11 | - Key 1 & 3 : Jump between the months
12 | - Key \* : Jump to current Day
13 | - Key Enter: toggle views
14 | - Key 2: event slider in month view
15 | - Key SoftLeft: Add event
16 | - Key SoftLeft Longpress: Add Event with template
17 | - Key 5: shortAction edit/delete
18 | - 0 Single category view
19 |
20 | ### Nextcloud account
21 |
22 | if you want to use an external calendar, you have to enter the correct server address.
23 | at nextcloud as follows:
24 |
25 | - server: "https://xxxxx/remote.php/dav",
26 | - username: "xxxxm",
27 | - password: "xxxxx",
28 |
29 | ## Features
30 |
31 | - Local Calendar
32 | - Nextcloud calendar
33 | - Google Calendar
34 | - subscribe to calendar
35 |
36 | I tested subscribing to calendar with google calendar. you have the possibility to subscribe to public calendars and private calendars, in the google calendar settings you will find an ID that you can enter in greg (by hand or qr code).
37 |
38 | ## How to install
39 |
40 | - KaiOS Store
41 | - Sideloading step-by-step article by martinkaptein
42 |
43 | You can download the latest version from the Releases page.
44 | The app is not auto-updating. To update it, you have to follow the same steps you took when installing it.
45 |
46 | ### LICENSES
47 |
48 | This software (except KaiAds) is open source and licensed under the MIT License. View the source code.
49 |
50 | - tsdav https://github.com/natelindev/tsdav MIT License
51 | - mithril https://github.com/MithrilJS MIT License
52 |
53 | ### Privacy Policy
54 |
55 | This software uses KaiAds. This is a third party service that may collect information used to identify you. Pricacy policy of KaiAds.
56 | If you connect a Google account to greg, it is possible that Google collects information about you, or identifies you.
57 |
58 | ### Dev
59 |
60 | If you want to create your own version of the app you need to use your own google oaut cred. you have to create a file with this content
61 | .env
62 |
63 | ```
64 | clientId=
65 | clientSecret=
66 | token_url=
67 | redirect_url=
68 | ```
69 |
70 | ## Donation
71 |
72 | If you use the app often, please donate an amount to me.
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/application/manifest.webmanifest:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Greg",
3 | "id": "greg",
4 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.",
5 | "lang": "en-US",
6 | "start_url": "/index.html",
7 | "short_name": "Greg",
8 | "categories": ["utilities"],
9 | "theme_color": "#ffffff",
10 | "orientation": "natural",
11 | "userAgentInfo": "greg written by strukturart@gmail.com",
12 |
13 | "icons": [
14 | {
15 | "src": "/assets/icons/icon-56-56.png",
16 | "type": "image/png",
17 | "sizes": "56x56"
18 | },
19 | {
20 | "src": "/assets/icons/icon-112-112.png",
21 | "type": "image/png",
22 | "sizes": "112x112"
23 | }
24 | ],
25 |
26 | "b2g_features": {
27 | "version": "3.0.776",
28 | "id": "greg",
29 | "subtitle": "easy to use calendar",
30 | "core": true,
31 | "type": "privileged",
32 | "display": "fullscreen",
33 |
34 | "developer": {
35 | "name": "strukturart",
36 | "url": "https://github.com/strukturart/greg"
37 | },
38 |
39 | "dependencies": {
40 | "ads-sdk": "1.5.8"
41 | },
42 | "messages": [{ "serviceworker-notification": "index.html" }, "alarm"],
43 |
44 | "activities": {
45 | "greg-oauth": {}
46 | },
47 |
48 | "serviceworker": {
49 | "script_url": "sw.js"
50 | },
51 |
52 | "permissions": {
53 | "desktop-notification": {
54 | "description": "Needed to fire system notifications"
55 | },
56 | "alarms": {
57 | "description": "Required to schedule alarms"
58 | },
59 | "feature-detection": {
60 | "description": "query which keys are available"
61 | },
62 | "mobiledata": {},
63 | "wifidata": {},
64 | "calllog": {},
65 |
66 | "audio-channel-content": {
67 | "description": "Allow background audio playback."
68 | },
69 | "volumemanager": { "description": "" },
70 | "device-storage:sdcard": {
71 | "description": "Read/Write from/to sd-card",
72 | "access": "readwrite"
73 | },
74 | "spatialnavigation-app-manage": {
75 | "navigator.spatialNavigationEnabled": false
76 | },
77 | "systemXHR": {
78 | "description": "Required to load remote content"
79 | }
80 | }
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/docs/manifest.webapp:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.2.6342",
3 | "name": "greg",
4 | "id": "greg",
5 | "categories": ["utilities"],
6 | "subtitle": "easy to use calendar",
7 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.",
8 | "launch_path": "/index.html",
9 | "type": "privileged",
10 | "fullscreen": "true",
11 | "priority": "high",
12 | "userAgentInfo": "greg written by strukturart@gmail.com",
13 | "icons": {
14 | "56": "/assets/icons/icon-56-56.png",
15 | "112": "/assets/icons/icon-112-112.png"
16 | },
17 | "developer": {
18 | "name": "strukturart",
19 | "url": "https://github.com/strukturart/greg"
20 | },
21 | "dependencies": {
22 | "ads-sdk": "1.5.8"
23 | },
24 |
25 | "locales": {
26 | "en-US": {
27 | "name": "greg",
28 | "subtitle": "greg",
29 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease."
30 | }
31 | },
32 | "default_locale": "en-US",
33 |
34 | "deeplinks": {
35 | "regex": "^https?://.*\\.ics$",
36 | "action": "view"
37 | },
38 |
39 |
40 | "activities": {
41 | "greg-oauth": {
42 | "href": "/index.html"
43 | }
44 | },
45 |
46 |
47 |
48 | "messages": [
49 | {
50 | "alarm": "/index.html"
51 | },
52 |
53 | {
54 | "notification": "/index.html"
55 | },
56 | { "serviceworker-notification": "/index.html" }
57 | ],
58 |
59 | "redirects": [
60 | {
61 | "from": "https://greg.strukturart.com/index.html",
62 | "to": "/index.html"
63 | }
64 | ],
65 |
66 | "serviceworker": {
67 | "script_url": "sw.js"
68 | },
69 |
70 | "permissions": {
71 | "serviceworker": {
72 | "description": "Needed for assocating service worker"
73 | },
74 | "desktop-notification": {
75 | "description": "Needed to fire system notifications"
76 | },
77 |
78 | "mobiledata": {},
79 | "wifidata": {},
80 | "calllog": {},
81 | "device-storage:sdcard": {
82 | "description": "Read/Write from/to sd-card",
83 | "access": "readwrite"
84 | },
85 | "video-capture": {
86 | "description": "Reading Codes using the Camera"
87 | },
88 |
89 | "spatialnavigation-app-manage": {
90 | "navigator.spatialNavigationEnabled": false
91 | },
92 | "systemXHR": {
93 | "description": "Required to load remote content"
94 | },
95 | "alarms": {
96 | "description": "Required to schedule alarms"
97 | }
98 | }
99 | }
100 |
--------------------------------------------------------------------------------
/application/manifest.webapp:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.2.6344",
3 | "name": "greg",
4 | "id": "greg",
5 | "categories": ["utilities"],
6 | "subtitle": "easy to use calendar",
7 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease.",
8 | "launch_path": "/index.html",
9 | "type": "privileged",
10 | "fullscreen": "true",
11 | "priority": "high",
12 | "userAgentInfo": "greg written by strukturart@gmail.com",
13 | "icons": {
14 | "56": "/assets/icons/icon-56-56.png",
15 | "112": "/assets/icons/icon-112-112.png"
16 | },
17 | "developer": {
18 | "name": "strukturart",
19 | "url": "https://github.com/strukturart/greg"
20 | },
21 | "dependencies": {
22 | "ads-sdk": "1.5.8"
23 | },
24 |
25 | "locales": {
26 | "en-US": {
27 | "name": "greg",
28 | "subtitle": "greg",
29 | "description": "Effortlessly manage your schedule with GREG for KaiOS. Save events locally or sync external calendars, including Nextcloud/Google via CalDAV. Navigate months, slide through events, and quickly jump to today with intuitive controls. Plus, enjoy a moon phase calendar with a press of a button (#). Stay organized with ease."
30 | }
31 | },
32 | "default_locale": "en-US",
33 |
34 | "deeplinks": {
35 | "regex": "^https?://.*\\.ics$",
36 | "action": "view"
37 | },
38 |
39 |
40 | "activities": {
41 | "greg-oauth": {
42 | "href": "/index.html"
43 | }
44 | },
45 |
46 |
47 |
48 | "messages": [
49 | {
50 | "alarm": "/index.html"
51 | },
52 |
53 | {
54 | "notification": "/index.html"
55 | },
56 | { "serviceworker-notification": "/index.html" }
57 | ],
58 |
59 | "redirects": [
60 | {
61 | "from": "https://greg.strukturart.com/index.html",
62 | "to": "/index.html"
63 | }
64 | ],
65 |
66 | "serviceworker": {
67 | "script_url": "sw.js"
68 | },
69 |
70 | "permissions": {
71 | "serviceworker": {
72 | "description": "Needed for assocating service worker"
73 | },
74 | "desktop-notification": {
75 | "description": "Needed to fire system notifications"
76 | },
77 |
78 | "mobiledata": {},
79 | "wifidata": {},
80 | "calllog": {},
81 | "device-storage:sdcard": {
82 | "description": "Read/Write from/to sd-card",
83 | "access": "readwrite"
84 | },
85 | "video-capture": {
86 | "description": "Reading Codes using the Camera"
87 | },
88 |
89 | "spatialnavigation-app-manage": {
90 | "navigator.spatialNavigationEnabled": false
91 | },
92 | "systemXHR": {
93 | "description": "Required to load remote content"
94 | },
95 | "alarms": {
96 | "description": "Required to schedule alarms"
97 | }
98 | }
99 | }
100 |
--------------------------------------------------------------------------------
/docs/assets/image/E25C.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
39 |
42 |
54 |
66 |
78 |
87 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/application/assets/image/E25C.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
39 |
42 |
54 |
66 |
78 |
87 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "greg",
3 | "version": "2.0.0",
4 | "description": " ",
5 | "source": "application/index.html",
6 | "browserslist": "Firefox <= 48",
7 | "scripts": {
8 | "oa": "parcel application/oauth.js --no-source-maps --no-optimize /dist",
9 | "start": "rm -rf dist/* && parcel --no-source-maps application/index.html && cp application/manifest.webapp dist && cp -r application/assets/icons dist",
10 | "build": "rm -rf dist/* && parcel build --no-source-maps --no-optimize --public-url ./ application/index.html && cp application/manifest.webapp dist && mkdir dist/assets && cp -r application/assets/icons dist/assets/",
11 | "web": "rm -rf docs/* && parcel build --dist-dir docs --public-url ./ --no-source-maps --no-content-hash application/index.html && cp application/manifest.webapp docs && cp application/manifest.webmanifest docs && mkdir -p docs/assets && cp -r application/assets/icons docs/assets/ && mkdir -p docs/assets/js/ && cp application/assets/js/kaiads.v5.min.js docs/assets/js/ && cp -r application/assets/fonts docs/assets/ && cp -r application/assets/image docs/assets/ && cp application/about.html docs/ && cp application/datenschutz.html docs/&& cp application/sitemap.xml docs/"
12 | },
13 | "repository": {
14 | "type": "git",
15 | "url": "git+https://github.com/strukturart/greg.git"
16 | },
17 | "keywords": [
18 | "KaiOs",
19 | "Calendar"
20 | ],
21 | "author": "strukturart",
22 | "license": "MPL-2.0",
23 | "bugs": {
24 | "url": "https://github.com/strukturart/greg/issues"
25 | },
26 | "homepage": "https://github.com/strukturart/greg#readme",
27 | "devDependencies": {
28 | "@babel/cli": "^7.18.10",
29 | "@babel/core": "^7.19.1",
30 | "@babel/plugin-syntax-dynamic-import": "^7.8.3",
31 | "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12",
32 | "@babel/plugin-transform-runtime": "^7.18.5",
33 | "@babel/preset-env": "^7.19.1",
34 | "@parcel/transformer-html": "^2.6.2",
35 | "assert": "^2.0.0",
36 | "babel-plugin-transform-async-to-promises": "^0.8.18",
37 | "browserify-zlib": "^0.2.0",
38 | "buffer": "^6.0.3",
39 | "core-js": "^3.22.5",
40 | "crypto-browserify": "^3.12.0",
41 | "cssnano": "^5.0.17",
42 | "events": "^3.3.0",
43 | "https-browserify": "^1.0.0",
44 | "os-browserify": "^0.3.0",
45 | "parcel-plugin-static-files-copy": "^1.2.4",
46 | "path-browserify": "^1.0.1",
47 | "postcss": "^8.4.6",
48 | "querystring-es3": "^0.2.1",
49 | "stream-browserify": "^3.0.0",
50 | "stream-http": "^3.2.0",
51 | "timers-browserify": "^2.0.12",
52 | "url": "^0.11.0"
53 | },
54 | "dependencies": {
55 | "@babel/runtime": "^7.27.1",
56 | "@parcel/service-worker": "^2.8.0",
57 | "as": "^0.4.1",
58 | "assets": "^3.0.1",
59 | "dayjs": "^1.11.6",
60 | "dayjs-plugin-utc": "^0.1.2",
61 | "dotenv": "^16.4.5",
62 | "fast-sort": "^3.2.1",
63 | "ical.js": "^1.5.0",
64 | "jsqr": "^1.4.0",
65 | "loadsh": "^0.0.4",
66 | "localforage": "^1.10.0",
67 | "mithril": "^3.0.0-next.3",
68 | "moment": "^2.29.4",
69 | "moment-timezone": "^0.5.34",
70 | "uid": "^2.0.0",
71 | "url-search-params-polyfill": "^8.1.1"
72 | }
73 | }
74 |
--------------------------------------------------------------------------------
/docs/assets/image/calendar.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 |
58 |
61 |
70 |
79 |
80 |
83 |
92 |
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/application/assets/image/calendar.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 |
58 |
61 |
70 |
79 |
80 |
83 |
92 |
101 |
102 |
103 |
104 |
105 |
106 |
--------------------------------------------------------------------------------
/docs/assets/image/pencil.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
17 |
21 |
22 |
25 |
29 |
30 |
31 |
49 |
56 |
59 |
68 |
77 |
89 |
98 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/application/assets/image/pencil.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
17 |
21 |
22 |
25 |
29 |
30 |
31 |
49 |
56 |
59 |
68 |
77 |
89 |
98 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/application/assets/js/shim-xhr-to-fetch.js:
--------------------------------------------------------------------------------
1 | class Dispatch extends EventTarget {
2 | dispatch(eventName) {
3 | const ev = new Event(eventName);
4 | if ('on' + eventName in this) {
5 | this['on' + eventName](ev);
6 | }
7 | this.dispatchEvent(ev);
8 | }
9 | }
10 | export class XMLHttpRequest extends Dispatch {
11 | // readyState enumeration
12 | UNSENT = 0;
13 | OPENED = 1;
14 | HEADERS_RECEIVED = 2;
15 | LOADING = 3;
16 | DONE = 4;
17 |
18 | constructor() {
19 | super();
20 | this.upload = new Dispatch();
21 | }
22 |
23 | open(method, url) {
24 | this.url = url;
25 | this.method = method;
26 | this.headers = new Headers();
27 | this.readyState = this.UNSENT;
28 | this.responseType = '';
29 | this._controller = new AbortController();
30 | }
31 | setRequestHeader(key, value) {
32 | this.headers.set(key, value);
33 | }
34 | abort() {
35 | this.upload.dispatch('abort');
36 | this._controller.abort();
37 | }
38 | send(payload) {
39 | this.readyState = this.OPENED;
40 | this.status = 0;
41 | this.dispatch('readystatechange');
42 | this.upload.dispatch('loadstart');
43 | fetch(this.url, {
44 | method: this.method,
45 | credentials: this.withCredentials,
46 | headers: this.headers,
47 | signal: this._controller.signal,
48 | body: payload,
49 | })
50 | .then(async (response) => {
51 | this.readyState = this.HEADERS_RECEIVED;
52 | this.responseURL = response.url;
53 | this.responseType = response.type;
54 | this.status = response.status;
55 | this.statusText = response.statusText;
56 |
57 | // todo: this is wrong, fetch response.type possible values are - basic, cors, error, opaque, opaqueredirect
58 | switch (this.responseType) {
59 | case '':
60 | return response.text();
61 | case 'arraybuffer':
62 | return response.arrayBuffer();
63 | case 'blob':
64 | return response.blob();
65 | case 'document':
66 | return response.text(); // todo pass through XMLParser
67 | case 'json':
68 | return response.json();
69 | //todo stream and status 3 and progress
70 | }
71 | return response.text();
72 | })
73 | .then(
74 | (value) => {
75 | this.response = value;
76 | this.readyState = this.DONE;
77 | this.dispatch('readystatechange');
78 | this.upload.dispatch('load');
79 | this.dispatch('load');
80 | this.upload.dispatch('progress');
81 | this.dispatch('progress');
82 | this.upload.dispatch('loadend');
83 | this.dispatch('loadend');
84 | },
85 | (err) => {
86 | this.dispatch('error');
87 | this.upload.dispatch('error');
88 | this.readyState = this.DONE;
89 | this.dispatch('readystatechange');
90 | }
91 | );
92 | }
93 | get responseText() {
94 | if (this.response) {
95 | if (this.responseType === 'arraybuffer') {
96 | return String.fromCharCode.apply(null, new Uint16Array(this.response)); // slower than StringEncoder/StringDecoder API, but meh
97 | }
98 | if (this.responseType === 'json') {
99 | return JSON.stringify(this.response);
100 | }
101 | if (this.response === 'blob') {
102 | return ''; //
103 | }
104 | return this.response;
105 | }
106 | }
107 |
108 | // No response headers suport yet!
109 | getAllResponseHeaders() {
110 | return ''; // todo fix headers at HEADERS_RECEIVED
111 | }
112 | }
113 |
--------------------------------------------------------------------------------
/docs/assets/image/delete-red.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
34 |
39 |
48 |
54 |
66 |
67 |
69 |
71 |
73 |
75 |
84 |
93 |
106 |
118 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/application/assets/image/delete-red.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
34 |
39 |
48 |
54 |
66 |
67 |
69 |
71 |
73 |
75 |
84 |
93 |
106 |
118 |
130 |
131 |
132 |
--------------------------------------------------------------------------------
/application/assets/js/kaiads.v5.min.js:
--------------------------------------------------------------------------------
1 | var a0_0x97c4=['http://127.0.0.1:8081/sdk/ads/ads-sdk.min.js','appendChild','test','addEventListener','catch','length','onerror','push','navigator','mozApps','type','hostname','forEach','endsWith','load','https://static.kaiads.com/ads-sdk/ads-sdk.v5.min.js','http://127.0.0.1/sdk/ads/ads-sdk.min.js','async','result','script','location','apply','then','.localhost','manifest','head','getKaiAd','web','reject','userAgent','dummy','error','src','getSelf','createElement','split'];(function(_0x1ad48b,_0x97c48f){var _0x12a6ec=function(_0x11c212){while(--_0x11c212){_0x1ad48b['push'](_0x1ad48b['shift']());}};_0x12a6ec(++_0x97c48f);}(a0_0x97c4,0xd4));var a0_0x12a6=function(_0x1ad48b,_0x97c48f){_0x1ad48b=_0x1ad48b-0x0;var _0x12a6ec=a0_0x97c4[_0x1ad48b];return _0x12a6ec;};'use strict';(function(){var _0x457a87=this,_0x5d8736=[],_0x5f3d51=function _0x212ebb(_0x493730){_0x5d8736[a0_0x12a6('0x10')](function(_0xb35be3){_0x493730[a0_0x12a6('0x19')](_0x457a87,_0xb35be3);}),_0x5d8736=[];};window[a0_0x12a6('0x1e')]=function(){_0x5d8736[a0_0x12a6('0xb')](arguments);},window[a0_0x12a6('0x1e')][a0_0x12a6('0x22')]=!![];var _0x12380d=function _0x25eaab(_0x3708a3){if(typeof _0x3708a3[a0_0x12a6('0xa')]==='function'){var _0x164442=0x13;_0x3708a3[a0_0x12a6('0xa')](_0x164442);}},_0xeacc58=function _0x6b8586(_0x23bc2b){return new Promise(function(_0x45ea96,_0x5ec98a){var _0x2c2f55=document[a0_0x12a6('0x2')]('script');_0x2c2f55['addEventListener'](a0_0x12a6('0x12'),function(){_0x45ea96();}),_0x2c2f55[a0_0x12a6('0x7')](a0_0x12a6('0x23'),function(){_0x5ec98a();}),_0x2c2f55[a0_0x12a6('0x0')]=_0x23bc2b,_0x2c2f55[a0_0x12a6('0x15')]=![],document['head'][a0_0x12a6('0x5')](_0x2c2f55);});},_0x28b24c=function _0x399e17(_0x4f2810){return new Promise(function(_0x355c79,_0x185516){var _0x132857=document[a0_0x12a6('0x2')](a0_0x12a6('0x17'));_0x132857['addEventListener']('load',function(){!getKaiAd||getKaiAd[a0_0x12a6('0x22')]?_0x185516():_0x355c79();}),_0x132857[a0_0x12a6('0x7')]('error',function(){_0x185516();}),_0x132857['src']=_0x4f2810,document[a0_0x12a6('0x1d')][a0_0x12a6('0x5')](_0x132857);});},_0x598f82;window[a0_0x12a6('0xc')][a0_0x12a6('0xd')]?window['navigator'][a0_0x12a6('0xd')][a0_0x12a6('0x1')]()['onsuccess']=function(_0x4ff815){var _0x580307=_0x4ff815['target'][a0_0x12a6('0x16')];(!_0x580307||!_0x580307['manifest']||!_0x580307[a0_0x12a6('0x1c')][a0_0x12a6('0xe')]||_0x580307[a0_0x12a6('0x1c')][a0_0x12a6('0xe')]===a0_0x12a6('0x1f'))&&(_0x598f82=_0x28b24c('https://static.kaiads.com/ads-sdk/ads-sdk.v5.min.js'));if(!_0x598f82){var _0x3bf9d4=/ kaios\/((?:\d+.)*\d+)/gi['exec'](window[a0_0x12a6('0xc')][a0_0x12a6('0x21')]);_0x3bf9d4&&_0x432c75(_0x3bf9d4[0x1],'2.5')===0x1&&(_0x598f82=_0x28b24c(a0_0x12a6('0x14'))['catch'](function(){return _0x28b24c(a0_0x12a6('0x4'));}));}!_0x598f82&&(_0x598f82=Promise[a0_0x12a6('0x20')]()),_0x598f82[a0_0x12a6('0x8')](function(){_0x5f3d51(_0x12380d),window[a0_0x12a6('0x1e')]=_0x12380d,getKaiAd=_0x12380d;})[a0_0x12a6('0x1a')](function(){_0x5f3d51(getKaiAd),window[a0_0x12a6('0x1e')]=getKaiAd;});}:(/kaios/gi[a0_0x12a6('0x6')](window[a0_0x12a6('0xc')]['userAgent'])&&window[a0_0x12a6('0x18')][a0_0x12a6('0xf')][a0_0x12a6('0x11')](a0_0x12a6('0x1b'))?_0x598f82=_0x28b24c('http://127.0.0.1/sdk/ads/ads-sdk.min.js'):_0x598f82=_0x28b24c(a0_0x12a6('0x13')),!_0x598f82&&(_0x598f82=Promise[a0_0x12a6('0x20')]()),_0x598f82[a0_0x12a6('0x8')](function(){_0x5f3d51(_0x12380d),window['getKaiAd']=_0x12380d,getKaiAd=_0x12380d;})[a0_0x12a6('0x1a')](function(){_0x5f3d51(getKaiAd),window[a0_0x12a6('0x1e')]=getKaiAd;}));function _0x432c75(_0x20ebef,_0x153396){var _0x1a6c74=_0x20ebef[a0_0x12a6('0x3')]('.'),_0x16fcae=_0x153396[a0_0x12a6('0x3')]('.');while(_0x1a6c74[a0_0x12a6('0x9')]<_0x16fcae[a0_0x12a6('0x9')]){_0x1a6c74[a0_0x12a6('0xb')]('0');}while(_0x16fcae[a0_0x12a6('0x9')]<_0x1a6c74[a0_0x12a6('0x9')]){_0x16fcae[a0_0x12a6('0xb')]('0');}for(var _0x482647=0x0;_0x482647<_0x1a6c74[a0_0x12a6('0x9')];++_0x482647){if(_0x1a6c74[_0x482647]==_0x16fcae[_0x482647])continue;else return _0x1a6c74[_0x482647]>_0x16fcae[_0x482647]?0x1:-0x1;}return 0x0;}}());
2 | //# sourceMappingURL=sdk-loader.js.map
--------------------------------------------------------------------------------
/docs/assets/image/delete.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
33 |
35 |
37 |
39 |
46 |
49 |
51 |
56 |
65 |
70 |
82 |
83 |
85 |
94 |
103 |
115 |
127 |
139 |
140 |
141 |
142 |
--------------------------------------------------------------------------------
/application/assets/image/delete.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
33 |
35 |
37 |
39 |
46 |
49 |
51 |
56 |
65 |
70 |
82 |
83 |
85 |
94 |
103 |
115 |
127 |
139 |
140 |
141 |
142 |
--------------------------------------------------------------------------------
/docs/assets/image/list.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 |
58 |
61 |
64 |
74 |
83 |
92 |
93 |
96 |
106 |
107 |
110 |
120 |
121 |
122 |
131 |
132 |
133 |
134 |
--------------------------------------------------------------------------------
/application/assets/image/list.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
39 |
41 |
46 |
49 |
55 |
58 |
61 |
64 |
74 |
83 |
92 |
93 |
96 |
106 |
107 |
110 |
120 |
121 |
122 |
131 |
132 |
133 |
134 |
--------------------------------------------------------------------------------
/docs/assets/image/person.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
17 |
21 |
22 |
25 |
29 |
30 |
31 |
49 |
56 |
59 |
67 |
75 |
83 |
91 |
99 |
101 |
109 |
112 |
115 |
122 |
130 |
131 |
132 |
133 |
--------------------------------------------------------------------------------
/application/assets/image/person.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
17 |
21 |
22 |
25 |
29 |
30 |
31 |
49 |
56 |
59 |
67 |
75 |
83 |
91 |
99 |
101 |
109 |
112 |
115 |
122 |
130 |
131 |
132 |
133 |
--------------------------------------------------------------------------------
/docs/index.5671dcd7.css:
--------------------------------------------------------------------------------
1 | .grid-col-1{min-width:10px;max-width:10px}.grid-col-2{min-width:20px;max-width:20px}.grid-col-3{min-width:30px;max-width:30px}.grid-col-4{min-width:40px;max-width:40px}.grid-col-5{min-width:50px;max-width:50px}.grid-col-6{min-width:60px;max-width:60px}.grid-col-7{min-width:70px;max-width:70px}.grid-col-8{min-width:80px;max-width:80px}.grid-col-9{min-width:90px;max-width:90px}.grid-col-10{min-width:100px;max-width:100px}.grid-col-11{min-width:110px;max-width:110px}.grid-col-12{min-width:120px;max-width:120px}.grid-col-13{min-width:130px;max-width:130px}.grid-col-14{min-width:140px;max-width:140px}.grid-col-15{min-width:150px;max-width:150px}.grid-col-16{min-width:160px;max-width:160px}.grid-col-17{min-width:170px;max-width:170px}.grid-col-18{min-width:180px;max-width:180px}.grid-col-19{min-width:190px;max-width:190px}.grid-col-20{min-width:200px;max-width:200px}.grid-col-21{min-width:210px;max-width:210px}.grid-col-22{min-width:220px;max-width:220px}.grid-col-23{min-width:230px;max-width:230px}.grid-col-24{min-width:240px;max-width:240px}.grid-col-25{min-width:250px;max-width:250px}.grid-col-26{min-width:260px;max-width:260px}.grid-col-27{min-width:270px;max-width:270px}.grid-col-28{min-width:280px;max-width:280px}.grid-col-29{min-width:290px;max-width:290px}.grid-col-30{min-width:300px;max-width:300px}.grid-col-31{min-width:310px;max-width:310px}.grid-col-32{min-width:320px;max-width:320px}.grid-col-33{min-width:330px;max-width:330px}.grid-col-34{min-width:340px;max-width:340px}.grid-col-35{min-width:350px;max-width:350px}.grid-col-36{min-width:360px;max-width:360px}.grid-col-37{min-width:370px;max-width:370px}.grid-col-38{min-width:380px;max-width:380px}.grid-col-39{min-width:390px;max-width:390px}.grid-col-40{min-width:400px;max-width:400px}.grid-col-41{min-width:410px;max-width:410px}.grid-col-42{min-width:420px;max-width:420px}.grid-col-43{min-width:430px;max-width:430px}.grid-col-44{min-width:440px;max-width:440px}.grid-col-45{min-width:450px;max-width:450px}.grid-col-46{min-width:460px;max-width:460px}.grid-col-47{min-width:470px;max-width:470px}.grid-col-48{min-width:480px;max-width:480px}.grid-col-49{min-width:490px;max-width:490px}.grid-col-50{min-width:500px;max-width:500px}.grid-col-51{min-width:510px;max-width:510px}.grid-col-52{min-width:520px;max-width:520px}.grid-col-53{min-width:530px;max-width:530px}.grid-col-54{min-width:540px;max-width:540px}.grid-col-55{min-width:550px;max-width:550px}.grid-col-56{min-width:560px;max-width:560px}.grid-col-57{min-width:570px;max-width:570px}.grid-col-58{min-width:580px;max-width:580px}.grid-col-59{min-width:590px;max-width:590px}.grid-col-60{min-width:600px;max-width:600px}.grid-col-61{min-width:610px;max-width:610px}.grid-col-62{min-width:620px;max-width:620px}.grid-col-63{min-width:630px;max-width:630px}.grid-col-64{min-width:640px;max-width:640px}.grid-col-65{min-width:650px;max-width:650px}.grid-col-66{min-width:660px;max-width:660px}.grid-col-67{min-width:670px;max-width:670px}.grid-col-68{min-width:680px;max-width:680px}.grid-col-69{min-width:690px;max-width:690px}.grid-col-70{min-width:700px;max-width:700px}.grid-col-71{min-width:710px;max-width:710px}.grid-col-72{min-width:720px;max-width:720px}.grid-col-73{min-width:730px;max-width:730px}.grid-col-74{min-width:740px;max-width:740px}.grid-col-75{min-width:750px;max-width:750px}.grid-col-76{min-width:760px;max-width:760px}.grid-col-77{min-width:770px;max-width:770px}.grid-col-78{min-width:780px;max-width:780px}.grid-col-79{min-width:790px;max-width:790px}.grid-col-80{min-width:800px;max-width:800px}.grid-col-81{min-width:810px;max-width:810px}.grid-col-82{min-width:820px;max-width:820px}.grid-col-83{min-width:830px;max-width:830px}.grid-col-84{min-width:840px;max-width:840px}.grid-col-85{min-width:850px;max-width:850px}.grid-col-86{min-width:860px;max-width:860px}.grid-col-87{min-width:870px;max-width:870px}.grid-col-88{min-width:880px;max-width:880px}.grid-col-89{min-width:890px;max-width:890px}.grid-col-90{min-width:900px;max-width:900px}.grid-col-91{min-width:910px;max-width:910px}.grid-col-92{min-width:920px;max-width:920px}.grid-col-93{min-width:930px;max-width:930px}.grid-col-94{min-width:940px;max-width:940px}.grid-col-95{min-width:950px;max-width:950px}.grid-col-96{min-width:960px;max-width:960px}.text-center{text-align:center}.flex{-moz-box-orient:horizontal;-moz-box-direction:normal;flex-flow:wrap;display:flex}.flex-column{-moz-box-orient:vertical;-moz-box-direction:normal;flex-direction:column}.justify-content-start{-moz-box-align:start;align-items:flex-start}.justify-content-end{-moz-box-pack:end;justify-content:flex-end}.algin-item-start{-moz-box-align:start;align-items:flex-start}.algin-item-end{-moz-box-align:end;align-items:flex-end}.align-item-center{-moz-box-align:center;align-items:center}.justify-content-spacebetween{-moz-box-pack:justify;justify-content:space-between}.justify-content-spacearound{align-content:space-around;justify-content:space-around}.justify-content-center{-moz-box-pack:center;justify-content:center}.width-100{min-width:100vw;max-width:100vw}.height-100{min-height:100vh}.width-95{min-width:95%}.width-98{min-width:98%}.width-50{min-width:50%}.width-30{min-width:30%;max-width:30%}.center{transform:translate(50%)}.block{display:block}
--------------------------------------------------------------------------------
/docs/assets/icons/intro.svg:
--------------------------------------------------------------------------------
1 |
2 |
50 | Svg Vector Icons : http://www.onlinewebfonts.com/icon image/svg+xml
54 |
55 |
86 |
--------------------------------------------------------------------------------
/application/assets/icons/intro.svg:
--------------------------------------------------------------------------------
1 |
2 |
50 | Svg Vector Icons : http://www.onlinewebfonts.com/icon image/svg+xml
54 |
55 |
86 |
--------------------------------------------------------------------------------
/docs/about.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Greg
9 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
Greg
23 |
24 | An easy to use calendar for KaiOS
25 |
26 |
27 |
28 |
29 | How to use
30 |
31 | - Key 1 & 3 : Jump between the months
32 | - Key \* : Jump to current Day
33 | - Key Enter: toggle views
34 | - Key 2: event slider in month view
35 | - Key #: toggle moon phase view
36 |
37 |
38 |
39 | Nextcloud account
40 |
41 | if you want to use an external calendar, you have to enter the
42 | correct server address. at nextcloud as follows: - server:
43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password:
44 | "xxxxx",
45 |
46 |
47 | Features
48 |
49 | Local Calendar
50 | Nextcloud calendar
51 | Google calendar
52 | subscribe to public calendars
53 | moon phases
54 |
55 | I tested subscribing to calendar with google calendar. you have the
56 | possibility to subscribe to public calendars and private calendars,
57 | in the google calendar settings you will find an ID that you can
58 | enter in greg (by hand or qr code).
59 |
60 |
61 | How to install
62 | you can find the app in the
63 | bHaCkErSTORe or
64 | in the KaiOs Store or you can
65 | sideload
69 | it.
70 |
71 |
72 |
73 | This software (except KaiAds) is open source and licensed under the
74 | MIT License. View the source code .
75 |
76 |
77 | tsdav https://github.com/natelindev/tsdav MIT License
78 | mithril https://github.com/MithrilJS MIT License
79 | Dayjs https://github.com/iamkun/dayjs/ MIT License
80 |
81 |
82 |
83 |
86 |
87 |
What data is stored?
88 |
89 |
Google Account
90 |
91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth.
92 |
93 |
94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device.
95 |
96 |
97 |
CalDAV Account
98 |
99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app.
100 |
101 |
102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB.
103 |
104 |
105 |
Local Calendar
106 |
107 | Calendar events are stored locally on your device using IndexedDB.
108 |
109 |
110 |
Data protection and security
111 |
112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access.
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
129 |
130 |
131 |
132 |
133 | Analysis of the data and use of the app
134 |
135 | The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.
136 | If you installed the app with the KaiOs store:
137 |
138 | This software uses KaiAds. This is a third party service that may
139 | collect information used to identify you. Pricacy policy of
140 | KaiAds.
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/application/about.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Greg
9 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
Greg
23 |
24 | An easy to use calendar for KaiOS
25 |
26 |
27 |
28 |
29 | How to use
30 |
31 | - Key 1 & 3 : Jump between the months
32 | - Key \* : Jump to current Day
33 | - Key Enter: toggle views
34 | - Key 2: event slider in month view
35 | - Key #: toggle moon phase view
36 |
37 |
38 |
39 | Nextcloud account
40 |
41 | if you want to use an external calendar, you have to enter the
42 | correct server address. at nextcloud as follows: - server:
43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password:
44 | "xxxxx",
45 |
46 |
47 | Features
48 |
49 | Local Calendar
50 | Nextcloud calendar
51 | Google calendar
52 | subscribe to public calendars
53 | moon phases
54 |
55 | I tested subscribing to calendar with google calendar. you have the
56 | possibility to subscribe to public calendars and private calendars,
57 | in the google calendar settings you will find an ID that you can
58 | enter in greg (by hand or qr code).
59 |
60 |
61 | How to install
62 | you can find the app in the
63 | bHaCkErSTORe or
64 | in the KaiOs Store or you can
65 | sideload
69 | it.
70 |
71 |
72 |
73 | This software (except KaiAds) is open source and licensed under the
74 | MIT License. View the source code .
75 |
76 |
77 | tsdav https://github.com/natelindev/tsdav MIT License
78 | mithril https://github.com/MithrilJS MIT License
79 | Dayjs https://github.com/iamkun/dayjs/ MIT License
80 |
81 |
82 |
83 |
86 |
87 |
What data is stored?
88 |
89 |
Google Account
90 |
91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth.
92 |
93 |
94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device.
95 |
96 |
97 |
CalDAV Account
98 |
99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app.
100 |
101 |
102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB.
103 |
104 |
105 |
Local Calendar
106 |
107 | Calendar events are stored locally on your device using IndexedDB.
108 |
109 |
110 |
Data protection and security
111 |
112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access.
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
129 |
130 |
131 |
132 |
133 | Analysis of the data and use of the app
134 |
135 | The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.
136 | If you installed the app with the KaiOs store:
137 |
138 | This software uses KaiAds. This is a third party service that may
139 | collect information used to identify you. Pricacy policy of
140 | KaiAds.
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/docs/datenschutz.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Greg
9 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
Greg
23 |
24 | An easy to use calendar for KaiOS
25 |
26 |
27 |
28 |
29 | How to use
30 |
31 | - Key 1 & 3 : Jump between the months
32 | - Key \* : Jump to current Day
33 | - Key Enter: toggle views
34 | - Key 2: event slider in month view
35 | - Key #: toggle moon phase view
36 |
37 |
38 |
39 | Nextcloud account
40 |
41 | if you want to use an external calendar, you have to enter the
42 | correct server address. at nextcloud as follows: - server:
43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password:
44 | "xxxxx",
45 |
46 |
47 | Features
48 |
49 | Local Calendar
50 | Nextcloud calendar
51 | Google calendar
52 | subscribe to public calendars
53 | moon phases
54 |
55 | I tested subscribing to calendar with google calendar. you have the
56 | possibility to subscribe to public calendars and private calendars,
57 | in the google calendar settings you will find an ID that you can
58 | enter in greg (by hand or qr code).
59 |
60 |
61 | How to install
62 | you can find the app in the
63 | bHaCkErSTORe or
64 | in the KaiOs Store or you can
65 | sideload
69 | it.
70 |
71 |
72 |
73 | This software (except KaiAds) is open source and licensed under the
74 | MIT License. View the source code .
75 |
76 |
77 | tsdav https://github.com/natelindev/tsdav MIT License
78 | mithril https://github.com/MithrilJS MIT License
79 | Dayjs https://github.com/iamkun/dayjs/ MIT License
80 |
81 |
82 |
83 |
86 |
87 |
What data is stored?
88 |
89 |
Google Account
90 |
91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth.
92 |
93 |
94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device.
95 |
96 |
97 |
CalDAV Account
98 |
99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app.
100 |
101 |
102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB.
103 |
104 |
105 |
Local Calendar
106 |
107 | Calendar events are stored locally on your device using IndexedDB.
108 |
109 |
110 |
Data protection and security
111 |
112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access.
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
129 |
130 |
131 |
132 |
133 | Analysis of the data and use of the app
134 |
135 | The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.
136 | If you installed the app with the KaiOs store:
137 |
138 | This software uses KaiAds. This is a third party service that may
139 | collect information used to identify you. Pricacy policy of
140 | KaiAds.
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/application/datenschutz.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Greg
9 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
Greg
23 |
24 | An easy to use calendar for KaiOS
25 |
26 |
27 |
28 |
29 | How to use
30 |
31 | - Key 1 & 3 : Jump between the months
32 | - Key \* : Jump to current Day
33 | - Key Enter: toggle views
34 | - Key 2: event slider in month view
35 | - Key #: toggle moon phase view
36 |
37 |
38 |
39 | Nextcloud account
40 |
41 | if you want to use an external calendar, you have to enter the
42 | correct server address. at nextcloud as follows: - server:
43 | "https://xxxxx/remote.php/dav", - username: "xxxxm", - password:
44 | "xxxxx",
45 |
46 |
47 | Features
48 |
49 | Local Calendar
50 | Nextcloud calendar
51 | Google calendar
52 | subscribe to public calendars
53 | moon phases
54 |
55 | I tested subscribing to calendar with google calendar. you have the
56 | possibility to subscribe to public calendars and private calendars,
57 | in the google calendar settings you will find an ID that you can
58 | enter in greg (by hand or qr code).
59 |
60 |
61 | How to install
62 | you can find the app in the
63 | bHaCkErSTORe or
64 | in the KaiOs Store or you can
65 | sideload
69 | it.
70 |
71 |
72 |
73 | This software (except KaiAds) is open source and licensed under the
74 | MIT License. View the source code .
75 |
76 |
77 | tsdav https://github.com/natelindev/tsdav MIT License
78 | mithril https://github.com/MithrilJS MIT License
79 | Dayjs https://github.com/iamkun/dayjs/ MIT License
80 |
81 |
82 |
83 |
86 |
87 |
What data is stored?
88 |
89 |
Google Account
90 |
91 | If you have connected your Google account to the app, the username and password of your Google account will not be saved on the app. Authentication is done via OAuth.
92 |
93 |
94 | The information on the individual calendars and calendar events is stored locally using IndexedDB on your device.
95 |
96 |
97 |
CalDAV Account
98 |
99 | If you have connected the app to a CalDAV account, the username and password are stored locally using IndexedDB in the app.
100 |
101 |
102 | The information on the individual calendars and calendar events is also stored locally using IndexedDB.
103 |
104 |
105 |
Local Calendar
106 |
107 | Calendar events are stored locally on your device using IndexedDB.
108 |
109 |
110 |
Data protection and security
111 |
112 | The app uses IndexedDB for local data storage, which allows for efficient and secure management of large datasets. The storage of sensitive information, such as CalDAV account credentials, is encrypted and securely stored within IndexedDB to protect against unauthorized access.
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
129 |
130 |
131 |
132 |
133 | Analysis of the data and use of the app
134 |
135 | The app does not store any data that analyzes the use of the app, nor is there any tracking of the user.
136 | If you installed the app with the KaiOs store:
137 |
138 | This software uses KaiAds. This is a third party service that may
139 | collect information used to identify you. Pricacy policy of
140 | KaiAds.
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/images/helper.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
16 |
35 |
37 |
41 |
44 |
47 |
56 |
74 |
92 |
94 |
102 | select next article
113 |
114 |
115 |
118 |
121 |
129 | 2
140 | 5
151 |
152 |
155 |
163 | select next channel
174 |
175 |
176 |
177 |
178 |
--------------------------------------------------------------------------------
/application/assets/css/grid.css:
--------------------------------------------------------------------------------
1 | /* G R I D */
2 |
3 | .grid-col-1 {
4 | min-width: 10px;
5 | max-width: 10px;
6 | }
7 |
8 | .grid-col-2 {
9 | min-width: 20px;
10 | max-width: 20px;
11 | }
12 |
13 | .grid-col-3 {
14 | min-width: 30px;
15 | max-width: 30px;
16 | }
17 |
18 | .grid-col-4 {
19 | min-width: 40px;
20 | max-width: 40px;
21 | }
22 |
23 | .grid-col-5 {
24 | min-width: 50px;
25 | max-width: 50px;
26 | }
27 |
28 | .grid-col-6 {
29 | min-width: 60px;
30 | max-width: 60px;
31 | }
32 |
33 | .grid-col-7 {
34 | min-width: 70px;
35 | max-width: 70px;
36 | }
37 |
38 | .grid-col-8 {
39 | min-width: 80px;
40 | max-width: 80px;
41 | }
42 |
43 | .grid-col-9 {
44 | min-width: 90px;
45 | max-width: 90px;
46 | }
47 |
48 | .grid-col-10 {
49 | min-width: 100px;
50 | max-width: 100px;
51 | }
52 |
53 | .grid-col-11 {
54 | min-width: 110px;
55 | max-width: 110px;
56 | }
57 |
58 | .grid-col-12 {
59 | min-width: 120px;
60 | max-width: 120px;
61 | }
62 |
63 | .grid-col-13 {
64 | min-width: 130px;
65 | max-width: 130px;
66 | }
67 |
68 | .grid-col-14 {
69 | min-width: 140px;
70 | max-width: 140px;
71 | }
72 |
73 | .grid-col-15 {
74 | min-width: 150px;
75 | max-width: 150px;
76 | }
77 |
78 | .grid-col-16 {
79 | min-width: 160px;
80 | max-width: 160px;
81 | }
82 |
83 | .grid-col-17 {
84 | min-width: 170px;
85 | max-width: 170px;
86 | }
87 |
88 | .grid-col-18 {
89 | min-width: 180px;
90 | max-width: 180px;
91 | }
92 |
93 | .grid-col-19 {
94 | min-width: 190px;
95 | max-width: 190px;
96 | }
97 |
98 | .grid-col-20 {
99 | min-width: 200px;
100 | max-width: 200px;
101 | }
102 |
103 | .grid-col-21 {
104 | min-width: 210px;
105 | max-width: 210px;
106 | }
107 |
108 | .grid-col-22 {
109 | min-width: 220px;
110 | max-width: 220px;
111 | }
112 |
113 | .grid-col-23 {
114 | min-width: 230px;
115 | max-width: 230px;
116 | }
117 |
118 | .grid-col-24 {
119 | min-width: 240px;
120 | max-width: 240px;
121 | }
122 |
123 | .grid-col-25 {
124 | min-width: 250px;
125 | max-width: 250px;
126 | }
127 |
128 | .grid-col-26 {
129 | min-width: 260px;
130 | max-width: 260px;
131 | }
132 |
133 | .grid-col-27 {
134 | min-width: 270px;
135 | max-width: 270px;
136 | }
137 |
138 | .grid-col-28 {
139 | min-width: 280px;
140 | max-width: 280px;
141 | }
142 |
143 | .grid-col-29 {
144 | min-width: 290px;
145 | max-width: 290px;
146 | }
147 |
148 | .grid-col-30 {
149 | min-width: 300px;
150 | max-width: 300px;
151 | }
152 |
153 | .grid-col-31 {
154 | min-width: 310px;
155 | max-width: 310px;
156 | }
157 |
158 | .grid-col-32 {
159 | min-width: 320px;
160 | max-width: 320px;
161 | }
162 |
163 | .grid-col-33 {
164 | min-width: 330px;
165 | max-width: 330px;
166 | }
167 |
168 | .grid-col-34 {
169 | min-width: 340px;
170 | max-width: 340px;
171 | }
172 |
173 | .grid-col-35 {
174 | min-width: 350px;
175 | max-width: 350px;
176 | }
177 |
178 | .grid-col-36 {
179 | min-width: 360px;
180 | max-width: 360px;
181 | }
182 |
183 | .grid-col-37 {
184 | min-width: 370px;
185 | max-width: 370px;
186 | }
187 |
188 | .grid-col-38 {
189 | min-width: 380px;
190 | max-width: 380px;
191 | }
192 |
193 | .grid-col-39 {
194 | min-width: 390px;
195 | max-width: 390px;
196 | }
197 |
198 | .grid-col-40 {
199 | min-width: 400px;
200 | max-width: 400px;
201 | }
202 |
203 | .grid-col-41 {
204 | min-width: 410px;
205 | max-width: 410px;
206 | }
207 |
208 | .grid-col-42 {
209 | min-width: 420px;
210 | max-width: 420px;
211 | }
212 |
213 | .grid-col-43 {
214 | min-width: 430px;
215 | max-width: 430px;
216 | }
217 |
218 | .grid-col-44 {
219 | min-width: 440px;
220 | max-width: 440px;
221 | }
222 |
223 | .grid-col-45 {
224 | min-width: 450px;
225 | max-width: 450px;
226 | }
227 |
228 | .grid-col-46 {
229 | min-width: 460px;
230 | max-width: 460px;
231 | }
232 |
233 | .grid-col-47 {
234 | min-width: 470px;
235 | max-width: 470px;
236 | }
237 |
238 | .grid-col-48 {
239 | min-width: 480px;
240 | max-width: 480px;
241 | }
242 |
243 | .grid-col-49 {
244 | min-width: 490px;
245 | max-width: 490px;
246 | }
247 |
248 | .grid-col-50 {
249 | min-width: 500px;
250 | max-width: 500px;
251 | }
252 |
253 | .grid-col-51 {
254 | min-width: 510px;
255 | max-width: 510px;
256 | }
257 |
258 | .grid-col-52 {
259 | min-width: 520px;
260 | max-width: 520px;
261 | }
262 |
263 | .grid-col-53 {
264 | min-width: 530px;
265 | max-width: 530px;
266 | }
267 |
268 | .grid-col-54 {
269 | min-width: 540px;
270 | max-width: 540px;
271 | }
272 |
273 | .grid-col-55 {
274 | min-width: 550px;
275 | max-width: 550px;
276 | }
277 |
278 | .grid-col-56 {
279 | min-width: 560px;
280 | max-width: 560px;
281 | }
282 |
283 | .grid-col-57 {
284 | min-width: 570px;
285 | max-width: 570px;
286 | }
287 |
288 | .grid-col-58 {
289 | min-width: 580px;
290 | max-width: 580px;
291 | }
292 |
293 | .grid-col-59 {
294 | min-width: 590px;
295 | max-width: 590px;
296 | }
297 |
298 | .grid-col-60 {
299 | min-width: 600px;
300 | max-width: 600px;
301 | }
302 |
303 | .grid-col-61 {
304 | min-width: 610px;
305 | max-width: 610px;
306 | }
307 |
308 | .grid-col-62 {
309 | min-width: 620px;
310 | max-width: 620px;
311 | }
312 |
313 | .grid-col-63 {
314 | min-width: 630px;
315 | max-width: 630px;
316 | }
317 |
318 | .grid-col-64 {
319 | min-width: 640px;
320 | max-width: 640px;
321 | }
322 |
323 | .grid-col-65 {
324 | min-width: 650px;
325 | max-width: 650px;
326 | }
327 |
328 | .grid-col-66 {
329 | min-width: 660px;
330 | max-width: 660px;
331 | }
332 |
333 | .grid-col-67 {
334 | min-width: 670px;
335 | max-width: 670px;
336 | }
337 |
338 | .grid-col-68 {
339 | min-width: 680px;
340 | max-width: 680px;
341 | }
342 |
343 | .grid-col-69 {
344 | min-width: 690px;
345 | max-width: 690px;
346 | }
347 |
348 | .grid-col-70 {
349 | min-width: 700px;
350 | max-width: 700px;
351 | }
352 |
353 | .grid-col-71 {
354 | min-width: 710px;
355 | max-width: 710px;
356 | }
357 |
358 | .grid-col-72 {
359 | min-width: 720px;
360 | max-width: 720px;
361 | }
362 |
363 | .grid-col-73 {
364 | min-width: 730px;
365 | max-width: 730px;
366 | }
367 |
368 | .grid-col-74 {
369 | min-width: 740px;
370 | max-width: 740px;
371 | }
372 |
373 | .grid-col-75 {
374 | min-width: 750px;
375 | max-width: 750px;
376 | }
377 |
378 | .grid-col-76 {
379 | min-width: 760px;
380 | max-width: 760px;
381 | }
382 |
383 | .grid-col-77 {
384 | min-width: 770px;
385 | max-width: 770px;
386 | }
387 |
388 | .grid-col-78 {
389 | min-width: 780px;
390 | max-width: 780px;
391 | }
392 |
393 | .grid-col-79 {
394 | min-width: 790px;
395 | max-width: 790px;
396 | }
397 |
398 | .grid-col-80 {
399 | min-width: 800px;
400 | max-width: 800px;
401 | }
402 |
403 | .grid-col-81 {
404 | min-width: 810px;
405 | max-width: 810px;
406 | }
407 |
408 | .grid-col-82 {
409 | min-width: 820px;
410 | max-width: 820px;
411 | }
412 |
413 | .grid-col-83 {
414 | min-width: 830px;
415 | max-width: 830px;
416 | }
417 |
418 | .grid-col-84 {
419 | min-width: 840px;
420 | max-width: 840px;
421 | }
422 |
423 | .grid-col-85 {
424 | min-width: 850px;
425 | max-width: 850px;
426 | }
427 |
428 | .grid-col-86 {
429 | min-width: 860px;
430 | max-width: 860px;
431 | }
432 |
433 | .grid-col-87 {
434 | min-width: 870px;
435 | max-width: 870px;
436 | }
437 |
438 | .grid-col-88 {
439 | min-width: 880px;
440 | max-width: 880px;
441 | }
442 |
443 | .grid-col-88 {
444 | min-width: 880px;
445 | max-width: 880px;
446 | }
447 |
448 | .grid-col-89 {
449 | min-width: 890px;
450 | max-width: 890px;
451 | }
452 |
453 | .grid-col-90 {
454 | min-width: 900px;
455 | max-width: 900px;
456 | }
457 |
458 | .grid-col-91 {
459 | min-width: 910px;
460 | max-width: 910px;
461 | }
462 |
463 | .grid-col-92 {
464 | min-width: 920px;
465 | max-width: 920px;
466 | }
467 |
468 | .grid-col-93 {
469 | min-width: 930px;
470 | max-width: 930px;
471 | }
472 |
473 | .grid-col-94 {
474 | min-width: 940px;
475 | max-width: 940px;
476 | }
477 |
478 | .grid-col-95 {
479 | min-width: 950px;
480 | max-width: 950px;
481 | }
482 |
483 | .grid-col-96 {
484 | min-width: 960px;
485 | max-width: 960px;
486 | }
487 |
488 | .text-center {
489 | text-align: center;
490 | }
491 |
492 | .flex {
493 | display: -webkit-flex;
494 | display: flex;
495 | -webkit-flex-direction: row;
496 | flex-direction: row;
497 | -webkit-flex-wrap: wrap;
498 | flex-wrap: wrap;
499 | }
500 |
501 | .flex-column {
502 | -webkit-flex-direction: column;
503 | -ms-flex-direction: column;
504 | flex-direction: column;
505 | }
506 |
507 | .justify-content-start {
508 | -webkit-align-items: flex-start;
509 | align-items: flex-start;
510 | }
511 |
512 | .justify-content-end {
513 | -webkit-justify-content: flex-end;
514 | justify-content: flex-end;
515 | }
516 |
517 | .algin-item-start {
518 | -webkit-align-items: flex-start;
519 | align-items: flex-start;
520 | }
521 |
522 | .algin-item-end {
523 | -webkit-align-items: flex-end;
524 | align-items: flex-end;
525 | }
526 |
527 | .align-item-center {
528 | -webkit-align-items: center;
529 | -ms-flex-align: center;
530 | align-items: center;
531 | }
532 |
533 | .justify-content-spacebetween {
534 | -webkit-justify-content: space-between;
535 | justify-content: space-between;
536 | }
537 |
538 | .justify-content-spacearound {
539 | -webkit-justify-content: space-around;
540 | -ms-flex-pack: distribute;
541 | justify-content: space-around;
542 | -webkit-align-content: space-around;
543 | -ms-flex-line-pack: distribute;
544 | align-content: space-around;
545 | }
546 |
547 | .justify-content-center {
548 | -webkit-justify-content: center;
549 | -ms-flex-pack: center;
550 | justify-content: center;
551 | }
552 |
553 | .width-100 {
554 | min-width: 100vw;
555 | max-width: 100vw;
556 | }
557 |
558 | .height-100 {
559 | min-height: 100vh;
560 | }
561 |
562 | .width-95 {
563 | min-width: 95%;
564 | }
565 |
566 | .width-98 {
567 | min-width: 98%;
568 | }
569 |
570 | .width-50 {
571 | min-width: 50%;
572 | }
573 |
574 | .width-30 {
575 | min-width: 30%;
576 | max-width: 30%;
577 | }
578 |
579 | .center {
580 | transform: translate(50%, -0%);
581 | }
582 |
583 | .block {
584 | display: block;
585 | }
586 |
--------------------------------------------------------------------------------
/docs/assets/image/E1D8.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
39 |
41 |
48 |
55 |
62 |
63 |
66 |
72 |
78 |
84 |
90 |
96 |
102 |
108 |
114 |
120 |
126 |
132 |
138 |
144 |
150 |
156 |
162 |
168 |
174 |
184 |
194 |
204 |
214 |
224 |
234 |
244 |
252 |
260 |
268 |
276 |
284 |
292 |
300 |
308 |
316 |
324 |
332 |
340 |
348 |
356 |
364 |
372 |
380 |
388 |
396 |
404 |
412 |
420 |
428 |
436 |
444 |
452 |
460 |
461 |
462 |
--------------------------------------------------------------------------------
/application/assets/image/E1D8.svg:
--------------------------------------------------------------------------------
1 |
2 |
12 |
14 |
32 |
39 |
41 |
48 |
55 |
62 |
63 |
66 |
72 |
78 |
84 |
90 |
96 |
102 |
108 |
114 |
120 |
126 |
132 |
138 |
144 |
150 |
156 |
162 |
168 |
174 |
184 |
194 |
204 |
214 |
224 |
234 |
244 |
252 |
260 |
268 |
276 |
284 |
292 |
300 |
308 |
316 |
324 |
332 |
340 |
348 |
356 |
364 |
372 |
380 |
388 |
396 |
404 |
412 |
420 |
428 |
436 |
444 |
452 |
460 |
461 |
462 |
--------------------------------------------------------------------------------