transitioned basic structure and interaction over to webc

This commit is contained in:
suroh 2023-10-26 20:13:03 +02:00
parent 3860c9dd79
commit b33f264c61
6 changed files with 718 additions and 0 deletions

142
_content/cv.md Normal file
View File

@ -0,0 +1,142 @@
---
title: cv
layout: page.webc
category: root
---
## Max Franklin
_mx[at]suroh.tk_<br>
_+33 (0) 7 66 14 33 99_<br>
_[@suroh@post.lurk.org](https://post.lurk.org/@suroh)_
### Education
_Piet Zwart Institute_<br>
2016 - 2018 // Rotterdam, NL<br>
Master's in Media Design : Experimental Publishing
_Conservatorium of Sydney (University of Sydney)_<br>
2009 // Sydney, AU<br>
Bachelor Jazz Performance (Saxophone) &amp; Creative Sound Engineering
### Teaching
_Willem de Kooning Academie_<br>
2020 - current // Rotterdam, NL<br>
Tutor within the Graphic Design Major
_Paris College of Art_<br>
2014 - 2022 // Paris, FR<br>
Faculty Member within the Communication Design department
_LISAA Graphic Design_<br>
2020 - 2021 // Paris, FR<br>
Faculty Member within the Graphic Design department
_École Européenne des Métiers de l'Internet_<br>
2018 - 2019 // Paris, FR<br>
Faculty Member within the Graphic Design department
### Selected Exhibitions & Events
_Sounds to See_<br>
Sign Gallery<br>
2019 // Groningen, NL<br>
Group exhibition. Presented _A Container in Two Movements_.
_Autonomous Archive_<br>
Het Nieuw Instituut<br>
2017 // Rotterdam, NL<br>
Archival machine, installation and research project centred around autonomous living and archival practices. Presented alongside the Architecture of Appropriation exhibition.
_TGC#3 : Euclid_<br>
De Player<br>
2017 // Rotterdam, NL<br>
Experimental sound publication object and performative instrument. Collaborative project between De Player and the Piet Zwart Experimental Publishing unit.</p>
_LowTechLabLondon2016_<br>
Saatchi Gallery<br>
2016 // London, UK<br>
International art lab organised by Raul Marroquin around the theme of Low Tech.
_Festival de Projets Scolaires_<br>
La Gaîté lyrique<br>
2016 // Paris, FR<br>
Partnership workshop show with Paris College of Art students and faculty.
_IDENTITE REVE(L)EE_<br>
*Mi Gallery<br>
Paris Digital Week<br>
2015 // Paris, FR<br>
Collaborative piece presented at *Mi Gallery as part of Paris Digital Week.
_Barcu Art Fair_<br>
2015 // Bogota, CO<br>
Presentation via Skype on Collaborative Art, Interactivity and Improvisation.
### Recent PRogrammes & Resdencies
_Thresholds of the Algorithmic_<br>
Algorithms that Matter<br>
2018 // Bergen, NO<br>
Workshop-in-Exposition is a hybrid format that places the workshop inside an exhibition context, where the exposed works and artefacts form the basis of the workshops activity.
_Get a Room Residency_<br>
Frontyard<br>
2018 // Sydney, AU<br>
Research residency around Master's research on Software and Improvisation.
### Sound
#### Performances
_alternative echelons_<br>
2020 // UBIK, Rotterdam, NL<br>
_Design Days Finnisage_<br>
Espace 15<br>
2019 // Paris, FR
_Read My Lips: No New Taxes_<br>
Galerie Lecq
2019 // Rotterdam, NL
_E-ARTHA_<br>
DePlayer
2018 // Rotterdam, NL
_North Sea Jazz Around Town_<br>
VARIA<br>
2018 // Rotterdam, NL
_POST TOAST_<br>
Red Light Radio<br>
2018 // Amsterdam, NL
#### Soundtracks
_alternative echelons_ (trailer)<br>
by Amy Pickles<br>
2019
_Ghost Terminal_<br>
by Ryan Cherewaty<br>
2019
_Memory of Death's Dream_<br>
by Ryan Cherewaty<br>
2019
### Professional Experience
_Willem de Kooning Academie_<br>
2018 // Rotterdam, NL<br>
Publication Station teaching and technical assistant
_Freelance Graphic Designer_<br>
2009 2014 // Sydney, AU<br>
Web-design, poster and album design
_Linear Recording_<br>
2009 2010 // Sydney, AU<br>
Assistant Sound Engineer</p>

30
_includes/base.webc Normal file
View File

@ -0,0 +1,30 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title @text="site.name"></title>
<meta name="generator" :content="site.generator">
<!-- styles -->
<link rel="stylesheet" href="/assets/css/main.css" webc:keep>
<!-- `defer` bucket -->
<style @raw="getBundle('css')" webc:keep></style>
<script type="module" @raw="getBundle('js')" webc:keep></script>
<!-- javascript -->
<!-- <script src="../assets/js/script.js" type="module" webc:keep></script> -->
<!-- tracking -->
</head>
<body>
<nav-primary :categories="collections.categories"></nav-primary>
<template @raw="content" webc:nokeep></template>
</body>
</html>

View File

@ -0,0 +1,53 @@
<span :category="category" :link="link" webc:nokeep><slot>█</slot></span>
<script type="module">
class NavLink extends HTMLElement {
connectedCallback() {
// remove whitespace
const span = this.querySelector(':scope span')
if (span) {
span.nextSibling.remove()
}
this.nextSibling.remove()
}
}
customElements.define('nav-link', NavLink)
</script>
<style webc:scoped>
:host {
--color-solid: #1e1e3cff;
--color-transparent: #1e1e3c33;
display: flex;
position: relative;
color: var(--color-transparent);
transition: color ease 0.5s;
}
:host:hover {
color: var(--color-solid);
transition: color ease 0.1s;
cursor: pointer;
}
:host.active {
color: var(--color-solid);
transition: color 1s ease, padding-inline-end 1s ease;
}
:host::after {
content: attr(data-name);
display: block;
max-width: 0px;
overflow: hidden;
transition: max-width 0.5s ease;
}
:host.active::after {
padding-inline-start: 0.225em;
max-width: 10em;
}
</style>

View File

@ -0,0 +1,133 @@
<nav id="primary">
<nav-link link="/" data-name="~"><~</nav-link>
<nav-link webc:for="c in categories" :category="c" :data-name="c"></nav-link>
<button class="audioToggle"></button>
</nav>
<nav id="sub" slot="subnav">
<ul webc:for="(c, pages) in categories" :data-name="c">
<li webc:for="p of pages">
<a :href="p.url" @text="p.data.title || p.fileSlug"></a>
</li>
</ul>
</nav>
<section style="position: fixed; bottom: 0; left: 0; margin: 0; padding: 0; width: 100vw; height: 0px; overflow: visible; z-index: 100;mix-blend-mode: difference;">
<h1 id="menuItem"></h1>
</section>
<nav id="toTop">
<span>top</span>
</nav>
<script type="module">
class NavPrimary extends HTMLElement {
categories = []
subs = []
connectedCallback() {
this.categories = this.querySelectorAll('nav-link')
this.subs = this.querySelectorAll('ul')
this.activate()
window.addEventListener('popstate', (evt) => {
this.activate()
})
this.categories.forEach(n => {
n.addEventListener('click',() => {
const category = n.attributes.getNamedItem('category')
const link = n.attributes.getNamedItem('link')
if (link) {
history.pushState({}, '', link.value)
location.pathname = link.value
} else if (category) {
location.hash = category.value
}
})
})
}
activate() {
this.categories.forEach(i => {
const { value } = i.attributes.getNamedItem('category') || i.attributes.getNamedItem('link')
if (value != '/' && (value == location.hash.replace('#', '') || value == location.pathname)) {
i.classList.add('active')
} else {
i.classList.remove('active')
}
})
this.subs.forEach(s => {
const { name } = s.dataset
if (name == location.hash.replace('#', '') || name == location.pathname) {
s.classList.add('active')
} else {
s.classList.remove('active')
}
})
}
}
customElements.define('nav-primary', NavPrimary)
</script>
<style webc:scoped>
/* => CONTAINER */
nav {
display: flex;
margin: 1em var(--page-margin-inline) 0.5em;
font-size: 1.5em;
}
/* => LINKS */
nav-link {
padding-inline: 0.125em;
}
/* => AUDIO TOGGLE */
.audioToggle {
background: none;
border: none;
margin-inline-start: auto;
transition: color ease-in-out 0.1s;
}
.audioToggle:hover {
color: #CECECE;
cursor: pointer;
transition: color ease-in-out 0.1s;
}
.audioToggle::after {
content: '🔇'
}
.audioToggle.active::after {
content: '🔉'
}
/* => SUb NAV */
#sub {
display: grid;
grid-template: 1fr / 1fr;
}
#sub > ul {
grid-row: 1 / span 1;
grid-column: 1 / span 1;
max-height: 0px;
overflow: hidden;
transition: max-height 0.5s cubic-bezier(.22,.61,.36,1);
}
ul.active {
max-height: 50vh !important;
}
</style>

