Skip to content

Commit

Permalink
Add support to toggle theme
Browse files Browse the repository at this point in the history
  • Loading branch information
georapbox committed Oct 19, 2024
1 parent 553a150 commit d873f86
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 15 deletions.
11 changes: 11 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 7 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,27 @@
"author": "George Raptis <[email protected]>",
"license": "MIT",
"devDependencies": {
"@eslint/js": "~9.12.0",
"@parcel/packager-raw-url": "~2.12.0",
"@parcel/transformer-webmanifest": "~2.12.0",
"eslint": "~9.12.0",
"gh-pages": "~6.2.0",
"globals": "~15.11.0",
"npm-run-all": "~4.1.5",
"parcel": "~2.12.0",
"prettier": "~3.3.3",
"rimraf": "~6.0.1",
"workbox-cli": "~7.1.0",
"@eslint/js": "~9.12.0",
"eslint": "~9.12.0",
"globals": "~15.11.0",
"prettier": "~3.3.3"
"workbox-cli": "~7.1.0"
},
"browserslist": "> 0.5%, last 2 versions, not dead",
"dependencies": {
"@georapbox/capture-photo-element": "~5.0.0",
"@georapbox/files-dropzone-element": "~2.0.1",
"@georapbox/modal-element": "~1.8.0",
"@georapbox/theme-toggle-element": "~4.0.2",
"@georapbox/web-share-element": "~3.1.1",
"bootstrap": "~5.3.3",
"emoji-picker-element": "~1.22.8",
"insert-text-at-cursor": "~0.3.0"
}
}
}
19 changes: 19 additions & 0 deletions src/css/main.css
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,25 @@ emoji-picker {
padding: 0 0.5rem 0.5rem 0.5rem;
}

/* Theme toggle */
theme-toggle {
position: absolute;
top: 0.5rem;
right: 0.5rem;
}

theme-toggle::part(base) {
padding: 0.5rem;
border-radius: var(--bs-border-radius);
font-size: 1.1429rem;
transition: background-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

theme-toggle::part(base):focus-visible {
outline: 0;
box-shadow: var(--focus-ring);
}

/* Utils */

.text-underline {
Expand Down
10 changes: 7 additions & 3 deletions src/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
<link rel="manifest" href="manifest.webmanifest">
<link rel="icon" sizes="192x192" href="assets/app-icons/favicon-192.png">
<link rel="apple-touch-icon" href="assets/app-icons/ios/180.png">
<script src="js/theme.js"></script>
<script src="js/register-service-worker.js" type="module"></script>
<script src="js/theme.js"></script>
<script src="js/index.js" type="module"></script>
</head>
<body class="bg-body-tertiary">
Expand All @@ -21,6 +21,8 @@
</div>
</noscript>

<theme-toggle storage-key="meme-generator/theme" no-label></theme-toggle>

<main>
<div class="errors-container">
<div class="container mt-2">
Expand All @@ -33,9 +35,11 @@
<header class="site-header">
<img src="assets/logo.png" width="90" height="90" alt="Logo" class="d-block rounded-circle border shadow-sm" aria-hidden="true">
<h1 class="page-title">Meme Generator</h1>
<p class="mb-0">
<p class="mb-0 d-inline-flex gap-2 align-items-center">
<svg aria-hidden="true" width="20" height="20" fill="currentColor" viewBox="0 0 16 16"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg>
Source code on <a href="https://github.com/georapbox/meme-generator" class="text-underline" target="_blank" rel="noopener noreferrer">Github</a>
<span>
Source code on <a href="https://github.com/georapbox/meme-generator" class="text-underline" target="_blank" rel="noopener noreferrer">Github</a>
</span>
</p>
</header>

Expand Down
8 changes: 8 additions & 0 deletions src/js/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'emoji-picker-element';
import insertTextAtCursor from 'insert-text-at-cursor';
import { CapturePhoto } from '@georapbox/capture-photo-element/dist/capture-photo-defined.js';
import { isWebShareSupported } from '@georapbox/web-share-element/dist/is-web-share-supported.js';
import '@georapbox/theme-toggle-element/dist/theme-toggle-defined.js';
import '@georapbox/web-share-element/dist/web-share-defined.js';
import '@georapbox/modal-element/dist/modal-element-defined.js';
import '@georapbox/files-dropzone-element/dist/files-dropzone-defined.js';
Expand Down Expand Up @@ -666,6 +667,13 @@ const handleCapturePhotoButtonClick = () => {
capturePhotoEl.capture();
};

const handlethemeChange = evt => {
const theme = evt.detail.theme;
const deviceTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
document.documentElement.setAttribute('data-bs-theme', theme === 'system' ? deviceTheme : theme);
};

document.addEventListener('tt-theme-change', handlethemeChange);
document.addEventListener('web-share:error', handleWebShareError);
document.addEventListener('capture-photo:video-play', handleCapturePhotoVideoPlay, { once: true });
document.addEventListener('capture-photo:error', handleCapturePhotoError);
Expand Down
39 changes: 33 additions & 6 deletions src/js/theme.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,37 @@
(function () {
const updateTheme = matches => {
document.documentElement.setAttribute('data-bs-theme', matches ? 'dark' : 'light');
};
function getStoredTheme() {
return window.localStorage.getItem('meme-generator/theme') || 'system';
}

const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
updateTheme(mediaQuery.matches);
function getDeviceTheme() {
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}

mediaQuery.addEventListener('change', e => updateTheme(e.matches));
function applyTheme(theme) {
const themeMap = {
dark: 'dark',
light: 'light',
system: getDeviceTheme()
};

document.documentElement.setAttribute('data-bs-theme', themeMap[theme] || themeMap.system);
}

function handleMatchMediaChange(evt) {
if (getStoredTheme() !== 'system') {
return;
}

applyTheme(evt.matches ? 'dark' : 'light');
}

try {
window
.matchMedia('(prefers-color-scheme: dark)')
.addEventListener('change', handleMatchMediaChange);

applyTheme(getStoredTheme());
} catch (err) {
console.error(err);
}
})();

0 comments on commit d873f86

Please sign in to comment.