12b812ed-f283-4328-aa03-41acf2879cf3

This commit is contained in:
Z User 2026-10-30 02:46:06 +00:00
parent 698fc1c2a3
commit a97d5a17ad
10 changed files with 89 additions and 10 deletions

View file

@ -1 +1 @@
1195
1107

View file

@ -1,4 +1,15 @@
// OVE — sticky footer status bar: micro-stats + version stamp + engine health.
// OVE — sticky footer status bar: micro-stats + maker credit + version stamp
// + engine health.
//
// v7.9 credit block: "© {year} · Site Created & Deployed by Sum'ting White" +
// a "View my portfolio at zcreations.dev" link, centered in the footer's
// blank area. Flex choreography: from xl the credit sits INLINE between the
// stats and the right-hand stamp — its xl:mx-auto splits the free space so
// it centers in the blank area while the right group (xl:ml-0) hugs the edge.
// Below xl there isn't room, so the credit is order-last + w-full: it drops
// to its own centered row under the stats row (the stats + health stay on
// row one via the right group's ml-auto). All zinc-* utilities follow the
// visitor's base theme (each base remaps the ramp — globals.css).
'use client'
@ -19,7 +30,7 @@ export function FooterBar() {
return (
<footer className="mt-auto border-t border-zinc-800/80 bg-zinc-950/90 backdrop-blur">
<div className="mx-auto flex max-w-[1800px] items-center gap-3 overflow-hidden px-4 py-2 font-mono text-[11px] tabular-nums text-zinc-500 sm:gap-4">
<div className="mx-auto flex max-w-[1800px] flex-wrap items-center gap-x-3 gap-y-1.5 overflow-hidden px-4 py-2 font-mono text-[11px] tabular-nums text-zinc-500 sm:gap-x-4">
<span className="hidden min-w-0 items-center gap-1 sm:inline-flex">
SRC: <span className="text-zinc-300">{source.toUpperCase()}</span>
{sourceTitle && (
@ -46,8 +57,28 @@ export function FooterBar() {
SCRIPT: <span className="ml-1 truncate text-zinc-300">{scriptName}</span>
</span>
{/* maker credit (v7.9) — centered in the blank area from xl; on
narrower screens it drops to its own centered row */}
<div className="order-last flex w-full shrink-0 flex-wrap items-center justify-center gap-x-4 gap-y-1 xl:order-none xl:mx-auto xl:w-auto">
{/* copyright span wraps at a word boundary on very narrow phones
(the link stays on one line — a URL must never break) */}
<span className="max-w-full">
© <span suppressHydrationWarning>{new Date().getFullYear()}</span> · Site Created &amp; Deployed
by Sum&rsquo;ting White
</span>
<a
href="https://zcreations.dev"
target="_blank"
rel="noopener noreferrer"
title="Open zcreations.dev in a new tab"
className="whitespace-nowrap rounded-xs text-zinc-300 underline decoration-zinc-500/60 underline-offset-2 transition-colors hover:text-emerald-300 hover:decoration-emerald-400 focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none"
>
View my portfolio at zcreations.dev
</a>
</div>
{/* version stamp (left of the engine-health dot) + engine health */}
<div className="ml-auto flex shrink-0 items-center gap-3 sm:gap-4">
<div className="ml-auto flex shrink-0 items-center gap-3 sm:gap-4 xl:ml-0">
<span
className="text-zinc-600"
title={`${APP_NAME} — version ${APP_VERSION}`}

0
src/components/ava/share-dialogs.tsx Normal file → Executable file
View file

30
src/components/ava/whats-new-dialog.tsx Normal file → Executable file
View file

@ -7,6 +7,14 @@
// visitor hasn't seen yet — stored per visitor in localStorage and cleared
// the moment the dialog is opened (mount-guarded so SSR never mismatches,
// same pattern as the header's ThemeToggle).
//
// v7.9 typographic tidy-up: every release box opens under a hairline divider
// (border-zinc-800 — a ramp step, so it follows the visitor's base theme via
// the globals.css remaps), and each change row is a two-column grid — the
// kind tag top-RIGHT justified against an invisible vertical line (the
// column boundary), the description top-LEFT justified with word wrap in the
// right column — so every description, in every release, starts on the same
// pixel column instead of jogging with each tag's width.
'use client'
@ -33,10 +41,14 @@ const KIND_META: Record<ChangeKind, { label: string; cls: string }> = {
removed: { label: 'Removed', cls: 'border-zinc-500/40 bg-zinc-500/10 text-zinc-400' },
}
/** One release: version chip + name + change rows with kind tags. */
/** One release: hairline divider + version chip + name + change rows with
* kind tags (two-column grid — see the v7.9 note up top). */
function ReleaseSection({ note, current }: { note: ReleaseNote; current: boolean }) {
return (
<section aria-label={`Version ${note.version} release notes`}>
<section
aria-label={`Version ${note.version} release notes`}
className="border-t border-zinc-800 pt-5"
>
<div className="flex flex-wrap items-center gap-2">
<span
className={cn(
@ -59,16 +71,24 @@ function ReleaseSection({ note, current }: { note: ReleaseNote; current: boolean
{note.changes.map((c, i) => {
const meta = KIND_META[c.kind]
return (
<li key={i} className="flex items-start gap-2">
// invisible two-column table: fixed-width tag column (sized to
// the widest tag, "IMPROVED"), the gap-x between the columns IS
// the invisible vertical line — perfectly straight down the list
<li
key={i}
className="grid grid-cols-[4.5rem_minmax(0,1fr)] items-start gap-x-3"
>
<span
className={cn(
'mt-px shrink-0 rounded border px-1.5 py-px font-mono text-[9px] font-semibold uppercase tracking-wider leading-relaxed',
'mt-px justify-self-end rounded border px-1.5 py-px font-mono text-[9px] font-semibold uppercase tracking-wider leading-relaxed',
meta.cls,
)}
>
{meta.label}
</span>
<span className="min-w-0 flex-1 text-xs leading-relaxed text-zinc-300">{c.text}</span>
<span className="min-w-0 text-left text-xs leading-relaxed text-zinc-300">
{c.text}
</span>
</li>
)
})}

0
src/lib/ava/share-codec.ts Normal file → Executable file
View file

14
src/lib/release-notes.ts Normal file → Executable file
View file

@ -33,6 +33,20 @@ export interface ReleaseNote {
}
export const RELEASE_NOTES: ReleaseNote[] = [
{
version: '7.9',
name: 'Footer credit + changelog polish',
changes: [
{
kind: 'added',
text: 'The footer now signs the work — “© 2026 · Site Created & Deployed by Sum’ting White” (year always current) with a clickable “View my portfolio at zcreations.dev” that opens the portfolio in a new tab.',
},
{
kind: 'improved',
text: 'What’s New tidy-up: a theme-matched divider now sits above every release box, and the Added / Improved / Fixed / Removed tags right-align against an invisible column so every description lines up on the same edge.',
},
],
},
{
version: '7.8',
name: 'Share strings, supersized',

0
src/lib/server/audio-files.ts Normal file → Executable file
View file

View file

@ -12,6 +12,20 @@
// warns in the console when the two drift apart.
//
// History:
// 7.9 — footer credit + What's New polish. The footer's blank middle now
// carries the maker's signature: "© {year} · Site Created &
// Deployed by Sum'ting White" (year generated from the clock,
// hydration-guarded) with a "View my portfolio at zcreations.dev"
// link that opens zcreations.dev in a new tab — centered in the
// blank area from xl (mx-auto between the stats and the version
// stamp), dropping to its own centered row on narrower screens so
// nothing ever crowds. The What's New dialog got a typographic
// tidy-up: a hairline divider above every release box
// (border-zinc-800 — a ramp step, so it matches every base theme
// through the globals.css remaps), and each change row became an
// invisible two-column grid — the kind tag top-right justified
// against the column boundary, the description top-left with word
// wrap — so all descriptions start on the same pixel column
// 7.8 — share strings 2.0: ~72% shorter than the script (was ~49%). The
// base-62 idea, cranked to 11,172… 32,164: after the symbol
// dictionary (which grew ~170 data-mined entries — every function
@ -260,4 +274,4 @@
export const APP_NAME = 'Open Visualization Engine'
export const APP_SHORT = 'OVE'
export const APP_VERSION = '7.8'
export const APP_VERSION = '7.9'

0
tool-results/read_1793257458971_e7e497778ba8.txt Normal file → Executable file
View file

0
tool-results/read_1793257461037_d5a576fe8974.txt Normal file → Executable file
View file