Compare commits

...

5 Commits

10 changed files with 855 additions and 4 deletions

View File

@ -3,6 +3,25 @@ name = "janky"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[[bin]]
name = "janky-server"
path = "src/server/main.rs"
[[bin]]
name = "janky-agent"
path = "src/agent/main.rs"
[dependencies]
async-std = { version = "1", features = ["attributes"] }
chrono = "0.4.15"
serde = { version = "1.0", features = ["derive"] }
dotenv = "~0.15.0"
driftwood = "0"
handlebars = { version = "~3.4.0", features = ["dir_source"] }
html-escape = "~0.2.6"
log = "~0.4.8"
pretty_env_logger = "~0.3.1"
serde_json = "~1.0.0"
sqlx = { version = "~0.5.1", features = ["chrono", "json", "migrate", "offline", "sqlite", "uuid", "runtime-async-std-rustls"] }
tide = "0"
uuid = { version = "~0.8.1", features = ["v4", "serde"]}

View File

@ -3,3 +3,38 @@
Janky is a simple CI system built in Rust. This is performative coding and not
intended to be a production system you can actually use.
* Two binaries:
* `janky-server`
* Listens HTTP
* Does web shit
* Interacts with agents
* `janky-agent`:
* Run workloads
* Listen HTTP
* executes commands
[source]
----
┌────────┐ │ │http
│ │sqlite3 │ Agent │ws
│ Server │http │ │
│ │ws └──────┬─────┘
└───┬────┘ │
│ │
│ What are your caps? │
├──────────────────────────────────────────────────►│
│ │
│ │
│ git,svn,bash,rustc,cargo,websocket │
│◄──────────────────────────────────────────────────┤
│ │
│ great, here's some commands │
├──────────────────────────────────────────────────►│
│ │
│ │
│ kewl, here's the logs, id, etc │
│◄──────────────────────────────────────────────────┤
│ │
----

View File

@ -0,0 +1,10 @@
CREATE TABLE agents (
id SERIAL PRIMARY KEY,
uuid UUID NOT NULL UNIQUE,
name TEXT NOT NULL,
capabilities TEXT,
url TEXT NOT NUll,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE UNIQUE INDEX uuid_idx ON agents(uuid);

4
src/agent/main.rs Normal file
View File

@ -0,0 +1,4 @@
fn main() {
println!("Janky agent!");
todo!();
}

View File

@ -1,3 +0,0 @@
fn main() {
println!("Hello, world!");
}

131
src/server/main.rs Normal file
View File

@ -0,0 +1,131 @@
/*
* This is the main Janky entrypoint for the server"
*/
#[macro_use]
extern crate serde_json;
use async_std::sync::{Arc, RwLock};
use dotenv::dotenv;
use handlebars::Handlebars;
use log::*;
use sqlx::SqlitePool;
#[derive(Clone, Debug)]
pub struct AppState<'a> {
pub db: SqlitePool,
hb: Arc<RwLock<Handlebars<'a>>>,
}
impl AppState<'_> {
fn new(db: SqlitePool) -> Self {
Self {
db: db,
hb: Arc::new(RwLock::new(Handlebars::new())),
}
}
pub async fn register_templates(&self) -> Result<(), handlebars::TemplateFileError> {
let mut hb = self.hb.write().await;
hb.clear_templates();
hb.register_templates_directory(".hbs", "views")
}
pub async fn render(
&self,
name: &str,
data: &serde_json::Value,
) -> Result<tide::Body, tide::Error> {
/*
* In debug mode, reload the templates on ever render to avoid
* needing a restart
*/
#[cfg(debug_assertions)]
{
self.register_templates().await;
}
let hb = self.hb.read().await;
let view = hb.render(name, data)?;
Ok(tide::Body::from_string(view))
}
}
/**
* The routes module contains all the tide routes and the logic to fulfill the responses for each
* route.
*
* Modules are nested for cleaner organization here
*/
mod routes {
use crate::AppState;
use log::*;
use std::collections::HashMap;
use tide::{Body, Request, StatusCode};
use uuid::Uuid;
/**
* GET /
*/
pub async fn index(req: Request<AppState<'_>>) -> Result<Body, tide::Error> {
let params = json!({
"page": "home"
});
let mut body = req.state().render("index", &params).await?;
body.set_mime("text/html");
Ok(body)
}
pub mod api {
use log::*;
use tide::{Body, Request, Response, StatusCode};
use crate::AppState;
}
}
#[async_std::main]
async fn main() -> Result<(), tide::Error> {
pretty_env_logger::init();
dotenv().ok();
let database_url = std::env::var("DATABASE_URL").unwrap_or(":memory:".to_string());
let pool = SqlitePool::connect(&database_url).await?;
if database_url == ":memory:" {
sqlx::migrate!().run(&pool).await?;
}
let state = AppState::new(pool);
state.register_templates().await;
let mut app = tide::with_state(state);
#[cfg(not(debug_assertions))]
{
info!("Activating RELEASE mode configuration");
app.with(driftwood::ApacheCombinedLogger);
}
#[cfg(debug_assertions)]
{
info!("Activating DEBUG mode configuration");
info!("Enabling a very liberal CORS policy for debug purposes");
use tide::security::{CorsMiddleware, Origin};
let cors = CorsMiddleware::new()
.allow_methods(
"GET, POST, PUT, OPTIONS"
.parse::<tide::http::headers::HeaderValue>()
.unwrap(),
)
.allow_origin(Origin::from("*"))
.allow_credentials(false);
app.with(cors);
}
/*
* All builds will have apidocs, since they're handy
*/
app.at("/static").serve_dir("static/")?;
debug!("Configuring routes");
app.at("/").get(routes::index);
app.listen("0.0.0.0:8000").await?;
Ok(())
}

