├── .github
└── FUNDING.yml
├── .gitignore
├── .gitpod.yml
├── .prettierrc
├── .stackblitzrc
├── LICENSE
├── README.md
├── index.html
├── package.json
├── pnpm-lock.yaml
├── prefetch-plugin.ts
├── public
├── app-icons
│ ├── appstore
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── calculator
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── calendar
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── contacts
│ │ └── 256.png
│ ├── devutils
│ │ └── 256.webp
│ ├── facetime
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── finder
│ │ ├── 1024.png
│ │ ├── 128.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 192.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── keynote
│ │ ├── 1024.png
│ │ ├── 128.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── launchpad
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── mail
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── maps
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── messages
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── music
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── news
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── notes
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── photos
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── podcasts
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── purus-twitter
│ │ ├── 128.webp
│ │ ├── 256.png
│ │ └── 256.webp
│ ├── reminders
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── safari
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── system-preferences
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── terminal
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── tv
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 32.png
│ │ └── 512.png
│ ├── ukraine
│ │ └── 256.webp
│ ├── vercel
│ │ └── 256.webp
│ ├── view-source
│ │ ├── 1024.png
│ │ ├── 128.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ ├── vscode
│ │ ├── 1024.png
│ │ ├── 128.webp
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
│ └── wallpapers
│ │ ├── 1024.png
│ │ ├── 16.png
│ │ ├── 256.png
│ │ ├── 256.webp
│ │ ├── 32.png
│ │ └── 512.png
├── cover-image.png
├── cursors
│ ├── alt-select.svg
│ ├── busy.webp
│ ├── diagonal-resize-1.svg
│ ├── diagonal-resize-2.svg
│ ├── handwriting.svg
│ ├── link-select.svg
│ ├── move.svg
│ ├── normal-select.svg
│ ├── pirate.svg
│ ├── precision-select.svg
│ ├── text-select.svg
│ ├── unavailable.svg
│ ├── vertical-resize.svg
│ └── working-in-background.webp
├── emojis
│ ├── star-struck.png
│ └── wink.png
├── favicon.ico
├── google7cdade01e9ae4685.html
├── purus-profile
│ └── puru.webp
├── robots.txt
└── sounds
│ └── mac-startup-sound.mp3
├── src
├── actions
│ ├── click-outside.ts
│ ├── elevation.ts
│ ├── focus-outside.ts
│ ├── index.ts
│ ├── portal.ts
│ └── trap-focus.ts
├── assets
│ └── wallpapers
│ │ ├── 38.jpg
│ │ ├── 39.jpg
│ │ ├── 40.jpg
│ │ ├── 41.jpg
│ │ ├── 42.jpg
│ │ ├── 43.jpg
│ │ ├── 44.jpg
│ │ ├── 45.jpg
│ │ ├── 46.jpg
│ │ ├── 47.jpg
│ │ ├── 48.jpg
│ │ ├── 49.jpg
│ │ ├── 50.jpg
│ │ ├── 51.jpg
│ │ ├── 52.jpg
│ │ ├── 53.jpg
│ │ ├── 54.jpg
│ │ ├── 55.jpg
│ │ ├── 56.jpg
│ │ ├── 57.jpg
│ │ ├── 58.jpg
│ │ ├── 59.jpg
│ │ ├── 60.jpg
│ │ ├── 61.jpg
│ │ ├── 62.jpg
│ │ ├── 63.jpg
│ │ ├── 64.jpg
│ │ ├── big-sur-1.jpg
│ │ ├── big-sur-2.jpg
│ │ ├── big-sur-3.jpg
│ │ ├── big-sur-4.jpg
│ │ ├── big-sur-5.jpg
│ │ ├── big-sur-6.jpg
│ │ ├── big-sur-7.jpg
│ │ ├── big-sur-8.jpg
│ │ ├── big-sur-graphic-1.jpg
│ │ ├── big-sur-graphic-2.jpg
│ │ ├── catalina-0.jpg
│ │ ├── catalina-1.jpg
│ │ ├── catalina-2.jpg
│ │ ├── catalina-3.jpg
│ │ ├── catalina-4.jpg
│ │ ├── catalina-5.jpg
│ │ ├── catalina-6.jpg
│ │ ├── catalina-7.jpg
│ │ ├── catalina-8.jpg
│ │ ├── desert-1.jpg
│ │ ├── desert-2.jpg
│ │ ├── desert-3.jpg
│ │ ├── desert-4.jpg
│ │ ├── desert-5.jpg
│ │ ├── desert-6.jpg
│ │ ├── desert-7.jpg
│ │ ├── desert-8.jpg
│ │ ├── dome-1.jpg
│ │ ├── dome-2.jpg
│ │ ├── iridescence-1.jpg
│ │ ├── iridescence-2.jpg
│ │ ├── lake-1.jpg
│ │ ├── lake-2.jpg
│ │ ├── lake-3.jpg
│ │ ├── lake-4.jpg
│ │ ├── lake-5.jpg
│ │ ├── lake-6.jpg
│ │ ├── lake-7.jpg
│ │ ├── lake-8.jpg
│ │ ├── mojave-1.jpg
│ │ ├── mojave-2.jpg
│ │ ├── monterey-1.jpg
│ │ ├── monterey-2.jpg
│ │ ├── monterey-3.jpg
│ │ ├── monterey-4.jpg
│ │ ├── monterey-5.jpg
│ │ ├── monterey-6.jpg
│ │ ├── monterey-7.jpg
│ │ ├── monterey-8.jpg
│ │ ├── peak-1.jpg
│ │ ├── peak-2.jpg
│ │ ├── solar-grad-1.jpg
│ │ ├── solar-grad-10.jpg
│ │ ├── solar-grad-11.jpg
│ │ ├── solar-grad-12.jpg
│ │ ├── solar-grad-13.jpg
│ │ ├── solar-grad-14.jpg
│ │ ├── solar-grad-15.jpg
│ │ ├── solar-grad-16.jpg
│ │ ├── solar-grad-2.jpg
│ │ ├── solar-grad-3.jpg
│ │ ├── solar-grad-4.jpg
│ │ ├── solar-grad-5.jpg
│ │ ├── solar-grad-6.jpg
│ │ ├── solar-grad-7.jpg
│ │ ├── solar-grad-8.jpg
│ │ ├── solar-grad-9.jpg
│ │ ├── unused
│ │ ├── 1.jpg
│ │ ├── 10.jpg
│ │ ├── 11.jpg
│ │ ├── 13.jpg
│ │ ├── 14.jpg
│ │ ├── 15.jpg
│ │ ├── 16.jpg
│ │ ├── 17.jpg
│ │ ├── 18.jpg
│ │ ├── 19.jpg
│ │ ├── 2.jpg
│ │ ├── 20.jpg
│ │ ├── 21.jpg
│ │ ├── 22.jpg
│ │ ├── 23.jpg
│ │ ├── 27.jpg
│ │ ├── 28.jpg
│ │ ├── 30.jpg
│ │ ├── 31.jpg
│ │ ├── 32.jpg
│ │ ├── 33.jpg
│ │ ├── 5.jpg
│ │ ├── 6.jpg
│ │ ├── 7.jpg
│ │ ├── 8.jpg
│ │ ├── 9.jpg
│ │ ├── The Beach.jpg
│ │ ├── The Cliffs.jpg
│ │ ├── The Desert.jpg
│ │ ├── The Lake.jpg
│ │ ├── Tree.jpg
│ │ └── Valley.jpg
│ │ ├── ventura-1.webp
│ │ ├── ventura-2.webp
│ │ ├── ventura-3.webp
│ │ ├── ventura-4.webp
│ │ └── ventura-5.webp
├── components
│ ├── Desktop
│ │ ├── BootupScreen.svelte
│ │ ├── ContextMenu.svelte
│ │ ├── Desktop.svelte
│ │ ├── SystemUpdate.svelte
│ │ └── Window
│ │ │ ├── TrafficLights.svelte
│ │ │ ├── Window.svelte
│ │ │ └── WindowsArea.svelte
│ ├── Dock
│ │ ├── Dock.svelte
│ │ └── DockItem.svelte
│ ├── SVG
│ │ ├── SwitchSVG.svelte
│ │ └── traffic-lights
│ │ │ ├── CloseSVG.svelte
│ │ │ ├── ExpandSVG.svelte
│ │ │ ├── GreenLight.svelte
│ │ │ ├── MinimizeSVG.svelte
│ │ │ └── StretchSVG.svelte
│ ├── SystemUI
│ │ └── SystemDialog.svelte
│ ├── TopBar
│ │ ├── ActionCenter.svelte
│ │ ├── ActionCenterSurface.svelte
│ │ ├── ActionCenterTile.svelte
│ │ ├── ActionCenterToggle.svelte
│ │ ├── Menu.svelte
│ │ ├── MenuBar.svelte
│ │ ├── TopBar.svelte
│ │ └── TopBarTime.svelte
│ └── apps
│ │ ├── AppNexus.svelte
│ │ ├── AppStore
│ │ └── AppStore.svelte
│ │ ├── Calculator
│ │ └── Calculator.svelte
│ │ ├── Calendar
│ │ ├── Calendar.svelte
│ │ ├── MonthView.svelte
│ │ ├── calendar-constants.ts
│ │ └── calendar-utils.ts
│ │ ├── PurusProfile
│ │ └── PurusProfile.svelte
│ │ ├── VSCode
│ │ └── VSCode.svelte
│ │ └── WallpaperApp
│ │ ├── Wallpaper.svelte
│ │ └── WallpaperSelectorApp.svelte
├── configs
│ ├── apps
│ │ └── apps-config.ts
│ ├── menu
│ │ ├── context.menu.config.ts
│ │ └── finder.menu.config.ts
│ ├── theme
│ │ └── colors.config.ts
│ └── wallpapers
│ │ └── wallpaper.config.ts
├── css
│ ├── global.css
│ ├── reset.css
│ └── theme.css
├── global.d.ts
├── helpers
│ ├── create-app-config.ts
│ ├── create-menu-config.ts
│ ├── fade.ts
│ ├── random.ts
│ ├── sleep.ts
│ └── smaller-closest-value.ts
├── main.ts
└── state
│ ├── apps.svelte.ts
│ ├── auto-destroy-effect-root.svelte.ts
│ ├── dock.svelte.ts
│ ├── interval.svelte.ts
│ ├── menubar.svelte.ts
│ ├── persisted.svelte.ts
│ ├── preferences.svelte.ts
│ ├── spring.svelte.ts
│ └── system.svelte.ts
├── svelte.config.js
├── tsconfig.json
├── vercel.json
└── vite.config.ts
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 | github: PuruVJ
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /node_modules/
2 | /dist/
3 | /.vscode/
4 | .DS_Store
5 | .idea/
--------------------------------------------------------------------------------
/.gitpod.yml:
--------------------------------------------------------------------------------
1 | tasks:
2 | - init: npm install
3 | command: npm run dev
4 |
5 | ports:
6 | - port: 3000
7 | onOpen: open-browser
8 |
9 | vscode:
10 | extensions:
11 | - svelte.svelte-vscode
12 |
13 | github:
14 | prebuilds:
15 | master: true
16 | branches: true
17 | pullRequests: true
18 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all",
4 | "printWidth": 100,
5 | "useTabs": true,
6 | "overrides": [
7 | {
8 | "files": "*.svelte",
9 | "options": {
10 | "plugins": ["prettier-plugin-svelte"]
11 | }
12 | }
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/.stackblitzrc:
--------------------------------------------------------------------------------
1 | {
2 | "startCommand": "npm run dev"
3 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Puru Vijay
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | > 🛑🛑 Note: This is the new iteration of macOS Web written in Svelte. Previous version written in Preact is available at [PuruVJ/macos-preact](https://github.com/puruvj/macos-preact) 🛑🛑
2 |
3 | # Mac OS Ventura Web
4 |
5 | This open source project aims to replicate some of the Mac OS(Monterey, at the time of writing)'s desktop experience on web, using Svelte!
6 |
7 | 🔗🔗 [macos-web.app](https://macos.now.sh)
8 |
9 | # Why
10 |
11 | I've always been very fascinated with macOS, and have never owned a Mac/book. So I'm making the most beautiful aspect of macOS, its desktop, myself. For web. Inspired from [WinXP](https://winxp.now.sh/).
12 |
13 | # Stack
14 |
15 | - Framework - Svelte (Earlier Preact)
16 | - Bundler - Vite, for super fast development.
17 | - Component Library - None!!
18 | - Styling Solution - SCSS.
19 |
20 | # When will it be ready?
21 |
22 | 
23 |
24 | # Can I contribute?
25 |
26 | Sure, open an issue, point out errors, and what not. Wanna fix something yourselves, you're welcome to open a PR and I appreciate it.
27 |
28 | [](https://vercel.com/?utm_source=purus-projects&utm_campaign=oss)
29 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | macOS in Svelte
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
37 |
38 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "macos-svelte",
3 | "version": "13.0.0",
4 | "type": "module",
5 | "scripts": {
6 | "dev": "vite",
7 | "build": "vite build",
8 | "serve": "vite preview",
9 | "check": "svelte-check --tsconfig ./tsconfig.json"
10 | },
11 | "devDependencies": {
12 | "@iconify-json/gg": "^1.2.1",
13 | "@iconify-json/ic": "^1.2.1",
14 | "@iconify-json/icon-park-outline": "^1.2.1",
15 | "@iconify-json/iconamoon": "^1.2.1",
16 | "@iconify-json/majesticons": "^1.2.1",
17 | "@iconify-json/mdi": "^1.2.1",
18 | "@iconify-json/pepicons": "^1.2.0",
19 | "@iconify-json/ph": "^1.2.1",
20 | "@iconify-json/uil": "^1.2.1",
21 | "@sveltejs/vite-plugin-svelte": "4.0.0",
22 | "browserslist": "^4.24.2",
23 | "lightningcss": "^1.27.0",
24 | "prettier-plugin-svelte": "^3.2.7",
25 | "svelte": "5.1.4",
26 | "svelte-check": "^4.0.5",
27 | "typescript": "^5.6.3",
28 | "vite": "5.4.10",
29 | "vite-imagetools": "^7.0.4",
30 | "vite-plugin-pwa": "^0.20.5",
31 | "workbox-window": "^7.3.0"
32 | },
33 | "dependencies": {
34 | "@fontsource/inter": "^5.1.0",
35 | "@neodrag/svelte": "^2.0.6",
36 | "date-fns": "^4.1.0",
37 | "popmotion": "^11.0.5",
38 | "unplugin-icons": "^0.19.3"
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/prefetch-plugin.ts:
--------------------------------------------------------------------------------
1 | import type { HtmlTagDescriptor, Plugin } from 'vite';
2 |
3 | export function prefetch(): Plugin {
4 | return {
5 | name: 'prefetch',
6 |
7 | enforce: 'post',
8 | apply: 'build',
9 |
10 | transformIndexHtml: (html, ctx) => {
11 | const tags = Object.keys(ctx.bundle)
12 | .filter((v) => !v.toString().endsWith('webp'))
13 | .map(
14 | (chunkName) =>
15 | ({
16 | injectTo: 'head',
17 | tag: 'link',
18 | attrs: {
19 | rel: 'prefetch',
20 | href: `/${chunkName}`,
21 | },
22 | }) as HtmlTagDescriptor,
23 | );
24 |
25 | return {
26 | html,
27 | tags,
28 | };
29 | },
30 | };
31 | }
32 |
--------------------------------------------------------------------------------
/public/app-icons/appstore/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/1024.png
--------------------------------------------------------------------------------
/public/app-icons/appstore/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/128.webp
--------------------------------------------------------------------------------
/public/app-icons/appstore/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/16.png
--------------------------------------------------------------------------------
/public/app-icons/appstore/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/256.png
--------------------------------------------------------------------------------
/public/app-icons/appstore/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/256.webp
--------------------------------------------------------------------------------
/public/app-icons/appstore/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/32.png
--------------------------------------------------------------------------------
/public/app-icons/appstore/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/appstore/512.png
--------------------------------------------------------------------------------
/public/app-icons/calculator/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/1024.png
--------------------------------------------------------------------------------
/public/app-icons/calculator/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/128.webp
--------------------------------------------------------------------------------
/public/app-icons/calculator/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/16.png
--------------------------------------------------------------------------------
/public/app-icons/calculator/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/256.png
--------------------------------------------------------------------------------
/public/app-icons/calculator/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/256.webp
--------------------------------------------------------------------------------
/public/app-icons/calculator/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/32.png
--------------------------------------------------------------------------------
/public/app-icons/calculator/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calculator/512.png
--------------------------------------------------------------------------------
/public/app-icons/calendar/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/1024.png
--------------------------------------------------------------------------------
/public/app-icons/calendar/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/128.webp
--------------------------------------------------------------------------------
/public/app-icons/calendar/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/16.png
--------------------------------------------------------------------------------
/public/app-icons/calendar/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/256.png
--------------------------------------------------------------------------------
/public/app-icons/calendar/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/256.webp
--------------------------------------------------------------------------------
/public/app-icons/calendar/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/32.png
--------------------------------------------------------------------------------
/public/app-icons/calendar/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/calendar/512.png
--------------------------------------------------------------------------------
/public/app-icons/contacts/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/contacts/256.png
--------------------------------------------------------------------------------
/public/app-icons/devutils/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/devutils/256.webp
--------------------------------------------------------------------------------
/public/app-icons/facetime/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/1024.png
--------------------------------------------------------------------------------
/public/app-icons/facetime/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/128.webp
--------------------------------------------------------------------------------
/public/app-icons/facetime/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/16.png
--------------------------------------------------------------------------------
/public/app-icons/facetime/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/256.png
--------------------------------------------------------------------------------
/public/app-icons/facetime/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/256.webp
--------------------------------------------------------------------------------
/public/app-icons/facetime/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/32.png
--------------------------------------------------------------------------------
/public/app-icons/facetime/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/facetime/512.png
--------------------------------------------------------------------------------
/public/app-icons/finder/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/1024.png
--------------------------------------------------------------------------------
/public/app-icons/finder/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/128.png
--------------------------------------------------------------------------------
/public/app-icons/finder/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/128.webp
--------------------------------------------------------------------------------
/public/app-icons/finder/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/16.png
--------------------------------------------------------------------------------
/public/app-icons/finder/192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/192.png
--------------------------------------------------------------------------------
/public/app-icons/finder/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/256.png
--------------------------------------------------------------------------------
/public/app-icons/finder/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/256.webp
--------------------------------------------------------------------------------
/public/app-icons/finder/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/32.png
--------------------------------------------------------------------------------
/public/app-icons/finder/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/finder/512.png
--------------------------------------------------------------------------------
/public/app-icons/keynote/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/keynote/1024.png
--------------------------------------------------------------------------------
/public/app-icons/keynote/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/keynote/128.png
--------------------------------------------------------------------------------
/public/app-icons/keynote/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/keynote/16.png
--------------------------------------------------------------------------------
/public/app-icons/keynote/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/keynote/256.png
--------------------------------------------------------------------------------
/public/app-icons/keynote/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/keynote/32.png
--------------------------------------------------------------------------------
/public/app-icons/keynote/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/keynote/512.png
--------------------------------------------------------------------------------
/public/app-icons/launchpad/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/launchpad/1024.png
--------------------------------------------------------------------------------
/public/app-icons/launchpad/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/launchpad/16.png
--------------------------------------------------------------------------------
/public/app-icons/launchpad/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/launchpad/256.png
--------------------------------------------------------------------------------
/public/app-icons/launchpad/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/launchpad/32.png
--------------------------------------------------------------------------------
/public/app-icons/launchpad/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/launchpad/512.png
--------------------------------------------------------------------------------
/public/app-icons/mail/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/1024.png
--------------------------------------------------------------------------------
/public/app-icons/mail/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/128.webp
--------------------------------------------------------------------------------
/public/app-icons/mail/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/16.png
--------------------------------------------------------------------------------
/public/app-icons/mail/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/256.png
--------------------------------------------------------------------------------
/public/app-icons/mail/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/256.webp
--------------------------------------------------------------------------------
/public/app-icons/mail/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/32.png
--------------------------------------------------------------------------------
/public/app-icons/mail/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/mail/512.png
--------------------------------------------------------------------------------
/public/app-icons/maps/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/maps/1024.png
--------------------------------------------------------------------------------
/public/app-icons/maps/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/maps/16.png
--------------------------------------------------------------------------------
/public/app-icons/maps/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/maps/256.png
--------------------------------------------------------------------------------
/public/app-icons/maps/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/maps/32.png
--------------------------------------------------------------------------------
/public/app-icons/maps/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/maps/512.png
--------------------------------------------------------------------------------
/public/app-icons/messages/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/1024.png
--------------------------------------------------------------------------------
/public/app-icons/messages/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/128.webp
--------------------------------------------------------------------------------
/public/app-icons/messages/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/16.png
--------------------------------------------------------------------------------
/public/app-icons/messages/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/256.png
--------------------------------------------------------------------------------
/public/app-icons/messages/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/256.webp
--------------------------------------------------------------------------------
/public/app-icons/messages/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/32.png
--------------------------------------------------------------------------------
/public/app-icons/messages/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/messages/512.png
--------------------------------------------------------------------------------
/public/app-icons/music/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/music/1024.png
--------------------------------------------------------------------------------
/public/app-icons/music/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/music/16.png
--------------------------------------------------------------------------------
/public/app-icons/music/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/music/256.png
--------------------------------------------------------------------------------
/public/app-icons/music/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/music/32.png
--------------------------------------------------------------------------------
/public/app-icons/music/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/music/512.png
--------------------------------------------------------------------------------
/public/app-icons/news/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/news/1024.png
--------------------------------------------------------------------------------
/public/app-icons/news/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/news/16.png
--------------------------------------------------------------------------------
/public/app-icons/news/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/news/256.png
--------------------------------------------------------------------------------
/public/app-icons/news/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/news/32.png
--------------------------------------------------------------------------------
/public/app-icons/news/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/news/512.png
--------------------------------------------------------------------------------
/public/app-icons/notes/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/notes/1024.png
--------------------------------------------------------------------------------
/public/app-icons/notes/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/notes/16.png
--------------------------------------------------------------------------------
/public/app-icons/notes/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/notes/256.png
--------------------------------------------------------------------------------
/public/app-icons/notes/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/notes/32.png
--------------------------------------------------------------------------------
/public/app-icons/notes/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/notes/512.png
--------------------------------------------------------------------------------
/public/app-icons/photos/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/1024.png
--------------------------------------------------------------------------------
/public/app-icons/photos/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/128.webp
--------------------------------------------------------------------------------
/public/app-icons/photos/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/16.png
--------------------------------------------------------------------------------
/public/app-icons/photos/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/256.png
--------------------------------------------------------------------------------
/public/app-icons/photos/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/256.webp
--------------------------------------------------------------------------------
/public/app-icons/photos/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/32.png
--------------------------------------------------------------------------------
/public/app-icons/photos/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/photos/512.png
--------------------------------------------------------------------------------
/public/app-icons/podcasts/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/podcasts/1024.png
--------------------------------------------------------------------------------
/public/app-icons/podcasts/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/podcasts/16.png
--------------------------------------------------------------------------------
/public/app-icons/podcasts/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/podcasts/256.png
--------------------------------------------------------------------------------
/public/app-icons/podcasts/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/podcasts/32.png
--------------------------------------------------------------------------------
/public/app-icons/podcasts/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/podcasts/512.png
--------------------------------------------------------------------------------
/public/app-icons/purus-twitter/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/purus-twitter/128.webp
--------------------------------------------------------------------------------
/public/app-icons/purus-twitter/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/purus-twitter/256.png
--------------------------------------------------------------------------------
/public/app-icons/purus-twitter/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/purus-twitter/256.webp
--------------------------------------------------------------------------------
/public/app-icons/reminders/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/reminders/1024.png
--------------------------------------------------------------------------------
/public/app-icons/reminders/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/reminders/16.png
--------------------------------------------------------------------------------
/public/app-icons/reminders/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/reminders/256.png
--------------------------------------------------------------------------------
/public/app-icons/reminders/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/reminders/32.png
--------------------------------------------------------------------------------
/public/app-icons/reminders/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/reminders/512.png
--------------------------------------------------------------------------------
/public/app-icons/safari/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/1024.png
--------------------------------------------------------------------------------
/public/app-icons/safari/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/128.webp
--------------------------------------------------------------------------------
/public/app-icons/safari/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/16.png
--------------------------------------------------------------------------------
/public/app-icons/safari/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/256.png
--------------------------------------------------------------------------------
/public/app-icons/safari/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/256.webp
--------------------------------------------------------------------------------
/public/app-icons/safari/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/32.png
--------------------------------------------------------------------------------
/public/app-icons/safari/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/safari/512.png
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/1024.png
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/128.webp
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/16.png
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/256.png
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/256.webp
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/32.png
--------------------------------------------------------------------------------
/public/app-icons/system-preferences/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/system-preferences/512.png
--------------------------------------------------------------------------------
/public/app-icons/terminal/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/terminal/1024.png
--------------------------------------------------------------------------------
/public/app-icons/terminal/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/terminal/16.png
--------------------------------------------------------------------------------
/public/app-icons/terminal/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/terminal/256.png
--------------------------------------------------------------------------------
/public/app-icons/terminal/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/terminal/32.png
--------------------------------------------------------------------------------
/public/app-icons/terminal/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/terminal/512.png
--------------------------------------------------------------------------------
/public/app-icons/tv/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/tv/1024.png
--------------------------------------------------------------------------------
/public/app-icons/tv/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/tv/16.png
--------------------------------------------------------------------------------
/public/app-icons/tv/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/tv/256.png
--------------------------------------------------------------------------------
/public/app-icons/tv/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/tv/32.png
--------------------------------------------------------------------------------
/public/app-icons/tv/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/tv/512.png
--------------------------------------------------------------------------------
/public/app-icons/ukraine/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/ukraine/256.webp
--------------------------------------------------------------------------------
/public/app-icons/vercel/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vercel/256.webp
--------------------------------------------------------------------------------
/public/app-icons/view-source/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/1024.png
--------------------------------------------------------------------------------
/public/app-icons/view-source/128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/128.png
--------------------------------------------------------------------------------
/public/app-icons/view-source/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/128.webp
--------------------------------------------------------------------------------
/public/app-icons/view-source/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/16.png
--------------------------------------------------------------------------------
/public/app-icons/view-source/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/256.png
--------------------------------------------------------------------------------
/public/app-icons/view-source/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/256.webp
--------------------------------------------------------------------------------
/public/app-icons/view-source/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/32.png
--------------------------------------------------------------------------------
/public/app-icons/view-source/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/view-source/512.png
--------------------------------------------------------------------------------
/public/app-icons/vscode/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/1024.png
--------------------------------------------------------------------------------
/public/app-icons/vscode/128.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/128.webp
--------------------------------------------------------------------------------
/public/app-icons/vscode/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/16.png
--------------------------------------------------------------------------------
/public/app-icons/vscode/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/256.png
--------------------------------------------------------------------------------
/public/app-icons/vscode/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/256.webp
--------------------------------------------------------------------------------
/public/app-icons/vscode/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/32.png
--------------------------------------------------------------------------------
/public/app-icons/vscode/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/vscode/512.png
--------------------------------------------------------------------------------
/public/app-icons/wallpapers/1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/wallpapers/1024.png
--------------------------------------------------------------------------------
/public/app-icons/wallpapers/16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/wallpapers/16.png
--------------------------------------------------------------------------------
/public/app-icons/wallpapers/256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/wallpapers/256.png
--------------------------------------------------------------------------------
/public/app-icons/wallpapers/256.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/wallpapers/256.webp
--------------------------------------------------------------------------------
/public/app-icons/wallpapers/32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/wallpapers/32.png
--------------------------------------------------------------------------------
/public/app-icons/wallpapers/512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/app-icons/wallpapers/512.png
--------------------------------------------------------------------------------
/public/cover-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/cover-image.png
--------------------------------------------------------------------------------
/public/cursors/alt-select.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
16 |
--------------------------------------------------------------------------------
/public/cursors/busy.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/cursors/busy.webp
--------------------------------------------------------------------------------
/public/cursors/diagonal-resize-1.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
26 |
27 |
--------------------------------------------------------------------------------
/public/cursors/diagonal-resize-2.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
26 |
27 |
--------------------------------------------------------------------------------
/public/cursors/handwriting.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
16 |
--------------------------------------------------------------------------------
/public/cursors/link-select.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/public/cursors/move.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
33 |
34 |
--------------------------------------------------------------------------------
/public/cursors/normal-select.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
17 |
18 |
--------------------------------------------------------------------------------
/public/cursors/pirate.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
33 |
34 |
--------------------------------------------------------------------------------
/public/cursors/precision-select.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
12 |
13 |
--------------------------------------------------------------------------------
/public/cursors/text-select.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
16 |
--------------------------------------------------------------------------------
/public/cursors/unavailable.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
32 |
33 |
--------------------------------------------------------------------------------
/public/cursors/vertical-resize.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
24 |
25 |
--------------------------------------------------------------------------------
/public/cursors/working-in-background.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/cursors/working-in-background.webp
--------------------------------------------------------------------------------
/public/emojis/star-struck.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/emojis/star-struck.png
--------------------------------------------------------------------------------
/public/emojis/wink.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/emojis/wink.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/favicon.ico
--------------------------------------------------------------------------------
/public/google7cdade01e9ae4685.html:
--------------------------------------------------------------------------------
1 | google-site-verification: google7cdade01e9ae4685.html
2 |
--------------------------------------------------------------------------------
/public/purus-profile/puru.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/purus-profile/puru.webp
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/public/sounds/mac-startup-sound.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/public/sounds/mac-startup-sound.mp3
--------------------------------------------------------------------------------
/src/actions/click-outside.ts:
--------------------------------------------------------------------------------
1 | /** Dispatch event on click outside of node */
2 | export function click_outside(node: HTMLElement, callback: () => void) {
3 | const handleClick = (e: MouseEvent) => {
4 | if (!node.contains(e.target as HTMLElement)) callback();
5 | };
6 |
7 | document.addEventListener('click', handleClick, true);
8 |
9 | return {
10 | destroy() {
11 | document.removeEventListener('click', handleClick, true);
12 | },
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/src/actions/elevation.ts:
--------------------------------------------------------------------------------
1 | const z_index_config = {
2 | wallpaper: -1,
3 | 'bootup-screen': 110,
4 | 'context-menu': 100,
5 | 'window-traffic-lights': 10,
6 | dock: 80,
7 | 'dock-tooltip': 70,
8 | 'system-updates-available': 60,
9 | 'system-dialog': 90,
10 | 'menubar-menu-parent': 160,
11 | };
12 |
13 | for (const [element, zIndexValue] of Object.entries(z_index_config)) {
14 | document.body.style.setProperty(`--system-z-index-${element}`, zIndexValue + '');
15 | }
16 |
17 | export function elevation(node: HTMLElement, uiElement: keyof typeof z_index_config) {
18 | node.style.zIndex = `var(--system-z-index-${uiElement})`;
19 | }
20 |
--------------------------------------------------------------------------------
/src/actions/focus-outside.ts:
--------------------------------------------------------------------------------
1 | /** Dispatch event on click outside of node */
2 | export function focus_outside(node: HTMLElement, callback: () => void) {
3 | function handleFocus(e: FocusEvent) {
4 | const target = e.target as HTMLElement;
5 |
6 | if (!node?.contains(target)) callback();
7 | }
8 |
9 | document.addEventListener('focus', handleFocus, true);
10 |
11 | return {
12 | destroy() {
13 | document.removeEventListener('focus', handleFocus, true);
14 | },
15 | };
16 | }
17 |
--------------------------------------------------------------------------------
/src/actions/index.ts:
--------------------------------------------------------------------------------
1 | export { click_outside as click_outside } from './click-outside';
2 | export { elevation } from './elevation';
3 | export { focus_outside as focus_outside } from './focus-outside';
4 | export { portal } from './portal';
5 | export { trap_focus as trapFocus } from './trap-focus';
6 |
--------------------------------------------------------------------------------
/src/actions/portal.ts:
--------------------------------------------------------------------------------
1 | import { tick } from 'svelte';
2 |
3 | /**
4 | * Usage: or
5 | *
6 | * @param {HTMLElement} el
7 | * @param {HTMLElement|string} target DOM Element or CSS Selector
8 | */
9 | export function portal(el: HTMLElement, target: HTMLElement | string = 'body') {
10 | let target_el: HTMLElement;
11 |
12 | async function update(new_target: HTMLElement | string) {
13 | target = new_target;
14 |
15 | if (typeof target === 'string') {
16 | target_el = document.querySelector(target);
17 |
18 | if (target_el === null) {
19 | await tick();
20 | target_el = document.querySelector(target);
21 | }
22 |
23 | if (target_el === null) {
24 | throw new Error(`No element found matching css selector: "${target}"`);
25 | }
26 | } else if (target instanceof HTMLElement) {
27 | target_el = target;
28 | } else {
29 | throw new TypeError(
30 | `Unknown portal target type: ${
31 | target === null ? 'null' : typeof target
32 | }. Allowed types: string (CSS selector) or HTMLElement.`,
33 | );
34 | }
35 | target_el.appendChild(el);
36 | el.hidden = false;
37 | }
38 |
39 | function destroy() {
40 | if (el.parentNode) {
41 | el.parentNode.removeChild(el);
42 | }
43 | }
44 |
45 | update(target);
46 |
47 | return {
48 | update,
49 | destroy,
50 | };
51 | }
52 |
--------------------------------------------------------------------------------
/src/actions/trap-focus.ts:
--------------------------------------------------------------------------------
1 | let trapFocusList: HTMLElement[] = [];
2 |
3 | const is_next = (event: KeyboardEvent) => event.key === 'Tab' && !event.shiftKey;
4 | const is_previous = (event: KeyboardEvent) => event.key === 'Tab' && event.shiftKey;
5 | const trap_focus_listener = (event: KeyboardEvent) => {
6 | if (event.target === window) {
7 | return;
8 | }
9 |
10 | const event_target = event.target as Element;
11 |
12 | const parent_node = trapFocusList.find((node) => node.contains(event_target));
13 | if (!parent_node) {
14 | return;
15 | }
16 |
17 | const focusable = parent_node.querySelectorAll
(
18 | 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]',
19 | );
20 | const first = focusable[0];
21 | const last = focusable[focusable.length - 1];
22 | if (is_next(event) && event.target === last) {
23 | event.preventDefault();
24 | first.focus();
25 | } else if (is_previous(event) && event.target === first) {
26 | event.preventDefault();
27 | last.focus();
28 | }
29 | };
30 |
31 | document.addEventListener('keydown', trap_focus_listener);
32 |
33 | export const trap_focus = (node: HTMLElement) => {
34 | trapFocusList.push(node);
35 | return {
36 | destroy() {
37 | trapFocusList = trapFocusList.filter((element) => element !== node);
38 | },
39 | };
40 | };
41 |
--------------------------------------------------------------------------------
/src/assets/wallpapers/38.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/38.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/39.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/39.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/40.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/40.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/41.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/41.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/42.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/42.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/43.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/43.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/44.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/44.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/45.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/45.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/46.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/46.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/47.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/47.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/48.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/48.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/49.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/49.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/50.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/50.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/51.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/51.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/52.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/52.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/53.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/53.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/54.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/54.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/55.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/55.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/56.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/56.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/57.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/57.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/58.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/58.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/59.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/59.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/60.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/60.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/61.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/61.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/62.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/62.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/63.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/63.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/64.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/64.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-3.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-4.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-graphic-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-graphic-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/big-sur-graphic-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/big-sur-graphic-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-0.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-3.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-4.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/catalina-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/catalina-8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-3.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-4.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/desert-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/desert-8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/dome-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/dome-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/dome-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/dome-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/iridescence-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/iridescence-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/iridescence-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/iridescence-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-3.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-4.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/lake-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/lake-8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/mojave-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/mojave-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/mojave-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/mojave-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-3.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-4.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/monterey-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/monterey-8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/peak-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/peak-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/peak-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/peak-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-10.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-11.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-12.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-13.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-14.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-15.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-16.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-3.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-4.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/solar-grad-9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/solar-grad-9.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/1.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/10.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/11.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/13.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/14.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/15.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/16.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/17.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/18.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/18.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/19.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/19.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/2.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/20.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/20.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/21.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/21.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/22.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/22.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/23.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/23.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/27.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/27.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/28.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/28.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/30.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/30.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/31.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/31.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/32.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/32.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/33.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/33.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/5.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/6.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/7.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/8.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/9.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/The Beach.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/The Beach.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/The Cliffs.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/The Cliffs.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/The Desert.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/The Desert.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/The Lake.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/The Lake.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/Tree.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/Tree.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/unused/Valley.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/unused/Valley.jpg
--------------------------------------------------------------------------------
/src/assets/wallpapers/ventura-1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/ventura-1.webp
--------------------------------------------------------------------------------
/src/assets/wallpapers/ventura-2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/ventura-2.webp
--------------------------------------------------------------------------------
/src/assets/wallpapers/ventura-3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/ventura-3.webp
--------------------------------------------------------------------------------
/src/assets/wallpapers/ventura-4.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/ventura-4.webp
--------------------------------------------------------------------------------
/src/assets/wallpapers/ventura-5.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/PuruVJ/macos-web/dffd365c3f460b6030ed4449bc327cf490381b58/src/assets/wallpapers/ventura-5.webp
--------------------------------------------------------------------------------
/src/components/Desktop/BootupScreen.svelte:
--------------------------------------------------------------------------------
1 |
19 |
20 | {#if !(hidden_splash_screen || import.meta.env.DEV)}
21 |
35 | {/if}
36 |
37 |
38 | {#if import.meta.env.PROD}
39 |
40 | {/if}
41 |
42 |
98 |
--------------------------------------------------------------------------------
/src/components/Desktop/ContextMenu.svelte:
--------------------------------------------------------------------------------
1 |
33 |
34 | {
36 | e.preventDefault();
37 | handle_context_menu(e);
38 | }}
39 | onclick={hideMenu}
40 | />
41 |
42 | {#if is_menu_visible}
43 |
50 | {#each Object.values(context_menu_config.default) as contents}
51 |
52 |
53 | {#if contents.breakAfter}
54 |
55 | {/if}
56 | {/each}
57 |
58 | {/if}
59 |
60 |
154 |
--------------------------------------------------------------------------------
/src/components/Desktop/Desktop.svelte:
--------------------------------------------------------------------------------
1 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
52 |
--------------------------------------------------------------------------------
/src/components/Desktop/SystemUpdate.svelte:
--------------------------------------------------------------------------------
1 |
48 |
49 |
50 |
51 |
58 |
59 | Updates Available
60 | Do you want to restart to install these updates now?
61 |
62 |
63 | Later
64 | Update
65 |
66 |
67 |
68 |
69 | {build_date}
70 |
71 |
139 |
--------------------------------------------------------------------------------
/src/components/Desktop/Window/TrafficLights.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
89 |
--------------------------------------------------------------------------------
/src/components/Desktop/Window/WindowsArea.svelte:
--------------------------------------------------------------------------------
1 |
32 |
33 |
34 | {#each Object.keys(apps_config) as app_id}
35 | {#if apps.open[app_id] && apps_config[app_id].should_open_window}
36 | {#await import('./Window.svelte') then { default: Window }}
37 |
38 | {/await}
39 | {/if}
40 | {/each}
41 |
42 |
43 |
57 |
--------------------------------------------------------------------------------
/src/components/Dock/Dock.svelte:
--------------------------------------------------------------------------------
1 |
2 |
3 |
44 |
45 | (mouseY = y)} />
46 |
47 |
48 |
49 |
55 |
56 | (dock_mouse_x = event.x)}
60 | onmouseleave={() => (dock_mouse_x = null)}
61 | >
62 | {#each Object.entries(apps_config) as [appID, config]}
63 | {#if config.dock_breaks_before}
64 |
65 | {/if}
66 |
67 |
68 | {/each}
69 |
70 |
71 |
72 |
157 |
--------------------------------------------------------------------------------
/src/components/SVG/SwitchSVG.svelte:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/src/components/SVG/traffic-lights/CloseSVG.svelte:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/src/components/SVG/traffic-lights/ExpandSVG.svelte:
--------------------------------------------------------------------------------
1 |
2 |
3 |
11 |
12 |
--------------------------------------------------------------------------------
/src/components/SVG/traffic-lights/GreenLight.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 | {#if expandable}
9 |
10 | {:else}
11 |
12 | {/if}
13 |
--------------------------------------------------------------------------------
/src/components/SVG/traffic-lights/MinimizeSVG.svelte:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/components/SVG/traffic-lights/StretchSVG.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/components/SystemUI/SystemDialog.svelte:
--------------------------------------------------------------------------------
1 |
46 |
47 | {#if is_open}
48 |
49 |
50 |
51 |
52 | backdrop_dismiss && close()}
63 | onclick={(e) => e.stopPropagation()}
64 | >
65 | {@render children?.()}
66 |
67 |
68 | {/if}
69 |
70 |
107 |
--------------------------------------------------------------------------------
/src/components/TopBar/ActionCenterSurface.svelte:
--------------------------------------------------------------------------------
1 |
15 |
16 |
22 | {@render children?.()}
23 |
24 |
25 |
50 |
--------------------------------------------------------------------------------
/src/components/TopBar/ActionCenterTile.svelte:
--------------------------------------------------------------------------------
1 |
20 |
21 |
29 | {@render children?.()}
30 |
31 |
32 |
46 |
--------------------------------------------------------------------------------
/src/components/TopBar/ActionCenterToggle.svelte:
--------------------------------------------------------------------------------
1 |
32 |
33 |
34 |
35 |
36 |
37 |
38 | {#if visible}
39 |
47 | {/if}
48 |
49 |
50 | (is_theme_warning_dialog_open = false)}
53 | >
54 |
55 |
56 |
57 | Current Wallpaper Settings prevent changing theme
58 | Head over to Wallpapers app to change this setting or choose a standalone wallpaper.
59 |
60 |
61 | theme_warning_dialog.close()}>Close
62 | {
65 | theme_warning_dialog.close();
66 |
67 | apps.open.wallpapers = true;
68 | apps.active = 'wallpapers';
69 | }}
70 | >
71 | Go to Wallpapers
72 |
73 |
74 |
75 |
76 |
77 |
187 |
--------------------------------------------------------------------------------
/src/components/TopBar/Menu.svelte:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 | {#each Object.entries(menu) as Array<[any, any]> as [_, val]}
9 |
10 | {#if val.breakAfter}
11 |
12 | {/if}
13 | {/each}
14 |
15 |
16 |
91 |
--------------------------------------------------------------------------------
/src/components/TopBar/MenuBar.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 | (menubar_state.active = '')}
11 | use:focus_outside={() => (menubar_state.active = '')}
12 | >
13 | {#each Object.entries(menubar_state.menus) as [menuID, menuConfig]}
14 |
15 |
16 |
31 |
32 |
33 |
40 |
41 | {/each}
42 |
43 |
44 |
107 |
--------------------------------------------------------------------------------
/src/components/TopBar/TopBar.svelte:
--------------------------------------------------------------------------------
1 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | {#if should_show_notch.value}
18 |
19 |
20 |
21 | {/if}
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
130 |
--------------------------------------------------------------------------------
/src/components/TopBar/TopBarTime.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 | {format(time.value, 'EEE MMM dd')} {format(time.value, 'h:mm aa')}
10 |
11 |
--------------------------------------------------------------------------------
/src/components/apps/AppNexus.svelte:
--------------------------------------------------------------------------------
1 |
12 |
13 | {#if app_id === 'calendar'}
14 | {#await import('./Calendar/Calendar.svelte') then { default: Calendar }}
15 |
16 | {/await}
17 | {:else if app_id === 'vscode'}
18 | {#await import('./VSCode/VSCode.svelte') then { default: VSCode }}
19 |
20 | {/await}
21 | {:else if app_id === 'calculator'}
22 | {#await import('./Calculator/Calculator.svelte') then { default: Calculator }}
23 |
24 | {/await}
25 | {:else if app_id === 'wallpapers'}
26 | {#await import('./WallpaperApp/WallpaperSelectorApp.svelte') then { default: WallpaperSelector }}
27 |
28 | {/await}
29 | {:else if app_id === 'purus-twitter'}
30 | {#await import('./PurusProfile/PurusProfile.svelte') then { default: PurusProfile }}
31 |
32 | {/await}
33 | {:else}
34 | {#await import('./AppStore/AppStore.svelte') then { default: AppStore }}
35 |
36 | {/await}
37 | {/if}
38 |
--------------------------------------------------------------------------------
/src/components/apps/AppStore/AppStore.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 |
28 |
33 |
34 |
35 |
36 |
37 | Nothing here yet
42 |
43 |
44 |
45 |
46 |
81 |
--------------------------------------------------------------------------------
/src/components/apps/Calculator/Calculator.svelte:
--------------------------------------------------------------------------------
1 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
46 |
47 |
48 |
124 |
--------------------------------------------------------------------------------
/src/components/apps/Calendar/Calendar.svelte:
--------------------------------------------------------------------------------
1 |
24 |
25 |
26 |
27 |
28 |
29 |
45 |
46 | {#if view === 'year'}
47 |
48 | {:else if view === 'month'}
49 |
50 | {:else if view === 'week'}
51 |
52 | {:else}
53 |
54 | {/if}
55 |
56 |
57 |
58 |
150 |
--------------------------------------------------------------------------------
/src/components/apps/Calendar/MonthView.svelte:
--------------------------------------------------------------------------------
1 |
25 |
26 |
27 | {#each DAYS_OF_THE_WEEK as day, i}
28 |
{day}
29 | {/each}
30 |
31 | {#each display_days.days_in_prev_month as date (dayKey(date))}
32 |
35 | {/each}
36 |
37 | {#each display_days.days_in_this_month as date (dayKey(date))}
38 |
41 | {/each}
42 |
43 | {#each display_days.days_in_next_month as date (dayKey(date))}
44 |
47 | {/each}
48 |
49 |
50 |
146 |
--------------------------------------------------------------------------------
/src/components/apps/Calendar/calendar-constants.ts:
--------------------------------------------------------------------------------
1 | export const DAYS = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] as const;
2 | export const DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] as const;
3 | export const DAYS_OF_THE_WEEK = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] as const;
4 | export const MONTHS = [
5 | 'JAN',
6 | 'FEB',
7 | 'MAR',
8 | 'APR',
9 | 'MAY',
10 | 'JUN',
11 | 'JUL',
12 | 'AUG',
13 | 'SEP',
14 | 'OCT',
15 | 'NOV',
16 | 'DEC',
17 | ] as const;
18 | export const NUMBER_OF_CELLS_IN_CALENDAR = 42; // 6 rows x 7 columns
19 |
--------------------------------------------------------------------------------
/src/components/apps/Calendar/calendar-utils.ts:
--------------------------------------------------------------------------------
1 | import { getDay, getMonth, getYear, startOfMonth } from 'date-fns';
2 | import { DAYS, DAYS_LEAP, NUMBER_OF_CELLS_IN_CALENDAR } from './calendar-constants.ts';
3 |
4 | /**
5 | * Check if the year is a leap year
6 | * @param year
7 | */
8 | export function is_leap_year(year: number) {
9 | return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
10 | }
11 |
12 | /**
13 | * Get an array of whole number integers in the range (lower, upper]
14 | * @param lower lower bound, exclusive
15 | * @param upper upper bound, inclusive
16 | */
17 | export function get_range_array(lower: number, upper: number) {
18 | const arr: number[] = [];
19 | for (let i = lower + 1; i <= upper; i++) {
20 | arr.push(i);
21 | }
22 | return arr;
23 | }
24 |
25 | /**
26 | * Get the display days in 3 parts:
27 | * Ones belong to previous month,
28 | * Ones belong to this month, and
29 | * Ones belong to next month.
30 | * @param selectedDate the selected date which indicates the current month
31 | */
32 | export function get_display_days(selectedDate: Date) {
33 | const this_month = getMonth(selectedDate);
34 | const prev_month = this_month - 1 < 0 ? 11 : this_month - 1;
35 |
36 | const days = is_leap_year(getYear(selectedDate)) ? DAYS_LEAP : DAYS;
37 | const weekday = getDay(startOfMonth(selectedDate));
38 |
39 | // If it's Sunday, weekday is 0
40 | const days_to_show_in_prev_month = weekday === 0 ? 6 : weekday - 1;
41 | const days_to_show_in_next_month =
42 | NUMBER_OF_CELLS_IN_CALENDAR - days[this_month] - days_to_show_in_prev_month;
43 |
44 | const days_in_prev_month = get_range_array(
45 | days[prev_month] - days_to_show_in_prev_month,
46 | days[prev_month],
47 | );
48 | const days_in_this_month = get_range_array(0, days[this_month]);
49 | const days_in_next_month = get_range_array(0, days_to_show_in_next_month);
50 |
51 | return {
52 | days_in_prev_month,
53 | days_in_this_month,
54 | days_in_next_month,
55 | };
56 | }
57 |
--------------------------------------------------------------------------------
/src/components/apps/PurusProfile/PurusProfile.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
16 |
17 | About the Developer
18 |
19 |
20 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Hi, I'm Puru
42 |
43 |
44 | I'm the creator of macOS Web, which you're on right now
45 |
46 |
47 |
48 |
49 |
50 |
51 | I am a fullstack web developer, with an infinite amount of love for frontend web development,
52 | esp JavaScript, TypeScript, and for frontend frameworks like Svelte, Vue and React
53 |
54 |
55 |
56 |
57 |
58 |
59 | However, my love for tech doesn't end there. I enjoy writing backend APIs, scripts, working
60 | with databases, and my fav platforms are NodeJS, Deno and Go
61 |
62 |
63 |
64 |
65 |
225 |
--------------------------------------------------------------------------------
/src/components/apps/VSCode/VSCode.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
12 |
13 |
14 |
15 |
19 |
20 |
21 |
22 |
49 |
--------------------------------------------------------------------------------
/src/components/apps/WallpaperApp/Wallpaper.svelte:
--------------------------------------------------------------------------------
1 |
84 |
85 |
86 |
87 |
88 |
93 |
94 |
119 |
--------------------------------------------------------------------------------
/src/configs/apps/apps-config.ts:
--------------------------------------------------------------------------------
1 | import { create_app_config } from '🍎/helpers/create-app-config.ts';
2 |
3 | const wallpapers = create_app_config({
4 | title: 'Wallpapers',
5 | resizable: true,
6 |
7 | height: 600,
8 | width: 800,
9 |
10 | dock_breaks_before: true,
11 | });
12 |
13 | const calculator = create_app_config({
14 | title: 'Calculator',
15 |
16 | expandable: true,
17 | resizable: false,
18 |
19 | height: 250 * 1.414,
20 | width: 250,
21 | });
22 |
23 | const calendar = create_app_config({
24 | title: 'Calendar',
25 | resizable: true,
26 | });
27 |
28 | const vscode = create_app_config({
29 | title: 'VSCode',
30 | resizable: true,
31 |
32 | height: 600,
33 | width: 800,
34 | });
35 |
36 | const finder = create_app_config({
37 | title: 'Finder',
38 | resizable: true,
39 |
40 | // dockBreaksBefore: true,
41 | should_open_window: false,
42 | });
43 |
44 | const safari = create_app_config({
45 | title: 'Safari',
46 | resizable: true,
47 | });
48 |
49 | const systemPreferences = create_app_config({
50 | title: 'System Preferences',
51 | resizable: true,
52 | });
53 |
54 | const purusTwitter = create_app_config({
55 | title: `About the Developer`,
56 | resizable: true,
57 |
58 | dock_breaks_before: true,
59 |
60 | height: 600,
61 | width: 800,
62 | });
63 |
64 | const viewSource = create_app_config({
65 | title: `View Source`,
66 | resizable: true,
67 |
68 | should_open_window: false,
69 | external_action: () => window.open('https://github.com/puruvj/macos-web', '_blank'),
70 | });
71 |
72 | const vercel = create_app_config({
73 | title: `Powered by Vercel`,
74 | resizable: true,
75 |
76 | should_open_window: false,
77 | external_action: () =>
78 | window.open('https://vercel.com/?utm_source=purus-projects&utm_campaign=oss', '_blank'),
79 |
80 | dock_breaks_before: true,
81 | });
82 |
83 | const appstore = create_app_config({
84 | title: 'App Store',
85 | resizable: true,
86 | });
87 |
88 | export const apps_config = {
89 | finder,
90 | wallpapers,
91 | calculator,
92 | calendar,
93 | vscode,
94 | appstore,
95 | // safari,
96 |
97 | // 'system-preferences': systemPreferences,
98 |
99 | 'purus-twitter': purusTwitter,
100 | 'view-source': viewSource,
101 |
102 | vercel,
103 | };
104 |
--------------------------------------------------------------------------------
/src/configs/menu/context.menu.config.ts:
--------------------------------------------------------------------------------
1 | export const context_menu_config = {
2 | default: {
3 | 'new-folder': {
4 | title: 'New Folder',
5 | breakAfter: true,
6 | },
7 | 'get-info': {
8 | title: 'Get Info',
9 | breakAfter: false,
10 | },
11 | 'change-desktop-bg': {
12 | title: 'Change Desktop Background',
13 | breakAfter: true,
14 | },
15 | 'use-stacks': {
16 | title: 'Use Stacks',
17 | breakAfter: false,
18 | },
19 | 'sort-by': {
20 | title: 'Sort By',
21 | breakAfter: false,
22 | },
23 | 'clean-up': {
24 | title: 'Clean Up',
25 | breakAfter: false,
26 | },
27 | 'clean-up-by': {
28 | title: 'Clean Up By',
29 | breakAfter: false,
30 | },
31 | 'show-view-options': {
32 | title: 'Show View Options',
33 | breakAfter: false,
34 | },
35 | },
36 | };
37 |
--------------------------------------------------------------------------------
/src/configs/theme/colors.config.ts:
--------------------------------------------------------------------------------
1 | type SingleThemeConfig = {
2 | hsl: string;
3 | contrastHsl: string;
4 | };
5 |
6 | export const colors = {
7 | orange: {
8 | light: {
9 | hsl: '35deg, 100%, 50%',
10 | contrastHsl: '240, 3%, 11%',
11 | },
12 | dark: {
13 | hsl: '36deg, 100%, 52%',
14 | contrastHsl: '240, 3%, 11%',
15 | },
16 | },
17 |
18 | green: {
19 | light: {
20 | hsl: '135deg, 59%, 49%',
21 | contrastHsl: '135deg, 60%, 4%',
22 | },
23 | dark: {
24 | hsl: '135deg, 64%, 50%',
25 | contrastHsl: '135deg, 60%, 4%',
26 | },
27 | },
28 |
29 | cyan: {
30 | light: {
31 | hsl: '199deg, 78%, 55%',
32 | contrastHsl: '199deg, 78%, 100%',
33 | },
34 | dark: {
35 | hsl: '197deg, 100%, 70%',
36 | contrastHsl: '197deg, 100%, 5%',
37 | },
38 | },
39 |
40 | blue: {
41 | light: {
42 | hsl: '211, 100%, 50%',
43 | contrastHsl: '240, 24%, 100%',
44 | },
45 | dark: {
46 | hsl: '210, 100%, 52%',
47 | contrastHsl: '210, 92%, 5%',
48 | },
49 | },
50 |
51 | indigo: {
52 | light: {
53 | hsl: '241deg, 61%, 59%',
54 | contrastHsl: '241deg, 61%, 98%',
55 | },
56 | dark: {
57 | hsl: '241deg, 73%, 63%',
58 | contrastHsl: '241deg, 73%, 5%',
59 | },
60 | },
61 |
62 | purple: {
63 | light: {
64 | hsl: '280deg, 68%, 60%',
65 | contrastHsl: '280deg, 68%, 98%',
66 | },
67 | dark: {
68 | hsl: '280deg, 85%, 65%',
69 | contrastHsl: '280deg, 85%, 5%',
70 | },
71 | },
72 |
73 | pink: {
74 | light: {
75 | hsl: '349deg, 100%, 59%',
76 | contrastHsl: '349deg, 100%, 95%',
77 | },
78 | dark: {
79 | hsl: '348deg, 100%, 61%',
80 | contrastHsl: '348deg, 100%, 5%',
81 | },
82 | },
83 | } satisfies Record;
84 |
--------------------------------------------------------------------------------
/src/css/global.css:
--------------------------------------------------------------------------------
1 | @import './reset.css';
2 | @import './theme.css';
3 |
4 | html,
5 | body {
6 | height: 100%;
7 | }
8 |
9 | body {
10 | cursor: var(--system-cursor-default), auto;
11 |
12 | font-family: var(--system-font-family);
13 |
14 | overflow: hidden;
15 |
16 | -webkit-font-smoothing: antialiased;
17 | -moz-osx-font-smoothing: grayscale;
18 | }
19 |
20 | * {
21 | box-sizing: border-box;
22 |
23 | transition:
24 | background-color 150ms ease-in,
25 | background 150ms ease-in;
26 | }
27 |
28 | *:focus {
29 | outline: none;
30 | }
31 |
32 | *:focus-visible {
33 | outline: none;
34 |
35 | box-shadow: var(--system-focus-outline);
36 | }
37 |
38 | #root {
39 | width: 100%;
40 | height: 100%;
41 |
42 | isolation: isolate;
43 | }
44 |
45 | button {
46 | color: inherit;
47 | text-decoration: none;
48 | vertical-align: middle;
49 | font-family: inherit;
50 |
51 | border: 0;
52 | border-radius: 0;
53 |
54 | outline: 0;
55 |
56 | margin: 0;
57 | padding: 0;
58 |
59 | display: inline-flex;
60 | align-items: center;
61 | justify-content: center;
62 |
63 | position: relative;
64 |
65 | user-select: none;
66 | appearance: none;
67 | cursor: var(--system-cursor-default), auto;
68 |
69 | background-color: transparent;
70 |
71 | -webkit-tap-highlight-color: transparent;
72 | }
73 |
74 | * {
75 | cursor: var(--system-cursor-default), auto;
76 | }
77 |
78 | /* Scrollbar Stuffs */
79 | ::-webkit-scrollbar {
80 | width: 5px;
81 | }
82 |
83 | /* Track */
84 | ::-webkit-scrollbar-track {
85 | background-color: transparent;
86 | border-radius: 0.75rem;
87 | width: 5px;
88 | transition-duration: 0.4s;
89 | }
90 |
91 | /* Handle */
92 | ::-webkit-scrollbar-thumb {
93 | background-color: #888;
94 | border-radius: 0.75rem;
95 | width: 5px;
96 | transition-duration: 0.4s;
97 | }
98 |
99 | /* Handle on hover */
100 | ::-webkit-scrollbar-thumb:hover {
101 | background-color: #666;
102 | }
103 |
104 | /* Handle on clicked */
105 | ::-webkit-scrollbar-thumb:active {
106 | background-color: #444;
107 | }
108 |
--------------------------------------------------------------------------------
/src/css/reset.css:
--------------------------------------------------------------------------------
1 | html,
2 | body,
3 | div,
4 | span,
5 | applet,
6 | object,
7 | iframe,
8 | h1,
9 | h2,
10 | h3,
11 | h4,
12 | h5,
13 | h6,
14 | p,
15 | blockquote,
16 | pre,
17 | a,
18 | abbr,
19 | acronym,
20 | address,
21 | big,
22 | cite,
23 | code,
24 | del,
25 | dfn,
26 | em,
27 | img,
28 | ins,
29 | kbd,
30 | q,
31 | s,
32 | samp,
33 | small,
34 | strike,
35 | strong,
36 | sub,
37 | sup,
38 | tt,
39 | var,
40 | b,
41 | u,
42 | i,
43 | center,
44 | dl,
45 | dt,
46 | dd,
47 | ol,
48 | ul,
49 | li,
50 | fieldset,
51 | form,
52 | label,
53 | legend,
54 | table,
55 | caption,
56 | tbody,
57 | tfoot,
58 | thead,
59 | tr,
60 | th,
61 | td,
62 | article,
63 | aside,
64 | canvas,
65 | details,
66 | embed,
67 | figure,
68 | figcaption,
69 | footer,
70 | header,
71 | hgroup,
72 | menu,
73 | nav,
74 | output,
75 | ruby,
76 | section,
77 | summary,
78 | time,
79 | mark,
80 | audio,
81 | video {
82 | margin: 0;
83 | padding: 0;
84 | border: 0;
85 | font-size: 100%;
86 | font: inherit;
87 | vertical-align: baseline;
88 | }
89 | /* HTML5 display-role reset for older browsers */
90 | article,
91 | aside,
92 | details,
93 | figcaption,
94 | figure,
95 | footer,
96 | header,
97 | hgroup,
98 | menu,
99 | nav,
100 | section {
101 | display: block;
102 | }
103 | body {
104 | line-height: 1;
105 | }
106 | ol,
107 | ul {
108 | list-style: none;
109 | }
110 | blockquote,
111 | q {
112 | quotes: none;
113 | }
114 | blockquote:before,
115 | blockquote:after,
116 | q:before,
117 | q:after {
118 | content: '';
119 | content: none;
120 | }
121 | table {
122 | border-collapse: collapse;
123 | border-spacing: 0;
124 | }
125 |
--------------------------------------------------------------------------------
/src/css/theme.css:
--------------------------------------------------------------------------------
1 | body,
2 | body[data-theme='light'] {
3 | /* // Primary */
4 | --system-color-primary: hsl(211, 100%, 50%);
5 | --system-color-primary-hsl: 211, 100%, 50%;
6 | --system-color-primary-contrast: hsl(240, 24%, 100%);
7 | --system-color-primary-contrast-hsl: 240, 24%, 100%;
8 |
9 | /* // Dark */
10 | --system-color-dark: hsl(240, 3%, 11%);
11 | --system-color-dark-hsl: 240, 3%, 11%;
12 | --system-color-dark-contrast: hsl(240, 24%, 100%);
13 | --system-color-dark-contrast-hsl: 240, 24%, 100%;
14 |
15 | /* // Light */
16 | --system-color-light: hsl(240, 24%, 100%);
17 | --system-color-light-hsl: 240, 24%, 100%;
18 | --system-color-light-contrast: hsl(0, 0%, 11%);
19 | --system-color-light-contrast-hsl: 0, 0%, 11%;
20 |
21 | --system-font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Helvetica Neue', 'Helvetica',
22 | 'Arial', sans-serif;
23 |
24 | --system-focus-outline: 0 0 0 3px hsla(var(--system-color-primary-hsl), 0.5);
25 |
26 | --system-color-grey-50: #fafafa;
27 | --system-color-grey-50-hsl: 0, 0%, 98%;
28 |
29 | --system-color-grey-100: #f5f5f5;
30 | --system-color-grey-100-hsl: 0, 0%, 96%;
31 |
32 | --system-color-grey-200: #eeeeee;
33 | --system-color-grey-200-hsl: 0, 0%, 93%;
34 |
35 | --system-color-grey-300: #e0e0e0;
36 | --system-color-grey-300-hsl: 0, 0%, 88%;
37 |
38 | --system-color-grey-400: #bdbdbd;
39 | --system-color-grey-400-hsl: 0, 0%, 74%;
40 |
41 | --system-color-grey-500: #9e9e9e;
42 | --system-color-grey-500-hsl: 0, 0%, 62%;
43 |
44 | --system-color-grey-600: #757575;
45 | --system-color-grey-600-hsl: 0, 0%, 46%;
46 |
47 | --system-color-grey-700: #616161;
48 | --system-color-grey-700-hsl: 0, 0%, 38%;
49 |
50 | --system-color-grey-800: #424242;
51 | --system-color-grey-800-hsl: 0, 0%, 26%;
52 |
53 | --system-color-grey-900: #212121;
54 | --system-color-grey-900-hsl: 0, 0%, 13%;
55 |
56 | --system-color-grey-A100: #d5d5d5;
57 | --system-color-grey-A100-hsl: 0, 0%, 84%;
58 |
59 | --system-color-grey-A200: #aaa;
60 | --system-color-grey-A200-hsl: 0, 0%, 67%;
61 |
62 | --system-color-grey-A400: #303030;
63 | --system-color-grey-A400-hsl: 0, 0%, 19%;
64 |
65 | --system-color-grey-A700: #616161;
66 | --system-color-grey-A700-hsl: 0, 0%, 38%;
67 |
68 | /* // Cursors */
69 | --system-cursor-default: url('/cursors/normal-select.svg');
70 | --system-cursor-pointer: url('/cursors/link-select.svg');
71 | --system-cursor-text-select: url('/cursors/text-select.svg');
72 | --system-cursor-help-select: url('/cursors/help-select.svg');
73 |
74 | /* // the following two cursors are animated, but will be rendered as a static
75 | // image by the browser */
76 | --system-cursor-busy: url('/cursors/busy.webp');
77 | --system-cursor-working-in-bg: url('/cursors/working-in-background.webp');
78 | }
79 |
80 | body.dark {
81 | /* // Primary */
82 | --system-color-primary: #0a85ff;
83 | --system-color-primary-hsl: 210, 100%, 52%;
84 | --system-color-primary-contrast: hsl(210, 92%, 5%);
85 | --system-color-primary-contrast-hsl: 210, 92%, 5%;
86 |
87 | /* // Dark */
88 | --system-color-dark: hsl(240, 24%, 100%);
89 | --system-color-dark-hsl: 240, 24%, 100%;
90 | --system-color-dark-contrast: hsl(0, 0%, 11%);
91 | --system-color-dark-contrast-hsl: 0, 0%, 11%;
92 |
93 | /* // Light */
94 | --system-color-light: hsl(240, 3%, 11%);
95 | --system-color-light-hsl: 240, 3%, 11%;
96 | --system-color-light-contrast: hsl(240, 24%, 100%);
97 | --system-color-light-contrast-hsl: 240, 24%, 100%;
98 | }
99 |
--------------------------------------------------------------------------------
/src/global.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 | ///
4 | ///
5 | ///
6 |
7 | type ObjectKeys = Obj extends object
8 | ? (keyof Obj)[]
9 | : Obj extends number
10 | ? []
11 | : Obj extends Array | string
12 | ? string[]
13 | : never;
14 |
15 | interface ObjectConstructor {
16 | keys(o: ObjectType): ObjectKeys;
17 | entries(o: ObjType): [Unpacked>, ObjType[keyof ObjType]][];
18 | }
19 |
20 | interface Storage {
21 | getItem(key: string): T | null;
22 | }
23 |
24 | type Unpacked = ArrayLike extends (infer RootType)[] ? RootType : ArrayLike;
25 |
26 | type Unpromisify =
27 | PromiseLike extends Promise ? RootType : PromiseLike;
28 |
29 | interface Array {
30 | fill(value: T, start?: number | undefined, end?: number | undefined): T[];
31 | }
32 |
--------------------------------------------------------------------------------
/src/helpers/create-app-config.ts:
--------------------------------------------------------------------------------
1 | export type AppConfig = {
2 | title: string;
3 |
4 | resizable?: boolean;
5 | expandable?: boolean;
6 | height?: string | number;
7 | width?: string | number;
8 |
9 | should_open_window?: boolean;
10 |
11 | /** The action to do when dock button is clicked */
12 | external_action?: (e: unknown) => void;
13 |
14 | /** Break before this app */
15 | dock_breaks_before?: boolean;
16 | };
17 |
18 | export const create_app_config = (et: AppConfig) =>
19 | ({
20 | should_open_window: true,
21 | dock_breaks_before: false,
22 |
23 | resizable: true,
24 | expandable: false,
25 |
26 | width: 600,
27 | height: 500,
28 | ...et,
29 | }) satisfies AppConfig;
30 |
--------------------------------------------------------------------------------
/src/helpers/create-menu-config.ts:
--------------------------------------------------------------------------------
1 | const apple_menu = {
2 | title: 'apple',
3 | menu: {
4 | 'about-this-mac': {
5 | title: 'About This Mac',
6 | breakAfter: true,
7 | },
8 | 'system-preferences': {
9 | title: 'System Preferences...',
10 | },
11 | 'app-store': {
12 | title: 'App Store...',
13 | breakAfter: true,
14 | },
15 | 'recent-items': {
16 | title: 'Recent Items',
17 | breakAfter: true,
18 | },
19 | 'force-quit': {
20 | title: 'Force Quit...',
21 | breakAfter: true,
22 | },
23 | sleep: {
24 | title: 'Sleep',
25 | },
26 | restart: {
27 | title: 'Restart...',
28 | },
29 | shutdown: {
30 | title: 'Shut Down...',
31 | breakAfter: true,
32 | },
33 | 'lock-screen': {
34 | title: 'Lock Screen',
35 | },
36 | logout: {
37 | title: 'Log Out User...',
38 | },
39 | },
40 | };
41 |
42 | export const create_menu_config = (et: T) => ({ apple: apple_menu, ...et });
43 |
--------------------------------------------------------------------------------
/src/helpers/fade.ts:
--------------------------------------------------------------------------------
1 | import { sineIn, sineOut } from 'svelte/easing';
2 |
3 | export function fade_in(
4 | node: HTMLElement,
5 | { duration = 150, delay = duration }: SvelteTransitionConfig = {},
6 | ): SvelteTransitionReturnType {
7 | const o = +getComputedStyle(node).opacity;
8 |
9 | return {
10 | duration: duration,
11 | delay,
12 | easing: sineIn,
13 | css: (t) => `opacity: ${t * o}`,
14 | };
15 | }
16 |
17 | export function fade_out(
18 | node: HTMLElement,
19 | { duration = 150 }: SvelteTransitionConfig = {},
20 | ): SvelteTransitionReturnType {
21 | const o = +getComputedStyle(node).opacity;
22 |
23 | return {
24 | duration,
25 | easing: sineOut,
26 | css: (t) => `opacity: ${t * o}`,
27 | };
28 | }
29 |
--------------------------------------------------------------------------------
/src/helpers/random.ts:
--------------------------------------------------------------------------------
1 | export function rand_int(lower: number, upper: number) {
2 | if (lower > upper) [lower, upper] = [upper, lower];
3 |
4 | return lower + Math.floor((upper - lower) * Math.random());
5 | }
6 |
--------------------------------------------------------------------------------
/src/helpers/sleep.ts:
--------------------------------------------------------------------------------
1 | export const sleep = (time: number) => new Promise((res) => setTimeout(res, time));
2 |
--------------------------------------------------------------------------------
/src/helpers/smaller-closest-value.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * Find the closest smaller number in an array
3 | * @param arr Ascendingly sorted array
4 | * @param value Value to check against
5 | */
6 | export function smaller_closest_value(arr: number[], value: number) {
7 | let prevVal = arr[0];
8 |
9 | for (const val of arr) {
10 | if (val > value) return prevVal;
11 | if (val == value) return val;
12 | prevVal = val;
13 | }
14 |
15 | return arr[arr.length - 1];
16 | }
17 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import { mount } from 'svelte';
2 | import Desktop from './components/Desktop/Desktop.svelte';
3 | import './css/global.css';
4 |
5 | const desktop = mount(Desktop, {
6 | target: document.getElementById('root'),
7 | });
8 |
9 | export default desktop;
10 |
--------------------------------------------------------------------------------
/src/state/apps.svelte.ts:
--------------------------------------------------------------------------------
1 | import type { apps_config } from '🍎/configs/apps/apps-config';
2 |
3 | export type AppID = keyof typeof apps_config;
4 |
5 | export const apps = $state({
6 | open: {
7 | wallpapers: false,
8 | finder: true,
9 | vscode: false,
10 | calculator: false,
11 | // safari: false,
12 | appstore: false,
13 | calendar: false,
14 | // 'system-preferences': false,
15 |
16 | 'purus-twitter': false,
17 | 'view-source': true,
18 |
19 | vercel: true,
20 | } as Record,
21 |
22 | active: 'finder' satisfies AppID,
23 |
24 | /**
25 | * Maximum zIndex for the active app
26 | * Initialize with -2, so that it becomes 0 when initialised
27 | */
28 | active_z_index: -2,
29 |
30 | z_indices: {
31 | wallpapers: 0,
32 | finder: 0,
33 | vscode: 0,
34 | calculator: 0,
35 | // safari: 0,
36 | appstore: 0,
37 | calendar: 0,
38 | // 'system-preferences': 0,
39 |
40 | 'purus-twitter': 0,
41 | 'view-source': 0,
42 |
43 | vercel: 0,
44 | } as Record,
45 |
46 | is_being_dragged: false as boolean,
47 |
48 | fullscreen: {
49 | wallpapers: false,
50 | finder: false,
51 | vscode: false,
52 | calculator: false,
53 | // safari: false,
54 | appstore: false,
55 | calendar: false,
56 | // 'system-preferences': false,
57 |
58 | 'purus-twitter': false,
59 | 'view-source': false,
60 |
61 | vercel: false,
62 | } as Record,
63 | });
64 |
--------------------------------------------------------------------------------
/src/state/auto-destroy-effect-root.svelte.ts:
--------------------------------------------------------------------------------
1 | import { onDestroy } from 'svelte';
2 |
3 | /**
4 | * Behaves the same as `$effect.root`, but automatically
5 | * cleans up the effect inside Svelte components.
6 | *
7 | * @returns Cleanup function to manually cleanup the effect.
8 | */
9 | export function auto_destroy_effect_root(fn: () => void | VoidFunction) {
10 | let cleanup: VoidFunction | null = $effect.root(fn);
11 |
12 | function destroy() {
13 | if (cleanup === null) {
14 | return;
15 | }
16 |
17 | cleanup();
18 | cleanup = null;
19 | }
20 |
21 | try {
22 | onDestroy(destroy);
23 | } catch {
24 | // Ignore the error. The user is responsible for manually
25 | // cleaning up effects created outside Svelte components.
26 | }
27 |
28 | return destroy;
29 | }
30 |
--------------------------------------------------------------------------------
/src/state/dock.svelte.ts:
--------------------------------------------------------------------------------
1 | export const is_dock_hidden = $state({ value: false as boolean });
2 |
--------------------------------------------------------------------------------
/src/state/interval.svelte.ts:
--------------------------------------------------------------------------------
1 | import { untrack } from 'svelte';
2 | import { auto_destroy_effect_root } from './auto-destroy-effect-root.svelte.ts';
3 |
4 | export function create_interval(duration: number) {
5 | let time = $state(Date.now());
6 |
7 | auto_destroy_effect_root(() => {
8 | $effect(() => {
9 | const interval = setInterval(() => {
10 | untrack(() => (time = Date.now()));
11 | }, duration);
12 |
13 | return () => {
14 | clearInterval(interval);
15 | };
16 | });
17 | });
18 |
19 | return {
20 | get value() {
21 | return time;
22 | },
23 | };
24 | }
25 |
--------------------------------------------------------------------------------
/src/state/menubar.svelte.ts:
--------------------------------------------------------------------------------
1 | import { persisted } from './persisted.svelte.ts';
2 | import { finder_menu_config } from '🍎/configs/menu/finder.menu.config';
3 |
4 | const menu_configs = { finder: finder_menu_config };
5 |
6 | export const should_show_notch = persisted('macos:setting:should-show-notch', false as boolean);
7 |
8 | export const menubar_state = $state({
9 | menus: menu_configs.finder,
10 | active: '' as string,
11 | });
12 |
--------------------------------------------------------------------------------
/src/state/persisted.svelte.ts:
--------------------------------------------------------------------------------
1 | import { auto_destroy_effect_root } from './auto-destroy-effect-root.svelte.ts';
2 |
3 | type Primitive = string | null | symbol | boolean | number | undefined | bigint;
4 |
5 | const is_primitive = (val: any): val is Primitive => {
6 | return val !== Object(val) || val === null;
7 | };
8 |
9 | export function persisted(key: string, initial: T) {
10 | const existing = localStorage.getItem(key);
11 |
12 | const primitive = is_primitive(initial);
13 | const parsed_value = existing ? JSON.parse(existing) : initial;
14 |
15 | let state = $state(
16 | primitive ? { value: parsed_value } : parsed_value,
17 | );
18 |
19 | auto_destroy_effect_root(() => {
20 | $effect(() => {
21 | // @ts-ignore
22 | localStorage.setItem(key, JSON.stringify(primitive ? state.value : state));
23 | });
24 | });
25 |
26 | return state;
27 | }
28 |
--------------------------------------------------------------------------------
/src/state/preferences.svelte.ts:
--------------------------------------------------------------------------------
1 | import { colors } from '🍎/configs/theme/colors.config.ts';
2 | import type { WallpaperID } from '🍎/configs/wallpapers/wallpaper.config.ts';
3 | import { persisted } from './persisted.svelte.ts';
4 |
5 | export type WallpaperSettings = {
6 | id: WallpaperID;
7 | image: string;
8 | canControlTheme: boolean;
9 | };
10 |
11 | export type Theme = {
12 | scheme: 'light' | 'dark';
13 | primaryColor: keyof typeof colors;
14 | };
15 |
16 | export const preferences = persisted('macos:preferences', {
17 | reduced_motion: matchMedia('(prefers-reduced-motion)').matches,
18 | theme: {
19 | scheme: matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light',
20 | primaryColor: 'blue',
21 | } as Theme,
22 | wallpaper: {
23 | image: 'ventura-2',
24 | id: 'ventura',
25 | canControlTheme: true,
26 | } as WallpaperSettings,
27 | });
28 |
29 | $effect.root(() => {
30 | $effect(() => {
31 | // Color scheme
32 | const { classList } = document.body;
33 | classList.remove('light', 'dark');
34 | classList.add(preferences.theme.scheme);
35 |
36 | // Primary color
37 | const colorObj = colors[preferences.theme.primaryColor][preferences.theme.scheme];
38 | document.body.style.setProperty('--system-color-primary', `hsl(${colorObj.hsl})`);
39 | document.body.style.setProperty('--system-color-primary-hsl', `${colorObj.hsl}`);
40 | document.body.style.setProperty(
41 | '--system-color-primary-contrast',
42 | `hsl(${colorObj.contrastHsl})`,
43 | );
44 | document.body.style.setProperty(
45 | '--system-color-primary-contrast-hsl',
46 | `${colorObj.contrastHsl}`,
47 | );
48 | });
49 | });
50 |
--------------------------------------------------------------------------------
/src/state/spring.svelte.ts:
--------------------------------------------------------------------------------
1 | export function spring(value: number, { stiffness = 0.15, damping = 0.8, precision = 0.01 }) {
2 | let inner_value = $state(value);
3 |
4 | let last_time: number;
5 |
6 | let last_value = value;
7 | let current_value = value;
8 | let target_value = value;
9 |
10 | let running = false;
11 |
12 | function set(newValue: number) {
13 | target_value = newValue;
14 | if (!running) {
15 | running = true;
16 | last_time = performance.now();
17 | requestAnimationFrame(loop);
18 | }
19 | }
20 |
21 | function loop() {
22 | const current_time = performance.now();
23 | const delta_time = Math.min(current_time - last_time, 42) * 0.06;
24 |
25 | const delta = target_value - current_value;
26 | const velocity = (current_value - last_value) / delta_time;
27 | const spring = stiffness * delta;
28 | const damper = damping * velocity;
29 | const acceleration = spring - damper;
30 | const d = (velocity + acceleration) * delta_time;
31 |
32 | last_value = current_value;
33 |
34 | if (Math.abs(d) < precision && Math.abs(delta) < precision) {
35 | inner_value = current_value = target_value;
36 | running = false;
37 | } else {
38 | inner_value = current_value = current_value + d;
39 | last_time = current_time;
40 | requestAnimationFrame(loop);
41 | }
42 | }
43 |
44 | return {
45 | get value() {
46 | return inner_value;
47 | },
48 | set value(newValue: number) {
49 | set(newValue);
50 | },
51 | };
52 | }
53 |
--------------------------------------------------------------------------------
/src/state/system.svelte.ts:
--------------------------------------------------------------------------------
1 | export const system_needs_update = $state({
2 | value: false as boolean,
3 | });
4 |
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
2 |
3 | export default {
4 | preprocess: vitePreprocess({
5 | replace: [['__DATE__', new Date().toISOString()]],
6 | }),
7 | compilerOptions: {
8 | cssHash: ({ hash, css }) => `s-${hash(css)}`,
9 | },
10 | };
11 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "moduleResolution": "Bundler",
4 | "allowImportingTsExtensions": true,
5 | "verbatimModuleSyntax": true,
6 |
7 | /**
8 | To have warnings/errors of the Svelte compiler at the correct position,
9 | enable source maps by default.
10 | */
11 | "sourceMap": true,
12 | "lib": ["ESNext", "DOM"],
13 | "strict": false,
14 | "esModuleInterop": true,
15 | "noEmit": true,
16 | "skipLibCheck": true,
17 | "forceConsistentCasingInFileNames": true,
18 | "target": "esnext",
19 | "module": "esnext",
20 | "resolveJsonModule": true,
21 | // "baseUrl": "./src",
22 | "paths": {
23 | "🍎/*": ["./src/*"]
24 | },
25 | "types": ["vite-plugin-pwa/client"],
26 | /**
27 | * Typecheck JS in `.svelte` and `.js` files by default.
28 | * Disable checkJs if you'd like to use dynamic types in JS.
29 | * Note that setting allowJs false does not prevent the use
30 | * of JS in `.svelte` files.
31 | */
32 | "allowJs": true,
33 | "checkJs": true
34 | },
35 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte", "./*.ts"],
36 | "exclude": ["node_modules/**/*"]
37 | }
38 |
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "headers": [
3 | {
4 | "source": "/(.*)\\.webp",
5 | "headers": [
6 | {
7 | "key": "Cache-Control",
8 | "value": "public, max-age=31536000, immutable"
9 | },
10 | {
11 | "key": "CDN-Cache-Control",
12 | "value": "public, max-age=31536000, immutable"
13 | },
14 | {
15 | "key": "Vercel-CDN-Cache-Control",
16 | "value": "public, max-age=31536000, immutable"
17 | }
18 | ]
19 | }
20 | ]
21 | }
22 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { svelte } from '@sveltejs/vite-plugin-svelte';
2 | import UnpluginIcons from 'unplugin-icons/vite';
3 | import { defineConfig } from 'vite';
4 | import { imagetools } from 'vite-imagetools';
5 | import { VitePWA } from 'vite-plugin-pwa';
6 | import { browserslistToTargets } from 'lightningcss';
7 | import browserslist from 'browserslist';
8 |
9 | import { prefetch } from './prefetch-plugin';
10 |
11 | export default defineConfig({
12 | plugins: [
13 | svelte(),
14 | prefetch(),
15 |
16 | UnpluginIcons({ autoInstall: true, compiler: 'svelte' }),
17 | VitePWA({
18 | includeAssets: [
19 | 'robots.txt',
20 | 'app-icons/finder/32.png',
21 | 'cover-image.png',
22 | 'cursors/(normal|link|text|help)-select.svg',
23 | '**/*.mp3',
24 | ],
25 | manifest: {
26 | name: 'Mac OS Monterey Svelte Web',
27 | short_name: 'macOS Svelte',
28 | theme_color: '#ffffff',
29 | description: 'Mac OS Monterey Web written in Svelte',
30 | icons: [
31 | {
32 | src: 'app-icons/finder/128.png',
33 | sizes: '128x128',
34 | type: 'image/png',
35 | },
36 | {
37 | src: 'app-icons/finder/192.png',
38 | sizes: '192x192',
39 | type: 'image/png',
40 | },
41 | {
42 | src: 'app-icons/finder/256.png',
43 | sizes: '256x256',
44 | type: 'image/png',
45 | },
46 | {
47 | src: 'app-icons/finder/512.png',
48 | sizes: '512x512',
49 | type: 'image/png',
50 | },
51 | {
52 | src: 'app-icons/finder/512.png',
53 | sizes: '512x512',
54 | type: 'image/png',
55 | purpose: 'any maskable',
56 | },
57 | ],
58 | },
59 | }),
60 | imagetools({}),
61 | ],
62 | resolve: {
63 | alias: {
64 | '🍎': new URL('./src/', import.meta.url).pathname,
65 | },
66 | },
67 | build: {
68 | minify: 'terser',
69 | cssMinify: 'lightningcss',
70 | },
71 | css: {
72 | transformer: 'lightningcss',
73 | lightningcss: {
74 | targets: browserslistToTargets(browserslist('defaults, not IE 11, not IE_Mob 11, not dead')),
75 | },
76 | },
77 | });
78 |
--------------------------------------------------------------------------------