@import "./globals.scss"; html.force-safe-area-margins { --ion-safe-area-left: 40px; --ion-safe-area-right: 40px; --ion-safe-area-top: 40px; --ion-safe-area-bottom: 40px; } html { --zoom-level: 100%; zoom: var(--zoom-level); &.ios { font-size: var(--zoom-level); } } a { color: var(--core-link-color); cursor: pointer; } html[dir=rtl] { --rotate-expandable: rotate(-90deg); } // Common styles. .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .clearfix { &:after { content: ""; display: table; clear: both; } } .core-bold { font-weight: bold; } .img-responsive { display: block; max-width: 100%; &[height] { height: auto; } } .opacity-hide { opacity: 0; } .core-big { font-size: 115%; } .invisible { visibility: hidden; } .flex { display: flex; } .inline-block { display: inline-block; } .block { display: block; } .flex-row { display: flex; flex-direction: row; } .margin-bottom-sm { margin-bottom: 8px; } .margin-bottom-md { margin-bottom: 12px; } .font-bold { font-weight: bold; } .font-italic { font-style: italic; } .font-lg { font-size: 1.7rem; } .font-sm { font-size: 1.2rem; } @each $color-name, $unused in $colors { .text-#{$color-name}, p.text-#{$color-name} { color: var(--ion-color-#{$color-name}) !important; } } // Ionic toolbar on header. ion-toolbar { --min-height: var(--core-header-toolbar-height); } ion-tabs.hide-header ion-header { display: none; } ion-footer { background-color: var(--contrast-background); > ion-toolbar:only-child { top: 1px; } } // Buttons. ion-button, ion-fab-button, button, [role="button"] { text-transform: none; min-height: var(--a11y-sizing-minTargetSize); min-width: var(--a11y-sizing-minTargetSize); &.button-large { min-height: 2.8em; min-width: 2.8em } } ion-fab-button { --box-shadow: 0 3px 5px -1px rgb(0 0 0 / 20%), 0 6px 10px 0 rgb(0 0 0 / 14%), 0 1px 18px 0 rgb(0 0 0 / 12%); } [role="button"], .clickable { cursor: pointer; [disabled], [aria-disabled="true"] { cursor: default; opacity: .4; pointer-events: none; } } button[disabled] { cursor: default; opacity: .4; pointer-events: none; } ion-button.core-button-as-link { text-decoration: underline; font-size: inherit; font-weight: normal; letter-spacing: normal; white-space: break-spaces; } button.as-link { display: inline; min-height: auto; min-width: auto; color: var(--core-link-color); background: none; border: 0; line-height: inherit; margin: 0; padding: 0; text-align: start; font-size: inherit; } // Ionic alert. ion-alert.core-alert-network-error .alert-head, div.core-iframe-network-error { position: relative; content: " "; background: url("/assets/fonts/font-awesome/solid/wifi.svg") no-repeat 50% 50%; margin: 25px auto; h2 { @include sr-only(); } &::after { content: " "; position: absolute; top: -20%; right: -15%; width: 50%; height: 50%; background-color: var(--danger); -webkit-mask: url("/assets/fonts/font-awesome/solid/triangle-exclamation.svg") no-repeat 50% 50%; mask: url("/assets/fonts/font-awesome/solid/triangle-exclamation.svg") no-repeat 50% 50%; } } [dir=rtl] ion-alert.core-alert-network-error .alert-head::after, [dir=rtl] div.core-iframe-network-error::after { right: unset; left: -15%; } ion-alert.core-nohead .alert-head, ion-alert .alert-head:empty { padding-bottom: 0; } @keyframes scaleFrom0 { from { /* More performant than animating `width` */ transform: scaleX(0); } } ion-alert .alert-button.timed-button{ position: relative; &::before { content: ''; position: absolute; width: 100%; left: 0; right: 0; bottom: 0; top: 0; background-color: var(--primary-tint); animation: scaleFrom0 10s forwards linear; transform-origin: left; @include rtl() { transform-origin: right; } z-index: -1; } } ion-alert { --border-radius: var(--modal-radius); &.md, &.ios { --max-width: 80%; @include media-breakpoint-up(md) { --max-width: 384px; } } .alert-wrapper { overflow: auto; border-radius: var(--border-radius) !important; button.alert-button.alert-button-role-destructive { color: var(--danger); } } .alert-message { user-select: text; flex-shrink: 0; ion-card { margin: 0; margin-top: 10px; } } } // Ionic list. ion-list { padding: 0 !important; } // Safe areas .safe-area-padding, .safe-area-padding-horizontal { @include padding-horizontal(var(--ion-safe-area-left), var(--ion-safe-area-right)); } .safe-area-margin, .safe-margin-horizontal { @include margin-horizontal(var(--ion-safe-area-left), var(--ion-safe-area-right)); } .ion-padding.safe-area-padding-horizontal { @include safe-area-padding-horizontal(16px, 16px); } .ion-margin.safe-margin-horizontal { @include safe-area-margin-horizontal(16px, 16px); } ion-tabs.placement-side .tabs-inner { --ion-safe-area-left: 0px; } ion-tabs.placement-bottom .tabs-inner { --ion-safe-area-bottom: 0px; } core-tabs, core-tabs-outlet { swiper-slide { --background: var(--core-tab-background); --color: var(--core-tab-color); --border-color: var(--core-tab-border-color); --color-active: var(--core-tab-color-active); --border-color-active: var(--core-tab-border-color-active); --color-selected: var(--border-color-active); --font-weight-active: var(--core-tab-font-weight-active); } } core-split-view.menu-and-content { .menu { --ion-safe-area-right: 0px; } .content-outlet { --ion-safe-area-left: 0px; } } // Iframe fullscreen manage. // Using router outlet to avoid changing styles on modals. body.core-iframe-fullscreen ion-router-outlet { .core-course-header, ion-tab-bar { display: none !important; } ion-tab-bar.mainmenu-tabs { display: none; // Restore original safe area. .tabs-inner { @supports (padding-left: constant(safe-area-inset-left)) { --ion-safe-area-left: constant(safe-area-inset-left); } @supports (padding-left: env(safe-area-inset-left)) { --ion-safe-area-left: env(safe-area-inset-left); } } } .ion-page ion-header { --core-header-toolbar-height: 48px; --core-header-toolbar-color: white; --core-header-toolbar-background: black; --core-header-buttons-background: var(--core-header-toolbar-background); --core-header-buttons-color: var(--core-header-toolbar-color); --core-header-toolbar-border-width: 0px; ion-toolbar { h1, ion-back-button { display: none; } } } @media screen and (orientation: landscape) { // Place ion-header on the side and hide text .ion-page { flex-direction: row-reverse; ion-header { width: calc(var(--core-header-toolbar-height) + var(--ion-safe-area-right)); @include safe-area-padding-horizontal(null, 0px); background: var(--core-header-toolbar-background); ion-toolbar { padding: 0; height: 100%; --padding-start: 0px; --padding-end: 0px; } ion-buttons { flex-direction: column-reverse; } } } core-tabs-outlet { width: 100%; } } } // Modals. .core-modal-fullscreen::part(content) { position: absolute; @include position(0 !important, null, null, 0 !important); display: block; width: 100% !important; height: 100% !important; } .core-modal-transparent { &::part(backdrop) { backdrop-filter: blur(8px); } &::part(content) { backdrop-filter: blur(12px); --background: rgb(10 10 10 / 20%); ion-content { --background: transparent !important; } position: absolute; @include position(0 !important, null, null, 0 !important); display: block; width: 100% !important; height: 100% !important; } } .core-modal-force-on-top { z-index: 100000 !important; } .core-modal-lateral { --ion-safe-area-left: 0px; --ion-safe-area-right: 0px; &::part(content) { @include margin-horizontal(var(--modal-lateral-margin), null); position: absolute; @include position(0 !important, 0 !important, 0 !important, unset !important); display: block; height: 100% !important; width: calc(100% - var(--modal-lateral-margin)); max-width: calc(var(--modal-lateral-max-width)); box-shadow: 0 28px 48px rgb(0 0 0 / 40%); } &::part(backdrop) { visibility: visible; } .modal-shadow { display: none; } } .core-modal-transparent-no-filter { @extend .core-modal-transparent; &::part(backdrop) { backdrop-filter: none; } &::part(content) { backdrop-filter: none; } } @each $breakpoint, $width in $screen-breakpoints { .core-modal-lateral-#{$breakpoint} { --modal-lateral-max-width: #{$width}; } } .core-password-modal { --border-radius: var(--mdl-shape-borderRadius-sm); --min-width: auto; --min-height: 300px; --width: 384px; --height: auto; form { display: flex; flex-direction: column; height: 100%; justify-content: space-between; } } // Hidden submit button. .core-submit-hidden-enter { position: absolute; visibility: hidden; left: -1000px; } // Note on foot of ion-input. .item .core-input-footnote { width: 100%; font-style: italic; margin-top: 0; margin-bottom: 10px; font-size: var(--text-size); } // Item styles [aria-current="page"], .item.item-current { @include safe-area-border-start(var(--selected-item-border-width), solid, var(--selected-item-color)); > * { --ion-safe-area-left: 0px; } &::part(native) { --ion-safe-area-left: 0px; } } // Extra text colors. .text-gray { color: var(--gray-500); } // Card styles @each $color-name, $unused in $colors { // Message cards. ion-card.core-#{$color-name}-card { --color-tint: var(--ion-color-#{$color-name}-tint); --color-shade: var(--ion-color-#{$color-name}-shade); --border-width: 0; --border-color: var(--color-tint); --border-radius: var(--mdl-shape-borderRadius-sm); --background: var(--color-tint); --color: var(--color-shade); ion-item.item { --background: var(--color-tint); --color: var(--color-shade); --inner-border-width: 0px; --border-width: 0px; font-size: var(--text-size); &.item-label > ion-label, &.item-label > ion-label > p { --color: var(--color-shade); } > ion-icon[slot] { color: var(--color-shade); @include margin-horizontal(null, 16px); } } ion-label { white-space: normal !important; } } ion-item.item.core-#{$color-name}-item { --color-base: var(--ion-color-#{$color-name}); --color-shade: var(--ion-color-#{$color-name}-shade); --border-width: 0 0 3px 0; --border-color: var(--color-base); --inner-border-width: 0px; > ion-icon[slot] { color: var(--color-base); } } .item.core-#{$color-name}-item { --color-base: var(--ion-color-#{$color-name}); --color-shade: var(--ion-color-#{$color-name}-shade); --border-width: 0 0 3px 0; --border-color: var(--color-base); --inner-border-width: 0px; > ion-icon[slot] { color: var(--color-base); } } .core-iframe-fullscreen ion-card.core-#{$color-name}-card, .core-iframe-fullscreen .item.core-#{$color-name}-item { opacity: 0 !important; height: 0 !important; } ion-icon.ion-color-#{$color-name} { --ion-color-base: var(--ion-color-#{$color-name}); color: var(--ion-color-base); } } // Avatar // ------------------------- // Large centered avatar img.large-avatar, .large-avatar img { display: block; margin: 8px auto; width: var(--core-large-avatar-size); height: var(--core-large-avatar-size); max-width: var(--core-large-avatar-size); max-height: var(--core-large-avatar-size); border-radius: 50%; background-color: transparent; } ion-avatar.large-avatar { width: var(--core-large-avatar-size); height: var(--core-large-avatar-size); } ion-avatar ion-img, ion-avatar img { text-indent: -99999px; background-color: var(--gray-200); } // Wait to load before showing the image. img[core-external-content]:not([src]) { visibility: hidden; } .core-course-module-handler:not(.addon-mod-label-handler) .item-heading .filter_mathjaxloader_equation div { display: inline !important; } .section-summary core-format-text img { border-radius: var(--mdl-shape-borderRadius-lg); } ion-list.core-course-module-list-wrapper, .list-item-limited-width, .core-course-module-list-wrapper, ion-content.limited-width > :not([slot]) { max-width: var(--list-item-max-width); margin-left: auto !important; margin-right: auto !important; } ion-content.limited-width > :not([slot]) { display: flex; flex-direction: column; min-height: 100%; } .limited-width > core-loading:not([slot]), .menu > core-loading:not([slot]) { &.core-loading-loaded { --contents-display: flex; flex-direction: column; } min-height: 100%; } // Radio. ion-radio, input[type=radio], .select-alert .alert-radio-icon { --border-radius: 50%; --border-width: 2px; --outer-border-width: 2px; --border-style: solid; --size: 20px; &:not(.ion-color) { --color: var(--text-color); --color-checked: var(--color); } } .ios ion-radio, .ios input[type=radio], .select-alert.ios .alert-radio-icon { --border-width: 1px; --outer-border-width: 1px; } .ios ion-radio { &::part(container) { width: var(--size); height: var(--size); margin: 0px; border-radius: var(--border-radius); border-width: var(--outer-border-width); border-style: var(--border-style); border-color: var(--color); } &::part(mark) { border-radius: var(--inner-border-radius); width: calc(50% + var(--outer-border-width)); height: calc(50% + var(--outer-border-width)); transform: scale3d(0, 0, 0); transition: transform 280ms cubic-bezier(.4, 0, .2, 1); background: var(--contrast-background); border: 0 !important; } &.radio-checked { &::part(container) { border-color: var(--color); background: var(--color); } &::part(mark) { transform: scale3d(1, 1, 1); } } } // Checkbox. ion-checkbox, input[type=checkbox] { --border-radius: 2px; --border-width: 2px; --outer-border-width: 2px; --border-style: solid; --size: 20px; &:not(.ion-color) { --border-color-checked: var(--text-color); --checkbox-background-checked: var(--text-color); --checkmark-color: var(--contrast-background); } } .ios input[type=checkbox] { --outer-border-width: 1px; } ion-badge { line-height: 1.1; padding: 2px 8px; border-radius: var(--mdl-shape-borderRadius-lg); } // File uploader. .action-sheet-button input.core-fileuploader-file-handler-input { position: absolute; top: 0; bottom: 0; left: 0; right: 0; min-width: 100%; opacity: 0; z-index: 100; cursor: pointer; } .core-anchor, core-format-text a { color: var(--core-link-color); cursor: pointer; text-decoration: underline; } core-block ion-item-divider .core-button-spinner { display: flex; align-items: center; @include margin-horizontal(10px); ion-badge.core-course-download-courses-progress { @include margin(null, 12px, null, null); } } // Horizontal scrolling elements .core-horizontal-scroll { display: block; overflow-x: scroll; .safe-area-pseudo-padding-start { @include padding-horizontal(var(--ion-safe-area-left), 0px); } .safe-area-pseudo-padding-end { @include padding-horizontal(0px, var(--ion-safe-area-right)); } } // Text formats. // Highlight text. mark, .matchtext { background-color: var(--text-hightlight-background-color); } // Monospaced font. .core-monospaced { font-family: var(--mdl-typography-monospace-font); } .core-iframe-offline-disabled { display: none !important; } .core-scanning-qr { .ion-page, ion-modal::part(content) { background-color: transparent !important; --background: transparent; } ion-content, ion-backdrop, ion-modal:not(.core-modal-fullscreen), ion-tabs { display: none !important; } } // Hide virtual utilities. .core-browser-copy-area { display: none; } // Different levels of padding. @for $i from 0 through 15 { .core-padding-#{$i} { @include padding(null, null, null, 15px * $i + 16px); } } details summary { pointer-events: auto; cursor: pointer; } textarea { min-height: var(--a11y-sizing-minTargetSize); } textarea:not([core-auto-rows]) { height: 200px; } // Hide close button because when present is read on voice over. ion-fab[core-fab] { ion-fab-button::part(close-icon) { display: none; } } // The following 4 selectors can probably be removed after Ionic migration to 7+ ion-fab.fab-horizontal-start { left: calc(10px + var(--ion-safe-area-right, 0px)); } [dir=rtl] ion-fab.fab-horizontal-start { right: calc(10px + var(--ion-safe-area-right, 0px)); left: unset } ion-fab.fab-horizontal-end { right: calc(10px + var(--ion-safe-area-right, 0px)); } [dir=rtl] ion-fab.fab-horizontal-end { left: calc(10px + var(--ion-safe-area-right, 0px)); right: unset } ion-content.has-collapsible-footer ion-fab { bottom: calc(var(--core-collapsible-footer-height, 0px) + 10px); @include core-transition(all, 200ms); } .core-media-adapt-width { max-width: 100%; } img.core-media-adapt-width { height: auto; } audio.core-media-adapt-width { width: 100%; } // Disabled items. ion-item.item-disabled, ion-button.button-disabled, ion-item.item-interactive-disabled:not(.item-multiple-inputs) ion-label, ion-datetime.datetime-disabled { opacity: .65 !important; } ion-item-divider.item, ion-item.item, td { .expandable-status-icon { font-size: 1.125rem; @include core-transition(transform, 200ms); @include margin-horizontal(null, 16px); &.expandable-status-icon-expanded { transform: var(--rotate-expandable); } } } // Change default outline. .ion-activatable, .clickable, .ion-focusable.ion-focused, .ion-selectable { @include core-focus-background(); } :not(.hydrated):not(.native-input):not(.native-textarea) { // Not an ionic component. @include core-focus-outline(); } ion-input, ion-input input, ion-textarea, core-rich-text-editor { --placeholder-color: var(--ion-placeholder-color); --placeholder-opacity: .65; } // Disable scroll on parent ion contents to enabled PTR on the ones inside the splitview. See split-view component for more info. ion-content.disable-scroll-y::part(scroll) { touch-action: auto; overflow-y: hidden; overscroll-behavior-y: auto; z-index: auto; will-change: auto; } iframe { flex-grow: 1; border: 0; display: block; max-width: 100%; background-color: var(--ion-background-color); } @if ($core-login-hide-need-help) { .core-login-need-help { display: none !important; } } ion-grid.core-no-grid > ion-row { display: block; } .core-underheader { position: absolute; top: 0; left: 0; right: 0; } .core-footer-shadow [collapsible-footer] { box-shadow: var(--drop-shadow-top, none); clip-path: inset(-8px 0px 0px 0px); // Only show shadow at top. } [collapsible-footer] { transition: box-shadow 0.5s; width: 100%; bottom: 0; z-index: 3; display: block; background-color: var(--core-collapsible-footer-background); .ion-margin { margin-top: 8px; margin-bottom: 8px; } &.is-active { height: var(--core-collapsible-footer-height, auto); @include core-transition(all, 200ms); &.footer-collapsed { --core-collapsible-footer-height: 0; opacity: 0; } &.has-module-nav.footer-collapsed { --core-collapsible-footer-height: auto; opacity: 1; core-course-module-navigation { height: 0; opacity: 0; @include core-transition(all, 200ms); } } &.footer-expanded { --core-collapsible-footer-height: auto; } } } .keyboard-is-open ion-content { --core-collapsible-footer-height: 0px !important; [collapsible-footer] { height: 0; } } .core-iframe-fullscreen [collapsible-footer] { opacity: 0 !important; height: 0 !important; } @include media-breakpoint-up(md) { .adaptable-buttons-row, .adaptable-buttons-row-reverse { display: flex; flex-direction: row; ion-button { flex: 1; } } // Buttons will be in reverse order when horizontal. .adaptable-buttons-row-reverse { flex-direction: row-reverse; } } .has-spacer, .core-flex-fill { display: flex; flex-direction: column; min-height: 100%; flex-grow: 1; .spacer-top { flex-grow: 1; align-content: flex-end; } .spacer { flex-grow: 1; } } .core-flex-no-grow { flex-grow: 0; } // Loader animation. .core-loading { position: relative; background-color: var(--loader-background-color); color: transparent; // Hide contents. overflow: hidden; display: var(--loader-display); border-radius: var(--loader-radius); @include core-transition(all, 200ms); min-height: 8px; min-width: 50px; // Hide contents. > * { opacity: 0; @include core-transition(opacity, 200ms); } &::after { content: ''; position: absolute; left: -45%; height: 100%; width: 45%; background-image: linear-gradient(to left, rgb(var(--loader-shine) / 5%), rgb(var(--loader-shine) / 30%), rgb(var(--loader-shine) / 60%), rgb(var(--loader-shine) / 30%), rgb(var(--loader-shine) / 5%)); animation: loading 1s infinite; display: block; top: 0; bottom: 0; } } // Fix subtitles wider than video. video::-webkit-media-text-track-display { white-space: normal !important; } ion-modal { &.show-modal { @media only screen and (min-width: 768px) and (min-height: 600px) { --border-radius: var(--modal-radius); } } &.ion-datetime-button-overlay { --border-radius: var(--modal-radius); } &.core-modal-lateral, &.core-modal-fullscreen { --border-radius: 0px; } &.core-modal-no-background { --background: transparent; --box-shadow: none !important; pointer-events: none; &::part(backdrop) { display: none; } } &.modal-sheet::part(handle) { background: var(--core-header-buttons-color); } } /* * This is to solve popver issue in chrome 114 * For more info see: https://github.com/ionic-team/ionic-framework/issues/27599 */ [popover].popover-viewport { display: initial; position: initial; margin: initial; border: initial; background: initial; padding: initial; width: initial; height: initial; overflow: initial; inset: initial; color: initial; } /** * https://github.com/ionic-team/ionic-framework/blob/6ffbdbb3b2b69290cf25753d535bc7483bd7c6e8/BREAKING.md#css-utilities */ [hidden] { display: none !important; } // Ion Datetime ion-item.item-label-stacked ion-datetime-button { margin-top: 8px; margin-bottom: 8px; align-self: self-end; } ion-datetime-button p { margin-top: 4px; margin-bottom: 4px; } .x-scrollable { overflow-x: auto; display: block; } // Table App styles table.core-table { border-collapse: collapse; line-height: 20px; width: 98%; margin: 1em auto; color: var(--text-color); thead th { vertical-align: bottom; font-weight: bold; font-size: 14px; background-color: var(--core-table-header-background); } tbody { th { font-weight: normal; } td { font-size: 16px; } } th, td { padding: 8px; white-space: normal; text-align: start; } tr { border-bottom: 1px solid var(--core-table-border-color); } .odd { --cell-background: var(--core-table-odd-cell-background); --cell-hover: var(--core-table-odd-cell-hover); } .even { --cell-background: var(--core-table-even-cell-background); --cell-hover: var(--core-table-even-cell-hover); } .odd, .even { td, th, th[aria-current="page"] { background-color: var(--cell-background); &:hover { background-color: var(--cell-hover); } } } tbody.auto-striped { tr:nth-child(odd) { background-color: var(--core-table-odd-cell-background); &:hover { background-color: var(--core-table-even-odd-hover); } } tr:nth-child(even) { background-color: var(--core-table-even-cell-background); &:hover { background-color: var(--core-table-even-cell-hover); } } } .ion-no-border { border: 0 !important; } .dimmed_text, .hidden { opacity: .7; } }