Files
zeekayandHanzo Dev d7992661ea The 8.x page rewrites predate the rebrand, and put the old addresses back
The convergence branch forked before 8e54e16 removed the last shinkai
references, and it rewrote guidelines, privacy and terms wholesale. Rebasing it
onto main therefore reintroduced eight of them: five support/legal/dmca/privacy
addresses, one signup host, and the note in app-icon.tsx explaining where the
dead artwork urls came from.

The addresses are the user-visible half and go back to hanzo.ai. The comment is
a true statement about where the catalog was inherited from, so it keeps the
fact and drops the name.

Co-authored-by: Hanzo Dev <[email protected]>
2026-08-04 18:22:48 -07:00

37 lines
1.3 KiB
TypeScript

'use client'
/**
* An app's artwork — and the fallback that is currently doing all of the work.
*
* The card grid and the app page both show it, at two sizes, and both have to
* survive artwork that does not load. Today that is every app: each `icon` in
* the data is a PRESIGNED R2 URL inherited from the upstream store this catalog
* was forked from, signed 2025-11-05 with `X-Amz-Expires=86400`, so all 202
* have been dead links since the following day. The grid had no fallback at all and rendered the
* browser's broken-image glyph with the alt text spilling out of the 4rem box;
* the app page had one, but only for a MISSING url, never a failing one. Both
* are the same fact — "show the artwork, or the initial" — so it is stated
* here, once, and both surfaces are covered by the same rule.
*/
import { useState } from 'react'
export function AppIcon({
app,
lg = false,
}: {
app: { name: string; icon?: string }
/** The page hero renders the same mark at 6rem; the card at 4rem. */
lg?: boolean
}) {
const [failed, setFailed] = useState(false)
const className = lg ? 'app-icon lg' : 'app-icon'
if (!app.icon || failed) {
return <div className={`${className} fallback`}>{app.name[0]}</div>
}
return (
<img className={className} src={app.icon} alt={app.name} onError={() => setFailed(true)} />
)
}