diff options
| author | Constantijn Bicker Caarten <git@bickercaarten.com> | 2026-09-28 20:47:23 +0200 |
|---|---|---|
| committer | Constantijn Bicker Caarten <git@bickercaarten.com> | 2026-09-28 20:47:23 +0200 |
| commit | 88efb4dfdca2fb68d016b9cb9838046b09270d6c (patch) | |
| tree | 48f95b889f4d902a413581867c17bf727f44982b | |
Initial commit
| -rw-r--r-- | .well-known/security.txt | 4 | ||||
| -rw-r--r-- | apple-touch-icon.png | bin | 0 -> 608 bytes | |||
| -rw-r--r-- | css/style.css | 1089 | ||||
| -rw-r--r-- | favicon.ico | bin | 0 -> 15086 bytes | |||
| -rw-r--r-- | favicon.svg | 16 | ||||
| -rw-r--r-- | files/bachelor-thesis.constantijn-bicker-caarten.pdf | bin | 0 -> 753661 bytes | |||
| -rw-r--r-- | files/cv.constantijn-bicker-caarten.pdf | bin | 0 -> 124268 bytes | |||
| -rw-r--r-- | fonts/m6x11.woff2 | bin | 0 -> 2600 bytes | |||
| -rw-r--r-- | index.html | 158 | ||||
| -rw-r--r-- | og-image.png | bin | 0 -> 2176 bytes | |||
| -rw-r--r-- | robots.txt | 4 | ||||
| -rw-r--r-- | sitemap.xml | 7 |
12 files changed, 1278 insertions, 0 deletions
diff --git a/.well-known/security.txt b/.well-known/security.txt new file mode 100644 index 0000000..60db4a6 --- /dev/null +++ b/.well-known/security.txt @@ -0,0 +1,4 @@ +Contact: mailto:security@bickercaarten.com +Expires: 2027-09-26T00:00:00.000Z +Preferred-Languages: en +Canonical: https://bickercaarten.com/.well-known/security.txt diff --git a/apple-touch-icon.png b/apple-touch-icon.png Binary files differnew file mode 100644 index 0000000..bc30234 --- /dev/null +++ b/apple-touch-icon.png diff --git a/css/style.css b/css/style.css new file mode 100644 index 0000000..b7a163c --- /dev/null +++ b/css/style.css @@ -0,0 +1,1089 @@ +:root { + --main-bg-color: #222; + --main-color: #c8c8c8; + --secondary-color: #969696; + --highlight-color: #fff; + --toggle-label: "light"; + color-scheme: dark; +} + +:root:has(#theme-toggle:checked) { + --main-bg-color: #f0efe9; + --main-color: #333; + --secondary-color: #666; + --highlight-color: #000; + --toggle-label: "dark"; + color-scheme: light; +} + +@media (prefers-color-scheme: light) { + :root { + --main-bg-color: #f0efe9; + --main-color: #333; + --secondary-color: #666; + --highlight-color: #000; + --toggle-label: "dark"; + color-scheme: light; + } + + :root:has(#theme-toggle:checked) { + --main-bg-color: #222; + --main-color: #c8c8c8; + --secondary-color: #969696; + --highlight-color: #fff; + --toggle-label: "light"; + color-scheme: dark; + } +} + +@media (prefers-contrast: more) { + :root { + --secondary-color: #b0b0b0; + } + + :root:has(#theme-toggle:checked) { + --secondary-color: #4d4d4d; + } + + @media (prefers-color-scheme: light) { + :root { + --secondary-color: #4d4d4d; + } + + :root:has(#theme-toggle:checked) { + --secondary-color: #b0b0b0; + } + } + + :root .grid-item-header::before { + color: var(--main-bg-color); + } +} + +@font-face { + font-family: m6x11; + src: url(../fonts/m6x11.woff2) format("woff2"); + font-display: swap; +} + +html { + scrollbar-color: var(--main-color) var(--main-bg-color); +} + +body { + cursor: crosshair; + font-family: 'm6x11'; + font-size: 18px; + color: var(--main-color); + background: var(--main-bg-color); + margin: 0; + min-height: 100vh; + display: flex; + flex-direction: column; +} + +a { + color: var(--highlight-color); +} + +a:hover { + text-decoration: underline; +} + +a:focus-visible { + outline: 2px solid var(--main-color); + outline-offset: 2px; +} + +code { + font-family: 'm6x11'; +} + +::selection { + background: var(--main-color); + color: var(--main-bg-color); +} + +.grid-item-header::selection, +.grid-item-header ::selection, +footer::selection, +footer ::selection { + background: var(--main-bg-color); + color: var(--main-color); +} + +[aria-hidden="true"] { + -webkit-user-select: none; + user-select: none; +} + +#header, +.title, +.grid-item, +.secret, +footer { + cursor: auto; +} + +#header { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 8px 4px; + padding: 24px; + margin-bottom: 16px; + position: sticky; + top: 0; + z-index: 100; + background: + linear-gradient(90deg, var(--main-color) 8px, transparent 8px) left bottom / 12px 2px repeat-x, + var(--main-bg-color); +} + +#header a, +#header .nav-toggle { + color: var(--main-color); + text-decoration: none; + padding: 8px 16px; +} + +#header a:not(.nav-home)::before { + content: "["; + content: "[" / ""; +} + +#header a:not(.nav-home)::after { + content: "]"; + content: "]" / ""; +} + +#header .nav-home { + margin-right: 8px; +} + +#header a:hover, +#header a:focus-visible, +#header .nav-toggle:hover, +#theme-toggle:focus-visible + .nav-toggle, +body:has(#about:target) #header a[href="#about"], +body:has(#projects:target) #header a[href="#projects"], +body:has(#files:target) #header a[href="#files"], +body:has(#contact:target) #header a[href="#contact"], +body:has(#credits:target) #header a[href="#credits"] { + background: var(--main-color); + color: var(--main-bg-color); +} + +#header a:not(.nav-action) + .nav-action { + margin-left: auto; +} + +.nav-toggle { + cursor: pointer; +} + +.theme-toggle::before { + content: "[" var(--toggle-label) "]"; + content: "[" var(--toggle-label) "]" / ""; +} + +#theme-toggle:focus-visible + .nav-toggle { + outline: 2px solid var(--main-color); + outline-offset: 2px; +} + +.nav-action { + display: inline-flex; + align-items: center; +} + +.nav-action .arrow { + order: 1; + display: inline-block; + width: 14px; + height: 14px; + margin-left: 4px; + background: currentColor; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 7 7' shape-rendering='crispEdges'%3E%3Cpath d='M2 0h5v5h-1v-4h-4zM5 1h1v1h-1zM4 2h1v1h-1zM3 3h1v1h-1zM2 4h1v1h-1zM1 5h1v1h-1zM0 6h1v1h-1z'/%3E%3C/svg%3E") no-repeat center / contain; +} + +.title { + width: fit-content; + max-width: 100%; + box-sizing: border-box; + margin: 40px auto; + padding: 0 24px; +} + +.title h1 { + text-transform: uppercase; + font-size: 64px; + margin: 0; +} + +.grid-container { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(min(512px, 100%), 1fr)); + gap: 48px; + align-content: start; + align-items: start; + justify-items: center; + padding: 0 40px 48px 24px; + flex: 1 0 auto; +} + +@media (min-width: 1300px) { + .grid-container:not(.grid-single) { + --channel: 80px; + grid-template-columns: repeat(2, minmax(0, 620px)); + column-gap: calc(2 * var(--channel)); + justify-content: center; + align-items: start; + --side: clamp(36px, 7.5vw, 144px); + padding-left: var(--side); + padding-right: calc(var(--side) + 16px); + position: relative; + padding-bottom: 72px; + flex: none; + } + + .grid-container:not(.grid-single) + .secret { + margin-top: auto; + } + + .grid-container:not(.grid-single)::before { + content: ""; + position: absolute; + top: 0; + bottom: 48px; + left: calc(50% - 8px - 2px); + width: 4px; + background: repeating-linear-gradient(to bottom, var(--secondary-color) 0 8px, transparent 8px 12px); + pointer-events: none; + } + + .grid-container:not(.grid-single)::after { + content: "EOF" / ""; + position: absolute; + bottom: 12px; + left: calc(50% - 8px); + translate: -50% 0; + font-size: 16px; + line-height: 16px; + letter-spacing: 2px; + color: var(--secondary-color); + pointer-events: none; + } + + .grid-container:not(.grid-single)::before { + bottom: 32px; + } + + .grid-container .zz-col { + display: flex; + flex-direction: column; + gap: 56px; + justify-self: stretch; + } + + .zz-left { + align-items: flex-end; + } + + .zz-right { + align-items: flex-start; + margin-top: 96px; + } + + .grid-container:not(.grid-single) .grid-item:is(#about, #projects, #files, #contact, #credits) { + max-width: min(520px, 100%); + translate: none; + } + + #about { --addr: "0x00"; } + #projects { --addr: "0x20"; } + #files { --addr: "0x40"; } + #contact { --addr: "0x60"; } + #credits { --addr: "0x80"; } + + .zz-col > .grid-item::before { + content: var(--addr, "") / ""; + position: absolute; + top: -8px; + box-sizing: border-box; + width: var(--channel); + height: 20px; + font-size: 16px; + line-height: 16px; + color: var(--secondary-color); + background: linear-gradient(var(--secondary-color), var(--secondary-color)) left bottom / 100% 2px no-repeat; + pointer-events: none; + } + + .zz-col > .grid-item:is(:hover, :focus-within)::before { + color: var(--main-color); + } + + .zz-col > .grid-item:target::before { + color: var(--highlight-color); + } + + .zz-left > .grid-item::before { + left: calc(100% + 4px); + text-align: right; + padding-right: 6px; + } + + .zz-right > .grid-item::before { + right: calc(100% + 4px); + text-align: left; + padding-left: 6px; + } + + @media (hover: hover) { + .zz-col > .grid-item:hover::before { + translate: 0 -8px; + } + + .zz-left > .grid-item:hover::before { + width: calc(var(--channel) - 8px); + } + + .zz-right > .grid-item:hover::before { + width: calc(var(--channel) + 8px); + } + } +} + +.grid-single { + width: 100%; + max-width: 720px; + margin: 0 auto; + box-sizing: border-box; +} + +.grid-item { + position: relative; + background: var(--main-bg-color); + scroll-margin-top: 104px; + border: 4px solid var(--main-color); + --shadow: 16px; + box-shadow: var(--shadow) var(--shadow) 0px var(--secondary-color); + --mark-color: var(--secondary-color); + --mark-gap: 14px; + max-width: 90%; +} + +.grid-item::after { + content: ""; + position: absolute; + top: calc(-1 * var(--mark-gap)); + left: calc(-1 * var(--mark-gap)); + right: calc(-1 * var(--mark-gap) - var(--shadow)); + bottom: calc(-1 * var(--mark-gap) - var(--shadow)); + --arm: 10px; + --w: 2px; + background: + linear-gradient(var(--mark-color), var(--mark-color)) left top / var(--arm) var(--w), + linear-gradient(var(--mark-color), var(--mark-color)) left top / var(--w) var(--arm), + linear-gradient(var(--mark-color), var(--mark-color)) right top / var(--arm) var(--w), + linear-gradient(var(--mark-color), var(--mark-color)) right top / var(--w) var(--arm), + linear-gradient(var(--mark-color), var(--mark-color)) left bottom / var(--arm) var(--w), + linear-gradient(var(--mark-color), var(--mark-color)) left bottom / var(--w) var(--arm), + linear-gradient(var(--mark-color), var(--mark-color)) right bottom / var(--arm) var(--w), + linear-gradient(var(--mark-color), var(--mark-color)) right bottom / var(--w) var(--arm); + background-repeat: no-repeat; + pointer-events: none; +} + +#about { translate: -8px 6px; } +#projects { translate: 10px -8px; } +#files { translate: 6px 12px; } +#contact { translate: -10px -4px; } +#credits { translate: 8px 4px; } + +.zz-col { + display: contents; +} + +#about { order: 1; } +#projects { order: 2; } +#files { order: 3; } +#contact { order: 4; } +#credits { order: 5; } + +.grid-item:target { + border-color: var(--highlight-color); + --mark-color: var(--highlight-color); +} + +@media (hover: hover) { + .grid-item:hover { + transform: translate(8px, 8px); + box-shadow: 8px 8px 0px var(--secondary-color); + } +} + +.grid-item-header { + display: flex; + cursor: pointer; + list-style: none; + justify-content: space-between; + text-transform: uppercase; + color: var(--main-bg-color); + background-color: var(--main-color); +} + +.grid-item { --window-id: "0x3f"; } +#projects { --window-id: "0xa7"; } +#files { --window-id: "0x1c"; } +#contact { --window-id: "0xe2"; } +#credits { --window-id: "0x5b"; } + +.grid-item-header::before { + content: var(--window-id) / ""; + flex-shrink: 0; + text-transform: none; + margin-left: 4px; + font-size: 16px; + letter-spacing: 2px; + color: var(--secondary-color); +} + +.grid-item-header::-webkit-details-marker { + display: none; +} + +.grid-item-header:focus-visible { + outline: 2px dashed var(--main-bg-color); + outline-offset: -4px; +} + +.grid-item:target .grid-item-header { + background-color: var(--highlight-color); +} + +.window-title::after { + content: attr(data-cmd) / ""; + position: absolute; + inset: 0; + overflow: hidden; + text-overflow: ellipsis; + background: var(--main-color); + visibility: hidden; +} + +.grid-item:target .window-title::after { + background: var(--highlight-color); +} + +.window-title { + position: relative; + flex: 1; + margin-left: 10px; + font-size: 16px; + letter-spacing: 2px; + margin-right: 8px; + text-transform: none; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.close { + flex-shrink: 0; +} + +.close::after { + content: "[+]"; + content: "[+]" / ""; + margin-right: 4px; + font-size: 16px; + letter-spacing: 2px; +} + +.grid-item[open] .close::after { + content: "[-]"; + content: "[-]" / ""; +} + +.grid-item-content { + padding: 16px; + position: relative; +} + +.grid-item-content > .command::after { + content: attr(data-took) " 0" / ""; + white-space: pre; + position: absolute; + right: 16px; + color: var(--secondary-color); +} + +.grid-item-content a:hover, +.grid-item-content a:focus-visible { + background: var(--highlight-color); + color: var(--main-bg-color); + text-decoration: none; +} + +.command-result { + color: var(--secondary-color); +} + +#projects > .grid-item-content { --ghost: ghost-projects 37s step-end calc(var(--cursor-delay) + 1s) infinite; } +#contact > .grid-item-content { --ghost: ghost-contact 43s step-end calc(var(--cursor-delay) + 1s) infinite; } + +.grid-item-content::after { + content: ">"; + content: ">" / ""; + display: block; + width: fit-content; + margin-top: 3px; + padding-right: 12px; + background: linear-gradient(var(--main-color), var(--main-color)) right bottom 4px / 6px 2px no-repeat; +} + +.listing { + margin-top: 3px; + line-height: 24px; + border-spacing: 0; +} + +.listing td { + padding: 0 14px 0 0; + vertical-align: top; + white-space: nowrap; +} + +.listing td:nth-child(2) { + text-align: right; +} + +.ls-total { + display: block; + margin-top: 3px; + color: var(--secondary-color); +} + +.ls-total + .listing { + margin-top: 0; +} + +.listing .ice { + color: var(--secondary-color); +} + +.link-target { + color: var(--secondary-color); + white-space: pre; +} + +.listing td:nth-child(3) { + white-space: pre; +} + +.listing a { + text-decoration: none; +} + +.redacted { + background: var(--main-color); + color: transparent; + white-space: nowrap; + -webkit-user-select: none; + user-select: none; +} + +.contact-list { + margin-top: 3px; + line-height: 24px; + border-spacing: 0; +} + +.contact-list td { + padding: 0 16px 0 0; + white-space: nowrap; +} + +.contact-list td:first-child { + color: var(--secondary-color); +} + +.contact-list a { + text-decoration: none; +} + +.secret { + margin: 0 0 16px; + text-align: center; + color: var(--main-bg-color); +} + +footer { + display: flex; + align-items: center; + gap: 16px; + background: var(--main-color); + color: var(--main-bg-color); + font-size: 16px; + padding: 4px 8px; + margin-top: 10px; +} + +.status-left, +.status-right { + white-space: nowrap; +} + +.status-message { + flex: 1; + text-align: center; +} + +.glitch { + position: relative; + --glitch-shift: 6px; + --glitch-delay: 2s; +} + +span.glitch { + display: inline-block; +} + +.glitch::before, +.glitch::after { + content: attr(data-text); + content: attr(data-text) / ""; + position: absolute; + inset: 0; + background: var(--main-bg-color); + clip-path: inset(100% 0 0 0); + pointer-events: none; +} + +.glitch::after { + color: var(--secondary-color); +} + +.command-result .glitch { + --glitch-shift: 3px; + --glitch-delay: 5.5s; +} + +.command-result .glitch::after { + color: var(--main-color); +} + +.typed { + -webkit-user-select: text; + user-select: text; +} + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + -webkit-user-select: none; + user-select: none; +} + +@media (min-width: 601px) and (max-width: 999px) { + #header { + font-size: 16px; + } + + #header .nav-action { + display: none; + } + + #header a, + #header .nav-toggle { + padding: 8px 10px; + } +} + +@media (max-width: 600px) { + #header { + position: static; + justify-content: center; + gap: 8px 0; + padding: 16px 4px; + font-size: 16px; + } + + #header a, + #header .nav-toggle { + padding: 8px 2px; + } + + #header .nav-action { + display: none; + } + + #header .nav-home { + display: none; + } + + .title { + margin: 24px auto; + padding: 0 12px; + } + + .title h1 { + font-size: 36px; + } + + .grid-container { + gap: 48px; + padding: 0 24px 32px 16px; + } + + #about { translate: -3px 4px; } + #projects { translate: 4px -3px; } + #files { translate: 3px 5px; } + #contact { translate: -4px -2px; } + #credits { translate: 3px 3px; } + + .grid-item { + max-width: 100%; + scroll-margin-top: 16px; + --shadow: 8px; + --mark-gap: 8px; + } + + @media (hover: hover) { + .grid-item:hover { + transform: translate(4px, 4px); + box-shadow: 4px 4px 0px var(--secondary-color); + } + } + + .listing td:first-child, + .listing td:nth-child(3) { + display: none; + } + + .redacted { + white-space: normal; + } + + footer { + flex-wrap: wrap; + justify-content: space-between; + } + + .status-message { + order: 1; + flex-basis: 100%; + } +} + +.grid-item { --boot-delay: 0.25s; } +#projects { --boot-delay: 0.4s; } +#files { --boot-delay: 0.55s; } +#contact { --boot-delay: 0.7s; } +#credits { --boot-delay: 0.85s; } + +:root { + --type-speed: 28ms; + --type-pause: 80ms; + --type-gap: 0.1s; + --jitter: 0.6ms; + --typo-cost: 0.4s; + --tab-pause: 0.15s; +} + +.title { + --type-start: 0.1s; + --out1: calc(var(--type-start) + var(--n1, 0) * var(--type-speed) + var(--s1, 0) * var(--type-pause) + var(--type-gap)); +} + +.grid-item-content { + --out1: calc(var(--boot-delay) + var(--n1, 0) * var(--type-speed) + var(--s1, 0) * var(--type-pause) + var(--x1, 0s) + var(--type-gap)); + --cmd2: calc(var(--out1) + 0.15s); + --out2: calc(var(--cmd2) + var(--n2, 0) * var(--type-speed) + var(--s2, 0) * var(--type-pause) + var(--type-gap)); + --cursor-delay: calc(var(--out1) + 0.1s); +} + +.grid-item-content:has(.command ~ .command) { + --cursor-delay: calc(var(--out2) + 0.1s); +} + +.grid-item-content > .command { + --type-start: var(--boot-delay); +} + +.grid-item-content > .command ~ .command { + --type-start: var(--cmd2); +} + +.typed > span:nth-child(1) { --i: 0; --j: 0; --jn: 14; } +.typed > span:nth-child(2) { --i: 1; --j: 14; --jn: -6; } +.typed > span:nth-child(3) { --i: 2; --j: -6; --jn: 20; } +.typed > span:nth-child(4) { --i: 3; --j: 20; --jn: -10; } +.typed > span:nth-child(5) { --i: 4; --j: -10; --jn: 8; } +.typed > span:nth-child(6) { --i: 5; --j: 8; --jn: -4; } +.typed > span:nth-child(7) { --i: 6; --j: -4; --jn: 16; } +.typed > span:nth-child(8) { --i: 7; --j: 16; --jn: -12; } +.typed > span:nth-child(9) { --i: 8; --j: -12; --jn: 6; } +.typed > span:nth-child(10) { --i: 9; --j: 6; --jn: 18; } +.typed > span:nth-child(11) { --i: 10; --j: 18; --jn: -8; } +.typed > span:nth-child(12) { --i: 11; --j: -8; --jn: 10; } +.typed > span:nth-child(13) { --i: 12; --j: 10; --jn: -14; } +.typed > span:nth-child(14) { --i: 13; --j: -14; --jn: 4; } +.typed > span:nth-child(15) { --i: 14; --j: 4; --jn: 12; } +.typed > span:nth-child(16) { --i: 15; --j: 12; --jn: -6; } +.typed > span:nth-child(17) { --i: 16; --j: -6; --jn: 16; } +.typed > span:nth-child(18) { --i: 17; --j: 16; --jn: -10; } +.typed > span:nth-child(19) { --i: 18; --j: -10; --jn: 2; } +.typed > span:nth-child(20) { --i: 19; --j: 2; --jn: 14; } +.typed > span:nth-child(21) { --i: 20; --j: 14; --jn: -8; } +.typed > span:nth-child(22) { --i: 21; --j: -8; --jn: 10; } +.typed > span:nth-child(23) { --i: 22; --j: 10; --jn: 0; } +.typed > span:nth-child(24) { --i: 23; --j: 0; --jn: 0; } + +.typed > span { + --p: 0; + --dp: 0; + position: relative; + --type-at: calc(var(--type-start) + var(--i) * var(--type-speed) + var(--j) * var(--jitter) + var(--p) * var(--type-pause) + var(--t, 0s)); +} + +.typed > .tab.tab { + --i: var(--tab-i); + --j: 0; + --t: var(--tab-pause); +} + +.typed > .typo { + font-size: 0; + -webkit-user-select: none; + user-select: none; +} + +.typed > .typo ~ span { + --t: var(--typo-cost); +} + +.typed > .sp ~ span { --p: 1; } +.typed > .sp ~ .sp ~ span { --p: 2; } +.typed > .sp { --dp: 1; } + +.typed > span::after { + content: ""; + position: absolute; + left: calc(100% + 1px); + bottom: 3px; + width: 8px; + height: 14px; + background: var(--main-color); + visibility: hidden; + --cursor-for: calc(var(--type-speed) + (var(--jn) - var(--j)) * var(--jitter) + var(--dp) * var(--type-pause)); +} + +.typed > span:last-child::after { + --cursor-for: calc(var(--type-speed) + var(--type-gap)); +} + +.typed > .typo::after { + --cursor-for: calc(var(--type-speed) + var(--typo-cost)); +} + +@media (prefers-reduced-motion: no-preference) { + #header a, + #header .nav-toggle, + .grid-item-content a { + transition: background-color 0.5s, color 0.5s; + } + + #header a:hover, + #header .nav-toggle:hover, + .grid-item-content a:hover { + transition: none; + } + + .grid-item::before { + transition: color 0.5s; + } + + .grid-item:is(:hover, :focus-within)::before { + transition: color 0s; + } + + .typed > span { + animation: boot 1ms var(--type-at) backwards; + } + + .typed > span::after { + animation: type-cursor var(--cursor-for) steps(1) var(--type-at); + } + + .typed > .tab:not(:last-child)::after { + animation: none; + } + + .typed > .typo { + animation: typo-flash calc(var(--typo-cost) - var(--type-speed)) step-end var(--type-at); + } + + .window-title::after { + animation: title-cmd calc(var(--n1, 0) * var(--type-speed) + var(--s1, 0) * var(--type-pause) + var(--x1, 0s) + var(--type-gap)) step-end var(--boot-delay); + } + + .title h1 { + animation: boot 1ms var(--out1) backwards; + } + + .glitch::before { + animation: glitch-a 7s steps(1) var(--glitch-delay) infinite; + } + + .glitch::after { + animation: glitch-b 7s steps(1) var(--glitch-delay) infinite; + } + + .grid-item-content > :not(.command, br) { + animation: boot 1ms var(--out1) backwards; + } + + .command ~ .command { + animation: boot 1ms var(--cmd2) backwards; + } + + .grid-item-content > .command::after { + animation: boot 1ms var(--out1) backwards; + } + + .grid-item-content > .command ~ .command::after { + animation: boot 1ms var(--out2) backwards; + } + + .grid-item-content > .command ~ .command ~ :not(br) { + animation: boot 1ms var(--out2) backwards; + } + + .grid-item-content::after { + animation: + boot 1ms var(--cursor-delay) backwards, + var(--ghost, none); + } + + .grid-item:is(:hover, :focus-within, :target) .grid-item-content::after { + animation: + boot 1ms var(--cursor-delay) backwards, + var(--ghost, none), + blink 1.06s steps(1) infinite; + } +} + +@keyframes boot { + from { + visibility: hidden; + } +} + +@keyframes blink { + 50% { + background-size: 0 0; + } +} + +@keyframes glitch-a { + 0%, 94%, 100% { clip-path: inset(100% 0 0 0); translate: 0; } + 95% { clip-path: inset(15% 0 60% 0); translate: calc(var(--glitch-shift) * -1) 0; } + 96% { clip-path: inset(55% 0 20% 0); translate: calc(var(--glitch-shift) * 0.83) 0; } + 97% { clip-path: inset(35% 0 45% 0); translate: calc(var(--glitch-shift) * -0.5) 0; } + 98% { clip-path: inset(70% 0 5% 0); translate: calc(var(--glitch-shift) * 0.67) 0; } +} + +@keyframes glitch-b { + 0%, 94%, 100% { clip-path: inset(100% 0 0 0); translate: 0; } + 95% { clip-path: inset(65% 0 10% 0); translate: calc(var(--glitch-shift) * 0.83) 0; } + 96% { clip-path: inset(10% 0 70% 0); translate: calc(var(--glitch-shift) * -0.67) 0; } + 97.5% { clip-path: inset(45% 0 30% 0); translate: var(--glitch-shift) 0; } +} + +@keyframes type-cursor { + from, to { + visibility: visible; + } +} + +@keyframes ghost-projects { + 0.000% { content: ">" / ""; background-size: 6px 2px; } + 10.811% { content: "> m" / ""; background-size: 8px 14px; } + 11.243% { content: "> mk" / ""; background-size: 8px 14px; } + 11.568% { content: "> mkd" / ""; background-size: 8px 14px; } + 12.108% { content: "> mkdi" / ""; background-size: 8px 14px; } + 12.486% { content: "> mkdir" / ""; background-size: 8px 14px; } + 12.973% { content: "> mkdir " / ""; background-size: 8px 14px; } + 13.270% { content: "> mkdir d" / ""; background-size: 8px 14px; } + 13.730% { content: "> mkdir da" / ""; background-size: 8px 14px; } + 14.162% { content: "> mkdir dae" / ""; background-size: 8px 14px; } + 14.486% { content: "> mkdir daed" / ""; background-size: 8px 14px; } + 15.027% { content: "> mkdir daeda" / ""; background-size: 8px 14px; } + 15.405% { content: "> mkdir daedal" / ""; background-size: 8px 14px; } + 15.892% { content: "> mkdir daedalu" / ""; background-size: 8px 14px; } + 16.189% { content: "> mkdir daedalus" / ""; background-size: 8px 14px; } + 18.865% { content: "> mkdir daedalu" / ""; background-size: 8px 14px; } + 19.108% { content: "> mkdir daedal" / ""; background-size: 8px 14px; } + 19.351% { content: "> mkdir daeda" / ""; background-size: 8px 14px; } + 19.595% { content: "> mkdir daed" / ""; background-size: 8px 14px; } + 19.838% { content: "> mkdir dae" / ""; background-size: 8px 14px; } + 20.081% { content: "> mkdir da" / ""; background-size: 8px 14px; } + 20.324% { content: "> mkdir d" / ""; background-size: 8px 14px; } + 20.568% { content: "> mkdir " / ""; background-size: 8px 14px; } + 20.811% { content: "> mkdir" / ""; background-size: 8px 14px; } + 21.054% { content: "> mkdi" / ""; background-size: 8px 14px; } + 21.297% { content: "> mkd" / ""; background-size: 8px 14px; } + 21.541% { content: "> mk" / ""; background-size: 8px 14px; } + 21.784% { content: "> m" / ""; background-size: 8px 14px; } + 22.027% { content: ">" / ""; background-size: 6px 2px; } + 100% { content: ">" / ""; background-size: 6px 2px; } +} + +@keyframes ghost-contact { + 0.000% { content: ">" / ""; background-size: 6px 2px; } + 32.558% { content: "> g" / ""; background-size: 8px 14px; } + 32.930% { content: "> gp" / ""; background-size: 8px 14px; } + 33.209% { content: "> gpg" / ""; background-size: 8px 14px; } + 33.674% { content: "> gpg " / ""; background-size: 8px 14px; } + 34.000% { content: "> gpg -" / ""; background-size: 8px 14px; } + 34.419% { content: "> gpg --" / ""; background-size: 8px 14px; } + 34.674% { content: "> gpg --f" / ""; background-size: 8px 14px; } + 35.070% { content: "> gpg --fu" / ""; background-size: 8px 14px; } + 35.442% { content: "> gpg --ful" / ""; background-size: 8px 14px; } + 35.721% { content: "> gpg --full" / ""; background-size: 8px 14px; } + 36.186% { content: "> gpg --full-" / ""; background-size: 8px 14px; } + 36.512% { content: "> gpg --full-g" / ""; background-size: 8px 14px; } + 36.930% { content: "> gpg --full-ge" / ""; background-size: 8px 14px; } + 37.186% { content: "> gpg --full-gen" / ""; background-size: 8px 14px; } + 37.581% { content: "> gpg --full-gene" / ""; background-size: 8px 14px; } + 37.953% { content: "> gpg --full-gener" / ""; background-size: 8px 14px; } + 38.233% { content: "> gpg --full-genera" / ""; background-size: 8px 14px; } + 38.698% { content: "> gpg --full-generat" / ""; background-size: 8px 14px; } + 39.023% { content: "> gpg --full-generate" / ""; background-size: 8px 14px; } + 39.442% { content: "> gpg --full-generate-" / ""; background-size: 8px 14px; } + 39.698% { content: "> gpg --full-generate-k" / ""; background-size: 8px 14px; } + 40.093% { content: "> gpg --full-generate-ke" / ""; background-size: 8px 14px; } + 40.465% { content: "> gpg --full-generate-key" / ""; background-size: 8px 14px; } + 42.326% { content: "> gpg --full-generate-key^C" / ""; background-size: 8px 14px; } + 43.488% { content: ">" / ""; background-size: 6px 2px; } + 100% { content: ">" / ""; background-size: 6px 2px; } +} + +@keyframes typo-flash { + from, to { + font-size: 1em; + } +} + +@keyframes title-cmd { + from, to { + visibility: visible; + } +} diff --git a/favicon.ico b/favicon.ico Binary files differnew file mode 100644 index 0000000..cd97df8 --- /dev/null +++ b/favicon.ico diff --git a/favicon.svg b/favicon.svg new file mode 100644 index 0000000..4c66644 --- /dev/null +++ b/favicon.svg @@ -0,0 +1,16 @@ +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" shape-rendering="crispEdges"> + <rect width="16" height="16" fill="#222222"/> + <g fill="#c8c8c8"> + <rect x="4" y="3" width="1" height="1"/> + <rect x="5" y="4" width="1" height="1"/> + <rect x="6" y="5" width="1" height="1"/> + <rect x="7" y="6" width="1" height="1"/> + <rect x="8" y="7" width="1" height="1"/> + <rect x="8" y="8" width="1" height="1"/> + <rect x="7" y="9" width="1" height="1"/> + <rect x="6" y="10" width="1" height="1"/> + <rect x="5" y="11" width="1" height="1"/> + <rect x="4" y="12" width="1" height="1"/> + <rect x="9" y="13" width="5" height="1"/> + </g> +</svg> diff --git a/files/bachelor-thesis.constantijn-bicker-caarten.pdf b/files/bachelor-thesis.constantijn-bicker-caarten.pdf Binary files differnew file mode 100644 index 0000000..aa88e1f --- /dev/null +++ b/files/bachelor-thesis.constantijn-bicker-caarten.pdf diff --git a/files/cv.constantijn-bicker-caarten.pdf b/files/cv.constantijn-bicker-caarten.pdf Binary files differnew file mode 100644 index 0000000..37d8fd2 --- /dev/null +++ b/files/cv.constantijn-bicker-caarten.pdf diff --git a/fonts/m6x11.woff2 b/fonts/m6x11.woff2 Binary files differnew file mode 100644 index 0000000..5da1c6f --- /dev/null +++ b/fonts/m6x11.woff2 diff --git a/index.html b/index.html new file mode 100644 index 0000000..ae13039 --- /dev/null +++ b/index.html @@ -0,0 +1,158 @@ +<!DOCTYPE html> +<html lang="en"> + +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>Constantijn Bicker Caarten</title> + <meta name="description" content="Personal website of Constantijn Bicker Caarten."> + <link rel="canonical" href="https://bickercaarten.com/"> + + <meta property="og:type" content="website"> + <meta property="og:url" content="https://bickercaarten.com/"> + <meta property="og:title" content="Constantijn Bicker Caarten"> + <meta property="og:description" content="Personal website of Constantijn Bicker Caarten."> + <meta property="og:image" content="https://bickercaarten.com/og-image.png"> + <meta property="og:image:width" content="1200"> + <meta property="og:image:height" content="630"> + <meta property="og:image:alt" content="Constantijn Bicker Caarten"> + + <meta name="twitter:card" content="summary_large_image"> + <meta name="twitter:title" content="Constantijn Bicker Caarten"> + <meta name="twitter:description" content="Personal website of Constantijn Bicker Caarten"> + <meta name="twitter:image" content="https://bickercaarten.com/og-image.png"> + <meta name="twitter:image:alt" content="Constantijn Bicker Caarten"> + + <link rel="icon" href="favicon.svg" type="image/svg+xml"> + <link rel="alternate icon" href="favicon.ico"> + <link rel="apple-touch-icon" href="apple-touch-icon.png"> + + <link rel="preload" href="fonts/m6x11.woff2" as="font" type="font/woff2" crossorigin> + <link rel="stylesheet" href="css/style.css" type="text/css"> +</head> + +<body> + <nav id="header"> + <a class="nav-home" href="#" aria-label="back to top">>_</a> + <a href="#about">about</a> + <a href="#projects">projects</a> + <a href="#files">files</a> + <a href="#contact">contact</a> + <a href="#credits">credits</a> + <a class="nav-action" target="_blank" rel="noopener noreferrer" href="/files/cv.constantijn-bicker-caarten.pdf">resume<span class="arrow" aria-hidden="true"></span><span class="visually-hidden"> (opens in new tab)</span></a> + <a class="nav-action" href="mailto:hello@bickercaarten.com">email<span class="arrow" aria-hidden="true"></span><span class="visually-hidden"> (opens email app)</span></a> + <a class="nav-action" target="_blank" rel="noopener noreferrer" href="https://signal.me/#eu/tD9nyfXpOdrbrCYh-T1BJ8ctPb-8CZ6mWCzzxXCGj0bafnFI5NFCc73yXR05oG50">signal<span class="arrow" aria-hidden="true"></span><span class="visually-hidden"> (opens in new tab)</span></a> + <input type="checkbox" id="theme-toggle" class="visually-hidden" aria-label="switch between dark and light theme"> + <label class="nav-toggle theme-toggle" for="theme-toggle"></label> + </nav> + + <div class="title" style="--s1: 0; --n1: 6"> + <code><span aria-hidden="true">></span> <span class="typed" aria-hidden="true"><span>w</span><span>h</span><span>o</span><span>a</span><span>m</span><span>i</span></span><span class="visually-hidden">whoami</span></code> + <h1>Constantijn Bicker Caarten</h1> + </div> + + <main class="grid-container"> + <div class="zz-col zz-left"> + <details id="about" class="grid-item" style="--n1: 13; --s1: 1" open> + <summary class="grid-item-header"> + <span class="window-title" data-cmd="cat about.txt">constantijn@netsphere</span> + <span class="close"></span> + </summary> + <div class="grid-item-content"> + <code class="command" data-took="2ms"> + <span aria-hidden="true">></span> <span class="typed" aria-hidden="true"><span>c</span><span>a</span><span>t</span><span class="sp"> </span><span>a</span><span>b</span><span>o</span><span>u</span><span>t</span><span>.</span><span>t</span><span>x</span><span>t</span></span><span class="visually-hidden">cat about.txt</span> + </code> + <br> + <code class="command-result"> + I am Constantijn and this is my <span class="glitch" data-text="cyberhome">cyberhome</span>. + At the moment there is not much here, but hopefully that will change in the future. + In my free time I'm mostly watching movies or tinkering on my computer. + Currently I work as a software engineer at <a href="https://123tcs.com">123TCS</a>. + </code> + </div> + </details> + + <details id="files" class="grid-item" style="--n1: 15; --s1: 2" open> + <summary class="grid-item-header"> + <span class="window-title" data-cmd="ls -lh ~/files/">constantijn@netsphere</span> + <span class="close"></span> + </summary> + <div class="grid-item-content"> + <code class="command" data-took="3ms"> + <span aria-hidden="true">></span> <span class="typed" aria-hidden="true"><span>l</span><span>s</span><span class="sp"> </span><span>-</span><span>l</span><span>h</span><span class="sp"> </span><span>~</span><span>/</span><span>f</span><span>i</span><span>l</span><span>e</span><span>s</span><span>/</span></span><span class="visually-hidden">ls -lh ~/files/</span> + </code> + <br> + <code class="ls-total" aria-hidden="true">total 860K</code> + <table class="listing"> + <tr><td aria-hidden="true">-rw-r--r--</td><td aria-hidden="true">736K</td><td aria-hidden="true">Jun 9 2017</td><td><a target="_blank" rel="noopener noreferrer" href="/files/bachelor-thesis.constantijn-bicker-caarten.pdf">bachelor-thesis.pdf<span class="visually-hidden"> (opens in new tab)</span></a></td></tr> + <tr><td aria-hidden="true">-rw-r--r--</td><td aria-hidden="true">122K</td><td aria-hidden="true">Sep 15 10:56</td><td><a target="_blank" rel="noopener noreferrer" href="/files/cv.constantijn-bicker-caarten.pdf">cv.pdf<span class="visually-hidden"> (opens in new tab)</span></a></td></tr> + </table> + </div> + </details> + + <details id="credits" class="grid-item" style="--n1: 16; --s1: 1; --x1: var(--typo-cost)" open> + <summary class="grid-item-header"> + <span class="window-title" data-cmd="cat credits.txt">constantijn@netsphere</span> + <span class="close"></span> + </summary> + <div class="grid-item-content"> + <code class="command" data-took="2ms"> + <span aria-hidden="true">></span> <span class="typed" aria-hidden="true"><span>c</span><span class="typo">t</span><span>a</span><span>t</span><span class="sp"> </span><span>c</span><span>r</span><span>e</span><span>d</span><span>i</span><span>t</span><span>s</span><span>.</span><span>t</span><span>x</span><span>t</span></span><span class="visually-hidden">cat credits.txt</span> + </code> + <br> + <code class="command-result"> + <a target="_blank" rel="noopener noreferrer" href="https://managore.itch.io/m6x11">m6x11<span class="visually-hidden"> (opens in new tab)</span></a> font by Daniel Linssen. + </code> + </div> + </details> + </div> + + <div class="zz-col zz-right"> + <details id="projects" class="grid-item" style="--n1: 18; --s1: 2; --x1: var(--tab-pause)" open> + <summary class="grid-item-header"> + <span class="window-title" data-cmd="ls -lh ~/projects/">constantijn@netsphere</span> + <span class="close"></span> + </summary> + <div class="grid-item-content"> + <code class="command" data-took="4ms"> + <span aria-hidden="true">></span> <span class="typed" aria-hidden="true" style="--tab-i: 12"><span>l</span><span>s</span><span class="sp"> </span><span>-</span><span>l</span><span>h</span><span class="sp"> </span><span>~</span><span>/</span><span>p</span><span>r</span><span>o</span><span class="tab">j</span><span class="tab">e</span><span class="tab">c</span><span class="tab">t</span><span class="tab">s</span><span class="tab">/</span></span><span class="visually-hidden">ls -lh ~/projects/</span> + </code> + <br> + <code class="ls-total" aria-hidden="true">total 12K</code> + <table class="listing"> + <tr><td aria-hidden="true">drwxr-xr-x</td><td aria-hidden="true">4.0K</td><td aria-hidden="true">Mar 14 2016</td><td><a target="_blank" rel="noopener noreferrer" href="https://git.bickercaarten.com/pyquest.git">pyquest/<span class="visually-hidden"> (opens in new tab)</span></a></td></tr> + <tr><td aria-hidden="true">drwxr-xr-x</td><td aria-hidden="true">4.0K</td><td aria-hidden="true">Jun 2 2017</td><td><a target="_blank" rel="noopener noreferrer" href="https://git.bickercaarten.com/tld-analytics.git">tld-analytics/<span class="visually-hidden"> (opens in new tab)</span></a></td></tr> + <tr><td aria-hidden="true">drwx------</td><td aria-hidden="true" class="ice">ice</td><td aria-hidden="true"><span class="redacted">xxx xx xx:xx</span></td><td><span class="redacted" aria-hidden="true">xxxxxxxxxx</span><span class="visually-hidden">redacted project</span></td></tr> + </table> + </div> + </details> + + <details id="contact" class="grid-item" style="--n1: 15; --s1: 1; --x1: var(--tab-pause)" open> + <summary class="grid-item-header"> + <span class="window-title" data-cmd="cat contact.txt">constantijn@netsphere</span> + <span class="close"></span> + </summary> + <div class="grid-item-content"> + <code class="command" data-took="1ms"> + <span aria-hidden="true">></span> <span class="typed" aria-hidden="true" style="--tab-i: 7"><span>c</span><span>a</span><span>t</span><span class="sp"> </span><span>c</span><span>o</span><span>n</span><span class="tab">t</span><span class="tab">a</span><span class="tab">c</span><span class="tab">t</span><span class="tab">.</span><span class="tab">t</span><span class="tab">x</span><span class="tab">t</span></span><span class="visually-hidden">cat contact.txt</span> + </code> + <br> + <table class="contact-list"> + <tr><td>email</td><td><a href="mailto:hello@bickercaarten.com">hello@bickercaarten.com</a></td></tr> + <tr><td>signal</td><td><a target="_blank" rel="noopener noreferrer" href="https://signal.me/#eu/tD9nyfXpOdrbrCYh-T1BJ8ctPb-8CZ6mWCzzxXCGj0bafnFI5NFCc73yXR05oG50">open chat<span class="visually-hidden"> (opens in new tab)</span></a></td></tr> + </table> + </div> + </details> + </div> + </main> + + <p class="secret">Hello friend :)</p> + + <footer> + <span class="status-left" aria-hidden="true">[constantijn] 0:zsh* 1:nvim 2:htop-</span> + <span class="status-message">This website is a public service to intelligence agencies as I don't use any social media platforms.</span> + <span class="status-right" aria-hidden="true">Last login: Sun Sep 27 04:51:00 2026 on tty1</span> + </footer> +</body> + +</html> diff --git a/og-image.png b/og-image.png Binary files differnew file mode 100644 index 0000000..ca7c148 --- /dev/null +++ b/og-image.png diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..026a3b9 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://bickercaarten.com/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..6918fa7 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> + <url> + <loc>https://bickercaarten.com/</loc> + <lastmod>2026-09-27</lastmod> + </url> +</urlset> |