Build 0.0.1
12
README.md
@@ -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)
|
||||

|
||||
|
||||
## 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
|
||||
|
||||
@@ -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};
|
||||
@@ -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};
|
||||
@@ -1 +1 @@
|
||||
{"version":"1703266032663"}
|
||||
{"version":"1703269613365"}
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 112 KiB |
BIN
build/client/logo.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
@@ -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
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 313 KiB |
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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;;;;"}
|
||||
@@ -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
|
||||
@@ -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
|
||||
1
build/server/chunks/_page.svelte-5fa31107.js.map
Normal 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 {};
|
||||
|
||||
@@ -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'))
|
||||
],
|
||||
|
||||
@@ -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.
|
||||
|
||||
6
docs.md
@@ -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
|
||||
|
||||
15
src/app.html
@@ -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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
BIN
static/issue.png
|
Before Width: | Height: | Size: 6.8 KiB |
BIN
static/k512.png
|
Before Width: | Height: | Size: 19 KiB |
BIN
static/k96.png
|
Before Width: | Height: | Size: 2.0 KiB |
BIN
static/kener.png
|
Before Width: | Height: | Size: 112 KiB |
BIN
static/logo.png
Normal file
|
After Width: | Height: | Size: 3.7 KiB |
@@ -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
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 313 KiB |