diff --git a/composer.json b/composer.json index e8a91bc..5ba9f25 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "4lt/novaconium", + "name": "4lt/novaconium", "description": "A high-performance PHP framework built from the past.", "license": "MIT", "authors": [ @@ -11,19 +11,18 @@ } ], "autoload": { - "psr-4": { - "Novaconium\\\\": "src/" - } + "psr-4": { + "Novaconium\\": "src/" + } }, "require": { - "twig/twig": "*", - "nickyeoman/php-validation-class": "^5.0" + "twig/twig": "*", + "nickyeoman/php-validation-class": "^5.0" }, - "minimum-stability": "stable", + "minimum-stability": "stable", "extra": { "versioning": { "strategy": "semantic-versioning" } } -} - +} \ No newline at end of file diff --git a/controllers/create_admin.php b/controllers/create_admin.php index 3c18637..3525509 100644 --- a/controllers/create_admin.php +++ b/controllers/create_admin.php @@ -1,5 +1,7 @@ 'Novaconium Edit Page', - 'pageclass' => 'novaconium' + 'pageclass' => 'novaconium', + 'editor' => 'ace' ]); // Check if logged in @@ -18,25 +19,35 @@ $pageid = $router->parameters['id'] ?? null; if (!empty($pageid)) { // Existing page: fetch from database $query = <<getRow($query, [$pageid]); @@ -70,4 +81,4 @@ if (empty($pageid)) { } // Render the edit page view -view('@novacore/editpage', $data); +view('@novacore/editpage/index', $data); diff --git a/controllers/init.php b/controllers/init.php index 52a055e..eb736fe 100644 --- a/controllers/init.php +++ b/controllers/init.php @@ -151,4 +151,51 @@ if ($row['total'] < 1) { makeitso(); } +// Check Tags Table +$query = <<query($query); +if ($result->num_rows === 0) { +$query = <<query($query); +$log->info('Tags Table Created'); +} + +// Check Page Tags Junction Table (after tags table) +$query = <<query($query); +if ($result->num_rows === 0) { +$query = <<query($query); +$log->info('Page Tags Junction Table Created'); +} + view('@novacore/init', $data); diff --git a/controllers/savepage.php b/controllers/savepage.php index 7b1ef73..eb404f7 100644 --- a/controllers/savepage.php +++ b/controllers/savepage.php @@ -2,6 +2,7 @@ use Nickyeoman\Validation; $v = new Nickyeoman\Validation\Validate(); +use Novaconium\Services\TagManager; // Autoloads automatically $url_error = '/novaconium/page/edit/' . $post->get('id'); // fallback for errors @@ -34,6 +35,7 @@ $notes = $_POST['notes'] ?? ''; $draft = !empty($post->get('draft')) ? 1 : 0; $changefreq = $_POST['changefreq'] ?? 'monthly'; $priority = $_POST['priority'] ?? 0.0; +$tags_json = $_POST['tags_json'] ?? '[]'; // Validate required fields if (empty($title) || empty($slug) || empty($body)) { @@ -64,6 +66,19 @@ try { } if (!empty($id) && !$newpage) { + + /** Work in Progress + // Delete old tag links for this page (cleanup) + $deleteQuery = <<query($deleteQuery, [$id]); + + $tagManager = new TagManager(); + + dd($tags_json); + **/ + // Update existing page $query = "UPDATE `pages` SET `title` = ?, `heading` = ?, `description` = ?, `keywords` = ?, `author` = ?, diff --git a/sass/framework/_ace.sass b/sass/framework/_ace.sass new file mode 100644 index 0000000..adf6e3a --- /dev/null +++ b/sass/framework/_ace.sass @@ -0,0 +1,29 @@ +@use '../abstracts' as * +@use 'sass:color' // For color.adjust()—non-deprecated color tweaks +@use '../base' as * + +// ACE Editor +.editor-container + width: 100% + min-height: 400px // ~10 rows + +.ace-editor + height: 400px // Scrollable + border: 1px solid $accent-light + font-family: $mono-font // Your monospace + + // Ace internals (dark theme tweaks) + .ace_gutter + background: $bg-darker !important + color: $text-muted !important + border-right: 1px solid $accent-light !important + + .ace_scroller + background: $bg-dark !important + + .ace_text-layer .ace_print-margin + background: transparent !important + + // Selection + .ace_marker-layer .ace_selection + background: color.adjust($accent-light, $alpha: -0.3) !important // Green tint \ No newline at end of file diff --git a/sass/framework/_edit_page.sass b/sass/framework/_edit_page.sass new file mode 100644 index 0000000..62250ce --- /dev/null +++ b/sass/framework/_edit_page.sass @@ -0,0 +1,15 @@ +@use '../abstracts' as * +@use '../base' as * +@use 'sass:color' // Already there for adjusts + +#edit-page-title + margin-top: 2rem + + #title + width: 100% + font-size: 1.9rem + padding: 20px + + &>div + font-size: 0.8rem + margin: 8px 0 0 20px \ No newline at end of file diff --git a/sass/framework/_tabs.sass b/sass/framework/_tabs.sass new file mode 100644 index 0000000..a2af2f8 --- /dev/null +++ b/sass/framework/_tabs.sass @@ -0,0 +1,48 @@ +// framework/_tabs.sass + +@use '../abstracts' as * +@use 'sass:color' // For color.adjust()—non-deprecated color tweaks + +// Simplified tab styling: Square borders, no rounds +.tab-container + margin: space('lg') auto + background: $bg-dark + +.tab-nav + display: flex + background-color: $bg-darker + border-bottom: 1px solid $border-light + +.tab-button + padding: space('sm') space('md') + background: $bg-darker + border: 1px solid $border-light + border-bottom: none + cursor: pointer + font-size: 14px + min-width: 120px // Makes them more square/equal + text-align: center + color: $text-light + font-family: $mono-font // From vars + + &:hover + background-color: color.adjust($bg-darker, $lightness: 5%) // Modern, non-deprecated lighten equivalent + + + .tab-button + border-left: none // Shared borders + + &.active + background-color: $bg-dark + border-bottom: 2px solid $accent-light + color: $accent-light + font-weight: bold + +.tab-content + display: none + padding: space('lg') + background-color: $bg-dark + color: $text-light + border: none + + &.active + display: block diff --git a/sass/framework/_tags.sass b/sass/framework/_tags.sass new file mode 100644 index 0000000..82c6319 --- /dev/null +++ b/sass/framework/_tags.sass @@ -0,0 +1,108 @@ +@use '../abstracts' as * +@use 'sass:color' // For color.adjust()—non-deprecated color tweaks +@use '../base' as * + +// Tags Dropdown +.tags-dropdown + position: absolute + top: 100% + left: 0 + right: 0 + max-height: 200px + overflow-y: auto + background: $bg-darker + border: 1px solid $border-light + border-top: none + border-radius: 0 0 4px 4px + list-style: none + margin: 0 + padding: 0 + z-index: 10 + opacity: 0 + visibility: hidden + transition: opacity 0.2s + + &[aria-expanded="true"] + opacity: 1 + visibility: visible + + li + padding: space('xs') space('sm') + cursor: pointer + color: $text-light + font-size: 14px + border-bottom: 1px solid transparent + + &:hover, + &.selected + background: color.adjust($accent-light, $alpha: -0.1) + color: $accent-light + + &:last-child + border-bottom: none + +.tags-input + position: relative // For absolute dropdown + +// Tags Input +.tags-input + display: flex + flex-wrap: wrap + gap: space('xs') + align-items: center + border: 1px solid $border-light + padding: space('xs') + background: $bg-darker + min-height: 40px + grid-column: 2 // Spans input area in .form-row grid + + input + border: none + background: transparent + color: $text-light + font-family: $mono-font + font-size: 14px + flex: 1 + min-width: 100px + outline: none + + &::placeholder + color: $text-muted + +.tag-chip + display: inline-flex + align-items: center + background: color.adjust($accent-light, $alpha: -0.2) + color: $accent-light + padding: space('xs') space('sm') + border-radius: 4px + font-size: 12px + max-width: 150px + overflow: hidden + text-overflow: ellipsis + white-space: nowrap + + .tag-remove + background: none + border: none + color: inherit + font-size: 16px + margin-left: space('xs') + cursor: pointer + padding: 0 + line-height: 1 + + &:hover + opacity: 0.7 + +// Tags Autocomplete (native datalist styling) +.tags-input input[list] + // Existing input styles apply... + +#tag-suggestions + // Native datalist not directly stylable, but options can be influenced via input focus + // For custom polyfill, add JS-generated
    , but native is fine for now + +// Browser-specific tweaks (Chrome/Firefox) +.tags-input input[list]::-webkit-calendar-picker-indicator + display: none // Hide arrow if interfering \ No newline at end of file diff --git a/sass/framework/_tooltip.sass b/sass/framework/_tooltip.sass new file mode 100644 index 0000000..4a8c1cd --- /dev/null +++ b/sass/framework/_tooltip.sass @@ -0,0 +1,47 @@ +@use '../abstracts' as * +@use '../base' as * +@use 'sass:color' // Already there for adjusts + +// Tooltip styling (mouse-follow version) +.tooltip + position: relative + display: inline-block + cursor: help + font-size: 16px + color: $accent-light // Green accent for ? + margin-left: space('xs') // 0.25rem + top: 2px + + .tooltiptext + visibility: hidden + width: 200px + background-color: $bg-darker // Darker bg + color: $text-light // White text + text-align: left // Changed to left-align for better readability + border-radius: 0 // Square + padding: space('sm') // 0.5rem + position: fixed // Fixed to viewport, updated by JS + z-index: z('dropdown') // High z-index + opacity: 0 + transition: opacity 0.3s + font-size: 14px + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2) // Subtle shadow + pointer-events: none // Prevents mouse interference with tooltip + + &::after + content: "" + position: absolute + top: -5px // Arrow above tooltip (points up to mouse) + left: 10px // Slight indent from left edge + border-width: 5px + border-style: solid + border-color: $bg-darker transparent transparent transparent // Upward arrow + + &:hover .tooltiptext + visibility: visible + opacity: 1 + +// Accessibility: Hidden tooltip text for screen readers +.tooltip-desc + position: absolute + left: -9999px \ No newline at end of file diff --git a/sass/framework/index.sass b/sass/framework/index.sass index 8dcb9a6..c691b6a 100644 --- a/sass/framework/index.sass +++ b/sass/framework/index.sass @@ -2,4 +2,9 @@ @forward 'ui'; @forward 'forms'; @forward 'login_form'; -@forward 'logo'; \ No newline at end of file +@forward 'logo'; +@forward 'tabs'; +@forward 'edit_page'; +@forward 'tooltip'; +@forward 'ace'; +@forward 'tags'; \ No newline at end of file diff --git a/skeleton/novaconium/public/css/novaconium.css b/skeleton/novaconium/public/css/novaconium.css index 18f5e91..b94bd16 100644 --- a/skeleton/novaconium/public/css/novaconium.css +++ b/skeleton/novaconium/public/css/novaconium.css @@ -1 +1 @@ -:root{--bg-dark: hsl(0, 0%, 2%);--bg-darker: hsl(210, 7%, 5%);--text-light: hsl(0, 0%, 100%);--text-lighter: hsl(120, 52%, 15%);--text-muted: hsl(120, 40%, 45%);--accent-light: hsl(120, 100%, 35%);--accent-success: hsl(120, 80%, 45%);--accent-warning: hsl(60, 100%, 35%);--accent-error: hsl(0, 100%, 45%);--border-light: hsla(120, 60%, 70%, 0.2);--font-stack: Courier New, SF Mono, monospace}*{box-sizing:border-box}html{font-size:16px;line-height:1.5;scroll-behavior:smooth;background-color:hsl(0,0%,2%);color:#fff}body{margin:0;padding:0;font-family:"Courier New","SF Mono",monospace;background-color:hsl(0,0%,2%);color:#fff;min-height:100vh}h1,h2,h3,h4,h5,h6{margin:0 0 .5em;font-weight:600;line-height:1.2;color:rgb(0,178.5,0)}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}p{margin:0 0 1em}small{font-size:.875rem}strong,b{font-weight:700}em,i{font-style:italic}a{color:rgb(0,178.5,0);text-decoration:none;border-bottom:1px solid rgba(0,0,0,0);transition:border-color .2s ease}a:hover,a:focus{border-bottom-color:rgb(0,178.5,0);outline:none}ul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}blockquote{margin:1em 0;padding:.5em 1em;border-left:4px solid rgb(0,178.5,0);background-color:hsla(0,0%,2%,.5);color:#fff}code,kbd,samp{font-family:"Courier New","SF Mono","Fira Code",Consolas,monospace;font-size:.875em;background-color:hsla(0,0%,100%,.1);padding:.125em .25em;border-radius:3px}pre{margin:1em 0;padding:1em;overflow:auto;background-color:hsla(0,0%,100%,.1);border-radius:4px}pre code{background:none;padding:0}table{width:100%;border-collapse:collapse;margin:1em 0}th,td{padding:.75em;text-align:left;border-bottom:1px solid hsla(0,0%,100%,.2)}th{font-weight:600}input,select,textarea,button{font-family:inherit;font-size:inherit;background-color:hsla(0,0%,100%,.1);color:#fff;border:1px solid hsla(0,0%,100%,.3);border-radius:4px;padding:.5em}input:focus,select:focus,textarea:focus,button:focus{outline:none;border-color:rgb(0,178.5,0);box-shadow:0 0 0 2px rgba(0,178.5,0,.2)}button{cursor:pointer;transition:background-color .2s ease}button:disabled{opacity:.5;cursor:not-allowed}img{max-width:100%;height:auto;border-radius:4px}figure{margin:1em 0}hr{border:none;height:1px;background-color:hsla(0,0%,100%,.2);margin:2em 0}*:focus-visible{outline:2px solid rgb(0,178.5,0);outline-offset:2px}@media print{body{background:#fff !important;color:#000 !important}}::selection{background:rgba(0,178.5,0,.3);color:#fff}*::-moz-selection{background:rgba(0,178.5,0,.3);color:#fff}body{background-color:#000;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%231f2c17' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E")}#page .container{display:flex;padding:0;justify-content:center;align-items:flex-start;padding-top:1.5rem}article{width:1140px;flex-shrink:0;padding:3rem;margin:0;background-color:hsl(0,0%,2%);border:1px solid hsl(210,7%,5%)}ul#leftnav{width:320px;flex-shrink:0;list-style:none;padding:0;margin:0 2.5rem 0 0;background-color:hsl(0,0%,2%);border:1px solid hsl(210,7%,5%)}#leftnav li{border-bottom:1px solid hsla(120,60%,70%,.2)}#leftnav li:last-child{border-bottom:none}#leftnav a{display:block;padding:.5rem 1rem;text-decoration:none;color:#fff}#leftnav a:hover,#leftnav a:focus{background-color:rgba(0,178.5,0,.1);color:rgb(0,178.5,0);border-radius:4px}@media(max-width: 1280px){#page .container{flex-direction:column;align-items:center}article,#leftnav{width:100%;max-width:900px;margin:1rem 0}#leftnav{margin-right:0}}code{font-family:"VT323","Courier New","SF Mono","Fira Code",Consolas,monospace;font-size:.875rem;background-color:hsl(210,7%,5%);color:#fff;padding:.25rem .5rem;border-radius:4px;border:1px solid hsla(120,60%,70%,.2);box-shadow:0 0 2px rgba(0,178.5,0,.1)}.small{font-size:.625rem}div.error,div.notice,div#debug{margin:2.5rem auto;width:900px;padding:1.5rem;border-radius:6px;border:1px solid}div.error{background-color:rgba(229.5,0,0,.1);color:rgb(229.5,0,0);border-color:rgb(229.5,0,0)}div.notice{background-color:hsla(120,80%,45%,.1);color:hsl(120,80%,45%);border-color:hsl(120,80%,45%)}div#debug{background-color:hsl(210,7%,5%);color:hsl(120,40%,45%);border-color:hsla(120,60%,70%,.2);margin-top:4rem;margin-bottom:4rem}.pages-table{width:100%;border:1px solid hsla(120,60%,70%,.2)}.pages-table th,.pages-table td{border:1px solid hsla(120,60%,70%,.2);text-align:left}.pages-table th{background-color:rgba(0,178.5,0,.05);color:hsl(120,52%,15%);font-weight:600}#edit-page-form-novaconium .form-group{margin-bottom:1rem}#edit-page-form-novaconium .form-group.fullwidth textarea{width:100%;resize:vertical}#edit-page-form-novaconium .checkbox-group{margin-top:1.5rem}#edit-page-form-novaconium input[type=text],#edit-page-form-novaconium input[type=number],#edit-page-form-novaconium textarea,#edit-page-form-novaconium select{background-color:hsl(210,7%,5%);border:1px solid hsla(120,60%,70%,.2);color:#fff;padding:.5rem;border-radius:4px;font-family:"VT323","Courier New","SF Mono","Fira Code",Consolas,monospace}#edit-page-form-novaconium input[type=text]:focus,#edit-page-form-novaconium input[type=number]:focus,#edit-page-form-novaconium textarea:focus,#edit-page-form-novaconium select:focus{border-color:rgb(0,178.5,0);box-shadow:0 0 0 .25rem rgba(0,178.5,0,.3);outline:none}#edit-page-form-novaconium input[type=checkbox]{accent-color:rgb(0,178.5,0)}#edit-page-form-novaconium button[type=submit]{background-color:rgb(0,178.5,0);color:hsl(0,0%,2%);border:none;padding:.5rem 1rem;border-radius:4px;cursor:pointer;font-family:"VT323","Courier New","SF Mono","Fira Code",Consolas,monospace}#edit-page-form-novaconium button[type=submit]:hover,#edit-page-form-novaconium button[type=submit]:focus{background-color:#090;box-shadow:0 0 4px rgba(0,178.5,0,.5)}#edit-page-form-novaconium p{color:hsl(120,40%,45%)}#edit-page-form-novaconium a{color:rgb(0,178.5,0)}#edit-page-form-novaconium a:hover{color:hsl(120,52%,15%);text-decoration:underline}#login{padding:0}#login input[type=text],#login input[type=password],#login button[type=submit]{width:100%;max-width:300px;padding:1rem;margin-bottom:1rem;box-sizing:border-box;font-size:1rem;border:1px solid hsla(120,60%,70%,.2);border-radius:4px;background:hsl(0,0%,2%);color:#fff}#login input[type=text]{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='12' cy='7' r='4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:1rem center;background-size:20px;padding-left:3rem}#login input[type=password]{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2' ry='2'/%3E%3Cpath d='M7 11V7a5 5 0 0 1 10 0v4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:1rem center;background-size:20px;padding-left:3rem}#login button[type=submit]{background:rgb(0,178.5,0);border-color:rgb(0,178.5,0);cursor:pointer;transition:background .2s}#login button[type=submit]:hover{background:rgb(0,178.5,0);text-shadow:0 0 5px rgba(0,178.5,0,.5)}#login button[type=submit]::after{content:" →";margin-left:.5rem}#biglogo{position:relative;display:inline-block;padding:20px 0;border-radius:0;overflow:hidden}#biglogo::before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background-image:linear-gradient(rgba(0, 255, 0, 0.02) 1px, transparent 1px),linear-gradient(90deg, rgba(0, 255, 0, 0.02) 1px, transparent 1px);background-size:20px 20px;opacity:.1;pointer-events:none}#biglogo::after{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent, #00ff00, transparent);opacity:.05;animation:scan 3s linear infinite}#biglogo .main{display:block;font-family:"Orbitron",sans-serif;font-size:4.5rem;font-weight:900;color:#fff;letter-spacing:.1em;line-height:.85;text-transform:uppercase;text-shadow:4px 4px 0 #222,5px 5px 0 #111,-1px -1px 0 lime,1px 1px 20px rgba(0,255,0,.3);filter:drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.8))}#biglogo .sub{display:block;font-family:"Orbitron",sans-serif;font-size:2.5rem;font-weight:700;color:#fff;letter-spacing:.15em;margin-top:.5rem;text-shadow:2px 2px 0 #222,-1px -1px 0 lime,1px 1px 10px rgba(0,255,0,.2);filter:drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.6))}#biglogo:hover .main{animation:glitch .3s infinite}@keyframes scan{0%{top:-1px}100%{top:100%}}@keyframes glitch{0%,100%{transform:translate(0)}20%{transform:translate(-2px, 2px)}40%{transform:translate(-2px, -2px)}60%{transform:translate(2px, 2px)}80%{transform:translate(2px, -2px)}}/*# sourceMappingURL=novaconium.css.map */ +:root{--bg-dark: hsl(0, 0%, 2%);--bg-darker: hsl(210, 7%, 5%);--text-light: hsl(0, 0%, 100%);--text-lighter: hsl(120, 52%, 15%);--text-muted: hsl(120, 40%, 45%);--accent-light: hsl(120, 100%, 35%);--accent-success: hsl(120, 80%, 45%);--accent-warning: hsl(60, 100%, 35%);--accent-error: hsl(0, 100%, 45%);--border-light: hsla(120, 60%, 70%, 0.2);--font-stack: Courier New, SF Mono, monospace}*{box-sizing:border-box}html{font-size:16px;line-height:1.5;scroll-behavior:smooth;background-color:hsl(0,0%,2%);color:#fff}body{margin:0;padding:0;font-family:"Courier New","SF Mono",monospace;background-color:hsl(0,0%,2%);color:#fff;min-height:100vh}h1,h2,h3,h4,h5,h6{margin:0 0 .5em;font-weight:600;line-height:1.2;color:rgb(0,178.5,0)}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}p{margin:0 0 1em}small{font-size:.875rem}strong,b{font-weight:700}em,i{font-style:italic}a{color:rgb(0,178.5,0);text-decoration:none;border-bottom:1px solid rgba(0,0,0,0);transition:border-color .2s ease}a:hover,a:focus{border-bottom-color:rgb(0,178.5,0);outline:none}ul,ol{margin:0 0 1em;padding-left:1.5em}li{margin-bottom:.25em}blockquote{margin:1em 0;padding:.5em 1em;border-left:4px solid rgb(0,178.5,0);background-color:hsla(0,0%,2%,.5);color:#fff}code,kbd,samp{font-family:"Courier New","SF Mono","Fira Code",Consolas,monospace;font-size:.875em;background-color:hsla(0,0%,100%,.1);padding:.125em .25em;border-radius:3px}pre{margin:1em 0;padding:1em;overflow:auto;background-color:hsla(0,0%,100%,.1);border-radius:4px}pre code{background:none;padding:0}table{width:100%;border-collapse:collapse;margin:1em 0}th,td{padding:.75em;text-align:left;border-bottom:1px solid hsla(0,0%,100%,.2)}th{font-weight:600}input,select,textarea,button{font-family:inherit;font-size:inherit;background-color:hsla(0,0%,100%,.1);color:#fff;border:1px solid hsla(0,0%,100%,.3);border-radius:4px;padding:.5em}input:focus,select:focus,textarea:focus,button:focus{outline:none;border-color:rgb(0,178.5,0);box-shadow:0 0 0 2px rgba(0,178.5,0,.2)}button{cursor:pointer;transition:background-color .2s ease}button:disabled{opacity:.5;cursor:not-allowed}img{max-width:100%;height:auto;border-radius:4px}figure{margin:1em 0}hr{border:none;height:1px;background-color:hsla(0,0%,100%,.2);margin:2em 0}*:focus-visible{outline:2px solid rgb(0,178.5,0);outline-offset:2px}@media print{body{background:#fff !important;color:#000 !important}}::selection{background:rgba(0,178.5,0,.3);color:#fff}*::-moz-selection{background:rgba(0,178.5,0,.3);color:#fff}body{background-color:#000;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 304 304' width='304' height='304'%3E%3Cpath fill='%231f2c17' fill-opacity='0.4' d='M44.1 224a5 5 0 1 1 0 2H0v-2h44.1zm160 48a5 5 0 1 1 0 2H82v-2h122.1zm57.8-46a5 5 0 1 1 0-2H304v2h-42.1zm0 16a5 5 0 1 1 0-2H304v2h-42.1zm6.2-114a5 5 0 1 1 0 2h-86.2a5 5 0 1 1 0-2h86.2zm-256-48a5 5 0 1 1 0 2H0v-2h12.1zm185.8 34a5 5 0 1 1 0-2h86.2a5 5 0 1 1 0 2h-86.2zM258 12.1a5 5 0 1 1-2 0V0h2v12.1zm-64 208a5 5 0 1 1-2 0v-54.2a5 5 0 1 1 2 0v54.2zm48-198.2V80h62v2h-64V21.9a5 5 0 1 1 2 0zm16 16V64h46v2h-48V37.9a5 5 0 1 1 2 0zm-128 96V208h16v12.1a5 5 0 1 1-2 0V210h-16v-76.1a5 5 0 1 1 2 0zm-5.9-21.9a5 5 0 1 1 0 2H114v48H85.9a5 5 0 1 1 0-2H112v-48h12.1zm-6.2 130a5 5 0 1 1 0-2H176v-74.1a5 5 0 1 1 2 0V242h-60.1zm-16-64a5 5 0 1 1 0-2H114v48h10.1a5 5 0 1 1 0 2H112v-48h-10.1zM66 284.1a5 5 0 1 1-2 0V274H50v30h-2v-32h18v12.1zM236.1 176a5 5 0 1 1 0 2H226v94h48v32h-2v-30h-48v-98h12.1zm25.8-30a5 5 0 1 1 0-2H274v44.1a5 5 0 1 1-2 0V146h-10.1zm-64 96a5 5 0 1 1 0-2H208v-80h16v-14h-42.1a5 5 0 1 1 0-2H226v18h-16v80h-12.1zm86.2-210a5 5 0 1 1 0 2H272V0h2v32h10.1zM98 101.9V146H53.9a5 5 0 1 1 0-2H96v-42.1a5 5 0 1 1 2 0zM53.9 34a5 5 0 1 1 0-2H80V0h2v34H53.9zm60.1 3.9V66H82v64H69.9a5 5 0 1 1 0-2H80V64h32V37.9a5 5 0 1 1 2 0zM101.9 82a5 5 0 1 1 0-2H128V37.9a5 5 0 1 1 2 0V82h-28.1zm16-64a5 5 0 1 1 0-2H146v44.1a5 5 0 1 1-2 0V18h-26.1zm102.2 270a5 5 0 1 1 0 2H98v14h-2v-16h124.1zM242 149.9V160h16v34h-16v62h48v48h-2v-46h-48v-66h16v-30h-16v-12.1a5 5 0 1 1 2 0zM53.9 18a5 5 0 1 1 0-2H64V2H48V0h18v18H53.9zm112 32a5 5 0 1 1 0-2H192V0h50v2h-48v48h-28.1zm-48-48a5 5 0 0 1-9.8-2h2.07a3 3 0 1 0 5.66 0H178v34h-18V21.9a5 5 0 1 1 2 0V32h14V2h-58.1zm0 96a5 5 0 1 1 0-2H137l32-32h39V21.9a5 5 0 1 1 2 0V66h-40.17l-32 32H117.9zm28.1 90.1a5 5 0 1 1-2 0v-76.51L175.59 80H224V21.9a5 5 0 1 1 2 0V82h-49.59L146 112.41v75.69zm16 32a5 5 0 1 1-2 0v-99.51L184.59 96H300.1a5 5 0 0 1 3.9-3.9v2.07a3 3 0 0 0 0 5.66v2.07a5 5 0 0 1-3.9-3.9H185.41L162 121.41v98.69zm-144-64a5 5 0 1 1-2 0v-3.51l48-48V48h32V0h2v50H66v55.41l-48 48v2.69zM50 53.9v43.51l-48 48V208h26.1a5 5 0 1 1 0 2H0v-65.41l48-48V53.9a5 5 0 1 1 2 0zm-16 16V89.41l-34 34v-2.82l32-32V69.9a5 5 0 1 1 2 0zM12.1 32a5 5 0 1 1 0 2H9.41L0 43.41V40.6L8.59 32h3.51zm265.8 18a5 5 0 1 1 0-2h18.69l7.41-7.41v2.82L297.41 50H277.9zm-16 160a5 5 0 1 1 0-2H288v-71.41l16-16v2.82l-14 14V210h-28.1zm-208 32a5 5 0 1 1 0-2H64v-22.59L40.59 194H21.9a5 5 0 1 1 0-2H41.41L66 216.59V242H53.9zm150.2 14a5 5 0 1 1 0 2H96v-56.6L56.6 162H37.9a5 5 0 1 1 0-2h19.5L98 200.6V256h106.1zm-150.2 2a5 5 0 1 1 0-2H80v-46.59L48.59 178H21.9a5 5 0 1 1 0-2H49.41L82 208.59V258H53.9zM34 39.8v1.61L9.41 66H0v-2h8.59L32 40.59V0h2v39.8zM2 300.1a5 5 0 0 1 3.9 3.9H3.83A3 3 0 0 0 0 302.17V256h18v48h-2v-46H2v42.1zM34 241v63h-2v-62H0v-2h34v1zM17 18H0v-2h16V0h2v18h-1zm273-2h14v2h-16V0h2v16zm-32 273v15h-2v-14h-14v14h-2v-16h18v1zM0 92.1A5.02 5.02 0 0 1 6 97a5 5 0 0 1-6 4.9v-2.07a3 3 0 1 0 0-5.66V92.1zM80 272h2v32h-2v-32zm37.9 32h-2.07a3 3 0 0 0-5.66 0h-2.07a5 5 0 0 1 9.8 0zM5.9 0A5.02 5.02 0 0 1 0 5.9V3.83A3 3 0 0 0 3.83 0H5.9zm294.2 0h2.07A3 3 0 0 0 304 3.83V5.9a5 5 0 0 1-3.9-5.9zm3.9 300.1v2.07a3 3 0 0 0-1.83 1.83h-2.07a5 5 0 0 1 3.9-3.9zM97 100a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-48 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 96a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-144a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm96 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM49 36a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-32 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM33 68a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 240a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm80-176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 48a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm112 176a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm-16 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 180a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0 16a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm0-32a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16 0a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM17 84a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm32 64a3 3 0 1 0 0-6 3 3 0 0 0 0 6zm16-16a3 3 0 1 0 0-6 3 3 0 0 0 0 6z'%3E%3C/path%3E%3C/svg%3E")}#page .container{display:flex;padding:0;justify-content:center;align-items:flex-start;padding-top:1.5rem}article{width:1140px;flex-shrink:0;padding:3rem;margin:0;background-color:hsl(0,0%,2%);border:1px solid hsl(210,7%,5%)}ul#leftnav{width:320px;flex-shrink:0;list-style:none;padding:0;margin:0 2.5rem 0 0;background-color:hsl(0,0%,2%);border:1px solid hsl(210,7%,5%)}#leftnav li{border-bottom:1px solid hsla(120,60%,70%,.2)}#leftnav li:last-child{border-bottom:none}#leftnav a{display:block;padding:.5rem 1rem;text-decoration:none;color:#fff}#leftnav a:hover,#leftnav a:focus{background-color:rgba(0,178.5,0,.1);color:rgb(0,178.5,0);border-radius:4px}@media(max-width: 1280px){#page .container{flex-direction:column;align-items:center}article,#leftnav{width:100%;max-width:900px;margin:1rem 0}#leftnav{margin-right:0}}code{font-family:"VT323","Courier New","SF Mono","Fira Code",Consolas,monospace;font-size:.875rem;background-color:hsl(210,7%,5%);color:#fff;padding:.25rem .5rem;border-radius:4px;border:1px solid hsla(120,60%,70%,.2);box-shadow:0 0 2px rgba(0,178.5,0,.1)}.small{font-size:.625rem}div.error,div.notice,div#debug{margin:2.5rem auto;width:900px;padding:1.5rem;border-radius:6px;border:1px solid}div.error{background-color:rgba(229.5,0,0,.1);color:rgb(229.5,0,0);border-color:rgb(229.5,0,0)}div.notice{background-color:hsla(120,80%,45%,.1);color:hsl(120,80%,45%);border-color:hsl(120,80%,45%)}div#debug{background-color:hsl(210,7%,5%);color:hsl(120,40%,45%);border-color:hsla(120,60%,70%,.2);margin-top:4rem;margin-bottom:4rem}.pages-table{width:100%;border:1px solid hsla(120,60%,70%,.2)}.pages-table th,.pages-table td{border:1px solid hsla(120,60%,70%,.2);text-align:left}.pages-table th{background-color:rgba(0,178.5,0,.05);color:hsl(120,52%,15%);font-weight:600}#edit-page-form-novaconium .form-group{margin-bottom:1rem}#edit-page-form-novaconium .form-group.fullwidth textarea{width:100%;resize:vertical}#edit-page-form-novaconium .checkbox-group{margin-top:1.5rem}#edit-page-form-novaconium input[type=text],#edit-page-form-novaconium input[type=number],#edit-page-form-novaconium textarea,#edit-page-form-novaconium select{background-color:hsl(210,7%,5%);border:1px solid hsla(120,60%,70%,.2);color:#fff;padding:.5rem;border-radius:4px;font-family:"VT323","Courier New","SF Mono","Fira Code",Consolas,monospace}#edit-page-form-novaconium input[type=text]:focus,#edit-page-form-novaconium input[type=number]:focus,#edit-page-form-novaconium textarea:focus,#edit-page-form-novaconium select:focus{border-color:rgb(0,178.5,0);box-shadow:0 0 0 .25rem rgba(0,178.5,0,.3);outline:none}#edit-page-form-novaconium input[type=checkbox]{accent-color:rgb(0,178.5,0)}#edit-page-form-novaconium button[type=submit]{background-color:rgb(0,178.5,0);color:hsl(0,0%,2%);border:none;padding:.5rem 1rem;border-radius:4px;cursor:pointer;font-family:"VT323","Courier New","SF Mono","Fira Code",Consolas,monospace}#edit-page-form-novaconium button[type=submit]:hover,#edit-page-form-novaconium button[type=submit]:focus{background-color:#090;box-shadow:0 0 4px rgba(0,178.5,0,.5)}#edit-page-form-novaconium p{color:hsl(120,40%,45%)}#edit-page-form-novaconium a{color:rgb(0,178.5,0)}#edit-page-form-novaconium a:hover{color:hsl(120,52%,15%);text-decoration:underline}#login{padding:0}#login input[type=text],#login input[type=password],#login button[type=submit]{width:100%;max-width:300px;padding:1rem;margin-bottom:1rem;box-sizing:border-box;font-size:1rem;border:1px solid hsla(120,60%,70%,.2);border-radius:4px;background:hsl(0,0%,2%);color:#fff}#login input[type=text]{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2'/%3E%3Ccircle cx='12' cy='7' r='4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:1rem center;background-size:20px;padding-left:3rem}#login input[type=password]{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='11' width='18' height='11' rx='2' ry='2'/%3E%3Cpath d='M7 11V7a5 5 0 0 1 10 0v4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:1rem center;background-size:20px;padding-left:3rem}#login button[type=submit]{background:rgb(0,178.5,0);border-color:rgb(0,178.5,0);cursor:pointer;transition:background .2s}#login button[type=submit]:hover{background:rgb(0,178.5,0);text-shadow:0 0 5px rgba(0,178.5,0,.5)}#login button[type=submit]::after{content:" →";margin-left:.5rem}#biglogo{position:relative;display:inline-block;padding:20px 0;border-radius:0;overflow:hidden}#biglogo::before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;background-image:linear-gradient(rgba(0, 255, 0, 0.02) 1px, transparent 1px),linear-gradient(90deg, rgba(0, 255, 0, 0.02) 1px, transparent 1px);background-size:20px 20px;opacity:.1;pointer-events:none}#biglogo::after{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg, transparent, #00ff00, transparent);opacity:.05;animation:scan 3s linear infinite}#biglogo .main{display:block;font-family:"Orbitron",sans-serif;font-size:4.5rem;font-weight:900;color:#fff;letter-spacing:.1em;line-height:.85;text-transform:uppercase;text-shadow:4px 4px 0 #222,5px 5px 0 #111,-1px -1px 0 lime,1px 1px 20px rgba(0,255,0,.3);filter:drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.8))}#biglogo .sub{display:block;font-family:"Orbitron",sans-serif;font-size:2.5rem;font-weight:700;color:#fff;letter-spacing:.15em;margin-top:.5rem;text-shadow:2px 2px 0 #222,-1px -1px 0 lime,1px 1px 10px rgba(0,255,0,.2);filter:drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.6))}#biglogo:hover .main{animation:glitch .3s infinite}@keyframes scan{0%{top:-1px}100%{top:100%}}@keyframes glitch{0%,100%{transform:translate(0)}20%{transform:translate(-2px, 2px)}40%{transform:translate(-2px, -2px)}60%{transform:translate(2px, 2px)}80%{transform:translate(2px, -2px)}}.tab-container{margin:1.5rem auto;background:hsl(0,0%,2%)}.tab-nav{display:flex;background-color:hsl(210,7%,5%);border-bottom:1px solid hsla(120,60%,70%,.2)}.tab-button{padding:.5rem 1rem;background:hsl(210,7%,5%);border:1px solid hsla(120,60%,70%,.2);border-bottom:none;cursor:pointer;font-size:14px;min-width:120px;text-align:center;color:#fff;font-family:"Courier New","SF Mono","Fira Code",Consolas,monospace}.tab-button:hover{background-color:hsl(210,7%,10%)}.tab-button+.tab-button{border-left:none}.tab-button.active{background-color:hsl(0,0%,2%);border-bottom:2px solid rgb(0,178.5,0);color:rgb(0,178.5,0);font-weight:bold}.tab-content{display:none;padding:1.5rem;background-color:hsl(0,0%,2%);color:#fff;border:none}.tab-content.active{display:block}#edit-page-title{margin-top:2rem}#edit-page-title #title{width:100%;font-size:1.9rem;padding:20px}#edit-page-title>div{font-size:.8rem;margin:8px 0 0 20px}.tooltip{position:relative;display:inline-block;cursor:help;font-size:16px;color:rgb(0,178.5,0);margin-left:.25rem;top:2px}.tooltip .tooltiptext{visibility:hidden;width:200px;background-color:hsl(210,7%,5%);color:#fff;text-align:left;border-radius:0;padding:.5rem;position:fixed;z-index:1000;opacity:0;transition:opacity .3s;font-size:14px;box-shadow:0 2px 5px rgba(0,0,0,.2);pointer-events:none}.tooltip .tooltiptext::after{content:"";position:absolute;top:-5px;left:10px;border-width:5px;border-style:solid;border-color:hsl(210,7%,5%) rgba(0,0,0,0) rgba(0,0,0,0) rgba(0,0,0,0)}.tooltip:hover .tooltiptext{visibility:visible;opacity:1}.tooltip-desc{position:absolute;left:-9999px}.editor-container{width:100%;min-height:400px}.ace-editor{height:400px;border:1px solid rgb(0,178.5,0);font-family:"Courier New","SF Mono","Fira Code",Consolas,monospace}.ace-editor .ace_gutter{background:hsl(210,7%,5%) !important;color:hsl(120,40%,45%) !important;border-right:1px solid rgb(0,178.5,0) !important}.ace-editor .ace_scroller{background:hsl(0,0%,2%) !important}.ace-editor .ace_text-layer .ace_print-margin{background:rgba(0,0,0,0) !important}.ace-editor .ace_marker-layer .ace_selection{background:rgba(0,178.5,0,.7) !important}.tags-dropdown{position:absolute;top:100%;left:0;right:0;max-height:200px;overflow-y:auto;background:hsl(210,7%,5%);border:1px solid hsla(120,60%,70%,.2);border-top:none;border-radius:0 0 4px 4px;list-style:none;margin:0;padding:0;z-index:10;opacity:0;visibility:hidden;transition:opacity .2s}.tags-dropdown[aria-expanded=true]{opacity:1;visibility:visible}.tags-dropdown li{padding:.25rem .5rem;cursor:pointer;color:#fff;font-size:14px;border-bottom:1px solid rgba(0,0,0,0)}.tags-dropdown li:hover,.tags-dropdown li.selected{background:rgba(0,178.5,0,.9);color:rgb(0,178.5,0)}.tags-dropdown li:last-child{border-bottom:none}.tags-input{position:relative}.tags-input{display:flex;flex-wrap:wrap;gap:.25rem;align-items:center;border:1px solid hsla(120,60%,70%,.2);padding:.25rem;background:hsl(210,7%,5%);min-height:40px;grid-column:2}.tags-input input{border:none;background:rgba(0,0,0,0);color:#fff;font-family:"Courier New","SF Mono","Fira Code",Consolas,monospace;font-size:14px;flex:1;min-width:100px;outline:none}.tags-input input::placeholder{color:hsl(120,40%,45%)}.tag-chip{display:inline-flex;align-items:center;background:rgba(0,178.5,0,.8);color:rgb(0,178.5,0);padding:.25rem .5rem;border-radius:4px;font-size:12px;max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tag-chip .tag-remove{background:none;border:none;color:inherit;font-size:16px;margin-left:.25rem;cursor:pointer;padding:0;line-height:1}.tag-chip .tag-remove:hover{opacity:.7}.tags-input input[list]::-webkit-calendar-picker-indicator{display:none}/*# sourceMappingURL=novaconium.css.map */ diff --git a/src/Logger.php b/src/Logger.php index 39d304b..c7f1635 100644 --- a/src/Logger.php +++ b/src/Logger.php @@ -1,4 +1,5 @@ url('/login'); diff --git a/services/Auth.php b/src/Services/Auth.php similarity index 71% rename from services/Auth.php rename to src/Services/Auth.php index bd4c9a0..36ab24c 100644 --- a/services/Auth.php +++ b/src/Services/Auth.php @@ -1,4 +1,5 @@ \ No newline at end of file +--> +{% include '@novaconium/javascript/page-edit.html.twig' %} + +{% if editor == 'ace' %} +{% include '@novaconium/javascript/ace.html.twig' %} +{% endif %} diff --git a/twig/head.html.twig b/twig/head.html.twig index cc462f6..fb475dd 100644 --- a/twig/head.html.twig +++ b/twig/head.html.twig @@ -37,4 +37,14 @@ {# STYLESHEET #} - \ No newline at end of file + + +{% if editor == 'ace' %} + + + + {# HTML syntax #} + {# Dark theme #} + {# Autocomplete #} + +{% endif %} \ No newline at end of file diff --git a/twig/javascript/ace.html.twig b/twig/javascript/ace.html.twig new file mode 100644 index 0000000..ae8003f --- /dev/null +++ b/twig/javascript/ace.html.twig @@ -0,0 +1,40 @@ + + \ No newline at end of file diff --git a/twig/javascript/page-edit.html.twig b/twig/javascript/page-edit.html.twig new file mode 100644 index 0000000..a44b722 --- /dev/null +++ b/twig/javascript/page-edit.html.twig @@ -0,0 +1,192 @@ + \ No newline at end of file diff --git a/views/editpage.html.twig b/views/editpage.html.twig deleted file mode 100644 index 54f98db..0000000 --- a/views/editpage.html.twig +++ /dev/null @@ -1,92 +0,0 @@ -{% extends '@novaconium/master.html.twig' %} - -{% block content %} -

    Edit Page - {{ title }}

    - -
    - - - - -
    - - -
    - -
    - - -
    - -
    - - -
    - -

    Metadata

    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -

    CMS Info

    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -

    Page Data

    -
    - - -
    - -
    - - -
    - -

    Created: {{ rows.created|date("Y-m-d H:i:s") }}

    -

    Last Updated: {{ rows.updated|date("Y-m-d H:i:s") }}

    - - - -
    - -{% endblock %} diff --git a/views/editpage/index.html.twig b/views/editpage/index.html.twig new file mode 100644 index 0000000..f329053 --- /dev/null +++ b/views/editpage/index.html.twig @@ -0,0 +1,62 @@ +{% extends '@novaconium/master.html.twig' %} + +{% block content %} +

    Edit Page - {{ title }}

    + +
    + + + + +
    + +
    + +
    + + + +
    + Last Updated: {{ rows.updated|date("Y-m-d H:i:s") }}, + Created: {{ rows.created|date("Y-m-d H:i:s") }} +
    +
    + +
    + + + + +
    + {% include '@novacore/editpage/tab-main.html.twig' %} +
    +
    + {% include '@novacore/editpage/tab-metadata.html.twig' %} +
    +
    + {% include '@novacore/editpage/tab-other.html.twig' %} +
    +
    + {% include '@novacore/editpage/tab-tweaks.html.twig' %} +
    +
    + {% include '@novacore/editpage/tab-notes.html.twig' %} +
    +
    + {% include '@novacore/editpage/tab-tags.html.twig' %} +
    +
    + +
    + +{% endblock %} diff --git a/views/editpage/tab-main.html.twig b/views/editpage/tab-main.html.twig new file mode 100644 index 0000000..262c6b4 --- /dev/null +++ b/views/editpage/tab-main.html.twig @@ -0,0 +1,16 @@ +
    + + +
    + + +
    + +
    + +
    {# Ace mounts here #} +
    +
    \ No newline at end of file diff --git a/views/editpage/tab-metadata.html.twig b/views/editpage/tab-metadata.html.twig new file mode 100644 index 0000000..9e4424e --- /dev/null +++ b/views/editpage/tab-metadata.html.twig @@ -0,0 +1,17 @@ + +

    Metadata

    + +
    + + +
    + +
    + + +
    + +
    + + +
    diff --git a/views/editpage/tab-notes.html.twig b/views/editpage/tab-notes.html.twig new file mode 100644 index 0000000..d4a085c --- /dev/null +++ b/views/editpage/tab-notes.html.twig @@ -0,0 +1,4 @@ +
    + + +
    \ No newline at end of file diff --git a/views/editpage/tab-other.html.twig b/views/editpage/tab-other.html.twig new file mode 100644 index 0000000..c08cb11 --- /dev/null +++ b/views/editpage/tab-other.html.twig @@ -0,0 +1,25 @@ +

    Sitemap

    + +
    + + +
    + +
    + + +
    + +
    + + +
    + + \ No newline at end of file diff --git a/views/editpage/tab-tags.html.twig b/views/editpage/tab-tags.html.twig new file mode 100644 index 0000000..3196e69 --- /dev/null +++ b/views/editpage/tab-tags.html.twig @@ -0,0 +1,12 @@ +

    Tags

    + +
    +
    + + {# Custom dropdown #} +
    + +
    \ No newline at end of file diff --git a/views/editpage/tab-tweaks.html.twig b/views/editpage/tab-tweaks.html.twig new file mode 100644 index 0000000..09c3ee1 --- /dev/null +++ b/views/editpage/tab-tweaks.html.twig @@ -0,0 +1,10 @@ +

    Page Data

    +
    + + +
    + +
    + + +
    \ No newline at end of file