├── .gitattributes ├── .github ├── FUNDING.yml └── ISSUE_TEMPLATE │ └── bug_report.md ├── .gitignore ├── .nojekyll ├── .vscode └── settings.json ├── 404.html ├── CNAME ├── LICENSE ├── README.md ├── _next └── static │ ├── EBWpOtaxXM8io_3YiVJcZ │ ├── _buildManifest.js │ └── _ssgManifest.js │ ├── chunks │ ├── 269-d3f19ef322895985.js │ ├── b637e9a5-6cf11adc33c7fdd4.js │ ├── framework-114634acb84f8baa.js │ ├── main-dc1c692d63c50e17.js │ ├── pages │ │ ├── _app-5258482dbf006fab.js │ │ ├── _error-8353112a01355ec2.js │ │ └── index-79d56e747f76610b.js │ ├── polyfills-c67a75d1b6f99dc8.js │ └── webpack-b8f8d6679aaa5f42.js │ └── css │ └── 3ce79fb0ca773c83.css ├── apps.config.js ├── components ├── SEO │ └── Meta.js ├── apps │ ├── calc.js │ ├── chrome.js │ ├── dawidolko.js │ ├── gedit.js │ ├── settings.js │ ├── spotify.js │ ├── terminal.js │ ├── todoist.js │ ├── trash.js │ └── vscode.js ├── base │ ├── side_bar_app.js │ ├── ubuntu_app.js │ └── window.js ├── context menus │ ├── default.js │ └── desktop-menu.js ├── screen │ ├── all-applications.js │ ├── booting_screen.js │ ├── desktop.js │ ├── lock_screen.js │ ├── navbar.js │ └── side_bar.js ├── ubuntu.js └── util components │ ├── background-image.js │ ├── clock.js │ ├── small_arrow.js │ ├── status.js │ └── status_card.js ├── files └── cv_ver1.pdf ├── images ├── logos │ ├── bitmoji.JPG │ ├── bitmoji.png │ ├── fevicon.png │ ├── fevicon.svg │ ├── logo.png │ ├── logo_1024.png │ ├── logo_1200.png │ └── search.png ├── memes │ └── used-sudo-command.webp └── wallpapers │ ├── wall-1.webp │ ├── wall-2.webp │ ├── wall-3.webp │ ├── wall-4.webp │ ├── wall-5.webp │ ├── wall-6.webp │ ├── wall-7.webp │ └── wall-8.webp ├── index.html ├── package.json ├── pages ├── _app.js ├── _document.js └── index.js ├── postcss.config.js ├── public ├── files │ └── cv_ver1.pdf ├── images │ ├── logos │ │ ├── bitmoji.JPG │ │ ├── fevicon.png │ │ ├── fevicon.svg │ │ ├── logo.png │ │ ├── logo_1024.png │ │ ├── logo_1200.png │ │ └── search.png │ ├── memes │ │ └── used-sudo-command.webp │ └── wallpapers │ │ ├── wall-1.webp │ │ ├── wall-2.webp │ │ ├── wall-3.webp │ │ ├── wall-4.webp │ │ ├── wall-5.webp │ │ ├── wall-6.webp │ │ ├── wall-7.webp │ │ └── wall-8.webp ├── robots.txt └── themes │ ├── Yaru │ ├── apps │ │ ├── bash.png │ │ ├── calc.png │ │ ├── chrome.png │ │ ├── gedit.png │ │ ├── gnome-control-center.png │ │ ├── spotify.png │ │ ├── todoist.png │ │ └── vscode.png │ ├── status │ │ ├── about.svg │ │ ├── audio-headphones-symbolic.svg │ │ ├── audio-volume-medium-symbolic.svg │ │ ├── battery-good-symbolic.svg │ │ ├── bluetooth-symbolic.svg │ │ ├── changes-prevent-symbolic.svg │ │ ├── chrome_home.svg │ │ ├── chrome_refresh.svg │ │ ├── cof_orange_hex.svg │ │ ├── contact.svg │ │ ├── display-brightness-symbolic.svg │ │ ├── download.svg │ │ ├── education.svg │ │ ├── emblem-system-symbolic.svg │ │ ├── experience.svg │ │ ├── network-wireless-signal-good-symbolic.svg │ │ ├── power-button.svg │ │ ├── process-working-symbolic.svg │ │ ├── projects.svg │ │ ├── skills.svg │ │ ├── system-shutdown-symbolic.svg │ │ ├── ubuntu_white_hex.svg │ │ └── user-trash-symbolic.svg │ ├── system │ │ ├── folder.png │ │ ├── user-desktop.png │ │ ├── user-home.png │ │ ├── user-trash-full.png │ │ └── view-app-grid-symbolic.svg │ └── window │ │ ├── window-close-symbolic.svg │ │ ├── window-maximize-symbolic.svg │ │ ├── window-minimize-symbolic.svg │ │ └── window-restore-symbolic.svg │ └── filetypes │ ├── js.png │ ├── php.png │ └── zip.png ├── robots.txt ├── styles └── index.css ├── tailwind.config.js ├── themes ├── Yaru │ ├── apps │ │ ├── bash.png │ │ ├── calc.png │ │ ├── chrome.png │ │ ├── gedit.png │ │ ├── gnome-control-center.png │ │ ├── spotify.png │ │ ├── todoist.png │ │ └── vscode.png │ ├── status │ │ ├── about.svg │ │ ├── audio-headphones-symbolic.svg │ │ ├── audio-volume-medium-symbolic.svg │ │ ├── battery-good-symbolic.svg │ │ ├── bluetooth-symbolic.svg │ │ ├── changes-prevent-symbolic.svg │ │ ├── chrome_home.svg │ │ ├── chrome_refresh.svg │ │ ├── cof_orange_hex.svg │ │ ├── contact.svg │ │ ├── display-brightness-symbolic.svg │ │ ├── download.svg │ │ ├── education.svg │ │ ├── emblem-system-symbolic.svg │ │ ├── experience.svg │ │ ├── network-wireless-signal-good-symbolic.svg │ │ ├── power-button.svg │ │ ├── process-working-symbolic.svg │ │ ├── projects.svg │ │ ├── skills.svg │ │ ├── system-shutdown-symbolic.svg │ │ ├── ubuntu_white_hex.svg │ │ └── user-trash-symbolic.svg │ ├── system │ │ ├── folder.png │ │ ├── user-desktop.png │ │ ├── user-home.png │ │ ├── user-trash-full.png │ │ └── view-app-grid-symbolic.svg │ └── window │ │ ├── window-close-symbolic.svg │ │ ├── window-maximize-symbolic.svg │ │ ├── window-minimize-symbolic.svg │ │ └── window-restore-symbolic.svg └── filetypes │ ├── js.png │ ├── php.png │ └── zip.png └── yarn.lock /.gitattributes: -------------------------------------------------------------------------------- 1 | *.css linguist-detectable=false 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [dawidolko] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env 29 | .env.local 30 | .env.development.local 31 | .env.test.local 32 | .env.production.local 33 | 34 | # vercel 35 | .vercel -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/.nojekyll -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "conventionalCommits.scopes": [ 3 | "StatusCard" 4 | ] 5 | } -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 404: This page could not be found

