final checks and fixes for launch

This commit is contained in:
Nick Yeoman 2025-12-07 20:33:42 -08:00
parent 08b8009dec
commit e5aadb3b82
15 changed files with 467 additions and 422 deletions

View File

@ -1,12 +1,23 @@
# Sass # Sass
Running Sass ## Docker
There is a dockerfile in the sass directory you can build an image with.
```bash
cd sass
docker build -t sass-container .
``` ```
## Running Sass
```bash
sudo docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app sass-container sass novaconium/sass/project.sass novaconium/public/css/novaconium.css sudo docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app sass-container sass novaconium/sass/project.sass novaconium/public/css/novaconium.css
``` ```
Compressed: Compressed:
``` ```bash
sudo docker run --rm -v $(pwd):/usr/src/app -w /usr/src/app sass-container sass --style=compressed novaconium/sass/project.sass novaconium/public/css/novaconium.css # Build Novaconium (compressed)
docker run --rm -v "$(pwd):/usr/src/app" -w /usr/src/app sass-container --style=compressed sass/novaconium.sass skeleton/novaconium/public/css/novaconium.css
``` ```

12
sass/Dockerfile Normal file
View File

@ -0,0 +1,12 @@
# Use an official Node.js image as a base
FROM node:16-slim
# Install Sass globally
RUN npm install -g sass \
&& npm cache clean --force
# Set working directory inside container
WORKDIR /usr/src/app
# Set entrypoint to Sass CLI
ENTRYPOINT ["sass"]

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,8 @@
@use '../abstracts' as * @use '../abstracts' as *
@use '../base' as * @use '../base' as *
#edit-page-form-novaconium body.novaconium
#edit-page-form-novaconium
// Form groups: Spacing // Form groups: Spacing
.form-group .form-group
margin-bottom: space('md') // 1rem margin-bottom: space('md') // 1rem

View File

@ -2,7 +2,7 @@
@use '../abstracts' as * @use '../abstracts' as *
#login body.novaconium #login
// No background or borderuse parent's ambient styling // No background or borderuse parent's ambient styling
padding: 0 // Or keep minimal if needed; adjust to 2rem if you want internal space padding: 0 // Or keep minimal if needed; adjust to 2rem if you want internal space
// No centering: left-aligned by default // No centering: left-aligned by default

View File

@ -1,4 +1,5 @@
#biglogo body.novaconium
#biglogo
position: relative position: relative
display: inline-block display: inline-block
padding: 20px 0 padding: 20px 0
@ -59,13 +60,13 @@
.main .main
animation: glitch 0.3s infinite animation: glitch 0.3s infinite
@keyframes scan @keyframes scan
0% 0%
top: -1px top: -1px
100% 100%
top: 100% top: 100%
@keyframes glitch @keyframes glitch
0%, 100% 0%, 100%
transform: translate(0) transform: translate(0)
20% 20%

View File

@ -3,16 +3,17 @@
@use '../abstracts' as * @use '../abstracts' as *
@use '../base' as * @use '../base' as *
// Main page wrapper: Centered flex body.novaconium
#page .container // Main page wrapper: Centered flex
#page .container
display: flex display: flex
padding: 0 padding: 0
justify-content: center justify-content: center
align-items: flex-start align-items: flex-start
padding-top: space('lg') padding-top: space('lg')
// Article content: Fixed width, no shrink // Article content: Fixed width, no shrink
article article
width: 1140px width: 1140px
flex-shrink: 0 flex-shrink: 0
padding: 3rem padding: 3rem
@ -20,7 +21,7 @@ article
background-color: $bg-dark background-color: $bg-dark
border: 1px solid $bg-darker border: 1px solid $bg-darker
ul#leftnav ul#leftnav
width: 320px width: 320px
flex-shrink: 0 flex-shrink: 0
list-style: none list-style: none
@ -29,13 +30,13 @@ ul#leftnav
background-color: $bg-dark background-color: $bg-dark
border: 1px solid $bg-darker border: 1px solid $bg-darker
#leftnav li #leftnav li
border-bottom: 1px solid color('border-light') border-bottom: 1px solid color('border-light')
&:last-child &:last-child
border-bottom: none border-bottom: none
#leftnav a #leftnav a
display: block display: block
padding: space('sm') space('md') // Consistent spacing padding: space('sm') space('md') // Consistent spacing
text-decoration: none text-decoration: none
@ -46,8 +47,8 @@ ul#leftnav
color: $accent-light // Accent on hover color: $accent-light // Accent on hover
border-radius: 4px border-radius: 4px
// Responsive: Stack on mobile (add to themes/ for media queries) // Responsive: Stack on mobile (add to themes/ for media queries)
@media (max-width: 1280px) // Your xl breakpoint @media (max-width: 1280px) // Your xl breakpoint
#page .container #page .container
flex-direction: column flex-direction: column
align-items: center align-items: center

View File

@ -3,17 +3,18 @@
@use '../abstracts' as * @use '../abstracts' as *
@use 'sass:color' // For color.adjust()non-deprecated color tweaks @use 'sass:color' // For color.adjust()non-deprecated color tweaks
// Simplified tab styling: Square borders, no rounds body.novaconium
.tab-container // Simplified tab styling: Square borders, no rounds
.tab-container
margin: space('lg') auto margin: space('lg') auto
background: $bg-dark background: $bg-dark
.tab-nav .tab-nav
display: flex display: flex
background-color: $bg-darker background-color: $bg-darker
border-bottom: 1px solid $border-light border-bottom: 1px solid $border-light
.tab-button .tab-button
padding: space('sm') space('md') padding: space('sm') space('md')
background: $bg-darker background: $bg-darker
border: 1px solid $border-light border: 1px solid $border-light
@ -37,7 +38,7 @@
color: $accent-light color: $accent-light
font-weight: bold font-weight: bold
.tab-content .tab-content
display: none display: none
padding: space('lg') padding: space('lg')
background-color: $bg-dark background-color: $bg-dark

View File

@ -2,8 +2,9 @@
@use 'sass:color' // For color.adjust()non-deprecated color tweaks @use 'sass:color' // For color.adjust()non-deprecated color tweaks
@use '../base' as * @use '../base' as *
// Tags Dropdown body.novaconium
.tags-dropdown // Tags Dropdown
.tags-dropdown
position: absolute position: absolute
top: 100% top: 100%
left: 0 left: 0
@ -41,11 +42,11 @@
&:last-child &:last-child
border-bottom: none border-bottom: none
.tags-input .tags-input
position: relative // For absolute dropdown position: relative // For absolute dropdown
// Tags Input // Tags Input
.tags-input .tags-input
display: flex display: flex
flex-wrap: wrap flex-wrap: wrap
gap: space('xs') gap: space('xs')
@ -69,7 +70,7 @@
&::placeholder &::placeholder
color: $text-muted color: $text-muted
.tag-chip .tag-chip
display: inline-flex display: inline-flex
align-items: center align-items: center
background: color.adjust($accent-light, $alpha: -0.2) background: color.adjust($accent-light, $alpha: -0.2)
@ -95,14 +96,14 @@
&:hover &:hover
opacity: 0.7 opacity: 0.7
// Tags Autocomplete (native datalist styling) // Tags Autocomplete (native datalist styling)
.tags-input input[list] .tags-input input[list]
// Existing input styles apply... // Existing input styles apply...
#tag-suggestions #tag-suggestions
// Native datalist not directly stylable, but options can be influenced via input focus // Native datalist not directly stylable, but options can be influenced via input focus
// For custom polyfill, add JS-generated <ul>, but native is fine for now // For custom polyfill, add JS-generated <ul>, but native is fine for now
// Browser-specific tweaks (Chrome/Firefox) // Browser-specific tweaks (Chrome/Firefox)
.tags-input input[list]::-webkit-calendar-picker-indicator .tags-input input[list]::-webkit-calendar-picker-indicator
display: none // Hide arrow if interfering display: none // Hide arrow if interfering

View File

@ -2,8 +2,9 @@
@use '../base' as * @use '../base' as *
@use 'sass:color' // Already there for adjusts @use 'sass:color' // Already there for adjusts
// Tooltip styling (mouse-follow version) body.novaconium
.tooltip // Tooltip styling (mouse-follow version)
.tooltip
position: relative position: relative
display: inline-block display: inline-block
cursor: help cursor: help
@ -41,7 +42,7 @@
visibility: visible visibility: visible
opacity: 1 opacity: 1
// Accessibility: Hidden tooltip text for screen readers // Accessibility: Hidden tooltip text for screen readers
.tooltip-desc .tooltip-desc
position: absolute position: absolute
left: -9999px left: -9999px

View File

@ -3,8 +3,9 @@
@use '../abstracts' as * @use '../abstracts' as *
@use '../base' as * @use '../base' as *
// Code blocks: Monospace lock-in with darker green tint body.novaconium
code // Code blocks: Monospace lock-in with darker green tint
code
font-family: 'VT323', $mono-font // Prioritize Matrix font font-family: 'VT323', $mono-font // Prioritize Matrix font
font-size: 0.875rem // Smaller for inline; reset has base font-size: 0.875rem // Smaller for inline; reset has base
background-color: color('bg-darker') // Deeper green-black background-color: color('bg-darker') // Deeper green-black
@ -14,37 +15,37 @@ code
border: 1px solid color('border-light') border: 1px solid color('border-light')
box-shadow: 0 0 2px rgba($accent-light, 0.1) // Subtle glow box-shadow: 0 0 2px rgba($accent-light, 0.1) // Subtle glow
// Utility: Small text (if still needed; consider rem-based) // Utility: Small text (if still needed; consider rem-based)
.small .small
font-size: 0.625rem // 10px equiv; use sparingly font-size: 0.625rem // 10px equiv; use sparingly
// Error/notice divs: Centered alerts with theme colors // Error/notice divs: Centered alerts with theme colors
div.error, div.notice, div#debug div.error, div.notice, div#debug
margin: space('xl') auto // Top/bottom spacing from map margin: space('xl') auto // Top/bottom spacing from map
width: 900px // Fixed width; add media query for mobile later width: 900px // Fixed width; add media query for mobile later
padding: space('lg') // Generous padding padding: space('lg') // Generous padding
border-radius: 6px border-radius: 6px
border: 1px solid border: 1px solid
div.error div.error
background-color: rgba(color('accent-error'), 0.1) // Subtle red tint background-color: rgba(color('accent-error'), 0.1) // Subtle red tint
color: color('accent-error') // Darker red text color: color('accent-error') // Darker red text
border-color: color('accent-error') border-color: color('accent-error')
div.notice div.notice
background-color: rgba(color('accent-success'), 0.1) // Green tint background-color: rgba(color('accent-success'), 0.1) // Green tint
color: color('accent-success') // Heavier green text color: color('accent-success') // Heavier green text
border-color: color('accent-success') border-color: color('accent-success')
div#debug div#debug
background-color: color('bg-darker') // Deeper bg for debug background-color: color('bg-darker') // Deeper bg for debug
color: $text-muted // Muted green color: $text-muted // Muted green
border-color: color('border-light') border-color: color('border-light')
margin-top: space('2xl') margin-top: space('2xl')
margin-bottom: space('2xl') margin-bottom: space('2xl')
// Tables: Simplified; reset handles collapse/padding // Tables: Simplified; reset handles collapse/padding
.pages-table .pages-table
width: 100% width: 100%
border: 1px solid color('border-light') // Green border border: 1px solid color('border-light') // Green border

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
{"version":3,"sourceRoot":"","sources":["../../../../sass/abstracts/_variables.sass","../../../../sass/base/_reset.sass","../../../../sass/base/_background.sass","../../../../sass/framework/_main.sass","../../../../sass/framework/_ui.sass","../../../../sass/framework/_forms.sass","../../../../sass/framework/_login_form.sass","../../../../sass/framework/_logo.sass","../../../../sass/framework/_tabs.sass","../../../../sass/framework/_edit_page.sass","../../../../sass/framework/_tooltip.sass","../../../../sass/framework/_ace.sass","../../../../sass/framework/_tags.sass"],"names":[],"mappings":"CAoEA,MACE,0BACA,8BACA,+BACA,mCACA,iCACA,oCACA,qCACA,qCACA,kCACA,yCACA,8CC1EF,EACE,sBAEF,KACE,eACA,gBACA,uBACA,iBDWQ,aCVR,MDYW,KCVb,KACE,SACA,UACA,YDgBW,kCCfX,iBDIQ,aCHR,MDKW,KCJX,iBAGF,kBACE,gBACA,gBACA,gBACA,qBAEF,GACE,iBAEF,GACE,eAEF,GACE,kBAEF,GACE,iBAEF,GACE,kBAEF,GACE,eAGF,EACE,eAEF,MACE,kBAEF,SACE,gBAEF,KACE,kBAGF,EACE,MDnCa,eCoCb,qBACA,sCACA,iCAEA,gBACE,oBDzCW,eC0CX,aAGJ,MACE,eACA,mBAEF,GACE,oBAGF,WACE,aACA,iBACA,qCACA,kCACA,MD7DW,KCgEb,cACE,YDvDU,uDCwDV,iBACA,oCACA,qBACA,kBAEF,IACE,aACA,YACA,cACA,oCACA,kBACA,SACE,gBACA,UAGJ,MACE,WACA,yBACA,aAEF,MACE,cACA,gBACA,2CAEF,GACE,gBAGF,6BACE,oBACA,kBACA,oCACA,MDpGW,KCqGX,oCACA,kBACA,aAEA,qDACE,aACA,aDxGW,eCyGX,wCAEJ,OACE,eACA,qCAEA,gBACE,WACA,mBAGJ,IACE,eACA,YACA,kBAEF,OACE,aAGF,GACE,YACA,WACA,oCACA,aAGF,gBACE,iCACA,mBAGF,aACE,KACE,2BACA,uBAEJ,YACE,8BACA,MDnJW,KCsJb,kBACE,8BACA,MDxJW,KEtBb,gBACI,sBACA,0uKCEF,iCACE,aACA,UACA,uBACA,uBACA,mBAGF,wBACE,aACA,cACA,aACA,SACA,iBHGM,aGFN,gCAEF,2BACE,YACA,cACA,gBACA,UACA,oBACA,iBHNM,aGON,gCAEF,4BACE,6CAEA,uCACE,mBAEJ,2BACE,cACA,mBACA,qBACA,MHjBS,KGmBT,kEACE,oCACA,MHlBS,eGmBT,kBAGJ,0BACE,iCACE,sBACA,mBAEF,iDACE,WACA,gBACA,cAEF,yBACE,gBCtDJ,qBACE,2EACA,kBACA,gCACA,MJcS,KIbT,qBACA,kBACA,sCACA,sCAGF,uBACE,kBAGF,+EACE,mBACA,YACA,eACA,kBACA,iBAEF,0BACE,oCACA,qBACA,4BAEF,2BACE,sCACA,uBACA,8BAEF,0BACE,gCACA,MJdS,iBIeT,kCACA,gBACA,mBAGF,6BACE,WACA,sCAEA,gEACE,sCACA,gBAEF,gCACE,qCACA,MJ/BS,iBIgCT,gBClDF,uDACE,mBAEA,0EACE,WACA,gBAEJ,2DACE,kBAGF,gOAIE,gCACA,sCACA,WACA,cACA,kBACA,2EAEA,wPACE,aLHO,eKIP,2CACA,aAEJ,gEACE,aLRS,eKWX,+DACE,iBLZS,eKaT,mBACA,YACA,mBACA,kBACA,eACA,2EAEA,0IACE,sBACA,sCAGJ,6CACE,ML3BO,iBK6BT,6CACE,ML7BS,eK+BT,mDACE,MLlCO,iBKmCP,0BCzDR,uBAEE,UAIA,+HAGE,WACA,gBACA,aACA,mBACA,sBACA,eACA,sCACA,kBACA,WNEM,aMDN,MNGS,6CMCT,uUACA,4BACA,gCACA,qBACA,kBAEF,4CACE,iVACA,4BACA,gCACA,qBACA,kBAEF,2CACE,WNZW,eMaX,aNbW,eMcX,eACA,0BAEA,iDACE,WNlBS,eMmBT,uCAGF,kDACE,aACA,kBCnDJ,yBACE,kBACA,qBACA,eACA,gBACA,gBAEA,iCACE,WACA,kBACA,MACA,OACA,QACA,SACA,gJACA,0BACA,WACA,oBAGF,gCACE,WACA,kBACA,MACA,OACA,QACA,WACA,qEACA,YACA,kCAEF,+BACE,cACA,kCACA,iBACA,gBACA,WACA,oBACA,gBACA,yBAGA,yFACA,mDAEF,8BACE,cACA,kCACA,iBACA,gBACA,WACA,qBACA,iBACA,0EACA,mDAIA,qCACE,8BAEN,gBACE,GACE,SACF,KACE,UAEJ,kBACE,QACE,uBACF,IACE,+BACF,IACE,gCACF,IACE,8BACF,IACE,gCCvEJ,+BACE,mBACA,WRcM,aQZR,yBACE,aACA,iBRWQ,eQVR,6CAEF,4BACE,mBACA,WRMQ,eQLR,sCACA,mBACA,eACA,eACA,gBACA,kBACA,WACA,YRSQ,uDQPR,kCACE,iCAEF,wCACE,iBAEF,mCACE,iBRZI,aQaJ,uCACA,MRTS,eQUT,iBAEJ,6BACE,aACA,eACA,iBRpBM,aQqBN,MRnBS,KQoBT,YAEA,oCACE,cC5CN,iBACI,gBAEA,wBACI,WACA,iBACA,aAEJ,qBACI,gBACA,oBCRN,yBACE,kBACA,qBACA,YACA,eACA,MViBW,eUhBX,mBACA,QAEA,sCACE,kBACA,YACA,iBVMM,eULN,MVMO,KULP,gBACA,gBACA,cACA,eACA,aACA,UACA,uBACA,eACA,oCACA,oBAEA,6CACE,WACA,kBACA,SACA,UACA,iBACA,mBACA,sEAEJ,4CACE,mBACA,UAGJ,8BACE,kBACA,aC1CJ,kBACE,WACA,iBAEF,YACE,aACA,gCACA,YXuBU,uDWpBV,wBACE,qCACA,kCACA,iDAEF,0BACE,mCAEF,8CACE,oCAGF,6CACE,yCCtBF,+BACE,kBACA,SACA,OACA,QACA,iBACA,gBACA,WZWQ,eYVR,sCACA,gBACA,0BACA,gBACA,SACA,UACA,WACA,UACA,kBACA,uBAEA,mDACE,UACA,mBAEF,kCACE,qBACA,eACA,MZPO,KYQP,eACA,sCAEA,mFAEE,8BACA,MZXO,eYaT,6CACE,mBAEN,4BACE,kBAGF,4BACE,aACA,eACA,WACA,mBACA,sCACA,eACA,WZ/BQ,eYgCR,gBACA,cAEA,kCACE,YACA,yBACA,MZrCO,KYsCP,YZ5BM,uDY6BN,eACA,OACA,gBACA,aAEA,+CACE,MZ3CK,iBY6CX,0BACE,oBACA,mBACA,8BACA,MZhDW,eYiDX,qBACA,kBACA,eACA,gBACA,gBACA,uBACA,mBAEA,sCACE,gBACA,YACA,cACA,eACA,mBACA,eACA,UACA,cAEA,4CACE,WAWN,2EACE","file":"novaconium.css"}

