pxt-core
Version:
Microsoft MakeCode provides Blocks / JavaScript / Python tools and editors
950 lines (873 loc) • 26.5 kB
text/less
/* Import all components */
@import 'themes/default/globals/site.variables';
@import 'themes/pxt/globals/site.variables';
/* Reference import */
@import (reference) "semantic.less";
@carouselArrowSize: 60px;
@carouselArrowSizeTablet: 40px;
@carouselArrowSizeMobile: 20px;
@homeCarouselArrowZIndex: @homeScreenZIndex+1; /* Show the carousel above the home screen */
@homeDetailViewZIndex: @homeCarouselArrowZIndex+1; /* Show the detail view above the carousel arrows */
@homeDetailViewSelectedCardZIndex: @homeDetailViewZIndex+1; /* Show the card arrow above the detail view */
@homeFooterZIndex: @homeCarouselArrowZIndex+1;
// Fade looks odd as anything other than black, so it's intentionally hardcoded separate from the theme.
// Active dot color is also hardcoded for contrast, but non-active outline color and fill color can still be themed.
@heroBannerGradientColor: rgba(0,0,0,1);
@heroBannerDotOutlineColor: var(--pxt-neutral-alpha50);
@heroBannerDotOutlineAtiveColor: rgba(255, 255, 255, .75);
#homescreen {
background: var(--pxt-neutral-background1);
color: var(--pxt-neutral-foreground1);
z-index: @homeScreenZIndex;
user-select: none;
}
.projectsdialog {
position: relative;
height: 100%;
overflow: auto;
z-index: @homeScreenZIndex+1;
.accessibleMenu {
z-index: @homeScreenZIndex+3 ;
.ui.item:focus, .ui.button:focus {
z-index: @homeScreenZIndex+2 ;
}
}
.ui.segment.getting-started-segment {
border: 0;
margin-top: -2.1rem ;
margin-bottom: 2.1rem ;
padding: 0;
border-radius: 0;
background-repeat: no-repeat;
background-size: cover;
height: 300px;
.column {
padding: 0 ;
}
.getting-started {
padding: @carouselArrowSize;
margin-top: 70px;
}
}
.ui.segment.getting-started-segment.hero {
-webkit-transition: background-image 0.5s ease-in;
transition: background-image 0.5s ease-in;
overflow: hidden;
.hero-banner-contents {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 20rem;
display: flex;
flex-direction: column;
justify-content: center;
margin-left: @carouselArrowSize;
}
.description {
display: flex;
align-items: flex-end;
width: 20rem;
height: 6.5rem;
overflow-y: auto;
font-size: 1.5rem;
font-weight: 600;
color: @white;
p {
flex-grow: 0;
max-height: 100%;
}
}
.action {
margin: 1rem 0;
a:focus-visible, button:focus-visible {
outline-width: 4px ;
outline-style: solid;
outline-color: var(--pxt-neutral-stencil3);
}
}
.dots {
align-self: flex-start;
border-radius: 50px;
line-height: 0;
margin-top: 8px;
&:focus-visible {
outline-width: 3px ;
outline-style: solid;
outline-color: white;
outline-offset: 4px;
}
button {
transition: background-color 0.5s;
border: 2px solid @heroBannerDotOutlineColor;
margin-right: 1.25rem;
&.active {
border-color: @heroBannerDotOutlineAtiveColor;
background-color: transparent;
}
&:last-child {
margin-right: 0px;
}
}
}
.gradient-overlay {
position: relative;
height: 100%;
width: 40rem;
top: 0;
left: 0;
background: linear-gradient(to right, @heroBannerGradientColor 0%, rgba(0, 0, 0, 0) 100%);
}
}
.content {
height: 100%;
}
.ui.segment.tabsegment {
padding: 0;
padding-top: calc(@mainMenuHeight + 2rem) ;
margin: 0;
border: 0;
width: 100%;
min-height: 100%;
background: var(--pxt-target-background1);
color: var(--pxt-target-foreground1);
}
.ui.segment.gallerysegment {
background: none;
border: none;
box-shadow: none;
padding: 0rem;
margin: 0;
.ui.header {
margin: 0;
padding-left: @carouselArrowSize;
font-size: 20px;
color: var(--pxt-target-foreground1);
&.myproject-header {
cursor: pointer;
outline: none;
> .view-all-button {
margin-left: 1.5em;
color: var(--pxt-primary-background);
font-size: 14px;
font-weight: 500;
border-bottom: 1px solid var(--pxt-neutral-alpha0);
transition: border-color 400ms ease;
&:hover, &:focus {
border-color: var(--pxt-primary-background);
}
&:focus-visible {
outline-width: @homeCardBorderSize ;
outline-style: solid;
outline-color: var(--pxt-focus-border);
outline-offset: 2px;
}
}
}
}
.heading {
display: flex;
align-items: flex-end;
justify-content: space-between;
margin-bottom: -1rem ;
margin-top: 1rem ;
}
.column {
padding: 0 ;
}
.column.right.aligned {
padding-right: @carouselArrowSize ;
}
}
.import-dialog-btn {
position: relative;
z-index: 1; /* Move up so it's above the carousel container that has an offset margin */
&:focus-visible {
outline-width: @homeCardBorderSize ;
outline-style: solid;
outline-color: var(--pxt-focus-border);
outline-offset: 2px;
}
}
/* Footer, Privary, Terms of Use */
.homefooter {
left: 0;
right: 0;
width: 100%;
text-align: center;
padding: 5px ;
z-index: @homeFooterZIndex;
position: absolute;
.item {
font-size: 0.8rem ;
color: var(--pxt-neutral-foreground1) ;
.icon {
color: var(--pxt-neutral-foreground1) ;
}
}
.item.copyright {
display: block;
font-size: 0.7rem ;
line-height: 15px ;
}
}
.ui.card:hover {
border: @homeCardBorderSize solid var(--pxt-neutral-background1) ;
background-color: var(--pxt-neutral-background1);
transform: scale(1.1);
}
.header {
user-select: none;
}
.carouselitem.selected {
.ui.card {
border: @homeSelectedCardBorderSize solid var(--pxt-neutral-background1) ;
z-index: @homeDetailViewSelectedCardZIndex;
}
.ui.card:hover {
transform: none;
}
.ui.card:after, .ui.card:before {
top: 100%;
left: 50%;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
}
.ui.card:after {
border-color: var(--pxt-neutral-alpha0);
border-top-color: var(--pxt-neutral-background1);
border-width: 10px;
margin-left: -10px;
}
.ui.card:before {
border-color: var(--pxt-neutral-alpha0);
border-top-color: var(--pxt-neutral-stencil3);
border-width: 17px;
margin-left: -17px;
}
}
.detailview {
margin-top: -2rem;
transition: height 0.5s;
z-index: @homeDetailViewZIndex;
position: relative;
overflow: hidden;
.ui.grid {
background: var(--pxt-neutral-background3);
}
.column {
height: 15rem;
}
.segment {
margin: 0;
padding-left: @carouselArrowSize;
margin-top: 2rem;
}
.imagewrapper {
position: absolute;
top: 0; right: 0;
left: 30%; bottom: 0;
padding: 0;
overflow:hidden;
.image {
height: 400px;
background-size: cover;
}
.video {
width: 100%;
background-size: cover;
}
}
.imagewrapper:after {
content: " ";
position: absolute;
pointer-events: none;
top: 0; left: 0; bottom: 0; right: 0;
background: linear-gradient(90deg, var(--pxt-neutral-background3), var(--pxt-neutral-alpha0));
}
.header {
font-size: 20px;
color: var(--pxt-neutral-foreground3);
margin-bottom: 1rem;
}
.detail {
color: var(--pxt-neutral-foreground3);
}
.yt-button {
display: inline-block;
border-radius: 0.5rem;
background-color: var(--pxt-primary-background);
}
.ui.grid.stackable .actions {
padding-right: 4rem ;
position: relative;
bottom: 0;
text-align: right;
.segment {
white-space: nowrap;
padding: 0;
}
.card-action {
display: inline-block;
position: relative;
margin: 0 0 0 1rem;
text-align: center;
border: 5px solid transparent;
border-radius: 0.75rem;
overflow: hidden;
transition-duration: 0.1s;
> .item, > .icon {
background: var(--pxt-target-background1);
color: var(--pxt-target-foreground1);
height: 8rem;
}
.button.attached i {
display: block;
margin: auto ;
opacity: 0.65;
color: var(--pxt-neutral-foreground1);
// These three have text in front of the icons, so leave them faint.
&.blocks, &.js, &.py {
opacity: 0.05;
}
}
.button.attached .icon:not(.xicon) {
margin: 0 auto;
font-size: 5rem;
line-height: 8rem;
}
.button.approve {
width: 100%;
color: var(--pxt-neutral-foreground3);
background-color: var(--pxt-primary-background);
transition-duration: 0s;
}
}
.card-action-title {
position: absolute;
top: 40%;
left: 50%;
font-size: 1.43rem;
font-weight: 700;
color: var(--pxt-neutral-foreground1);
transform: translateX(-50%) translateY(-50%);
pointer-events: none;
}
.card-action:hover {
cursor: pointer;
border-color: var(--pxt-focus-border);
.ui.button {
filter: none;
}
.ui.button:first-child:hover {
z-index: auto;
}
}
.card-action:focus-within {
border-color: var(--pxt-focus-border);
}
.card-action:hover {
transform: scale(1.1);
}
.card-action.custom-icon i.xicon {
font-size: 6.5rem;
padding-top: 3.5rem;
}
/* custom icons (override font to avoid mac/windows alignment issue) */
.card-action:not(.custom-icon) .xicon:before {
visibility: hidden;
}
.card-action:not(.custom-icon) i.xicon {
background: transparent @blocksIcon no-repeat center center;
background-size: 70%;
background-blend-mode: color-burn;
font-size: 6.5rem;
&.py {
background-image: @pyIcon;
}
&.js {
background-image: @jsIcon;
}
}
/* unset semantic properties */
.card-action > a:first-child {
padding: 0;
display: inline-block;
width: 100%;
}
.card-action .button {
border: none;
outline: none;
box-shadow: none;
margin: 0;
}
}
> .closeIcon {
margin: 1.5rem;
position: absolute;
top: 0;
right: 0;
z-index: 1;
}
>.closeIcon .remove.icon {
font-size: 2.15rem;
line-height: 2.15rem;
cursor: pointer;
width: 2.15rem;
color: var(--pxt-neutral-foreground3);
height: 2.15rem;
transition: all 0.15s ease-out;
opacity: 0.9;
border-radius: 50%;
background-color: var(--pxt-neutral-background3);
}
> .closeIcon .remove.icon:hover, > .closeIcon .remove.icon:focus {
opacity: 1;
transform: scale(1.1, 1.1);
box-shadow: 0 0 0 3px var(--pxt-neutral-alpha20);
}
}
.tutorial-progress.not-finished {
background-color: var(--pxt-primary-background) ;
color: var(--pxt-primary-foreground) ;
}
}
.scriptmanager .ui.cards, .projectsdialog {
.ui.card {
margin-right: 5px;
border-radius: @homeCardBorderRadius;
color: var(--pxt-neutral-foreground1);
border: @homeCardBorderSize solid var(--pxt-neutral-stencil2) ;
background-color: var(--pxt-neutral-background1);
.ui.image, .ui.imagewrapper, .content {
border-radius: @homeCardImageBorderRadius ;
.tags {
color:var(--pxt-neutral-foreground2);
font-size: 1rem;
}
}
.header {
color: var(--pxt-neutral-foreground1);
}
.meta {
color: var(--pxt-neutral-foreground1);
}
}
.ui.card:focus {
border: 2px solid transparent;
outline-width: @homeCardBorderSize ;
outline-style: solid;
outline-color: var(--pxt-focus-border);
}
}
.ui.fullscreen.modal.scriptmanager > .content, .projectsdialog {
background: var(--pxt-target-background1);
color: var(--pxt-target-foreground1);
}
/* Carousel */
.carouselouter {
position: relative;
}
.carouselcontainer {
overflow: hidden;
padding: 2rem @carouselArrowSize ;
}
.carouselbody {
overflow-y: visible;
touch-action: pan-y;
}
.carouselitem {
float: left;
}
.carouselarrow {
z-index: @homeCarouselArrowZIndex;
position: absolute;
display: block;
height: 100%;
width: @carouselArrowSize;
font-size: @carouselArrowSize / 1.18 ;
line-height: 1;
cursor: pointer;
background: var(--pxt-target-background1);
color: var(--pxt-primary-background);
top: 0;
opacity: 0.7;
overflow: hidden;
outline: none;
}
.carouselarrow:hover, .carouselarrow:focus {
opacity: 1;
transition: opacity .1s ease-out 0s;
.icon {
transform: scale(1.4);
transition: transform .1s ease-out 0s;
}
}
.carouselarrow:focus {
outline: solid 3px var(--pxt-primary-background);
}
.carouselarrow .icon {
top: 40%;
position: absolute;
}
.carouselarrow.left {
left: 0rem;
}
.carouselarrow.right {
right: 0rem;
}
.gallerysegment .ui.card, .gallerysegment .ui.cards .card {
background-color: var(--pxt-neutral-background1);
color: var(--pxt-neutral-foreground1);
&:hover, &:focus {
background-color: var(--pxt-neutral-background1) ;
color: var(--pxt-neutral-foreground1) ;
border-color: var(--pxt-neutral-background1) ;
}
}
/* Inverted */
.inverted-theme {
.projectsdialog .detailview .actions {
.card-action {
> .item, > .icon {
background: var(--pxt-neutral-background1);
color: var(--pxt-neutral-foreground1);
}
.button.approve {
color: var(--pxt-primary-foreground);
}
i.xicon {
filter: invert(1);
}
}
}
}
/* <= Tablet (Mobile + Tablet) */
@media only screen and (max-width: @largestTabletScreen) {
/* Carousel */
.projectsdialog {
.ui.segment.getting-started-segment {
background-position: left center;
height: 250px;
.getting-started {
padding: @carouselArrowSizeTablet;
margin-top: 40px;
}
.getting-started-header {
font-size: 40px;
}
&.hero .hero-banner-contents {
margin-left: @carouselArrowSizeTablet;
}
}
.ui.segment.tabsegment {
padding-top: calc(@mobileMenuHeight + 2rem) ;
}
.gallerysegment {
.column {
padding: 0 ;
}
.column.right.aligned {
padding-right: @carouselArrowSizeTablet ;
}
.ui.header {
padding-left: @carouselArrowSizeTablet;
}
}
.detailview {
.actions .card-action {
max-width: 10rem;
.button.attached .icon:not(.xicon) {
line-height: 6rem;
}
}
.actions .card-action > .item,
.actions .card-action > .icon {
height: 6rem;
max-width: 10rem;
background-size: 60%;
}
.actions .segment {
margin-top: 4rem;
margin-right: 2rem;
}
.ui.button.approve {
font-size: 1rem;
padding: 0.7rem 1rem;
}
}
}
.carouselcontainer {
padding: 2rem @carouselArrowSizeTablet ;
}
.carouselarrow {
width: @carouselArrowSizeTablet;
font-size: @carouselArrowSizeTablet / 1.18 ;
}
.projectsdialog {
.ui.card, .ui.cards>.card {
width: 200px;
}
}
}
/* Mobile only */
@media only screen and (max-width: @largestMobileScreen) {
/* Carousel */
.projectsdialog {
.ui.segment.getting-started-segment {
height: 10rem;
margin-bottom: 0.5rem ;
.getting-started-header {
font-size: 30px;
}
.getting-started {
padding: @carouselArrowSizeMobile;
}
&.hero .hero-banner-contents {
margin-left: @carouselArrowSizeMobile;
.description {
width: 12rem;
height: 4rem;
font-size: 1rem;
}
.dots {
display: none;
}
}
}
.ui.segment.tabsegment {
padding-top: calc(@mobileMenuHeight + 2rem) ;
}
.gallerysegment {
.column.right.aligned {
padding-right: @carouselArrowSizeMobile ;
}
.ui.header {
padding-left: @carouselArrowSizeMobile;
}
}
.carouselitem.selected {
.ui.card {
margin-top: -8px;
border-width: 5px;
}
}
}
.carouselcontainer {
padding: 2rem @carouselArrowSizeMobile ;
}
.carouselarrow {
width: @carouselArrowSizeMobile;
font-size: @carouselArrowSizeMobile / 1.18 ;
}
.projectsdialog {
.ui.card.buttoncard {
.content {
padding: 1rem;
}
.header {
font-size: 12pt ;
}
}
.ui.card.example {
.ui.huge.label {
font-size: 1rem;
}
.ui.image, .ui.cardimage {
height: 6rem;
}
.content .header {
font-size: 1rem;
}
.ui.image~.content {
height: 2.4rem;
padding: 0.7rem;
}
.ui.image~.content.tall {
height: 3rem;
.tags {
font-size: .8rem;
}
}
}
.ui.card.file {
.content .header {
font-size: 1rem;
}
.content {
margin-left: 0;
}
.meta {
font-size: 0.7rem;
padding: 0.5rem;
}
}
.carouselcontainer {
padding: 1.5rem @carouselArrowSizeMobile ;
}
.detailview {
.column:first-child {
height: 10.5rem;
overflow: hidden;
}
.actions {
height: 9rem;
padding-right: 4rem ;
.card-action {
> .item, > .icon {
height: 2rem;
}
.xicon {
background-image: none;
}
.button.approve {
padding: .35em 1em .5em;
}
.button.attached .icon:not(.xicon) {
font-size: 2rem;
line-height: 2rem;
}
&:first-child {
margin-left: 0;
}
&:last-child {
margin-right: 0;
}
}
.card-action-title {
top: 25%;
font-size: 1rem;
}
.segment {
position: absolute;
bottom: 0;
right: 0;
margin: 0 1rem 0.5rem;
white-space: normal;
}
}
}
}
.hero.dots {
display: none;
}
}
@media only screen and (max-height: @tallEditorBreakpoint) and (min-width: @largestMobileScreen) {
.ui.segment.tabsegment {
padding-top: calc(@thinMenuHeight + 2rem) ;
}
.projectsdialog {
.ui.card, .ui.cards>.card {
width: 15rem;
height: 9rem;
white-space: nowrap;
}
.ui.card.buttoncard {
.content {
padding: 1rem;
}
.header {
font-size: 12pt ;
}
i.icon.huge {
font-size: 3rem;
}
}
.ui.card.example {
.ui.huge.label {
font-size: 1rem;
}
.ui.image, .ui.cardimage {
height: 6rem;
}
.content .header {
font-size: 1rem;
}
.ui.image~.content {
height: 2.4rem;
padding: 0.7rem;
}
}
.ui.card.file {
.content .header {
font-size: 1rem;
}
.content {
margin-left: 0;
}
.meta {
padding: 0.5rem;
}
.fileimage {
top: 2rem;
left: 1rem;
width: 2rem;
height: 1.5rem;
}
}
.detailview.visible {
.column,
.imagewrapper .image
{
height: 220px;
}
}
.ui.segment.getting-started-segment {
margin-top: -3.1rem;
margin-bottom: 0rem;
height: 168px;
&.hero .hero-banner-contents {
.description {
width: 12rem;
height: 4rem;
font-size: 1rem;
}
.dots {
display: none;
}
}
}
}
}
/*******************************
Projects Modal
*******************************/
.projectsdialog {
.ui.dividing.header, .content > .header{
font-weight: normal ;
}
.ui.secondary.inverted.pointing.menu {
border: 0;
}
.group {
padding: 1rem;
}
.group .cards .card .button.iconcontent {
min-height: 4em;
}
.labelsgroup {
display: block;
position: relative;
min-height: 18em;
}
h2.editorname {
top: 20%;
width: calc(100% - 2rem);
text-align: center;
position: absolute;
display: block;
}
.loader.editoravatar {
display: block;
position: absolute;
top: 50%;
}
> .content {
padding: 0 ;
position: relative;
}
}