Compare commits
1 Commits
main
...
feat-admin
| Author | SHA1 | Date |
|---|---|---|
|
|
d358825da7 | 1 year ago |
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 110,
|
||||||
|
"singleQuote": true,
|
||||||
|
"quoteProps": "consistent",
|
||||||
|
"tabWidth": 4,
|
||||||
|
"useTabs": false,
|
||||||
|
"semi": false,
|
||||||
|
"arrowParens": "avoid"
|
||||||
|
}
|
||||||
@ -1,27 +0,0 @@
|
|||||||
/** @type {import("prettier").Config} */
|
|
||||||
export default {
|
|
||||||
printWidth: 120,
|
|
||||||
singleQuote: true,
|
|
||||||
quoteProps: 'consistent',
|
|
||||||
tabWidth: 4,
|
|
||||||
useTabs: false,
|
|
||||||
semi: false,
|
|
||||||
arrowParens: 'avoid',
|
|
||||||
|
|
||||||
plugins: ['prettier-plugin-astro'],
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
files: '*.astro',
|
|
||||||
options: {
|
|
||||||
parser: 'astro',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: '*.{yml,yaml,json}',
|
|
||||||
excludeFiles: 'package-lock.json',
|
|
||||||
options: {
|
|
||||||
tabWidth: 2,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
@ -1,11 +1,3 @@
|
|||||||
{
|
{
|
||||||
"npm.packageManager": "bun",
|
"npm.packageManager": "bun"
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
||||||
"[astro]": {
|
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
||||||
},
|
|
||||||
"[yaml]": {
|
|
||||||
"editor.tabSize": 2,
|
|
||||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 877 KiB |
|
Before Width: | Height: | Size: 1.2 MiB |
|
Before Width: | Height: | Size: 2.8 MiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 645 KiB |
|
Before Width: | Height: | Size: 1.8 MiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 262 KiB |
|
Before Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 342 KiB |
|
Before Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 608 KiB |
|
Before Width: | Height: | Size: 295 KiB |
@ -1,119 +0,0 @@
|
|||||||
import { useEffect, useState } from 'preact/hooks'
|
|
||||||
import { FunnelIcon } from '@phosphor-icons/react'
|
|
||||||
import { marked } from 'marked'
|
|
||||||
|
|
||||||
import extendedLatex from '@/client/lib/marked-latex'
|
|
||||||
|
|
||||||
marked.use(
|
|
||||||
extendedLatex({
|
|
||||||
lazy: false,
|
|
||||||
render: (formula: string, display: boolean) => {
|
|
||||||
return display ? '$$' + formula + '$$' : '$' + formula + '$'
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
|
|
||||||
import type { Database } from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
const useRemoteValue = <T,>(url: string): T | null => {
|
|
||||||
const [value, setValue] = useState<T | null>(null)
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
fetch(url)
|
|
||||||
.then(response => response.json())
|
|
||||||
.then(value => setValue(value))
|
|
||||||
.catch(error => console.error(error))
|
|
||||||
}, [url])
|
|
||||||
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
course: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export const DomandeEsamiCourse = ({ course }: Props) => {
|
|
||||||
const database = useRemoteValue<Database>(`/domande-esami/api/${course}.json`)
|
|
||||||
if (!database) {
|
|
||||||
return <>Loading...</>
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('requestIdleCallback' in window) {
|
|
||||||
// @ts-ignore
|
|
||||||
requestIdleCallback(() => window.renderMath())
|
|
||||||
} else {
|
|
||||||
// @ts-ignore
|
|
||||||
setTimeout(() => window.renderMath(), 100)
|
|
||||||
}
|
|
||||||
|
|
||||||
const courseTags = [
|
|
||||||
...new Set(
|
|
||||||
database.questions.filter(question => question.course === course).flatMap(question => question.tags),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
|
|
||||||
const [selectedTag, setSelectedTag] = useState<string | null>(null)
|
|
||||||
|
|
||||||
const filteredQuestions = database.questions
|
|
||||||
.filter(question => question.course === course)
|
|
||||||
.filter(question => (selectedTag ? question.tags.includes(selectedTag) : true))
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<div class="grid-center text-center">
|
|
||||||
<h3>
|
|
||||||
<a href="/domande-esami">Domande Orali</a>
|
|
||||||
</h3>
|
|
||||||
<h1>{database.names[course]}</h1>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{courseTags.length > 1 && (
|
|
||||||
<div class="card filter">
|
|
||||||
<div class="grid-h">
|
|
||||||
<FunnelIcon />
|
|
||||||
<strong>Filtra Tag</strong>
|
|
||||||
</div>
|
|
||||||
<div class="flex-row-wrap">
|
|
||||||
{!selectedTag
|
|
||||||
? courseTags.map(tag => (
|
|
||||||
<div class="chip clickable" onClick={() => setSelectedTag(tag)}>
|
|
||||||
{tag}
|
|
||||||
</div>
|
|
||||||
))
|
|
||||||
: courseTags.map(tag => (
|
|
||||||
<div
|
|
||||||
class={tag === selectedTag ? 'chip clickable' : 'chip clickable disabled'}
|
|
||||||
onClick={() => setSelectedTag(tag === selectedTag ? null : tag)}
|
|
||||||
>
|
|
||||||
{tag}
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div class="wide-card-list" id="questions">
|
|
||||||
{filteredQuestions.length === 0 ? (
|
|
||||||
<div class="grid-center">
|
|
||||||
<em>No questions found</em>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
filteredQuestions.map(question => (
|
|
||||||
<div class="card">
|
|
||||||
<div
|
|
||||||
class="text"
|
|
||||||
dangerouslySetInnerHTML={{
|
|
||||||
__html: marked(question.content, { async: false }),
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
<div class="metadata">
|
|
||||||
{question.tags.map(tag => (
|
|
||||||
<div class="chip small">{tag}</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
const icons = Object.fromEntries(
|
|
||||||
Object.entries(
|
|
||||||
import.meta.glob<{ default: ImageMetadata }>(`node_modules/@phosphor-icons/core/assets/light/*.svg`, {
|
|
||||||
eager: true,
|
|
||||||
}),
|
|
||||||
).map(([path, module]) => [path.split('/').pop()!.split('.')[0].replace('-light', ''), module]),
|
|
||||||
)
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export const PhosphorIcon = ({ name }: Props) => {
|
|
||||||
const icon = icons[name]
|
|
||||||
|
|
||||||
if (!icon) {
|
|
||||||
throw new Error(`Icon "${name}" not found`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return <img class="phosphor-icon" src={icon.default.src} alt={name} />
|
|
||||||
}
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
const $debugConsole = document.createElement('div')
|
|
||||||
|
|
||||||
$debugConsole.style.position = 'fixed'
|
|
||||||
$debugConsole.style.bottom = '0'
|
|
||||||
$debugConsole.style.left = '0'
|
|
||||||
$debugConsole.style.width = '100%'
|
|
||||||
$debugConsole.style.height = '25vh'
|
|
||||||
$debugConsole.style.backgroundColor = 'black'
|
|
||||||
$debugConsole.style.color = 'white'
|
|
||||||
$debugConsole.style.overflow = 'auto'
|
|
||||||
$debugConsole.style.padding = '10px'
|
|
||||||
$debugConsole.style.boxSizing = 'border-box'
|
|
||||||
$debugConsole.style.fontFamily = 'monospace'
|
|
||||||
$debugConsole.style.zIndex = '9999'
|
|
||||||
$debugConsole.style.fontSize = '15px'
|
|
||||||
$debugConsole.style.opacity = '0.8'
|
|
||||||
|
|
||||||
document.body.appendChild($debugConsole)
|
|
||||||
|
|
||||||
function logDebugConsole(...args) {
|
|
||||||
$debugConsole.innerHTML += args.join(' ') + '<br>'
|
|
||||||
}
|
|
||||||
|
|
||||||
console.error = logDebugConsole
|
|
||||||
console.warn = logDebugConsole
|
|
||||||
console.log = logDebugConsole
|
|
||||||
console.debug = logDebugConsole
|
|
||||||
@ -1,83 +0,0 @@
|
|||||||
// took from: https://github.com/sxyazi/marked-extended-latex
|
|
||||||
// this has a peer dependency bug
|
|
||||||
|
|
||||||
const CLASS_NAME = 'latex-b172fea480b'
|
|
||||||
|
|
||||||
const extBlock = options => ({
|
|
||||||
name: 'latex-block',
|
|
||||||
level: 'block',
|
|
||||||
start(src) {
|
|
||||||
return src.match(/\$\$[^\$]/)?.index ?? -1
|
|
||||||
},
|
|
||||||
tokenizer(src, _tokens) {
|
|
||||||
const match = /^\$\$([^\$]+)\$\$/.exec(src)
|
|
||||||
return match ? { type: 'latex-block', raw: match[0], formula: match[1] } : undefined
|
|
||||||
},
|
|
||||||
renderer(token) {
|
|
||||||
if (!options.lazy) return options.render(token.formula, true)
|
|
||||||
return `<span class="${CLASS_NAME}" block>${token.formula}</span>`
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
const extInline = options => ({
|
|
||||||
name: 'latex',
|
|
||||||
level: 'inline',
|
|
||||||
start(src) {
|
|
||||||
return src.match(/\$[^\$]/)?.index ?? -1
|
|
||||||
},
|
|
||||||
tokenizer(src, _tokens) {
|
|
||||||
const match = /^\$([^\$]+)\$/.exec(src)
|
|
||||||
return match ? { type: 'latex', raw: match[0], formula: match[1] } : undefined
|
|
||||||
},
|
|
||||||
renderer(token) {
|
|
||||||
if (!options.lazy) return options.render(token.formula, false)
|
|
||||||
return `<span class="${CLASS_NAME}">${token.formula}</span>`
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
let observer
|
|
||||||
/* istanbul ignore next */
|
|
||||||
export default (options = {}) => {
|
|
||||||
/* istanbul ignore next */
|
|
||||||
if (options.lazy && options.env !== 'test') {
|
|
||||||
observer = new IntersectionObserver(
|
|
||||||
(entries, self) => {
|
|
||||||
for (const entry of entries) {
|
|
||||||
if (!entry.isIntersecting) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
const span = entry.target
|
|
||||||
self.unobserve(span)
|
|
||||||
|
|
||||||
Promise.resolve(options.render(span.innerText, span.hasAttribute('block'))).then(html => {
|
|
||||||
span.innerHTML = html
|
|
||||||
})
|
|
||||||
span.classList.add('latex-rendered')
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{ threshold: 1.0 },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
extensions: [extBlock(options), extInline(options)],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* istanbul ignore next */
|
|
||||||
export const observe = () => {
|
|
||||||
if (!observer) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
observer.disconnect()
|
|
||||||
document.querySelectorAll(`span.${CLASS_NAME}:not(.latex-rendered)`).forEach(span => {
|
|
||||||
observer.observe(span)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/* istanbul ignore next */
|
|
||||||
export const disconnect = () => {
|
|
||||||
observer?.disconnect()
|
|
||||||
}
|
|
||||||
@ -1,50 +0,0 @@
|
|||||||
---
|
|
||||||
import PhosphorIcon from './PhosphorIcon.astro'
|
|
||||||
|
|
||||||
const ICONS_MAP: Record<string, string> = {
|
|
||||||
github: 'github-logo',
|
|
||||||
linkedin: 'linkedin-logo',
|
|
||||||
website: 'globe',
|
|
||||||
mail: 'mailbox',
|
|
||||||
}
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
fullName: string
|
|
||||||
description: string
|
|
||||||
|
|
||||||
image: ImageMetadata
|
|
||||||
|
|
||||||
entranceDate: number
|
|
||||||
exitDate?: number
|
|
||||||
|
|
||||||
founder?: boolean
|
|
||||||
|
|
||||||
social?: {
|
|
||||||
github?: string
|
|
||||||
linkedin?: string
|
|
||||||
website?: string
|
|
||||||
mail?: string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const { fullName, description, image, entranceDate, exitDate, founder, social } = Astro.props
|
|
||||||
---
|
|
||||||
|
|
||||||
<div class="bubble">
|
|
||||||
<img src={image.src} alt={fullName.toLowerCase()} />
|
|
||||||
<div class="title">{fullName}</div>
|
|
||||||
<div class="date">{entranceDate}—{exitDate ?? 'Presente'}</div>
|
|
||||||
{founder && <div class="founder">Fondatore</div>}
|
|
||||||
<div class="description">{description}</div>
|
|
||||||
{
|
|
||||||
social && (
|
|
||||||
<div class="social">
|
|
||||||
{Object.entries(social).map(([key, value]) => (
|
|
||||||
<a href={value} target="_blank" rel="noopener noreferrer">
|
|
||||||
<PhosphorIcon name={ICONS_MAP[key] ?? 'question-mark'} />
|
|
||||||
</a>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
---
|
|
||||||
import { Image } from 'astro:assets'
|
|
||||||
|
|
||||||
type Props = {
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
const { name } = Astro.props
|
|
||||||
|
|
||||||
const icons = Object.fromEntries(
|
|
||||||
Object.entries(
|
|
||||||
import.meta.glob<{ default: ImageMetadata }>(`node_modules/@phosphor-icons/core/assets/light/*.svg`),
|
|
||||||
).map(([path, module]) => [path.split('/').pop()!.split('.')[0].replace('-light', ''), module]),
|
|
||||||
)
|
|
||||||
|
|
||||||
if (!icons[name]) {
|
|
||||||
throw new Error(`Icon "${name}" not found`)
|
|
||||||
}
|
|
||||||
---
|
|
||||||
|
|
||||||
<Image class="phosphor-icon" src={icons[name]()} alt={name} />
|
|
||||||
@ -1,68 +0,0 @@
|
|||||||
---
|
|
||||||
id: eliminare-sito-poisson
|
|
||||||
title: Come tolgo la mia pagina Poisson da Google?
|
|
||||||
description: Sei divenuto troppo famoso 🤩 e vuoi eliminare la tua pagina Poisson dai risultati di ricerca di Google? Ecco come farlo!
|
|
||||||
author: Antonio De Lucreziis
|
|
||||||
tags: [poisson, sito]
|
|
||||||
---
|
|
||||||
|
|
||||||
Hai un nuovo sito web e vuoi che venga indicizzato da Google prima della tua pagina Poisson? Oppure sei diventato troppo famoso, e vuoi eliminare la tua pagina Poisson dai risultati di ricerca di Google? In entrambi i casi, vediamo come fare.
|
|
||||||
|
|
||||||
Ricorda che la tua pagina Poisson è indicizzata da Google in quanto pubblicamente accessibile. Per "toglierla" dai risultati di ricerca dovremo chiedere a Google di non indicizzarla più, e quindi innanzitutto dire a Google che siamo i proprietari di quella pagina (altrimenti non ci permetterà di rimuoverla).
|
|
||||||
|
|
||||||
> **Attenzione**: in questo articolo, sostituisci sempre `USERNAME` con il tuo username Poisson (non `n.cognome`, quello è il tuo username di Ateneo).
|
|
||||||
|
|
||||||
## Cancellazione pagina Poisson
|
|
||||||
|
|
||||||
Invece di eliminare la tua pagina Poisson, puoi anche solo ridirezionarla al tuo nuovo sito web. Se fossi proprio sicuro di volerla eliminare, vediamo ora come fare.
|
|
||||||
|
|
||||||
A questo punto, se vogliamo anche eliminare tutta la pagina Poisson, possiamo farlo con il comando
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ ssh USERNAME@poisson.phc.dm.unipi.it
|
|
||||||
$ cd public_html
|
|
||||||
$ rm -rf *
|
|
||||||
```
|
|
||||||
|
|
||||||
> **Attenzione!** La cartella `public_html` nella propria home in realtà è un **link simbolico** alla cartella `public_html`, che fisicamente sta altrove. Per sostituire o cancellare il contenuto della propria pagina Poisson, dovremo eliminare tutti i file contenuti nella cartella `public_html`, _ma non la cartella stessa_.
|
|
||||||
|
|
||||||
## Google Search Console
|
|
||||||
|
|
||||||
### 1. Verifica della proprietà
|
|
||||||
|
|
||||||
Prima di tutto visita la pagina <https://search.google.com/search-console>, fai l'accesso con un account Google di tuo piacimento e clicca su "Aggiungi proprietà". Poisson utilizza la convenzione che le pagine personali sono raggiungibili all'indirizzo `https://poisson.phc.dm.unipi.it/~USERNAME`, quindi seleziona l'opzione "Prefisso URL" / "URL prefix" per poi inserire l'URL della tua pagina Poisson (es. `https://poisson.phc.dm.unipi.it/~USERNAME`).
|
|
||||||
|
|
||||||
Dopo una breve attesa, Google ci chiederà di verificare la nostra proprietà con alcuni metodi. Il metodo più semplice è quello di inserire un file di verifica nella nostra cartella pubblica. Scarica il file di verifica e copialo nella tua cartella pubblica: se ad esempio il file si chiama `google1234567890.html`, puoi caricarlo nella tua cartella pubblica con il seguente comando ([clicca QUI se non ricordi le credenziali](/guide/recupero-password)):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Vai nella cartella in cui hai scaricato il file di verifica
|
|
||||||
$ ls
|
|
||||||
... google1234567890.html ...
|
|
||||||
|
|
||||||
# Copia il file nella public_html su Poisson
|
|
||||||
$ scp google1234567890.html USERNAME@poisson.phc.dm.unipi.it:public_html/
|
|
||||||
```
|
|
||||||
|
|
||||||
Dopo qualche minuto, torniamo su Google Search Console e clicchiamo su "Verifica". Se tutto è andato a buon fine, Google ci darà accesso ai dati di indicizzazione della nostra pagina Poisson.
|
|
||||||
|
|
||||||
### 2. Richiesta di Rimozione
|
|
||||||
|
|
||||||
Nella barra laterale di sinistra, nella sezione "Indicizzazione", clicchiamo su "Rimozioni", dopodichè in "Rimozioni Temporanee" clicchiamo su "Nuova Richiesta" e selezioniamo l'opzione "Rimuovi tutti gli URL con questo prefisso". Come prefisso, andiamo ad inserire `https://poisson.phc.dm.unipi.it/~USERNAME` per rimuovere la nostra pagina Poisson e tutte le sue sottopagine. Infine, clicchiamo su "Invia richiesta di rimozione" per confermare.
|
|
||||||
|
|
||||||
### 3. Attesa...
|
|
||||||
|
|
||||||
Considera che Google potrebbe metterci fino a qualche giorno per rimuovere le pagine indicizzate. Ben fatto! Ora la tua pagina Poisson non sarà più indicizzata da Google.
|
|
||||||
|
|
||||||
## Redirect
|
|
||||||
|
|
||||||
Se invece vuoi che la tua pagina Poisson rimandi al tuo nuovo sito web, puoi impostare un redirect. Per fare ciò, ti basterà creare un file `.htaccess` nella cartella `public_html/` della tua home con il seguente contenuto:
|
|
||||||
|
|
||||||
```apache
|
|
||||||
RedirectMatch 307 /~USERNAME/.* https://www.mio-nuovo-sito.com/
|
|
||||||
```
|
|
||||||
|
|
||||||
Qui, il codice `307` indica un redirect temporaneo; se sei sicuro di volere un redirect permanente puoi usare direttamente il codice `301` (la differenza tecnica tra i due è che il primo non salva la cache del redirect nel browser, mentre il secondo sì).
|
|
||||||
|
|
||||||
## Conclusioni
|
|
||||||
|
|
||||||
Per rimuovere la tua pagina Poisson dai risultati di ricerca di altri motori di ricerca come Bing, DuckDuckGo, ecc., bisogna seguire procedure simili. Se fosse proprio necessario scrivi pure a noi macchinisti, e ricorda sempre che la tua pagina Poisson è pubblica e accessibile a tutti, quindi non metterci cose che non vuoi che siano pubbliche.
|
|
||||||
@ -1,80 +0,0 @@
|
|||||||
---
|
|
||||||
id: stampare-via-ssh
|
|
||||||
title: Stampare via SSH
|
|
||||||
description: Istruzioni per stampare in dipartimento da remoto, tramite SSH 🖨
|
|
||||||
author: Antonio De Lucreziis, Francesco Minnocci
|
|
||||||
tags: [linux, ssh, stampanti]
|
|
||||||
---
|
|
||||||
|
|
||||||
Per stampare in dipartimento non bisogna per forza usare i computer dei laboratori, possiamo che stampare direttamente da remoto tramite SSH. Vediamo come fare!
|
|
||||||
|
|
||||||
Se non l'avete mai fatto per prima cosa bisogna poter accedere da remoto ad una macchina chiamata "login", il cui indirizzo è `login.dm.unipi.it`. Per fare l'accesso possiamo usare il seguente comando con l'account di Ateneo (non quello Poisson!)
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
ssh USERNAME_ATENEO@login.dm.unipi.it
|
|
||||||
```
|
|
||||||
|
|
||||||
Una volta connessi possiamo stampare utilizzando il comando `lpr` seguito dal nome del file che vogliamo stampare. Prima però serve trasferire il file che vogliamo stampare sulla macchina "login". Per fare ciò possiamo usare il comando `scp`: per prima cosa usciamo dalla macchina "login" (premere `Ctrl+D` oppure scrivendo `exit`), andiamo nella cartella dove si trova il file che vogliamo stampare e poi eseguiamo il comando:
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
scp NOME_FILE.pdf USERNAME_ATENEO@login.dm.unipi.it:~/Documents
|
|
||||||
```
|
|
||||||
|
|
||||||
Dove `NOME_FILE.pdf` è il nome del file che vogliamo stampare e `Documents` è un esempio di cartella dove vogliamo trasferirlo. Una volta trasferito il file possiamo rifare ssh su "login" e stampare il file con il comando:
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
lpr Documents/NOME_FILE.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
Alternativamente possiamo stampare direttamente il file senza trasferirlo con il comando:
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
cat NOME_FILE.pdf | ssh USERNAME_ATENEO@login.dm.unipi.it lpr OPZIONI... -
|
|
||||||
```
|
|
||||||
|
|
||||||
Qui, `[OPZIONI...]` sono le opzioni che possiamo passare a `lpr` (vedi sotto). L'ultimo trattino "`-`" è molto importante e indica che il file da stampare è quello in standard input. Più precisamente, `cat NOME_FILE.pdf` invia il contenuto del file `NOME_FILE.pdf` allo standard output e `|` lo ridireziona a input di `ssh`, che a sua volta lo passa a `lpr` via rete.
|
|
||||||
|
|
||||||
## Opzioni di `lpr`
|
|
||||||
|
|
||||||
Il comando `lpr` accetta alcune opzioni che possono essere utili:
|
|
||||||
|
|
||||||
- `-P` seguito dal nome della stampante: permette di specificare la stampante su cui stampare, le stampanti disponibili in dipartimento sono
|
|
||||||
- `cdc4` che è la stampante di default e si trova in Aula 4
|
|
||||||
|
|
||||||
- `cdclf` che si trova al piano terra nel corridoio dopo l'Aula 4
|
|
||||||
|
|
||||||
- `cdc3` che si trova in Aula 3 (è un po' vecchia ma di solito funziona)
|
|
||||||
|
|
||||||
- `-#` seguito dal numero di copie: permette di specificare il numero di copie da stampare. In realtà questa opzione non funziona per vari motivi arcani e se uno passa `-#N` per stampare $N$ copie, la stampante stampa $N^2$ copie. (Questo ha scaturito una serie di ragionamenti sul modo ottimo di decomporre $N$ come somma di quadrati [con tanto di sito di comodo](https://shortest-sum-of-squares.netlify.app/)...)
|
|
||||||
|
|
||||||
- `-o sides=two-sided-long-edge`: permette di stampare **fronte-retro** (che dovrebbe essere già il default)
|
|
||||||
|
|
||||||
- `-o sides=two-sided-short-edge`: permette di stampare fronte-retro con "la rilegatura" delle pagine sul lato corto
|
|
||||||
|
|
||||||
- `-o sides=one-sided`: permette di stampare _solo fronte_, comodo per stampare i meme di laurea
|
|
||||||
|
|
||||||
- `-o fit-to-page`: permette di ridimensionare il documento per farlo entrare in un foglio (è buona prassi passare sempre questa opzione)
|
|
||||||
|
|
||||||
- `-o media=a4`: permette di specificare il formato del foglio, di default è A4 quindi non dovrebbere servire
|
|
||||||
|
|
||||||
## Altre comodità
|
|
||||||
|
|
||||||
Stampare da remoto porta anche altre comodità, ad esempio possiamo interrompere un file che abbiamo mandato in stampa per sbaglio con il comando (sempre tutti comandi da eseguire su "login")
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
cancel -a
|
|
||||||
```
|
|
||||||
|
|
||||||
> Attenzione, il comando sopra cancella tutta la propria coda di stampa, non solo l'ultimo lavoro inviato.
|
|
||||||
|
|
||||||
Alternativamente possiamo vedere lo stato della coda di stampa con il comando
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
lpq -a
|
|
||||||
```
|
|
||||||
|
|
||||||
e cancellare un lavoro con uno specifico ID con
|
|
||||||
|
|
||||||
```bash shell
|
|
||||||
cancel ID
|
|
||||||
```
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
title: Calcola la tua media ed il voto di laurea con il nuovissimo calcolatore del PHC!
|
|
||||||
description: È ora disponibile uno strumento per calcolare la propria media pesata e il voto di ammissione alla laurea secondo le regole del dipartimento.
|
|
||||||
publishDate: 2025-06-26
|
|
||||||
---
|
|
||||||
|
|
||||||
# Calcola la tua media ed il voto di laurea con il nuovissimo calcolatore del PHC!
|
|
||||||
|
|
||||||
È ora disponibile nella sezione "Calcolo Media" del sito uno strumento per calcolare la propria media pesata e il voto di ammissione alla laurea secondo le regole ufficiali del dipartimento.
|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://phc.dm.unipi.it/media-pesata/">phc.dm.unipi.it/media-pesata/</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
Il calcolatore applica automaticamente le regole di esclusione previste dal regolamento:
|
|
||||||
|
|
||||||
- **Triennale**: vengono esclusi i 15 CFU con i voti più bassi
|
|
||||||
- **Magistrale**: vengono esclusi i 9 CFU con i voti più bassi
|
|
||||||
|
|
||||||
Il sistema calcola anche il bonus per le lodi, che vale +0.5 punti per ogni materia superiore a 6 CFU e +0.25 punti per materie da 6 CFU o meno, con un tetto massimo di +1.5 punti per la triennale e +2 punti per la magistrale.
|
|
||||||
|
|
||||||
Se dovessero esserci bug scriveteci un'email a <a href="mailto:macchinisti@lists.dm.unipi.it">macchinisti@lists.dm.unipi.it</a>!
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
---
|
|
||||||
title: Esplora i meme dell'aula studenti online!
|
|
||||||
description: |
|
|
||||||
Gli storici meme sono stati staccati per i lavori, ma non disperare: li potrai vedere su una nuova pagina.
|
|
||||||
publishDate: 2025-06-26
|
|
||||||
---
|
|
||||||
|
|
||||||
# Esplora i meme dell'aula studenti online!
|
|
||||||
|
|
||||||
Visti gli imminenti lavori che occuperanno l'aula studenti, ad inizio Settembre tutti i meme sulle pareti sono stati staccati e riposti temporaneamente in PHC; qui sotto trovate alcuni timelapse della giornata:
|
|
||||||
|
|
||||||
<div class="grid-h-split">
|
|
||||||
<video controls>
|
|
||||||
<source src="https://static.phc.dm.unipi.it/timelapse-nord.mp4" type="video/mp4">
|
|
||||||
Your browser does not support the video tag.
|
|
||||||
</video>
|
|
||||||
<video controls>
|
|
||||||
<source src="https://static.phc.dm.unipi.it/timelapse-sud.mp4" type="video/mp4">
|
|
||||||
Your browser does not support the video tag.
|
|
||||||
</video>
|
|
||||||
<video controls>
|
|
||||||
<source src="https://static.phc.dm.unipi.it/timelapse-termosifone.mp4" type="video/mp4">
|
|
||||||
Your browser does not support the video tag.
|
|
||||||
</video>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Per questo motivo, li abbiamo scansionati ed abbiamo creato una bacheca per poter contemplare i meme dovunque voi siate 🧳
|
|
||||||
|
|
||||||
Eccovi dunque il link alla pagina, buon divertimento:
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://meme.phc.dm.unipi.it">meme.phc.dm.unipi.it</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
## Coming Soon
|
|
||||||
|
|
||||||
Prima o poi faremo anche una mappa interattiva della stanza, basata sul seguente modello 3D ricostruito con tecniche di fotogrammetria:
|
|
||||||
|
|
||||||
<video controls>
|
|
||||||
<source src="https://static.phc.dm.unipi.it/3d-scan-preview.mp4" type="video/mp4">
|
|
||||||
Your browser does not support the video tag.
|
|
||||||
</video>
|
|
||||||
|
|
||||||
> Disclaimer: Se volessi rimuovere una tua immagine da questa pagina, scrivici pure a <a href="mailto:macchinisti@lists.dm.unipi.it">macchinisti@lists.dm.unipi.it</a> e ce ne occuperemo.
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
---
|
|
||||||
title: Non avete attivato la 2FA entro il primo dicembre? Ecco come recuperare l'accesso
|
|
||||||
description: |
|
|
||||||
Se non avete attivato l'autenticazione a due fattori entro il primo dicembre, siete bloccati fuori dall'account Unipi. La procedura di recupero passa dal supporto tecnico.
|
|
||||||
publishDate: 2025-12-05
|
|
||||||
---
|
|
||||||
|
|
||||||
# Non avete attivato la 2FA entro il primo dicembre? Ecco come recuperare l'accesso
|
|
||||||
|
|
||||||
Se siamo rimasti fuori dal nostro account Unipi perché non abbiamo attivato l'autenticazione a due fattori entro il primo dicembre, il percorso di recupero è piuttosto lineare.
|
|
||||||
|
|
||||||
Il primo passo è mandare una mail a
|
|
||||||
|
|
||||||
> <a href="mailto:help.polo2@ticket.unipi.it">help.polo2@ticket.unipi.it</a>
|
|
||||||
|
|
||||||
usando un indirizzo email personale (quello di ateneo è bloccato). Nel messaggio dobbiamo specificare chiaramente il problema e includere il nostro indirizzo email d'ateneo.
|
|
||||||
|
|
||||||
Dopo aver inviato la richiesta, tocca aspettare. Il supporto tecnico resetta manualmente lo status 2FA e ci manda una conferma. A quel punto possiamo procedere con l'attivazione seguendo le istruzioni ufficiali:
|
|
||||||
|
|
||||||
> https://it.unipi.it/configurazioni/mfa/autenticazione-a-piu-fattori-mfa-microsoft-365/
|
|
||||||
|
|
||||||
**Nota tecnica:** L'app Microsoft Authenticator non è obbligatoria! Qualsiasi autenticatore compatibile con [TOTP](https://en.wikipedia.org/wiki/Time-based_one-time_password) va bene: Google Authenticator, Bitwarden, Authy e altre alternative funzionano perfettamente. L'unica differenza è che l'app Microsoft Authenticator permette di ricevere notifiche l'accesso che consente di fare login con meno click.
|
|
||||||
|
|
||||||
Per utilizzare una di queste altre app (invece di Microsoft Authenticator), seguire questi step nella creazione del metodo di autenticazione:
|
|
||||||
|
|
||||||
1. Selezionare **"Microsoft Authenticator"**
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
2. Selezionare **"Configura un'app di autenticazione diversa"**
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
3. A questo punto il procedimento cambia in base all'app. In generale verrà richiesto di scannerizzare un QR code e di verificare il corretto funzionamento inserendo la TOTP (codice a 6 cifre)
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
# the schema of this file in "@/files.d.ts"
|
|
||||||
|
|
||||||
- fullName: Antonio De Lucreziis
|
|
||||||
entranceDate: 2019
|
|
||||||
description: |
|
|
||||||
Appassionato di geometria computazionale, parser, teoria dei linguaggi di programmazione, Smalltalk e Lisp.
|
|
||||||
social:
|
|
||||||
github: https://github.com/aziis98
|
|
||||||
website: https://poisson.phc.dm.unipi.it/~delucreziis/
|
|
||||||
|
|
||||||
- fullName: Luca Lombardo
|
|
||||||
entranceDate: 2024
|
|
||||||
description: Appassionato di algoritmi e strutture dati, Rust e di quando matematica e informatica si incontrano.
|
|
||||||
social:
|
|
||||||
github: https://github.com/lukefleed
|
|
||||||
website: https://lukefleex.xyz
|
|
||||||
linkedin: https://www.linkedin.com/in/l-lombardo/
|
|
||||||
|
|
||||||
- fullName: Francesco Minnocci
|
|
||||||
entranceDate: 2022
|
|
||||||
description: Chitarrista classico ossessionato con la geometria aritmetica, linux e il rock progressivo.
|
|
||||||
social:
|
|
||||||
github: https://github.com/BachoSeven
|
|
||||||
website: https://bachoseven.com
|
|
||||||
|
|
||||||
- fullName: Francesco Baldino
|
|
||||||
entranceDate: 2022
|
|
||||||
description: |
|
|
||||||
Appassionato di Star Wars, NixOS e lunghe camminate in montagna. Pokemon preferito: Latias.
|
|
||||||
social:
|
|
||||||
github: https://github.com/Fran314
|
|
||||||
website: https://poisson.phc.dm.unipi.it/~baldino
|
|
||||||
|
|
||||||
- fullName: Illya Serdyuk
|
|
||||||
entranceDate: 2020
|
|
||||||
social:
|
|
||||||
github: https://github.com/Kratacoa
|
|
||||||
|
|
||||||
# Vecchi Macchinisti
|
|
||||||
|
|
||||||
- fullName: Francesco Manicastri
|
|
||||||
entranceDate: 2020
|
|
||||||
exitDate: 2024
|
|
||||||
social:
|
|
||||||
linkedin: https://www.linkedin.com/in/gustavo-sass%C3%ACnculo-phd-92916a202/
|
|
||||||
|
|
||||||
- fullName: Cristiano Cricci
|
|
||||||
entranceDate: 2010
|
|
||||||
exitDate: 2019
|
|
||||||
social:
|
|
||||||
website: https://poisson.phc.dm.unipi.it/~cricci/
|
|
||||||
|
|
||||||
- fullName: Tommaso Biannucci
|
|
||||||
entranceDate: 2019
|
|
||||||
exitDate: 2022
|
|
||||||
social:
|
|
||||||
github: https://gitlab.com/churli
|
|
||||||
website: https://churli.gitlab.io/
|
|
||||||
|
|
||||||
- fullName: Letizia D'Achille
|
|
||||||
entranceDate: 2018
|
|
||||||
exitDate: 2022
|
|
||||||
description: Appassionata di crittografia, teoria dei codici e matematica computazionale.
|
|
||||||
social:
|
|
||||||
github: https://github.com/letizia-dachille
|
|
||||||
website: https://letizia-dachille.github.io/
|
|
||||||
linkedin: https://www.linkedin.com/in/letizia-dachille/
|
|
||||||
|
|
||||||
- fullName: Emiliano Rago
|
|
||||||
entranceDate: 2000
|
|
||||||
exitDate: 2006
|
|
||||||
description: Traviato da Linux in età troppo giovane ha difficoltà ad usare il mouse ma ama gli shortcuts con una decina di tasti.
|
|
||||||
social:
|
|
||||||
linkedin: https://www.linkedin.com/in/emiliano-rago-1a8018109/
|
|
||||||
|
|
||||||
- fullName: Francesco Caporali
|
|
||||||
entranceDate: 2018
|
|
||||||
exitDate: 2022
|
|
||||||
social:
|
|
||||||
github: https://github.com/caporali
|
|
||||||
website: https://caporali.github.io/
|
|
||||||
linkedin: https://www.linkedin.com/in/francescocaporali
|
|
||||||
|
|
||||||
- fullName: Antonio Spanu
|
|
||||||
entranceDate: 2005
|
|
||||||
exitDate: 2009
|
|
||||||
social:
|
|
||||||
linkedin: https://www.linkedin.com/in/antonio-spanu-609b3516a/
|
|
||||||
|
|
||||||
- fullName: Riccardo Murri
|
|
||||||
entranceDate: 1995
|
|
||||||
exitDate: 2000
|
|
||||||
founder: true
|
|
||||||
social:
|
|
||||||
github: https://github.com/riccardomurri
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
declare module '*.yaml' {
|
|
||||||
const value: any // Add type definitions here if desired
|
|
||||||
export default value
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module '@/data/macchinisti.yaml' {
|
|
||||||
type Macchinista = {
|
|
||||||
fullName: string
|
|
||||||
description: string
|
|
||||||
|
|
||||||
entranceDate: number
|
|
||||||
exitDate?: number
|
|
||||||
|
|
||||||
social: Record<string, string>
|
|
||||||
|
|
||||||
founder?: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
const value: Macchinista[]
|
|
||||||
export default value
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module '@/data/domande-esami.yaml' {
|
|
||||||
export type Question = {
|
|
||||||
course: string
|
|
||||||
content: string
|
|
||||||
tags: string[]
|
|
||||||
}
|
|
||||||
|
|
||||||
export type Group = {
|
|
||||||
id: string
|
|
||||||
name: string
|
|
||||||
items: Array<string>
|
|
||||||
}
|
|
||||||
|
|
||||||
export type Database = {
|
|
||||||
names: Record<string, string>
|
|
||||||
groups: Group[]
|
|
||||||
questions: Question[]
|
|
||||||
}
|
|
||||||
|
|
||||||
const value: Database
|
|
||||||
export default value
|
|
||||||
}
|
|
||||||
@ -0,0 +1,123 @@
|
|||||||
|
---
|
||||||
|
import Header from '@/components/Header.astro'
|
||||||
|
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout title="Admin | PHC" pageTags={'admin'}>
|
||||||
|
<Header />
|
||||||
|
<div class="layout-admin">
|
||||||
|
<div class="sidebar">
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="/admin">
|
||||||
|
<span class="material-symbols-outlined">dashboard</span>
|
||||||
|
Dashboard
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/admin/utenti">
|
||||||
|
<span class="material-symbols-outlined">group</span>
|
||||||
|
Utenti
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/admin/appunti">
|
||||||
|
<span class="material-symbols-outlined">book_2</span>
|
||||||
|
Appunti
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/admin/database">
|
||||||
|
<span class="material-symbols-outlined">database</span>
|
||||||
|
Database
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="admin-dashboard-grid max-width-content">
|
||||||
|
<div class="card">
|
||||||
|
<div class="title">
|
||||||
|
<a href="/admin/utenti">Utenti</a>
|
||||||
|
</div>
|
||||||
|
<div class="text">Statistiche degli utenti di Poisson e PHC</div>
|
||||||
|
<div class="boxes">
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Utenti Poisson</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">group</div>
|
||||||
|
<div class="description">1356</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Utenti PHC</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">group</div>
|
||||||
|
<div class="description">345</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Utenti con account collegato</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">group</div>
|
||||||
|
<div class="description">56</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<div class="title">
|
||||||
|
<a href="/admin/appunti">Appunti</a>
|
||||||
|
</div>
|
||||||
|
<div class="text">Statistiche degli Appunti</div>
|
||||||
|
<div class="boxes">
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Appunti Caricati</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">book_2</div>
|
||||||
|
<div class="description">567</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Appunti Pubblicati</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">book_2</div>
|
||||||
|
<div class="description">345</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">In attesa di revisione</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">book_2</div>
|
||||||
|
<div class="description">234</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Spazio Usato (di Minio)</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">storage</div>
|
||||||
|
<div class="description">34.5 GB</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card">
|
||||||
|
<div class="title">
|
||||||
|
<a href="/admin/database">Database</a>
|
||||||
|
</div>
|
||||||
|
<div class="text">Statistiche del Database</div>
|
||||||
|
<div class="boxes">
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Record nel database</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">database</div>
|
||||||
|
<div class="description">3456</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Record modificati</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">database</div>
|
||||||
|
<div class="description">234</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Record eliminati</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">database</div>
|
||||||
|
<div class="description">56</div>
|
||||||
|
</div>
|
||||||
|
<div class="box">
|
||||||
|
<div class="title">Spazio utilizzato</div>
|
||||||
|
<div class="material-symbols-outlined extra-large">storage</div>
|
||||||
|
<div class="description">39.5 MB</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</BaseLayout>
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
---
|
||||||
|
import Header from '@/components/Header.astro'
|
||||||
|
import BaseLayout from '@/layouts/BaseLayout.astro'
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout title="Utenti | Admin | PHC" pageTags={'admin'}>
|
||||||
|
<Header />
|
||||||
|
<div class="layout-admin">
|
||||||
|
<div class="sidebar">
|
||||||
|
<nav>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="/admin">
|
||||||
|
<span class="material-symbols-outlined">dashboard</span>
|
||||||
|
Dashboard
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/admin/utenti">
|
||||||
|
<span class="material-symbols-outlined">group</span>
|
||||||
|
Utenti
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/admin/appunti">
|
||||||
|
<span class="material-symbols-outlined">book_2</span>
|
||||||
|
Appunti
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="/admin/database">
|
||||||
|
<span class="material-symbols-outlined">database</span>
|
||||||
|
Database
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="admin-table max-width-content">
|
||||||
|
<div class="table-header">
|
||||||
|
<div class="table-title">
|
||||||
|
<span class="material-symbols-outlined">group</span>
|
||||||
|
Utenti
|
||||||
|
</div>
|
||||||
|
<div class="table-actions">
|
||||||
|
<a href="/admin/utenti/aggiungi" class="button">Aggiungi</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="table-filter stack-h">
|
||||||
|
<input type="text" class="fill-w shrink" placeholder="Cerca utente" />
|
||||||
|
<button class="icon">
|
||||||
|
<div class="material-symbols-outlined">search</div>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="table-body">
|
||||||
|
<div class="table-row header">
|
||||||
|
<div class="table-cell">Nome</div>
|
||||||
|
<div class="table-cell">Cognome</div>
|
||||||
|
<div class="table-cell">Email</div>
|
||||||
|
<div class="table-cell">Ruolo</div>
|
||||||
|
<div class="table-cell">Azioni</div>
|
||||||
|
</div>
|
||||||
|
{
|
||||||
|
Array.from({ length: 50 }).map(() => (
|
||||||
|
<Fragment>
|
||||||
|
<div class="table-row">
|
||||||
|
<div class="table-cell">Mario</div>
|
||||||
|
<div class="table-cell">Rossi</div>
|
||||||
|
<div class="table-cell">mario@rossi.com</div>
|
||||||
|
<div class="table-cell">studente</div>
|
||||||
|
<div class="table-cell">
|
||||||
|
<a href="/admin/utenti/modifica" class="button icon">
|
||||||
|
<div class="material-symbols-outlined">edit</div>
|
||||||
|
</a>
|
||||||
|
<a href="/admin/utenti/elimina" class="button icon">
|
||||||
|
<div class="material-symbols-outlined">delete</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Fragment>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</BaseLayout>
|
||||||
@ -1,27 +0,0 @@
|
|||||||
---
|
|
||||||
import '@/styles/pages/domande-esami.css'
|
|
||||||
|
|
||||||
import type { GetStaticPaths } from 'astro'
|
|
||||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
|
||||||
import Footer from '@/components/Footer.astro'
|
|
||||||
import Header from '@/components/Header.astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
import { DomandeEsamiCourse } from '@/client/DomandeEsamiCourse'
|
|
||||||
|
|
||||||
export const getStaticPaths = (() => {
|
|
||||||
return Object.keys(database.names).map(course => ({
|
|
||||||
params: { course },
|
|
||||||
}))
|
|
||||||
}) satisfies GetStaticPaths
|
|
||||||
|
|
||||||
const { course } = Astro.params
|
|
||||||
---
|
|
||||||
|
|
||||||
<BaseLayout title="Domande Orali | PHC">
|
|
||||||
<Header />
|
|
||||||
<main>
|
|
||||||
<DomandeEsamiCourse client:only="preact" course={course} />
|
|
||||||
</main>
|
|
||||||
<Footer />
|
|
||||||
</BaseLayout>
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
import type { APIRoute } from 'astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
export const GET: APIRoute = ({}) => {
|
|
||||||
return new Response(JSON.stringify(database), {
|
|
||||||
headers: {
|
|
||||||
'content-type': 'application/json',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
import type { APIRoute, GetStaticPaths } from 'astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
export const getStaticPaths = (() => {
|
|
||||||
return Object.keys(database.names).map(course => ({
|
|
||||||
params: { course },
|
|
||||||
}))
|
|
||||||
}) satisfies GetStaticPaths
|
|
||||||
|
|
||||||
export const GET: APIRoute = ({ params: { course } }) => {
|
|
||||||
return new Response(
|
|
||||||
JSON.stringify({
|
|
||||||
groups: [],
|
|
||||||
names: Object.fromEntries(Object.entries(database.names).filter(([key]) => key === course)),
|
|
||||||
questions: database.questions.filter(question => question.course === course),
|
|
||||||
}),
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
'content-type': 'application/json',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@ -1,66 +0,0 @@
|
|||||||
---
|
|
||||||
import '@/styles/pages/domande-esami.css'
|
|
||||||
|
|
||||||
import { PhosphorIcon } from '@/client/Icon'
|
|
||||||
import Footer from '@/components/Footer.astro'
|
|
||||||
import Header from '@/components/Header.astro'
|
|
||||||
import BaseLayout from '@/layouts/BaseLayout.astro'
|
|
||||||
|
|
||||||
import database from '@/data/domande-esami.yaml'
|
|
||||||
|
|
||||||
const courseQuestionCounts = Object.fromEntries(
|
|
||||||
database.questions.reduce((acc, question) => {
|
|
||||||
acc.set(question.course, (acc.get(question.course) || 0) + 1)
|
|
||||||
return acc
|
|
||||||
}, new Map()),
|
|
||||||
)
|
|
||||||
---
|
|
||||||
|
|
||||||
<BaseLayout title="Domande Orali | PHC">
|
|
||||||
<Header />
|
|
||||||
<main>
|
|
||||||
<h1>Domande Orali</h1>
|
|
||||||
{
|
|
||||||
database.groups.map(group => (
|
|
||||||
<details open>
|
|
||||||
<summary>
|
|
||||||
<h2 id={group.id}>
|
|
||||||
<div class="details-closed">
|
|
||||||
<PhosphorIcon name="caret-down" />
|
|
||||||
</div>
|
|
||||||
<div class="details-openned">
|
|
||||||
<PhosphorIcon name="caret-up" />
|
|
||||||
</div>
|
|
||||||
{group.name}
|
|
||||||
</h2>
|
|
||||||
</summary>
|
|
||||||
<div class="wide-card-list">
|
|
||||||
{group.items
|
|
||||||
.filter(course => courseQuestionCounts[course] > 0)
|
|
||||||
.map(course => (
|
|
||||||
<a href={`/domande-esami/${course}`}>
|
|
||||||
<div class="card">
|
|
||||||
<h2>{database.names[course]}</h2>
|
|
||||||
<div class="text">
|
|
||||||
<p>{courseQuestionCounts[course] || 0} domande</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</details>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
<h3>Come Contribuire</h3>
|
|
||||||
<div class="card large">
|
|
||||||
<div class="text">
|
|
||||||
<p>
|
|
||||||
Se hai raccolto delle domande da un orale, puoi inviarcele per email all'indirizzo
|
|
||||||
<a href="mailto:macchinisti@lists.dm.unipi.it"> macchinisti@lists.dm.unipi.it</a>.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<Footer />
|
|
||||||
</BaseLayout>
|
|
||||||
@ -1,88 +0,0 @@
|
|||||||
---
|
|
||||||
import '@/styles/pages/macchinisti.css'
|
|
||||||
|
|
||||||
import BaseLayout from '../layouts/BaseLayout.astro'
|
|
||||||
import Header from '../components/Header.astro'
|
|
||||||
import Footer from '../components/Footer.astro'
|
|
||||||
import Bubble from '../components/Bubble.astro'
|
|
||||||
|
|
||||||
import macchinisti from '@/data/macchinisti.yaml'
|
|
||||||
macchinisti.sort((a, b) => b.entranceDate - a.entranceDate)
|
|
||||||
|
|
||||||
// Import all images from assets folder
|
|
||||||
const images = Object.fromEntries(
|
|
||||||
Object.entries(
|
|
||||||
import.meta.glob<{ default: ImageMetadata }>('@/assets/macchinisti/*', {
|
|
||||||
eager: true,
|
|
||||||
}),
|
|
||||||
).map(([path, module]) => [path.split('/').pop()!.split('.')[0], module]),
|
|
||||||
)
|
|
||||||
|
|
||||||
const currentMacchinisti = macchinisti.filter(macchinista => !macchinista.exitDate)
|
|
||||||
const pastMacchinisti = macchinisti.filter(macchinista => macchinista.exitDate)
|
|
||||||
|
|
||||||
const getMacchinistaPicture = (fullName: string) => {
|
|
||||||
const macchinistaId = fullName.toLowerCase().replace(/\s+/g, '-')
|
|
||||||
const { default: image } = images[macchinistaId] ?? images['fallback']
|
|
||||||
return image
|
|
||||||
}
|
|
||||||
---
|
|
||||||
|
|
||||||
<BaseLayout title="Macchinisti | PHC">
|
|
||||||
<Header />
|
|
||||||
<main>
|
|
||||||
<div class="card large" style={{ '--card-base': '#e1766b' }}>
|
|
||||||
<div class="title">Ecco i Macchinisti!</div>
|
|
||||||
<div class="text">
|
|
||||||
<p>
|
|
||||||
<em>> Chi sono i macchinisti?</em>
|
|
||||||
<br />
|
|
||||||
Questo è l'appellativo dato agli studenti che si occupano di gestire l'infrastuttura e i servizi del
|
|
||||||
PHC (vedi la homepage per informazioni su come diventare un macchinista). Qua sotto trovi i macchinisti
|
|
||||||
attualmente attivi in PHC.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="bubble-array">
|
|
||||||
{
|
|
||||||
currentMacchinisti.map(macchinista => (
|
|
||||||
<Bubble
|
|
||||||
image={getMacchinistaPicture(macchinista.fullName)}
|
|
||||||
fullName={macchinista.fullName}
|
|
||||||
entranceDate={macchinista.entranceDate}
|
|
||||||
description={macchinista.description}
|
|
||||||
social={macchinista.social}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card large" style={{ '--card-base': '#6BD6E1' }}>
|
|
||||||
<div class="title"><s>Deus</s> Ex Macchinisti</div>
|
|
||||||
<div class="text">
|
|
||||||
<p>
|
|
||||||
Qui raccogliamo qualche informazione sui macchinisti del passato, che hanno contribuito a rendere il
|
|
||||||
PHC quello che è oggi.
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="bubble-array">
|
|
||||||
{
|
|
||||||
pastMacchinisti.map(macchinista => (
|
|
||||||
<Bubble
|
|
||||||
fullName={macchinista.fullName}
|
|
||||||
description={macchinista.description}
|
|
||||||
image={getMacchinistaPicture(macchinista.fullName)}
|
|
||||||
entranceDate={macchinista.entranceDate}
|
|
||||||
exitDate={macchinista.exitDate}
|
|
||||||
founder={macchinista.founder}
|
|
||||||
social={macchinista.social}
|
|
||||||
/>
|
|
||||||
))
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
<Footer />
|
|
||||||
</BaseLayout>
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
---
|
|
||||||
import '@/styles/pages/media-pesata.css'
|
|
||||||
import PageLayout from '../layouts/PageLayout.astro'
|
|
||||||
|
|
||||||
import { MediaPesataApp } from '@/client/MediaPesataApp'
|
|
||||||
---
|
|
||||||
|
|
||||||
<PageLayout
|
|
||||||
title="Voto Laurea"
|
|
||||||
description="Calcola la tua media pesata e il voto di laurea seguendo le regole del dipartimento"
|
|
||||||
>
|
|
||||||
<div class="media-pesata-container">
|
|
||||||
<h1>Calcolo Media e Voto di Laurea</h1>
|
|
||||||
<p>
|
|
||||||
Calcola la tua media pesata e il voto con cui ti siederai alla discussione di laurea, seguendo le regole del
|
|
||||||
dipartimento di Matematica.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<MediaPesataApp client:load />
|
|
||||||
</div>
|
|
||||||
</PageLayout>
|
|
||||||
@ -1,12 +1,10 @@
|
|||||||
---
|
---
|
||||||
import '@/styles/pages/utenti.css'
|
|
||||||
|
|
||||||
import PageLayout from '../layouts/PageLayout.astro'
|
import PageLayout from '../layouts/PageLayout.astro'
|
||||||
|
|
||||||
import { UtentiPage } from '../client/UtentiPage.tsx'
|
import { UtentiPage } from '../client/UtentiPage.tsx'
|
||||||
---
|
---
|
||||||
|
|
||||||
<PageLayout title="Utenti | PHC">
|
<PageLayout title="Utenti | PHC" pageTags="utenti">
|
||||||
<h1>Utenti</h1>
|
<h1>Utenti</h1>
|
||||||
<UtentiPage client:load />
|
<UtentiPage client:load />
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
|
|||||||
@ -1,19 +0,0 @@
|
|||||||
/* This file is here for historical reasons but is not used anymore */
|
|
||||||
|
|
||||||
/* @mixin neo-brutalist-card($size: 3px, $offset: $size + 1, $shadow: true, $hoverable: false) {
|
|
||||||
border: $size solid #222;
|
|
||||||
border-radius: $size * 2;
|
|
||||||
|
|
||||||
@if $shadow {
|
|
||||||
box-shadow: $offset $offset 0 0 #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
@if $hoverable {
|
|
||||||
transition: all 64ms linear;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
transform: translate(-1px, -1px);
|
|
||||||
box-shadow: $offset + 1 $offset + 1 0 0 #222;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
/* This file is here for historical reasons but is not used anymore */
|
|
||||||
|
|
||||||
@layer page {
|
|
||||||
/*
|
|
||||||
.login {
|
|
||||||
background: #ddfaff;
|
|
||||||
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
max-width: 80ch;
|
|
||||||
padding: 3rem 0;
|
|
||||||
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
h3 {
|
|
||||||
font-size: 28px;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
@ -1,274 +0,0 @@
|
|||||||
/* @import './mixins.scss'; */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Controls - for things like buttons, input, select
|
|
||||||
*/
|
|
||||||
|
|
||||||
@layer base {
|
|
||||||
button,
|
|
||||||
.button,
|
|
||||||
[role='button'] {
|
|
||||||
appearance: none;
|
|
||||||
|
|
||||||
background: #fff;
|
|
||||||
|
|
||||||
/* @include neo-brutalist-card; */
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 4px 4px 0 0 #222;
|
|
||||||
|
|
||||||
transition: all 64ms linear;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
transform: translate(-1px, -1px);
|
|
||||||
box-shadow: 5px 5px 0 0 #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: translate(2px, 2px);
|
|
||||||
box-shadow: 2px 2px 0 0 #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
& {
|
|
||||||
padding: 0.25rem 1.5rem;
|
|
||||||
|
|
||||||
text-decoration: none;
|
|
||||||
color: #222;
|
|
||||||
|
|
||||||
font-family: var(--font-secondary); /* TODO: check if this is a global variable and replace */
|
|
||||||
font-weight: 600;
|
|
||||||
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.primary {
|
|
||||||
background: #1e6733;
|
|
||||||
color: #f4fef7;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #2b8b47;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.icon {
|
|
||||||
padding: 0.25rem;
|
|
||||||
margin-right: 0.25rem;
|
|
||||||
margin-bottom: 0.25rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.flat {
|
|
||||||
background: transparent;
|
|
||||||
color: #222;
|
|
||||||
|
|
||||||
border: none;
|
|
||||||
box-shadow: none;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #0002;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='text'],
|
|
||||||
input[type='password'] {
|
|
||||||
width: 100%;
|
|
||||||
min-height: 1.75rem;
|
|
||||||
|
|
||||||
/* @include neo-brutalist-card; */
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 4px 4px 0 0 #222;
|
|
||||||
|
|
||||||
padding: 0 0.25rem;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #fdfdfd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type='checkbox'] {
|
|
||||||
appearance: none;
|
|
||||||
-webkit-appearance: none;
|
|
||||||
-moz-appearance: none;
|
|
||||||
|
|
||||||
width: calc(1.5rem + 1px);
|
|
||||||
height: calc(1.5rem + 1px);
|
|
||||||
|
|
||||||
background: #fff;
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 4px;
|
|
||||||
box-shadow: 3px 3px 0 0 #222;
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
transition: all 64ms linear;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
transform: translate(-1px, -1px);
|
|
||||||
box-shadow: 4px 4px 0 0 #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:active {
|
|
||||||
transform: translate(1px, 1px);
|
|
||||||
box-shadow: 2px 2px 0 0 #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:checked {
|
|
||||||
background: #1e6733;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
|
|
||||||
width: 0.8rem;
|
|
||||||
height: 0.8rem;
|
|
||||||
background: #1e6733;
|
|
||||||
|
|
||||||
clip-path: polygon(10% 55%, 35% 75%, 85% 25%, 90% 35%, 40% 95%, 5% 60%);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #2b8b47;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:disabled {
|
|
||||||
background: #eee;
|
|
||||||
border-color: #888;
|
|
||||||
box-shadow: 3px 3px 0 0 #888;
|
|
||||||
cursor: not-allowed;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
transform: none;
|
|
||||||
box-shadow: 3px 3px 0 0 #888;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:checked {
|
|
||||||
background: #aaa;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
background: #666;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.star {
|
|
||||||
&:checked::after {
|
|
||||||
background: rgb(255, 197, 49);
|
|
||||||
clip-path: polygon(
|
|
||||||
50% 0%,
|
|
||||||
61% 35%,
|
|
||||||
98% 35%,
|
|
||||||
68% 57%,
|
|
||||||
79% 91%,
|
|
||||||
50% 70%,
|
|
||||||
21% 91%,
|
|
||||||
32% 57%,
|
|
||||||
2% 35%,
|
|
||||||
39% 35%
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
form {
|
|
||||||
display: grid;
|
|
||||||
gap: 1rem;
|
|
||||||
padding: 2rem;
|
|
||||||
|
|
||||||
background: #38adc1;
|
|
||||||
|
|
||||||
min-width: 40ch;
|
|
||||||
|
|
||||||
/* @include neo-brutalist-card($size: 3px, $offset: 9px); */
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 9px 9px 0 0 #222;
|
|
||||||
|
|
||||||
button,
|
|
||||||
.button,
|
|
||||||
[role='button'] {
|
|
||||||
padding-left: 3rem;
|
|
||||||
padding-right: 3rem;
|
|
||||||
|
|
||||||
&.primary {
|
|
||||||
background: #1c7f90;
|
|
||||||
color: #f4fef7;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #4ea2b1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hr {
|
|
||||||
border: none;
|
|
||||||
width: 100%;
|
|
||||||
height: 2px;
|
|
||||||
background: #0003;
|
|
||||||
|
|
||||||
margin-top: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.right {
|
|
||||||
justify-self: end;
|
|
||||||
}
|
|
||||||
.left {
|
|
||||||
justify-self: start;
|
|
||||||
}
|
|
||||||
.center {
|
|
||||||
justify-self: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
details {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
summary {
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
place-items: center;
|
|
||||||
|
|
||||||
list-style: none;
|
|
||||||
&::-webkit-details-marker {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-openned,
|
|
||||||
.details-closed {
|
|
||||||
display: contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not([open]) {
|
|
||||||
.details-openned {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&[open] {
|
|
||||||
summary {
|
|
||||||
padding-bottom: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.details-closed {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
/* TODO: check if this is a global variable and replace */
|
|
||||||
summary {
|
|
||||||
place-content: stretch;
|
|
||||||
place-items: stretch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,132 @@
|
|||||||
|
@import './mixins.scss';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Controls - for things like buttons, input, select
|
||||||
|
//
|
||||||
|
|
||||||
|
@layer common {
|
||||||
|
button,
|
||||||
|
.button,
|
||||||
|
[role='button'] {
|
||||||
|
appearance: none;
|
||||||
|
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
@include neo-brutalist-card;
|
||||||
|
|
||||||
|
transition: all 64ms linear;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
place-content: center;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translate(-1px, -1px);
|
||||||
|
box-shadow: 5px 5px 0 0 #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
transform: translate(2px, 2px);
|
||||||
|
box-shadow: 2px 2px 0 0 #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
& {
|
||||||
|
padding: 0.25rem 1.5rem;
|
||||||
|
|
||||||
|
text-decoration: none;
|
||||||
|
color: #222;
|
||||||
|
|
||||||
|
font-family: 'Source Sans Pro', sans-serif;
|
||||||
|
font-weight: 600;
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background: #1e6733;
|
||||||
|
color: #f4fef7;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #2b8b47;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.icon {
|
||||||
|
padding: 0.25rem;
|
||||||
|
margin-right: 0.25rem;
|
||||||
|
margin-bottom: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.flat {
|
||||||
|
background: transparent;
|
||||||
|
color: #222;
|
||||||
|
|
||||||
|
border: none;
|
||||||
|
box-shadow: none;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #0002;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type='text'],
|
||||||
|
input[type='password'] {
|
||||||
|
width: 100%;
|
||||||
|
height: 2.5rem;
|
||||||
|
|
||||||
|
@include neo-brutalist-card;
|
||||||
|
|
||||||
|
padding: 0 0.25rem;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #fdfdfd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
display: grid;
|
||||||
|
gap: 1rem;
|
||||||
|
padding: 2rem;
|
||||||
|
|
||||||
|
background: #38adc1;
|
||||||
|
|
||||||
|
min-width: 40ch;
|
||||||
|
|
||||||
|
@include neo-brutalist-card($size: 3px, $offset: 9px);
|
||||||
|
|
||||||
|
button,
|
||||||
|
.button,
|
||||||
|
[role='button'] {
|
||||||
|
padding-left: 3rem;
|
||||||
|
padding-right: 3rem;
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background: #1c7f90;
|
||||||
|
color: #f4fef7;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #4ea2b1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr {
|
||||||
|
border: none;
|
||||||
|
width: 100%;
|
||||||
|
height: 2px;
|
||||||
|
background: #0003;
|
||||||
|
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right {
|
||||||
|
justify-self: end;
|
||||||
|
}
|
||||||
|
.left {
|
||||||
|
justify-self: start;
|
||||||
|
}
|
||||||
|
.center {
|
||||||
|
justify-self: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,371 +0,0 @@
|
|||||||
@layer base, typography, component, page, utility;
|
|
||||||
|
|
||||||
@import url(./controls.css);
|
|
||||||
@import url(./components.css);
|
|
||||||
@import url(./typography.css);
|
|
||||||
|
|
||||||
/* $screen-desktop-min: 1024px; */
|
|
||||||
/* @TODO: SCSS conversion - @import becomes more complex */
|
|
||||||
/* @import './mixins.scss'; */
|
|
||||||
/* @import './typography.scss'; */
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--palette-black: #222;
|
|
||||||
--border-large: 4px solid var(--palette-black);
|
|
||||||
|
|
||||||
--header-bg: #fff;
|
|
||||||
|
|
||||||
--footer-bg: #444;
|
|
||||||
--footer-fg: #fdfdfd;
|
|
||||||
|
|
||||||
--homepage-principal-bg: #ecffe3;
|
|
||||||
--homepage-whatsphc-bg: #e4c5ff;
|
|
||||||
--homepage-news-bg: #c2a8eb;
|
|
||||||
--homepage-projects-bg: #f5f2cc;
|
|
||||||
--homepage-macchinisti-bg: #888;
|
|
||||||
|
|
||||||
--project-card-bg: #a2d4f3;
|
|
||||||
|
|
||||||
--font-primary: 'Open Sans', sans-serif;
|
|
||||||
--font-display: 'Iosevka', monospace;
|
|
||||||
--font-mono: 'Source Code Pro', monospace;
|
|
||||||
--font-secondary: 'Source Sans Pro', sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
:root {
|
|
||||||
--guide-base: #a2d4f3;
|
|
||||||
|
|
||||||
--guide-darkest: color-mix(in srgb, var(--guide-base), #000 75%);
|
|
||||||
--guide-darker: color-mix(in srgb, var(--guide-base), #000 50%);
|
|
||||||
--guide-dark: color-mix(in srgb, var(--guide-base), #000 25%);
|
|
||||||
|
|
||||||
--guide-light: color-mix(in srgb, var(--guide-base), #fff 25%);
|
|
||||||
--guide-lighter: color-mix(in srgb, var(--guide-base), #fff 50%);
|
|
||||||
--guide-lightest: color-mix(in srgb, var(--guide-base), #fff 75%);
|
|
||||||
|
|
||||||
--news-base: #f8e8b1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@layer base {
|
|
||||||
*,
|
|
||||||
*::before,
|
|
||||||
*::after {
|
|
||||||
box-sizing: border-box;
|
|
||||||
font: inherit;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
html,
|
|
||||||
body {
|
|
||||||
min-height: 100%;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
font-family: var(--font-primary);
|
|
||||||
font-size: 18px;
|
|
||||||
color: #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
html {
|
|
||||||
scroll-snap-type: y mandatory;
|
|
||||||
scroll-padding-top: 4rem;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
img {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
color: inherit;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
/*
|
|
||||||
for the header spacing
|
|
||||||
padding-top: 6rem;
|
|
||||||
*/
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-template-rows: auto 1fr auto;
|
|
||||||
|
|
||||||
header {
|
|
||||||
z-index: 10;
|
|
||||||
|
|
||||||
height: 6rem;
|
|
||||||
border-bottom: var(--border-large);
|
|
||||||
background: var(--header-bg);
|
|
||||||
|
|
||||||
grid-column: 1 / -1;
|
|
||||||
|
|
||||||
top: 0;
|
|
||||||
position: sticky;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
padding-left: 1rem;
|
|
||||||
|
|
||||||
img {
|
|
||||||
height: 3.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.links {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
gap: 1.5rem;
|
|
||||||
|
|
||||||
padding: 0 1.5rem;
|
|
||||||
|
|
||||||
a {
|
|
||||||
font-family: var(--font-display);
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: 500;
|
|
||||||
letter-spacing: 1px;
|
|
||||||
color: #333;
|
|
||||||
|
|
||||||
padding: 0.25rem 1.325rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.side-menu {
|
|
||||||
position: fixed;
|
|
||||||
|
|
||||||
/*
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 3rem;
|
|
||||||
*/
|
|
||||||
|
|
||||||
top: 5rem;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
|
|
||||||
background: #f0f0f0;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
/*
|
|
||||||
grid-template-rows: auto 1fr;
|
|
||||||
*/
|
|
||||||
grid-template-rows: 1fr;
|
|
||||||
|
|
||||||
gap: 1.5rem;
|
|
||||||
padding: 1.5rem;
|
|
||||||
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
/*
|
|
||||||
& > :first-child {
|
|
||||||
justify-self: end;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
.links {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
|
|
||||||
align-content: start;
|
|
||||||
|
|
||||||
width: calc(100vw - 3rem);
|
|
||||||
max-width: 100%;
|
|
||||||
|
|
||||||
gap: 1.5rem;
|
|
||||||
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#header-menu-toggle {
|
|
||||||
display: none;
|
|
||||||
|
|
||||||
&:not(:checked) ~ .side-menu {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:has(#header-menu-toggle:checked) #header-menu-toggle-menu {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:has(#header-menu-toggle:not(:checked)) #header-menu-toggle-close {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
height: 5rem;
|
|
||||||
padding: 0 0.5rem;
|
|
||||||
|
|
||||||
.logo {
|
|
||||||
padding-left: 0;
|
|
||||||
|
|
||||||
img {
|
|
||||||
height: 3rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
z-index: 10;
|
|
||||||
padding: 1rem 0;
|
|
||||||
--paragraph-margin: 0.5rem;
|
|
||||||
--zone-color: #aaa;
|
|
||||||
|
|
||||||
min-height: 6rem;
|
|
||||||
border-top: var(--border-large);
|
|
||||||
background: var(--footer-bg);
|
|
||||||
color: var(--footer-fg);
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
|
|
||||||
font-family: var(--font-secondary);
|
|
||||||
font-size: 18px;
|
|
||||||
|
|
||||||
scroll-snap-align: end;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
min-height: 5rem;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-track:vertical {
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
border-left: 2px solid #222;
|
|
||||||
border-top: 2px solid #222;
|
|
||||||
border-bottom: 2px solid #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-track:horizontal {
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
border-top: 2px solid #222;
|
|
||||||
border-left: 2px solid #222;
|
|
||||||
border-right: 2px solid #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb {
|
|
||||||
background-color: #1e6733;
|
|
||||||
border: 2px solid #222;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-thumb:hover {
|
|
||||||
background-color: #2b8b47;
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar-corner {
|
|
||||||
background-color: #f0f0f0;
|
|
||||||
/* border-left: 2px solid #222; */
|
|
||||||
/* border-top: 2px solid #222; */
|
|
||||||
}
|
|
||||||
|
|
||||||
::-webkit-scrollbar {
|
|
||||||
width: 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
::selection {
|
|
||||||
background: #0002;
|
|
||||||
}
|
|
||||||
|
|
||||||
body:has(#header-menu-toggle:checked) {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Typography
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @TODO: SCSS conversion - @import becomes more complex */
|
|
||||||
/* @import './controls.scss'; */
|
|
||||||
/* @import './components.scss'; */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Custom Page Styles
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @TODO: SCSS conversion - @import becomes more complex */
|
|
||||||
/* @import './pages.scss'; */
|
|
||||||
|
|
||||||
@layer utility {
|
|
||||||
.hide {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.invisible {
|
|
||||||
opacity: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.grid-center {
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
place-items: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.h-flex {
|
|
||||||
display: flex;
|
|
||||||
gap: 0.5rem;
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
|
|
||||||
.v-flex {
|
|
||||||
display: flex;
|
|
||||||
gap: 0.5rem;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
.h-flex,
|
|
||||||
.v-flex {
|
|
||||||
place-self: stretch;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
> * {
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
> .spacer {
|
|
||||||
flex-grow: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (min-width: 1024px) {
|
|
||||||
.mobile-only {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
.desktop-only {
|
|
||||||
display: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,305 @@
|
|||||||
|
$screen-desktop-min: 1024px;
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--palette-black: #222;
|
||||||
|
|
||||||
|
--border-large: 4px solid var(--palette-black);
|
||||||
|
|
||||||
|
--header-bg: #fff;
|
||||||
|
|
||||||
|
--footer-bg: #444;
|
||||||
|
--footer-fg: #fdfdfd;
|
||||||
|
|
||||||
|
--homepage-principal-bg: #ecffe3;
|
||||||
|
--homepage-whatsphc-bg: #e4c5ff;
|
||||||
|
--homepage-news-bg: #c2a8eb;
|
||||||
|
--homepage-projects-bg: #f5f2cc;
|
||||||
|
--homepage-macchinisti-bg: #888;
|
||||||
|
|
||||||
|
--project-card-bg: #a2d4f3;
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer common, typography, component, page;
|
||||||
|
|
||||||
|
@import './mixins.scss';
|
||||||
|
@import './typography.scss';
|
||||||
|
|
||||||
|
@layer common {
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
font: inherit;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
html,
|
||||||
|
body {
|
||||||
|
min-height: 100%;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
font-family: 'Open Sans', sans-serif;
|
||||||
|
font-size: 18px;
|
||||||
|
color: #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
// html {
|
||||||
|
// scroll-snap-type: y mandatory;
|
||||||
|
// scroll-padding-top: 4rem;
|
||||||
|
// }
|
||||||
|
|
||||||
|
img {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Typography
|
||||||
|
//
|
||||||
|
|
||||||
|
@import './controls.scss';
|
||||||
|
@import './components.scss';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Custom Page Styles
|
||||||
|
//
|
||||||
|
|
||||||
|
body {
|
||||||
|
// for the header spacing
|
||||||
|
// padding-top: 6rem;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-rows: auto 1fr auto;
|
||||||
|
|
||||||
|
header {
|
||||||
|
z-index: 10;
|
||||||
|
|
||||||
|
height: 6rem;
|
||||||
|
border-bottom: var(--border-large);
|
||||||
|
background: var(--header-bg);
|
||||||
|
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
|
||||||
|
top: 0;
|
||||||
|
position: sticky;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
padding-left: 1rem;
|
||||||
|
|
||||||
|
img {
|
||||||
|
height: 3.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.links {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1.5rem;
|
||||||
|
|
||||||
|
padding: 0 1.5rem;
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-family: 'Iosevka', monospace;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 500;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.side-menu {
|
||||||
|
position: fixed;
|
||||||
|
|
||||||
|
// top: 0;
|
||||||
|
// right: 0;
|
||||||
|
// bottom: 0;
|
||||||
|
// left: 3rem;
|
||||||
|
|
||||||
|
top: 5rem;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
background: #f0f0f0;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
// grid-template-rows: auto 1fr;
|
||||||
|
grid-template-rows: 1fr;
|
||||||
|
|
||||||
|
gap: 1.5rem;
|
||||||
|
padding: 1.5rem;
|
||||||
|
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
// & > :first-child {
|
||||||
|
// justify-self: end;
|
||||||
|
// }
|
||||||
|
|
||||||
|
.links {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
|
||||||
|
align-content: start;
|
||||||
|
|
||||||
|
width: calc(100vw - 3rem);
|
||||||
|
max-width: 100%;
|
||||||
|
|
||||||
|
gap: 1.5rem;
|
||||||
|
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#header-menu-toggle {
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
&:not(:checked) ~ .side-menu {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(#header-menu-toggle:checked) #header-menu-toggle-menu {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(#header-menu-toggle:not(:checked)) #header-menu-toggle-close {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
height: 5rem;
|
||||||
|
padding: 0 0.5rem;
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
padding-left: 0;
|
||||||
|
|
||||||
|
img {
|
||||||
|
height: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
padding: 3rem 1rem;
|
||||||
|
gap: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
z-index: 10;
|
||||||
|
padding: 1rem 0;
|
||||||
|
--paragraph-margin: 0.5rem;
|
||||||
|
--zone-color: #aaa;
|
||||||
|
|
||||||
|
min-height: 6rem;
|
||||||
|
border-top: var(--border-large);
|
||||||
|
background: var(--footer-bg);
|
||||||
|
color: var(--footer-fg);
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
place-content: center;
|
||||||
|
|
||||||
|
font-family: 'Source Sans Pro', sans-serif;
|
||||||
|
font-size: 20px;
|
||||||
|
|
||||||
|
scroll-snap-align: end;
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
min-height: 5rem;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@import './pages.scss';
|
||||||
|
|
||||||
|
//
|
||||||
|
// Misc
|
||||||
|
//
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track:vertical {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
border-left: 2px solid #222;
|
||||||
|
border-top: 2px solid #222;
|
||||||
|
border-bottom: 2px solid #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-track:horizontal {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
border-top: 2px solid #222;
|
||||||
|
border-left: 2px solid #222;
|
||||||
|
border-right: 2px solid #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb {
|
||||||
|
background-color: #1e6733;
|
||||||
|
border: 2px solid #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-thumb:hover {
|
||||||
|
background-color: #2b8b47;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar-corner {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
// border-left: 2px solid #222;
|
||||||
|
// border-top: 2px solid #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-scrollbar {
|
||||||
|
width: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
::selection {
|
||||||
|
background: #0002;
|
||||||
|
}
|
||||||
|
|
||||||
|
body:has(#header-menu-toggle:checked) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Utility Classes
|
||||||
|
//
|
||||||
|
|
||||||
|
.hide {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.invisible {
|
||||||
|
opacity: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $screen-desktop-min) {
|
||||||
|
.mobile-only {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
.desktop-only {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
@mixin neo-brutalist-card($size: 3px, $offset: $size + 1, $shadow: true, $hoverable: false) {
|
||||||
|
border: $size solid #222;
|
||||||
|
border-radius: $size * 2;
|
||||||
|
|
||||||
|
@if $shadow {
|
||||||
|
box-shadow: $offset $offset 0 0 #222;
|
||||||
|
}
|
||||||
|
|
||||||
|
@if $hoverable {
|
||||||
|
transition: all 64ms linear;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translate(-1px, -1px);
|
||||||
|
box-shadow: $offset + 1 $offset + 1 0 0 #222;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.stack-v {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
&.fit > * {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.center {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
> * {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .fill {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .shrink {
|
||||||
|
flex-shrink: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.stack-h {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
&.fit > * {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.center {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
> * {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .fill {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .shrink {
|
||||||
|
flex-shrink: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fill-w {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fill-h {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.max-width-content {
|
||||||
|
max-width: 64rem;
|
||||||
|
}
|
||||||
@ -0,0 +1,829 @@
|
|||||||
|
:root {
|
||||||
|
--guide-base: #a2d4f3;
|
||||||
|
|
||||||
|
--guide-darkest: color-mix(in srgb, var(--guide-base), #000 75%);
|
||||||
|
--guide-darker: color-mix(in srgb, var(--guide-base), #000 50%);
|
||||||
|
--guide-dark: color-mix(in srgb, var(--guide-base), #000 25%);
|
||||||
|
|
||||||
|
--guide-light: color-mix(in srgb, var(--guide-base), #fff 25%);
|
||||||
|
--guide-lighter: color-mix(in srgb, var(--guide-base), #fff 50%);
|
||||||
|
--guide-lightest: color-mix(in srgb, var(--guide-base), #fff 75%);
|
||||||
|
|
||||||
|
--news-base: #f8e8b1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@layer page {
|
||||||
|
.homepage {
|
||||||
|
header:has(#header-menu-toggle:not(:checked)) .logo {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
min-height: calc(100vh - 6rem);
|
||||||
|
|
||||||
|
&:last-of-type {
|
||||||
|
min-height: calc(100vh - 10rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
// display: flex;
|
||||||
|
// flex-direction: column;
|
||||||
|
// align-items: center;
|
||||||
|
& {
|
||||||
|
display: grid;
|
||||||
|
grid-auto-flow: row;
|
||||||
|
justify-items: center;
|
||||||
|
align-content: start;
|
||||||
|
|
||||||
|
gap: 2rem;
|
||||||
|
|
||||||
|
scroll-snap-align: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .title {
|
||||||
|
font-size: 48px;
|
||||||
|
padding-top: 4rem;
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
padding-top: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.zig-zag {
|
||||||
|
z-index: 5;
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
&:first-child {
|
||||||
|
bottom: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.principal {
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
|
min-height: calc(100vh - 7rem);
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
place-content: center;
|
||||||
|
|
||||||
|
gap: 4rem;
|
||||||
|
|
||||||
|
padding: 3rem 2rem 6rem;
|
||||||
|
|
||||||
|
background: var(--homepage-principal-bg);
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.circuit-layer {
|
||||||
|
pointer-events: none;
|
||||||
|
|
||||||
|
z-index: 1;
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
canvas {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .logo {
|
||||||
|
z-index: 2;
|
||||||
|
|
||||||
|
width: 32rem;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
user-select: none;
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
// filter: drop-shadow(6px 6px 0 var(--palette-black))
|
||||||
|
// drop-shadow(4px 0 0 var(--palette-black)) drop-shadow(0 4px 0 var(--palette-black))
|
||||||
|
// drop-shadow(-4px 0 0 var(--palette-black)) drop-shadow(0 -4px 0 var(--palette-black));
|
||||||
|
}
|
||||||
|
|
||||||
|
max-width: calc(100vw - 3rem);
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .whats-phc {
|
||||||
|
z-index: 2;
|
||||||
|
background: #e4c5ff;
|
||||||
|
|
||||||
|
--zone-color: color-mix(in lab, #e4c5ff, #000 75%);
|
||||||
|
|
||||||
|
max-width: 37rem;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: underline 2px solid;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
--zone-color: color-mix(in lab, #e4c5ff, #000 60%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.news {
|
||||||
|
--card-base: color-mix(in lab, var(--news-base), #fff 25%);
|
||||||
|
--zone-color: color-mix(in lab, var(--news-base), #000 50%);
|
||||||
|
|
||||||
|
background: var(--homepage-news-bg);
|
||||||
|
|
||||||
|
gap: 3rem;
|
||||||
|
|
||||||
|
padding-bottom: 6rem;
|
||||||
|
|
||||||
|
& > .news-list {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 3rem;
|
||||||
|
|
||||||
|
align-items: flex-start;
|
||||||
|
|
||||||
|
padding: 0 3rem;
|
||||||
|
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
[role='button'] {
|
||||||
|
padding: 0.5rem 2rem;
|
||||||
|
|
||||||
|
&.primary {
|
||||||
|
background: #ffdd6e;
|
||||||
|
color: #000d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.projects {
|
||||||
|
background: var(--homepage-projects-bg);
|
||||||
|
|
||||||
|
padding-bottom: 6rem;
|
||||||
|
|
||||||
|
.project-list {
|
||||||
|
// width: calc(20rem * 3 + 1.5rem * 2 + 6rem * 2);
|
||||||
|
// max-width: calc(100vw - 2rem); // HACK: capire come si propagano le width per bene
|
||||||
|
|
||||||
|
max-width: calc(20rem * 3 + 1.5rem * 2 + 1rem * 2);
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
|
||||||
|
grid-auto-flow: dense;
|
||||||
|
|
||||||
|
gap: 1.5rem;
|
||||||
|
padding: 0 1rem;
|
||||||
|
|
||||||
|
& > * {
|
||||||
|
grid-row: span var(--masonry-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
.project {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
// background: #fcddff;
|
||||||
|
// background: #ffa89c;
|
||||||
|
background: var(--card-bg, var(--project-card-bg));
|
||||||
|
color: #000e;
|
||||||
|
|
||||||
|
@include neo-brutalist-card($size: 3px, $offset: 9px);
|
||||||
|
|
||||||
|
padding: 1rem;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto 1fr;
|
||||||
|
grid-template-rows: auto 1fr;
|
||||||
|
|
||||||
|
gap: 0.25rem 1rem;
|
||||||
|
|
||||||
|
transition: all 128ms ease-out;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-size: 32px;
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
font-size: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.image {
|
||||||
|
grid-row: span 2;
|
||||||
|
// place-self: center;
|
||||||
|
|
||||||
|
.box {
|
||||||
|
background: #0003;
|
||||||
|
border: 3px solid #0006;
|
||||||
|
border-radius: 6px;
|
||||||
|
width: 4rem;
|
||||||
|
height: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
object-fit: cover;
|
||||||
|
width: 4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// &.auto {
|
||||||
|
// img {
|
||||||
|
// width: auto;
|
||||||
|
// height: auto;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
.description {
|
||||||
|
font-size: 16px;
|
||||||
|
@extend .text;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
transform: translate(0, -4px);
|
||||||
|
box-shadow: 9px 13px 0 0 #222;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
padding: 0 1rem;
|
||||||
|
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
|
||||||
|
.project {
|
||||||
|
padding: 0.8rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.wanna-be-macchinista {
|
||||||
|
background: var(--homepage-macchinisti-bg);
|
||||||
|
color: #fdfdfd;
|
||||||
|
|
||||||
|
padding-bottom: 6rem;
|
||||||
|
|
||||||
|
.card {
|
||||||
|
max-width: 40rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
@extend .text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
& > main {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
section.principal {
|
||||||
|
padding: 3rem 0 6rem;
|
||||||
|
|
||||||
|
.whats-phc {
|
||||||
|
padding: 1.5rem;
|
||||||
|
|
||||||
|
margin: 0 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mobile-whats-phc-read-more {
|
||||||
|
&:checked ~ .text {
|
||||||
|
max-height: 7lh;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
height: 3lh;
|
||||||
|
|
||||||
|
background: linear-gradient(to bottom, transparent, #e4c5ff);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(:checked) ~ * .button span:nth-child(1) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
&:checked ~ * .button span:nth-child(2) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.news {
|
||||||
|
& > .news-list {
|
||||||
|
padding: 0 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.projects {
|
||||||
|
.project-list {
|
||||||
|
padding: 0 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section.wanna-be-macchinista {
|
||||||
|
.content {
|
||||||
|
padding: 0 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
padding: 1rem 1rem 4rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.utenti {
|
||||||
|
background: #ffffe4;
|
||||||
|
|
||||||
|
--filter-bg-color: #ffd270;
|
||||||
|
|
||||||
|
main {
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
padding: 5rem 0;
|
||||||
|
|
||||||
|
gap: 5rem;
|
||||||
|
|
||||||
|
max-width: 80ch;
|
||||||
|
|
||||||
|
.search-result {
|
||||||
|
background: #ffeabc;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
background: #ffd270;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.appunti {
|
||||||
|
main {
|
||||||
|
background: #e8e8e8;
|
||||||
|
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-auto-flow: row;
|
||||||
|
|
||||||
|
justify-items: center;
|
||||||
|
|
||||||
|
padding: 3rem;
|
||||||
|
|
||||||
|
gap: 3rem;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
&::after {
|
||||||
|
content: '';
|
||||||
|
width: 100%;
|
||||||
|
height: 80vh;
|
||||||
|
|
||||||
|
background: linear-gradient(to bottom, transparent, #e8e8e8);
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0;
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search {
|
||||||
|
max-width: 80ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appunti-scrollable {
|
||||||
|
justify-self: stretch;
|
||||||
|
|
||||||
|
&.center {
|
||||||
|
justify-self: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// .login {
|
||||||
|
// background: #ddfaff;
|
||||||
|
|
||||||
|
// main {
|
||||||
|
// justify-self: center;
|
||||||
|
|
||||||
|
// display: flex;
|
||||||
|
// flex-direction: column;
|
||||||
|
// align-items: center;
|
||||||
|
|
||||||
|
// max-width: 80ch;
|
||||||
|
// padding: 3rem 0;
|
||||||
|
|
||||||
|
// gap: 3rem;
|
||||||
|
|
||||||
|
// h3 {
|
||||||
|
// font-size: 28px;
|
||||||
|
// font-weight: 600;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
//
|
||||||
|
// Notizie
|
||||||
|
//
|
||||||
|
|
||||||
|
.notizie,
|
||||||
|
.notizia {
|
||||||
|
--card-base: color-mix(in lab, var(--news-base), #fff 25%);
|
||||||
|
--zone-color: color-mix(in lab, var(--news-base), #000 75%);
|
||||||
|
background: color-mix(in lab, var(--news-base), #fff 90%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.notizie {
|
||||||
|
h1 > a {
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline 3px solid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
padding: 5rem;
|
||||||
|
gap: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.notizia {
|
||||||
|
main {
|
||||||
|
--card-base: color-mix(in lab, var(--news-base), #fff 25%);
|
||||||
|
|
||||||
|
max-width: calc(46rem + 2rem * 2);
|
||||||
|
justify-self: center;
|
||||||
|
padding: 3rem 2rem 2rem;
|
||||||
|
|
||||||
|
margin-top: 3rem;
|
||||||
|
margin-bottom: 6rem;
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
box-shadow: none;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
max-width: none;
|
||||||
|
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Guide
|
||||||
|
//
|
||||||
|
|
||||||
|
.guide,
|
||||||
|
.guida {
|
||||||
|
--card-base: color-mix(in lab, var(--guide-base), #fff 25%);
|
||||||
|
--zone-color: color-mix(in lab, var(--guide-base), #000 75%);
|
||||||
|
background: color-mix(in lab, var(--guide-base), #fff 90%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.guide {
|
||||||
|
h1 > a {
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline 3px solid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
padding: 5rem;
|
||||||
|
gap: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.guida {
|
||||||
|
main {
|
||||||
|
--card-base: color-mix(in lab, var(--guide-base), #fff 50%);
|
||||||
|
|
||||||
|
max-width: calc(46rem + 2rem * 2);
|
||||||
|
justify-self: center;
|
||||||
|
padding: 3rem 2rem 2rem;
|
||||||
|
|
||||||
|
margin-top: 3rem;
|
||||||
|
margin-bottom: 6rem;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
.metadata {
|
||||||
|
position: absolute;
|
||||||
|
top: -2px;
|
||||||
|
left: calc(100% + 2rem);
|
||||||
|
width: 15rem;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-auto-flow: row;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
justify-items: start;
|
||||||
|
|
||||||
|
.metadata-item {
|
||||||
|
background: var(--card-base);
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-rows: auto auto;
|
||||||
|
justify-items: start;
|
||||||
|
gap: 0.25rem;
|
||||||
|
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
|
||||||
|
@include neo-brutalist-card($size: 3px);
|
||||||
|
|
||||||
|
.tags {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: $screen-desktop-min) {
|
||||||
|
box-shadow: none;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
max-width: none;
|
||||||
|
|
||||||
|
margin: 0 auto;
|
||||||
|
|
||||||
|
.metadata {
|
||||||
|
position: static;
|
||||||
|
padding: 0;
|
||||||
|
width: auto;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
--card-base: color-mix(in lab, var(--guide-base), #fff 30%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag {
|
||||||
|
main {
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
padding: 5rem 0;
|
||||||
|
gap: 5rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.storia {
|
||||||
|
--card-base: #e4c5ff;
|
||||||
|
|
||||||
|
main {
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
padding: 5rem 0;
|
||||||
|
gap: 3rem;
|
||||||
|
|
||||||
|
// background horizontal linear gradient that is black in the center
|
||||||
|
background: linear-gradient(
|
||||||
|
to right,
|
||||||
|
#ffe4c544 0%,
|
||||||
|
// #ffe4c599 25%,
|
||||||
|
#ffe4c5ff 50%,
|
||||||
|
// #ffe4c599 75%,
|
||||||
|
#ffe4c544 100%
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Meta
|
||||||
|
//
|
||||||
|
|
||||||
|
.design {
|
||||||
|
grid-template-columns: minmax(15rem, 2fr) 10fr;
|
||||||
|
|
||||||
|
@media screen and (max-width: 1400px) {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
aside {
|
||||||
|
margin: 1rem;
|
||||||
|
padding: 1rem;
|
||||||
|
|
||||||
|
@include neo-brutalist-card();
|
||||||
|
|
||||||
|
background: #f0f0f0;
|
||||||
|
|
||||||
|
align-self: start;
|
||||||
|
position: sticky;
|
||||||
|
top: 7rem;
|
||||||
|
height: calc(100dvh - 8rem - 6rem);
|
||||||
|
|
||||||
|
nav {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.25rem;
|
||||||
|
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.25rem;
|
||||||
|
|
||||||
|
li {
|
||||||
|
padding-left: calc((var(--depth) - 1) * 1rem);
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 600;
|
||||||
|
|
||||||
|
transform: translate(-0.25rem, 0);
|
||||||
|
|
||||||
|
padding: 0.125rem 0.25rem;
|
||||||
|
border-radius: 0.125rem;
|
||||||
|
|
||||||
|
color: #444;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
background: #00000018;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (max-width: 1400px) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
grid-column: 1 / -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
justify-self: center;
|
||||||
|
|
||||||
|
@media screen and (min-width: $screen-desktop-min) {
|
||||||
|
padding: 3rem 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pre[data-language='astro'] {
|
||||||
|
--code-bg: #fff7ef;
|
||||||
|
|
||||||
|
width: 100%;
|
||||||
|
max-width: 46rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
margin: 2rem auto;
|
||||||
|
|
||||||
|
border: 2px dashed #ddd;
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
|
||||||
|
&.large {
|
||||||
|
min-width: calc(100% - 4rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:not(.large) {
|
||||||
|
& > .content {
|
||||||
|
display: grid;
|
||||||
|
place-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .content {
|
||||||
|
padding: 2rem;
|
||||||
|
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
// label in the top left corner
|
||||||
|
&::before {
|
||||||
|
content: 'Preview';
|
||||||
|
position: absolute;
|
||||||
|
|
||||||
|
bottom: 100%;
|
||||||
|
left: 0;
|
||||||
|
|
||||||
|
padding: 0.125rem 0.5rem;
|
||||||
|
|
||||||
|
background: #eee;
|
||||||
|
color: #000;
|
||||||
|
|
||||||
|
font-family: 'Iosevka', monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
|
||||||
|
z-index: -1;
|
||||||
|
|
||||||
|
transform: translate(-2px, -4px);
|
||||||
|
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 64ms ease-in;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: #bbb;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.palette {
|
||||||
|
margin: 2rem auto;
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: auto auto;
|
||||||
|
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
place-content: center;
|
||||||
|
|
||||||
|
& > .color {
|
||||||
|
width: 2rem;
|
||||||
|
height: 2rem;
|
||||||
|
border-radius: 0.25rem;
|
||||||
|
|
||||||
|
border: 2px solid #000;
|
||||||
|
box-shadow: 4px 4px 0 0 #000;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
& > .region {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
border: 2px solid #fff;
|
||||||
|
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .label {
|
||||||
|
display: grid;
|
||||||
|
align-content: center;
|
||||||
|
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 16px;
|
||||||
|
|
||||||
|
user-select: all;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,55 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
main {
|
|
||||||
background: #e8e8e8;
|
|
||||||
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-auto-flow: row;
|
|
||||||
|
|
||||||
justify-items: center;
|
|
||||||
|
|
||||||
padding: 3rem;
|
|
||||||
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
width: 100%;
|
|
||||||
height: 80vh;
|
|
||||||
|
|
||||||
background: linear-gradient(to bottom, transparent, #e8e8e8);
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search {
|
|
||||||
max-width: 80ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
.appunti-scrollable {
|
|
||||||
justify-self: stretch;
|
|
||||||
|
|
||||||
&.center {
|
|
||||||
justify-self: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
overflow: clip;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
:root {
|
|
||||||
--card-base: hsl(180, 100%, 85%);
|
|
||||||
}
|
|
||||||
|
|
||||||
@layer page {
|
|
||||||
body {
|
|
||||||
background: hsl(180, 100%, 95%);
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 4rem 0;
|
|
||||||
|
|
||||||
gap: 2rem;
|
|
||||||
|
|
||||||
.search {
|
|
||||||
max-width: 80ch;
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
background: hsl(180, 100%, 72%);
|
|
||||||
}
|
|
||||||
|
|
||||||
.card a {
|
|
||||||
color: color-mix(in srgb, var(--card-base-internal), #000 80%);
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
body {
|
|
||||||
--card-base: color-mix(in lab, var(--guide-base), #fff 25%);
|
|
||||||
--zone-color: color-mix(in lab, var(--guide-base), #000 75%);
|
|
||||||
background: color-mix(in lab, var(--guide-base), #fff 90%);
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
--card-base: color-mix(in lab, var(--guide-base), #fff 50%);
|
|
||||||
|
|
||||||
max-width: calc(46rem + 2rem * 2);
|
|
||||||
justify-self: center;
|
|
||||||
padding: 3rem 2rem 2rem;
|
|
||||||
|
|
||||||
margin-top: 3rem;
|
|
||||||
margin-bottom: 6rem;
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.metadata {
|
|
||||||
position: absolute;
|
|
||||||
top: -2px;
|
|
||||||
left: calc(100% + 2rem);
|
|
||||||
width: 15rem;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-auto-flow: row;
|
|
||||||
gap: 1rem;
|
|
||||||
|
|
||||||
justify-items: start;
|
|
||||||
|
|
||||||
.metadata-item {
|
|
||||||
background: var(--card-base);
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-template-rows: auto auto;
|
|
||||||
justify-items: start;
|
|
||||||
gap: 0.25rem;
|
|
||||||
|
|
||||||
padding: 0.75rem 1rem;
|
|
||||||
|
|
||||||
/* @include neo-brutalist-card($size: 3px); */
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 3px 3px 0 0 #222;
|
|
||||||
|
|
||||||
.tags {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 0.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
box-shadow: none;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
max-width: none;
|
|
||||||
|
|
||||||
margin: 0 auto;
|
|
||||||
padding: 3rem 1rem 2rem;
|
|
||||||
|
|
||||||
.metadata {
|
|
||||||
position: static;
|
|
||||||
padding: 0;
|
|
||||||
width: auto;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
--card-base: color-mix(in lab, var(--guide-base), #fff 30%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
body {
|
|
||||||
--card-base: color-mix(in lab, var(--guide-base), #fff 25%);
|
|
||||||
--zone-color: color-mix(in lab, var(--guide-base), #000 75%);
|
|
||||||
background: color-mix(in lab, var(--guide-base), #fff 90%);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 > a {
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline 3px solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 5rem 2.5rem;
|
|
||||||
gap: 5rem;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
grid-template-rows: auto 1fr auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,354 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
header:has(#header-menu-toggle:not(:checked)) .logo {
|
|
||||||
visibility: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
section {
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
min-height: calc(100vh - 6rem);
|
|
||||||
|
|
||||||
&:last-of-type {
|
|
||||||
min-height: calc(100vh - 10rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
& {
|
|
||||||
display: grid;
|
|
||||||
grid-auto-flow: row;
|
|
||||||
justify-items: center;
|
|
||||||
align-content: start;
|
|
||||||
|
|
||||||
gap: 2rem;
|
|
||||||
|
|
||||||
scroll-snap-align: start;
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .title {
|
|
||||||
font-size: 48px;
|
|
||||||
padding-top: 4rem;
|
|
||||||
|
|
||||||
@media screen and (max-width: /* $screen-desktop-min */ 1024px) {
|
|
||||||
padding-top: 2rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.zig-zag {
|
|
||||||
z-index: 5;
|
|
||||||
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
bottom: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.principal {
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
min-height: calc(100vh - 7rem);
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
|
|
||||||
align-items: center;
|
|
||||||
place-content: center;
|
|
||||||
|
|
||||||
gap: 4rem;
|
|
||||||
|
|
||||||
padding: 3rem 2rem 6rem;
|
|
||||||
|
|
||||||
background: var(--homepage-principal-bg);
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
.circuit-layer {
|
|
||||||
pointer-events: none;
|
|
||||||
|
|
||||||
z-index: 1;
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
canvas {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .logo {
|
|
||||||
z-index: 2;
|
|
||||||
|
|
||||||
width: 32rem;
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
user-select: none;
|
|
||||||
|
|
||||||
img {
|
|
||||||
width: 100%;
|
|
||||||
/* filter: drop-shadow(6px 6px 0 var(--palette-black))
|
|
||||||
drop-shadow(4px 0 0 var(--palette-black)) drop-shadow(0 4px 0 var(--palette-black))
|
|
||||||
drop-shadow(-4px 0 0 var(--palette-black)) drop-shadow(0 -4px 0 var(--palette-black)); */
|
|
||||||
}
|
|
||||||
|
|
||||||
max-width: calc(100vw - 3rem);
|
|
||||||
@media screen and (max-width: /* $screen-desktop-min */ 1024px) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .whats-phc {
|
|
||||||
z-index: 2;
|
|
||||||
background: #e4c5ff;
|
|
||||||
|
|
||||||
--zone-color: color-mix(in lab, #e4c5ff, #000 75%);
|
|
||||||
|
|
||||||
max-width: 37rem;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: underline 2px solid;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
--zone-color: color-mix(in lab, #e4c5ff, #000 60%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
span.highlighted {
|
|
||||||
background: color-mix(in lab, #e4c5ff, #000 10%);
|
|
||||||
cursor: default;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
padding: 0.125rem 0.25rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.news {
|
|
||||||
--card-base: color-mix(in lab, var(--news-base), #fff 25%);
|
|
||||||
--zone-color: color-mix(in lab, var(--news-base), #000 50%);
|
|
||||||
|
|
||||||
background: var(--homepage-news-bg);
|
|
||||||
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
padding-bottom: 6rem;
|
|
||||||
|
|
||||||
& > .news-list {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
align-items: flex-start;
|
|
||||||
|
|
||||||
padding: 0 3rem;
|
|
||||||
|
|
||||||
justify-content: center;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
[role='button'] {
|
|
||||||
padding: 0.5rem 2rem;
|
|
||||||
|
|
||||||
&.primary {
|
|
||||||
background: #ffdd6e;
|
|
||||||
color: #000d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
grid-template-rows: auto auto 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.projects {
|
|
||||||
background: var(--homepage-projects-bg);
|
|
||||||
|
|
||||||
padding-bottom: 6rem;
|
|
||||||
|
|
||||||
.project-list {
|
|
||||||
/* width: calc(20rem * 3 + 1.5rem * 2 + 6rem * 2);
|
|
||||||
max-width: calc(100vw - 2rem); */ /* HACK: capire come si propagano le width per bene */
|
|
||||||
|
|
||||||
max-width: calc(20rem * 3 + 1.5rem * 2 + 1rem * 2);
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
|
|
||||||
grid-auto-flow: dense;
|
|
||||||
|
|
||||||
gap: 1.5rem;
|
|
||||||
padding: 0 1rem;
|
|
||||||
|
|
||||||
& > * {
|
|
||||||
grid-row: span var(--masonry-height);
|
|
||||||
}
|
|
||||||
|
|
||||||
.project {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
/* background: #fcddff;
|
|
||||||
background: #ffa89c; */
|
|
||||||
background: var(--card-bg, var(--project-card-bg));
|
|
||||||
color: var(--card-fg, #000e);
|
|
||||||
|
|
||||||
/* @include neo-brutalist-card($size: 3px, $offset: 9px); */
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 9px 9px 0 0 #222;
|
|
||||||
|
|
||||||
padding: 1rem;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: auto 1fr;
|
|
||||||
grid-template-rows: auto 1fr;
|
|
||||||
|
|
||||||
gap: 0.25rem 1rem;
|
|
||||||
|
|
||||||
transition: all 128ms ease-out;
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 32px;
|
|
||||||
|
|
||||||
@media screen and (max-width: /* $screen-desktop-min */ 1024px) {
|
|
||||||
font-size: 24px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.image {
|
|
||||||
grid-row: span 2;
|
|
||||||
/* place-self: center; */
|
|
||||||
|
|
||||||
.box {
|
|
||||||
background: #0003;
|
|
||||||
border: 3px solid #0006;
|
|
||||||
border-radius: 6px;
|
|
||||||
width: 4rem;
|
|
||||||
height: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
|
||||||
object-fit: cover;
|
|
||||||
width: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* &.auto {
|
|
||||||
img {
|
|
||||||
width: auto;
|
|
||||||
height: auto;
|
|
||||||
}
|
|
||||||
} */
|
|
||||||
}
|
|
||||||
|
|
||||||
.description {
|
|
||||||
font-size: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
transform: translate(0, -4px);
|
|
||||||
box-shadow: 9px 13px 0 0 #222;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: /* $screen-desktop-min */ 1024px) {
|
|
||||||
padding: 0 1rem;
|
|
||||||
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
|
|
||||||
.project {
|
|
||||||
padding: 0.8rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.wanna-be-macchinista {
|
|
||||||
background: var(--homepage-macchinisti-bg);
|
|
||||||
color: #fdfdfd;
|
|
||||||
|
|
||||||
padding-bottom: 6rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
max-width: 40rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* .content {
|
|
||||||
/* @extend .text;
|
|
||||||
/* Placeholder: Assuming .text is a class with common text styles, you might want to define those styles directly here or in a separate CSS rule.
|
|
||||||
} */
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: /* $screen-desktop-min */ 1024px) {
|
|
||||||
main {
|
|
||||||
padding: 0 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
section.principal {
|
|
||||||
padding: 3rem 0 6rem;
|
|
||||||
|
|
||||||
.whats-phc {
|
|
||||||
padding: 1.5rem;
|
|
||||||
|
|
||||||
margin: 0 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#mobile-whats-phc-read-more {
|
|
||||||
&:checked ~ .text {
|
|
||||||
max-height: 7lh;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 3lh;
|
|
||||||
|
|
||||||
background: linear-gradient(to bottom, transparent, #e4c5ff);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(:checked) ~ * .button span:nth-child(1) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
&:checked ~ * .button span:nth-child(2) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.news {
|
|
||||||
& > .news-list {
|
|
||||||
padding: 0 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.projects {
|
|
||||||
.project-list {
|
|
||||||
padding: 0 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section.wanna-be-macchinista {
|
|
||||||
.content {
|
|
||||||
padding: 0 1rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
section {
|
|
||||||
padding: 1rem 1rem 4rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
background: linear-gradient(to top, #d5fbff, #ffd9d5);
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 4.5rem 3rem;
|
|
||||||
gap: 4.5rem;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,190 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
body {
|
|
||||||
grid-template-columns: minmax(15rem, 2fr) 10fr;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1400px) {
|
|
||||||
grid-template-columns: 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
aside {
|
|
||||||
margin: 1rem;
|
|
||||||
padding: 1rem;
|
|
||||||
|
|
||||||
/* @include neo-brutalist-card(); */
|
|
||||||
border: 3px solid #222;
|
|
||||||
border-radius: 6px;
|
|
||||||
box-shadow: 3px 3px 0 0 #222;
|
|
||||||
|
|
||||||
background: #f0f0f0;
|
|
||||||
|
|
||||||
align-self: start;
|
|
||||||
position: sticky;
|
|
||||||
top: 7rem;
|
|
||||||
height: calc(100dvh - 8rem - 6rem);
|
|
||||||
|
|
||||||
nav {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.25rem;
|
|
||||||
|
|
||||||
ul {
|
|
||||||
list-style: none;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: 0.25rem;
|
|
||||||
|
|
||||||
li {
|
|
||||||
padding-left: calc((var(--depth) - 1) * 1rem);
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
|
|
||||||
a {
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
|
|
||||||
transform: translate(-0.25rem, 0);
|
|
||||||
|
|
||||||
padding: 0.125rem 0.25rem;
|
|
||||||
border-radius: 0.125rem;
|
|
||||||
|
|
||||||
color: #444;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
background: #00000018;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 1400px) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
footer {
|
|
||||||
grid-column: 1 / -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
@media screen and (min-width: /* $screen-desktop-min */ 1024px) {
|
|
||||||
padding: 3rem 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pre[data-language='astro'] {
|
|
||||||
--code-bg: #fff7ef;
|
|
||||||
|
|
||||||
width: 100%;
|
|
||||||
max-width: 46rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
margin: 2rem auto;
|
|
||||||
|
|
||||||
border: 2px dashed #ddd;
|
|
||||||
|
|
||||||
position: relative;
|
|
||||||
z-index: 1;
|
|
||||||
|
|
||||||
&.large {
|
|
||||||
min-width: calc(100% - 4rem);
|
|
||||||
}
|
|
||||||
|
|
||||||
&:not(.large) {
|
|
||||||
& > .content {
|
|
||||||
display: grid;
|
|
||||||
place-content: center;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .content {
|
|
||||||
padding: 2rem;
|
|
||||||
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* label in the top left corner */
|
|
||||||
&::before {
|
|
||||||
content: 'Preview';
|
|
||||||
position: absolute;
|
|
||||||
|
|
||||||
bottom: 100%;
|
|
||||||
left: 0;
|
|
||||||
|
|
||||||
padding: 0.125rem 0.5rem;
|
|
||||||
|
|
||||||
background: #eee;
|
|
||||||
color: #000;
|
|
||||||
|
|
||||||
font-family: var(--font-display);
|
|
||||||
font-size: 14px;
|
|
||||||
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
|
|
||||||
z-index: -1;
|
|
||||||
|
|
||||||
transform: translate(-2px, -4px);
|
|
||||||
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 64ms ease-in;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
border-color: #bbb;
|
|
||||||
|
|
||||||
&::before {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.palette {
|
|
||||||
margin: 2rem auto;
|
|
||||||
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: auto auto;
|
|
||||||
|
|
||||||
gap: 1rem;
|
|
||||||
|
|
||||||
place-content: center;
|
|
||||||
|
|
||||||
& > .color {
|
|
||||||
width: 2rem;
|
|
||||||
height: 2rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
|
|
||||||
border: 2px solid #000;
|
|
||||||
box-shadow: 4px 4px 0 0 #000;
|
|
||||||
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
& > .region {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
|
|
||||||
border: 2px solid #fff;
|
|
||||||
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
& > .label {
|
|
||||||
display: grid;
|
|
||||||
align-content: center;
|
|
||||||
|
|
||||||
font-family: 'JetBrains Mono', var(--font-mono);
|
|
||||||
font-size: 16px;
|
|
||||||
|
|
||||||
user-select: all;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
:root {
|
|
||||||
--card-base: color-mix(in lab, var(--news-base), #fff 25%);
|
|
||||||
--zone-color: color-mix(in lab, var(--news-base), #000 75%);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background: color-mix(in lab, var(--news-base), #fff 90%);
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
max-width: calc(46rem + 2rem * 2);
|
|
||||||
justify-self: center;
|
|
||||||
padding: 3rem 2rem 2rem;
|
|
||||||
|
|
||||||
margin-top: 3rem;
|
|
||||||
margin-bottom: 6rem;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
box-shadow: none;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
max-width: none;
|
|
||||||
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
@layer page {
|
|
||||||
:root {
|
|
||||||
--card-base: color-mix(in lab, var(--news-base), #fff 25%);
|
|
||||||
--zone-color: color-mix(in lab, var(--news-base), #000 75%);
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background: color-mix(in lab, var(--news-base), #fff 90%);
|
|
||||||
}
|
|
||||||
|
|
||||||
h1 > a {
|
|
||||||
&:hover {
|
|
||||||
text-decoration: underline 3px solid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 5rem;
|
|
||||||
gap: 5rem;
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.card {
|
|
||||||
grid-template-rows: auto auto 1fr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
:root {
|
|
||||||
--card-base: #e4c5ff;
|
|
||||||
}
|
|
||||||
|
|
||||||
@layer page {
|
|
||||||
main {
|
|
||||||
justify-self: center;
|
|
||||||
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
|
|
||||||
padding: 5rem 0;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
/* background horizontal linear gradient that is black in the center */
|
|
||||||
background: linear-gradient(
|
|
||||||
to right,
|
|
||||||
#ffe4c544 0%,
|
|
||||||
/* #ffe4c599 25%, */ #ffe4c5ff 50%,
|
|
||||||
/* #ffe4c599 75%, */ #ffe4c544 100%
|
|
||||||
);
|
|
||||||
|
|
||||||
@media screen and (max-width: 1024px) {
|
|
||||||
padding: 3rem 1rem;
|
|
||||||
gap: 3rem;
|
|
||||||
|
|
||||||
.card {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||