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.
952 lines
20 KiB
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;
|
|
}
|