12b812ed-f283-4328-aa03-41acf2879cf3
This commit is contained in:
parent
698fc1c2a3
commit
a97d5a17ad
10 changed files with 89 additions and 10 deletions
|
|
@ -1 +1 @@
|
|||
1195
|
||||
1107
|
||||
|
|
|
|||
|
|
@ -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 & Deployed
|
||||
by Sum’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
0
src/components/ava/share-dialogs.tsx
Normal file → Executable file
30
src/components/ava/whats-new-dialog.tsx
Normal file → Executable file
30
src/components/ava/whats-new-dialog.tsx
Normal file → Executable 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
0
src/lib/ava/share-codec.ts
Normal file → Executable file
14
src/lib/release-notes.ts
Normal file → Executable file
14
src/lib/release-notes.ts
Normal file → Executable 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
0
src/lib/server/audio-files.ts
Normal file → Executable 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
0
tool-results/read_1793257458971_e7e497778ba8.txt
Normal file → Executable file
0
tool-results/read_1793257461037_d5a576fe8974.txt
Normal file → Executable file
0
tool-results/read_1793257461037_d5a576fe8974.txt
Normal file → Executable file
Loading…
Reference in a new issue