0
static/.gitignore vendored Normal file
View File

636
static/theme.css Normal file
View File

@ -0,0 +1,636 @@
[data-theme=dark], .app-theme-picker__picker[data-theme=dark] {
--dark-theme-bg-black: hsl(240, 6%, 10%);
--dark-theme-bg-dark: #222;
--dark-theme-bg-medium: #2d2b2b;
--dark-theme-bg-dark-grey: #333;
--dark-theme-bg-medium-grey: #444;
--dark-theme-bg-light-grey: #555;
--dark-theme-bg-very-light-grey: #444;
--background: hsl(240, 6%, 13%);
--very-light-grey: var(--dark-theme-bg-very-light-grey);
--light-grey: var(--dark-theme-bg-medium);
--medium-grey: var(--dark-theme-bg-medium-grey);
--white: var(--dark-theme-bg-dark-grey);
--black: var(--dark-theme-bg-light-grey);
--primary: #53c1ff;
/* Text */
--text-color: rgb(250, 250, 255);
--text-color-secondary: rgb(160, 160, 165);
--call-to-action-text-color: var(--dark-theme-bg-medium);
--call-to-action-link-color: var(--call-to-action-text-color);
/* Alerts */
--alert-success-text-color: #fff;
--alert-success-bg-color: #007e33;
--alert-success-border-color: var(--alert-success-bg-color);
--alert-info-text-color: #fff;
--alert-info-bg-color: #0099cc;
--alert-info-border-color: var(--alert-info-bg-color);
--alert-warning-text-color: #fff;
--alert-warning-bg-color: #ff8800;
--alert-warning-border-color: var(--alert-warning-bg-color);
--alert-danger-text-color: #fff;
--alert-danger-bg-color: #cc0000;
--alert-danger-border-color: var(--alert-danger-bg-color);
/* Buttons */
--btn-primary-bg: #53c1ff;
--btn-secondary-bg: var(--dark-theme-bg-dark);
--btn-secondary-color: var(--btn-primary-color);
--btn-link-bg--hover: var(--dark-theme-bg-dark-grey);
--btn-link-bg--active: var(--dark-theme-bg-dark-grey);
/* Help area */
--help-area-bg-color: var(--dark-theme-bg-dark-grey);
--configure-job-help-area-bg-color: var(--dark-theme-bg-dark);
/* Header */
--logo-bg: var(--dark-theme-bg-dark);
--brand-link-color: var(--primary);
--header-link-color: var(--text-color);
--header-link-color-active: var(--text-color);
--header-bg-classic: #000;
--search-bg: #4d545d;
--search-input-color: var(--text-color);
/* Breadcrumbs */
--breadcrumbs-bg: var(--dark-theme-bg-black);
--breadcrumbs-bg-color--hover: var(--dark-theme-bg-dark);
--breadcrumbs-text-color: var(--text-color);
--breadcrumbs-item-bg-color--hover: var(--dark-theme-bg-dark);
--breadcrumbs-border: var(--dark-theme-bg-dark-grey);
--breadcrumbs-bar-background: hsl(240, 6%, 9%, 0.8);
/* Footer */
--footer-background: hsl(240, 6%, 9%, 0.8);
/* Tooltips */
--tooltip-background: hsl(240, 6%, 23%);
--tooltip-backdrop-filter: contrast(0.6) saturate(4) brightness(0.4) blur(15px);
--tooltip-box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05),
0 0 8px 2px rgba(0, 0, 30, 0.05),
0 0 1px 1px rgba(0, 0, 20, 0.025),
0 10px 20px rgba(0, 0, 20, 0.15);
/* Dropdowns */
--dropdown-backdrop-filter: contrast(0.85) saturate(2) brightness(0.7) blur(20px);
--dropdown-box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05),
0 0 8px 2px rgba(0, 0, 30, 0.05),
0 0 1px 1px rgba(0, 0, 20, 0.025),
0 10px 20px rgba(0, 0, 20, 0.3);
/* Links */
--link-color: #53c1ff;
--link-visited-color: #53c1ff;
/* Table */
--table-background: var(--dark-theme-bg-black);
--table-header-foreground: rgb(240, 240, 245);
--table-body-background: var(--background);
--table-body-foreground: rgb(240, 240, 245);
/* Deprecated */
--bigtable-header-bg: var(--dark-theme-bg-black);
--bigtable-header-border-color: var(--dark-theme-bg-dark-grey);
--bigtable-header-text-color: var(--text-color);
--bigtable-row-border-color: var(--dark-theme-bg-dark-grey);
--even-row-color: #020202;
--table-striped-bg--hover: var(--dark-theme-bg-dark-grey);
/* Pane widget */
--pane-border-color: var(--dark-theme-bg-dark-grey);
--pane-header-border-color: var(--dark-theme-bg-dark-grey);
--pane-header-color: var(--dark-theme-bg-black);
/* Tab bar */
--tabs-background: var(--dark-theme-bg-black);
--tabs-item-background: transparent;
--tabs-item-background--hover: rgba(255, 255, 255, 0.05);
--tabs-item-background--active: rgba(255, 255, 255, 0.1);
--tabs-item-background--selected: rgba(255, 255, 255, 0.05);
/* Deprecated */
--tab-link-border-color: var(--dark-theme-bg-dark-grey);
--tab-link-text-color: #999;
--tab-link-checked-bg: var(--dark-theme-bg-black);
--tab-link-checked-text-color: var(--primary);
--tab-link-bg--hover: var(--dark-theme-bg-dark-grey);
--tab-link-bg--active: var(--dark-theme-bg-dark-grey);
/* Side panel */
--panel-header-bg-color: var(--dark-theme-bg-black);
--panel-border-color: rgb(50, 50, 55);
--panel-border-color--hover: var(--dark-theme-bg-black);
--task-link-bg-color--hover: var(--dark-theme-bg-medium-grey);
/* Form */
--input-color: rgb(40, 40, 42);
--input-border: rgb(120, 120, 130);
--input-border-hover: rgb(140, 140, 150);
--focus-input-border: #4bbeff;
--focus-input-glow: rgba(43, 116, 160, 0.4);
--pre-background: var(--dark-theme-bg-black);
--selection-color: rgba(75, 190, 255, 0.5);
--header-search-border: var(--dark-theme-bg-dark-grey);
--input-hidden-password-bg-color: var(--input-color);
/* Text area handle */
--text-area-handle-border: var(--dark-theme-bg-dark-grey);
--text-area-handle-bg-color: var(--text-area-handle-border);
/* Pop out menus */
--menu-bg-color: var(--dark-theme-bg-medium);
--menu-text-color: var(--text-color);
--menu-selected-color: var(--dark-theme-bg-dark);
--menu-box-shadow: none;
/* Manage component */
--manage-option-bg-color--hover: var(--dark-theme-bg-light-grey);
--manage-option-bg-color--active: var(--dark-theme-bg-light-grey);
--manage-option-border-color: var(--dark-theme-bg-light-grey);
/* Add form widget */
--light-bg-color: var(--dark-theme-bg-medium);
--light-bg-color--hover: var(--dark-theme-bg-dark);
--bright-bg-color: var(--dark-theme-bg-dark-grey);
--brightest-bg-color: var(--input-color);
--add-item-btn-decorator-border-color: var(--dark-theme-bg-dark-grey);
--add-item-categories-bg-color--hover: var(--dark-theme-bg-dark-grey);
--add-item-btn-decorator-bg-color: var(--dark-theme-bg-dark-grey);
--configure-job-bottom-sticker-bg-color: var(--dark-theme-bg-dark-grey);
--configure-job-bottom-sticker-border-color: var(--dark-theme-bg-dark-grey);
/* Plugin manager */
--plugin-manager-bg-color-already-upgraded: var(--dark-theme-bg-medium);
--plugin-manager-category-link-bg-color: #5d5b5b;
--plugin-manager-category-link-bg-color--hover: var(--dark-theme-bg-dark-grey);
--plugin-manager-category-link-border-color--hover: var(--dark-theme-bg-black);
--plugin-manager-category-text-color: var(--text-color);
--plugin-manager-category-link-color--hover: #a5a3a3;
--plugin-manager-unavailable-bg-color: var(--dark-theme-bg-medium);
--plugin-manager-unavailable-label-color: var(--text-color);
/* Auto complete */
--auto-complete-bg-color--prehighlight: var(--primary);
}
[data-theme=dark] body, .app-theme-picker__picker[data-theme=dark] body {
color-scheme: dark;
}
[data-theme=dark] {
--light-blue: #8cc6ff;
--blue: hsl(210deg, 100%, 55%);
--dark-blue: #0054a8;
--light-brown: #d1b9a0;
--brown: hsl(30deg, 35%, 45%);
--dark-brown: #5d452d;
--light-cyan: #b3e6ff;
--cyan: hsl(200deg, 100%, 70%);
--dark-cyan: #008fd6;
--light-green: #9bf1b0;
--green: hsl(135deg, 75%, 55%);
--dark-green: #159335;
--light-indigo: #b3a6f2;
--indigo: hsl(250deg, 75%, 60%);
--dark-indigo: #2e17a1;
--light-orange: #ffca80;
--orange: hsl(35deg, 100%, 50%);
--dark-orange: #995900;
--light-pink: #ff99aa;
--pink: hsl(350deg, 100%, 60%);
--dark-pink: #b8001f;
--light-purple: #daa1f7;
--purple: hsl(280deg, 85%, 60%);
--dark-purple: #760eaa;
--light-red: #ffa299;
--red: hsl(5deg, 100%, 60%);
--dark-red: #b80f00;
--light-yellow: #ffec8c;
--yellow: hsl(50deg, 100%, 55%);
--dark-yellow: #a88c00;
}
[data-theme=dark] #jenkins .cm-s-default {
font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;
}
[data-theme=dark] #jenkins .cm-s-default.CodeMirror {
background: #2B2B2B;
color: #A9B7C6;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-meta {
color: #BBB529;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-number {
color: #6897BB;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-keyword {
color: #CC7832;
line-height: 1em;
font-weight: bold;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-def {
color: #A9B7C6;
font-style: italic;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-variable {
color: #A9B7C6;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-variable-2 {
color: #A9B7C6;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-variable-3 {
color: #9876AA;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-type {
color: #AABBCC;
font-weight: bold;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-property {
color: #FFC66D;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-operator {
color: #A9B7C6;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-string {
color: #6A8759;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-string-2 {
color: #6A8759;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-comment {
color: #61A151;
font-style: italic;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-link {
color: #CC7832;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-atom {
color: #CC7832;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-error {
color: #BC3F3C;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-tag {
color: #629755;
font-weight: bold;
font-style: italic;
text-decoration: underline;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-attribute {
color: #6897bb;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-qualifier {
color: #6A8759;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-bracket {
color: #A9B7C6;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-builtin {
color: #FF9E59;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-special {
color: #FF9E59;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-matchhighlight {
color: #FFFFFF;
background-color: rgba(50, 89, 48, 0.7);
font-weight: normal;
}
[data-theme=dark] #jenkins .cm-s-default span.cm-searching {
color: #FFFFFF;
background-color: rgba(61, 115, 59, 0.7);
font-weight: normal;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirror-cursor {
border-left: 1px solid #A9B7C6;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirror-activeline-background {
background: #323232;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirror-gutter {
background: #313335;
border-right: 1px solid #313335;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirror-guttermarker {
color: #FFEE80;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirror-guttermarker-subtle {
color: #D0D0D0;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirrir-linenumber {
color: #606366;
}
[data-theme=dark] #jenkins .cm-s-default .CodeMirror-matchingbracket {
background-color: #3B514D;
color: #FFEF28 !important;
font-weight: bold;
}
[data-theme=dark] #jenkins .cm-s-default div.CodeMirror-selected {
background: #214283;
}
[data-theme=dark] #jenkins .CodeMirror-hints.default {
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
color: #9C9E9E;
background-color: #3B3E3F !important;
}
[data-theme=dark] #jenkins .CodeMirror-hints.default .CodeMirror-hint-active {
background-color: #494D4E !important;
color: #9C9E9E !important;
}
@media (prefers-color-scheme: dark) {
[data-theme=dark-system], .app-theme-picker__picker[data-theme=dark-system] {
--dark-theme-bg-black: hsl(240, 6%, 10%);
--dark-theme-bg-dark: #222;
--dark-theme-bg-medium: #2d2b2b;
--dark-theme-bg-dark-grey: #333;
--dark-theme-bg-medium-grey: #444;
--dark-theme-bg-light-grey: #555;
--dark-theme-bg-very-light-grey: #444;
--background: hsl(240, 6%, 13%);
--very-light-grey: var(--dark-theme-bg-very-light-grey);
--light-grey: var(--dark-theme-bg-medium);
--medium-grey: var(--dark-theme-bg-medium-grey);
--white: var(--dark-theme-bg-dark-grey);
--black: var(--dark-theme-bg-light-grey);
--primary: #53c1ff;
/* Text */
--text-color: rgb(250, 250, 255);
--text-color-secondary: rgb(160, 160, 165);
--call-to-action-text-color: var(--dark-theme-bg-medium);
--call-to-action-link-color: var(--call-to-action-text-color);
/* Alerts */
--alert-success-text-color: #fff;
--alert-success-bg-color: #007e33;
--alert-success-border-color: var(--alert-success-bg-color);
--alert-info-text-color: #fff;
--alert-info-bg-color: #0099cc;
--alert-info-border-color: var(--alert-info-bg-color);
--alert-warning-text-color: #fff;
--alert-warning-bg-color: #ff8800;
--alert-warning-border-color: var(--alert-warning-bg-color);
--alert-danger-text-color: #fff;
--alert-danger-bg-color: #cc0000;
--alert-danger-border-color: var(--alert-danger-bg-color);
/* Buttons */
--btn-primary-bg: #53c1ff;
--btn-secondary-bg: var(--dark-theme-bg-dark);
--btn-secondary-color: var(--btn-primary-color);
--btn-link-bg--hover: var(--dark-theme-bg-dark-grey);
--btn-link-bg--active: var(--dark-theme-bg-dark-grey);
/* Help area */
--help-area-bg-color: var(--dark-theme-bg-dark-grey);
--configure-job-help-area-bg-color: var(--dark-theme-bg-dark);
/* Header */
--logo-bg: var(--dark-theme-bg-dark);
--brand-link-color: var(--primary);
--header-link-color: var(--text-color);
--header-link-color-active: var(--text-color);
--header-bg-classic: #000;
--search-bg: #4d545d;
--search-input-color: var(--text-color);
/* Breadcrumbs */
--breadcrumbs-bg: var(--dark-theme-bg-black);
--breadcrumbs-bg-color--hover: var(--dark-theme-bg-dark);
--breadcrumbs-text-color: var(--text-color);
--breadcrumbs-item-bg-color--hover: var(--dark-theme-bg-dark);
--breadcrumbs-border: var(--dark-theme-bg-dark-grey);
--breadcrumbs-bar-background: hsl(240, 6%, 9%, 0.8);
/* Footer */
--footer-background: hsl(240, 6%, 9%, 0.8);
/* Tooltips */
--tooltip-background: hsl(240, 6%, 23%);
--tooltip-backdrop-filter: contrast(0.6) saturate(4) brightness(0.4) blur(15px);
--tooltip-box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05),
0 0 8px 2px rgba(0, 0, 30, 0.05),
0 0 1px 1px rgba(0, 0, 20, 0.025),
0 10px 20px rgba(0, 0, 20, 0.15);
/* Dropdowns */
--dropdown-backdrop-filter: contrast(0.85) saturate(2) brightness(0.7) blur(20px);
--dropdown-box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.05),
0 0 8px 2px rgba(0, 0, 30, 0.05),
0 0 1px 1px rgba(0, 0, 20, 0.025),
0 10px 20px rgba(0, 0, 20, 0.3);
/* Links */
--link-color: #53c1ff;
--link-visited-color: #53c1ff;
/* Table */
--table-background: var(--dark-theme-bg-black);
--table-header-foreground: rgb(240, 240, 245);
--table-body-background: var(--background);
--table-body-foreground: rgb(240, 240, 245);
/* Deprecated */
--bigtable-header-bg: var(--dark-theme-bg-black);
--bigtable-header-border-color: var(--dark-theme-bg-dark-grey);
--bigtable-header-text-color: var(--text-color);
--bigtable-row-border-color: var(--dark-theme-bg-dark-grey);
--even-row-color: #020202;
--table-striped-bg--hover: var(--dark-theme-bg-dark-grey);
/* Pane widget */
--pane-border-color: var(--dark-theme-bg-dark-grey);
--pane-header-border-color: var(--dark-theme-bg-dark-grey);
--pane-header-color: var(--dark-theme-bg-black);
/* Tab bar */
--tabs-background: var(--dark-theme-bg-black);
--tabs-item-background: transparent;
--tabs-item-background--hover: rgba(255, 255, 255, 0.05);
--tabs-item-background--active: rgba(255, 255, 255, 0.1);
--tabs-item-background--selected: rgba(255, 255, 255, 0.05);
/* Deprecated */
--tab-link-border-color: var(--dark-theme-bg-dark-grey);
--tab-link-text-color: #999;
--tab-link-checked-bg: var(--dark-theme-bg-black);
--tab-link-checked-text-color: var(--primary);
--tab-link-bg--hover: var(--dark-theme-bg-dark-grey);
--tab-link-bg--active: var(--dark-theme-bg-dark-grey);
/* Side panel */
--panel-header-bg-color: var(--dark-theme-bg-black);
--panel-border-color: rgb(50, 50, 55);
--panel-border-color--hover: var(--dark-theme-bg-black);
--task-link-bg-color--hover: var(--dark-theme-bg-medium-grey);
/* Form */
--input-color: rgb(40, 40, 42);
--input-border: rgb(120, 120, 130);
--input-border-hover: rgb(140, 140, 150);
--focus-input-border: #4bbeff;
--focus-input-glow: rgba(43, 116, 160, 0.4);
--pre-background: var(--dark-theme-bg-black);
--selection-color: rgba(75, 190, 255, 0.5);
--header-search-border: var(--dark-theme-bg-dark-grey);
--input-hidden-password-bg-color: var(--input-color);
/* Text area handle */
--text-area-handle-border: var(--dark-theme-bg-dark-grey);
--text-area-handle-bg-color: var(--text-area-handle-border);
/* Pop out menus */
--menu-bg-color: var(--dark-theme-bg-medium);
--menu-text-color: var(--text-color);
--menu-selected-color: var(--dark-theme-bg-dark);
--menu-box-shadow: none;
/* Manage component */
--manage-option-bg-color--hover: var(--dark-theme-bg-light-grey);
--manage-option-bg-color--active: var(--dark-theme-bg-light-grey);
--manage-option-border-color: var(--dark-theme-bg-light-grey);
/* Add form widget */
--light-bg-color: var(--dark-theme-bg-medium);
--light-bg-color--hover: var(--dark-theme-bg-dark);
--bright-bg-color: var(--dark-theme-bg-dark-grey);
--brightest-bg-color: var(--input-color);
--add-item-btn-decorator-border-color: var(--dark-theme-bg-dark-grey);
--add-item-categories-bg-color--hover: var(--dark-theme-bg-dark-grey);
--add-item-btn-decorator-bg-color: var(--dark-theme-bg-dark-grey);
--configure-job-bottom-sticker-bg-color: var(--dark-theme-bg-dark-grey);
--configure-job-bottom-sticker-border-color: var(--dark-theme-bg-dark-grey);
/* Plugin manager */
--plugin-manager-bg-color-already-upgraded: var(--dark-theme-bg-medium);
--plugin-manager-category-link-bg-color: #5d5b5b;
--plugin-manager-category-link-bg-color--hover: var(--dark-theme-bg-dark-grey);
--plugin-manager-category-link-border-color--hover: var(--dark-theme-bg-black);
--plugin-manager-category-text-color: var(--text-color);
--plugin-manager-category-link-color--hover: #a5a3a3;
--plugin-manager-unavailable-bg-color: var(--dark-theme-bg-medium);
--plugin-manager-unavailable-label-color: var(--text-color);
/* Auto complete */
--auto-complete-bg-color--prehighlight: var(--primary);
}
[data-theme=dark-system] body, .app-theme-picker__picker[data-theme=dark-system] body {
color-scheme: dark;
}
[data-theme=dark-system] {
--light-blue: #8cc6ff;
--blue: hsl(210deg, 100%, 55%);
--dark-blue: #0054a8;
--light-brown: #d1b9a0;
--brown: hsl(30deg, 35%, 45%);
--dark-brown: #5d452d;
--light-cyan: #b3e6ff;
--cyan: hsl(200deg, 100%, 70%);
--dark-cyan: #008fd6;
--light-green: #9bf1b0;
--green: hsl(135deg, 75%, 55%);
--dark-green: #159335;
--light-indigo: #b3a6f2;
--indigo: hsl(250deg, 75%, 60%);
--dark-indigo: #2e17a1;
--light-orange: #ffca80;
--orange: hsl(35deg, 100%, 50%);
--dark-orange: #995900;
--light-pink: #ff99aa;
--pink: hsl(350deg, 100%, 60%);
--dark-pink: #b8001f;
--light-purple: #daa1f7;
--purple: hsl(280deg, 85%, 60%);
--dark-purple: #760eaa;
--light-red: #ffa299;
--red: hsl(5deg, 100%, 60%);
--dark-red: #b80f00;
--light-yellow: #ffec8c;
--yellow: hsl(50deg, 100%, 55%);
--dark-yellow: #a88c00;
}
[data-theme=dark-system] #jenkins .cm-s-default {
font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, serif;
}
[data-theme=dark-system] #jenkins .cm-s-default.CodeMirror {
background: #2B2B2B;
color: #A9B7C6;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-meta {
color: #BBB529;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-number {
color: #6897BB;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-keyword {
color: #CC7832;
line-height: 1em;
font-weight: bold;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-def {
color: #A9B7C6;
font-style: italic;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-variable {
color: #A9B7C6;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-variable-2 {
color: #A9B7C6;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-variable-3 {
color: #9876AA;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-type {
color: #AABBCC;
font-weight: bold;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-property {
color: #FFC66D;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-operator {
color: #A9B7C6;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-string {
color: #6A8759;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-string-2 {
color: #6A8759;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-comment {
color: #61A151;
font-style: italic;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-link {
color: #CC7832;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-atom {
color: #CC7832;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-error {
color: #BC3F3C;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-tag {
color: #629755;
font-weight: bold;
font-style: italic;
text-decoration: underline;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-attribute {
color: #6897bb;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-qualifier {
color: #6A8759;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-bracket {
color: #A9B7C6;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-builtin {
color: #FF9E59;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-special {
color: #FF9E59;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-matchhighlight {
color: #FFFFFF;
background-color: rgba(50, 89, 48, 0.7);
font-weight: normal;
}
[data-theme=dark-system] #jenkins .cm-s-default span.cm-searching {
color: #FFFFFF;
background-color: rgba(61, 115, 59, 0.7);
font-weight: normal;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirror-cursor {
border-left: 1px solid #A9B7C6;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirror-activeline-background {
background: #323232;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirror-gutter {
background: #313335;
border-right: 1px solid #313335;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirror-guttermarker {
color: #FFEE80;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirror-guttermarker-subtle {
color: #D0D0D0;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirrir-linenumber {
color: #606366;
}
[data-theme=dark-system] #jenkins .cm-s-default .CodeMirror-matchingbracket {
background-color: #3B514D;
color: #FFEF28 !important;
font-weight: bold;
}
[data-theme=dark-system] #jenkins .cm-s-default div.CodeMirror-selected {
background: #214283;
}
[data-theme=dark-system] #jenkins .CodeMirror-hints.default {
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
color: #9C9E9E;
background-color: #3B3E3F !important;
}
[data-theme=dark-system] #jenkins .CodeMirror-hints.default .CodeMirror-hint-active {
background-color: #494D4E !important;
color: #9C9E9E !important;
}
}
/*# sourceMappingURL=theme.css.map */

0
views/.gitignore vendored Normal file
View File

19
views/index.hbs Normal file
View File

@ -0,0 +1,19 @@
<!doctype html>
<html lang="en">
<head>
<title>Janky</title>
<link type="text/css" rel="stylesheet" href="/theme.css"/>
</head>
<body class="text-center">
<div class="cover-container d-flex h-100 p-3 mx-auto flex-column">
<main role="main" class="inner cover">
<p>
This is so Janky
</p>
</main>
</div>
</body>
</html>