Files
Luke Street a748d0d848 Add PSP platform
Resolves #26
2026-03-08 17:43:15 -06:00

606 lines
12 KiB
SCSS

@use "sass:map";
$breakpoints: (
// Small (landscape phones)
// Font size: 17px
sm:
(
breakpoint: 576px,
viewport: 510px,
root-font-size: 106.25%,
),
// Medium (tablets)
// Font size: 18px
md:
(
breakpoint: 768px,
viewport: 700px,
root-font-size: 112.5%,
),
// Large
// Font size: 19px
lg:
(
breakpoint: 1024px,
viewport: 950px,
root-font-size: 118.75%,
),
// Max out at lg breakpoint
xl:
(
breakpoint: 1024px,
viewport: 950px,
root-font-size: 118.75%,
),
xxl:
(
breakpoint: 1024px,
viewport: 950px,
root-font-size: 118.75%,
),
);
@use "@picocss/pico/scss/pico" with (
$theme-color: "azure",
$breakpoints: $breakpoints,
$enable-semantic-container: true,
$enable-classes: true,
$modules: (
// Theme
"themes/default": true,
// Layout
"layout/document": true,
"layout/landmarks": true,
"layout/container": true,
"layout/section": true,
"layout/grid": true,
"layout/overflow-auto": false,
// Content
"content/link": true,
"content/typography": true,
"content/embedded": true,
"content/button": true,
"content/table": false,
"content/code": true,
"content/figure": false,
"content/miscs": true,
// Forms
"forms/basics": true,
"forms/checkbox-radio-switch": true,
"forms/input-color": true,
"forms/input-date": false,
"forms/input-file": true,
"forms/input-range": false,
"forms/input-search": false,
// Components
"components/accordion": true,
"components/card": true,
"components/dropdown": true,
"components/group": true,
"components/loading": true,
"components/modal": false,
"components/nav": true,
"components/progress": false,
"components/tooltip": false,
// Utilities
"utilities/accessibility": true,
"utilities/reduce-motion": true
)
);
@use "@picocss/pico/scss/colors" as *;
@media (min-width: map.get(map.get($breakpoints, "md"), "breakpoint")) {
:root {
scrollbar-gutter: stable both-edges;
}
}
[data-theme=light],
:root:not([data-theme=dark]) {
--pico-code-kbd-color: #000;
--pico-code-kbd-background-color: #fff;
--progress-background-color: #{rgba($slate-100, 0.75)};
--progress-stripe-color: rgba(0, 0, 0, 0.15);
--text-shadow: none;
}
@mixin pico-theme-dark {
--pico-background-color: #181c25;
--pico-card-background-color: #1b1f29;
--pico-dropdown-background-color: #1b1f29;
--pico-code-kbd-color: #fff;
--pico-code-kbd-background-color: #333;
--progress-background-color: #{rgba($slate-800, 0.75)};
--progress-stripe-color: rgba(255, 255, 255, 0.15);
--text-shadow: 0px 1px 2px var(--text-shadow-color, oklab(0% 0 0/.2)),
0px 3px 2px var(--text-shadow-color, oklab(0% 0 0/.2)),
0px 4px 8px var(--text-shadow-color, oklab(0% 0 0/.2));
}
[data-theme=dark] {
@include pico-theme-dark;
}
@media only screen and (prefers-color-scheme: dark) {
:root:not([data-theme]) {
@include pico-theme-dark;
}
}
@font-face {
font-family: 'icons';
src: url('../assets/icons.woff2') format('woff2');
font-weight: normal;
font-style: normal;
font-display: block;
}
[class^="icon-"], [class*=" icon-"] {
font-size: 0.9em;
line-height: 1em;
&:before {
display: inline-block;
width: 1em;
font-family: "icons";
font-style: normal;
font-weight: normal;
font-variant: normal;
text-decoration: inherit;
text-align: center;
text-transform: none;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
.icon-history:before { content: '\e800'; }
.icon-cog:before { content: '\e801'; }
.icon-theme-light-dark:before { content: '\e802'; }
.icon-chart-line:before { content: '\e803'; }
.icon-github:before { content: '\e804'; }
.icon-left-open:before { content: '\e805'; }
.icon-right-open:before { content: '\e806'; }
.icon-copy:before { content: '\e807'; }
.icon-cancel:before { content: '\e808'; }
.icon-code:before { content: '\e809'; }
.icon-gc:before { content: '\ea00'; }
.icon-wii:before { content: '\ea01'; }
.icon-n64:before { content: '\ea02'; }
.icon-gba:before { content: '\ea03'; }
.icon-nds:before { content: '\ea04'; }
.icon-switch:before { content: '\ea05'; }
.icon-ps:before { content: '\ea06'; }
.icon-ps2:before { content: '\ea07'; }
.icon-xbox360:before { content: '\ea08'; }
.icon-3ds:before { content: '\ea09'; }
.icon-xbox:before { content: '\ea0a'; }
.icon-win32:before { content: '\ea0b'; }
.icon-psp:before { content: '\ea0c'; }
// Override the tooltip component
[data-tooltip]:not(a, button, input) {
border-bottom: none;
cursor: pointer;
}
nav > ul {
white-space: nowrap;
text-overflow: ellipsis;
&:first-child {
> li:first-child * {
color: var(--pico-contrast);
}
> li:not(:last-child):after {
display: inline-block;
width: 0;
vertical-align: baseline;
content: "/";
padding-left: 10px;
}
@media (max-width: map.get(map.get($breakpoints, "lg"), "breakpoint")) {
> li:has(+ .md):after {
display: none;
}
}
@media (max-width: map.get(map.get($breakpoints, "md"), "breakpoint")) {
> li:not(:first-child) {
display: none;
}
> li:not(:last-child):after {
display: none;
}
}
}
}
#theme-toggle {
font-size: 1.33rem;
vertical-align: middle;
text-decoration: none;
}
pre {
scrollbar-width: thin;
}
$progress-height: 2rem;
.progress-root {
display: flex;
height: $progress-height;
overflow: hidden;
border-radius: var(--pico-border-radius);
background-color: var(--progress-background-color);
margin-bottom: var(--pico-spacing);
pointer-events: auto;
box-shadow: var(--pico-box-shadow);
.progress-section.striped {
background-image: linear-gradient(
45deg,
var(--progress-stripe-color) 25%,
transparent 25%,
transparent 50%,
var(--progress-stripe-color) 50%,
var(--progress-stripe-color) 75%,
transparent 75%,
transparent);
background-size: calc(1.25rem) calc(1.25rem);
background-repeat: repeat;
}
&.code {
.progress-section:nth-of-type(1) {
background-color: $jade-400;
}
.progress-section:nth-of-type(2) {
background-color: $jade-500;
}
.progress-section:nth-of-type(3),
.progress-section.fuzzy {
background-color: transparent;
}
}
&.data {
.progress-section:nth-of-type(1) {
background-color: $azure-400;
}
.progress-section:nth-of-type(2) {
background-color: $azure-500;
}
}
}
@media (prefers-reduced-motion: reduce) {
.progress-root .progress-section.striped {
animation: none;
}
}
$unit-size: 0.75rem;
.units-root {
display: flex;
flex-flow: row wrap;
margin-bottom: var(--pico-spacing);
.unit {
width: $unit-size;
height: $unit-size;
background-color: #333;
&:hover {
border: 1px solid #fff;
}
}
}
.muted {
color: var(--pico-muted-color);
a {
color: var(--pico-muted-color);
}
}
#treemap {
width: 100%;
aspect-ratio: 2 / 1;
margin-bottom: var(--pico-spacing);
touch-action: none;
// Accessed via JS
--font-weight: normal;
--font-size: 0.875rem;
--font-family: var(--pico-font-family);
--tooltip-background: var(--pico-contrast-background);
--tooltip-color: var(--pico-contrast-inverse);
}
.project {
position: relative;
z-index: 0;
pointer-events: none;
border-radius: var(--pico-border-radius);
contain: content;
overflow: hidden;
transition: box-shadow var(--pico-transition);
text-shadow: var(--text-shadow);
a, [title] {
cursor: pointer;
pointer-events: auto;
user-select: none;
}
// Move the focus ring to the outer container, otherwise
// contain: content or overflow: hidden will clip it
&:has(> .project-link:focus) {
box-shadow: 0 0 0 var(--pico-outline-width) var(--pico-primary-focus);
}
}
.project-link {
position: absolute;
inset: 0;
z-index: -1;
// See above
&:focus {
box-shadow: none;
}
}
.project-image-container {
position: absolute;
inset: 0;
z-index: -1;
overflow: hidden;
contain: strict;
}
.project-image {
object-fit: cover;
width: 100%;
height: 100%;
opacity: 0.1;
transition: all .5s ease;
filter: blur(3px);
transform: scale(1);
will-change: transform;
}
.project {
&:hover, &:focus-within {
.project-image {
transform: scale(1.02);
opacity: 0.3;
filter: blur(0);
}
}
}
.project-header {
display: flex;
align-items: center;
gap: var(--pico-spacing);
margin-bottom: var(--pico-typography-spacing-vertical);
.project-title {
flex: 1 1 auto;
margin-bottom: 0;
text-wrap: balance;
}
.platform-icon {
font-size: 1.5rem;
align-self: start;
}
}
@media (max-width: map.get(map.get($breakpoints, "lg"), "breakpoint")) {
.md {
display: none !important;
}
}
@media (min-width: map.get(map.get($breakpoints, "lg"), "breakpoint")) {
.sm {
display: none !important;
}
}
.title-group {
margin-top: calc(var(--pico-block-spacing-vertical) * 2);
}
blockquote {
text-wrap: balance;
}
body > footer {
display: flex;
justify-content: space-between;
// Log out button
form {
display: inline;
input[type="submit"] {
padding: .3em;
margin: 0;
background: none;
border: none;
width: auto;
font-size: .875em;
height: auto;
}
}
}
@media (max-width: map.get(map.get($breakpoints, "md"), "breakpoint")) {
body > footer {
flex-flow: column;
align-items: center;
}
}
#tooltip {
--arrow-size: 0.3rem;
position: absolute;
z-index: 99;
opacity: 0;
padding: 0.25rem 0.5rem;
border-radius: var(--pico-border-radius);
background: var(--pico-contrast-background);
color: var(--pico-contrast-inverse);
white-space: nowrap;
pointer-events: none;
transition: opacity .1s ease, left .1s ease, top .1s ease;
margin-top: calc(var(--arrow-size) * -1);
font-style: normal;
font-weight: var(--pico-font-weight);
font-size: .875rem;
&::after {
content: "";
position: absolute;
display: block;
border-top: var(--arrow-size) solid var(--pico-contrast-background);
border-left: var(--arrow-size) solid transparent;
border-right: var(--arrow-size) solid transparent;
top: 100%;
left: calc(var(--arrow-left) - var(--arrow-size));
z-index: 100;
transition: left .1s ease;
}
}
@media (prefers-reduced-motion: reduce) {
#tooltip, #tooltip::after {
transition: none;
}
}
.info-card {
background-color: $azure-500;
color: $white;
}
.warning-card {
background-color: $pumpkin-550;
color: $white;
}
.error-card {
background-color: $red-650;
color: $white;
}
.loading-container {
display: flex;
justify-content: center;
margin: var(--pico-spacing);
}
.actions {
float: right;
position: relative;
margin-inline-start: 1em;
.dropdown {
summary {
&::after {
margin-inline-start: 0;
transform: none;
height: 100%;
}
}
ul li {
text-align: left;
}
}
}
details.dropdown {
clear: right;
summary + ul {
max-height: 50vh;
overflow-y: auto;
}
}
.repo-link {
float: right;
margin-inline-start: 1em;
}
label:has(> input[type="checkbox"]) {
margin-bottom: var(--pico-spacing);
}
.platform-grid {
margin-top: calc(var(--pico-block-spacing-vertical) * -2);
}
.platform-dropdown {
margin: 0;
li.platform-item {
display: flex;
padding: 0 !important;
flex: 1;
label {
flex: 1;
display: flex;
align-items: center;
gap: 0.5em;
margin: 0;
padding-inline-start: var(--pico-spacing);
.platform-icon {
color: var(--pico-form-element-color);
font-size: 2em;
}
}
button {
padding: 0.25em 0.5em;
margin: 0.25em;
margin-inline-end: var(--pico-spacing);
}
.count-badge {
font-size: 0.8em;
background: var(--pico-code-kbd-background-color);
color: var(--pico-code-kbd-color);
border-radius: 1em;
min-width: 1.5em;
height: 1.5em;
padding: 0 0.5em;
text-align: center;
}
}
}
.mt-spacing {
margin-top: var(--pico-spacing);
}