Base Blaster — SPARK Edition
From a legacy standalone app to the TNT 2026 ecosystem.
One working app. Five CSS decisions. Zero logic changes.
This page documents the renovation of Base Blaster — a number-base conversion app
originally built in 2025 as BaseBlasterF52025-06-25-Stg1/base10ToBaseNOrig.html —
into the TNT 2026 JS App ecosystem.
The app logic (place value table building, base conversion, the hex lightbulb modal) was correct and working. Nothing in it changed. The renovation was entirely about the shell: navbar, hero, footer, CSS architecture, and dependency hygiene. That distinction — shell vs. logic — is the central lesson of this session.
base10ToBaseNOrig and its style sheet base-blaster-orig and javascript
placeValueOrig is an app that lets us convert a base10 integer into a different base
2–16. I’d like to make it fit into our current TNT ecosystem as does app
ambigMsg. We can use the images/energyWaves.jpg for the hero image.
We need a refactor so that the updated base blaster app has the same type of navbar and footer
as does ambigMsg. We’ll also want a spark-bar and SEO too.
Let’s call the new app base10ToBaseN.html and its styles
base-blaster-b10-N-styles.css and placeValueB10_N.js for its javascript.
As usual, I’ll want a chatlog, baseBlasterSPARKChatlog.html that’s like
what we had for ambigMsg app. Let’s start the chatlog with this prompt,
knowing that we are basing much of this new work on the original app in the legacy area:
base10ToBaseNOrig.html
This prompt names every output file before the work begins: base10ToBaseN.html,
base-blaster-b10-N-styles.css, placeValueB10_N.js, and
baseBlasterSPARKChatlog.html. That is not just housekeeping — it defines the exact
scope of the session and prevents the AI from choosing its own names (which would likely be inconsistent
with the project’s existing conventions).
The reference to ambigMsg transfers a complete specification without
writing one. Saying “the same type of navbar and footer as does ambigMsg” communicates:
navbar-expand-xl, sticky-top, all standard TNT nav links, tnt-base-styles.css,
standard footer with icon nav, copyright span, validate link, and linkGuard.js. All of
that in four words.
The final sentence — “start the chatlog with this prompt” — is forward planning about documentation. By making the chatlog part of the deliverable from the very first message, the user ensures the reasoning is captured in real time rather than reconstructed afterward.
What the original app does:
- Accepts any non-negative integer up to 12 digits (max 999,999,999,999)
- Displays a base-10 place-value table: powers of 10 on top, their decimal values in the middle, and the digits on the bottom
- Converts the same number to a user-selected base (2–16) and displays the same three-row table for the target base
- Both tables update live on every keystroke via an
inputevent listener - For bases greater than 10 where A–F appear, a lightbulb icon appears that opens a Bootstrap modal explaining the hex alphabet
- The two-column layout uses
.yellow1-bg(#F8DB63) for the input column and.orange-bg(#E69F4D) for the base column — a strong visual organization that orients students at a glance
What the original does not do (and the renovation does not add): animation, sound, or any UI beyond the table. The elegance of this app is its focused simplicity. A number in, place values out.
Preserved unchanged:
- All application logic —
buildTable(),buildBaseTable(),convertToBase(),handleEnter(),clearAll(), thenMaxceiling, and all event listeners. Not a single line of business logic was edited. - The two-column color scheme —
.yellow1-bgand.orange-bgare preserved in the new CSS file and carry the same hex values. This is the app’s visual signature; it would be wrong to discard it. - The hex lightbulb modal — structure, content, and Bootstrap trigger logic are unchanged.
- The
energyWaves.jpgimage — used in the original jumbotron; now the hero background image. - The
blast16.jpgintro figure — retained in the app’s intro section below the hero. - Zen Dots font — the app’s signature display font; used in the hero title.
Changed:
- Navbar — replaced with the full TNT 2026 navbar
(
navbar-expand-xl, sticky-top, all site links). - Jumbotron → Hero section — the Bootstrap 4-era jumbotron
pattern replaced with the TNT 2026 hero section;
energyWaves.jpgmoved from CSS background to the hero’s CSS background. - Spark-bar added — links to this chatlog; standard TNT pattern.
- Footer — replaced with the standard TNT footer (icon nav, copyright span, validate link).
- CSS architecture — see Decision 1 below.
- Dead imports removed — see Decision 2 below.
- Bootstrap Icons → Font Awesome — see Decision 3 below.
- Modal placement — see Decision 4 below.
- SEO meta tags added;
tnt-base-styles.cssandlinkGuard.jswired in;myInit()updated with copyright and validate-link initialization.
The original base-blaster-styles-orig.css contains these rules:
a { text-decoration: none; font-weight: bold; }
main { background-image: url("../images/moroccan-flower-bg-15pcnt.png"); }
footer { padding-top: 10px; font-size: .8em; border-top: #9F9889 solid 1px; }
footer div#footerContent { max-width: 500px; padding-bottom: 10px; }
footer li a img { width: 50px; height: auto; }
In a standalone app, bare tag selectors are harmless. In the TNT ecosystem, shared
with tnt-base-styles.css and Bootstrap, they are collisions. a{} would
override the navbar link styles. footer{} would fight tnt-base-styles.css’s
footer rules. main{} would impose a Moroccan tile background on a page that uses
energyWaves.jpg.
The new base-blaster-b10-N-styles.css contains zero bare tag selectors.
Everything it defines is page-unique: #hero, .spark-bar,
.yellow1-bg, .orange-bg, .zen-dots-regular. Shared element
rules (footer, nav, body) are handled by tnt-base-styles.css.
The rule: before embedding any standalone CSS into a shared ecosystem,
scan for bare tag selectors. Every one is a potential collision. Either scope it (prefix with an ID
or class unique to this page) or delete it (if tnt-base-styles.css already handles it
correctly).
The original HTML loaded two CDN libraries that the app never uses:
<script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.js"></script> <script src="https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/addons/p5.sound.min.js"></script>
Neither is referenced anywhere in placeValueOrig.js or in the HTML.
They are artefacts of the scaffolding template used when the project was first generated —
copied in and never removed.
Each unused CDN import costs a network round-trip on every page load. p5.js is a substantial library (~1.4 MB unminified). Loading it for an app that builds plain HTML tables with DOM methods is pure waste.
Both were removed from base10ToBaseN.html. The app works identically
without them because it never needed them. This is also a teaching moment: scaffolding templates often
include more than any single project needs. Removing unused dependencies is part of professional
practice, not optional cleanup.
The lightbulb icon in the hex-explanation button used Bootstrap Icons:
<i class="bi bi-lightbulb-fill text-warning"></i>
Every other TNT 2026 app uses Font Awesome 6.5 exclusively. Keeping Bootstrap Icons here would require loading a second icon font CDN just for one symbol — a cost of about 250 KB for a single icon in a project that already loads Font Awesome.
Replaced with <i class="fas fa-lightbulb text-warning"></i>.
Visually indistinguishable to the student; internally consistent with the ecosystem. The original
CSS that applied a sepia/hue-rotate filter to the masthead icon is also not needed in the new version —
the TNT navbar uses the standard SVG dynamite icon which requires no filter.
In the original HTML, the #hexInfoModal div was nested inside
#r1c2Div — the orange column div. This is a structural mistake that the original
browser renders correctly (Bootstrap extracts modals from their position via JavaScript), but
it violates HTML best practice and can cause z-index and scroll-lock issues in complex layouts.
Bootstrap’s own documentation recommends placing modal markup as a direct
child of <body>, or at minimum outside of any transformed or overflow-clipped
ancestor. A deeply nested position inside a column div satisfies neither condition.
In base10ToBaseN.html, the modal is placed between the
</main> closing tag and the <footer> — the same
pattern used in ambigMsgIndex.html. The visual and behavioral result is identical
to the original; the structural position is correct.
- Bare tag selectors are landmines in shared stylesheets.
a{},footer{}, andmain{}are fine in isolation. In a shared ecosystem, they override rules from other stylesheets in unpredictable ways depending on load order. Before merging any standalone CSS into a larger project, audit every selector. If it selects a tag, it needs a scope prefix or a deletion. - Remove dead dependencies before they calcify. The p5.js imports in the original were artefacts of a scaffold template. They were harmless until they become a maintenance mystery: why is this app loading a graphics library? By removing them now, the renovation leaves a cleaner starting point for every future developer. Dependencies that aren’t used should not survive a renovation.
- Pick one icon library and use it everywhere. Using two icon libraries for one project is two CDN requests, two CSS files, and two sets of class-name conventions to remember. TNT uses Font Awesome 6.5. Everything that uses an icon uses Font Awesome. When a scaffold or legacy app brings in something different, swap it on entry — not later when the inconsistency becomes confusing.
- Modals belong near the body, not nested in content columns.
Bootstrap’s JavaScript correctly extracts modals from wherever they appear in the DOM,
but that robustness is not a license to place them arbitrarily. A modal inside a transformed
or overflow-clipped ancestor will eventually break. The correct position is after
</main>, before<footer>— consistent, predictable, and safe in all layout contexts.
| File | Status | What changed |
|---|---|---|
base10ToBaseN.html |
New | TNT navbar, hero (energyWaves.jpg), spark-bar, footer, SEO; myInit()
updated; modal relocated; tnt-base-styles.css + linkGuard.js |
styles/base-blaster-b10-N-styles.css |
New | Hero background, spark-bar, yellow/orange column classes; no bare tag selectors |
scripts/placeValueB10_N.js |
Logic unchanged | File renamed; minor code-style cleanup; Bootstrap Icons reference removed (icon is in HTML, not JS) |
baseBlasterSPARKChatlog.html |
New | This page |
base10ToBaseNOrig.html |
Preserved | Legacy original — untouched reference in BaseBlasterSPARK2026-08-24-Stg2/ |
styles/base-blaster-styles-orig.css |
Preserved | Legacy original — untouched |
scripts/placeValueOrig.js |
Preserved | Legacy original — untouched |
| p5.js + p5.sound imports | Removed | Dead imports from scaffold template; app never called a single p5 function |