You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
orario/src/styles/main.scss

952 lines
20 KiB
SCSS

*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
}
body,
html {
width: 100%;
height: 100%;
}
// Theme
:root {
--bg-500: #ffffff;
--bg-selected-500: #f8f8f8;
--bg-highlight-500: #f0f0f0;
--border-400: #e8e8e8;
--border-500: #d8d8d8;
--border-600: #c0c0c0;
--border-highlight-500: #b0b0b0;
--border-selected-500: #909090;
--text-500: #282828;
--accent-100: #d6ffc2;
--accent-500: #6cc16c;
--accent-900: #244624;
--event-red: hsl(359, 100%, 85%);
--event-purple: hsl(274, 100%, 85%);
--event-blue: hsl(241, 100%, 85%);
--event-yellow: hsl(50, 100%, 85%);
--event-green: hsl(125, 100%, 85%);
--event-orange: hsl(25, 100%, 85%);
--event-lightlightblue: hsl(176, 100%, 85%);
--event-lightblue: hsl(198, 100%, 85%);
--bold-on-dark: 300;
}
body.dark-mode {
--bg-400: hsl(269, 24%, 3%);
--bg-500: hsl(269, 24%, 7%);
--bg-selected-500: hsl(276, 56%, 30%);
--bg-highlight-500: hsl(277, 66%, 35%);
--border-400: hsl(269, 40%, 45%);
--border-500: hsl(269, 60%, 30%);
--border-600: hsl(269, 80%, 35%);
--border-highlight-500: hsl(269, 80%, 50%);
--border-selected-500: #b66af6;
--text-500: #e6cff6;
--accent-100: hsl(269, 50%, 50%);
--accent-500: hsl(269, 40%, 70%);
--accent-900: hsl(269, 30%, 90%);
--event-red: hsl(359, 40%, 31%);
--event-purple: hsl(274, 40%, 31%);
--event-blue: hsl(241, 40%, 31%);
--event-yellow: hsl(50, 40%, 31%);
--event-green: hsl(125, 40%, 31%);
--event-orange: hsl(25, 40%, 31%);
--event-lightblue: hsl(176, 40%, 31%);
--bold-on-dark: 500;
}
$device-s-width: 900px;
// Elements
a,
a:visited {
color: var(--text-500);
font-weight: 400;
}
code {
font-size: 90%;
}
sup {
display: inline-block;
transform: translate(0, -0.25rem);
}
// Headings
$base-font-size: 18px;
$heading-scale: 1.25;
@function pow($number, $exponent) {
$value: 1;
@if $exponent > 0 {
@for $i from 1 through $exponent {
$value: $value * $number;
}
}
@return $value;
}
@for $i from 1 through 4 {
h#{$i} {
margin: 0;
$factor: pow($heading-scale, 4 - $i);
font-size: $base-font-size * $factor;
font-weight: 500;
&:not(:first-child) {
padding-top: 0.5rem * $factor;
}
line-height: 1;
display: flex;
align-items: center;
gap: 0.5rem;
}
}
button,
.button {
display: flex;
align-items: center;
justify-content: center;
gap: 0.25rem;
color: var(--text-500);
background: var(--bg-500);
border: 2px solid var(--border-400);
border-radius: 0.5rem;
font: inherit;
font-weight: 400;
padding: 0.5rem 1rem;
cursor: pointer;
position: relative;
overflow: hidden;
&:hover::after {
content: '';
position: absolute;
inset: 0;
background: #0000000c;
z-index: 1;
}
&.primary {
background: var(--accent-100);
border-color: var(--accent-500);
&:hover::after {
background: #00000020;
}
}
&.icon {
padding: 0.5rem;
width: 2.5rem;
height: 2.5rem;
}
&.flat {
border: none;
}
&.small {
padding: 0.25rem;
}
}
.input-combo {
display: flex;
// align-items: center;
justify-content: center;
height: 3rem;
background: var(--bg-500);
border: 2px solid var(--border-400);
border-radius: 0.5rem;
font-weight: 400;
// padding: 0.5rem 0.5rem 0.5rem 1rem;
user-select: none;
cursor: pointer;
position: relative;
select {
border: none;
background: none;
color: var(--text-500);
appearance: none;
font-family: inherit;
font-size: inherit;
font-weight: 300;
height: 100%;
padding-left: 1rem;
padding-right: 3rem;
width: 100%;
}
.icon {
position: absolute;
right: 0;
height: 100%;
width: calc(3rem - 4px);
display: grid;
place-content: center;
pointer-events: none;
}
}
// Components
.logo {
display: flex;
align-items: center;
& > img {
max-height: 2.5rem;
body.dark-mode & {
filter: hue-rotate(135deg) brightness(1.1);
}
}
gap: 0.25rem;
}
.popup-container {
position: absolute;
inset: 0;
z-index: 10;
background: #00000099;
max-width: 100%;
.popup-wrapper {
max-width: 100%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 1rem;
.popup {
@extend .panel;
// position: absolute;
// top: 50%;
// left: 50%;
// transform: translate(-50%, -50%);
display: flex;
flex-direction: column;
gap: 1rem;
box-shadow: 0 0 1.5rem #00000033;
.header {
display: flex;
align-items: center;
justify-content: space-between;
user-select: none;
.title {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 24px;
}
}
.content {
@extend .text-block;
width: 60ch;
max-width: 100%;
height: fit-content;
max-height: 60vh;
overflow-y: auto;
padding-bottom: 3rem;
}
max-width: 100%;
}
}
}
.compound {
display: flex;
.material-symbols-outlined {
font-size: 20px;
}
button,
.button {
border-radius: 0;
border-right: none;
padding-left: 0.75rem;
padding-right: 0.75rem;
height: 2.5rem;
&:first-child {
padding-left: 1rem;
border-top-left-radius: 0.5rem;
border-bottom-left-radius: 0.5rem;
}
&:last-child {
padding-right: 1rem;
border-top-right-radius: 0.5rem;
border-bottom-right-radius: 0.5rem;
border: 2px solid var(--border-400);
}
&.radio {
&.selected {
background: var(--accent-100);
border-color: var(--accent-500);
& + .radio {
border-left-color: var(--accent-500);
}
&:hover::after {
background: #00000018;
}
}
&.icon {
padding: 0 0.5rem;
}
}
}
}
// Extension Classes
.panel {
background: var(--bg-500);
border: 1px solid var(--border-500);
border-radius: 1rem;
padding: 1rem;
}
.text-block {
display: flex;
flex-direction: column;
gap: 0.5rem;
p {
line-height: 1.5;
.material-symbols-outlined {
font-size: 18px;
vertical-align: text-top;
}
}
ul {
padding: 0.5rem 0 0.5rem 1.5rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
}
// Structure
body {
background: var(--bg-400);
color: var(--text-500);
font-weight: 300;
font-family: 'Inter', sans-serif;
position: relative;
}
.toolbar {
@extend .panel;
padding: 1rem 0.75rem 1rem 1rem;
border-radius: 0;
border: none;
border-bottom: 1px solid var(--border-500);
height: 4rem;
display: flex;
align-items: center;
justify-content: space-between;
.option-group {
display: flex;
align-items: center;
gap: 0.75rem;
@media screen and (max-width: $device-s-width), (pointer: coarse) {
display: none;
}
}
}
.option-bar {
@extend .panel;
padding: 0.5rem;
border-radius: 0;
border: none;
border-bottom: 1px solid var(--border-500);
height: 4rem;
display: none;
align-items: center;
justify-content: center;
overflow-y: hidden;
overflow-x: auto;
max-width: 100%;
gap: 0.5rem;
@media screen and (max-width: $device-s-width), (pointer: coarse) {
display: flex;
}
.option-group {
display: flex;
align-items: center;
gap: 0.75rem;
}
}
.content {
height: calc(100vh - 4rem);
@media screen and (max-width: $device-s-width), (pointer: coarse) {
height: calc(100vh - 8rem);
}
.course-view {
padding: 1rem;
display: flex;
flex-direction: column;
align-items: center;
height: 100%;
overflow-y: scroll;
text-align: center;
gap: 1rem;
.no-courses-warning {
width: 100%;
display: flex;
flex-direction: column;
gap: 1rem;
align-items: center;
p {
text-align: center;
}
}
.wrap-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(30ch, 1fr));
gap: 1rem;
width: 100%;
max-width: 1200px;
.course {
@extend .panel;
display: flex;
flex-direction: column;
gap: 0.25rem;
flex-grow: 1;
position: relative;
cursor: pointer;
&.selected {
background: var(--bg-selected-500);
&::after {
content: '';
position: absolute;
inset: -1px;
border-radius: 1rem;
border: 3px solid var(--border-selected-500);
}
}
&.highlight {
background: var(--bg-highlight-500);
border-color: var(--border-highlight-500);
}
.title {
font-size: 24px;
}
.docenti {
font-size: 16px;
}
.events {
font-size: 18px;
}
}
}
}
.schedule-view {
height: 100%;
width: 100%;
max-width: 57rem;
margin: auto;
padding: 1rem 0.5rem;
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;
.no-courses-warning {
width: 100%;
display: flex;
flex-direction: column;
gap: 1rem;
align-items: center;
p {
text-align: center;
}
}
.schedule-card {
width: 100%;
.grid {
width: 100%;
display: grid;
border: 1px solid var(--border-600);
border-radius: 10px 10px 0 0;
@media screen and (max-width: $device-s-width),
(pointer: coarse) {
font-size: 12px;
}
.transpose-button,
.day-label,
.time-label {
display: flex;
align-items: center;
justify-content: center;
padding: 0.5rem;
}
.transpose-button {
width: 4rem;
height: 3rem;
}
.event-block-wrapper {
padding: 0.125rem;
.event-block {
width: 100%;
height: 100%;
position: relative;
.event-wrapper {
position: absolute;
top: 0%;
left: 0%;
padding: 0.125rem;
.event {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
background: var(--color);
border-radius: 10px;
font-weight: var(--bold-on-dark);
}
}
}
}
&.original {
grid-template-columns: auto repeat(5, 1fr);
grid-template-rows: min-content repeat(
var(--time-slots),
1fr
);
.transpose-button,
.day-label {
grid-column: var(--position);
grid-row: 1;
}
.time-label {
min-height: 5rem;
grid-column: 1;
grid-row: calc(var(--position) + 2) / span 4;
}
.day-line {
grid-column: var(--position);
grid-row: 1/-1;
width: 0px;
border-right: 1px solid var(--border-500);
}
.time-line {
grid-row: calc(var(--position) + 2);
grid-column: 1/-1;
height: 0px;
border-top: 1px dashed var(--border-500);
}
.event-block-wrapper {
grid-row: calc(var(--time-start) + 2) /
calc(var(--time-end) + 2);
grid-column: calc(var(--day-position) + 1);
.event-block {
.event-wrapper {
width: calc(100% / var(--of));
height: calc(
100% * var(--size) / var(--block-size)
);
transform: translateX(calc(100% * var(--index)))
translateY(
calc(
100% * var(--relative-start) /
var(--size)
)
);
}
}
}
}
&.transposed {
grid-template-rows: auto repeat(5, 1fr);
grid-template-columns: min-content repeat(
var(--time-slots),
1fr
);
.transpose-button,
.day-label {
grid-row: var(--position);
grid-column: 1;
}
.day-label {
min-height: 5rem;
}
.time-label {
grid-row: 1;
grid-column: calc(var(--position) + 2) / span 4;
}
.day-line {
grid-row: var(--position);
grid-column: 1/-1;
height: 0px;
border-top: 1px solid var(--border-500);
}
.time-line {
grid-column: calc(var(--position) + 2);
grid-row: 1/-1;
width: 0px;
border-right: 1px dashed var(--border-500);
}
.event-block-wrapper {
grid-column: calc(var(--time-start) + 2) /
calc(var(--time-end) + 2);
grid-row: calc(var(--day-position) + 1);
.event-block {
.event-wrapper {
height: calc(100% / var(--of));
width: calc(
100% * var(--size) / var(--block-size)
);
transform: translateY(calc(100% * var(--index)))
translateX(
calc(
100% * var(--relative-start) /
var(--size)
)
);
}
}
}
}
}
.legend {
display: grid;
grid-template-columns: min-content 1fr;
border: 1px solid var(--border-600);
border-radius: 0 0 10px 10px;
border-top: none;
padding: 1rem;
gap: 0.5rem 1rem;
align-items: center;
justify-content: center;
width: 100%;
.name {
width: 100%;
}
.color {
width: 2rem;
height: 1.5rem;
background-color: var(--color);
border-radius: 10px;
}
}
}
}
}
.overlay {
display: flex;
position: fixed;
bottom: 3rem;
right: 3rem;
// on mobile
@media screen and (max-width: $device-s-width), (pointer: coarse) {
bottom: 1rem;
right: 1rem;
}
gap: 0.5rem;
button {
width: 3rem;
height: 3rem;
border-radius: 100%;
.material-symbols-outlined {
font-size: 22px;
}
color: var(--accent-900);
box-shadow: 0 0.25rem 0.75rem #00000033;
}
animation: fade-in 150ms ease-in forwards;
}
.menu {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: var(--bg-500);
z-index: 10;
.header {
height: 4rem;
padding: 0.75rem 1rem 0.75rem 0.75rem;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1px solid var(--border-500);
.option-group {
display: flex;
gap: 0.5rem;
}
}
.options {
padding: 1rem;
display: grid;
grid-template-columns: auto 1fr;
gap: 1rem;
align-items: center;
.label {
font-weight: 400;
}
}
hr {
position: relative;
width: calc(100% - 2rem);
height: 1px;
left: 1rem;
background: var(--border-500);
border: none;
}
.help {
@extend .text-block;
padding: 1rem 1rem 2.5rem;
}
}
// not on mobile
@media screen and (min-width: $device-s-width) and (pointer: fine) {
.mobile {
display: none;
}
.menu {
display: none;
}
}
// on mobile
@media screen and (max-width: $device-s-width), (pointer: coarse) {
.toolbar {
padding: 0.75rem 1rem 0.75rem 0.75rem;
}
}
@media print {
// @page {
// size: A4 landscape;
// }
.toolbar,
.menu,
.overlay {
display: none;
}
.work-week-v-view {
overflow: visible;
}
}
@keyframes fade-in {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
.fade-out {
animation: fade-out 150ms ease-in forwards;
}
@keyframes fade-out {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
// Utilities
span.bold {
font-weight: 400;
}