├── .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 | 
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 |
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 |
closeWindow(window.id)}>
44 |
45 |
46 |
47 |
48 |
toggleMinimize(window.id)}>
49 |
50 |
51 |
52 |
53 |
toggleMaximize(window.id)}>
54 |
55 |
56 |
57 |
58 |
59 |
Blog Posts
60 |
77 |
78 |
79 |
80 |
81 | {#if isLoading}
82 |
85 | {:else}
86 | {#each $blogPosts as post, index}
87 |
selectPost(post)}
90 | >
91 |
92 |
{post.title}
93 |
openPostLink(post.url)}
96 | >
97 |
98 |
99 |
100 |
101 |
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 |
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 |
38 | {#if showToast}
39 | Copied!
40 | {:else}
41 |
42 |
43 |
44 |
45 | {/if}
46 |
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 |
117 |
118 |
119 | {#if showPopup}
120 |
121 |
122 |
Limited Features
123 |
For full feature access, please use a desktop device.
124 |
Close
125 |
126 |
127 | {/if}
128 |
129 |
155 |
--------------------------------------------------------------------------------
/src/lib/components/Launchpad.svelte:
--------------------------------------------------------------------------------
1 |
38 |
39 | {#if isOpen}
40 | dispatch('closeLaunchpad')}
44 | >
45 |
46 |
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 |
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 |
changeGenre(selectedGenre)}
225 | class="appearance-none bg-white/10 border border-white/20 text-white py-1 px-2 pr-8 rounded leading-tight focus:outline-none focus:bg-white/20 focus:border-white"
226 | >
227 | {#each genres as genre}
228 | {genre}
229 | {/each}
230 |
231 |
234 |
235 |
236 |
243 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
262 |
263 |
264 |
{currentSong.name}
265 |
{currentSong.artist}
266 |
{currentSong.genre}
267 |
268 |
269 |
270 |
271 |
280 |
281 | {currentTime}
282 | {duration}
283 |
284 |
285 |
286 |
287 |
291 | {#if repeatMode === "repeat"}
292 |
299 |
306 |
313 |
320 |
327 |
328 | {:else if repeatMode === "repeat_one"}
329 |
337 |
344 |
351 |
358 |
365 |
366 | {:else}
367 |
375 |
382 |
383 | {/if}
384 |
385 |
389 |
396 |
402 |
403 |
404 |
408 | {#if isPlaying}
409 |
416 |
422 |
423 | {:else}
424 |
431 |
437 |
443 |
444 | {/if}
445 |
446 |
450 |
457 |
463 |
464 |
465 |
469 | {#if isMuted}
470 |
477 |
484 |
490 |
491 | {:else}
492 |
499 |
505 |
506 | {/if}
507 |
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 |
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 |
changeView('Library')}>
89 |
90 | Library
91 |
92 |
changeView('For You')}>
93 |
94 | For You
95 |
96 |
changeView('Memories')}>
97 |
98 | Memories
99 |
100 |
101 |
102 |
103 |
104 |
105 | {#if isGridView}
106 |
107 | {:else}
108 |
109 | {/if}
110 |
111 |
112 | Pexels
113 |
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 |
138 |
139 | {/if}
140 |
141 | {#each filteredPhotos as photo}
142 |
selectPhoto(photo)}>
143 |
144 |
145 |
toggleFavorite(photo)}
148 | >
149 |
150 |
151 |
152 |
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 |
closeWindow(window.id)}>
57 |
58 |
59 |
60 |
61 |
toggleMinimize(window.id)}>
62 |
63 |
64 |
65 |
66 |
toggleMaximize(window.id)}>
67 |
68 |
69 |
70 |
71 |
72 |
Projects
73 |
74 |
75 |
76 |
77 | {#each $projects as project,index}
78 |
selectProject(project)}
81 | >
82 |
83 |
86 |
{project.name}
87 |
openProjectLink(project.githubUrl)}
90 | >
91 |
92 |
93 |
94 |
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 |
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 |
closeWindow(window.id)}>
86 |
87 |
88 |
89 |
90 |
toggleMinimize(window.id)}>
91 |
92 |
93 |
94 |
95 |
toggleMaximize(window.id)}>
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
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 | openEndlessHorse('http://endless.horse/')} class="bg-white text-blue-500 px-6 py-2 rounded-full hover:bg-blue-100 transition duration-200 flex items-center justify-center">
143 | Endless Horse
144 |
150 |
151 |
152 | navigateTo('https://www.wikipedia.org')} class="bg-white text-purple-500 px-6 py-2 rounded-full hover:bg-purple-100 transition duration-200">
153 | Wikipedia
154 |
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 |
25 |
26 |
27 |
28 |
29 |
30 |
Finder
31 |
File
32 |
Edit
33 |
View
34 |
Go
35 |
Window
36 |
Help
37 |
38 |
39 |
40 |
41 |
100%
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
{formatDate(currentTime)}
50 |
{formatTime(currentTime)}
51 |
52 |
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 |
--------------------------------------------------------------------------------