Build 0.0.1

This commit is contained in:
Raj Nandan Sharma
2023-12-22 23:58:00 +05:30
parent 2852245fbb
commit e842e1172f
45 changed files with 182 additions and 183 deletions

View File

@@ -1,5 +1,5 @@
# Kener - Status Page System
Kener: An open-source Node.js status page application for real-time service monitoring, incident management, and customizable reporting. Simplify service outage tracking, enhance incident communication, and ensure a seamless user experience.
Kener: Open-source Node.js status page tool, designed to make service monitoring and incident handling a breeze. It offers a sleek and user-friendly interface that simplifies tracking service outages and improves how we communicate during incidents. And the best part? Kener integrates seamlessly with GitHub, making incident management a team effort—making it easier for us to track and fix issues together in a collaborative and friendly environment.
It uses files to store the data. Other adapters are coming soon
@@ -9,4 +9,14 @@ Visit a live server [here](https://kener.ing)
Read the documentation [here](https://kener.ing/docs)
![alt text](static/ss.png "SS")
## Technologies used
- [SvelteKit](https://kit.svelte.dev/)
- [shadcn-svelte](https://www.shadcn-svelte.com/)
## Inspired from
- [Upptime](https://upptime.js.org/)
## Roadmap
- [ ] Add notification
- [ ] Add api to create incident
- [ ] Add Mysql adapter

View File

@@ -1 +1 @@
import{w as u}from"./index.7ea6c3d8.js";var b;const y=((b=globalThis.__sveltekit_y8a47k)==null?void 0:b.base)??"";var h;(h=globalThis.__sveltekit_y8a47k)==null||h.assets;const I="sveltekit:snapshot",x="sveltekit:scroll",O="sveltekit:index",c={tap:1,hover:2,viewport:3,eager:4,off:-1},k=location.origin;function T(e){let t=e.baseURI;if(!t){const o=e.getElementsByTagName("base");t=o.length?o[0].href:e.URL}return t}function U(){return{x:pageXOffset,y:pageYOffset}}const d=new WeakSet,p={"preload-code":["","off","tap","hover","viewport","eager"],"preload-data":["","off","tap","hover"],keepfocus:["","true","off","false"],noscroll:["","true","off","false"],reload:["","true","off","false"],replacestate:["","true","off","false"]};function f(e,t){const o=e.getAttribute(`data-sveltekit-${t}`);return E(e,t,o),o}function E(e,t,o){o!==null&&!d.has(e)&&!p[t].includes(o)&&(console.error(`Unexpected value for ${t} — should be one of ${p[t].map(s=>JSON.stringify(s)).join(", ")}`,e),d.add(e))}const _={...c,"":c.hover};function v(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function N(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=v(e)}}function L(e,t){let o;try{o=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI)}catch{}const s=e instanceof SVGAElement?e.target.baseVal:e.target,l=!o||!!s||A(o,t)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),r=(o==null?void 0:o.origin)===k&&e.hasAttribute("download");return{url:o,external:l,target:s,download:r}}function P(e){let t=null,o=null,s=null,l=null,r=null,a=null,n=e;for(;n&&n!==document.documentElement;)s===null&&(s=f(n,"preload-code")),l===null&&(l=f(n,"preload-data")),t===null&&(t=f(n,"keepfocus")),o===null&&(o=f(n,"noscroll")),r===null&&(r=f(n,"reload")),a===null&&(a=f(n,"replacestate")),n=v(n);function i(w){switch(w){case"":case"true":return!0;case"off":case"false":return!1;default:return null}}return{preload_code:_[s??"off"],preload_data:_[l??"off"],keep_focus:i(t),noscroll:i(o),reload:i(r),replace_state:i(a)}}function g(e){const t=u(e);let o=!0;function s(){o=!0,t.update(a=>a)}function l(a){o=!1,t.set(a)}function r(a){let n;return t.subscribe(i=>{(n===void 0||o&&i!==n)&&a(n=i)})}return{notify:s,set:l,subscribe:r}}function S(){const{set:e,subscribe:t}=u(!1);return{subscribe:t,check:async()=>!1}}function A(e,t){return e.origin!==k||!e.pathname.startsWith(t)}function V(e){e.client}const Y={url:g({}),page:g({}),navigating:u(null),updated:S()};export{O as I,c as P,x as S,I as a,L as b,P as c,Y as d,y as e,N as f,T as g,V as h,A as i,k as o,U as s};
import{w as u}from"./index.7ea6c3d8.js";var b;const E=((b=globalThis.__sveltekit_fcreex)==null?void 0:b.base)??"";var h;(h=globalThis.__sveltekit_fcreex)==null||h.assets;const y="sveltekit:snapshot",I="sveltekit:scroll",O="sveltekit:index",c={tap:1,hover:2,viewport:3,eager:4,off:-1},v=location.origin;function T(e){let t=e.baseURI;if(!t){const o=e.getElementsByTagName("base");t=o.length?o[0].href:e.URL}return t}function U(){return{x:pageXOffset,y:pageYOffset}}const d=new WeakSet,p={"preload-code":["","off","tap","hover","viewport","eager"],"preload-data":["","off","tap","hover"],keepfocus:["","true","off","false"],noscroll:["","true","off","false"],reload:["","true","off","false"],replacestate:["","true","off","false"]};function f(e,t){const o=e.getAttribute(`data-sveltekit-${t}`);return S(e,t,o),o}function S(e,t,o){o!==null&&!d.has(e)&&!p[t].includes(o)&&(console.error(`Unexpected value for ${t} — should be one of ${p[t].map(s=>JSON.stringify(s)).join(", ")}`,e),d.add(e))}const _={...c,"":c.hover};function k(e){let t=e.assignedSlot??e.parentNode;return(t==null?void 0:t.nodeType)===11&&(t=t.host),t}function N(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()==="A"&&e.hasAttribute("href"))return e;e=k(e)}}function L(e,t){let o;try{o=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI)}catch{}const s=e instanceof SVGAElement?e.target.baseVal:e.target,l=!o||!!s||A(o,t)||(e.getAttribute("rel")||"").split(/\s+/).includes("external"),r=(o==null?void 0:o.origin)===v&&e.hasAttribute("download");return{url:o,external:l,target:s,download:r}}function P(e){let t=null,o=null,s=null,l=null,r=null,a=null,n=e;for(;n&&n!==document.documentElement;)s===null&&(s=f(n,"preload-code")),l===null&&(l=f(n,"preload-data")),t===null&&(t=f(n,"keepfocus")),o===null&&(o=f(n,"noscroll")),r===null&&(r=f(n,"reload")),a===null&&(a=f(n,"replacestate")),n=k(n);function i(w){switch(w){case"":case"true":return!0;case"off":case"false":return!1;default:return null}}return{preload_code:_[s??"off"],preload_data:_[l??"off"],keep_focus:i(t),noscroll:i(o),reload:i(r),replace_state:i(a)}}function g(e){const t=u(e);let o=!0;function s(){o=!0,t.update(a=>a)}function l(a){o=!1,t.set(a)}function r(a){let n;return t.subscribe(i=>{(n===void 0||o&&i!==n)&&a(n=i)})}return{notify:s,set:l,subscribe:r}}function x(){const{set:e,subscribe:t}=u(!1);return{subscribe:t,check:async()=>!1}}function A(e,t){return e.origin!==v||!e.pathname.startsWith(t)}function V(e){e.client}const Y={url:g({}),page:g({}),navigating:u(null),updated:x()};export{O as I,c as P,I as S,y as a,L as b,P as c,Y as d,E as e,N as f,T as g,V as h,A as i,v as o,U as s};