404

This page could not be found.

-------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | ubuntu.dawidolko.pl 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 dawidolko 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 | # 🟠 ubuntu.dawidolko.pl 2 | _A Next.js + Tailwind CSS portfolio that re-creates the Ubuntu 20.04 desktop inside your browser_ 3 | 4 | [![Build](https://img.shields.io/github/actions/workflow/status/dawidolko/Simulaing-Ubuntu-System-GUI/Build.yml?label=build&logo=github)](https://github.com/dawidolko/Simulaing-Ubuntu-System-GUI/actions) 5 | [![Website Status](https://img.shields.io/website?down_color=red&down_message=offline&up_message=online&url=https%3A%2F%2Fubuntu.dawidolko.pl)](https://ubuntu.dawidolko.pl) 6 | [![Stars](https://img.shields.io/github/stars/dawidolko/Simulaing-Ubuntu-System-GUI?style=social)](https://github.com/dawidolko/Simulaing-Ubuntu-System-GUI/stargazers) 7 | 8 | > **Live Demo:** 9 | 10 | --- 11 | 12 | ## 📑 Table of Contents 13 | 1. [About](#about) 14 | 2. [Project Structure](#project-structure) 15 | 3. [Star History](#star-history) 16 | 4. [Getting Started](#getting-started) 17 | 5. [Customization Guide](#customization-guide) 18 | 6. [Scripts & Commands](#scripts--commands) 19 | 7. [Contributing](#contributing) 20 | 8. [License & Author](#license--author) 21 | 22 | --- 23 | 24 | ## About 25 | `ubuntu.dawidolko.pl` is an **open-source, desktop-themed portfolio** that mimics Ubuntu 20.04’s GNOME shell: a dock, draggable windows, themed apps and a dark-orange palette. 26 | It’s built with **Next.js** (React), **Tailwind CSS**, and ships as a fully static site—perfect for free hosting on GitHub Pages. 🦄🖥️ 27 | 28 | Key features: 29 | 30 | - ✅ **Next.js** for server-side rendering & static export 31 | - 🎨 **Tailwind CSS** for utility-first styling 32 | - ✉️ **EmailJS**-powered contact form (no backend needed) 33 | - ⚙️ **Config-driven apps** defined in `apps.config.js` 34 | - 📱 Responsive and PWA-ready 35 | 36 | --- 37 | 38 | ## Project Structure 39 | ```text 40 | . 41 | ├── .next/ # Next.js build output 42 | ├── .github/ # Actions & issue templates 43 | ├── .vscode/ # Dev-container & tasks 44 | ├── components/ # Re-usable React components 45 | ├── files/ # Static sample documents 46 | ├── images/ # Icons & wallpapers 47 | ├── pages/ # Next.js pages & API routes 48 | ├── public/ # Public assets served at / 49 | ├── styles/ # Global Tailwind styles 50 | ├── themes/ # Theme tokens / CSS vars 51 | ├── apps.config.js # Dock & window definitions 52 | ├── tailwind.config.js # Tailwind setup 53 | ├── package.json # NPM metadata & scripts 54 | ├── README.md # You are here! 55 | └── yarn.lock | package-lock.json 56 | ```` 57 | 58 | --- 59 | 60 | ## Star History 61 | 62 | [![Star History Chart](https://api.star-history.com/svg?repos=dawidolko/Simulaing-Ubuntu-System-GUI\&type=Date)](https://star-history.com/#dawidolko/Simulaing-Ubuntu-System-GUI&Date) 63 | 64 | --- 65 | 66 | ## Getting Started 67 | 68 | > Requires **Node 18 +** and **npm** (or **yarn / pnpm**). 69 | 70 | ```bash 71 | # 1 – Clone the repo 72 | git clone https://github.com/dawidolko/Ubuntu-Simulaing-System-GUI 73 | cd Ubuntu-Simulaing-System-GUI 74 | 75 | # 2 – Install dependencies 76 | npm install # or yarn / pnpm 77 | 78 | # 3 – Run the dev server 79 | npm start # opens http://localhost:3000 80 | ``` 81 | 82 | ### Production build 83 | 84 | ```bash 85 | npm run build # generates an optimised /.next bundle 86 | npm run export # exports static HTML to /out for GitHub Pages 87 | ``` 88 | 89 | --- 90 | 91 | ## Customization Guide 92 | 93 | | What you want to change | File(s) to edit | 94 | | ----------------------- | ----------------------------------------------------------------------------------- | 95 | | **Apps & dock icons** | `apps.config.js` | 96 | | **Theme colours** | `themes/ubuntu.css` or Tailwind config | 97 | | **Contact-form keys** | `.env` → `NEXT_PUBLIC_USER_ID`, `NEXT_PUBLIC_SERVICE_ID`, `NEXT_PUBLIC_TEMPLATE_ID` | 98 | | **Portfolio texts** | Components in `pages/` and `components/` | 99 | | **Favicons / logos** | Replace images in `public/` | 100 | 101 | > **EmailJS setup** 102 | > 103 | > 1. Create an account at [https://emailjs.com](https://emailjs.com) 104 | > 2. Add a Gmail / Outlook service → grab **Service ID** 105 | > 3. Create a template → grab **Template ID** 106 | > 4. In your EmailJS dashboard copy **User ID** 107 | > 5. Add them to a `.env` at the project root: 108 | > 109 | > ```dotenv 110 | > NEXT_PUBLIC_USER_ID=xxxxxxxx 111 | > NEXT_PUBLIC_SERVICE_ID=xxxxxxxx 112 | > NEXT_PUBLIC_TEMPLATE_ID=template_fqqqb9g 113 | > ``` 114 | 115 | --- 116 | 117 | ## Scripts & Commands 118 | 119 | | Command | What it does | 120 | | ---------------- | ---------------------------------------------------- | 121 | | `npm start` | Runs **Next.js** in development mode with hot-reload | 122 | | `npm run build` | Creates an optimised production build | 123 | | `npm run export` | Converts the site into static HTML in `/out` | 124 | | `npm run lint` | Runs ESLint on source files | 125 | | `npm run format` | Formats code with Prettier | 126 | 127 | > If you prefer **yarn** simply replace `npm` with `yarn`. 128 | 129 | --- 130 | 131 | ## Contributing 132 | 133 | All kinds of contributions are **warmly welcome**: 134 | 135 | 1. **Fork** → `git clone` 136 | 2. `git checkout -b feat/amazing-feature` 137 | 3. Code, test, `npm run lint` 138 | 4. `git commit -m "Add amazing feature"` 139 | 5. `git push origin feat/amazing-feature` 140 | 6. Open a **Pull Request** 🚀 141 | 142 | Please attach screenshots or GIFs when altering the UI. 143 | 144 | --- 145 | 146 | ## License & Author 147 | 148 | * **License:** MIT – free to use, tweak, and share 🔓 149 | * **Author:** **Dawid Olko** 150 | 151 | * Portfolio [https://dawidolko.pl](https://dawidolko.pl) 152 | * GitHub [https://github.com/dawidolko](https://github.com/dawidolko) 153 | * LinkedIn [https://www.linkedin.com/in/dawidolko/](https://www.linkedin.com/in/dawidolko/) 154 | 155 | > Crafted with ☕, 🎧 and a dash of open-source spirit in honour of Ubuntu’s friendly orange glow. 156 | -------------------------------------------------------------------------------- /_next/static/EBWpOtaxXM8io_3YiVJcZ/_buildManifest.js: -------------------------------------------------------------------------------- 1 | (self.__BUILD_MANIFEST = { 2 | __rewrites: { beforeFiles: [], afterFiles: [], fallback: [] }, 3 | "/": [ 4 | "static/chunks/b637e9a5-6cf11adc33c7fdd4.js", 5 | "static/chunks/269-d3f19ef322895985.js", 6 | "static/chunks/pages/index-79d56e747f76610b.js", 7 | ], 8 | "/_error": ["static/chunks/pages/_error-8353112a01355ec2.js"], 9 | sortedPages: ["/", "/_app", "/_error"], 10 | }), 11 | self.__BUILD_MANIFEST_CB && self.__BUILD_MANIFEST_CB(); 12 | -------------------------------------------------------------------------------- /_next/static/EBWpOtaxXM8io_3YiVJcZ/_ssgManifest.js: -------------------------------------------------------------------------------- 1 | (self.__SSG_MANIFEST = new Set()), 2 | self.__SSG_MANIFEST_CB && self.__SSG_MANIFEST_CB(); 3 | -------------------------------------------------------------------------------- /_next/static/chunks/pages/_app-5258482dbf006fab.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E = self.webpackChunk_N_E || []).push([ 2 | [888], 3 | { 4 | 1118: function (n, u, t) { 5 | (window.__NEXT_P = window.__NEXT_P || []).push([ 6 | "/_app", 7 | function () { 8 | return t(8484); 9 | }, 10 | ]); 11 | }, 12 | 8484: function (n, u, t) { 13 | "use strict"; 14 | t.r(u); 15 | var _ = t(5893); 16 | t(2490), 17 | t(953), 18 | (u.default = function (n) { 19 | let { Component: u, pageProps: t } = n; 20 | return (0, _.jsx)(u, { ...t }); 21 | }); 22 | }, 23 | 2490: function () {}, 24 | 953: function () {}, 25 | }, 26 | function (n) { 27 | var u = function (u) { 28 | return n((n.s = u)); 29 | }; 30 | n.O(0, [774, 179], function () { 31 | return u(1118), u(880); 32 | }), 33 | (_N_E = n.O()); 34 | }, 35 | ]); 36 | -------------------------------------------------------------------------------- /_next/static/chunks/pages/_error-8353112a01355ec2.js: -------------------------------------------------------------------------------- 1 | (self.webpackChunk_N_E = self.webpackChunk_N_E || []).push([ 2 | [820], 3 | { 4 | 1981: function (n, _, u) { 5 | (window.__NEXT_P = window.__NEXT_P || []).push([ 6 | "/_error", 7 | function () { 8 | return u(67); 9 | }, 10 | ]); 11 | }, 12 | }, 13 | function (n) { 14 | n.O(0, [774, 888, 179], function () { 15 | return n((n.s = 1981)); 16 | }), 17 | (_N_E = n.O()); 18 | }, 19 | ]); 20 | -------------------------------------------------------------------------------- /_next/static/chunks/webpack-b8f8d6679aaa5f42.js: -------------------------------------------------------------------------------- 1 | !(function () { 2 | "use strict"; 3 | var e, 4 | n, 5 | r, 6 | t, 7 | o = {}, 8 | u = {}; 9 | function i(e) { 10 | var n = u[e]; 11 | if (void 0 !== n) return n.exports; 12 | var r = (u[e] = { exports: {} }), 13 | t = !0; 14 | try { 15 | o[e].call(r.exports, r, r.exports, i), (t = !1); 16 | } finally { 17 | t && delete u[e]; 18 | } 19 | return r.exports; 20 | } 21 | (i.m = o), 22 | (e = []), 23 | (i.O = function (n, r, t, o) { 24 | if (r) { 25 | o = o || 0; 26 | for (var u = e.length; u > 0 && e[u - 1][2] > o; u--) e[u] = e[u - 1]; 27 | e[u] = [r, t, o]; 28 | return; 29 | } 30 | for (var f = 1 / 0, u = 0; u < e.length; u++) { 31 | for ( 32 | var r = e[u][0], t = e[u][1], o = e[u][2], l = !0, c = 0; 33 | c < r.length; 34 | c++ 35 | ) 36 | f >= o && 37 | Object.keys(i.O).every(function (e) { 38 | return i.O[e](r[c]); 39 | }) 40 | ? r.splice(c--, 1) 41 | : ((l = !1), o < f && (f = o)); 42 | if (l) { 43 | e.splice(u--, 1); 44 | var a = t(); 45 | void 0 !== a && (n = a); 46 | } 47 | } 48 | return n; 49 | }), 50 | (i.n = function (e) { 51 | var n = 52 | e && e.__esModule 53 | ? function () { 54 | return e.default; 55 | } 56 | : function () { 57 | return e; 58 | }; 59 | return i.d(n, { a: n }), n; 60 | }), 61 | (i.d = function (e, n) { 62 | for (var r in n) 63 | i.o(n, r) && 64 | !i.o(e, r) && 65 | Object.defineProperty(e, r, { enumerable: !0, get: n[r] }); 66 | }), 67 | (i.o = function (e, n) { 68 | return Object.prototype.hasOwnProperty.call(e, n); 69 | }), 70 | (i.r = function (e) { 71 | "undefined" != typeof Symbol && 72 | Symbol.toStringTag && 73 | Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }), 74 | Object.defineProperty(e, "__esModule", { value: !0 }); 75 | }), 76 | (i.p = "/_next/"), 77 | (n = { 272: 0 }), 78 | (i.O.j = function (e) { 79 | return 0 === n[e]; 80 | }), 81 | (r = function (e, r) { 82 | var t, 83 | o, 84 | u = r[0], 85 | f = r[1], 86 | l = r[2], 87 | c = 0; 88 | if ( 89 | u.some(function (e) { 90 | return 0 !== n[e]; 91 | }) 92 | ) { 93 | for (t in f) i.o(f, t) && (i.m[t] = f[t]); 94 | if (l) var a = l(i); 95 | } 96 | for (e && e(r); c < u.length; c++) 97 | (o = u[c]), i.o(n, o) && n[o] && n[o][0](), (n[o] = 0); 98 | return i.O(a); 99 | }), 100 | (t = self.webpackChunk_N_E = self.webpackChunk_N_E || []).forEach( 101 | r.bind(null, 0) 102 | ), 103 | (t.push = r.bind(null, t.push.bind(t))); 104 | })(); 105 | -------------------------------------------------------------------------------- /apps.config.js: -------------------------------------------------------------------------------- 1 | import displaySpotify from "./components/apps/spotify"; 2 | import displayVsCode from "./components/apps/vscode"; 3 | import { displayTerminal } from "./components/apps/terminal"; 4 | import { displaySettings } from "./components/apps/settings"; 5 | import { displayChrome } from "./components/apps/chrome"; 6 | import { displayTrash } from "./components/apps/trash"; 7 | import { displayGedit } from "./components/apps/gedit"; 8 | import { displayAboutDawidolko } from "./components/apps/dawidolko"; 9 | import { displayTerminalCalc } from "./components/apps/calc"; 10 | 11 | const apps = [ 12 | { 13 | id: "chrome", 14 | title: "Google Chrome", 15 | icon: "./themes/Yaru/apps/chrome.png", 16 | disabled: false, 17 | favourite: true, 18 | desktop_shortcut: true, 19 | screen: displayChrome, 20 | }, 21 | { 22 | id: "calc", 23 | title: "Calc", 24 | icon: "./themes/Yaru/apps/calc.png", 25 | disabled: false, 26 | favourite: true, 27 | desktop_shortcut: false, 28 | screen: displayTerminalCalc, 29 | }, 30 | { 31 | id: "about-dawidolko", 32 | title: "About dawidolko", 33 | icon: "./themes/Yaru/system/user-home.png", 34 | disabled: false, 35 | favourite: true, 36 | desktop_shortcut: true, 37 | screen: displayAboutDawidolko, 38 | }, 39 | { 40 | id: "vscode", 41 | title: "Visual Studio Code", 42 | icon: "./themes/Yaru/apps/vscode.png", 43 | disabled: false, 44 | favourite: true, 45 | desktop_shortcut: false, 46 | screen: displayVsCode, 47 | }, 48 | { 49 | id: "terminal", 50 | title: "Terminal", 51 | icon: "./themes/Yaru/apps/bash.png", 52 | disabled: false, 53 | favourite: true, 54 | desktop_shortcut: false, 55 | screen: displayTerminal, 56 | }, 57 | { 58 | id: "spotify", 59 | title: "Spotify", 60 | icon: "./themes/Yaru/apps/spotify.png", 61 | disabled: false, 62 | favourite: true, 63 | desktop_shortcut: false, 64 | screen: displaySpotify, // India Top 50 Playlist 😅 65 | }, 66 | { 67 | id: "settings", 68 | title: "Settings", 69 | icon: "./themes/Yaru/apps/gnome-control-center.png", 70 | disabled: false, 71 | favourite: true, 72 | desktop_shortcut: false, 73 | screen: displaySettings, 74 | }, 75 | { 76 | id: "trash", 77 | title: "Trash", 78 | icon: "./themes/Yaru/system/user-trash-full.png", 79 | disabled: false, 80 | favourite: false, 81 | desktop_shortcut: true, 82 | screen: displayTrash, 83 | }, 84 | { 85 | id: "gedit", 86 | title: "Contact Me", 87 | icon: "./themes/Yaru/apps/gedit.png", 88 | disabled: false, 89 | favourite: false, 90 | desktop_shortcut: true, 91 | screen: displayGedit, 92 | }, 93 | ]; 94 | 95 | export default apps; 96 | -------------------------------------------------------------------------------- /components/SEO/Meta.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import Head from "next/head"; 3 | 4 | export default function Meta() { 5 | return ( 6 | 7 | /* Primary Meta Tags */ 8 | ubuntu.dawidolko.pl - Simulaing System Ubuntu 9 | 10 | 14 | 18 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | /* Search Engine */ 29 | 30 | /* Schema.org for Google */ 31 | 35 | 39 | 40 | /* Twitter */ 41 | 42 | 46 | 50 | 51 | 52 | 53 | /* Open Graph general (Facebook, Pinterest & Google+) */ 54 | 58 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 74 | 77 | 78 | ); 79 | } 80 | -------------------------------------------------------------------------------- /components/apps/chrome.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | 3 | export class Chrome extends Component { 4 | constructor() { 5 | super(); 6 | this.home_url = 'https://www.google.com/webhp?igu=1'; 7 | this.state = { 8 | url: 'https://www.google.com/webhp?igu=1', 9 | display_url: "https://www.google.com", 10 | } 11 | } 12 | 13 | componentDidMount() { 14 | let lastVisitedUrl = localStorage.getItem("chrome-url"); 15 | let lastDisplayedUrl = localStorage.getItem("chrome-display-url"); 16 | if (lastVisitedUrl !== null && lastVisitedUrl !== undefined) { 17 | this.setState({ url: lastVisitedUrl, display_url: lastDisplayedUrl }, this.refreshChrome); 18 | } 19 | } 20 | 21 | storeVisitedUrl = (url, display_url) => { 22 | localStorage.setItem("chrome-url", url); 23 | localStorage.setItem("chrome-display-url", display_url); 24 | } 25 | 26 | refreshChrome = () => { 27 | document.getElementById("chrome-screen").src += ''; 28 | } 29 | 30 | goToHome = () => { 31 | this.setState({ url: this.home_url, display_url: "https://www.google.com" }); 32 | this.refreshChrome(); 33 | } 34 | 35 | checkKey = (e) => { 36 | if (e.key === "Enter") { 37 | let url = e.target.value; 38 | let display_url = ""; 39 | 40 | url = url.trim(); 41 | if (url.length === 0) return; 42 | 43 | if (url.indexOf("http://") !== 0 && url.indexOf("https://") !== 0) { 44 | url = "https://" + url; 45 | } 46 | 47 | url = encodeURI(url); 48 | display_url = url; 49 | if (url.includes("google.com")) { // 😅 50 | url = 'https://www.google.com/webhp?igu=1'; 51 | display_url = "https://www.google.com"; 52 | } 53 | this.setState({ url, display_url: url }); 54 | this.storeVisitedUrl(url, display_url); 55 | document.getElementById("chrome-url-bar").blur(); 56 | } 57 | } 58 | 59 | handleDisplayUrl = (e) => { 60 | this.setState({ display_url: e.target.value }); 61 | } 62 | 63 | displayUrlBar = () => { 64 | return ( 65 |
66 |
67 | Ubuntu Chrome Refresh 68 |
69 |
70 | Ubuntu Chrome Home 71 |
72 | 73 |
74 | ); 75 | } 76 | 77 | render() { 78 | return ( 79 |
80 | {this.displayUrlBar()} 81 | 82 |
83 | ) 84 | } 85 | } 86 | 87 | export default Chrome 88 | 89 | export const displayChrome = () => { 90 | return ; 91 | } 92 | -------------------------------------------------------------------------------- /components/apps/gedit.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import $ from 'jquery'; 3 | import ReactGA from 'react-ga4'; 4 | import emailjs from '@emailjs/browser'; 5 | 6 | export class Gedit extends Component { 7 | 8 | constructor() { 9 | super(); 10 | this.state = { 11 | sending: false, 12 | } 13 | } 14 | 15 | componentDidMount() { 16 | emailjs.init(process.env.NEXT_PUBLIC_USER_ID); 17 | } 18 | 19 | sendMessage = async () => { 20 | let name = $("#sender-name").val(); 21 | let subject = $("#sender-subject").val(); 22 | let message = $("#sender-message").val(); 23 | 24 | name = name.trim(); 25 | subject = subject.trim(); 26 | message = message.trim(); 27 | 28 | let error = false; 29 | 30 | if (name.length === 0) { 31 | $("#sender-name").val(''); 32 | $("#sender-name").attr("placeholder", "Name must not be Empty!"); 33 | error = true; 34 | } 35 | 36 | if (message.length === 0) { 37 | $("#sender-message").val(''); 38 | $("#sender-message").attr("placeholder", "Message must not be Empty!"); 39 | error = true; 40 | } 41 | if (error) return; 42 | 43 | this.setState({ sending: true }); 44 | 45 | const serviceID = process.env.NEXT_PUBLIC_SERVICE_ID; 46 | const templateID = process.env.NEXT_PUBLIC_TEMPLATE_ID; 47 | const templateParams = { 48 | 'name': name, 49 | 'subject': subject, 50 | 'message': message, 51 | } 52 | 53 | emailjs.send(serviceID, templateID, templateParams).then(() => { 54 | this.setState({ sending: false }); 55 | $("#close-gedit").trigger("click"); 56 | }).catch(() => { 57 | this.setState({ sending: false }); 58 | $("#close-gedit").trigger("click"); 59 | }) 60 | 61 | ReactGA.event({ 62 | category: "Send Message", 63 | action: `${name}, ${subject}, ${message}` 64 | }); 65 | 66 | } 67 | 68 | render() { 69 | return ( 70 |
71 |
72 | Send a Message to Me 73 |
74 |
Send
75 |
76 |
77 |
78 |
79 |
80 | 81 | 1 82 |
83 |
84 | 85 | 2 86 |
87 |
88 |