diff --git a/public/vendored/README.md b/public/vendored/README.md new file mode 100644 index 0000000..5e2cfba --- /dev/null +++ b/public/vendored/README.md @@ -0,0 +1,14 @@ +# Vendored reader icons + +Favicons of the reader sites in `src/lib/readers.ts`, vendored so the +extension ships them instead of hot-linking third-party hosts. Fetched +2026-08-08: + +- `standard.svg` — https://standard-reader.app/favicon.svg, as served. +- `leaflet.png` — https://leaflet.pub/icon.png (96×96), downscaled to 32×32. +- `docs-surf.png` — https://docs.surf/favicon-32x32.png, as served. +- `pdsls.png` — https://pdsls.dev/favicon.ico (actually a 512×512 WebP), + converted to a 32×32 PNG. + +These are third-party marks; refresh them from the sources above rather +than editing them. diff --git a/public/vendored/docs-surf.png b/public/vendored/docs-surf.png new file mode 100644 index 0000000000000000000000000000000000000000..33c92267443596837f481beefd31808781853af8 GIT binary patch literal 2811 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 WTZ@;!_`txxz~JfX=d#Wzp$PyS`7(w8 literal 0 HcmV?d00001 diff --git a/public/vendored/pdsls.png b/public/vendored/pdsls.png new file mode 100644 index 0000000000000000000000000000000000000000..d1babcf0357e7e1b4cf268432f0cea70629df687 GIT binary patch literal 1627 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANN9N}eu`Ar*7phWqBkgp2+= zxA*2x+ecFC%skc7bA-43fxskt(Jyeyw9b@XulQL~8?3kQ0M=bD-8&{yyhPg-BjvLFJpIvGHJ=t*E>m|L%O@qWc zHdnu&TYawlyybn%=ZycgA63p{(v;ty9Hd)+?&(T+ z-TA!2<;a)$^7oUMUb0_*X8P`>TbJIkxA~a$>x>w`M8o^v%O=h>eR}4z%~O7!4<|mP zsOx-PH~HkYE2mUDE}h8BanAhp?Be6T6=FaPr6>S%I?ryqIKpUIxv|pz}2!yLbgxsnl5R-k4h(!n^L8*U|JvQC~$A z7UlkSKR5sE~XAI{m7Sg61ZjIe(w4%Wc2=C6hzo?0NY=FaMo0w+&(y zSJO{5-)Jyu9Wm=dm2)#J4-&Jp0D} zd|BSUx<3xjukR~===STWZS28`#s6N=n-;l0v)sU1IPCOM zi_SwXmMgb(Ey~IfohZYF29kmvmd_;7kzis`uUuE$}bk=uH zWt?DiL;d8!iGs5axi>wMWoGqO5c6Di$(L`c6$iuJyNhpquidP8;|}M+#vM`)E!#S7 z6h?H@Nm+5 zaqad*iQwyRU%rjidUnjzfaNXsiUZ+OQm^Y~dQaIF60pa3y2_{Q2~8L0SxjI4@8sdP z+c`g1l@;#}i_+Fm^_9Lo=T*$dy*_ULT!MZzEOpA^Sg>52rNw7M@k7yG&n~5aTb?%; z?O;}tdELnKEWyL;Sm^zE|F6HD?DbM}>6M(dF*U))m51){-D+fDpm2Kkbl%3YCOi?97TC?c|M=ikGR-|wwB`r*U;|37aZ{jMLgW8>EU zkDm0@TRwXDS(v$eu41U({PEuH1={kZ7Qy!@Y-@N8qD04K>V19`AX48vNJ%RRWns*oXZfkt1BeBYy z-RNc5Eh7cR2Gs_?MFIi4?k?ED%3yUTmWd&1_4%yRX51#%S?25z6F9)kJYDVbKK*4E zSN*eVxOdOW-1XlqmxV%09Sqb2BmKJ64F6Bdvf*>c3)2^5@R_rRSCxy6ErCg4%Vl4u ziL3vu(`|HL6{@eY?+W|T&f58ZyoEyi)6BO-uJqab)NH%Ow%KAGl@D(uTX*fWxvIUp z{P;ZgP~GtQ_?a{RB^O8Ue!OI})!ki+qU~D+OzdN3@$){BW95ome@j_B-%i=9K9a>T zWbMCaM;g~%p7(s^($MP0%W)59NvB=9FOvIS*-|w8)bc+2O>f^;e{cUE_3rRv{=E;q zq%XXZ72^ui^Pj8!wQGO$5}j97txcux_x#^)GU-1zopr E0A4&EG5`Po literal 0 HcmV?d00001 diff --git a/public/vendored/standard.svg b/public/vendored/standard.svg new file mode 100644 index 0000000..a73902f --- /dev/null +++ b/public/vendored/standard.svg @@ -0,0 +1,19 @@ + + + S + diff --git a/src/lib/readers.test.ts b/src/lib/readers.test.ts index 066a846..de715b8 100644 --- a/src/lib/readers.test.ts +++ b/src/lib/readers.test.ts @@ -105,4 +105,12 @@ describe('READERS', () => { it('DEFAULT_READER_ID refers to an existing reader', () => { expect(READERS.some((r) => r.id === DEFAULT_READER_ID)).toBe(true) }) + + // Existence of the files themselves is checked post-build by + // scripts/verify-dist.mjs, which scans built JS for /vendored/ references. + it('every reader icon is an extension-rooted vendored path', () => { + for (const r of READERS) { + expect(r.icon, r.id).toMatch(/^\/vendored\/[\w.-]+\.(png|svg)$/) + } + }) }) diff --git a/src/lib/readers.ts b/src/lib/readers.ts index 5a8f532..5b3a67e 100644 --- a/src/lib/readers.ts +++ b/src/lib/readers.ts @@ -22,6 +22,8 @@ import type { DocInfo, PubInfo } from './types' export interface Reader { id: string name: string + /** Extension-root path to the reader's vendored favicon (public/vendored/). */ + icon: string pubUrl: (pub: PubInfo) => string | null docUrl: (pub: PubInfo, doc: DocInfo) => string | null } @@ -32,6 +34,7 @@ export const DEFAULT_READER_ID = 'standard' export const READERS: Reader[] = [ { id: 'standard', + icon: '/vendored/standard.svg', name: 'Standard Reader', pubUrl: (pub) => { const rkey = parseAtUri(pub.uri)?.rkey @@ -44,6 +47,7 @@ export const READERS: Reader[] = [ }, { id: 'leaflet', + icon: '/vendored/leaflet.png', name: 'Leaflet', pubUrl: (pub) => { const rkey = parseAtUri(pub.uri)?.rkey @@ -53,12 +57,14 @@ export const READERS: Reader[] = [ }, { id: 'docs-surf', + icon: '/vendored/docs-surf.png', name: 'Docs.surf', pubUrl: (pub) => `https://docs.surf/profile/${pub.did}`, docUrl: () => null, }, { id: 'pdsls', + icon: '/vendored/pdsls.png', name: 'PDSls (raw record)', pubUrl: (pub) => `https://pdsls.dev/${pub.uri}`, docUrl: (_pub, doc) => `https://pdsls.dev/${doc.uri}`,