16
_includes/page.webc Normal file
View File

@ -0,0 +1,16 @@
---
layout: base.webc
---
<section class="page">
<div :if="imgFeat" class="imgFeat">
<img src="{{imgFeat}}" alt="">
</div>
<section class="text {{url}}" @raw="content">
</section>
<section :if="gallery" class="imgs">
<img for="img of gallery" src="{{img}}" alt="">
</section class="imgs">
</section>

344
assets/css/main.css Normal file
View File

@ -0,0 +1,344 @@
/* PAGE STYLES */
@import url(https://cdn.jsdelivr.net/gh/tonsky/FiraCode@1.206/distr/fira_code.css);
* {
scroll-behavior: smooth;
}
/* --> BASE STYLES <-- */
:root {
--page-margin-inline: 1em;
--neutral-900: #1e1e3cff;
--neutral-900-25: #1e1e3c33;
}
body {
font-family: 'fira code', monospace;
color: #1e1e3cff;
}
p {
max-width: 80ch;
}
p > img:first-of-type {
margin-top: 2em;
}
em {
font-family: serif;
font-size: 1.03em;
}
a, a:visited {
color: #1e1e3cff;
padding-bottom: 2px;
text-decoration: none;
border-bottom: 1px #1e1e3c50 solid;
transition: color ease 0.5s, border ease 0.2s;
}
img {
max-width: 100%;
height: auto;
}
hr {
border-bottom: thin dotted grey;
border-top: none;
border-left: none;
border-right: none;
}
section {
isolation: auto;
}
/* --> LISTS <-- */
ul {
list-style: none;
margin-left: 16px;
padding-left: 0;
}
li {
padding: 0.2em 0 0.2em 1em;
text-indent: -0.5em;
}
li:before {
content: "▸";
padding-right: 16px;
}
/* --> NAVIGATION <-- */
nav#toTop {
position: fixed;
display: inline-block;
visibility: hidden;
top: calc(95vh - 2em);
right: 3em;
overflow: hidden;
padding: 0 0em 0.25em;
z-index: 100;
}
nav#toTop.active {
visibility: visible;
}
nav#toTop > span {
display: block;
opacity: 0.0;
transform: translateY(-2em);
background-color: rgba(255,255,255,0.0);
padding: 0.3em 0.5em 0.5em;
border-radius: 1em;
transition: transform ease 0.5s, opacity ease 1s, background-color ease 0.5s 0.5s;
}
nav#toTop > span::after {
font-size: 1.25em;
content: '△'
}
nav#toTop.active > span {
opacity: 0.5;
background-color: rgba(255,255,255,0.9);
transform: translateY(0em);
}
nav#toTop.active > span:hover {
opacity: 1;
cursor: pointer;
}
h1#menuItem {
position: absolute;
line-height: inherit;
bottom: -500px;
margin: 0;
padding: 0;
font-size: 33vw;
opacity: 0;
transform: translateY(100px);
transform-origin: bottom left;
mix-blend-mode: difference;
transition: opacity ease-in-out 0.1s, transform ease-in-out 0.1s;
}
h1#menuItem.active {
mix-blend-mode: difference;
opacity: 1 !important;
transform: translateY(-600px) !important;
}
/* --> MAINPAGE CONSTRUCTION <-- */
nav#sub > ul {
margin: 0;
padding: 0;
list-style: none !important;
}
nav#sub > ul > li {
border-left: thin solid #d2d2d8;
text-decoration: none;
padding: 5px 10px;
}
nav#sub > ul > li:before {
content: "";
padding-right: 16px;
}
nav#sub > ul > li:hover {
background: #d2d2d8;
cursor: pointer;
}
nav#sub > ul > li > a {
border: none;
}
/* --> SUBCONTENT CONSTRUCTION <-- */
section.page {
display: grid;
animation: fadeIn 1s ease;
margin-inline: var(--page-margin-inline);
}
section.page h1 {
margin: 0px;
padding: 0px;
}
@media screen and (min-width: 1360px) {
body {
font-size: 19px;
line-height: 24px;
margin: 0;
padding: 0;
}
/* --> MAINPAGE CONSTRUCTION <-- */
section ul.subMenu {
font-size: 1.5em;
}
/* --> SUBCONTENT CONSTRUCTION <-- */
section.page {
max-width: 1960px;
grid-template-columns: repeat(5, 1fr);
gap: 24px;
}
section.page h1 {
margin-top: 0.25em;
margin-bottom: 0.4em;
font-size: 6em;
line-height: 0.95em;
}
section.page div.imgFeat {
grid-column: span 4;
}
section.page section.imgs {
grid-column: 4 / span 2;
grid-row: 2;
}
section.page section.imgs>img {
max-width: 100%;
margin-bottom: 24px;
height: auto;
}
section.page section.text {
grid-column: 1 / span 3;
grid-row: 2;
}
}
@media screen and (max-width: 1359px) {
body {
font-size: 19px;
line-height: 24px;
margin: 0;
padding: 0;
}
/* --> NAVIGATION <-- */
nav {
margin: 23px 0px 8px;
font-size: 1.5em;
}
nav>span {
margin-right: 8px;
}
nav>span.active::after {
margin-left: 8px;
}
/* --> MAINPAGE CONSTRUCTION <-- */
section ul.subMenu {
font-size: 1.5em;
}
/* --> SUBCONTENT CONSTRUCTION <-- */
section.page {
max-width: 1960px;
grid-template-columns: repeat(5, 1fr);
gap: 24px;
}
section.page h1 {
margin-top: 0.25em;
margin-bottom: 0.5em;
font-size: 4em;
line-height: 0.95em;
}
section.page div.imgFeat {
grid-column: span 4;
}
section.page section.imgs {
grid-column: 4 / span 2;
grid-row: 2
}
section.page section.imgs>img {
max-width: 100%;
height: auto;
}
section.page section.text {
grid-column: 1 / span 3;
grid-row: 2;
}
}
@media screen and (max-width: 800px) {
body {
font-size: 20px;
line-height: 24px;
margin: 0;
padding: 0;
}
/* --> NAVIGATION <-- */
nav {
margin: 23px 0px 8px;
font-size: 1.75em;
}
nav>span {
margin-right: 8px;
}
nav>span.active::after {
position: relative;
top: 2px;
margin-left: 8px;
}
/* --> MAINPAGE CONSTRUCTION <-- */
/* --> SUBCONTENT CONSTRUCTION <-- */
section.page {
display: inherit;
max-width: 650px;
grid-gap: 24px;
}
section.page h1 {
margin-top: 0.35em;
margin-bottom: 0.5em;
font-size: 3em;
line-height: 0.95em;
margin: 24px 0 32px;
}
section#teach h1 {
font-size: 3em;
line-height: 0.75em;
margin: 40px 0 48px;
}
}
/* ANIMATIONS */
@keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}