├── bun.lockb ├── public ├── favicon.ico ├── images │ ├── app-icons │ │ ├── logs.webp │ │ ├── clock.webp │ │ ├── graft.webp │ │ ├── appStore.webp │ │ ├── gallery.webp │ │ ├── settings.webp │ │ ├── terminal.webp │ │ ├── welcome.webp │ │ ├── calculator.webp │ │ ├── fileManager.webp │ │ ├── textEditor.webp │ │ └── activityMonitor.webp │ ├── favicon │ │ ├── favicon.ico │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── mstile-150x150.png │ │ ├── apple-touch-icon.png │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── browserconfig.xml │ │ └── safari-pinned-tab.svg │ ├── landing │ │ ├── darkOIN.webp │ │ ├── lightOIN.webp │ │ ├── darkPangolin.webp │ │ ├── lightPangolin.webp │ │ ├── darkSupportedDevices.webp │ │ └── lightSupportedDevices.webp │ ├── animation │ │ ├── darkFiles.webp │ │ ├── macbook.webp │ │ ├── terminal.webp │ │ ├── lightFiles.webp │ │ ├── darkCalculator.webp │ │ ├── lightCalculator.webp │ │ ├── darkModeBackground.svg │ │ └── lightModeBackground.svg │ ├── logos │ │ ├── darkLogotype.webp │ │ └── lightLogotype.webp │ ├── mockups │ │ ├── darkmockup.webp │ │ └── lightmockup.webp │ └── background │ │ ├── darkBackground.svg │ │ └── lightBackground.svg ├── site.webmanifest └── sitemap.xml ├── .github ├── images │ └── landing_screenshot.png ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature_request.yml │ └── bug_report.yml ├── FUNDING.yml └── pull_request_template.md ├── .eslintignore ├── .prettierignore ├── next-env.d.ts ├── .prettierrc ├── utils ├── Fetcher.ts ├── hooks │ ├── useGithubReleases.ts │ ├── useMeetsScrollPos.ts │ └── usePreferredTheme.ts └── Theme.ts ├── types ├── emotion.d.ts └── types.ts ├── pages ├── api │ ├── index.ts │ ├── og_download_count.tsx │ ├── latest_version.ts │ └── download_count.ts ├── _document.tsx ├── 404.tsx ├── _app.tsx ├── download.tsx ├── donate.tsx └── index.tsx ├── .gitignore ├── tsconfig.json ├── .eslintrc.json ├── package.json ├── next.config.js ├── README.md ├── components ├── Icons.tsx ├── Navbar.tsx ├── Footer.tsx ├── Intro.tsx └── Download.tsx ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md └── LICENSE /bun.lockb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/bun.lockb -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/images/app-icons/logs.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/logs.webp -------------------------------------------------------------------------------- /public/images/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/favicon.ico -------------------------------------------------------------------------------- /public/images/app-icons/clock.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/clock.webp -------------------------------------------------------------------------------- /public/images/app-icons/graft.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/graft.webp -------------------------------------------------------------------------------- /public/images/landing/darkOIN.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/landing/darkOIN.webp -------------------------------------------------------------------------------- /public/images/landing/lightOIN.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/landing/lightOIN.webp -------------------------------------------------------------------------------- /.github/images/landing_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/.github/images/landing_screenshot.png -------------------------------------------------------------------------------- /public/images/animation/darkFiles.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/animation/darkFiles.webp -------------------------------------------------------------------------------- /public/images/animation/macbook.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/animation/macbook.webp -------------------------------------------------------------------------------- /public/images/animation/terminal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/animation/terminal.webp -------------------------------------------------------------------------------- /public/images/app-icons/appStore.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/appStore.webp -------------------------------------------------------------------------------- /public/images/app-icons/gallery.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/gallery.webp -------------------------------------------------------------------------------- /public/images/app-icons/settings.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/settings.webp -------------------------------------------------------------------------------- /public/images/app-icons/terminal.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/terminal.webp -------------------------------------------------------------------------------- /public/images/app-icons/welcome.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/welcome.webp -------------------------------------------------------------------------------- /public/images/logos/darkLogotype.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/logos/darkLogotype.webp -------------------------------------------------------------------------------- /public/images/logos/lightLogotype.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/logos/lightLogotype.webp -------------------------------------------------------------------------------- /public/images/mockups/darkmockup.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/mockups/darkmockup.webp -------------------------------------------------------------------------------- /public/images/mockups/lightmockup.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/mockups/lightmockup.webp -------------------------------------------------------------------------------- /public/images/animation/lightFiles.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/animation/lightFiles.webp -------------------------------------------------------------------------------- /public/images/app-icons/calculator.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/calculator.webp -------------------------------------------------------------------------------- /public/images/app-icons/fileManager.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/fileManager.webp -------------------------------------------------------------------------------- /public/images/app-icons/textEditor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/textEditor.webp -------------------------------------------------------------------------------- /public/images/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /public/images/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /public/images/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /public/images/landing/darkPangolin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/landing/darkPangolin.webp -------------------------------------------------------------------------------- /public/images/landing/lightPangolin.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/landing/lightPangolin.webp -------------------------------------------------------------------------------- /public/images/animation/darkCalculator.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/animation/darkCalculator.webp -------------------------------------------------------------------------------- /public/images/favicon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/apple-touch-icon.png -------------------------------------------------------------------------------- /public/images/animation/lightCalculator.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/animation/lightCalculator.webp -------------------------------------------------------------------------------- /public/images/app-icons/activityMonitor.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/app-icons/activityMonitor.webp -------------------------------------------------------------------------------- /public/images/favicon/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/images/favicon/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/favicon/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/images/landing/darkSupportedDevices.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/landing/darkSupportedDevices.webp -------------------------------------------------------------------------------- /public/images/landing/lightSupportedDevices.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dahliaOS/website/HEAD/public/images/landing/lightSupportedDevices.webp -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | # artifacts 2 | build 3 | coverage 4 | 5 | # next.js 6 | .next 7 | 8 | # dependencies 9 | node_modules 10 | pnpm-lock.yaml 11 | 12 | # assets 13 | public -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # artifacts 2 | build 3 | coverage 4 | 5 | # next.js 6 | .next 7 | 8 | # dependencies 9 | node_modules 10 | pnpm-lock.yaml 11 | 12 | # assets 13 | public -------------------------------------------------------------------------------- /next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/pages/api-reference/config/typescript for more information. 6 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Below is a list of dahliaOS team members' GitHub handles who are 2 | # suggested reviewers for contributions to this repository. 3 | # 4 | # These names are just suggestions. It is fine to have your changes 5 | # reviewed by someone else. 6 | 7 | * @Looskie -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "quoteProps": "consistent", 3 | "singleQuote": false, 4 | "semi": true, 5 | "trailingComma": "all", 6 | "bracketSpacing": true, 7 | "jsxBracketSameLine": false, 8 | "jsxSingleQuote": false, 9 | "arrowParens": "avoid", 10 | "tabWidth": 2 11 | } 12 | -------------------------------------------------------------------------------- /utils/Fetcher.ts: -------------------------------------------------------------------------------- 1 | export const fetcher = async (url: string) => { 2 | const res = await fetch(url); 3 | 4 | if (!res.ok) { 5 | const error = new Error("An error occurred whilst fetching data!"); 6 | 7 | throw error; 8 | } 9 | 10 | return res.json(); 11 | }; 12 | -------------------------------------------------------------------------------- /public/images/favicon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ff3d00 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Help 4 | url: https://dahliaos.io/discord 5 | about: "If you have a question or need help, join our Discord!" 6 | - name: Documentation issue 7 | url: https://github.com/dahliaos/documentation 8 | about: "For documentation issues, suggest changes on our documentation repository." 9 | -------------------------------------------------------------------------------- /utils/hooks/useGithubReleases.ts: -------------------------------------------------------------------------------- 1 | import useSWR, { SWRResponse } from "swr"; 2 | import { Releases } from "../../types/types"; 3 | 4 | export const useGithubReleases = () => { 5 | const { data, error }: SWRResponse = useSWR( 6 | "https://api.github.com/repos/dahliaOS/releases/releases", 7 | ); 8 | 9 | return { 10 | releases: data, 11 | isLoading: !error && !data, 12 | isError: error, 13 | }; 14 | }; 15 | -------------------------------------------------------------------------------- /types/emotion.d.ts: -------------------------------------------------------------------------------- 1 | import "@emotion/react"; 2 | import "@mui/material"; 3 | import { Theme as MaterialUITheme } from "@mui/material/styles"; 4 | 5 | declare module "@emotion/react" { 6 | // eslint-disable-next-line @typescript-eslint/no-empty-interface 7 | export interface Theme extends MaterialUITheme {} 8 | } 9 | 10 | declare module "@mui/material" { 11 | interface TypeText { 12 | light?: string; 13 | extremelyLight?: string; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dahliaOS website", 3 | "short_name": "dahliaOS", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ff3d00", 17 | "background_color": "#ff3d00", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /pages/api/index.ts: -------------------------------------------------------------------------------- 1 | import type { NextApiRequest, NextApiResponse } from "next"; 2 | import { APIResponse } from "../../types/types"; 3 | 4 | export const runtime = "edge"; 5 | 6 | interface IndexResponse { 7 | message: string; 8 | } 9 | 10 | export default function handler( 11 | _req: NextApiRequest, 12 | res: NextApiResponse>, 13 | ) { 14 | res.status(200).json({ 15 | success: true, 16 | data: { 17 | message: "Welcome to dahliaOS' web API!", 18 | }, 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /.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.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | # vercel 34 | .vercel 35 | 36 | # typescript 37 | *.tsbuildinfo 38 | -------------------------------------------------------------------------------- /utils/hooks/useMeetsScrollPos.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | export const useMeetsScrollPos = (threshold: number) => { 4 | const [meetsScrollPos, setMeetsScrollPos] = useState(false); 5 | 6 | useEffect(() => { 7 | if (!window) return; 8 | setMeetsScrollPos(window.innerWidth <= threshold); 9 | 10 | const scroll = () => setMeetsScrollPos(window.scrollY > threshold); 11 | 12 | window.addEventListener("scroll", scroll); 13 | return () => window.removeEventListener("scroll", scroll); 14 | }, [threshold]); 15 | 16 | return meetsScrollPos; 17 | }; 18 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: dahliaos 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 | -------------------------------------------------------------------------------- /types/types.ts: -------------------------------------------------------------------------------- 1 | export type Releases = Array; 2 | 3 | export interface Release { 4 | name: string; 5 | tag_name: string; 6 | body: string; 7 | assets: Assets[]; 8 | assets_url: string; 9 | html_url: string; 10 | created_at: Date; 11 | published_at: Date; 12 | } 13 | 14 | export interface Assets { 15 | download_count: number; 16 | name: string; 17 | browser_download_url: string; 18 | } 19 | 20 | export interface APIResponse { 21 | success: boolean; 22 | data?: APIData; 23 | error?: APIError; 24 | } 25 | 26 | export type APIData = T; 27 | 28 | export interface APIError { 29 | code: number; 30 | message: string; 31 | } 32 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "forceConsistentCasingInFileNames": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "node", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "jsxImportSource": "@emotion/react", 17 | "strict": true, 18 | "paths": { 19 | "react": ["./node_modules/@types/react"] 20 | } 21 | }, 22 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], 23 | "exclude": ["node_modules"] 24 | } 25 | -------------------------------------------------------------------------------- /public/sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | https://dahliaos.io/ 9 | 2022-06-16T21:05:39+00:00 10 | 1.00 11 | 12 | 13 | https://dahliaos.io/download 14 | 2022-06-16T21:05:39+00:00 15 | 0.80 16 | 17 | 18 | https://dahliaos.io/donate 19 | 2022-06-16T21:05:39+00:00 20 | 0.80 21 | 22 | -------------------------------------------------------------------------------- /public/images/favicon/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/background/darkBackground.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/background/lightBackground.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /utils/hooks/usePreferredTheme.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from "react"; 2 | 3 | type ThemeTypes = "dark" | "light"; 4 | 5 | export const usePreferredTheme = (): ThemeTypes => { 6 | const [theme, setTheme] = useState("dark"); 7 | 8 | useEffect(() => { 9 | const changeTheme = () => { 10 | let savedTheme = localStorage.getItem("theme"); 11 | 12 | // If savedTheme doesn't exist 13 | if (!savedTheme) { 14 | localStorage.setItem("theme", "system"); 15 | savedTheme = "system"; 16 | } 17 | 18 | setTheme( 19 | savedTheme === "system" 20 | ? window.matchMedia("(prefers-color-scheme: dark)").matches 21 | ? "dark" 22 | : "light" 23 | : (savedTheme as ThemeTypes), 24 | ); 25 | }; 26 | 27 | // Run on init 28 | changeTheme(); 29 | 30 | window.addEventListener("storage", changeTheme); 31 | 32 | return () => window.removeEventListener("storage", changeTheme); 33 | }, []); 34 | 35 | return theme; 36 | }; 37 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | "extends": [ 7 | "eslint:recommended", 8 | "plugin:react/recommended", 9 | "plugin:@typescript-eslint/recommended", 10 | "plugin:@next/next/recommended", 11 | "plugin:prettier/recommended" 12 | ], 13 | "parser": "@typescript-eslint/parser", 14 | "parserOptions": { 15 | "ecmaFeatures": { 16 | "jsx": true 17 | }, 18 | "ecmaVersion": "latest", 19 | "project": ["tsconfig.json"], 20 | "sourceType": "module" 21 | }, 22 | "plugins": ["react", "@typescript-eslint"], 23 | "rules": { 24 | "react/react-in-jsx-scope": "off", 25 | "indent": "off", 26 | "linebreak-style": ["error", "unix"], 27 | "quotes": ["error", "double"], 28 | "semi": ["error", "always"], 29 | "no-console": "error", 30 | "@typescript-eslint/no-unused-vars": "error", 31 | "no-unused-vars": [ 32 | "error", 33 | { "argsIgnorePattern": "^_", "ignoreRestSiblings": true } 34 | ], 35 | "@typescript-eslint/no-inferrable-types": "off", 36 | "no-restricted-syntax": [ 37 | "error", 38 | { 39 | "selector": ":matches(JSXElement, JSXFragment) > JSXExpressionContainer > LogicalExpression[operator!='??']", 40 | "message": "Please use ternaries when writing JSX!" 41 | } 42 | ] 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "website", 3 | "author": "The dahliaOS Authors", 4 | "description": "dahliaOS Website", 5 | "license": "Apache-2.0", 6 | "private": true, 7 | "scripts": { 8 | "dev": "next dev", 9 | "build": "next build", 10 | "start": "next start", 11 | "lint": "next lint", 12 | "prettier": "prettier --write .", 13 | "build:cfpages": "npx @cloudflare/next-on-pages" 14 | }, 15 | "dependencies": { 16 | "@emotion/react": "^11.14.0", 17 | "@emotion/server": "^11.11.0", 18 | "@emotion/styled": "^11.14.0", 19 | "@mui/icons-material": "^7.0.1", 20 | "@mui/material": "^7.0.1", 21 | "@reach/skip-nav": "^0.18.0", 22 | "@vercel/og": "^1.0.0", 23 | "framer-motion": "^12.6.2", 24 | "next": "15.2.4", 25 | "react": "19.1.0", 26 | "react-dom": "19.1.0", 27 | "swr": "^2.3.3" 28 | }, 29 | "devDependencies": { 30 | "@cloudflare/next-on-pages": "^1.13.10", 31 | "@types/node": "22.13.14", 32 | "@types/react": "19.0.12", 33 | "@typescript-eslint/eslint-plugin": "^8.28.0", 34 | "@typescript-eslint/parser": "^8.28.0", 35 | "eslint": "^9.23.0", 36 | "eslint-config-next": "15.2.4", 37 | "eslint-config-prettier": "^10.1.1", 38 | "eslint-plugin-prettier": "^5.2.5", 39 | "eslint-plugin-react": "^7.37.4", 40 | "prettier": "^3.5.3", 41 | "typescript": "5.8.2" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /utils/Theme.ts: -------------------------------------------------------------------------------- 1 | import { Theme } from "@emotion/react"; 2 | import { createTheme } from "@mui/material"; 3 | 4 | export const DarkTheme: Theme = createTheme({ 5 | palette: { 6 | mode: "dark", 7 | primary: { 8 | main: "#1a1a1a", 9 | light: "#252525", 10 | dark: "#0f0f0f", 11 | contrastText: "#1f1f1f", 12 | }, 13 | secondary: { 14 | main: "#ff6331", 15 | light: "#ff3d00", 16 | dark: "#d63400", 17 | }, 18 | error: { 19 | light: "#e57373", 20 | main: "#f44336", 21 | dark: "#d32f2f", 22 | }, 23 | text: { 24 | primary: "#acacac", 25 | secondary: "#6b6b6b", 26 | light: "#fff", 27 | extremelyLight: "#fff", 28 | }, 29 | background: { 30 | paper: "#fff", 31 | }, 32 | divider: "#1f1f1f", 33 | }, 34 | }); 35 | 36 | export const LightTheme: Theme = createTheme({ 37 | palette: { 38 | mode: "light", 39 | primary: { 40 | main: "#FFFDFA", 41 | light: "#E6E4E2", 42 | dark: "#B3B2B1", 43 | contrastText: "#F9F9F9", 44 | }, 45 | secondary: { 46 | main: "#ff6331", 47 | light: "#ff3d00", 48 | dark: "#d63400", 49 | }, 50 | error: { 51 | light: "#e57373", 52 | main: "#f44336", 53 | dark: "#d32f2f", 54 | }, 55 | text: { 56 | primary: "#333332", 57 | secondary: "#000", 58 | light: "#4D4C4B", 59 | extremelyLight: "#fff", 60 | }, 61 | background: { 62 | paper: "#fff", 63 | default: "#000000", 64 | }, 65 | divider: "#B3B2B1", 66 | }, 67 | }); 68 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | # Pull request template 2 | 3 | - Please make sure you read and fill this template out entirely 4 | - PRs that don't have the template filled out will be ignored 5 | 6 | ## Description 7 | 8 | - Please include a summary of the change and which issue is fixed 9 | - Please also include relevant motivation and context (Why is this change required? What problem does it solve?) 10 | - List any dependencies that are required for this change 11 | - If it fixes an open issue, please link to the issue here 12 | 13 | Fixes #(issue) 14 | 15 | ## Screenshots (if appropriate): 16 | 17 | ## Type of change 18 | 19 | Please tick the relevant option by putting an X inside the bracket 20 | 21 | - [ ] Bug fix (non-breaking change which fixes an issue) 22 | - [ ] New feature (non-breaking change which adds functionality) 23 | - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) 24 | - [ ] This change requires a documentation update 25 | 26 | ## Checklist: 27 | 28 | - [ ] My code follows the guidelines of this project 29 | - [ ] I have performed a self-review of my own code 30 | - [ ] I have commented my code, particularly in hard-to-understand areas 31 | - [ ] I have made corresponding changes to the documentation 32 | - [ ] My changes generate no new warnings 33 | - [ ] CLoudlfare Preview deployment has succeeded 34 | - [ ] Any dependent changes have been merged and published in downstream modules 35 | - [ ] I have checked my code and corrected any misspellings 36 | - [ ] I have read the [CONTRIBUTING](../CONTRIBUTING.md) document 37 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | 3 | const nextConfig = { 4 | reactStrictMode: true, 5 | compiler: { 6 | emotion: true, 7 | }, 8 | async redirects() { 9 | return [ 10 | { 11 | source: "/downloads", 12 | destination: "/download", 13 | permanent: true, 14 | }, 15 | { 16 | source: "/discord", 17 | destination: "https://discord.com/invite/7qVbJHR", 18 | permanent: true, 19 | }, 20 | { 21 | source: "/github", 22 | destination: "https://github.com/dahliaOS", 23 | permanent: true, 24 | }, 25 | { 26 | source: "/reddit", 27 | destination: "https://www.reddit.com/r/DahliaOS/", 28 | permanent: true, 29 | }, 30 | { 31 | source: "/telegram", 32 | destination: "https://t.me/dahliaos", 33 | permanent: true, 34 | }, 35 | { 36 | source: "/facebook", 37 | destination: "https://www.facebook.com/dahliaos.io/", 38 | permanent: true, 39 | }, 40 | { 41 | source: "/instagram", 42 | destination: "https://www.instagram.com/dahliaos.io/", 43 | permanent: true, 44 | }, 45 | { 46 | source: "/twitter", 47 | destination: "https://twitter.com/dahliaos_io", 48 | permanent: true, 49 | }, 50 | { 51 | source: "/docs", 52 | destination: "https://docs.dahliaos.io/", 53 | permanent: true, 54 | }, 55 | { 56 | source: "/blog", 57 | destination: "https://blog.dahliaos.io", 58 | permanent: true, 59 | }, 60 | { 61 | source: "/download-count", 62 | destination: "https://dahliaos.io/api/og_download_count", 63 | permanent: true, 64 | }, 65 | ]; 66 | }, 67 | }; 68 | 69 | module.exports = nextConfig; 70 | -------------------------------------------------------------------------------- /pages/api/og_download_count.tsx: -------------------------------------------------------------------------------- 1 | import { ImageResponse } from "@vercel/og"; 2 | import Image from "next/image"; 3 | export const config = { 4 | runtime: "edge", 5 | }; 6 | 7 | interface DownloadCount { 8 | success: boolean; 9 | data: number; 10 | } 11 | 12 | export default async function handler() { 13 | try { 14 | const request: DownloadCount = await fetch( 15 | "https://dahliaos.io/api/download_count", 16 | ).then(res => res.json()); 17 | 18 | const count = request.success 19 | ? `Total download count is ${request.data}` 20 | : "Could not obtain total download count"; 21 | 22 | return new ImageResponse( 23 | ( 24 |
36 | dahliaOS Logotype 41 |