View File

@@ -1 +1 @@
import{s as O,z as R,A as q,g as b,l as g,c as z,h as E,i as $,m as w,d as A,k as S,n as k}from"../chunks/scheduler.ea4d12df.js";import{S as B,i as D,d as C,v as H,e as d,a as m,o as j,s as x}from"../chunks/index.12c4b772.js";import{d as N}from"../chunks/singletons.2cc3b0bd.js";const P=()=>{const t=N;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},_={subscribe(t){return P().page.subscribe(t)}},y="node_modules/@sveltejs/kit/src/runtime/components/error.svelte";function f(t){var h;let e,i=t[0].status+"",r,l,n,c=((h=t[0].error)==null?void 0:h.message)+"",a;const v={c:function(){e=b("h1"),r=g(i),l=z(),n=b("p"),a=g(c),this.h()},l:function(s){e=E(s,"H1",{});var o=$(e);r=w(o,i),o.forEach(d),l=A(s),n=E(s,"P",{});var p=$(n);a=w(p,c),p.forEach(d),this.h()},h:function(){S(e,y,4,0,57),S(n,y,5,0,81)},m:function(s,o){m(s,e,o),j(e,r),m(s,l,o),m(s,n,o),j(n,a)},p:function(s,[o]){var p;o&1&&i!==(i=s[0].status+"")&&x(r,i),o&1&&c!==(c=((p=s[0].error)==null?void 0:p.message)+"")&&x(a,c)},i:k,o:k,d:function(s){s&&(d(e),d(l),d(n))}};return C("SvelteRegisterBlock",{block:v,id:f.name,type:"component",source:"",ctx:t}),v}function F(t,e,i){let r;R(_,"page"),q(t,_,a=>i(0,r=a));let{$$slots:l={},$$scope:n}=e;H("Error",l,[]);const c=[];return Object.keys(e).forEach(a=>{!~c.indexOf(a)&&a.slice(0,2)!=="$$"&&a!=="slot"&&console.warn(`<Error> was created with unknown prop '${a}'`)}),t.$capture_state=()=>({page:_,$page:r}),[r]}let K=class extends B{constructor(e){super(e),D(this,e,F,f,O,{}),C("SvelteRegisterComponent",{component:this,tagName:"Error",options:e,id:f.name})}};export{K as component};
import{s as O,z as R,A as q,g as b,l as g,c as z,h as E,i as $,m as w,d as A,k as S,n as k}from"../chunks/scheduler.ea4d12df.js";import{S as B,i as D,d as C,v as H,e as d,a as m,o as j,s as x}from"../chunks/index.12c4b772.js";import{d as N}from"../chunks/singletons.e4f99468.js";const P=()=>{const t=N;return{page:{subscribe:t.page.subscribe},navigating:{subscribe:t.navigating.subscribe},updated:t.updated}},_={subscribe(t){return P().page.subscribe(t)}},y="node_modules/@sveltejs/kit/src/runtime/components/error.svelte";function f(t){var h;let e,i=t[0].status+"",r,l,n,c=((h=t[0].error)==null?void 0:h.message)+"",a;const v={c:function(){e=b("h1"),r=g(i),l=z(),n=b("p"),a=g(c),this.h()},l:function(s){e=E(s,"H1",{});var o=$(e);r=w(o,i),o.forEach(d),l=A(s),n=E(s,"P",{});var p=$(n);a=w(p,c),p.forEach(d),this.h()},h:function(){S(e,y,4,0,57),S(n,y,5,0,81)},m:function(s,o){m(s,e,o),j(e,r),m(s,l,o),m(s,n,o),j(n,a)},p:function(s,[o]){var p;o&1&&i!==(i=s[0].status+"")&&x(r,i),o&1&&c!==(c=((p=s[0].error)==null?void 0:p.message)+"")&&x(a,c)},i:k,o:k,d:function(s){s&&(d(e),d(l),d(n))}};return C("SvelteRegisterBlock",{block:v,id:f.name,type:"component",source:"",ctx:t}),v}function F(t,e,i){let r;R(_,"page"),q(t,_,a=>i(0,r=a));let{$$slots:l={},$$scope:n}=e;H("Error",l,[]);const c=[];return Object.keys(e).forEach(a=>{!~c.indexOf(a)&&a.slice(0,2)!=="$$"&&a!=="slot"&&console.warn(`<Error> was created with unknown prop '${a}'`)}),t.$capture_state=()=>({page:_,$page:r}),[r]}let K=class extends B{constructor(e){super(e),D(this,e,F,f,O,{}),C("SvelteRegisterComponent",{component:this,tagName:"Error",options:e,id:f.name})}};export{K as component};

View File

@@ -1 +1 @@
{"version":"1703266032663"}
{"version":"1703269613365"}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

