├── .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 |
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 | [](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 |

68 |
69 |
70 |

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 |
76 |
77 |
78 |
79 |
80 |
81 | 1
82 |
83 |
84 |
85 | 2
86 |
87 |
88 |
89 | 3
90 |
91 |
92 | {
93 | (this.state.sending
94 | ?
95 |
96 |

97 |
98 | : null
99 | )
100 | }
101 |
102 | )
103 | }
104 | }
105 |
106 | export default Gedit;
107 |
108 | export const displayGedit = () => {
109 | return ;
110 | }
111 |
--------------------------------------------------------------------------------
/components/apps/settings.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import $ from 'jquery';
3 |
4 | export function Settings(props) {
5 | const wallpapers = {
6 | "wall-1": "./images/wallpapers/wall-1.webp",
7 | "wall-2": "./images/wallpapers/wall-2.webp",
8 | "wall-3": "./images/wallpapers/wall-3.webp",
9 | "wall-4": "./images/wallpapers/wall-4.webp",
10 | "wall-5": "./images/wallpapers/wall-5.webp",
11 | "wall-6": "./images/wallpapers/wall-6.webp",
12 | "wall-7": "./images/wallpapers/wall-7.webp",
13 | "wall-8": "./images/wallpapers/wall-8.webp",
14 | };
15 |
16 | let changeBackgroundImage = (e) => {
17 | props.changeBackgroundImage($(e.target).data("path"));
18 | }
19 |
20 | return (
21 |
22 |
23 |
24 |
25 | {
26 | Object.keys(wallpapers).map((name, index) => {
27 | return (
28 |
29 | );
30 | })
31 | }
32 |
33 |
34 | )
35 | }
36 |
37 | export default Settings
38 |
39 |
40 | export const displaySettings = () => {
41 | return ;
42 | }
43 |
--------------------------------------------------------------------------------
/components/apps/spotify.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | export default function Spotify() {
4 | return (
5 |
6 | )
7 | }
8 |
9 | export const displaySpotify = () => {
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/components/apps/todoist.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | export default function Todoist() {
4 | return (
5 |
6 | // just to bypass the headers 🙃
7 | )
8 | }
9 |
10 | export const displayTodoist = () => {
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/components/apps/trash.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 | import $ from "jquery";
3 |
4 | export class Trash extends Component {
5 | constructor() {
6 | super();
7 | this.trashItems = [
8 | {
9 | name: "php",
10 | icon: "./themes/filetypes/php.png",
11 | },
12 | {
13 | name: "Angular.js",
14 | icon: "./themes/filetypes/js.png",
15 | },
16 | {
17 | name: "node_modules",
18 | icon: "./themes/Yaru/system/folder.png",
19 | },
20 |
21 | {
22 | name: "abandoned project",
23 | icon: "./themes/Yaru/system/folder.png",
24 | },
25 | {
26 | name: "18BCP127 assignment name.zip",
27 | icon: "./themes/filetypes/zip.png",
28 | },
29 | {
30 | name: "project final",
31 | icon: "./themes/Yaru/system/folder.png",
32 | },
33 | {
34 | name: "project ultra-final",
35 | icon: "./themes/Yaru/system/folder.png",
36 | },
37 | ];
38 | this.state = {
39 | empty: false,
40 | };
41 | }
42 |
43 | componentDidMount() {
44 | // get user preference from local-storage
45 | let wasEmpty = localStorage.getItem("trash-empty");
46 | if (wasEmpty !== null && wasEmpty !== undefined) {
47 | if (wasEmpty === "true") this.setState({ empty: true });
48 | }
49 | }
50 |
51 | focusFile = (e) => {
52 | // icon
53 | $(e.target).children().get(0).classList.toggle("opacity-60");
54 | // file name
55 | $(e.target).children().get(1).classList.toggle("bg-ub-orange");
56 | };
57 |
58 | emptyTrash = () => {
59 | this.setState({ empty: true });
60 | localStorage.setItem("trash-empty", true);
61 | };
62 |
63 | emptyScreen = () => {
64 | return (
65 |
66 |

71 |
72 | Trash is Empty
73 |
74 |
75 | );
76 | };
77 |
78 | showTrashItems = () => {
79 | return (
80 |
81 | {this.trashItems.map((item, index) => {
82 | return (
83 |
89 |
90 |

91 |
92 |
{item.name}
93 |
94 | );
95 | })}
96 |
97 | );
98 | };
99 |
100 | render() {
101 | return (
102 |
103 |
104 |
Trash
105 |
106 |
107 | Restore
108 |
109 |
112 | Empty
113 |
114 |
115 |
116 | {this.state.empty ? this.emptyScreen() : this.showTrashItems()}
117 |
118 | );
119 | }
120 | }
121 |
122 | export default Trash;
123 |
124 | export const displayTrash = () => {
125 | return ;
126 | };
127 |
--------------------------------------------------------------------------------
/components/apps/vscode.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | export default function VsCode() {
4 | return (
5 |
10 | // this is not my work, but it's amazing!
11 | // Here is the link to the original repo: https://github.com/conwnet/github1s
12 | );
13 | }
14 |
15 | export const displayVsCode = () => {
16 | ;
17 | };
18 |
--------------------------------------------------------------------------------
/components/base/side_bar_app.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from "react";
2 |
3 | export class SideBarApp extends Component {
4 | constructor() {
5 | super();
6 | this.id = null;
7 | this.state = {
8 | showTitle: false,
9 | scaleImage: false,
10 | };
11 | }
12 |
13 | componentDidMount() {
14 | this.id = this.props.id;
15 | }
16 |
17 | scaleImage = () => {
18 | setTimeout(() => {
19 | this.setState({ scaleImage: false });
20 | }, 1000);
21 | this.setState({ scaleImage: true });
22 | }
23 |
24 | openApp = () => {
25 | if (!this.props.isMinimized[this.id] && this.props.isClose[this.id]) {
26 | this.scaleImage();
27 | }
28 | this.props.openApp(this.id);
29 | this.setState({ showTitle: false });
30 | };
31 |
32 | render() {
33 | return (
34 | {
38 | this.setState({ showTitle: true });
39 | }}
40 | onMouseLeave={() => {
41 | this.setState({ showTitle: false });
42 | }}
43 | className={(this.props.isClose[this.id] === false && this.props.isFocus[this.id] ? "bg-white bg-opacity-10 " : "") + " w-auto p-2 outline-none relative transition hover:bg-white hover:bg-opacity-10 rounded m-1"}
44 | id={"sidebar-" + this.props.id}
45 | >
46 |

47 |

48 | {
49 | (
50 | this.props.isClose[this.id] === false
51 | ?
52 | : null
53 | )
54 | }
55 |
61 | {this.props.title}
62 |
63 |
64 | );
65 | }
66 | }
67 |
68 | export default SideBarApp;
69 |
--------------------------------------------------------------------------------
/components/base/ubuntu_app.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react'
2 |
3 | export class UbuntuApp extends Component {
4 |
5 | openApp = () => {
6 | this.props.openApp(this.props.id);
7 | }
8 |
9 | render() {
10 | return (
11 |
17 |

18 | {this.props.name}
19 |
20 |
21 | )
22 | }
23 | }
24 |
25 | export default UbuntuApp
26 |
--------------------------------------------------------------------------------
/components/context menus/default.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | function DefaultMenu(props) {
4 | return (
5 |
67 | );
68 | }
69 |
70 | function Devider() {
71 | return (
72 |
75 | );
76 | }
77 |
78 | export default DefaultMenu;
79 |
--------------------------------------------------------------------------------
/components/context menus/desktop-menu.js:
--------------------------------------------------------------------------------
1 | import React, { useState, useEffect } from 'react'
2 |
3 | function DesktopMenu(props) {
4 |
5 | const [isFullScreen, setIsFullScreen] = useState(false)
6 |
7 | useEffect(() => {
8 | document.addEventListener('fullscreenchange', checkFullScreen);
9 | return () => {
10 | document.removeEventListener('fullscreenchange', checkFullScreen);
11 | };
12 | }, [])
13 |
14 |
15 | const openTerminal = () => {
16 | props.openApp("terminal");
17 | }
18 |
19 | const openSettings = () => {
20 | props.openApp("settings");
21 | }
22 |
23 | const checkFullScreen = () => {
24 | if (document.fullscreenElement) {
25 | setIsFullScreen(true)
26 | } else {
27 | setIsFullScreen(false)
28 | }
29 | }
30 |
31 | const goFullScreen = () => {
32 | // make website full screen
33 | try {
34 | if (document.fullscreenElement) {
35 | document.exitFullscreen()
36 | } else {
37 | document.documentElement.requestFullscreen()
38 | }
39 | }
40 | catch (e) {
41 | console.log(e)
42 | }
43 | }
44 |
45 | return (
46 |
77 | )
78 | }
79 |
80 | function Devider() {
81 | return (
82 |
85 | );
86 | }
87 |
88 |
89 | export default DesktopMenu
90 |
--------------------------------------------------------------------------------
/components/screen/all-applications.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import UbuntuApp from '../base/ubuntu_app';
3 |
4 | export class AllApplications extends React.Component {
5 | constructor() {
6 | super();
7 | this.state = {
8 | query: "",
9 | apps: [],
10 | category: 0 // 0 for all, 1 for frequent
11 | }
12 | }
13 |
14 | componentDidMount() {
15 | this.setState({
16 | apps: this.props.apps
17 | })
18 | }
19 |
20 | handleChange = (e) => {
21 | this.setState({
22 | query: e.target.value,
23 | apps: e.target.value === "" || e.target.value === null ?
24 | this.props.apps : this.state.apps.filter(
25 | (app) => app.title.toLowerCase().includes(e.target.value.toLowerCase())
26 | )
27 | })
28 | }
29 |
30 | renderApps = () => {
31 |
32 | let appsJsx = [];
33 | let frequentAppsInfo = JSON.parse(localStorage.getItem("frequentApps"));
34 | let getFrequentApps = () => {
35 | let frequentApps = [];
36 | if (frequentAppsInfo) {
37 | frequentAppsInfo.forEach((app_info) => {
38 | let app = this.props.apps.find(app => app.id === app_info.id);
39 | if (app) {
40 | frequentApps.push(app);
41 | }
42 | })
43 | }
44 | return frequentApps;
45 | }
46 |
47 | let apps = this.state.category === 0 ? [...this.state.apps] : getFrequentApps();
48 | apps.forEach((app, index) => {
49 | const props = {
50 | name: app.title,
51 | id: app.id,
52 | icon: app.icon,
53 | openApp: this.props.openApp
54 | }
55 |
56 | appsJsx.push(
57 |
58 | );
59 | });
60 | return appsJsx;
61 | }
62 |
63 | handleSwitch = (category) => {
64 | if (category !== this.state.category) {
65 | this.setState({
66 | category: category
67 | })
68 | }
69 | }
70 |
71 | render() {
72 | return (
73 |
74 |
75 |
76 |

77 |
81 |
82 |
83 |
84 | {this.renderApps()}
85 |
86 |
87 |
88 |
Frequent
89 | {this.state.category === 1 ?
90 | :
}
91 |
92 |
93 |
All
94 | {this.state.category === 0 ?
95 | :
}
96 |
97 |
98 |
99 | )
100 | }
101 | }
102 |
103 | export default AllApplications;
--------------------------------------------------------------------------------
/components/screen/booting_screen.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | function BootingScreen(props) {
4 | return (
5 |
17 |

24 |
27 | {props.isShutDown ? (
28 |
29 |

36 |
37 | ) : (
38 |

45 | )}
46 |
47 |

54 |
71 |
72 | );
73 | }
74 |
75 | export default BootingScreen;
76 |
--------------------------------------------------------------------------------
/components/screen/lock_screen.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import Clock from '../util components/clock';
3 |
4 | export default function LockScreen(props) {
5 |
6 | const wallpapers = {
7 | "wall-1": "./images/wallpapers/wall-1.webp",
8 | "wall-2": "./images/wallpapers/wall-2.webp",
9 | "wall-3": "./images/wallpapers/wall-3.webp",
10 | "wall-4": "./images/wallpapers/wall-4.webp",
11 | "wall-5": "./images/wallpapers/wall-5.webp",
12 | "wall-6": "./images/wallpapers/wall-6.webp",
13 | "wall-7": "./images/wallpapers/wall-7.webp",
14 | "wall-8": "./images/wallpapers/wall-8.webp",
15 | };
16 |
17 | if (props.isLocked) {
18 | window.addEventListener('click', props.unLockScreen);
19 | window.addEventListener('keypress', props.unLockScreen);
20 | };
21 |
22 | return (
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | Click or Press a key to unlock
34 |
35 |
36 |
37 | )
38 | }
39 |
--------------------------------------------------------------------------------
/components/screen/navbar.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import Clock from '../util components/clock';
3 | import Status from '../util components/status';
4 | import StatusCard from '../util components/status_card';
5 |
6 | export default class Navbar extends Component {
7 | constructor() {
8 | super();
9 | this.state = {
10 | status_card: false
11 | };
12 | }
13 |
14 | render() {
15 | return (
16 |
17 |
23 | Activities
24 |
25 |
31 |
32 |
33 |
{
37 | this.setState({ status_card: true });
38 | }}
39 | // removed onBlur from here
40 | className={
41 | 'relative pr-3 pl-3 outline-none transition duration-100 ease-in-out border-b-2 border-transparent focus:border-ubb-orange py-1 '
42 | }
43 | >
44 |
45 | {
50 | // this prop is used in statusCard component in handleClickOutside callback using react-onclickoutside
51 | this.setState({ status_card: false });
52 | }}
53 | />
54 |
55 |
56 | );
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/components/screen/side_bar.js:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import SideBarApp from '../base/side_bar_app';
3 |
4 | let renderApps = (props) => {
5 | let sideBarAppsJsx = [];
6 | props.apps.forEach((app, index) => {
7 | if (props.favourite_apps[app.id] === false) return;
8 | sideBarAppsJsx.push(
9 |
10 | );
11 | });
12 | return sideBarAppsJsx;
13 | }
14 |
15 | export default function SideBar(props) {
16 |
17 | function showSideBar() {
18 | props.hideSideBar(null, false);
19 | }
20 |
21 | function hideSideBar() {
22 | setTimeout(() => {
23 | props.hideSideBar(null, true);
24 | }, 2000);
25 | }
26 |
27 | return (
28 | <>
29 |
30 | {
31 | (
32 | Object.keys(props.closed_windows).length !== 0
33 | ? renderApps(props)
34 | : null
35 | )
36 | }
37 |
38 |
39 |
40 | >
41 | )
42 | }
43 |
44 | export function AllApps(props) {
45 |
46 | const [title, setTitle] = useState(false);
47 |
48 | return (
49 | {
53 | setTitle(true);
54 | }}
55 | onMouseLeave={() => {
56 | setTitle(false);
57 | }}
58 | onClick={props.showApps}
59 | >
60 |
61 |

62 |
68 | Show Applications
69 |
70 |
71 |
72 | );
73 | }
--------------------------------------------------------------------------------
/components/ubuntu.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import BootingScreen from './screen/booting_screen';
3 | import Desktop from './screen/desktop';
4 | import LockScreen from './screen/lock_screen';
5 | import Navbar from './screen/navbar';
6 | import ReactGA from 'react-ga4';
7 |
8 | export default class Ubuntu extends Component {
9 | constructor() {
10 | super();
11 | this.state = {
12 | screen_locked: false,
13 | bg_image_name: 'wall-2',
14 | booting_screen: true,
15 | shutDownScreen: false
16 | };
17 | }
18 |
19 | componentDidMount() {
20 | this.getLocalData();
21 | }
22 |
23 | setTimeOutBootScreen = () => {
24 | setTimeout(() => {
25 | this.setState({ booting_screen: false });
26 | }, 2000);
27 | };
28 |
29 | getLocalData = () => {
30 | // Get Previously selected Background Image
31 | let bg_image_name = localStorage.getItem('bg-image');
32 | if (bg_image_name !== null && bg_image_name !== undefined) {
33 | this.setState({ bg_image_name });
34 | }
35 |
36 | let booting_screen = localStorage.getItem('booting_screen');
37 | if (booting_screen !== null && booting_screen !== undefined) {
38 | // user has visited site before
39 | this.setState({ booting_screen: false });
40 | } else {
41 | // user is visiting site for the first time
42 | localStorage.setItem('booting_screen', false);
43 | this.setTimeOutBootScreen();
44 | }
45 |
46 | // get shutdown state
47 | let shut_down = localStorage.getItem('shut-down');
48 | if (shut_down !== null && shut_down !== undefined && shut_down === 'true') this.shutDown();
49 | else {
50 | // Get previous lock screen state
51 | let screen_locked = localStorage.getItem('screen-locked');
52 | if (screen_locked !== null && screen_locked !== undefined) {
53 | this.setState({ screen_locked: screen_locked === 'true' ? true : false });
54 | }
55 | }
56 | };
57 |
58 | lockScreen = () => {
59 | // google analytics
60 | ReactGA.send({ hitType: "pageview", page: "/lock-screen", title: "Lock Screen" });
61 | ReactGA.event({
62 | category: `Screen Change`,
63 | action: `Set Screen to Locked`
64 | });
65 |
66 | document.getElementById('status-bar').blur();
67 | setTimeout(() => {
68 | this.setState({ screen_locked: true });
69 | }, 100); // waiting for all windows to close (transition-duration)
70 | localStorage.setItem('screen-locked', true);
71 | };
72 |
73 | unLockScreen = () => {
74 | ReactGA.send({ hitType: "pageview", page: "/desktop", title: "Custom Title" });
75 |
76 | window.removeEventListener('click', this.unLockScreen);
77 | window.removeEventListener('keypress', this.unLockScreen);
78 |
79 | this.setState({ screen_locked: false });
80 | localStorage.setItem('screen-locked', false);
81 | };
82 |
83 | changeBackgroundImage = (img_name) => {
84 | this.setState({ bg_image_name: img_name });
85 | localStorage.setItem('bg-image', img_name);
86 | };
87 |
88 | shutDown = () => {
89 | ReactGA.send({ hitType: "pageview", page: "/switch-off", title: "Custom Title" });
90 |
91 | ReactGA.event({
92 | category: `Screen Change`,
93 | action: `Switched off the Ubuntu`
94 | });
95 |
96 | document.getElementById('status-bar').blur();
97 | this.setState({ shutDownScreen: true });
98 | localStorage.setItem('shut-down', true);
99 | };
100 |
101 | turnOn = () => {
102 | ReactGA.send({ hitType: "pageview", page: "/desktop", title: "Custom Title" });
103 |
104 | this.setState({ shutDownScreen: false, booting_screen: true });
105 | this.setTimeOutBootScreen();
106 | localStorage.setItem('shut-down', false);
107 | };
108 |
109 | render() {
110 | return (
111 |
112 |
117 |
122 |
123 |
124 |
125 | );
126 | }
127 | }
128 |
--------------------------------------------------------------------------------
/components/util components/background-image.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | export default function BackgroundImage(props) {
4 | const bg_images = {
5 | "wall-1": "./images/wallpapers/wall-1.webp",
6 | "wall-2": "./images/wallpapers/wall-2.webp",
7 | "wall-3": "./images/wallpapers/wall-3.webp",
8 | "wall-4": "./images/wallpapers/wall-4.webp",
9 | "wall-5": "./images/wallpapers/wall-5.webp",
10 | "wall-6": "./images/wallpapers/wall-6.webp",
11 | "wall-7": "./images/wallpapers/wall-7.webp",
12 | "wall-8": "./images/wallpapers/wall-8.webp",
13 | };
14 | return (
15 |
16 |
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/components/util components/clock.js:
--------------------------------------------------------------------------------
1 | import { Component } from 'react'
2 |
3 | export default class Clock extends Component {
4 | constructor() {
5 | super();
6 | this.month_list = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
7 | this.day_list = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
8 | this.state = {
9 | hour_12: true,
10 | current_time: new Date()
11 | };
12 | }
13 |
14 | componentDidMount() {
15 | this.update_time = setInterval(() => {
16 | this.setState({ current_time: new Date() });
17 | }, 10 * 1000);
18 | }
19 |
20 | componentWillUnmount() {
21 | clearInterval(this.update_time);
22 | }
23 |
24 | render() {
25 | const { current_time } = this.state;
26 |
27 | let day = this.day_list[current_time.getDay()];
28 | let hour = current_time.getHours();
29 | let minute = current_time.getMinutes();
30 | let month = this.month_list[current_time.getMonth()];
31 | let date = current_time.getDate().toLocaleString();
32 | let meridiem = (hour < 12 ? "AM" : "PM");
33 |
34 | if (minute.toLocaleString().length === 1) {
35 | minute = "0" + minute
36 | }
37 |
38 | if (this.state.hour_12 && hour > 12) hour -= 12;
39 |
40 | let display_time;
41 | if (this.props.onlyTime) {
42 | display_time = hour + ":" + minute + " " + meridiem;
43 | }
44 | else if (this.props.onlyDay) {
45 | display_time = day + " " + month + " " + date;
46 | }
47 | else display_time = day + " " + month + " " + date + " " + hour + ":" + minute + " " + meridiem;
48 | return {display_time};
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/components/util components/small_arrow.js:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 |
3 | export default function SmallArrow(props) {
4 | let angle = props.angle ? props.angle : "up"; // default value is up
5 | return (
6 |
7 | )
8 | }
9 |
--------------------------------------------------------------------------------
/components/util components/status.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import SmallArrow from "./small_arrow";
3 |
4 | export default function Status() {
5 | return (
6 |
7 |
8 |
14 |
15 |
16 |
22 |
23 |
24 |
30 |
31 |
32 |
33 |
34 |
35 | );
36 | }
37 |
--------------------------------------------------------------------------------
/files/cv_ver1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/files/cv_ver1.pdf
--------------------------------------------------------------------------------
/images/logos/bitmoji.JPG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/bitmoji.JPG
--------------------------------------------------------------------------------
/images/logos/bitmoji.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/bitmoji.png
--------------------------------------------------------------------------------
/images/logos/fevicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/fevicon.png
--------------------------------------------------------------------------------
/images/logos/fevicon.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/images/logos/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/logo.png
--------------------------------------------------------------------------------
/images/logos/logo_1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/logo_1024.png
--------------------------------------------------------------------------------
/images/logos/logo_1200.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/logo_1200.png
--------------------------------------------------------------------------------
/images/logos/search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/logos/search.png
--------------------------------------------------------------------------------
/images/memes/used-sudo-command.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/memes/used-sudo-command.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-1.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-2.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-3.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-4.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-4.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-5.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-5.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-6.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-6.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-7.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-7.webp
--------------------------------------------------------------------------------
/images/wallpapers/wall-8.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dawidolko/Ubuntu-Simulaing-System-GUI/cc3485044afead9916612072851390de2f81b401/images/wallpapers/wall-8.webp
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ubuntu.dawidolko.pl",
3 | "version": "2.0.0",
4 | "private": true,
5 | "homepage": "https://ubuntu.dawidolko.pl",
6 | "scripts": {
7 | "dev": "next dev",
8 | "build": "next build",
9 | "start": "next start",
10 | "export": "next export"
11 | },
12 | "engines": {
13 | "node": ">=16.x"
14 | },
15 | "dependencies": {
16 | "@emailjs/browser": "^3.10.0",
17 | "autoprefixer": "^10.4.13",
18 | "expr-eval": "^2.0.2",
19 | "jquery": "^3.6.3",
20 | "next": "^13.1.2",
21 | "postcss": "^8.4.21",
22 | "prop-types": "^15.8.1",
23 | "react": "^18.2.0",
24 | "react-dom": "^18.2.0",
25 | "react-draggable": "^4.4.5",
26 | "react-ga4": "^2.1.0",
27 | "react-onclickoutside": "^6.12.2",
28 | "tailwindcss": "^3.2.4"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/pages/_app.js:
--------------------------------------------------------------------------------
1 | import 'tailwindcss/tailwind.css'
2 | import '../styles/index.css'
3 |
4 | function MyApp({ Component, pageProps }) {
5 | return
6 | }
7 |
8 | export default MyApp
9 |
--------------------------------------------------------------------------------
/pages/_document.js:
--------------------------------------------------------------------------------
1 | import Document, { Html, Head, Main, NextScript } from 'next/document'
2 |
3 | class MyDocument extends Document {
4 | static async getInitialProps(ctx) {
5 | const initialProps = await Document.getInitialProps(ctx)
6 | return { ...initialProps }
7 | }
8 |
9 | render() {
10 | return (
11 |
12 |
13 |
14 |