*, *::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; }