made a bookmarks page for website links and such

public/img/sitebuttons/bensect.space.png

This is a binary file and will not be displayed.

public/img/sitebuttons/corru.observer.gif

This is a binary file and will not be displayed.

public/img/sitebuttons/corru.observer.png

This is a binary file and will not be displayed.

public/img/sitebuttons/doqmeat.com.png

This is a binary file and will not be displayed.

public/img/sitebuttons/espy.world.gif

This is a binary file and will not be displayed.

public/img/sitebuttons/espy.world.png

This is a binary file and will not be displayed.

public/img/sitebuttons/megaknecht.com.gif

This is a binary file and will not be displayed.

public/img/sitebuttons/megaknecht.com.png

This is a binary file and will not be displayed.

public/img/sitebuttons/myrrh.city.png

This is a binary file and will not be displayed.

public/img/sitebuttons/pocl.vip.gif

This is a binary file and will not be displayed.

public/img/sitebuttons/pocl.vip.png

This is a binary file and will not be displayed.

public/sitebutton.gif

This is a binary file and will not be displayed.

public/sitebutton.png

This is a binary file and will not be displayed.

+20
src/components/SiteButton.astro
···
··· 1 + --- 2 + const { url, name, filetype = ".gif" } = Astro.props; 3 + --- 4 + 5 + <a href={url}> 6 + <picture> 7 + <source 8 + srcset={`/img/sitebuttons/${name}.png`} 9 + media="(prefers-reduced-motion: reduce)" 10 + /> 11 + <img srcset={`/img/sitebuttons/${name}${filetype}`} alt={name} /> 12 + </picture> 13 + </a> 14 + 15 + <style> 16 + a { 17 + display: inline-block; 18 + margin-bottom: 6px; 19 + } 20 + </style>
+9
src/content/blog/v02.md
···
··· 1 + --- 2 + title: Site update V0.2 3 + bio: Added bookmarks page. 4 + pub: 2025-11-03 5 + --- 6 + 7 + There's now a [bookmarks](/bookmarks) page. It links to a bunch of other websites or tools that I personally find cool. Go check em out if you wanna. 8 + 9 + Oh yea, I also made a 88x31 button for my site too.
+47
src/content/bookmarks/personalsites.ts
···
··· 1 + import { type bookmark } from "../config"; 2 + 3 + export const buttonwall: bookmark[] = [ 4 + { 5 + name: "doqmeat.com", 6 + url: "https://doqmeat.com", 7 + filetype: ".png", 8 + }, 9 + { 10 + name: "corru.observer", 11 + url: "https://corru.observer", 12 + filetype: ".gif", 13 + }, 14 + { 15 + name: "pocl.vip", 16 + url: "https://pocl.vip", 17 + filetype: ".gif", 18 + }, 19 + { 20 + name: "bensect.space", 21 + url: "https://bensect.space", 22 + filetype: ".png", 23 + }, 24 + { 25 + name: "espy.world", 26 + url: "https://espy.world/", 27 + filetype: ".gif", 28 + }, 29 + { 30 + name: "megaknecht.com", 31 + url: "https://megaknecht.com/", 32 + filetype: ".gif", 33 + }, 34 + { 35 + name: "myrrh.city", 36 + url: "https://myrrh.city/", 37 + filetype: ".png", 38 + }, 39 + ]; 40 + 41 + export const nobutton: bookmark[] = [ 42 + { 43 + name: "yugoslavia.best", 44 + url: "https://yugoslavia.best/", 45 + description: "Click here to experience instant brain explosion.", 46 + }, 47 + ];
+16
src/content/bookmarks/resources.ts
···
··· 1 + import { type bookmark } from "../config"; 2 + 3 + export const resources: bookmark[] = [ 4 + { 5 + name: "Marginalia Search", 6 + url: "https://marginalia-search.com/", 7 + description: 8 + "Internet search engine that doesn't shove ads down your throat, unlike google.", 9 + }, 10 + { 11 + name: "DaFont", 12 + url: "https://www.dafont.com/", 13 + description: 14 + "Free fonts for commercial and personal use. Make sure to check the license on each font before using.", 15 + }, 16 + ];
+8 -1
src/content/config.ts
··· 1 import { defineCollection, z } from "astro:content"; 2 - import { glob } from "astro/loaders"; 3 4 const blog = defineCollection({ 5 loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
··· 1 import { defineCollection, z } from "astro:content"; 2 + import { glob, file } from "astro/loaders"; 3 + 4 + export type bookmark = { 5 + name: string; 6 + url: string; 7 + description?: string; 8 + filetype?: ".gif" | ".png"; 9 + }; 10 11 const blog = defineCollection({ 12 loader: glob({ pattern: "**/*.md", base: "./src/content/blog" }),
+59
src/pages/bookmarks.astro
···
··· 1 + --- 2 + import Base from "../components/Base.astro"; 3 + import SinglePage from "../layouts/SinglePage.astro"; 4 + import SiteButton from "../components/SiteButton.astro"; 5 + import { buttonwall, nobutton } from "../content/bookmarks/personalsites.ts"; 6 + import { resources } from "../content/bookmarks/resources.ts"; 7 + --- 8 + 9 + <Base 10 + title="BOOKMARKS" 11 + graph={{ 12 + description: "Links to other cool sites.", 13 + }} 14 + > 15 + <SinglePage> 16 + <h1 slot="header">Bookmarks</h1> 17 + <img src="/sitebutton.gif" alt="site button animated" /> 18 + <img src="/sitebutton.png" alt="site button static" class="hidebutton" /> 19 + <p>Button above you can use to link to my website.</p> 20 + <p> 21 + If you are here and you don't want your site listed please let me know to 22 + remove it. Contact at 23 + <a href="mailto:entomoviscera@gmail.com">entomoviscera@gmail.com</a>. 24 + </p> 25 + <h2>Cool zone</h2> 26 + { 27 + buttonwall.map((x) => ( 28 + <SiteButton name={x.name} url={x.url} filetype={x.filetype} /> 29 + )) 30 + } 31 + <ul> 32 + { 33 + nobutton.map((x) => ( 34 + <li> 35 + <a href={x.url}>{x.name}</a> - {x.description} 36 + </li> 37 + )) 38 + } 39 + </ul> 40 + <h2>Resources</h2> 41 + <ul> 42 + { 43 + resources.map((x) => ( 44 + <li> 45 + <a href={x.url}>{x.name}</a> - {x.description} 46 + </li> 47 + )) 48 + } 49 + </ul> 50 + </SinglePage> 51 + </Base> 52 + 53 + <style> 54 + @media (prefers-reduced-motion: reduce) { 55 + .hidebutton { 56 + display: none; 57 + } 58 + } 59 + </style>
+16 -5
src/pages/home.astro
··· 25 <img src="/img/icons/poweroff.png" alt="return to landing page" /> 26 </a> 27 </header> 28 <main class="grid"> 29 <div class="bwbox flex flexcenter hidedeco"> 30 <img src="/img/sprites/sunfl1.png" alt="" /> ··· 36 title={post[0].data.title} 37 time={`${post[0].data.pub.getFullYear()}-${post[0].data.pub.getMonth() + 1}-${post[0].data.pub.getDate()}`} 38 /> 39 - <div class="center"> 40 <a href="/blog" class="button">::ALL_POSTS::</a> 41 <a href="/rss.xml" class="button">::RSS_FEED::</a> 42 </div> ··· 52 gap: 8px; 53 } 54 55 #blog { 56 grid-column: span 3; 57 } 58 59 .wrapper { ··· 64 .grid { 65 display: grid; 66 grid-template-columns: repeat(4, 1fr); 67 - } 68 - 69 - .button { 70 - margin-bottom: 13px; 71 } 72 73 @media (max-width: 86ch) {
··· 25 <img src="/img/icons/poweroff.png" alt="return to landing page" /> 26 </a> 27 </header> 28 + <nav class="bwbox flex flexcenter center"> 29 + <a href="bookmarks" class="button">::BOOKMARKS::</a> 30 + </nav> 31 <main class="grid"> 32 <div class="bwbox flex flexcenter hidedeco"> 33 <img src="/img/sprites/sunfl1.png" alt="" /> ··· 39 title={post[0].data.title} 40 time={`${post[0].data.pub.getFullYear()}-${post[0].data.pub.getMonth() + 1}-${post[0].data.pub.getDate()}`} 41 /> 42 + <div class="blogbuttons center flex flexcenter"> 43 <a href="/blog" class="button">::ALL_POSTS::</a> 44 <a href="/rss.xml" class="button">::RSS_FEED::</a> 45 </div> ··· 55 gap: 8px; 56 } 57 58 + nav { 59 + gap: 13px 15px; 60 + } 61 + 62 + nav a, .blogbuttons a { 63 + flex: 1 1; 64 + } 65 + 66 #blog { 67 grid-column: span 3; 68 + } 69 + 70 + .blogbuttons { 71 + gap: 8px; 72 } 73 74 .wrapper { ··· 79 .grid { 80 display: grid; 81 grid-template-columns: repeat(4, 1fr); 82 } 83 84 @media (max-width: 86ch) {
+2 -1
src/styles/main.css
··· 39 line-height: 1.5rem; 40 } 41 42 - p { 43 margin: 13px 0; 44 } 45
··· 39 line-height: 1.5rem; 40 } 41 42 + p, 43 + ul { 44 margin: 13px 0; 45 } 46