BIN
build/client/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: SketchAPI 2022.10.18.0 https://api.sketch.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketchjs="https://sketch.io/dtd/" sketchjs:metadata="eyJuYW1lIjoiYjQwOWRlZmQtOTc1Zi00MDhjLTljN2QtZWE4MTU3YmMwYWU4LnNrZXRjaHBhZCIsInN1cmZhY2UiOnsiaXNQYWludCI6dHJ1ZSwibWV0aG9kIjoiZmlsbCIsImJsZW5kIjoibm9ybWFsIiwiZW5hYmxlZCI6dHJ1ZSwib3BhY2l0eSI6MSwidHlwZSI6InBhdHRlcm4iLCJwYXR0ZXJuIjp7InR5cGUiOiJwYXR0ZXJuIiwicmVmbGVjdCI6Im5vLXJlZmxlY3QiLCJyZXBlYXQiOiJyZXBlYXQiLCJzbW9vdGhpbmciOmZhbHNlLCJzcmMiOiJ0cmFuc3BhcmVudExpZ2h0Iiwic3giOjEsInN5IjoxLCJ4MCI6MC41LCJ4MSI6MSwieTAiOjAuNSwieTEiOjF9LCJpc0ZpbGwiOnRydWV9LCJjbGlwUGF0aCI6eyJlbmFibGVkIjp0cnVlLCJzdHlsZSI6eyJzdHJva2VTdHlsZSI6ImJsYWNrIiwibGluZVdpZHRoIjoxfX0sImRlc2NyaXB0aW9uIjoiTWFkZSB3aXRoIFNrZXRjaHBhZCIsIm1ldGFkYXRhIjp7fSwiZXhwb3J0RFBJIjo3MiwiZXhwb3J0Rm9ybWF0IjoicG5nIiwiZXhwb3J0UXVhbGl0eSI6MC45NSwidW5pdHMiOiJweCIsIndpZHRoIjo5MDAsImhlaWdodCI6OTAwLCJwYWdlcyI6W3sid2lkdGgiOjkwMCwiaGVpZ2h0Ijo5MDB9XSwidXVpZCI6IjRiYmQ5NjRmLTdhNDAtNDgzNC04ZDIwLWFiYTVmNTk5ZjcyMiJ9" width="900" height="900" viewBox="0 0 900 900">
<path style="fill: #00f030; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.853 35 7.705 35 13.153 L35 243.847 Q35 249.295 32.365 253.147 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.147 0 249.295 0 243.847 L0 13.153 Q0 7.705 2.635 3.853 5.269 0 8.995 0 z" transform="matrix(4.977864475112508,0,0,3.404153434617114,29.669142962713487,16.795245601990594)"/>
<path style="fill: #00f030; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.92 35 7.84 35 13.384 L35 243.616 Q35 249.16 32.365 253.08 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.08 0 249.16 0 243.616 L0 13.384 Q0 7.84 2.635 3.92 5.269 0 8.995 0 z" transform="matrix(5.065187678165422,0,0,3.404153434617114,250.1333123837802,15.795245601990592)"/>
<path style="fill: #00f030; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.876 35 7.753 35 13.235 L35 243.765 Q35 249.247 32.365 253.124 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.124 0 249.247 0 243.765 L0 13.235 Q0 7.753 2.635 3.876 5.269 0 8.995 0 z" transform="matrix(5.008718778985926,0,0,3.404153434617114,474.7988544546613,14.795245601990594)"/>
<path style="fill: #f06000; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.597 35 7.193 35 12.279 L35 244.721 Q35 249.807 32.365 253.403 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.403 0 249.807 0 244.721 L0 12.279 Q0 7.193 2.635 3.597 5.269 0 8.995 0 z" transform="matrix(4.6470855375608195,0,0,3.404153434617114,693.4017788147986,15.795245601990594)"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

BIN
build/client/logo96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

View File

