madebydanny.uk written in html, css, and a lot of JavaScript I don't understand madeydanny.uk
html css javascript

new update!

+280 -555
+16 -5
404.html
··· 1 1 <!DOCTYPE html> 2 2 <html lang="en"> 3 3 <head> 4 - <title>404 Not Found</title> 5 4 <meta charset="UTF-8"> 6 - <link rel ="stylesheet" href="/css/index.css"> 5 + <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 + <title>error 404</title> 7 + <link rel="stylesheet" href="/css/style.css"> 7 8 </head> 8 9 <body> 9 - <h1>404 Not Found</h1> 10 - <p>The page you are looking for does not exist.</p> 11 - <p><a href="index.html">Return to Home</a></p> 10 + <div id="terminal"> 11 + <div id="output"> 12 + <pre class="prompt">client@ssh-madebydanny-uk ~ % ssh visitor@104.21.10.10</pre> 13 + <p class="welcome"><span class="accent">Error 404</span> Page not Found</p> 14 + 15 + </div> 16 + 17 + <div id="output"> 18 + <br> 19 + <p class="login">&copy; 2024-2025 <span class="accent">Made by Danny UK</span>, by Daniel Morrisey</p> 20 + </div> 21 + </div> 22 + </body> 12 23 </html>
+74
css/style.css
··· 1 + /* Custom Fonts and Colors */ 2 + :root { 3 + --bg-color: #1a1a1a; 4 + --text-color: #ffffff; 5 + --accent-color: #ff9933; /* A vibrant orange */ 6 + --font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace; 7 + } 8 + 9 + /* Base Styles */ 10 + body { 11 + background-color: var(--bg-color); 12 + color: var(--text-color); 13 + font-family: var(--font-family); 14 + font-size: 14px; 15 + margin: 0; 16 + padding: 20px; 17 + height: 100vh; 18 + box-sizing: border-box; 19 + } 20 + 21 + /* Terminal Container */ 22 + #terminal { 23 + max-width: 800px; 24 + margin: 0 auto; 25 + /* Optional: subtle border to make it look like a window */ 26 + /* border: 1px solid var(--accent-color); */ 27 + padding: 10px; 28 + height: 100%; 29 + overflow-y: auto; /* Allow scrolling for long outputs */ 30 + } 31 + 32 + /* Output Text */ 33 + #output p { 34 + margin: 0; /* Remove default paragraph spacing */ 35 + white-space: pre-wrap; /* Preserve formatting and wrap text */ 36 + } 37 + 38 + /* Specific Output Styling */ 39 + .prompt { 40 + color: var(--accent-color); 41 + font-weight: bold; 42 + } 43 + .welcome { 44 + color: var(--text-color); 45 + } 46 + .login { 47 + color: #888888; /* Slightly gray for less important info */ 48 + } 49 + .error { 50 + color: #ff5555; /* Red for errors */ 51 + } 52 + .accent { 53 + color: var(--accent-color); 54 + } 55 + 56 + /* Input Line */ 57 + #input-line { 58 + display: flex; 59 + align-items: center; 60 + margin-top: 10px; 61 + } 62 + 63 + /* Input Field */ 64 + #command-input { 65 + flex-grow: 1; /* Take up all available space */ 66 + background: transparent; 67 + border: none; 68 + color: var(--text-color); 69 + font-family: inherit; 70 + font-size: inherit; 71 + outline: none; /* Remove focus outline */ 72 + caret-color: var(--accent-color); /* Change the cursor color */ 73 + padding-left: 0; /* Align with prompt */ 74 + }
-116
css/v18.css
··· 1 - body { 2 - background-color: black; 3 - color: #fff; 4 - font-family: "Indie Flower", cursive; 5 - font-weight: 600; 6 - font-style: normal; 7 - } 8 - .light-mode{ 9 - background-color: white; 10 - color: black; 11 - font-family: "Indie Flower", cursive; 12 - font-weight: 600; 13 - font-style: normal; 14 - } 15 - h3 { 16 - font-family: "Indie Flower", cursive; 17 - font-weight: 600; 18 - font-style: normal; 19 - font-size: 30px; 20 - } 21 - subtitle { 22 - font-family: "Indie Flower", cursive; 23 - font-weight: 600; 24 - font-style: normal; 25 - font-size: 32px; 26 - } 27 - h2 { 28 - font-family: "Indie Flower", cursive; 29 - font-weight: 600; 30 - font-style: normal; 31 - font-size: 35px; 32 - } 33 - nav ul { 34 - list-style-type: none; 35 - margin: 0; 36 - padding: 0; 37 - overflow: hidden; 38 - } 39 - nav ul li { 40 - float: left; 41 - } 42 - nav ul li a { 43 - display: block; 44 - color: rgb(218, 12, 218); 45 - text-align: center; 46 - padding: 14px 16px; 47 - text-decoration: none; 48 - font-family: "Indie Flower", cursive; 49 - font-weight: 600; 50 - font-style: normal; 51 - } 52 - .light-mode nav ul li a:hover { 53 - color:black; 54 - } 55 - nav ul li a:hover { 56 - color:white; 57 - } 58 - .column { 59 - float: left; 60 - height: 300px; 61 - height: 100vh; 62 - width: 80%; 63 - } 64 - @media only screen and (max-width: 720px) { 65 - .column { 66 - width: 100%; 67 - } 68 - } 69 - .row:after { 70 - content: ""; 71 - display: table; 72 - clear: both; 73 - } 74 - a { 75 - color: blueviolet; 76 - text-decoration: none; 77 - } 78 - a:hover { 79 - color: white; 80 - text-decoration: underline; 81 - } 82 - .light-mode a:hover { 83 - color: black; 84 - text-decoration: underline; 85 - } 86 - p i { 87 - color:red 88 - } 89 - ul li i:hover { 90 - color:white; 91 - } 92 - p i:hover { 93 - color:white; 94 - } 95 - p i a { 96 - color:red 97 - } 98 - p i a:hover { 99 - color:white; 100 - } 101 - footer i a { 102 - color:blueviolet; 103 - } 104 - .status { 105 - border-bottom: dashed 2px rgb(218, 12, 218) 106 - } 107 - .status p { 108 - padding: 3px; 109 - } 110 - hr { 111 - border: dashed 2px rgb(218, 12, 218); 112 - } 113 - .loading { 114 - opacity: 0.6; 115 - font-style: italic; 116 - }
-16
img.md
··· 1 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img1.jpg" alt="Placeholder Image 1" class="gallery-item" loading="lazy"> 2 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img10.jpg" alt="Placeholder Image 2" class="gallery-item" loading="lazy"> 3 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img11.png" alt="Placeholder Image 3" class="gallery-item" loading="lazy"> 4 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img12.jpg" alt="Placeholder Image 4" class="gallery-item" loading="lazy"> 5 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img13.png" alt="Placeholder Image 6" class="gallery-item" loading="lazy"> 6 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img14.png" alt="Placeholder Image 7" class="gallery-item" loading="lazy"> 7 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img15.png" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 8 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img16.png" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 9 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img2.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 10 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img3.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 11 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img4.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 12 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img5.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 13 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img6.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 14 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img7.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 15 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img8.jpg" alt="Placeholder Image 8" class="gallery-item" loading="lazy"> 16 - <img src="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/photos/img9.jpg" alt="Placeholder Image 6" class="gallery-item" loading="lazy">
+23 -113
index.html
··· 4 4 <meta charset="UTF-8"> 5 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 6 <title>madebydanny.uk</title> 7 - <!--Site SEO--> 8 7 <link rel="icon" id="favicon" href="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/seo/favicon.webp"> 9 8 <meta name="description" id="meta-description" content="Posting everything into the endless jet stream of posts"> 10 9 <!--Social SEO--> ··· 12 11 <meta property="og:description" id="og-description" content="Posting everything into the endless jet stream of posts"> 13 12 <meta property="og:type" content="website"> 14 13 <meta property="og:url" content="https://madebydanny.uk/"> 15 - <meta property="og:image" id="og-image" content="https://imrs.madebydanny.uk/?url=https://cloudflareisawesome.madebydanny.uk/madebydanny.uk/seo/og-img.png"> 16 - <!--Google Fonts--> 17 - <script src="https://kit.fontawesome.com/0ca27f8db1.js" crossorigin="anonymous"></script> 18 - <link rel="preconnect" href="https://fonts.googleapis.com"> 19 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 20 - <link href="https://fonts.googleapis.com/css2?family=Alan+Sans:wght@300..900&family=Indie+Flower&display=swap" rel="stylesheet"> 21 - <link rel="stylesheet" href="/css/v18.css"> 22 - <style> 23 - </style> 14 + <meta property="og:image" id="og-image" content="ogimg.png"> 15 + <link rel="stylesheet" href="/css/style.css"> 24 16 </head> 25 17 <body> 26 - <div id="google_translate_element"></div> 27 - <nav> 28 - <ul> 29 - <li><a onclick="myFunction()">Toggle dark mode</a></li> 30 - <li><a href="/followonbsky.html?did=madebydanny.uk">Bluesky</a></li> 31 - <li><a href="https://blog.madebydanny.uk">Blog</a></li> 32 - <li><a href="#socials">Socials</a></li> 33 - <li><a href="#projects">Projects</a></li> 34 - <li><a href="https://altly.madebydanny.uk">ALTly</a></li> 35 - <li><a href="/cdn/index.html">MBD CDN</a></li> 36 - </ul> 37 - </nav> 38 - <div class="row"> 39 - <div class="column"> 40 - <div class="status"> 41 - <p><i>Current Status:</i> <span id="status-content" class="loading">Loading...</span></p> 42 - <p>View status history on <a href="https://kibun.social/users/madebydanny.uk">kibun.social</a></p> 18 + <div id="terminal"> 19 + <div id="output"> 20 + <pre class="prompt">client@ssh-madebydanny-uk ~ % ssh visitor@104.21.10.10</pre> 21 + <p class="welcome">Hello I'm Daniel Morrisey and welcome to my tiny website.</p> 22 + <p class="welcome">Don't expect to find much here as this website isn't really used.</p> 23 + <br> 24 + <p class="login">Last login: <span id="login-time"></span> from unkown ip</p> 25 + <p class="login">Type <span class="accent">help</span> to see available commands.</p> 26 + </div> 27 + 28 + <div id="input-line"> 29 + <span class="prompt prefix">visitor@104.21.10.10:~#&nbsp;</span> 30 + <input type="text" id="command-input" autofocus> 31 + </div> 32 + 33 + <div id="output"> 34 + <br> 35 + <p class="login">&copy; 2024-2025 <span class="accent">Made by Danny UK</span>, by Daniel Morrisey</p> 36 + </div> 43 37 </div> 44 - <h2>welcome to my tiny website</h2> 45 - <p>Hi, I'm Daniel Morrisey. Posting on Bluesky is my part time job and I love to play Stardew Valley and Raft.</p> 46 - <p>You can find me on Bluesky <i>(the best social media platform)</i>, but I'm also on Threads and Mastodon <i><a href="#socials">(view my social links)</a></i> I run my own Bluesky PDS that you can use if you want to, just DM me on Bluesky or email me.</p> 47 - <hr> 48 - <h3>things to do</h3> 49 - <p>Things you can do and cool websites you can checkout</p> 50 - <ul> 51 - <li><a href="https://madebydanny.uk/followonbsky.html?did=madebydanny.uk">Follow me on Bluesky</a></li> 52 - <li><a href="#projects">Checkout my projects</a></li> 53 - <li><a href="#leaflets">Read my blog</a></li> 54 - </ul> 55 - <hr> 56 - <h3>AT Links</h3> 57 - <p>Social links for AT Protocol apps</p> 58 - <ul> 59 - <li><a target="_blank" href="https://blog.madebydanny.uk">Leaflet</a></li> 60 - <li><a target="_blank" href="https://tangled.org/madebydanny.uk">Tangled</a></li> 61 - <li><a target="_blank" href="https://kibun.social/users/madebydanny.uk">Kibun</a></li> 62 - </ul> 63 - <hr> 64 - <h3 id="socials">social links</h3> 65 - <p>Here are my socials but <b>I mostly use Bluesky</b> so follow me there</p> 66 - <ul id="socials"> 67 - <li><a target="_blank"href="https://madebydanny.uk/followonbsky.html?did=alt.pds.madebydanny.uk"><i class="fa-brands fa-bluesky"></i> - Bluesky ALT <i>(@alt.pds.madebydanny.uk)</i></a></li> 68 - <li><a target="_blank"href="https://madebydanny.uk/followonbsky.html?did=madebydanny.uk"><i class="fa-brands fa-bluesky"></i> - Bluesky Main <i>(@madebydanny.uk)</i></a></li> 69 - <li><a target="_blank"href="https://threads.com/madebydanny.uk"><i class="fa-brands fa-threads"></i> - Threads</a></li> 70 - <li><a target="_blank"href="https://mastodon.social/@danielmorrisey"><i class="fa-brands fa-mastodon"></i> - Mastodon<i>.social</i></a></li> 71 - <li><a target="_blank"href="https://writing.madebydanny.uk"><i class="fa-brands fa-medium"></i> - Medium</a></li> 72 - </ul> 73 - <hr> 74 - <h3 id="projects">projects</h3> 75 - <p>Simple projects and tools made by me, <i>(<a target="_blank" href="https://tangled.org/madebydanny.uk">all code is public on Tangled</a>)</i></p> 76 - <ul> 77 - <li><a target="_blank" href="https://altly.madebydanny.uk"><b>ATLly</b></a> - Make social media alt text using Claude Sonnet 4.5</li> 78 - <li><a target="_blank" href="https://madebydanny.uk/followonbsky.html?did=claude.altq.net"><b>Claude for Bluesky</b></a> - A simple bluesky bot you can "@" to ask questions and get a responce from Claude Sonnet 4.5</li> 79 - <li><a target="_blank" href="https://lamppost.madebydanny.uk"><b>Lamppost</b></a> - Generate images using Stable Diffusion <i>(ai)</i> for free</li> 80 - <li><a target="_blank" href="/cdn/index.html"><b>MBD CDN</b></a> - A free for life CDN powered by the Cloudflare network</li> 81 - </ul> 82 - <hr> 83 - <h3 id="leaflets">newest leaflets</h3> 84 - <p>A feed for my Leaflet pub, <a href="https://blog.madebydanny.uk">Daniel's Notes & Thoughts</a></p> 85 - <ul id="leaflet-feed" class="loading"> 86 - <li>Loading blog posts...</li> 87 - </ul> 88 - <hr> 89 - <h3 id="tangled">pinned tangled repos</h3> 90 - <p>The pinned repos from <a target="_blank" href="https://tangled.org/madebydanny.uk">my Tangled account</a></p> 91 - <ul id="tangled-repos" class="loading"> 92 - <li>Loading repositories...</li> 93 - </ul> 94 - <hr> 95 - <h3>made possible thanks to</h3> 96 - <p><a href="https://madebydanny.uk/followonbsky.html?did=tangled.org">@tangled.org</a>, <a href="https://madebydanny.uk/followonbsky.html?did=wisp.place">@wisp.place</a>, <a href="https://madebydanny.uk/followonbsky.html?did=nekomimi.pet">@nekomimi.pet</a>, <a href="https://madebydanny.uk/followonbsky.html?did=juli.ee">@juli.ee</a>, <a href="https://lovable.dev">lovable.dev</a>, <a href="https://pdsls.dev">@pdsls.dev</a>, <a href="https://cloudflare.com">cloudflare.com</a>, <a href="https://madebydanny.uk/followonbsky.html?did=/vscode.dev">@vscode.dev</a>, <a href="https://github.com">Github</a>, <a href="https://madebydanny.uk/followonbsky.html?did=j4ck.xyz">@j4ck.xyz</a>, <a href="/followonbsky.html?did=upcloud.com">@upcloud.com</a>, <a href="https://tailscale.com">tailscale.com</a>, <a href="https://raspberrypi.com">raspberrypi.com</a>, <a href="https://ubuntu.com">Ubuntu</a>, <a href="https://apple.com">Apple</a>, <a href="https://reddit.com">Reddit</a>, <a href="www.youtube.com/@LinusTechTips">Linus Tech Tips</a>, <a href="https://w3schools.com">W3Schools</a> and you 97 - <hr> 98 - <footer> 99 - <subtitle>:)</subtitle> 100 - <p>&copy;2024 madebydanny.uk, by <i><a href="https://madebydanny.uk/followonbsky.html?did=madebydanny.uk">Daniel Morrisey</a></i> <b>-</b> Hosted on <a href="https://madebydanny.uk/followonbsky.html?did=wisp.place">@wisp.place</a> <b>-</b> View site <a href="https://tangled.org/madebydanny.uk/website">Code on Tangled</a></p> 101 - </footer> 102 - <a href="https://www.kibun.social" target="_blank" rel="noopener noreferrer"><img src="https://www.kibun.social/badge.png" alt="kibun" /></a> 103 - <!-- Default Statcounter code for Made by Danny UK 104 - https://madebydanny.uk --> 105 - <script type="text/javascript"> 106 - var sc_project=13180172; 107 - var sc_invisible=0; 108 - var sc_security="a4ed014f"; 109 - var scJsHost = "https://"; 110 - document.write("<sc"+"ript type='text/javascript' src='" + 111 - scJsHost+ 112 - "statcounter.com/counter/counter.js'></"+"script>"); 113 - </script> 114 - <noscript><div class="statcounter"><a title="Web Analytics 115 - Made Easy - Statcounter" href="https://statcounter.com/" 116 - target="_blank"><img class="statcounter" 117 - src="https://c.statcounter.com/13180172/0/a4ed014f/0/" 118 - alt="Web Analytics Made Easy - Statcounter" 119 - referrerPolicy="no-referrer-when-downgrade"></a></div></noscript> 120 - <!-- End of Statcounter Code --> 121 - <script type="text/javascript"> 122 - function googleTranslateElementInit() { 123 - new google.translate.TranslateElement({pageLanguage: 'en', layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element'); 124 - } 125 - </script> 126 - </div> 127 - </div> 128 - <script type="text/javascript" src="//translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"></script> 129 - <script src="/js/v18.js"></script> 38 + 39 + <script src="/js/script.js"></script> 130 40 </body> 131 41 </html>
+167
js/script.js
··· 1 + document.addEventListener('DOMContentLoaded', () => { 2 + const input = document.getElementById('command-input'); 3 + const output = document.getElementById('output'); 4 + const inputLine = document.getElementById('input-line'); 5 + 6 + // Focus the input field when the page loads or anywhere is clicked 7 + document.addEventListener('click', () => { 8 + input.focus(); 9 + }); 10 + 11 + // Command handler object 12 + const commands = { 13 + // Simple Link Command 14 + 'bsky': { 15 + description: 'Shows a clickable link to my Bluesky profile.', 16 + execute: () => { 17 + return ` 18 + <p>My Bluesky link:</p> 19 + <p><span class="accent">https://bsky.app/profile/madebydanny.uk</span></p> 20 + `; 21 + } 22 + }, 23 + // Simple Text Command 24 + 'about': { 25 + description: 'Shows a short bio about me.', 26 + execute: () => { 27 + return ` 28 + <p>Hello, I'm <span class="accent">Daniel Morrisey</span>.</p> 29 + <p>I'm a full-stack developer with a passion for creative web design.</p> 30 + <p>I specialize in HTML, CSS, JavaScript, and NodeJS.</p> 31 + `; 32 + } 33 + }, 34 + // Navigation Command (Opens a new tab) 35 + 'tangled': { 36 + description: 'Opens my Tangled profile in a new tab.', 37 + execute: () => { 38 + window.open('https://tangled.org/madebydanny.uk', '_blank'); // **CHANGE THIS TO YOUR GITHUB** 39 + return `<p>Opening <span class="accent">https://tangled.org/madebydanny.uk</span> in new tab...</p>`; 40 + } 41 + }, 42 + 'blog': { 43 + description: 'Opens my blog in a new tab.', 44 + execute: () => { 45 + window.open('https://blog.madebydanny.uk', '_blank'); // **CHANGE THIS TO YOUR GITHUB** 46 + return `<p>Opening <span class="accent">https://blog.madebydanny.uk</span> in new tab...</p>`; 47 + } 48 + }, 49 + 'pds': { 50 + description: 'Learn about the MBD PDS', 51 + execute: () => { 52 + return ` 53 + <p><span class="accent">https://pds.madebydanny.uk</span> learn more</p> 54 + `; 55 + } 56 + }, 57 + // Refresh Command 58 + 'refresh': { 59 + description: 'Refreshes the webpage.', 60 + execute: () => { 61 + setTimeout(() => location.reload(), 500); 62 + return `<p>Refreshing page...</p>`; 63 + } 64 + }, 65 + 'clear': { 66 + description: 'Clears all commands from terminal.', 67 + execute: () => { 68 + setTimeout(() => location.reload(), 500); 69 + return `<p>Clearing terminal...</p>`; 70 + } 71 + }, 72 + // Exit Command 73 + 'exit': { 74 + description: 'Closes the webpage.', 75 + execute: () => { 76 + setTimeout(() => window.close(), 500); 77 + return `<p>Closing page...</p>`; 78 + } 79 + }, 80 + // Help Command 81 + 'help': { 82 + description: 'Shows this list of available commands.', 83 + execute: () => { 84 + let helpText = '<p class="accent">Available Commands:</p>'; 85 + for (const cmd in commands) { 86 + helpText += `<p><span class="accent">${cmd}</span> - ${commands[cmd].description}</p>`; 87 + } 88 + helpText += `<p><span class="accent">cd /filename</span> - Opens a file in a new tab (e.g., cd /index.html)</p>`; 89 + return helpText; 90 + } 91 + } 92 + }; 93 + 94 + // Event listener for Ctrl+C (close the webpage) 95 + document.addEventListener('keydown', (e) => { 96 + if ((e.ctrlKey || e.metaKey) && e.key === 'c') { 97 + e.preventDefault(); 98 + const commandOutput = document.createElement('p'); 99 + commandOutput.innerHTML = `<span class="prompt prefix">visitor@ssh-madebydanny-uk:~#&nbsp;</span>^C`; 100 + output.appendChild(commandOutput); 101 + output.scrollTop = output.scrollHeight; 102 + setTimeout(() => window.close(), 500); 103 + } 104 + }); 105 + 106 + // Event listener for the Enter key 107 + input.addEventListener('keydown', (e) => { 108 + if (e.key === 'Enter') { 109 + const command = input.value.trim().toLowerCase(); 110 + input.value = ''; // Clear the input field 111 + 112 + // 1. Output the command that was just entered 113 + const commandOutput = document.createElement('p'); 114 + commandOutput.innerHTML = `<span class="prompt prefix">visitor@ssh-madebydanny-uk:~#&nbsp;</span>${command} <br><br>`; 115 + output.appendChild(commandOutput); 116 + 117 + // 2. Process the command 118 + let resultHTML = ''; 119 + 120 + if (command === '') { 121 + // Do nothing for empty command 122 + resultHTML = ''; 123 + } else if (commands[command]) { 124 + // Command found: execute it 125 + resultHTML = commands[command].execute(); 126 + } else if (command.startsWith('cd /')) { 127 + // Handle cd command to open files 128 + const filename = command.substring(4).trim(); 129 + if (filename) { 130 + const fileUrl = `${window.location.origin}/${filename}`; 131 + window.open(fileUrl, '_blank'); 132 + resultHTML = `<p>Opening <span class="accent">${filename}</span> in new tab...</p>`; 133 + } else { 134 + resultHTML = `<p class="error">cd: missing filename</p>`; 135 + } 136 + } else { 137 + // Command not found 138 + resultHTML = `<p class="error">-bash: ${command}: command not found, type help to see all commands</p>`; 139 + } 140 + 141 + // 3. Output the result 142 + const resultElement = document.createElement('div'); 143 + resultElement.innerHTML = resultHTML; 144 + output.appendChild(resultElement); 145 + 146 + // 4. Scroll to the bottom to see the new output 147 + output.scrollTop = output.scrollHeight; 148 + } 149 + }); 150 + 151 + // Initial scroll to the bottom on load (optional, but nice for long welcome text) 152 + output.scrollTop = output.scrollHeight; 153 + 154 + // Set login time to current system time and fetch user's IP 155 + const loginTimeElement = document.getElementById('login-time'); 156 + const now = new Date(); 157 + loginTimeElement.textContent = now.toString(); 158 + 159 + // Fetch user's IP address 160 + fetch('https://api.ipify.org?format=json') 161 + .then(response => response.json()) 162 + .then(data => { 163 + const loginLine = document.querySelector('p.login'); 164 + loginLine.innerHTML = `Last login: <span id="login-time">${now.toString()}</span> from ${data.ip}`; 165 + }) 166 + .catch(error => console.error('Error fetching IP:', error)); 167 + });
-129
js/v18.js
··· 1 - async function fetchStatus() { 2 - try { 3 - // First, list all records to find the latest one 4 - const listResponse = await fetch('https://pds.madebydanny.uk/xrpc/com.atproto.repo.listRecords?repo=did:plc:l37td5yhxl2irrzrgvei4qay&collection=social.kibun.status&limit=1'); 5 - const listData = await listResponse.json(); 6 - 7 - if (listData.records && listData.records.length > 0) { 8 - const latestRecord = listData.records[0]; 9 - const emoji = latestRecord.value.emoji || ''; 10 - const text = latestRecord.value.text || 'No status available'; 11 - document.getElementById('status-content').innerHTML = `${emoji} ${text}`; 12 - document.getElementById('status-content').classList.remove('loading'); 13 - } else { 14 - document.getElementById('status-content').innerHTML = 'No status available'; 15 - document.getElementById('status-content').classList.remove('loading'); 16 - } 17 - } catch (error) { 18 - console.error('Error fetching status:', error); 19 - document.getElementById('status-content').innerHTML = 'Unable to load status'; 20 - document.getElementById('status-content').classList.remove('loading'); 21 - } 22 - } 23 - function myFunction() { 24 - var element = document.body; 25 - element.classList.toggle("light-mode"); 26 - } 27 - // Fetch blog leaflets directly from AT Protocol 28 - async function fetchBlogFeed() { 29 - try { 30 - const response = await fetch('https://pds.madebydanny.uk/xrpc/com.atproto.repo.listRecords?repo=did:plc:l37td5yhxl2irrzrgvei4qay&collection=pub.leaflet.document&limit=5'); 31 - const data = await response.json(); 32 - 33 - const feedList = document.getElementById('leaflet-feed'); 34 - feedList.innerHTML = ''; 35 - feedList.classList.remove('loading'); 36 - 37 - if (data.records && data.records.length > 0) { 38 - data.records.forEach(record => { 39 - const title = record.value.title || 'Untitled'; 40 - const rkey = record.uri.split('/').pop(); 41 - const link = `https://blog.madebydanny.uk/${rkey}`; 42 - 43 - const li = document.createElement('li'); 44 - const a = document.createElement('a'); 45 - a.href = link; 46 - a.target = '_blank'; 47 - a.textContent = title; 48 - li.appendChild(a); 49 - feedList.appendChild(li); 50 - }); 51 - } else { 52 - feedList.innerHTML = '<li>No blog posts found</li>'; 53 - } 54 - } catch (error) { 55 - console.error('Error fetching blog feed:', error); 56 - document.getElementById('leaflet-feed').innerHTML = '<li>Unable to load blog posts</li>'; 57 - document.getElementById('leaflet-feed').classList.remove('loading'); 58 - } 59 - } 60 - 61 - // Fetch Tangled pinned repos 62 - async function fetchTangledRepos() { 63 - try { 64 - const response = await fetch('https://pds.madebydanny.uk/xrpc/com.atproto.repo.getRecord?repo=did:plc:l37td5yhxl2irrzrgvei4qay&collection=sh.tangled.actor.profile&rkey=self'); 65 - const data = await response.json(); 66 - 67 - if (data.value && data.value.pinnedRepositories) { 68 - const repoList = document.getElementById('tangled-repos'); 69 - repoList.innerHTML = ''; 70 - repoList.classList.remove('loading'); 71 - 72 - const pinnedRepos = data.value.pinnedRepositories.filter(repo => repo && repo.trim() !== ''); 73 - 74 - if (pinnedRepos.length === 0) { 75 - repoList.innerHTML = '<li>No pinned repositories</li>'; 76 - return; 77 - } 78 - 79 - // Fetch details for each pinned repo 80 - for (const repoUri of pinnedRepos) { 81 - try { 82 - const parts = repoUri.replace('at://', '').split('/'); 83 - const did = parts[0]; 84 - const collection = parts[1]; 85 - const rkey = parts[2]; 86 - 87 - const repoResponse = await fetch(`https://pds.madebydanny.uk/xrpc/com.atproto.repo.getRecord?repo=${did}&collection=${collection}&rkey=${rkey}`); 88 - const repoData = await repoResponse.json(); 89 - 90 - if (repoData.value) { 91 - const name = repoData.value.name || 'Unnamed Repository'; 92 - const description = repoData.value.description || ''; 93 - const repoUrl = `https://tangled.org/madebydanny.uk/${rkey}`; 94 - 95 - const li = document.createElement('li'); 96 - const a = document.createElement('a'); 97 - a.href = repoUrl; 98 - a.target = '_blank'; 99 - a.innerHTML = `<b>${name}</b>`; 100 - 101 - if (description) { 102 - a.innerHTML += ` - ${description}`; 103 - } 104 - 105 - li.appendChild(a); 106 - repoList.appendChild(li); 107 - } 108 - } catch (error) { 109 - console.error('Error fetching repo details:', error); 110 - } 111 - } 112 - 113 - if (repoList.children.length === 0) { 114 - repoList.innerHTML = '<li>Unable to load repository details</li>'; 115 - } 116 - } 117 - } catch (error) { 118 - console.error('Error fetching Tangled repos:', error); 119 - document.getElementById('tangled-repos').innerHTML = '<li>Unable to load repositories</li>'; 120 - document.getElementById('tangled-repos').classList.remove('loading'); 121 - } 122 - } 123 - 124 - // Load all dynamic content when page loads 125 - window.addEventListener('DOMContentLoaded', () => { 126 - fetchStatus(); 127 - fetchBlogFeed(); 128 - fetchTangledRepos(); 129 - });
media/ogimg.png

This is a binary file and will not be displayed.

-176
photos.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8"> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 - 7 - <title>Daniel Morrisey - Photos</title> 8 - <meta name="description" id="meta-description" content="Posting everything into the endless jet stream of posts"> 9 - 10 - <!-- ✅ SEO Keywords --> 11 - <meta name="keywords" content="Daniel Morrisey, developer, writer, blog, projects, Bluesky, web development, creative work"> 12 - 13 - <!-- ✅ Robots --> 14 - <meta name="robots" content="index, follow"> 15 - 16 - <!-- ✅ Author --> 17 - <meta name="author" content="Daniel Morrisey"> 18 - 19 - <!-- ✅ Canonical URL --> 20 - <link rel="canonical" href="https://madebydanny.uk/"> 21 - 22 - <!-- ✅ Favicon --> 23 - <link rel="icon" id="favicon" href="/favicon.ico" type="image/x-icon"> 24 - 25 - <!-- ✅ Open Graph --> 26 - <meta property="og:title" content="Daniel Morrisey - Photos"> 27 - <meta property="og:description" id="og-description" content="Posting everything into the endless jet stream of posts"> 28 - <meta property="og:type" content="website"> 29 - <meta property="og:url" content="https://madebydanny.uk/"> 30 - <meta property="og:image" id="og-image" content="https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-11-06%2F1762389146761_bafkreichle4gy3xvjsygacml7ab3m6pf3bwzjmlqdpxjolo4bvv23qro2m.jpg"> 31 - 32 - <!-- ✅ Twitter Card --> 33 - <meta name="twitter:card" content="summary_large_image"> 34 - <meta name="twitter:title" content="Daniel Morrisey - Photos"> 35 - <meta name="twitter:description" content="Posting everything into the endless jet stream of posts"> 36 - <meta name="twitter:image" content="https://imrs.madebydanny.uk/?url=https%3A%2F%2Fcdn.madebydanny.uk%2Fuser-content%2F2025-11-06%2F1762389146761_bafkreichle4gy3xvjsygacml7ab3m6pf3bwzjmlqdpxjolo4bvv23qro2m.jpg"> 37 - 38 - <!-- ✅ Theme Colors (Mobile optimization) --> 39 - <meta name="theme-color" content="#000000"> 40 - <meta name="apple-mobile-web-app-status-bar-style" content="black"> 41 - 42 - <script src="https://kit.fontawesome.com/0ca27f8db1.js" crossorigin="anonymous"></script> 43 - <link rel="stylesheet" href="css/photos.css"> 44 - </head> 45 - <body> 46 - 47 - <div class="header"> 48 - <h1>Daniel Morrisey</h1> 49 - <p><a href="/index.html"><i class="fa-solid fa-arrow-left"></i> Back to Home</a></p> 50 - </div> 51 - 52 - <div class="container"> 53 - 54 - <!-- Cats Section --> 55 - <section id="cats" class="gallery-section"> 56 - <div class="section-header"> 57 - <h2><i class="fa-solid fa-camera"></i>Photos</h2> 58 - <p><a href="/followonbsky.html?did=photos.madebydanny.uk">View More on <i class="fa-brands fa-bluesky"></i></a></p> 59 - </div> 60 - <div class="gallery-grid" data-gallery="cats"> 61 - <div class="gallery-item"> 62 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreidimctpgyolunn6b76jt6rbgyadtlrdpq7jcejnijrybqtorm66vq" alt="A black and white cat with green eyes rests its head on a blue surface, displaying prominent white whiskers and a white marking between its eyes and on its nose, with a woven basket visible in the background."> 63 - </div> 64 - <div class="gallery-item"> 65 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreigea2dlfok7dzfpniuymzxldsxadfz2zytwbnvogggc3ap7rts7bm" alt="A black and white tuxedo cat with bright yellow-green eyes sits in what appears to be a white sink or basin, looking directly forward with prominent whiskers and alert pointed ears."> 66 - </div> 67 - <div class="gallery-item"> 68 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreidmp6kjnaf6zksiw7oigwqr3opjdadnrigwlevjhulmhbpsb5dlve" alt="A black and white tuxedo cat with yellow eyes sits on a wooden floor, with a basket containing stuffed toys beside it, a striped pillow or cushion in the background, and what appears to be a star decoration on the wall."> 69 - </div> 70 - <div class="gallery-item"> 71 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiaejjaojx4dkmtbxrwcgzt3dha62wpl557bnqogk7ikqnils73bia" alt="A miniature dollhouse interior with wooden plank floors, featuring a dining room with a chandelier, table and chairs, blue curtains on a window, green upholstered armchair in the foreground, kitchen cabinetry with a yellow lamp, decorative molding on gray walls, and multiple connected rooms with warm lighting throughout."> 72 - </div> 73 - <div class="gallery-item"> 74 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreifjsdoqxidmlge6emrwvfgkpb64xctatabw5w32nkjyqxgdlhlqsa" alt="The sun breaks through dark clouds over a beach coastline with waves rolling onto the shore, a solitary person standing in the shallow water, and residential buildings visible along the sandy beach."> 75 - </div> 76 - <div class="gallery-item"> 77 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreih2akb6rfal4j3e7ulj5ks2wqdhfhnhc7s3m3ypgvzdjd5wyxvuye" alt="Two translucent jellyfish with bell-shaped bodies and long trailing tentacles float against a deep blue background, illuminated by blue lighting that makes their white bodies appear luminescent, with dark striped patterns radiating across their bells."> 78 - </div> 79 - <div class="gallery-item"> 80 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicgrzxiiuzryfmob5m2zz5mips3suokqny735xfqgfqqba7miqnzu" alt="A translucent white jellyfish with a dotted bell-shaped body and frilly tentacles floats in deep blue water, with long thin trailing tentacles extending upward."> 81 - </div> 82 - <div class="gallery-item"> 83 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreifez6o4x7t6f6koeqyi2nzaeotb6kdiieyldxpbes2duyxvpimfeq" alt="A lionfish with distinctive striped brown and white fins swimming in an aquarium with blue lighting, rocky coral formations in the background, and a sandy bottom covered in blue-tinted substrate."> 84 - </div> 85 - <div class="gallery-item"> 86 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreiheh7ndxgp7vgaj2cnssl54kplkslhi6hqna6msjif7hzkiks6hmm" alt="A detailed miniature diorama features houses with pink roofs and blue shutters alongside a blue canal or stream running through green landscaped terrain, with small figurines, trees, lampposts with white globe lights, and a painted backdrop showing colorful buildings in orange, pink, and yellow tones under a blue sky with green foliage."> 87 - </div> 88 - <div class="gallery-item"> 89 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicp65cb6wjjxgdlajkbhzn5p372tg6vdadbovde26xdff722nnupa" alt="A wooden beam corner meets a pink wall with exposed ceiling structure visible above, while a cloth draped over a wooden element displays green and purple tones, with yellow light fixtures glowing in the background and a light blue fabric visible to the left."> 90 - </div> 91 - <div class="gallery-item"> 92 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreih7bc7zbg5dtbq6gfzag4clf2vz35rb4zxga6w7ycdhuc7cjpayxe" alt="Two plumeria flowers with gradient petals transitioning from white and yellow centers to pink edges bloom on reddish-brown stems, with clusters of unopened buds and developing flowers below them against a blurred green background."> 93 - </div> 94 - <div class="gallery-item"> 95 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreihrzhshej3k53fbto7gcigvfkmw2uxd4xpb5nafsqdapsdsnbe5bu" alt="A triangular gable end of a building painted pale yellow with a red and white striped roof, featuring a logo reading 'nola' with a yellow sunburst design and text 'PLANTATION SINCE JULY 2, 1960' in red letters, beneath which are white-columned arched openings supported by decorative brackets, all surrounded by green trees."> 96 - </div> 97 - <div class="gallery-item"> 98 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreicxugtysxx6vf6i3gjoxs6zlfn32namznsezgf24eq2dckehzgqou" alt="A miniature room scene features beige vertical-striped wallpaper, a textured stone or plaster column on the left, a small metal bicycle model on wooden flooring, a yellow framed item, a green stool or chair, a doorway with cream trim showing another room, and a mirror reflecting white fabric or clothing."> 99 - </div> 100 - <div class="gallery-item"> 101 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreibx4m4kzmldblttdxnfbktgezn6erh5ixgyorfaunea55dk66d2eu" alt="A single bright yellow flower with delicate ruffled petals and an orange-yellow center sits atop a thin green stem against a soft, blurred background of green and gray tones."> 102 - </div> 103 - <div class="gallery-item"> 104 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreia5qgq6eh7d7ahn6wehkqojsavxgmlkiqurqeb5u4e4epkqapn5hy" alt="A Canada goose with black head and neck, white chinstrap marking, brown and tan patterned feathers, and dark wings floats on blue-gray rippled water with its head tucked down near its body, creating a reflection below."> 105 - </div> 106 - <div class="gallery-item"> 107 - <img src="https://mbdio.uk/xrpc/com.atproto.sync.getBlob?did=did:plc:l37td5yhxl2irrzrgvei4qay&cid=bafkreidddgd7tlelokd5qhtjiyzgirjeyqajg6gqwlu5to6fdvnb27t36m" alt="A bird stands on sandy ground with its yellow beak open, displaying dark blue-gray plumage on its head and upper body, brown feathers on its chest and sides, white wing markings, dark tail feathers, and bright yellow-orange legs and feet."> 108 - </div> 109 - </div> 110 - </section> 111 - 112 - </div> 113 - 114 - <!-- Lightbox --> 115 - <div class="lightbox" id="lightbox"> 116 - <div class="lightbox-close" onclick="closeLightbox()">&times;</div> 117 - <div class="lightbox-prev" onclick="changeImage(-1)">&#10094;</div> 118 - <div class="lightbox-content"> 119 - <img id="lightbox-img" src="" alt=""> 120 - </div> 121 - <div class="lightbox-next" onclick="changeImage(1)">&#10095;</div> 122 - </div> 123 - 124 - <div class="footer"> 125 - <p id="footer"></p> 126 - </div> 127 - <!-- Default Statcounter code for Made by Danny UK 128 - https://madebydanny.uk --> 129 - <script type="text/javascript"> 130 - var sc_project=13180172; 131 - var sc_invisible=0; 132 - var sc_security="a4ed014f"; 133 - var scJsHost = "https://"; 134 - document.write("<sc"+"ript type='text/javascript' src='" + 135 - scJsHost+ 136 - "statcounter.com/counter/counter.js'></"+"script>"); 137 - </script> 138 - <noscript><div class="statcounter"><a title="Web Analytics 139 - Made Easy - Statcounter" href="https://statcounter.com/" 140 - target="_blank"><img class="statcounter" 141 - src="https://c.statcounter.com/13180172/0/a4ed014f/0/" 142 - alt="Web Analytics Made Easy - Statcounter" 143 - referrerPolicy="no-referrer-when-downgrade"></a></div></noscript> 144 - <!-- End of Statcounter Code --> 145 - <script> 146 - async function fetchFooter() { 147 - const footerElement = document.querySelector('#footer'); 148 - const apiUrl = 'https://mbdio.uk/xrpc/com.atproto.repo.getRecord?repo=did:plc:l37td5yhxl2irrzrgvei4qay&collection=uk.madebydanny.footer&rkey=3m534asvjl52b'; 149 - 150 - try { 151 - const response = await fetch(apiUrl); 152 - if (!response.ok) throw new Error('Failed to fetch footer content'); 153 - 154 - const data = await response.json(); 155 - if (data.value && data.value.content) { 156 - footerElement.innerHTML = data.value.content; 157 - } else { 158 - footerElement.textContent = 'No footer content available'; 159 - } 160 - } catch (error) { 161 - console.error('Error fetching footer content:', error); 162 - footerElement.textContent = 'Error loading footer content'; 163 - } 164 - } 165 - 166 - fetchFooter(); 167 - </script> 168 - 169 - <button class="scroll-top" id="scrollTop" onclick="scrollToTop()"> 170 - <i class="fa-solid fa-arrow-up"></i> 171 - </button> 172 - 173 - <script src="js/photos.js"></script> 174 - 175 - </body> 176 - </html>