Files
pybricks-code/src/index.scss
T
David Lechner 7924810b23 fix dialogs on android
Dialogs were off of the screen due to the overlays being bigger than
the view port. This is fixed by adding some style to limit the size.

Also multi-step dialogs are hard-coded to have min-width of 800px in
blueprints.js, so we need to override this on smaller screens.

Fixes: https://github.com/pybricks/support/issues/1271
2023-11-11 18:01:33 -06:00

265 lines
5.5 KiB
SCSS

// SPDX-License-Identifier: MIT
// Copyright (c) 2020-2023 The Pybricks Authors
// css files
@use 'normalize.css/normalize';
@use '@blueprintjs/core/lib/css/blueprint';
// sass files
@use 'sass:color';
@use 'sass:math';
@use 'variables' as pb;
@use '@blueprintjs/core/lib/scss/variables' as bp;
// use :focus-visible instead of :focus (so we don't need blueprint.js focus style manager)
:focus {
outline: none;
}
.#{bp.$ns}-control input:focus ~ .#{bp.$ns}-control-indicator {
outline: none;
.#{bp.$ns}-dark & {
outline: none;
}
}
// show focus for tree nodes even if mouse click it
.#{bp.$ns}-tree-node:focus:not(.pb-focus-managed),
// react-aria managed focus visibility
.pb-focus-ring,
// broswer managed focus visibility
:focus-visible:not(.pb-focus-managed) {
@include pb.focus-outline(0);
}
// these controls need extra separation for better visibility
.#{bp.$ns}-control input:focus-visible ~ .#{bp.$ns}-control-indicator {
@include pb.focus-outline(2px);
}
body {
// no scrolling of the page
overflow: hidden;
user-select: none;
width: 100%;
height: 100%;
position: absolute;
}
#root {
width: 100%;
height: 100%;
& [data-overlay-container] {
width: 100%;
height: 100%;
}
}
// Utility classes - do not use these in new code!
.h-100 {
height: 100%;
}
.no-wrap {
white-space: nowrap;
}
// shared styles
.pb-dropzone-root {
display: flex;
flex-direction: column;
align-items: center;
padding: bp.$pt-grid-size * 2;
border-width: 2;
border-radius: 2;
border-style: dashed;
border-color: bp.$pt-divider-black;
background-color: bp.$pt-app-background-color;
color: bp.$pt-text-color-muted;
outline: none;
transition: border 0.24s ease-in-out;
.#{bp.$ns}-dark & {
border-color: bp.$pt-dark-divider-white;
background-color: bp.$pt-dark-app-background-color;
color: bp.$pt-dark-text-color-muted;
}
}
.pb-spacer {
height: bp.$pt-grid-size * 2;
}
// global style tweaks
.#{bp.$ns}-toast {
user-select: text;
max-width: 700px;
&.#{bp.$ns}-intent-primary {
background-color: pb.$pybricks-blue;
& .#{bp.$ns}-button {
background-color: pb.$pybricks-blue !important;
&:hover {
background: color.adjust(pb.$pybricks-blue, $lightness: -5%) !important;
}
}
}
}
.#{bp.$ns}-button {
user-select: none;
&.#{bp.$ns}-intent-primary {
background: pb.$pybricks-blue;
&.#{bp.$ns}-minimal {
background: none;
}
&:hover {
background: color.adjust(pb.$pybricks-blue, $lightness: -5%);
}
&:disabled,
&.#{bp.$ns}-disabled {
background: rgba(pb.$pybricks-blue, 0.5);
}
}
&-text > img {
display: block;
}
&-group:not(.#{bp.$ns}-minimal) {
& > .#{bp.$ns}-popover-wrapper:not(:last-child) .#{bp.$ns}-button,
& > .#{bp.$ns}-button:not(:last-child) {
margin-right: 0px;
}
}
}
a.#{bp.$ns}-button {
text-align: left;
}
.#{bp.$ns}-dialog-footer-actions {
flex-wrap: wrap;
row-gap: 10px;
}
.#{bp.$ns}-control {
& input:checked ~ .#{bp.$ns}-control-indicator,
&.#{bp.$ns}-switch input:checked ~ .#{bp.$ns}-control-indicator {
background-color: pb.$pybricks-blue;
.#{bp.$ns}-dark & {
background-color: pb.$pybricks-blue;
}
}
// make disabled:checked radio buttons appear as not checked
&.#{bp.$ns}-radio input:disabled:checked ~ .#{bp.$ns}-control-indicator {
// color definition is same as $minimal-button-background-color-hover,
// which is used to define $control-background-color-disabled and
// $dark-control-background-color-disabled variables
background: rgba(bp.$gray3, 0.15);
&:before {
background-image: unset;
}
}
}
@media only screen and (max-height: 800px) {
.#{bp.$ns}-dialog {
min-width: unset !important;
}
}
.#{bp.$ns}-control-group {
gap: bp.$pt-grid-size * 0.5;
}
.#{bp.$ns}-form-group > .#{bp.$ns}-label {
font-weight: bolder;
}
.#{bp.$ns}-input-group {
& .#{bp.$ns}-icon {
margin: 7px;
&.#{bp.$ns}-intent-danger {
color: bp.$red4;
}
}
& .#{bp.$ns}-input-action {
bottom: 0;
display: flex;
align-items: center;
}
}
.#{bp.$ns}-overlay {
width: 100vw;
height: 100vh;
}
// don't take up so much space when there is no caret
.#{bp.$ns}-tree-node-caret-none {
// $pt-grid-size / 2 matches padding on .#{bp.$ns}-tree-node-conent
min-width: math.div(bp.$pt-grid-size, 2);
}
.#{bp.$ns}-running-text {
*:first-child {
margin-top: 0;
}
*:last-child {
margin-bottom: 0;
}
}
// make scrollbars fit our style
::-webkit-scrollbar {
width: 16px;
&-track {
background: bp.$pt-app-background-color;
.#{bp.$ns}-dark & {
background: bp.$pt-dark-app-background-color;
}
}
&-thumb {
border-width: 3px;
border-style: solid;
border-radius: 8px;
border-color: bp.$pt-app-background-color;
background: bp.$pt-icon-color;
&:hover {
background: bp.$pt-icon-color-hover;
}
.#{bp.$ns}-dark & {
border-color: bp.$pt-dark-app-background-color;
background: bp.$pt-dark-icon-color;
&:hover {
background: bp.$pt-dark-icon-color-hover;
}
}
}
}