@@ -23,9 +23,9 @@ const index = 0;
let component_cache;
const component = async () => component_cache ??= (await import('./_layout.svelte-5d2a766d.js')).default;
const server_id = "src/routes/+layout.server.js";
const imports = ["_app/immutable/nodes/0.e272f076.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js","_app/immutable/chunks/globals.7f7f1b26.js","_app/immutable/chunks/index.cab2b962.js","_app/immutable/chunks/utils.9739163d.js","_app/immutable/chunks/index.7ea6c3d8.js"];
const stylesheets = ["_app/immutable/assets/0.ffa5bed3.css"];
const imports = ["_app/immutable/nodes/0.c41bf379.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js","_app/immutable/chunks/globals.7f7f1b26.js","_app/immutable/chunks/index.cab2b962.js","_app/immutable/chunks/utils.9739163d.js","_app/immutable/chunks/index.7ea6c3d8.js"];
const stylesheets = ["_app/immutable/assets/0.7f04db4e.css"];
const fonts = [];
export { component, fonts, imports, index, _layout_server as server, server_id, stylesheets };
//# sourceMappingURL=0-47eda199.js.map
//# sourceMappingURL=0-8bac6565.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"0-47eda199.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_layout.server.js","../../../.svelte-kit/adapter-node/nodes/0.js"],"sourcesContent":["import fs from \"fs-extra\";\nimport { p as public_env } from \"../../chunks/shared-server.js\";\nasync function load({ params, route, url, cookies }) {\n let site = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/site.json\", \"utf8\"));\n let localTz = \"GMT\";\n const localTzCookie = cookies.get(\"localTz\");\n if (!!localTzCookie) {\n localTz = localTzCookie;\n }\n return {\n site,\n localTz\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/_layout.server.js';\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/+layout.server.js\";\nexport const imports = [\"_app/immutable/nodes/0.e272f076.js\",\"_app/immutable/chunks/scheduler.ea4d12df.js\",\"_app/immutable/chunks/index.12c4b772.js\",\"_app/immutable/chunks/globals.7f7f1b26.js\",\"_app/immutable/chunks/index.cab2b962.js\",\"_app/immutable/chunks/utils.9739163d.js\",\"_app/immutable/chunks/index.7ea6c3d8.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.ffa5bed3.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;AAEA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;AACrD,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAChG,EAAE,IAAI,OAAO,GAAG,KAAK,CAAC;AACtB,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE;AACvB,IAAI,OAAO,GAAG,aAAa,CAAC;AAC5B,GAAG;AACH,EAAE,OAAO;AACT,IAAI,IAAI;AACR,IAAI,OAAO;AACX,GAAG,CAAC;AACJ;;;;;;;ACXY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8BAAoC,CAAC,EAAE,QAAQ;AAE1G,MAAC,SAAS,GAAG,+BAA+B;AAC5C,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,yCAAyC,CAAC,yCAAyC,CAAC,yCAAyC,EAAE;AACpT,MAAC,WAAW,GAAG,CAAC,sCAAsC,EAAE;AACxD,MAAC,KAAK,GAAG;;;;"}
{"version":3,"file":"0-8bac6565.js","sources":["../../../.svelte-kit/adapter-node/entries/pages/_layout.server.js","../../../.svelte-kit/adapter-node/nodes/0.js"],"sourcesContent":["import fs from \"fs-extra\";\nimport { p as public_env } from \"../../chunks/shared-server.js\";\nasync function load({ params, route, url, cookies }) {\n let site = JSON.parse(fs.readFileSync(public_env.PUBLIC_KENER_FOLDER + \"/site.json\", \"utf8\"));\n let localTz = \"GMT\";\n const localTzCookie = cookies.get(\"localTz\");\n if (!!localTzCookie) {\n localTz = localTzCookie;\n }\n return {\n site,\n localTz\n };\n}\nexport {\n load\n};\n","import * as server from '../entries/pages/_layout.server.js';\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport { server };\nexport const server_id = \"src/routes/+layout.server.js\";\nexport const imports = [\"_app/immutable/nodes/0.c41bf379.js\",\"_app/immutable/chunks/scheduler.ea4d12df.js\",\"_app/immutable/chunks/index.12c4b772.js\",\"_app/immutable/chunks/globals.7f7f1b26.js\",\"_app/immutable/chunks/index.cab2b962.js\",\"_app/immutable/chunks/utils.9739163d.js\",\"_app/immutable/chunks/index.7ea6c3d8.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.7f04db4e.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":";;;AAEA,eAAe,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;AACrD,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,mBAAmB,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAChG,EAAE,IAAI,OAAO,GAAG,KAAK,CAAC;AACtB,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC/C,EAAE,IAAI,CAAC,CAAC,aAAa,EAAE;AACvB,IAAI,OAAO,GAAG,aAAa,CAAC;AAC5B,GAAG;AACH,EAAE,OAAO;AACT,IAAI,IAAI;AACR,IAAI,OAAO;AACX,GAAG,CAAC;AACJ;;;;;;;ACXY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8BAAoC,CAAC,EAAE,QAAQ;AAE1G,MAAC,SAAS,GAAG,+BAA+B;AAC5C,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,yCAAyC,CAAC,yCAAyC,CAAC,yCAAyC,EAAE;AACpT,MAAC,WAAW,GAAG,CAAC,sCAAsC,EAAE;AACxD,MAAC,KAAK,GAAG;;;;"}

View File

@@ -1,9 +1,9 @@
const index = 1;
let component_cache;
const component = async () => component_cache ??= (await import('./error.svelte-f1948e50.js')).default;
const imports = ["_app/immutable/nodes/1.e505f248.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js","_app/immutable/chunks/singletons.2cc3b0bd.js","_app/immutable/chunks/index.7ea6c3d8.js"];
const imports = ["_app/immutable/nodes/1.ae816ce0.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js","_app/immutable/chunks/singletons.e4f99468.js","_app/immutable/chunks/index.7ea6c3d8.js"];
const stylesheets = [];
const fonts = [];
export { component, fonts, imports, index, stylesheets };
//# sourceMappingURL=1-ca636c7a.js.map
//# sourceMappingURL=1-54dc7c70.js.map

View File

@@ -1 +1 @@
{"version":3,"file":"1-ca636c7a.js","sources":["../../../.svelte-kit/adapter-node/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.e505f248.js\",\"_app/immutable/chunks/scheduler.ea4d12df.js\",\"_app/immutable/chunks/index.12c4b772.js\",\"_app/immutable/chunks/singletons.2cc3b0bd.js\",\"_app/immutable/chunks/index.7ea6c3d8.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAsC,CAAC,EAAE,QAAQ;AAC5G,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,8CAA8C,CAAC,yCAAyC,EAAE;AACnO,MAAC,WAAW,GAAG,GAAG;AAClB,MAAC,KAAK,GAAG;;;;"}
{"version":3,"file":"1-54dc7c70.js","sources":["../../../.svelte-kit/adapter-node/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.ae816ce0.js\",\"_app/immutable/chunks/scheduler.ea4d12df.js\",\"_app/immutable/chunks/index.12c4b772.js\",\"_app/immutable/chunks/singletons.e4f99468.js\",\"_app/immutable/chunks/index.7ea6c3d8.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG,EAAE;AACvB,IAAI,eAAe,CAAC;AACR,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,4BAAsC,CAAC,EAAE,QAAQ;AAC5G,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,6CAA6C,CAAC,yCAAyC,CAAC,8CAA8C,CAAC,yCAAyC,EAAE;AACnO,MAAC,WAAW,GAAG,GAAG;AAClB,MAAC,KAAK,GAAG;;;;"}

View File

@@ -141,11 +141,11 @@ var _page_server = /*#__PURE__*/Object.freeze({
const index = 2;
let component_cache;
const component = async () => component_cache ??= (await import('./_page.svelte-eb89b3f3.js')).default;
const component = async () => component_cache ??= (await import('./_page.svelte-5fa31107.js')).default;
const server_id = "src/routes/+page.server.js";
const imports = ["_app/immutable/nodes/2.e440eff2.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js","_app/immutable/chunks/globals.7f7f1b26.js","_app/immutable/chunks/index.b3676155.js","_app/immutable/chunks/utils.9739163d.js","_app/immutable/chunks/incident.07f56014.js","_app/immutable/chunks/index.cab2b962.js","_app/immutable/chunks/index.7ea6c3d8.js"];
const imports = ["_app/immutable/nodes/2.1c032969.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js","_app/immutable/chunks/globals.7f7f1b26.js","_app/immutable/chunks/index.b3676155.js","_app/immutable/chunks/utils.9739163d.js","_app/immutable/chunks/incident.07f56014.js","_app/immutable/chunks/index.cab2b962.js","_app/immutable/chunks/index.7ea6c3d8.js"];
const stylesheets = [];
const fonts = [];
export { component, fonts, imports, index, _page_server as server, server_id, stylesheets };
//# sourceMappingURL=2-bf8356c0.js.map
//# sourceMappingURL=2-a75cfff7.js.map

File diff suppressed because one or more lines are too long

View File

@@ -44,9 +44,9 @@ const Monitor = create_ssr_component(($$result, $$props, $$bindings, slots) => {
$$bindings.monitor(monitor);
return `<section class="mx-auto backdrop-blur-[2px] mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center">${validate_component(Card, "Card.Root").$$render($$result, { class: "w-full" }, {}, {
default: () => {
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "pb-4" }, {}, {
return `${validate_component(Card_content, "Card.Content").$$render($$result, { class: "pb-4 pt-2" }, {}, {
default: () => {
return `<div class="grid grid-cols-12 gap-4"><div class="col-span-12 md:col-span-4"><div class="pt-3"><div class="scroll-m-20 text-2xl font-semibold tracking-tight">${monitor.image ? `<img${add_attribute("src", monitor.image, 0)} class="w-6 h-6 inline" alt="" srcset="">` : ``} ${escape(monitor.name)} ${monitor.description ? `${validate_component(Root, "HoverCard.Root").$$render($$result, {}, {}, {
return `<div class="grid grid-cols-12 gap-4"><div class="col-span-12 md:col-span-4"><div class="pt-1"><div class="scroll-m-20 text-2xl font-semibold tracking-tight">${monitor.image ? `<img${add_attribute("src", monitor.image, 0)} class="w-6 h-6 inline" alt="" srcset="">` : ``} ${escape(monitor.name)} ${monitor.description ? `${validate_component(Root, "HoverCard.Root").$$render($$result, {}, {}, {
default: () => {
return `${validate_component(Trigger, "HoverCard.Trigger").$$render($$result, {}, {}, {
default: () => {
@@ -58,7 +58,7 @@ const Monitor = create_ssr_component(($$result, $$props, $$bindings, slots) => {
}
})}`;
}
})}` : ``}</div></div> ${`<div class="mt-2"><div class="grid grid-cols-2 gap-0"><div class="col-span-2 -mt-2"><a href="${"/incident/" + escape(monitor.folderName, true) + "#past_incident"}" class="${"pt-0 pl-0 pb-0 text-indigo-500 text-left " + escape(buttonVariants({ variant: "link" }), true)}">Recent Incidents ${validate_component(ArrowRight, "ArrowRight").$$render($$result, { size: 16 }, {}, {})}</a></div></div></div>`}</div> <div class="col-span-12 md:col-span-8 pt-2">${`<div class="grid grid-cols-12 "><div class="col-span-12 md:col-span-8 h-[32px]"><a href="javascript:void(0);">${validate_component(Badge, "Badge").$$render(
})}` : ``}</div></div> ${`<div class="mt-2"><div class="grid grid-cols-2 gap-0"><div class="col-span-2 -mt-2"><a href="${"/incident/" + escape(monitor.folderName, true) + "#past_incident"}" class="${"pt-0 pl-0 pb-0 text-indigo-500 text-left " + escape(buttonVariants({ variant: "link" }), true)}">Recent Incidents ${validate_component(ArrowRight, "ArrowRight").$$render($$result, { size: 16 }, {}, {})}</a></div></div></div>`}</div> <div class="col-span-12 md:col-span-8 pt-2">${`<div class="grid grid-cols-12"><div class="col-span-12 md:col-span-8 h-[32px]"><a href="javascript:void(0);">${validate_component(Badge, "Badge").$$render(
$$result,
{
variant: ""
@@ -124,4 +124,4 @@ const Page = create_ssr_component(($$result, $$props, $$bindings, slots) => {
});
export { Page as default };
//# sourceMappingURL=_page.svelte-eb89b3f3.js.map
//# sourceMappingURL=_page.svelte-5fa31107.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -99,7 +99,7 @@ const options = {
root: Root,
service_worker: false,
templates: {
app: ({ head, body, assets: assets2, nonce, env }) => '<!DOCTYPE html>\n<html lang="en" class="dark dark:bg-background">\n <head>\n <meta charset="utf-8" />\n <link rel="icon" id="kener-app-favicon" href="/k96.png" />\n <meta name="viewport" content="width=device-width, initial-scale=1" />\n ' + head + '\n </head>\n <body data-sveltekit-preload-data="hover">\n <div style="display: contents">' + body + "</div>\n </body>\n</html>\n",
app: ({ head, body, assets: assets2, nonce, env }) => '<!DOCTYPE html>\n<html lang="en" class="dark dark:bg-background">\n <head>\n <meta charset="utf-8" />\n <link rel="icon" id="kener-app-favicon" href="/logo96.png" />\n <meta name="viewport" content="width=device-width, initial-scale=1" />\n\n <!-- Google tag (gtag.js) -->\n <script async src="https://www.googletagmanager.com/gtag/js?id=G-Q3MLRXCBFT"><\/script>\n <script>\n window.dataLayer = window.dataLayer || [];\n function gtag() {\n dataLayer.push(arguments);\n }\n gtag("js", new Date());\n\n gtag("config", "G-Q3MLRXCBFT");\n <\/script>\n\n ' + head + '\n </head>\n <body data-sveltekit-preload-data="hover">\n <div style="display: contents">' + body + "</div>\n </body>\n</html>\n",
error: ({ status, message }) => '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="utf-8" />\n <title>' + message + `</title>
<style>
@@ -171,7 +171,7 @@ const options = {
<div class="error">
<span class="status">` + status + '</span>\n <div class="message">\n <h1>' + message + "</h1>\n </div>\n </div>\n </body>\n</html>\n"
},
version_hash: "y8a47k"
version_hash: "fcreex"
};
function get_hooks() {
return {};

File diff suppressed because one or more lines are too long

View File

@@ -7,14 +7,14 @@ function __memo(fn) {
return {
appDir: "_app",
appPath: "_app",
assets: new Set([".DS_Store","confetti.gif","earth.png","favicon.png","google.png","issue.png","k512.png","k96.png","kener/cashfree-payments.0day.utc.json","kener/cashfree-payouts.0day.utc.json","kener/earth.0day.utc.json","kener/google-search.0day.utc.json","kener/monitors.json","kener/site.json","kener/svelte-website.0day.utc.json","kener.png","logo.svg","logo_hero.png","robots.txt","ss.png","ss2.png","ss3.png","svelte.svg"]),
mimeTypes: {".gif":"image/gif",".png":"image/png",".json":"application/json",".svg":"image/svg+xml",".txt":"text/plain"},
assets: new Set([".DS_Store","confetti.gif","earth.png","google.png","kener/cashfree-payments.0day.utc.json","kener/cashfree-payouts.0day.utc.json","kener/earth.0day.utc.json","kener/google-search.0day.utc.json","kener/monitors.json","kener/site.json","kener/svelte-website.0day.utc.json","logo.png","logo96.png","robots.txt","ss.png","ss2.png","ss3.png","svelte.svg"]),
mimeTypes: {".gif":"image/gif",".png":"image/png",".json":"application/json",".txt":"text/plain",".svg":"image/svg+xml"},
_: {
client: {"start":"_app/immutable/entry/start.f8e9e549.js","app":"_app/immutable/entry/app.dc715562.js","imports":["_app/immutable/entry/start.f8e9e549.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/singletons.2cc3b0bd.js","_app/immutable/chunks/index.7ea6c3d8.js","_app/immutable/entry/app.dc715562.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js"],"stylesheets":[],"fonts":[]},
client: {"start":"_app/immutable/entry/start.0227d5dd.js","app":"_app/immutable/entry/app.016ea590.js","imports":["_app/immutable/entry/start.0227d5dd.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/singletons.e4f99468.js","_app/immutable/chunks/index.7ea6c3d8.js","_app/immutable/entry/app.016ea590.js","_app/immutable/chunks/scheduler.ea4d12df.js","_app/immutable/chunks/index.12c4b772.js"],"stylesheets":[],"fonts":[]},
nodes: [
__memo(() => import('./chunks/0-47eda199.js')),
__memo(() => import('./chunks/1-ca636c7a.js')),
__memo(() => import('./chunks/2-bf8356c0.js')),
__memo(() => import('./chunks/0-8bac6565.js')),
__memo(() => import('./chunks/1-54dc7c70.js')),
__memo(() => import('./chunks/2-a75cfff7.js')),
__memo(() => import('./chunks/3-17bd4bcd.js')),
__memo(() => import('./chunks/4-7b9a345a.js'))
],

File diff suppressed because one or more lines are too long

View File

@@ -1,29 +1,29 @@
title: "Kener"
theme: "dark"
siteURL: "https://kener.netlify.app"
home: "/"
logo: "/kener.png"
favicon: "/kener.png"
github:
owner: "rajnandan1"
repo: "kener"
incidentSince: 48
metaTags:
description: "Kener: An open-source Node.js status page application for real-time service monitoring, incident management, and customizable reporting. Simplify service outage tracking, enhance incident communication, and ensure a seamless user experience."
keywords: "Node.js application, Open-source status page, Service monitoring tool, Real-time incident management, Customizable reporting, Service outage tracker, User-friendly dashboard, Incident communication platform, Scalable monitoring solution, Community-driven software, Website status tracker, Incident response tool, System status monitoring, Service reliability management, Incident alert system"
og:description: "Kener: An open-source Node.js status page application for real-time service monitoring, incident management, and customizable reporting. Simplify service outage tracking, enhance incident communication, and ensure a seamless user experience."
description: "Kener: Open-source Node.js status page tool, designed to make service monitoring and incident handling a breeze. It offers a sleek and user-friendly interface that simplifies tracking service outages and improves how we communicate during incidents. And the best part? Kener integrates seamlessly with GitHub, making incident management a team effort—making it easier for us to track and fix issues together in a collaborative and friendly environment."
keywords: "Node.js status page, Incident management tool, Service monitoring, Service outage tracking, Real-time status updates, GitHub integration for incidents, Open-source status page, Node.js monitoring application, Service reliability, User-friendly incident management, Collaborative incident resolution, Seamless outage communication, Service disruption tracker, Real-time incident alerts, Node.js status reporting"
og:description: "Kener: Open-source Node.js status page tool, designed to make service monitoring and incident handling a breeze. It offers a sleek and user-friendly interface that simplifies tracking service outages and improves how we communicate during incidents. And the best part? Kener integrates seamlessly with GitHub, making incident management a team effort—making it easier for us to track and fix issues together in a collaborative and friendly environment."
og:image: "/ss.png"
og:title: "Kener - Open-Source Node.js Status Page: Real-Time Incident Management & Monitoring"
og:title: "Kener - Open-Source Node.js Status Page: Kener: Streamlined Node.js Status Page for Effortless Incident Management"
og:type: "website"
og:site_name: "Kener"
twitter:card: "summary_large_image"
twitter:site: "@_rajnandan_"
twitter:creator: "@_rajnandan_"
twitter:image: "/ss.png"
twitter:title: "Kener - Open-Source Node.js Status Page: Real-Time Incident Management & Monitoring"
twitter:description: "Kener: An open-source Node.js status page application for real-time service monitoring, incident management, and customizable reporting. Simplify service outage tracking, enhance incident communication, and ensure a seamless user experience."
twitter:title: "Kener: Streamlined Node.js Status Page for Effortless Incident Management"
twitter:description: "Kener: Open-source Node.js status page tool, designed to make service monitoring and incident handling a breeze. It offers a sleek and user-friendly interface that simplifies tracking service outages and improves how we communicate during incidents. And the best part? Kener integrates seamlessly with GitHub, making incident management a team effort—making it easier for us to track and fix issues together in a collaborative and friendly environment."
nav:
- name: "Documentation"
url: "/docs"
- name: "Github"
url: "https://github.com/rajnandan1/kener"
hero:
title: Kener is a Open-Source Status Page System
subtitle: Let your users know what's going on.

View File

@@ -7,6 +7,7 @@ Kener has been tested from Node18.
## Clone the repository
```bash
git clone https://github.com/rajnandan1/kener.git
cd kener
```
## Install Dependencies
@@ -18,6 +19,11 @@ npm install
- Rename `config/site.example.yaml` -> `config/site.yaml`
- Rename `config/monitors.example.yaml` -> `config/monitors.yaml`
```shell
mv config/site.example.yaml config/site.yaml
mv config/monitors.example.yaml config/monitors.yaml
```
## Start Kener Dev
```bash
npm run kener:dev

View File

@@ -2,8 +2,21 @@
<html lang="en" class="dark dark:bg-background">
<head>
<meta charset="utf-8" />
<link rel="icon" id="kener-app-favicon" href="/k96.png" />
<link rel="icon" id="kener-app-favicon" href="/logo96.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-Q3MLRXCBFT"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "G-Q3MLRXCBFT");
</script>
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">

View File

@@ -11,9 +11,6 @@
import { buttonVariants } from "$lib/components/ui/button";
import * as Alert from "$lib/components/ui/alert";
export let monitor;
let _0Day = monitor.pageData._0Day;
@@ -28,128 +25,117 @@
let todayDD = Object.keys(_90Day)[Object.keys(_90Day).length - 1];
let view = "90day";
function switchView(s) {
view = s;
}
onMount(async () => {
});
onMount(async () => {});
</script>
<section class="mx-auto backdrop-blur-[2px] mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center">
<section class="mx-auto backdrop-blur-[2px] mb-8 flex w-full max-w-[890px] flex-1 flex-col items-start justify-center">
<Card.Root class="w-full">
<Card.Content class="pb-4">
<div class="grid grid-cols-12 gap-4">
<div class="col-span-12 md:col-span-4">
<div class="pt-3">
<div class="scroll-m-20 text-2xl font-semibold tracking-tight">
{#if monitor.image}
<img src="{monitor.image}" class="w-6 h-6 inline" alt="" srcset="">
{/if}
{monitor.name}
{#if monitor.description}
<HoverCard.Root>
<HoverCard.Trigger>
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide inline lucide-info"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>
</HoverCard.Trigger>
<HoverCard.Content class="dark:invert">
{monitor.description}
</HoverCard.Content>
</HoverCard.Root>
{/if}
</div>
</div>
{#if !loading90}
<div class="mt-2">
<div class="grid grid-cols-2 gap-0">
<div class="col-span-2 -mt-2">
<a href="/incident/{monitor.folderName}#past_incident" class="pt-0 pl-0 pb-0 text-indigo-500 text-left {buttonVariants({ variant: 'link' })}">
Recent Incidents <ArrowRight size="{16}" />
</a>
</div>
</div>
</div>
{/if}
</div>
<div class="col-span-12 md:col-span-8 pt-2">
{#if loading90}
<Skeleton class="w-full h-[40px] mt-[7px]" />
{:else}
<div class="grid grid-cols-12 ">
<div class="col-span-12 md:col-span-8 h-[32px]">
<a href="javascript:void(0);" on:click="{(e) => {switchView('90day')}}">
<Badge variant="{view != '90day' ? 'outline' : ''}">
90 Day ► {uptime90Day}%
</Badge>
</a>
<a href="javascript:void(0);" on:click="{(e) => {switchView('0day')}}">
<Badge variant="{view != '0day' ? 'outline' : ''}" >
Today ► {uptime0Day}%
</Badge>
</a>
</div>
<div class="col-span-12 md:col-span-4 text-right h-[32px]">
{#if _90Day[todayDD]}
<div class="text-api-up text-sm font-semibold mt-[4px] text-{_90Day[todayDD].cssClass}">
{_90Day[todayDD].message}
</div>
{/if}
</div>
</div>
<div class="grid grid-cols-12">
{#if view == "90day"}
<div class="chart-status relative mt-1 col-span-12">
<div class="flex flex-wrap">
{#each Object.entries(_90Day) as [ts, bar]}
<div class="h-[30px] w-[6px] rounded-sm oneline">
<div class="h-[30px] bg-{bar.cssClass} w-[4px] rounded-sm mr-[2px]"></div>
</div>
<div class="absolute show-hover text-sm bg-background">
<div class="text-{bar.cssClass} font-semibold" >
{#if bar.message != "No Data"}
{new Date(bar.timestamp * 1000).toLocaleDateString()} {bar.message}
{:else}
{new Date(bar.timestamp * 1000).toLocaleDateString()} {bar.message}
{/if}
</div>
</div>
{/each}
</div>
</div>
{:else}
<div class="chart-status relative mt-1 mb-4 col-span-12">
<div class="flex flex-wrap today-sq-div ">
{#each Object.entries(_0Day) as [ts, bar] }
<div data-index="{bar.index}" class="h-[10px] bg-{bar.cssClass} w-[10px] today-sq m-[1px]" >
</div>
<div class="hiddenx relative">
<div data-index="{ts.index}" class=" p-2 text-sm rounded font-semibold message bg-black text-white border ">
<p><span class="text-{bar.cssClass}"></span> {new Date(bar.timestamp * 1000).toLocaleTimeString()}</p>
{#if bar.status != 'NO_DATA'}
<p class="pl-4">{bar.status}</p>
{:else}
<p class="pl-4">-</p>
{/if}
</div>
</div>
{/each}
</div>
</div>
{/if}
</div>
{/if}
</div>
</div>
<Card.Content class="pb-4 pt-2">
<div class="grid grid-cols-12 gap-4">
<div class="col-span-12 md:col-span-4">
<div class="pt-1">
<div class="scroll-m-20 text-2xl font-semibold tracking-tight">
{#if monitor.image}
<img src="{monitor.image}" class="w-6 h-6 inline" alt="" srcset="" />
{/if} {monitor.name} {#if monitor.description}
<HoverCard.Root>
<HoverCard.Trigger>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
class="lucide inline lucide-info"
>
<circle cx="12" cy="12" r="10" />
<path d="M12 16v-4" />
<path d="M12 8h.01" />
</svg>
</HoverCard.Trigger>
<HoverCard.Content class="dark:invert"> {monitor.description} </HoverCard.Content>
</HoverCard.Root>
{/if}
</div>
</div>
{#if !loading90}
<div class="mt-2">
<div class="grid grid-cols-2 gap-0">
<div class="col-span-2 -mt-2">
<a href="/incident/{monitor.folderName}#past_incident" class="pt-0 pl-0 pb-0 text-indigo-500 text-left {buttonVariants({ variant: 'link' })}">
Recent Incidents <ArrowRight size="{16}" />
</a>
</div>
</div>
</div>
{/if}
</div>
<div class="col-span-12 md:col-span-8 pt-2">
{#if loading90}
<Skeleton class="w-full h-[40px] mt-[7px]" />
{:else}
<div class="grid grid-cols-12">
<div class="col-span-12 md:col-span-8 h-[32px]">
<a href="javascript:void(0);" on:click="{(e) => {switchView('90day')}}">
<Badge variant="{view != '90day' ? 'outline' : ''}"> 90 Day ► {uptime90Day}% </Badge>
</a>
<a href="javascript:void(0);" on:click="{(e) => {switchView('0day')}}">
<Badge variant="{view != '0day' ? 'outline' : ''}"> Today ► {uptime0Day}% </Badge>
</a>
</div>
<div class="col-span-12 md:col-span-4 text-right h-[32px]">
{#if _90Day[todayDD]}
<div class="text-api-up text-sm font-semibold mt-[4px] text-{_90Day[todayDD].cssClass}">{_90Day[todayDD].message}</div>
{/if}
</div>
</div>
<div class="grid grid-cols-12">
{#if view == "90day"}
<div class="chart-status relative mt-1 col-span-12">
<div class="flex flex-wrap">
{#each Object.entries(_90Day) as [ts, bar]}
<div class="h-[30px] w-[6px] rounded-sm oneline">
<div class="h-[30px] bg-{bar.cssClass} w-[4px] rounded-sm mr-[2px]"></div>
</div>
<div class="absolute show-hover text-sm bg-background">
<div class="text-{bar.cssClass} font-semibold">
{#if bar.message != "No Data"} {new Date(bar.timestamp * 1000).toLocaleDateString()} {bar.message} {:else}{new Date(bar.timestamp *
1000).toLocaleDateString()} {bar.message} {/if}
</div>
</div>
{/each}
</div>
</div>
{:else}
<div class="chart-status relative mt-1 mb-4 col-span-12">
<div class="flex flex-wrap today-sq-div">
{#each Object.entries(_0Day) as [ts, bar] }
<div data-index="{bar.index}" class="h-[10px] bg-{bar.cssClass} w-[10px] today-sq m-[1px]"></div>
<div class="hiddenx relative">
<div data-index="{ts.index}" class="p-2 text-sm rounded font-semibold message bg-black text-white border">
<p><span class="text-{bar.cssClass}"></span> {new Date(bar.timestamp * 1000).toLocaleTimeString()}</p>
{#if bar.status != 'NO_DATA'}
<p class="pl-4">{bar.status}</p>
{:else}
<p class="pl-4">-</p>
{/if}
</div>
</div>
{/each}
</div>
</div>
{/if}
</div>
{/if}
</div>
</div>
</Card.Content>
</Card.Root>
</section>
</section>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

BIN
static/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: SketchAPI 2022.10.18.0 https://api.sketch.io -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketchjs="https://sketch.io/dtd/" sketchjs:metadata="eyJuYW1lIjoiYjQwOWRlZmQtOTc1Zi00MDhjLTljN2QtZWE4MTU3YmMwYWU4LnNrZXRjaHBhZCIsInN1cmZhY2UiOnsiaXNQYWludCI6dHJ1ZSwibWV0aG9kIjoiZmlsbCIsImJsZW5kIjoibm9ybWFsIiwiZW5hYmxlZCI6dHJ1ZSwib3BhY2l0eSI6MSwidHlwZSI6InBhdHRlcm4iLCJwYXR0ZXJuIjp7InR5cGUiOiJwYXR0ZXJuIiwicmVmbGVjdCI6Im5vLXJlZmxlY3QiLCJyZXBlYXQiOiJyZXBlYXQiLCJzbW9vdGhpbmciOmZhbHNlLCJzcmMiOiJ0cmFuc3BhcmVudExpZ2h0Iiwic3giOjEsInN5IjoxLCJ4MCI6MC41LCJ4MSI6MSwieTAiOjAuNSwieTEiOjF9LCJpc0ZpbGwiOnRydWV9LCJjbGlwUGF0aCI6eyJlbmFibGVkIjp0cnVlLCJzdHlsZSI6eyJzdHJva2VTdHlsZSI6ImJsYWNrIiwibGluZVdpZHRoIjoxfX0sImRlc2NyaXB0aW9uIjoiTWFkZSB3aXRoIFNrZXRjaHBhZCIsIm1ldGFkYXRhIjp7fSwiZXhwb3J0RFBJIjo3MiwiZXhwb3J0Rm9ybWF0IjoicG5nIiwiZXhwb3J0UXVhbGl0eSI6MC45NSwidW5pdHMiOiJweCIsIndpZHRoIjo5MDAsImhlaWdodCI6OTAwLCJwYWdlcyI6W3sid2lkdGgiOjkwMCwiaGVpZ2h0Ijo5MDB9XSwidXVpZCI6IjRiYmQ5NjRmLTdhNDAtNDgzNC04ZDIwLWFiYTVmNTk5ZjcyMiJ9" width="900" height="900" viewBox="0 0 900 900">
<path style="fill: #00f030; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.853 35 7.705 35 13.153 L35 243.847 Q35 249.295 32.365 253.147 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.147 0 249.295 0 243.847 L0 13.153 Q0 7.705 2.635 3.853 5.269 0 8.995 0 z" transform="matrix(4.977864475112508,0,0,3.404153434617114,29.669142962713487,16.795245601990594)"/>
<path style="fill: #00f030; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.92 35 7.84 35 13.384 L35 243.616 Q35 249.16 32.365 253.08 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.08 0 249.16 0 243.616 L0 13.384 Q0 7.84 2.635 3.92 5.269 0 8.995 0 z" transform="matrix(5.065187678165422,0,0,3.404153434617114,250.1333123837802,15.795245601990592)"/>
<path style="fill: #00f030; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.876 35 7.753 35 13.235 L35 243.765 Q35 249.247 32.365 253.124 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.124 0 249.247 0 243.765 L0 13.235 Q0 7.753 2.635 3.876 5.269 0 8.995 0 z" transform="matrix(5.008718778985926,0,0,3.404153434617114,474.7988544546613,14.795245601990594)"/>
<path style="fill: #f06000; mix-blend-mode: source-over; fill-opacity: 1; vector-effect: non-scaling-stroke;" sketchjs:tool="rectangle" d="M8.995 0 L26.005 0 Q29.731 0 32.365 3.597 35 7.193 35 12.279 L35 244.721 Q35 249.807 32.365 253.403 29.731 257 26.005 257 L8.995 257 Q5.269 257 2.635 253.403 0 249.807 0 244.721 L0 12.279 Q0 7.193 2.635 3.597 5.269 0 8.995 0 z" transform="matrix(4.6470855375608195,0,0,3.404153434617114,693.4017788147986,15.795245601990594)"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/logo96.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB