Add IMAP webmail tag, admin/opensource subpage tiers, store/cart, htmleditor, uploads

New __imap*/__smtpsend/__eval Jet tags give templates real IMAP
(list/message/flag/delete/move/search/folders/accounts) and SMTP-send
capability, backing the new /email webmail client (email.jet/
email.menu, assets/images/email.js + newemail.js) and its
mainpagetemplate.jet-based page shell. Most of this tag family's
source was already being built into the live site (Tag.cpp already
registered __imap/__imaplist/__imapmessage/__imapflag/__imapdelete/
__eval) but had never actually been committed; this also registers
and commits the remaining five (__imapmove/__imapfolders/
__imapsearch/__smtpsend/__imapaccounts).

admin.page/admin.menu gain a real subpage tier (admin-email,
admin-newemail, admin-invoices, admin-products, admin-users) replacing
several previously top-level pages, mirrored by a similar
opensource.page subpage tier (opensource-overview/asm1802/barantmail/
jet/serverframework/synthmax) - old top-level pages retired via git
rename (asm1802.page, jet.page, serverframework.page,
admin_invoices.page); barantmail.page is dropped outright, folded into
opensource-barantmail.subpage.

New storefront (store.page, store-createstore.subpage,
barantstore.page) and cart flow (cart.jet, updatecartqty.proc,
removecartitem.proc, editproduct.page/selectproduct.proc/
update_product.proc for inventory maintenance against the barant
database).

New document upload/download manager (documents.jet, documents_api.jet,
documents_upload.proc, documents_delete.proc,
assets/images/documents.js + documents-page.js) with a persistent
floating panel, and a rich-text page editor (htmleditor.jet/.page,
createhtmleditor.proc, savehtmleditor.proc, assets/images/htmleditor.js
+ its icon/logo assets).

SESSIONCTL.tag: login now redirects back to the originally-requested
page instead of always landing on /account ($[start:0] vs $[start]
variable-name mismatch).

main.css/menu.bar/invoices.menu/jet_overview.section/login.menu:
styling and navigation updates for the above; new site assets (fonts,
images, audio) referenced by them.

jetc/build-assets.sh, list_jet_files.sh, lowercase_jet.py,
strip_fragments.py: small dev tooling used while building the above.
This commit is contained in:
Brad Arant committed 2026-09-06 04:14:00 +00:00
1 parent b0cadc3f08
commit c1491b044b
115 files changed
+6174 -137

No files matched your search

