├── .gitignore ├── .npmrc ├── LICENSE ├── README.md ├── deploy.sh ├── package.json ├── postcss.config.js ├── src ├── app.css ├── app.d.ts ├── app.html ├── lib │ ├── assets │ │ ├── icons │ │ │ ├── blog.png │ │ │ ├── clave.png │ │ │ ├── code.png │ │ │ ├── github.png │ │ │ ├── launchpad.png │ │ │ ├── photos.avif │ │ │ ├── projects.png │ │ │ ├── safari.png │ │ │ └── terminal.avif │ │ ├── images │ │ │ ├── dawnofchange.png │ │ │ ├── echoofsadness.png │ │ │ ├── hearty.png │ │ │ ├── hope.png │ │ │ ├── kammoji.png │ │ │ ├── khoya.png │ │ │ ├── moonlightdrive.png │ │ │ ├── prism.png │ │ │ ├── sleepless.png │ │ │ ├── slowlife.png │ │ │ ├── softvibes.png │ │ │ ├── theinside.png │ │ │ └── tu.png │ │ ├── mp3s │ │ │ ├── dawnofchange.mp3 │ │ │ ├── echoofsadness.mp3 │ │ │ ├── hearty.mp3 │ │ │ ├── hope.mp3 │ │ │ ├── kammoji.mp3 │ │ │ ├── moonlightdrive.mp3 │ │ │ ├── prism.mp3 │ │ │ ├── sleepless.mp3 │ │ │ ├── slowlife.mp3 │ │ │ ├── softvibes.mp3 │ │ │ └── theinside.mp3 │ │ └── photos │ │ │ ├── A walk to remember.jpeg │ │ │ ├── Banaras .jpeg │ │ │ ├── Black and White.jpeg │ │ │ ├── Candy Lens.jpeg │ │ │ ├── Church.jpeg │ │ │ ├── Dual Tone.jpeg │ │ │ ├── Faith.jpeg │ │ │ ├── Golden.jpeg │ │ │ ├── India.jpeg │ │ │ ├── Mysore Palace.jpeg │ │ │ ├── Palace.jpeg │ │ │ ├── Rain Drops.jpg │ │ │ ├── St. Philomena's Cathedral.jpeg │ │ │ ├── Sun.jpeg │ │ │ ├── bird.jpeg │ │ │ ├── camel.jpeg │ │ │ ├── dope.jpeg │ │ │ ├── eysdontlie.jpg │ │ │ ├── flat.jpeg │ │ │ ├── iconic reserved forest moment.jpg │ │ │ ├── insect macro photo.jpg │ │ │ ├── leaf.jpeg │ │ │ ├── leafs and flower.jpg │ │ │ ├── leafs.jpg │ │ │ ├── lens.jpeg │ │ │ ├── love birds.jpeg │ │ │ ├── october.jpeg │ │ │ ├── orea.jpg │ │ │ ├── pencil photography.jpeg │ │ │ ├── pencils.jpeg │ │ │ ├── rain drop.jpeg │ │ │ ├── skyscraper mg road 2.jpg │ │ │ ├── skyscraper mg road.jpg │ │ │ ├── spider.jpg │ │ │ ├── stand apart.jpeg │ │ │ ├── track.jpeg │ │ │ └── tree,me and emptiness.jpg │ ├── components │ │ ├── Blog.svelte │ │ ├── CodeBlock.svelte │ │ ├── CodeBlockWrapper.svelte │ │ ├── Desktop.svelte │ │ ├── Dock.svelte │ │ ├── Launchpad.svelte │ │ ├── MusicPlayer.svelte │ │ ├── Photos.svelte │ │ ├── ProjectIcons.svelte │ │ ├── Projects.svelte │ │ ├── Safari.svelte │ │ ├── Terminal.svelte │ │ ├── TopBar.svelte │ │ └── Window.svelte │ ├── stores │ │ ├── blogStore.ts │ │ ├── projectStore.ts │ │ └── windowStore.ts │ ├── types │ │ ├── blogType.ts │ │ ├── music.ts │ │ ├── projectType.ts │ │ └── wType.ts │ └── utils │ │ ├── devInfo.ts │ │ ├── fileSystem.ts │ │ ├── musicPlaylists.ts │ │ ├── syncProjects.ts │ │ └── tagColors.ts └── routes │ ├── +layout.svelte │ ├── +page.svelte │ ├── +page.ts │ └── api │ └── blog-posts │ └── +server.ts ├── static ├── favicon.png ├── og-image.png └── robots.txt ├── svelte.config.js ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | package-lock.json 3 | 4 | # Output 5 | .output 6 | .vercel 7 | /.svelte-kit 8 | /build 9 | 10 | # OS 11 | .DS_Store 12 | Thumbs.db 13 | 14 | # Env 15 | .env 16 | .env.* 17 | !.env.example 18 | !.env.test 19 | 20 | # Vite 21 | vite.config.js.timestamp-* 22 | vite.config.ts.timestamp-* 23 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | engine-strict=true 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | macOS-Themed Portfolio 3 |

4 | 5 |
6 | 7 | A unique, interactive portfolio website inspired by the macOS interface : https://ssh-i.in || https://macosportfolio.netlify.app 8 |

9 | ProjectOverview • 10 | Installation • 11 | Contributing • 12 | License • 13 |

