MOBILE-4127 theme: Move mode classes to html tag
parent
2f02aaf149
commit
ef6a4ed7f4
|
@ -8,6 +8,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--mod-icon-filter: brightness(0) invert(1);
|
||||
}
|
||||
|
|
|
@ -152,6 +152,6 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--addon-calendar-blank-day-background-color: var(--gray-900);
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) ::ng-deep {
|
||||
:host-context(html.dark) ::ng-deep {
|
||||
ion-item.submissioneditable p {
|
||||
color: var(--danger-tint);
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
.addon-mod_h5pactivity-result-table-row.item:nth-child(even) {
|
||||
--background: var(--gray-900);
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
--background-odd: var(--light);
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--background-odd: var(--medium);
|
||||
}
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
.addon-mod_quiz-table {
|
||||
.addon-mod_quiz-highlighted,
|
||||
.item.addon-mod_quiz-highlighted,
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--grid-background: var(--gray-900);
|
||||
--even-background: var(--medium);
|
||||
}
|
||||
|
|
|
@ -56,7 +56,7 @@ $addon-mod-wiki-toc-level-padding: 12px !default;
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--addon-mod-wiki-newentry-link-color: var(--danger-tint);
|
||||
--addon-mod-wiki-toc-background-color: var(--medium);
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||
ngOnInit(): void {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
const win = <any> window;
|
||||
document.body.classList.add('ionic5');
|
||||
CoreDomUtils.toggleModeClass('ionic5', true);
|
||||
this.addVersionClass(MOODLEAPP_VERSION_PREFIX, CoreConstants.CONFIG.versionname.replace('-dev', ''));
|
||||
|
||||
CoreEvents.on(CoreEvents.LOGOUT, async () => {
|
||||
|
@ -255,24 +255,24 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||
// Execute the callback in the Angular zone, so change detection doesn't stop working.
|
||||
NgZone.run(() => {
|
||||
const isOnline = CoreNetwork.isOnline();
|
||||
const hadOfflineMessage = document.body.classList.contains('core-offline');
|
||||
const hadOfflineMessage = CoreDomUtils.hasModeClass('core-offline');
|
||||
|
||||
document.body.classList.toggle('core-offline', !isOnline);
|
||||
CoreDomUtils.toggleModeClass('core-offline', !isOnline);
|
||||
|
||||
if (isOnline && hadOfflineMessage) {
|
||||
document.body.classList.add('core-online');
|
||||
CoreDomUtils.toggleModeClass('core-online', true);
|
||||
|
||||
setTimeout(() => {
|
||||
document.body.classList.remove('core-online');
|
||||
CoreDomUtils.toggleModeClass('core-online', false);
|
||||
}, 3000);
|
||||
} else if (!isOnline) {
|
||||
document.body.classList.remove('core-online');
|
||||
CoreDomUtils.toggleModeClass('core-online', false);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const isOnline = CoreNetwork.isOnline();
|
||||
document.body.classList.toggle('core-offline', !isOnline);
|
||||
CoreDomUtils.toggleModeClass('core-offline', !isOnline);
|
||||
|
||||
// Set StatusBar properties.
|
||||
CoreApp.setStatusBarColor();
|
||||
|
@ -301,11 +301,9 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||
parts[1] = parts[1] || '0';
|
||||
parts[2] = parts[2] || '0';
|
||||
|
||||
document.body.classList.add(
|
||||
prefix + parts[0],
|
||||
prefix + parts[0] + '-' + parts[1],
|
||||
prefix + parts[0] + '-' + parts[1] + '-' + parts[2],
|
||||
);
|
||||
CoreDomUtils.toggleModeClass(prefix + parts[0], true);
|
||||
CoreDomUtils.toggleModeClass(prefix + parts[0] + '-' + parts[1], true);
|
||||
CoreDomUtils.toggleModeClass(prefix + parts[0] + '-' + parts[1] + '-' + parts[2], true);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -314,17 +312,13 @@ export class AppComponent implements OnInit, AfterViewInit {
|
|||
* @param prefix Prefix of to the class.
|
||||
*/
|
||||
protected removeVersionClass(prefix: string): void {
|
||||
const remove: string[] = [];
|
||||
|
||||
Array.from(document.body.classList).forEach((tempClass) => {
|
||||
if (tempClass.substring(0, 8) == prefix) {
|
||||
remove.push(tempClass);
|
||||
for (const versionClass of CoreDomUtils.getModeClasses()) {
|
||||
if (!versionClass.startsWith(prefix)) {
|
||||
continue;
|
||||
}
|
||||
});
|
||||
|
||||
remove.forEach((tempClass) => {
|
||||
document.body.classList.remove(tempClass);
|
||||
});
|
||||
CoreDomUtils.toggleModeClass(versionClass, false);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -52,6 +52,6 @@
|
|||
height: 0 !important;
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--button-color: var(--gray-100);
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
}
|
||||
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--button-background: rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
--background: var(--ion-item-background);
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--background: var(--medium);
|
||||
--color: var(--white);
|
||||
--button-color: var(--gray-200);
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--header-background: var(--gray-900);
|
||||
--odd-cell-background: var(--gray-800);
|
||||
--odd-cell-hover: var(--gray-600);
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
@if ($core-login-button-outline-dark) {
|
||||
form ion-button {
|
||||
--background: white;
|
||||
|
|
|
@ -459,9 +459,10 @@ export class CoreSettingsHelperProvider {
|
|||
* @param enable True to enable dark mode, false to disable.
|
||||
*/
|
||||
protected toggleDarkMode(enable: boolean = false): void {
|
||||
const isDark = document.body.classList.contains('dark');
|
||||
const isDark = CoreDomUtils.hasModeClass('dark');
|
||||
|
||||
if (isDark !== enable) {
|
||||
document.body.classList.toggle('dark', enable);
|
||||
CoreDomUtils.toggleModeClass('dark', enable);
|
||||
this.darkModeObservable.next(enable);
|
||||
|
||||
CoreApp.setStatusBarColor();
|
||||
|
|
|
@ -57,6 +57,6 @@
|
|||
|
||||
}
|
||||
|
||||
:host-context(body.dark) {
|
||||
:host-context(html.dark) {
|
||||
--popover-background: var(--gray-700);
|
||||
}
|
||||
|
|
|
@ -1945,6 +1945,38 @@ export class CoreDomUtilsProvider {
|
|||
return this.waitForResizeDone(windowWidth, windowHeight, retries+1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether a CSS class indicating an app mode is set.
|
||||
*
|
||||
* @param className Class name.
|
||||
* @return Whether the CSS class is set.
|
||||
*/
|
||||
hasModeClass(className: string): boolean {
|
||||
return document.documentElement.classList.contains(className);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get active mode CSS classes.
|
||||
*
|
||||
* @return Mode classes.
|
||||
*/
|
||||
getModeClasses(): string[] {
|
||||
return Array.from(document.documentElement.classList);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle a CSS class in the root element used to indicate app modes.
|
||||
*
|
||||
* @param className Class name.
|
||||
* @param enable Whether to add or remove the class.
|
||||
*/
|
||||
toggleModeClass(className: string, enable?: boolean): void {
|
||||
document.documentElement.classList.toggle(className, enable);
|
||||
|
||||
// @deprecated since 4.1
|
||||
document.body.classList.toggle(className, enable);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -7,7 +7,7 @@ core-format-text {
|
|||
--core-format-text-viewer-icon-background: rgba(255, 255, 255, .5);
|
||||
}
|
||||
|
||||
body.dark core-format-text {
|
||||
html.dark core-format-text {
|
||||
--core-format-text-viewer-icon-background: rgba(0, 0, 0, .5);
|
||||
}
|
||||
|
||||
|
@ -633,7 +633,7 @@ ion-header.ios h1 core-format-text {
|
|||
}
|
||||
}
|
||||
|
||||
body.dark core-format-text select,
|
||||
body.dark core-rich-text-editor .core-rte-editor select {
|
||||
html.dark core-format-text select,
|
||||
html.dark core-rich-text-editor .core-rte-editor select {
|
||||
background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%23FFFFFF%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E');
|
||||
}
|
||||
|
|
|
@ -25,17 +25,15 @@
|
|||
// Generates the color classes and variables based on the
|
||||
// colors map
|
||||
|
||||
@mixin generate-color($color-name, $colors) {
|
||||
$base: map-get($colors, $color-name);
|
||||
$light: map-get($base, 'light');
|
||||
@mixin generate-color($color-name, $colors, $theme) {
|
||||
$color-themes: map-get($colors, $color-name);
|
||||
$base: map-get($color-themes, $theme);
|
||||
|
||||
@include generate-color-variants($color-name, $light);
|
||||
|
||||
body.dark {
|
||||
$dark: map-get($base, 'dark');
|
||||
$dark: mix($light, white, 80%) !default;
|
||||
@include generate-color-variants($color-name, $dark);
|
||||
@if $theme == 'dark' {
|
||||
$base: mix(map-get($color-themes, 'light'), white, 80%) !default;
|
||||
}
|
||||
|
||||
@include generate-color-variants($color-name, $base);
|
||||
}
|
||||
|
||||
@mixin generate-color-variants($color-name, $base) {
|
||||
|
@ -210,7 +208,7 @@
|
|||
@mixin darkmode() {
|
||||
$root: #{&};
|
||||
|
||||
@at-root #{add-root-selector($root, "body.dark")} {
|
||||
@at-root #{add-root-selector($root, "html.dark")} {
|
||||
@content;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* Light Theme
|
||||
* -------------------------------------------
|
||||
*/
|
||||
:root {
|
||||
html {
|
||||
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,6 @@
|
|||
* Dark Theme
|
||||
* -------------------------------------------
|
||||
*/
|
||||
:root body.dark {
|
||||
html.dark {
|
||||
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* http://ionicframework.com/docs/theming/
|
||||
*/
|
||||
|
||||
:root body.dark {
|
||||
html.dark {
|
||||
|
||||
// Ionic shades, defined for ionic internal use.
|
||||
--ion-color-step-0: var(--black);
|
||||
|
@ -30,6 +30,10 @@
|
|||
--ion-color-step-950: var(--gray-100);
|
||||
--ion-color-step-1000: var(--white);
|
||||
|
||||
@each $color-name, $unused in $colors {
|
||||
@include generate-color($color-name, $colors, 'dark');
|
||||
}
|
||||
|
||||
--ion-background-color: #{$background-color-dark};
|
||||
--ion-background-color-rgb: #{$background-color-dark-rgb};
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* http://ionicframework.com/docs/theming/
|
||||
*/
|
||||
|
||||
:root {
|
||||
html {
|
||||
|
||||
// Color palette
|
||||
--black: #{$black};
|
||||
|
@ -44,7 +44,7 @@
|
|||
--ion-color-step-1000: var(--black);
|
||||
|
||||
@each $color-name, $unused in $colors {
|
||||
@include generate-color($color-name, $colors);
|
||||
@include generate-color($color-name, $colors, 'light');
|
||||
}
|
||||
|
||||
// Accessibility vars.
|
||||
|
|
Loading…
Reference in New Issue