+156 -1
View File
@@ -42,6 +42,31 @@
* { box-sizing: border-box; }
* {
scrollbar-width: thin;
scrollbar-color: var(--bond-gold) var(--bond-bg);
}
::-webkit-scrollbar {
width: 11px;
height: 11px;
}
::-webkit-scrollbar-track {
background: var(--bond-bg);
}
::-webkit-scrollbar-thumb {
background-color: var(--bond-gold);
background-image: linear-gradient(180deg, var(--bond-gold-bright), var(--bond-gold));
background-clip: padding-box;
border: 2px solid var(--bond-bg);
border-radius: 8px;
}
::-webkit-scrollbar-thumb:hover {
background-image: linear-gradient(180deg, var(--bond-gold-bright), var(--bond-gold-bright));
}
::-webkit-scrollbar-corner {
background: var(--bond-bg);
}
body {
background: radial-gradient(ellipse at top, #1a1a20 0%, #0a0a0d 60%, #060607 100%);
background-attachment: fixed;
@@ -99,6 +124,10 @@ li { font-family: 8pt exo2; color: var(--bond-text); }
padding: 0px;
max-width: 1050px;
min-width: 1050px;
min-height: calc(100vh - 150px);
box-sizing: border-box;
display: flex;
flex-direction: column;
margin: auto;
font-family: exo2;
font-size: 10pt;
@@ -106,6 +135,18 @@ li { font-family: 8pt exo2; color: var(--bond-text); }
overflow: hidden;
}
/* The email client is the one page whose own content (a long message
list) can outgrow the viewport - everywhere else .pageclass is meant
to grow taller than the viewport for long content (normal document
scroll). Scoped to only this page via :has() so no other page's
layout changes: caps .pageclass at the same height it already uses
as a floor, so #email-list/#email-reading-pane's own overflow-y:auto
scrolls instead of the whole page growing past the viewport. */
.pageclass:has(#email-app) {
height: calc(100vh - 150px);
overflow: hidden;
}
input {
background: #101014;
color: var(--bond-text);
@@ -194,6 +235,19 @@ textarea.fieldinputerror {
background: var(--bond-line);
}
.user-badge {
display: inline-block;
padding: 3px 12px;
margin-bottom: 4px;
border-radius: 6px;
border: 1px solid var(--bond-gold);
background: linear-gradient(180deg, rgba(197, 164, 90, 0.28), rgba(197, 164, 90, 0.12));
box-shadow: 0 0 0.5em rgba(197, 164, 90, 0.25);
color: var(--bond-gold-bright);
font-weight: 600;
letter-spacing: 0.03em;
}
.sectionframecontents {
padding: 10px;
text-align: justify;
@@ -319,6 +373,28 @@ textarea.fieldinputerror {
border-radius: 3px;
}
#panelmenu-resizer {
flex-shrink: 0;
width: 9px;
cursor: col-resize;
position: relative;
background: var(--bond-line-soft);
border-radius: 3px;
}
#panelmenu-resizer:hover, #panelmenu-resizer.resizing {
background: var(--bond-gold);
}
#panelmenu-resizer svg {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
color: var(--bond-gold-bright);
pointer-events: none;
}
.panel table {
font: 12px exo2;
padding: 5px;
@@ -398,11 +474,12 @@ textarea.fieldinputerror {
padding: 2px 10px 3px 10px;
margin: 0px;
border-radius: 3px;
box-shadow: 0 0 0.5em rgba(197, 164, 90, 0.3), 0 0 0.15em rgba(227, 196, 126, 0.4);
transition: box-shadow 0.2s ease, background 0.2s ease;
}
.button:hover {
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.35);
box-shadow: 0 0 0.9em rgba(197, 164, 90, 0.55), 0 0 0.3em rgba(227, 196, 126, 0.6);
background: linear-gradient(180deg, #24242e, #1a1a20);
}
@@ -688,3 +765,81 @@ textarea.fieldinputerror {
margin-top: 12px;
min-height: 1.2em;
}
/* Site-wide floating file transfer manager (see documents.js) - lives
outside #content in mainpagetemplate.jet so it survives SPA
navigation, letting an upload/download keep running while browsing
to a different page. */
#filemgr-panel {
position: fixed;
bottom: 20px;
right: 20px;
z-index: 9000;
font-family: exo2;
font-size: 9pt;
}
#filemgr-toggle {
width: 44px; height: 44px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
position: relative;
cursor: pointer;
border: 1px solid var(--bond-gold);
background: linear-gradient(180deg, #1c1c24, #131318);
color: var(--bond-gold-bright);
box-shadow: 0 0 0.6em rgba(197, 164, 90, 0.35);
transition: box-shadow 0.2s ease, background 0.2s ease;
margin-left: auto;
}
#filemgr-toggle:hover {
box-shadow: 0 0 1em rgba(197, 164, 90, 0.6), 0 0 0.3em rgba(227, 196, 126, 0.6);
background: linear-gradient(180deg, #24242e, #1a1a20);
}
#filemgr-toggle svg { width: 20px; height: 20px; }
#filemgr-badge {
position: absolute; top: -4px; right: -4px;
min-width: 16px; height: 16px; padding: 0 3px;
border-radius: 8px;
background: var(--bond-gold-bright);
color: #131318;
font-size: 8pt; font-weight: bold;
display: flex; align-items: center; justify-content: center;
}
#filemgr-badge:empty { display: none; }
#filemgr-body {
display: none;
width: 320px;
max-height: 400px;
margin-bottom: 10px;
margin-left: auto;
border-radius: 8px;
border: 1px solid var(--bond-line);
background: var(--bond-bg-2);
box-shadow: 0 10px 40px rgba(0,0,0,0.6);
overflow: hidden;
display: flex;
flex-direction: column;
}
#filemgr-panel.filemgr-expanded #filemgr-body { display: flex; }
#filemgr-header {
display: flex; align-items: center; justify-content: space-between;
padding: 8px 12px;
border-bottom: 1pt solid var(--bond-line-soft);
color: var(--bond-gold-bright);
font-weight: 600;
}
#filemgr-clear { font-weight: normal; font-size: 8pt; color: var(--bond-text-dim); cursor: pointer; }
#filemgr-clear:hover { color: var(--bond-text); }
#filemgr-list { overflow-y: auto; padding: 6px; }
#filemgr-empty { color: var(--bond-text-dim); padding: 10px; text-align: center; }
.filemgr-item { padding: 8px; border-radius: 6px; margin-bottom: 4px; background: rgba(255,255,255,0.03); }
.filemgr-item-row { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; }
.filemgr-item-icon { flex-shrink: 0; width: 14px; height: 14px; color: var(--bond-gold-bright); }
.filemgr-item-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.filemgr-item-status { flex-shrink: 0; font-size: 8pt; color: var(--bond-text-dim); }
.filemgr-item.filemgr-failed .filemgr-item-status { color: #c66; }
.filemgr-item.filemgr-done .filemgr-item-status { color: var(--bond-gold-bright); }
.filemgr-progress-track { height: 4px; border-radius: 2px; background: rgba(255,255,255,0.08); overflow: hidden; }
.filemgr-progress-fill { height: 100%; width: 0%; background: var(--bond-gold-bright); transition: width 0.15s ease; }
.filemgr-item.filemgr-done .filemgr-progress-fill { background: #6c6; }
.filemgr-item.filemgr-failed .filemgr-progress-fill { background: #c66; }