51 | {count} 52 |

53 |
54 | ), 55 | { 56 | width: 1200, 57 | height: 630, 58 | }, 59 | ); 60 | } catch { 61 | return new Response("Failed to generate the image", { 62 | status: 500, 63 | }); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: Feature request 2 | description: Request a new feature 3 | title: "[FEATURE REQUEST] " 4 | labels: [enhancement] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for your feature request. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: textarea 14 | attributes: 15 | label: Is your feature request related to a problem? Please describe. 16 | description: A clear and concise description of what the problem is. 17 | placeholder: Ex. I'm always frustrated when [...] 18 | validations: 19 | required: false 20 | - type: textarea 21 | attributes: 22 | label: Describe the solution you'd like 23 | description: A clear and concise description of what you want to happen. 24 | validations: 25 | required: false 26 | - type: textarea 27 | attributes: 28 | label: Describe alternatives you've considered 29 | description: A clear and concise description of any alternative solutions or features you've considered. 30 | validations: 31 | required: false 32 | - type: textarea 33 | attributes: 34 | label: Additional context 35 | description: | 36 | Add any other context or screenshots about the feature request here. 37 | 38 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 39 | validations: 40 | required: false 41 | - type: checkboxes 42 | attributes: 43 | label: Code of Conduct 44 | description: By submitting this issue, you agree to follow our [Code of Conduct](../../CODE_OF_CONDUCT.md) 45 | options: 46 | - label: I agree to follow this project's Code of Conduct 47 | required: true 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Landing screenshot](/.github/images/landing_screenshot.png) 2 | 3 | <p align="center"> 4 | <a href="https://dahliaos.io">Website</a> • 5 | <a href="https://dahliaos.io/discord">Discord</a> • 6 | <a href="https://dahliaos.io/download">Releases</a> • 7 | <a href="https://dahliaos.io/donate">Donate</a> • 8 | <a href="https://docs.dahliaos.io">Documentation</a> 9 | 10 | # dahliaOS Website 11 | 12 | ![Website](https://img.shields.io/website?url=https%3A%2F%2Fdahliaos.io) 13 | 14 | - **Official**, one and only website for the dahliaOS project 15 | - **Find** it by clicking [here!](https://dahliaos.io) 16 | 17 | ## Development 18 | 19 | To develop and locally test the website: 20 | 21 | ### 1. Install development tools: 22 | 23 | 1. [Install bun](https://bun.sh/) 24 | 1. Code editor of your choice (we recommend [VSCode](https://code.visualstudio.com/)) 25 | 26 | ### 2. Install dependencies: 27 | 28 | Install node modules required to run the website by running: 29 | 30 | ``` 31 | bun install 32 | ``` 33 | 34 | ### 3. Start the Next.js dev server: 35 | 36 | ``` 37 | bun dev 38 | ``` 39 | 40 | In a browser, load the page [localhost:3000](http://localhost:3000) and you should now be able to test the website while making your changes. 41 | Next.js' dev server has hot reloading so no need to restart the instance when it's running! 42 | 43 | ### 4. Build: 44 | 45 | After making your changes and verifying it all works in the dev server, furtherly test them out by building the website: 46 | 47 | ``` 48 | bun run build 49 | ``` 50 | 51 | ### 5. Start: 52 | 53 | ``` 54 | bun start 55 | ``` 56 | 57 | In a browser, load the page [localhost:3000](http://localhost:3000) and you should now be able to view the built website. 58 | 59 | ## Contribute 60 | 61 | If you're wondering how to contribute to the project, please refer to [CONTRIBUTING.md](/CONTRIBUTING.md) 62 | 63 | ## License 64 | 65 | <p align="left"> 66 | <img width="30%" src="https://github.com/dahliaOS/brand/blob/main/dahliaOS/logotype/svg/logotype-dark.svg#gh-dark-mode-only"/> 67 | <img width="30%" src="https://github.com/dahliaOS/brand/blob/main/dahliaOS/logotype/svg/logotype-light.svg#gh-light-mode-only"/> 68 | </p> 69 | 70 | Copyright @ 2019-2023 - The dahliaOS Authors - contact@dahliaos.io 71 | 72 | This project is licensed under the [Apache 2.0 license](/LICENSE) 73 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug 2 | description: File a bug/issue 3 | title: "[BUG] <title>" 4 | labels: [bug] 5 | body: 6 | - type: checkboxes 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for the bug you encountered. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: textarea 14 | attributes: 15 | label: Current behavior 16 | description: A concise description of what you're experiencing. 17 | validations: 18 | required: false 19 | - type: textarea 20 | attributes: 21 | label: Expected behavior 22 | description: A concise description of what you expected to happen. 23 | validations: 24 | required: false 25 | - type: textarea 26 | attributes: 27 | label: Steps to reproduce 28 | description: Steps to reproduce the behavior. 29 | placeholder: | 30 | 1. Go to '...' 31 | 2. Click on '....' 32 | 3. Scroll down to '....' 33 | 4. See error 34 | validations: 35 | required: false 36 | - type: textarea 37 | attributes: 38 | label: Environment (remove values that do not apply) 39 | description: | 40 | examples: 41 | - **OS**: Ubuntu 20.04 42 | - **Smartphone**: iPhone 13 Pro 43 | - **Node version**: 15.0.0 44 | - **Browser**: Google Chrome 45 | - **PNPM version**: 7.16.0 46 | value: | 47 | - OS: 48 | - Smartphone: 49 | - Node version: 50 | - Browser: 51 | - PNPM version: 52 | render: markdown 53 | validations: 54 | required: false 55 | - type: textarea 56 | attributes: 57 | label: Anything else? 58 | description: | 59 | Links? References? Anything that will give us more context about the issue you are encountering! 60 | 61 | Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in. 62 | validations: 63 | required: false 64 | - type: checkboxes 65 | attributes: 66 | label: Code of Conduct 67 | description: By submitting this issue, you agree to follow our [Code of Conduct](../../CODE_OF_CONDUCT.md) 68 | options: 69 | - label: I agree to follow this project's Code of Conduct 70 | required: true 71 | -------------------------------------------------------------------------------- /pages/api/latest_version.ts: -------------------------------------------------------------------------------- 1 | import type { NextApiRequest, NextApiResponse } from "next"; 2 | import { APIResponse } from "../../types/types"; 3 | 4 | export const runtime = "edge"; 5 | 6 | interface Author { 7 | login: string; 8 | id: number; 9 | node_id: string; 10 | avatar_url: string; 11 | gravatar_id: string; 12 | url: string; 13 | html_url: string; 14 | followers_url: string; 15 | following_url: string; 16 | gists_url: string; 17 | starred_url: string; 18 | subscriptions_url: string; 19 | organizations_url: string; 20 | repos_url: string; 21 | events_url: string; 22 | received_events_url: string; 23 | type: string; 24 | site_admin: boolean; 25 | } 26 | 27 | interface Uploader { 28 | login: string; 29 | id: number; 30 | node_id: string; 31 | avatar_url: string; 32 | gravatar_id: string; 33 | url: string; 34 | html_url: string; 35 | followers_url: string; 36 | following_url: string; 37 | gists_url: string; 38 | starred_url: string; 39 | subscriptions_url: string; 40 | organizations_url: string; 41 | repos_url: string; 42 | events_url: string; 43 | received_events_url: string; 44 | type: string; 45 | site_admin: boolean; 46 | } 47 | 48 | interface Asset { 49 | url: string; 50 | id: number; 51 | node_id: string; 52 | name: string; 53 | label?: unknown; 54 | uploader: Uploader; 55 | content_type: string; 56 | state: string; 57 | size: number; 58 | download_count: number; 59 | created_at: Date; 60 | updated_at: Date; 61 | browser_download_url: string; 62 | } 63 | 64 | interface Reactions { 65 | "url": string; 66 | "total_count": number; 67 | "+1": number; 68 | "-1": number; 69 | "laugh": number; 70 | "hooray": number; 71 | "confused": number; 72 | "heart": number; 73 | "rocket": number; 74 | "eyes": number; 75 | } 76 | 77 | export interface VersionResponse { 78 | url: string; 79 | assets_url: string; 80 | upload_url: string; 81 | html_url: string; 82 | id: number; 83 | author: Author; 84 | node_id: string; 85 | tag_name: string; 86 | target_commitish: string; 87 | name: string; 88 | draft: boolean; 89 | prerelease: boolean; 90 | created_at: Date; 91 | published_at: Date; 92 | assets: Asset[]; 93 | tarball_url: string; 94 | zipball_url: string; 95 | body: string; 96 | discussion_url: string; 97 | reactions: Reactions; 98 | } 99 | 100 | export default async function handler( 101 | _req: NextApiRequest, 102 | res: NextApiResponse<APIResponse<VersionResponse>>, 103 | ) { 104 | const request: Array<VersionResponse> = await fetch( 105 | "https://api.github.com/repos/dahliaOS/releases/releases", 106 | ).then(res => res.json()); 107 | 108 | res.status(200).json({ 109 | success: true, 110 | data: request[0], 111 | }); 112 | } 113 | -------------------------------------------------------------------------------- /pages/_document.tsx: -------------------------------------------------------------------------------- 1 | /* eslint-disable @next/next/no-page-custom-font */ 2 | import Document, { Head, Html, NextScript, Main } from "next/document"; 3 | import { DarkTheme } from "../utils/Theme"; 4 | 5 | const Page = () => ( 6 | <Html lang="en"> 7 | <Head> 8 | <meta charSet="UTF-8" /> 9 | <meta httpEquiv="X-UA-Compatible" content="IE=edge" /> 10 | <meta name="theme-color" content={DarkTheme.palette.secondary.main} /> 11 | <meta property="og:image" content="https://imgur.com/pqgjEpd.png" /> 12 | <meta property="og:site_name" content="dahliaOS" /> 13 | <meta name="apple-mobile-web-app-capable" content="yes" /> 14 | <link 15 | rel="icon" 16 | type="image/png" 17 | href="/images/favicon/favicon-32x32.png" 18 | /> 19 | <meta 20 | name="apple-mobile-web-app-status-bar-style" 21 | content={DarkTheme.palette.secondary.light} 22 | /> 23 | <meta name="apple-mobile-web-app-title" content="dahliaOS" /> 24 | <meta 25 | name="msapplication-TileImage" 26 | content="/images/favicon/favicon.png" 27 | /> 28 | <meta 29 | name="msapplication-TileColor" 30 | content={DarkTheme.palette.secondary.light} 31 | /> 32 | 33 | <link 34 | rel="apple-touch-icon" 35 | sizes="180x180" 36 | href="/images/favicon/apple-touch-icon.png" 37 | /> 38 | <link 39 | rel="icon" 40 | type="image/png" 41 | sizes="32x32" 42 | href="/images/favicon/favicon-32x32.png" 43 | /> 44 | <link 45 | rel="icon" 46 | type="image/png" 47 | sizes="16x16" 48 | href="/images/favicon/favicon-16x16.png" 49 | /> 50 | <link rel="manifest" href="/site.webmanifest" /> 51 | <meta 52 | name="keywords" 53 | content="dahlia, software, flutter, fuchsia, linux, dahliaOS, computer, operating system, os, system, kernel, dart, open source, material, design, zircon, go, rust" 54 | /> 55 | <meta 56 | name="description" 57 | content="Discover an intuitive operating system with a modern user interface, efficient multitasking, advanced networking, security features and respectful privacy. Powered by Linux - designed to be lightweight for a fast and versatile computing experience." 58 | /> 59 | <meta 60 | name="og:description" 61 | content="Discover an intuitive operating system with a modern user interface, efficient multitasking, advanced networking, security features and respectful privacy. Powered by Linux - designed to be lightweight for a fast and versatile computing experience." 62 | /> 63 | <link 64 | rel="stylesheet" 65 | href="https://fonts.googleapis.com/icon?family=Material+Icons" 66 | /> 67 | </Head> 68 | <body> 69 | <Main /> 70 | <NextScript /> 71 | </body> 72 | </Html> 73 | ); 74 | 75 | export default class MyDocument extends Document { 76 | render() { 77 | return <Page />; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /pages/api/download_count.ts: -------------------------------------------------------------------------------- 1 | import type { NextApiRequest, NextApiResponse } from "next"; 2 | import { APIResponse } from "../../types/types"; 3 | 4 | export const runtime = "edge"; 5 | 6 | interface Author { 7 | login: string; 8 | id: number; 9 | node_id: string; 10 | avatar_url: string; 11 | gravatar_id: string; 12 | url: string; 13 | html_url: string; 14 | followers_url: string; 15 | following_url: string; 16 | gists_url: string; 17 | starred_url: string; 18 | subscriptions_url: string; 19 | organizations_url: string; 20 | repos_url: string; 21 | events_url: string; 22 | received_events_url: string; 23 | type: string; 24 | site_admin: boolean; 25 | } 26 | 27 | interface Uploader { 28 | login: string; 29 | id: number; 30 | node_id: string; 31 | avatar_url: string; 32 | gravatar_id: string; 33 | url: string; 34 | html_url: string; 35 | followers_url: string; 36 | following_url: string; 37 | gists_url: string; 38 | starred_url: string; 39 | subscriptions_url: string; 40 | organizations_url: string; 41 | repos_url: string; 42 | events_url: string; 43 | received_events_url: string; 44 | type: string; 45 | site_admin: boolean; 46 | } 47 | 48 | interface Asset { 49 | url: string; 50 | id: number; 51 | node_id: string; 52 | name: string; 53 | label?: unknown; 54 | uploader: Uploader; 55 | content_type: string; 56 | state: string; 57 | size: number; 58 | download_count: number; 59 | created_at: Date; 60 | updated_at: Date; 61 | browser_download_url: string; 62 | } 63 | 64 | interface Reactions { 65 | "url": string; 66 | "total_count": number; 67 | "+1": number; 68 | "-1": number; 69 | "laugh": number; 70 | "hooray": number; 71 | "confused": number; 72 | "heart": number; 73 | "rocket": number; 74 | "eyes": number; 75 | } 76 | 77 | export interface VersionResponse { 78 | url: string; 79 | assets_url: string; 80 | upload_url: string; 81 | html_url: string; 82 | id: number; 83 | author: Author; 84 | node_id: string; 85 | tag_name: string; 86 | target_commitish: string; 87 | name: string; 88 | draft: boolean; 89 | prerelease: boolean; 90 | created_at: Date; 91 | published_at: Date; 92 | assets: Asset[]; 93 | tarball_url: string; 94 | zipball_url: string; 95 | body: string; 96 | discussion_url: string; 97 | reactions: Reactions; 98 | } 99 | 100 | export default async function handler( 101 | _req: NextApiRequest, 102 | res: NextApiResponse<APIResponse<number>>, 103 | ) { 104 | const request: Array<VersionResponse> = await fetch( 105 | "https://api.github.com/repos/dahliaOS/releases/releases", 106 | ).then(res => res.json()); 107 | 108 | res.status(200).json({ 109 | success: true, 110 | data: request 111 | ?.map(allReleases => { 112 | return allReleases.assets[0].name.includes("efi") 113 | ? allReleases.assets[0].download_count + 114 | allReleases.assets[1].download_count 115 | : allReleases.assets[0].download_count; 116 | }) 117 | .reduce<number>((accumulator, current) => { 118 | return accumulator + current; 119 | }, 0), 120 | }); 121 | } 122 | -------------------------------------------------------------------------------- /pages/404.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from "@mui/material"; 2 | import styled from "@emotion/styled"; 3 | import Footer from "../components/Footer"; 4 | import Navbar from "../components/Navbar"; 5 | import { Home as HomeIcon } from "@mui/icons-material"; 6 | import Head from "next/head"; 7 | 8 | const Wrapper = styled.div` 9 | display: flex; 10 | justify-content: center; 11 | align-items: center; 12 | flex-direction: column; 13 | min-height: 100vh; 14 | padding: 5rem; 15 | background: ${({ theme }) => 16 | theme.palette.mode === "dark" 17 | ? "url('/images/background/darkBackground.svg')" 18 | : "url('/images/background/lightBackground.svg')"}; 19 | background-repeat: no-repeat; 20 | background-position: center; 21 | background-size: cover; 22 | background-attachment: fixed; 23 | 24 | @media (max-width: 1250px) { 25 | padding: 8rem 3rem; 26 | } 27 | `; 28 | 29 | const Container = styled.div` 30 | display: flex; 31 | max-width: 800px; 32 | flex-direction: column; 33 | justify-content: center; 34 | align-items: center; 35 | gap: 2rem; 36 | width: 100%; 37 | `; 38 | 39 | const Header = styled.h1` 40 | color: ${({ theme }) => theme.palette.text.light}; 41 | font-size: 2.5em; 42 | font-weight: 500; 43 | text-align: center; 44 | 45 | @media (max-width: 1250px) { 46 | font-size: 2rem; 47 | } 48 | `; 49 | 50 | const SubHeader = styled.h2` 51 | color: ${({ theme }) => theme.palette.text.light}; 52 | font-size: 1.9em; 53 | font-weight: 400; 54 | text-align: left; 55 | 56 | @media (max-width: 1250px) { 57 | font-size: 1.4em; 58 | } 59 | `; 60 | 61 | const Paragraph = styled.p` 62 | color: ${({ theme }) => theme.palette.text.primary}; 63 | max-width: 80ch; 64 | font-size: 1.4rem; 65 | text-align: center; 66 | 67 | @media (max-width: 1250px) { 68 | font-size: 1.2rem; 69 | } 70 | `; 71 | 72 | const StyledButton = styled(Button)` 73 | padding: 10px 20px; 74 | border-radius: 5px; 75 | gap: 10px; 76 | width: fit-content; 77 | height: fit-content; 78 | transition: 0.2s ease-in-out; 79 | color: ${({ theme }) => theme.palette.text.extremelyLight}; 80 | background: ${({ theme }) => theme.palette.secondary.light}; 81 | 82 | &:hover { 83 | background: ${({ theme }) => theme.palette.secondary.main}; 84 | } 85 | `; 86 | 87 | const Error404 = () => { 88 | return ( 89 | <> 90 | <Head> 91 | <title>dahliaOS – 404 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
Page not found
100 | 404 Error 101 | 102 | This page could not be found, it probably has not been coded yet or 103 | you have the wrong URL. 104 | 105 | 106 | 107 | HOME 108 | 109 |
110 |
111 |