14 | 15 | ![macOS-Themed Portfolio](https://github.com/user-attachments/assets/2859e409-c4d2-47ce-a810-885c01cddd83) 16 | Powered by [SvelteKit](https://kit.svelte.dev/), [TailwindCSS](https://tailwindcss.com/) and [TypeScript](https://www.typescriptlang.org/). 17 | 18 | 19 | ## ProjectOverview 20 | 21 | This project is a personal portfolio website that mimics the look and feel of macOS. It features: 22 | 23 | ## Core Features 24 | - A desktop-like interface with Status Bar, Widgets and Dock 25 | - Launchpad for an app-like experience 26 | - Draggable and resizable windows 27 | - Minimizable, maximizable and closable windows 28 | 29 | ## Desktop Widgets 30 | - Music Player 31 | - Copyright Free playlist with play controls 32 | - Genre selection and volume control 33 | - Clock Widget 34 | - Live date and time display 35 | 36 | ## Applications 37 | - Terminal 38 | - Interactive command-line interface 39 | - Supports basic Linux commands 40 | - Blog Viewer 41 | - Connected to Dev.to 42 | - Read articles directly in the window 43 | - Project Showcase 44 | - Live GitHub repository integration 45 | - Photo Gallery 46 | - Personal photography collection 47 | - Safari Browser 48 | - Browse websites within the portfolio 49 | 50 | ## installation 51 | 52 | Clone the repo: 53 | ```bash 54 | git clone https://github.com/ansxuman/macOS-Themed-Portfolio/ 55 | ``` 56 | 57 | Install dependencies: 58 | ```bash 59 | npm install 60 | ``` 61 | Run the development server: 62 | ```bash 63 | npm run dev 64 | ``` 65 | Open http://localhost:1111 in your browser to see the result. 66 | 67 | Build for production: 68 | ```bash 69 | npm run build 70 | ``` 71 | 72 | To make the dev.to article work,update API Key in the .env file 73 | ```bash 74 | DEV_TO_API_KEY= 75 | ``` 76 | ## Contributing 77 | 78 | Contributions are what make the open-source community an incredible space for learning, inspiration, and creativity. Any contribution you make is deeply appreciated. 79 | 80 | 1. Fork the Project 81 | 2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`) 82 | 3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`) 83 | 4. Push to the Branch (`git push origin feature/AmazingFeature`) 84 | 5. Open a Pull Request 85 | 86 | ## Donations 87 | 88 | If you find this content useful, please consider donating to support its development and future improvements. 89 | 90 | Buy Me A Coffee 91 | 92 | 93 | 94 | ## License 95 | 96 | This project is licensed under the [Apache-2.0 license](LICENSE). 97 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Pull the latest changes from the repository 4 | git pull 5 | 6 | # Build the project 7 | npm run build 8 | 9 | # Restart the pm2 server 10 | pm2 restart macOS-Portfolio --watch -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "macOS-Themed-Portfolio", 3 | "version": "0.0.1", 4 | "scripts": { 5 | "dev": "vite dev", 6 | "build": "vite build", 7 | "preview": "vite preview", 8 | "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", 9 | "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch" 10 | }, 11 | "devDependencies": { 12 | "@fontsource/fira-mono": "^5.0.0", 13 | "@neoconfetti/svelte": "^2.0.0", 14 | "@sveltejs/adapter-auto": "^3.0.0", 15 | "@sveltejs/adapter-node": "^5.2.8", 16 | "@sveltejs/kit": "^2.0.0", 17 | "@sveltejs/vite-plugin-svelte": "^3.0.0", 18 | "@types/prismjs": "^1.26.4", 19 | "autoprefixer": "^10.4.20", 20 | "postcss": "^8.4.47", 21 | "svelte": "^4.2.7", 22 | "svelte-check": "^4.0.0", 23 | "tailwindcss": "^3.4.13", 24 | "typescript": "^5.0.0", 25 | "vite": "^5.0.3" 26 | }, 27 | "type": "module", 28 | "dependencies": { 29 | "github-markdown-css": "^5.7.0", 30 | "prismjs": "^1.29.0", 31 | "svelte-markdown": "^0.4.1" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /src/app.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /src/app.d.ts: -------------------------------------------------------------------------------- 1 | // See https://kit.svelte.dev/docs/types#app 2 | // for information about these interfaces 3 | declare global { 4 | namespace App { 5 | // interface Error {} 6 | // interface Locals {} 7 | // interface PageData {} 8 | // interface PageState {} 9 | // interface Platform {} 10 | } 11 | } 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /src/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | macOS-Themed Portfolio | Interactive Developer Showcase 17 | %sveltekit.head% 18 | 19 | 20 |
%sveltekit.body%
21 | 22 | 23 | -------------------------------------------------------------------------------- /src/lib/assets/icons/blog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/blog.png -------------------------------------------------------------------------------- /src/lib/assets/icons/clave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/clave.png -------------------------------------------------------------------------------- /src/lib/assets/icons/code.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/code.png -------------------------------------------------------------------------------- /src/lib/assets/icons/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/github.png -------------------------------------------------------------------------------- /src/lib/assets/icons/launchpad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/launchpad.png -------------------------------------------------------------------------------- /src/lib/assets/icons/photos.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/photos.avif -------------------------------------------------------------------------------- /src/lib/assets/icons/projects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/projects.png -------------------------------------------------------------------------------- /src/lib/assets/icons/safari.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/safari.png -------------------------------------------------------------------------------- /src/lib/assets/icons/terminal.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/icons/terminal.avif -------------------------------------------------------------------------------- /src/lib/assets/images/dawnofchange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/dawnofchange.png -------------------------------------------------------------------------------- /src/lib/assets/images/echoofsadness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/echoofsadness.png -------------------------------------------------------------------------------- /src/lib/assets/images/hearty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/hearty.png -------------------------------------------------------------------------------- /src/lib/assets/images/hope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/hope.png -------------------------------------------------------------------------------- /src/lib/assets/images/kammoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/kammoji.png -------------------------------------------------------------------------------- /src/lib/assets/images/khoya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/khoya.png -------------------------------------------------------------------------------- /src/lib/assets/images/moonlightdrive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/moonlightdrive.png -------------------------------------------------------------------------------- /src/lib/assets/images/prism.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/prism.png -------------------------------------------------------------------------------- /src/lib/assets/images/sleepless.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/sleepless.png -------------------------------------------------------------------------------- /src/lib/assets/images/slowlife.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/slowlife.png -------------------------------------------------------------------------------- /src/lib/assets/images/softvibes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/softvibes.png -------------------------------------------------------------------------------- /src/lib/assets/images/theinside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/theinside.png -------------------------------------------------------------------------------- /src/lib/assets/images/tu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/images/tu.png -------------------------------------------------------------------------------- /src/lib/assets/mp3s/dawnofchange.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/dawnofchange.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/echoofsadness.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/echoofsadness.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/hearty.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/hearty.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/hope.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/hope.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/kammoji.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/kammoji.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/moonlightdrive.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/moonlightdrive.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/prism.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/prism.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/sleepless.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/sleepless.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/slowlife.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/slowlife.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/softvibes.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/softvibes.mp3 -------------------------------------------------------------------------------- /src/lib/assets/mp3s/theinside.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/mp3s/theinside.mp3 -------------------------------------------------------------------------------- /src/lib/assets/photos/A walk to remember.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/A walk to remember.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Banaras .jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Banaras .jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Black and White.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Black and White.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Candy Lens.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Candy Lens.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Church.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Church.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Dual Tone.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Dual Tone.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Faith.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Faith.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Golden.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Golden.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/India.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/India.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Mysore Palace.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Mysore Palace.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Palace.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Palace.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Rain Drops.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Rain Drops.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/St. Philomena's Cathedral.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/St. Philomena's Cathedral.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/Sun.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/Sun.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/bird.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/bird.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/camel.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/camel.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/dope.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/dope.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/eysdontlie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/eysdontlie.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/flat.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/flat.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/iconic reserved forest moment.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/iconic reserved forest moment.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/insect macro photo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/insect macro photo.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/leaf.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/leaf.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/leafs and flower.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/leafs and flower.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/leafs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/leafs.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/lens.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/lens.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/love birds.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/love birds.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/october.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/october.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/orea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/orea.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/pencil photography.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/pencil photography.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/pencils.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/pencils.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/rain drop.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/rain drop.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/skyscraper mg road 2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/skyscraper mg road 2.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/skyscraper mg road.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/skyscraper mg road.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/spider.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/spider.jpg -------------------------------------------------------------------------------- /src/lib/assets/photos/stand apart.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/stand apart.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/track.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/track.jpeg -------------------------------------------------------------------------------- /src/lib/assets/photos/tree,me and emptiness.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/src/lib/assets/photos/tree,me and emptiness.jpg -------------------------------------------------------------------------------- /src/lib/components/Blog.svelte: -------------------------------------------------------------------------------- 1 | 38 | 39 |
40 | 41 |
startDrag(e, window.id, "move")}> 42 |
43 | 48 | 53 | 58 |
59 |
Blog Posts
60 | 77 |
78 | 79 |
80 |
81 | {#if isLoading} 82 |
83 |
84 |
85 | {:else} 86 | {#each $blogPosts as post, index} 87 |
selectPost(post)} 90 | > 91 |
92 |

{post.title}

93 | 102 |
103 |

{post.description}

104 |
105 | {new Date(post.published_at).toLocaleDateString()} 106 |
107 | 108 | 109 | 110 | 111 | {post.reading_time_minutes}m 112 | 113 | 114 | 115 | 116 | 117 | 118 | {post.page_views_count.toLocaleString()} 119 | 120 |
121 |
122 |
123 | {#each post.tag_list as tag} 124 | {tag} 125 | {/each} 126 |
127 |
128 | {#if index < $blogPosts.length - 1} 129 |
130 | {/if} 131 | {/each} 132 | {/if} 133 |
134 | 135 |
136 | {#if selectedPost} 137 |
138 |

{selectedPost.title}

139 | {#if selectedPost.cover_image} 140 | {selectedPost.title} 141 | {/if} 142 |
143 | 144 |
145 |
146 | {:else} 147 |
148 |

Select a blog post to view details

149 |
150 | {/if} 151 |
152 |
153 |
154 | 155 | 170 | -------------------------------------------------------------------------------- /src/lib/components/CodeBlock.svelte: -------------------------------------------------------------------------------- 1 | 31 | 32 |
33 |
{@html highlighted}
34 | 47 |
48 | -------------------------------------------------------------------------------- /src/lib/components/CodeBlockWrapper.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | -------------------------------------------------------------------------------- /src/lib/components/Desktop.svelte: -------------------------------------------------------------------------------- 1 | 18 | 19 |
20 | 21 |
22 | 23 |
26 |
27 |
28 | {currentTime.toLocaleTimeString("en-US", { 29 | hour: "2-digit", 30 | minute: "2-digit", 31 | hour12: true, 32 | })} 33 |
34 |
35 | {currentTime.toLocaleDateString("en-US", { 36 | weekday: "long", 37 | month: "long", 38 | day: "numeric", 39 | })} 40 |
41 |
42 |
43 | 44 | 45 | 46 |
47 |
48 | 49 | 72 | -------------------------------------------------------------------------------- /src/lib/components/Dock.svelte: -------------------------------------------------------------------------------- 1 | 64 | 65 |
66 |
handleDockClick('launchpad')}> 67 | Launchpad 68 |
69 | 70 |
handleDockClick("terminal")}> 71 | Terminal 72 | {#if terminalWindow} 73 |
74 | {/if} 75 |
76 | 77 | {#if isLargeScreen} 78 |
handleDockClick("safari")}> 79 | safari 80 | {#if safariWindow} 81 |
82 | {/if} 83 |
84 | {/if} 85 | 86 |
handleDockClick("photos")}> 87 | Photos 88 | {#if photosWindow} 89 |
90 | {/if} 91 |
92 | 93 | {#if isLargeScreen} 94 |
handleDockClick("blog")}> 95 | Blog 96 | {#if blogWindow} 97 |
98 | {/if} 99 |
100 | {/if} 101 | 102 |
handleDockClick("projects")}> 103 | Projects 104 | {#if projectsWindow} 105 |
106 | {/if} 107 |
108 | 109 |
handleDockClick("github")}> 110 | Github 111 |
112 | 113 |
handleDockClick("clave")}> 114 | Clave 115 |
116 |
117 | 118 | 119 | {#if showPopup} 120 |
121 |
122 |

Limited Features

123 |

For full feature access, please use a desktop device.

124 | 125 |
126 |
127 | {/if} 128 | 129 | 155 | -------------------------------------------------------------------------------- /src/lib/components/Launchpad.svelte: -------------------------------------------------------------------------------- 1 | 38 | 39 | {#if isOpen} 40 |
dispatch('closeLaunchpad')} 44 | > 45 |
46 |
50 |
51 | 52 | 53 | 54 | 60 |
61 |
62 |
63 | {#if filteredApps.length > 0} 64 | {#each filteredApps as app} 65 |
launchApp(app.id)} 68 | in:scale={{duration: 200, delay: 100}} 69 | out:scale={{duration: 200}} 70 | > 71 | {app.name} 72 | {app.name} 73 |
74 | {/each} 75 | {:else} 76 |
77 | No Results 78 |
79 | {/if} 80 |
81 |
82 |
83 | {/if} 84 | 85 | 86 | -------------------------------------------------------------------------------- /src/lib/components/MusicPlayer.svelte: -------------------------------------------------------------------------------- 1 | 214 | 215 |
218 |
219 |

Now Playing

220 |
221 |
222 | 231 |
232 | 233 |
234 |
235 | 251 |
252 |
253 | 254 |
255 |
256 | Album Art 262 |
263 |
264 |

{currentSong.name}

265 |

{currentSong.artist}

266 | {currentSong.genre} 267 |
268 |
269 | 270 |
271 |
275 |
279 |
280 |
281 | {currentTime} 282 | {duration} 283 |
284 |
285 | 286 |
287 | 385 | 404 | 446 | 465 | 508 |
509 | 510 |
511 | 518 | 524 | 525 | 533 | {volume} 534 |
535 | 536 | {#if isPlaying} 537 |
538 | {#each Array(5) as _, i} 539 | 543 | {/each} 544 |
545 | {/if} 546 | 547 | {#if isPlaylistVisible} 548 |
549 |

Playlist

550 |
    551 | {#each filteredPlaylist as song, index} 552 |
  • selectSong(index)}> 553 |
    554 |
    555 |

    {song.name}

    556 |

    {song.artist}

    557 |
    558 | {#if song === currentSong} 559 | 560 | 561 | 562 | {/if} 563 |
    564 |
  • 565 | {/each} 566 |
567 |
568 | {/if} 569 |
570 | 571 | 572 | 573 | 624 | 625 | -------------------------------------------------------------------------------- /src/lib/components/Photos.svelte: -------------------------------------------------------------------------------- 1 | 78 | 79 |
80 | 81 |
windowInstance && startDrag(e, windowInstance.id, "move")}> 82 |
83 |
windowInstance && closeWindow(windowInstance.id)}>
84 |
windowInstance && toggleMinimize(windowInstance.id)}>
85 |
windowInstance && toggleMaximize(windowInstance.id)}>
86 |
87 |
88 | 92 | 96 | 100 |
101 | 104 | 111 | 114 |
115 | 116 | 117 |
118 | {#if sidebarOpen} 119 |
120 |

Albums

121 |
    122 | {#each ['All Photos', 'Recents', 'Favorites', 'Shared'] as album} 123 |
  • changeAlbum(album)} 126 | > 127 | {album} 128 |
  • 129 | {/each} 130 |
131 |
132 | {/if} 133 |
134 | {#if currentView === 'Library'} 135 | {#if selectedPhoto} 136 |
137 | {selectedPhoto.name} 138 |
139 | {/if} 140 |
141 | {#each filteredPhotos as photo} 142 |
selectPhoto(photo)}> 143 | {photo.name} 144 |
145 | 153 | {#if !isGridView} 154 |
155 | {photo.name} 156 |
157 | {/if} 158 |
159 | {/each} 160 |
161 | {:else if currentView === 'For You'} 162 |
163 |

For You

164 |

Personalized photo suggestions will appear here.

165 | 166 |
167 | {:else if currentView === 'Memories'} 168 |
169 |

Memories

170 |

Your photo memories will be displayed here.

171 |
172 | {/if} 173 |
174 |
175 |
-------------------------------------------------------------------------------- /src/lib/components/ProjectIcons.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | {#if iconName === "go"} 6 | 17 | 37 | 38 | 39 | 40 | 41 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 76 | 77 | 78 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | {:else if iconName === "svelte"} 89 | 95 | 96 | 100 | 104 | 105 | {:else if iconName === "wails"} 106 | 232 | {/if} 233 | -------------------------------------------------------------------------------- /src/lib/components/Projects.svelte: -------------------------------------------------------------------------------- 1 | 51 | 52 |
53 | 54 |
startDrag(e, window.id, "move")}> 55 |
56 | 61 | 66 | 71 |
72 |
Projects
73 |
74 | 75 |
76 |
77 | {#each $projects as project,index} 78 |
selectProject(project)} 81 | > 82 |
83 |
84 | 85 |
86 |

{project.name}

87 | 95 |
96 |

{project.shortDescription}

97 |
98 | 99 | {project.type} 100 | 101 | {#each project.technologies as tech} 102 | 103 | {tech} 104 | 105 | {/each} 106 |
107 |
108 | {#if index < $projects.length - 1} 109 |
110 | {/if} 111 | {/each} 112 |
113 | 114 |
115 | {#if selectedProject} 116 |
117 | {#if isLoading} 118 |
119 |
120 |
121 | {:else} 122 |
123 | 124 |
125 | {/if} 126 |
127 | {:else} 128 |
129 |

Select a project to view details

130 |
131 | {/if} 132 |
133 |
134 |
135 | 136 | 151 | -------------------------------------------------------------------------------- /src/lib/components/Safari.svelte: -------------------------------------------------------------------------------- 1 | 80 | 81 |
82 | 83 |
startDrag(e, window.id, "move")}> 84 |
85 | 90 | 95 | 100 |
101 |
102 | 107 | 112 | 117 | 122 |
123 | 129 |
130 |
131 |
132 | 133 | 134 |
135 | {#if showHomepage} 136 |
137 |
138 |

Welcome to Safari

139 |

Explore the web with ease

140 |

Note: Some websites may not load due to security restrictions

141 |
142 | 152 | 155 |
156 |
157 |
158 | {:else} 159 | {#if isLoading} 160 |
161 | 162 | 163 | 164 | 165 |
166 | {/if} 167 | 186 | {/if} 187 |
188 |
189 | 190 | -------------------------------------------------------------------------------- /src/lib/components/Terminal.svelte: -------------------------------------------------------------------------------- 1 | 205 | 206 |
207 | 208 |
startDrag(e, window.id, "move")} 211 | > 212 |
213 |
closeWindow(window.id)} 216 | >
217 |
toggleMinimize(window.id)} 220 | >
221 |
toggleMaximize(window.id)} 224 | >
225 |
226 |
227 | ansxuman@macbook: ~/{currentDirectory.join("/")} 228 |
229 |
230 | 231 | 232 |
237 | {#each terminalLines as line} 238 |
239 | 243 | {@html line} 244 | 245 | {/each} 246 |
247 | 248 | 249 | {#if showPrompt} 250 |
251 | ansxuman@macbook 252 | : 253 | ~/{currentDirectory.join("/")} 254 | $ 255 | { 259 | if (e.key === "Enter" && currentInput.trim()) { 260 | processCommand(currentInput.trim()); 261 | currentInput = ""; 262 | } else { 263 | handleKeydown(e); 264 | } 265 | }} 266 | class="bg-transparent border-none outline-none flex-grow text-gray-200 w-full" 267 | autocomplete="off" 268 | autofocus 269 | /> 270 |
271 | {/if} 272 |
273 | -------------------------------------------------------------------------------- /src/lib/components/TopBar.svelte: -------------------------------------------------------------------------------- 1 | 22 | 23 | 24 | 53 | 54 | 59 | -------------------------------------------------------------------------------- /src/lib/components/Window.svelte: -------------------------------------------------------------------------------- 1 | 39 | 40 |
focusWindow(window.id)} 46 | > 47 | {#if window.type === "terminal"} 48 | 49 | {:else if window.type === "safari"} 50 | 51 | {:else if window.type === "photos"} 52 | 53 | {:else if window.type === "projects"} 54 | 55 | {:else if window.type === "blog"} 56 | 57 | {/if} 58 | 59 | {#if !window.maximized} 60 |
startDrag(e, window.id, "resize")} 63 | >
64 | {/if} 65 |
-------------------------------------------------------------------------------- /src/lib/stores/blogStore.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store'; 2 | import type { BlogPost } from '../types/blogType'; 3 | 4 | export const blogPosts = writable([]); 5 | 6 | export async function fetchBlogPosts(maxRetries = 3, delay = 1000) { 7 | let retries = 0; 8 | while (retries < maxRetries) { 9 | try { 10 | const response = await fetch('/api/blog-posts'); 11 | 12 | if (!response.ok) { 13 | throw new Error(`HTTP error! status: ${response.status}`); 14 | } 15 | 16 | const posts = await response.json(); 17 | blogPosts.set(posts); 18 | return; 19 | } catch (error) { 20 | console.error(`Failed to fetch blog posts (attempt ${retries + 1}):`, error); 21 | retries++; 22 | if (retries < maxRetries) { 23 | console.log(`Retrying in ${delay}ms...`); 24 | await new Promise(resolve => setTimeout(resolve, delay)); 25 | } 26 | } 27 | } 28 | console.error(`Failed to fetch blog posts after ${maxRetries} attempts`); 29 | } -------------------------------------------------------------------------------- /src/lib/stores/projectStore.ts: -------------------------------------------------------------------------------- 1 | import { writable } from 'svelte/store'; 2 | import type { ProjectData } from '../types/projectType'; 3 | 4 | const initialProjects: ProjectData[] = [ 5 | { 6 | id: 'Clave', 7 | name: 'Clave', 8 | icon: 'wails', 9 | shortDescription: 'A lightweight cross-platform desktop authenticator app', 10 | githubUrl: 'https://github.com/ansxuman/clave', 11 | readmeUrl: 'https://raw.githubusercontent.com/ansxuman/clave/main/README.md', 12 | technologies: ['Go','Wails','Svelte', 'TypeScript', 'TailwindCSS'], 13 | type: 'application' 14 | }, 15 | { 16 | id: 'macOS-Themed-Portfolio', 17 | name: 'macOS Themed Portfolio', 18 | icon: 'svelte', 19 | shortDescription: 'An interactive portfolio website inspired by the macOS interface, built with SvelteKit, TailwindCSS, and TypeScript.', 20 | githubUrl: 'https://github.com/ansxuman/macOS-Themed-Portfolio', 21 | readmeUrl: 'https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/main/README.md', 22 | technologies: ['Svelte', 'TypeScript', 'TailwindCSS'], 23 | type: 'application' 24 | }, 25 | { 26 | id: 'go-service', 27 | name: 'Go Service', 28 | icon: 'go', 29 | shortDescription: 'A minimal boilerplate for building cross-platform system services in Go', 30 | githubUrl: 'https://github.com/ansxuman/go-service', 31 | readmeUrl: 'https://raw.githubusercontent.com/ansxuman/go-service/main/README.md', 32 | technologies: ['Go'], 33 | type: 'library' 34 | }, 35 | { 36 | id: 'go-touchid', 37 | name: 'Go TouchID', 38 | icon: 'go', 39 | shortDescription: 'A simple Go Library for Touch ID authentication on darwin.', 40 | githubUrl: 'https://github.com/ansxuman/go-touchid', 41 | readmeUrl: 'https://raw.githubusercontent.com/ansxuman/go-touchid/main/README.md', 42 | technologies: ['Go', 'macOS', 'TouchID'], 43 | type: 'library' 44 | }, 45 | { 46 | id: 'go-version-compare', 47 | name: 'Go Version Compare', 48 | icon: 'go', 49 | shortDescription: 'Go Library for Version Comparison', 50 | githubUrl: 'https://github.com/ansxuman/versioncompare', 51 | readmeUrl: 'https://raw.githubusercontent.com/ansxuman/versioncompare/main/README.md', 52 | technologies: ['Go'], 53 | type: 'library' 54 | }, 55 | ]; 56 | 57 | export const projects = writable(initialProjects); -------------------------------------------------------------------------------- /src/lib/stores/windowStore.ts: -------------------------------------------------------------------------------- 1 | import { writable, get } from 'svelte/store'; 2 | import type { wType } from '../types/wType'; 3 | 4 | export const windows = writable([]); 5 | let nextZIndex = 1; 6 | 7 | export function addWindow(type: "terminal" | "safari" | "photos" | "blog" | "projects" | "github") { 8 | 9 | if (type === "github") { 10 | window.open('https://github.com/ansxuman', '_blank'); 11 | return; 12 | } 13 | 14 | const currentWindows = get(windows); 15 | const existingWindow = currentWindows.find((w) => w.type === type); 16 | if (existingWindow) { 17 | focusWindow(existingWindow.id); 18 | if (existingWindow.minimized) { 19 | toggleMinimize(existingWindow.id); 20 | } 21 | return; 22 | } 23 | 24 | const windowWidth = 900; 25 | const windowHeight = 600; 26 | const screenWidth = window.innerWidth; 27 | const screenHeight = window.innerHeight; 28 | 29 | const newWindow: wType = { 30 | id: `${type}-${Date.now()}`, 31 | type, 32 | minimized: false, 33 | maximized: false, 34 | position: { 35 | x: (screenWidth - windowWidth) / 2, 36 | y: (screenHeight - windowHeight) / 2, 37 | }, 38 | size: { width: windowWidth, height: windowHeight }, 39 | zIndex: nextZIndex++, 40 | }; 41 | windows.update(w => [...w, newWindow]); 42 | } 43 | 44 | export function focusWindow(id: string) { 45 | windows.update(currentWindows => { 46 | return currentWindows 47 | .map((w) => ({ 48 | ...w, 49 | zIndex: w.id === id ? nextZIndex++ : w.zIndex, 50 | })) 51 | .sort((a, b) => a.zIndex - b.zIndex); 52 | }); 53 | } 54 | 55 | export function closeWindow(id: string) { 56 | windows.update(currentWindows => currentWindows.filter((w) => w.id !== id)); 57 | } 58 | 59 | export function toggleMinimize(id: string) { 60 | windows.update(currentWindows => 61 | currentWindows.map((w) => 62 | w.id === id ? { ...w, minimized: !w.minimized } : w 63 | ) 64 | ); 65 | } 66 | 67 | export function toggleMaximize(id: string) { 68 | windows.update(currentWindows => 69 | currentWindows.map((w) => { 70 | if (w.id === id) { 71 | if (!w.maximized) { 72 | return { 73 | ...w, 74 | maximized: true, 75 | position: { x: 0, y: 0 }, 76 | size: { width: window.innerWidth, height: window.innerHeight }, 77 | }; 78 | } else { 79 | return { 80 | ...w, 81 | maximized: false, 82 | position: { 83 | x: (window.innerWidth - 600) / 2, 84 | y: (window.innerHeight - 400) / 2, 85 | }, 86 | size: { width: 600, height: 400 }, 87 | }; 88 | } 89 | } 90 | return w; 91 | }) 92 | ); 93 | } 94 | 95 | export function isAppRunning(type: 'terminal' | 'safari' | 'photos' | 'blog' | 'projects'): boolean { 96 | const currentWindows = get(windows); 97 | return currentWindows.some(w => w.type === type && !w.minimized); 98 | } 99 | 100 | export function isAppMinimized(type: 'terminal' | 'safari' | 'photos' | 'blog' | 'projects'): boolean { 101 | const currentWindows = get(windows); 102 | return currentWindows.some(w => w.type === type && w.minimized); 103 | } -------------------------------------------------------------------------------- /src/lib/types/blogType.ts: -------------------------------------------------------------------------------- 1 | export interface BlogPost { 2 | id: number; 3 | title: string; 4 | description: string; 5 | published_at: string; 6 | url: string; 7 | cover_image: string; 8 | tag_list: string[]; 9 | reading_time_minutes: number; 10 | body_markdown: string; 11 | page_views_count: number; 12 | } -------------------------------------------------------------------------------- /src/lib/types/music.ts: -------------------------------------------------------------------------------- 1 | export interface Song { 2 | name: string; 3 | artist: string; 4 | img: string; 5 | src: string; 6 | genre: string; 7 | } 8 | 9 | export type RepeatMode = "repeat" | "repeat_one" | "shuffle"; -------------------------------------------------------------------------------- /src/lib/types/projectType.ts: -------------------------------------------------------------------------------- 1 | export interface ProjectData { 2 | id: string; 3 | name: string; 4 | icon: string; 5 | shortDescription: string; 6 | githubUrl: string; 7 | readmeUrl: string; 8 | technologies: string[]; 9 | type: string; 10 | } -------------------------------------------------------------------------------- /src/lib/types/wType.ts: -------------------------------------------------------------------------------- 1 | export interface wType { 2 | id: string; 3 | type: "terminal" | "safari" | "photos" | "blog" | "projects" | "github"; 4 | minimized: boolean; 5 | maximized: boolean; 6 | position: { x: number; y: number }; 7 | size: { width: number; height: number }; 8 | zIndex: number; 9 | } -------------------------------------------------------------------------------- /src/lib/utils/devInfo.ts: -------------------------------------------------------------------------------- 1 | export interface Developer { 2 | // name: string; 3 | // role: string; 4 | // company: string; 5 | about: string; 6 | code: string[]; 7 | interests: string[]; 8 | operatingSystems: string[]; 9 | toolsUsed: string[]; 10 | ides: string[]; 11 | } 12 | 13 | export const ansxuman: Developer = { 14 | // name: "Anshuman", 15 | // role: "Product Engineer", 16 | // company: "InstaSafe", 17 | about: "Hey, I'm Anshuman, a Software Developer with a keen interest in building scalable \nand secure applications.Always eager to learn and experiment with new technologies.", 18 | code: ["Golang", "Svelte", "Angular", "TS", "JS", "Java", "Swift", "Rust", "Python"], 19 | interests: [ 20 | "Full-Stack Development", 21 | "Cybersecurity", 22 | "DevOps", 23 | "Writing Blogs", 24 | "Experimenting with New Technologies", 25 | ], 26 | operatingSystems: ["macOS 15 Sequoia", "Debian Bookworm", "Ubuntu"], 27 | toolsUsed: ["Docker", "Git", "Parallels", "Termius", "Postman"], 28 | ides: ["Cursor", "Zed", "VSCode", "Android Studio", "Xcode", "Neovim"], 29 | }; -------------------------------------------------------------------------------- /src/lib/utils/fileSystem.ts: -------------------------------------------------------------------------------- 1 | import { ansxuman } from "./devInfo"; 2 | import { syncProjectsToFileSystem } from "./syncProjects"; 3 | 4 | export const fileSystem: FileSystem = { 5 | home: { 6 | about: ` 7 | ${ansxuman.about} 8 | 9 | Programming Languages: 10 | ${ansxuman.code.join(", ")} 11 | 12 | Operating Systems: 13 | ${ansxuman.operatingSystems.join(", ")} 14 | 15 | Tools Used: 16 | ${ansxuman.toolsUsed.join(", ")} 17 | 18 | IDEs: 19 | ${ansxuman.ides.join(", ")} 20 | `, 21 | projects: {}, 22 | interests: ` 23 | ${ansxuman.interests.join("\n")} 24 | `, 25 | }, 26 | }; 27 | 28 | syncProjectsToFileSystem(fileSystem); 29 | 30 | export interface FileSystem { 31 | [key: string]: string | FileSystem; 32 | } 33 | -------------------------------------------------------------------------------- /src/lib/utils/musicPlaylists.ts: -------------------------------------------------------------------------------- 1 | import type { Song } from '../types/music'; 2 | 3 | export const ALL_MUSIC: Song[] = [ 4 | { 5 | name: "Hearty", 6 | artist: "Aventure", 7 | img: "hearty.png", 8 | src: "hearty.mp3", 9 | genre: "Calm", 10 | },{ 11 | name: "Prism", 12 | artist: "Theatre Of Delays", 13 | img: "prism.png", 14 | src: "prism.mp3", 15 | genre: "Ambient", 16 | },{ 17 | name: "Soft Vibes", 18 | artist: "Vitale", 19 | img: "softvibes.png", 20 | src: "softvibes.mp3", 21 | genre: "Hip-Hop / R&B", 22 | },{ 23 | name: "Moon Light Drive", 24 | artist: "Yunior Arronte", 25 | img: "moonlightdrive.png", 26 | src: "moonlightdrive.mp3", 27 | genre: "Calm", 28 | },{ 29 | name: "Slow Life", 30 | artist: "Benjamin Lazzarus", 31 | img: "slowlife.png", 32 | src: "slowlife.mp3", 33 | genre: "Cinematic", 34 | }, 35 | { 36 | name: "Dawn of Change", 37 | artist: "Roman Senyk", 38 | img: "dawnofchange.png", 39 | src: "dawnofchange.mp3", 40 | genre: "Cinematic", 41 | }, 42 | { 43 | name: "Hope", 44 | artist: "Hugo Dujardin", 45 | img: "hope.png", 46 | src: "hope.mp3", 47 | genre: "Cinematic", 48 | },{ 49 | name: "Echo of Sadness", 50 | artist: "TURNIQUE", 51 | img: "echoofsadness.png", 52 | src: "echoofsadness.mp3", 53 | genre: "Cinematic", 54 | }, 55 | { 56 | name: "Prism", 57 | artist: "Theatre Of Delays", 58 | img: "prism.png", 59 | src: "prism.mp3", 60 | genre: "Cinematic", 61 | }, 62 | { 63 | name: "Sleepless", 64 | artist: "Diffie Bosman", 65 | img: "sleepless.png", 66 | src: "sleepless.mp3", 67 | genre: "Cinematic", 68 | }, 69 | { 70 | name: "The Inside", 71 | artist: "Benjamin Lazzarus", 72 | img: "theinside.png", 73 | src: "theinside.mp3", 74 | genre: "Cinematic", 75 | }, 76 | { 77 | name: "Kammo Ji", 78 | artist: "Talwiinder", 79 | img: "kammoji.png", 80 | src: "kammoji.mp3", 81 | genre: "Talwiinder", 82 | } 83 | // ,{ 84 | // name: "Talwiinder. NDS - KHOYA", 85 | // artist: "Talwiinder", 86 | // img: "khoya.png", 87 | // src: "khoya.mp3", 88 | // genre: "Talwiinder", 89 | // },{ 90 | // name: "TU - Talwiinder (prod. Sanjoy)", 91 | // artist: "Talwiinder", 92 | // img: "tu.png", 93 | // src: "tu.mp3", 94 | // genre: "Talwiinder", 95 | // } 96 | ]; 97 | 98 | export const INITIAL_VOLUME = 70; 99 | export const PROGRESS_UPDATE_DURATION = 200; -------------------------------------------------------------------------------- /src/lib/utils/syncProjects.ts: -------------------------------------------------------------------------------- 1 | import { get } from 'svelte/store'; 2 | import { projects } from '../stores/projectStore'; 3 | import type { FileSystem } from './fileSystem'; 4 | 5 | export function syncProjectsToFileSystem(fileSystem: FileSystem): void { 6 | const projectsList = get(projects); 7 | 8 | if (!fileSystem.home.projects || typeof fileSystem.home.projects !== 'object') { 9 | fileSystem.home.projects = {}; 10 | } 11 | 12 | projectsList.forEach(project => { 13 | (fileSystem.home.projects as FileSystem)[project.id] = ` 14 | Name: ${project.name} 15 | Type: ${project.type} 16 | Description: ${project.shortDescription} 17 | Technologies: ${project.technologies.join(', ')} 18 | GitHub: ${project.githubUrl} 19 | `.trim(); 20 | }); 21 | } -------------------------------------------------------------------------------- /src/lib/utils/tagColors.ts: -------------------------------------------------------------------------------- 1 | const techColors: Record = { 2 | 'Go': 'bg-blue-200 text-blue-800', 3 | 'macOS': 'bg-gray-200 text-gray-800', 4 | 'TouchID': 'bg-green-200 text-green-800', 5 | 'Svelte': 'bg-orange-200 text-orange-800', 6 | 'TypeScript': 'bg-blue-200 text-blue-800', 7 | 'JavaScript': 'bg-yellow-200 text-yellow-800', 8 | 'React': 'bg-cyan-200 text-cyan-800', 9 | 'Vue': 'bg-emerald-200 text-emerald-800', 10 | 'Node.js': 'bg-green-200 text-green-800', 11 | 'Python': 'bg-blue-200 text-blue-800', 12 | 'Java': 'bg-red-200 text-red-800', 13 | 'C#': 'bg-purple-200 text-purple-800', 14 | 'Ruby': 'bg-red-200 text-red-800', 15 | 'PHP': 'bg-indigo-200 text-indigo-800', 16 | 'HTML': 'bg-orange-200 text-orange-800', 17 | 'CSS': 'bg-blue-200 text-blue-800', 18 | 'SQL': 'bg-yellow-200 text-yellow-800', 19 | 'MongoDB': 'bg-green-200 text-green-800', 20 | 'Docker': 'bg-blue-200 text-blue-800', 21 | 'Kubernetes': 'bg-blue-200 text-blue-800', 22 | 'AWS': 'bg-yellow-200 text-yellow-800', 23 | 'Azure': 'bg-blue-200 text-blue-800', 24 | 'GCP': 'bg-red-200 text-red-800', 25 | }; 26 | 27 | const typeColors: Record = { 28 | 'library': 'bg-purple-200 text-purple-800', 29 | 'application': 'bg-green-200 text-green-800', 30 | 'framework': 'bg-blue-200 text-blue-800', 31 | 'tool': 'bg-yellow-200 text-yellow-800', 32 | }; 33 | 34 | export function getTagColor(tech: string): string { 35 | return techColors[tech] || 'bg-gray-200 text-gray-800'; 36 | } 37 | 38 | export function getTypeColor(type: string): string { 39 | return typeColors[type.toLowerCase()] || 'bg-gray-200 text-gray-800'; 40 | } -------------------------------------------------------------------------------- /src/routes/+layout.svelte: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /src/routes/+page.svelte: -------------------------------------------------------------------------------- 1 | 30 | 31 |
32 |
33 | 34 | 35 | 36 | {#each $windows as window (window.id)} 37 | 38 | {/each} 39 | 40 | 41 | 42 | isLaunchpadOpen = false} /> 43 |
44 | 45 | 51 | -------------------------------------------------------------------------------- /src/routes/+page.ts: -------------------------------------------------------------------------------- 1 | // since there's no dynamic data here, we can prerender 2 | // it so that it gets served as a static asset in production 3 | export const prerender = true; 4 | -------------------------------------------------------------------------------- /src/routes/api/blog-posts/+server.ts: -------------------------------------------------------------------------------- 1 | import { json } from '@sveltejs/kit'; 2 | import type { RequestHandler } from './$types'; 3 | import { DEV_TO_API_KEY } from '$env/static/private'; 4 | 5 | 6 | 7 | export const GET: RequestHandler = async () => { 8 | try { 9 | const response = await fetch('https://dev.to/api/articles/me/published', { 10 | method: 'GET', 11 | headers: { 12 | 'Content-Type': 'application/json', 13 | 'api-key': DEV_TO_API_KEY, 14 | 'Accept': 'application/vnd.forem.api-v1+json', 15 | 'User-Agent': 'macOS-Themed-Portfolio', 16 | }, 17 | }); 18 | 19 | if (!response.ok) { 20 | throw new Error(`HTTP error! status: ${response.status}`); 21 | } 22 | 23 | const posts = await response.json(); 24 | return json(posts); 25 | } catch (error) { 26 | console.error('Failed to fetch blog posts:', error); 27 | return json({ error: 'Failed to fetch blog posts' }, { status: 500 }); 28 | } 29 | }; 30 | 31 | -------------------------------------------------------------------------------- /static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/static/favicon.png -------------------------------------------------------------------------------- /static/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ansxuman/macOS-Themed-Portfolio/1ded559fb758f7ed2583497e67e8724a7056485b/static/og-image.png -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /svelte.config.js: -------------------------------------------------------------------------------- 1 | import adapter from '@sveltejs/adapter-auto'; 2 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; 3 | /** @type {import('@sveltejs/kit').Config} */ 4 | const config = { 5 | preprocess: vitePreprocess(), 6 | kit: { 7 | adapter: adapter(), 8 | alias: { 9 | $lib: 'src/lib' 10 | } 11 | } 12 | }; 13 | 14 | export default config; -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | export default { 3 | content: ['./src/**/*.{html,js,svelte,ts}', './node_modules/flowbite-svelte/**/*.{html,js,svelte,ts}'], 4 | theme: { 5 | extend: {} 6 | }, 7 | plugins: [] 8 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./.svelte-kit/tsconfig.json", 3 | "compilerOptions": { 4 | "allowJs": true, 5 | "checkJs": true, 6 | "esModuleInterop": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "resolveJsonModule": true, 9 | "skipLibCheck": true, 10 | "sourceMap": true, 11 | "strict": true, 12 | "moduleResolution": "bundler" 13 | } 14 | // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias 15 | // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files 16 | // 17 | // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes 18 | // from the referenced tsconfig.json - TypeScript does not merge them in 19 | } 20 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { sveltekit } from '@sveltejs/kit/vite'; 2 | import { defineConfig } from 'vite'; 3 | 4 | export default defineConfig({ 5 | plugins: [sveltekit()], 6 | server: { 7 | host: '0.0.0.0', 8 | port: 1111 9 | }, 10 | resolve: { 11 | alias: { 12 | $lib: '/src/lib' 13 | } 14 | }, 15 | }); 16 | --------------------------------------------------------------------------------