View File

@ -17,7 +17,7 @@
{# DARK MODE & THEME HINTS #} {# DARK MODE & THEME HINTS #}
<meta name="color-scheme" content="dark"> <meta name="color-scheme" content="dark">
<meta name="theme-color" content="#FFFFFF"> <meta name="theme-color" content="#000000">
{# OPEN GRAPH (OG) FOR SOCIAL SHARING #} {# OPEN GRAPH (OG) FOR SOCIAL SHARING #}
<meta property="og:title" content="{{ title | default('Welcome') }}"> <meta property="og:title" content="{{ title | default('Welcome') }}">
@ -28,16 +28,23 @@
{# PWA & FAVICONS #} {# PWA & FAVICONS #}
<link rel="manifest" href="site.webmanifest"> <link rel="manifest" href="site.webmanifest">
<link rel="apple-touch-icon" href="/icon.png"> <link rel="apple-touch-icon" href="/icon.png">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 32 32'><rect width='32' height='32' fill='%23000'/><text x='16' y='22' font-family='Orbitron,monospace' font-size='20' fill='%2300ff00' text-anchor='middle' dominant-baseline='middle'>N</text><circle cx='16' cy='16' r='2' fill='%2300ff00'/></svg>"> <link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="32x32" href="/path/to/favicon-32x32.png"> <!-- Fallback if needed -->
{# GOOGLE FONTS (CDN VIA PRECONNECT) #} {# GOOGLE FONTS (CDN VIA PRECONNECT) #}
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="{{ fonts | default('https://fonts.googleapis.com/css2?family=VT323:wght@400&family=Fira+Code:wght@400;500&display=swap&family=Material+Icons:wght@400;500&display=swap') }}" rel="stylesheet"> <link
href="{{ fonts | default('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&family=Roboto+Mono&family=Source+Code+Pro&family=Lato&family=Poppins&family=Material+Icons&family=Material+Icons+Outlined&family=VT323:wght@400&family=Fira+Code:wght@400;500&display=swap') }}"
rel="stylesheet"
>
{# STYLESHEET #} {# STYLESHEET #}
<link rel="stylesheet" href="/css/novaconium.css"> {% if pageclass == "novaconium" %}
<link rel="stylesheet" href="/css/novaconium.css">
{% else %}
<link rel="stylesheet" href="/css/main.css">
{% endif %}
{% if editor == 'ace' %} {% if editor == 'ace' %}
<!-- ACE Editor --> <!-- ACE Editor -->
@ -48,3 +55,9 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.2/ext-language_tools.min.js"></script> {# Autocomplete #} <script src="https://cdnjs.cloudflare.com/ajax/libs/ace/1.35.2/ext-language_tools.min.js"></script> {# Autocomplete #}
<!-- END ACE Editor --> <!-- END ACE Editor -->
{% endif %} {% endif %}
{# highlight.js #}
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/ir-black.min.css">

View File

@ -1,15 +1,16 @@
<div class="left"> <div class="left">
{% if pageclass == "novaconium" %}
<ul id="leftnav"> <ul id="leftnav">
<li><a href="/">Home</a></li> <li><a href="/">Home</a></li>
{% if username is not empty %} {% if username is not empty %}
<li><a href="/novaconium/dashboard">Dashboard</a></li> <li><a href="/novaconium/dashboard">Dashboard</a></li>
<li><a href="/novaconium/pages">Pages</a></li> <li><a href="/novaconium/pages">Pages</a></li>
<li><a href="/novaconium/messages">Messages</a></li> <li><a href="/novaconium/messages">Messages</a></li>
{% endif %}
{% if username is not empty %}
<li><a href="/novaconium/logout">Logout</a></li> <li><a href="/novaconium/logout">Logout</a></li>
{% else %} {% else %}
<li><a href="/novaconium/login">Login</a></li> <li><a href="/novaconium/login">Login</a></li>
{% endif %} {% endif %}
</ul> </ul>
{% endif %}
</div> </div>