Compare commits
1 Commits
senpai
...
393290441c
| Author | SHA1 | Date | |
|---|---|---|---|
| 393290441c |
2
.gitattributes
vendored
2
.gitattributes
vendored
@@ -1,2 +0,0 @@
|
||||
*.md linguist-language=Astro
|
||||
*.mdx linguist-language=Astro
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Deploy Dev Website
|
||||
name: Deploy Astro
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
@@ -9,30 +9,30 @@ jobs:
|
||||
name: Build and Deploy
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# services:
|
||||
# mermaid:
|
||||
# image: yuzutech/kroki-mermaid
|
||||
# kroki:
|
||||
# image: yuzutech/kroki
|
||||
# env:
|
||||
# KROKI_MERMAID_HOST: mermaid
|
||||
services:
|
||||
mermaid:
|
||||
image: yuzutech/kroki-mermaid
|
||||
kroki:
|
||||
image: yuzutech/kroki
|
||||
env:
|
||||
KROKI_MERMAID_HOST: mermaid
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout code
|
||||
|
||||
- name: Setup node and npm
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: lts/*
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
run: npm ci
|
||||
|
||||
- name: Check and build
|
||||
run: npm run build
|
||||
# env:
|
||||
# KROKI_SERVER: "http://kroki:8000"
|
||||
env:
|
||||
KROKI_SERVER: "http://kroki"
|
||||
|
||||
- name: Copy files via ssh
|
||||
uses: appleboy/scp-action@v1
|
||||
@@ -41,6 +41,6 @@ jobs:
|
||||
username: ${{ secrets.SSH_USERNAME }}
|
||||
key: ${{ secrets.SSH_KEY }}
|
||||
source: "dist/*"
|
||||
target: /srv/website/stable
|
||||
target: /srv/website/dev
|
||||
overwrite: true
|
||||
strip_components: 1
|
||||
@@ -1,46 +0,0 @@
|
||||
name: Deploy Stable Website
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- senpai
|
||||
|
||||
jobs:
|
||||
build-and-deploy:
|
||||
name: Build and Deploy
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
# services:
|
||||
# mermaid:
|
||||
# image: yuzutech/kroki-mermaid
|
||||
# kroki:
|
||||
# image: yuzutech/kroki
|
||||
# env:
|
||||
# KROKI_MERMAID_HOST: mermaid
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout code
|
||||
|
||||
- name: Setup node and npm
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: lts/*
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm install
|
||||
|
||||
- name: Check and build
|
||||
run: npm run build
|
||||
# env:
|
||||
# KROKI_SERVER: "http://kroki:8000"
|
||||
|
||||
- name: Copy files via ssh
|
||||
uses: appleboy/scp-action@v1
|
||||
with:
|
||||
host: c0ntroller.de
|
||||
username: ${{ secrets.SSH_USERNAME }}
|
||||
key: ${{ secrets.SSH_KEY }}
|
||||
source: "dist/*"
|
||||
target: /srv/website/stable
|
||||
overwrite: true
|
||||
strip_components: 1
|
||||
46
README.md
46
README.md
@@ -1,13 +1,43 @@
|
||||
# Frontpage
|
||||
# Astro Starter Kit: Minimal
|
||||
|
||||
[](https://c0ntroller.de/portfolio/astro-rewrite/)
|
||||
```sh
|
||||
npm create astro@latest -- --template minimal
|
||||
```
|
||||
|
||||
| Stable | Dev
|
||||
| ------ | ---
|
||||
| [](https://c0ntroller.de/) | [](https://dev.c0ntroller.de/)
|
||||
> 🧑🚀 **Seasoned astronaut?** Delete this file. Have fun!
|
||||
|
||||
This repository contains my Astro-based website.
|
||||
## 🚀 Project Structure
|
||||
|
||||
When changes are made to `senpai` it will be deployed on https://c0ntroller.de
|
||||
Inside of your Astro project, you'll see the following folders and files:
|
||||
|
||||
When changes are made in the `dev` branch it will be deployed on https://dev.c0ntroller.de
|
||||
```text
|
||||
/
|
||||
├── public/
|
||||
├── src/
|
||||
│ └── pages/
|
||||
│ └── index.astro
|
||||
└── package.json
|
||||
```
|
||||
|
||||
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
|
||||
|
||||
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
|
||||
|
||||
Any static assets, like images, can be placed in the `public/` directory.
|
||||
|
||||
## 🧞 Commands
|
||||
|
||||
All commands are run from the root of the project, from a terminal:
|
||||
|
||||
| Command | Action |
|
||||
| :------------------------ | :----------------------------------------------- |
|
||||
| `npm install` | Installs dependencies |
|
||||
| `npm run dev` | Starts local dev server at `localhost:4321` |
|
||||
| `npm run build` | Build your production site to `./dist/` |
|
||||
| `npm run preview` | Preview your build locally, before deploying |
|
||||
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
|
||||
| `npm run astro -- --help` | Get help using the Astro CLI |
|
||||
|
||||
## 👀 Want to learn more?
|
||||
|
||||
Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat).
|
||||
|
||||
44
package-lock.json
generated
44
package-lock.json
generated
@@ -643,9 +643,7 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/@xmldom/xmldom": {
|
||||
"version": "0.9.9",
|
||||
"resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.9.tgz",
|
||||
"integrity": "sha512-qycIHAucxy/LXAYIjmLmtQ8q9GPnMbnjG1KXhWm9o5sCr6pOYDATkMPiTNa6/v8eELyqOQ2FsEqeoFYmgv/gJg==",
|
||||
"version": "0.9.8",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=14.6"
|
||||
@@ -680,9 +678,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/anymatch/node_modules/picomatch": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
|
||||
"integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
|
||||
"version": "2.3.1",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8.6"
|
||||
@@ -1098,9 +1094,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/defu": {
|
||||
"version": "6.1.7",
|
||||
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
|
||||
"integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==",
|
||||
"version": "6.1.4",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/dequal": {
|
||||
@@ -1512,20 +1506,6 @@
|
||||
"node": ">=12.20.0"
|
||||
}
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
|
||||
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/get-stream": {
|
||||
"version": "5.2.0",
|
||||
"license": "MIT",
|
||||
@@ -3343,9 +3323,7 @@
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/picomatch": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
|
||||
"integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
|
||||
"version": "4.0.3",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
@@ -3909,9 +3887,7 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/smol-toml": {
|
||||
"version": "1.6.1",
|
||||
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
|
||||
"integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==",
|
||||
"version": "1.6.0",
|
||||
"license": "BSD-3-Clause",
|
||||
"engines": {
|
||||
"node": ">= 18"
|
||||
@@ -3943,12 +3919,10 @@
|
||||
}
|
||||
},
|
||||
"node_modules/speech-rule-engine": {
|
||||
"version": "4.1.3",
|
||||
"resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.3.tgz",
|
||||
"integrity": "sha512-SBMgkuJYvP4F62daRfBNwYC2nXTEhNXAfsBZ/BB7Ly85/KnbnjmKM7/45ZrFbH6jIMiAliDUDPSZFUuXDvcg6A==",
|
||||
"version": "4.1.2",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@xmldom/xmldom": "0.9.9",
|
||||
"@xmldom/xmldom": "0.9.8",
|
||||
"commander": "13.1.0",
|
||||
"wicked-good-xpath": "1.3.0"
|
||||
},
|
||||
@@ -4399,9 +4373,7 @@
|
||||
}
|
||||
},
|
||||
"node_modules/vite": {
|
||||
"version": "7.3.2",
|
||||
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz",
|
||||
"integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==",
|
||||
"version": "7.3.1",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"esbuild": "^0.27.0",
|
||||
|
||||
@@ -3,11 +3,11 @@ const currentPath = Astro.url.pathname;
|
||||
import Logo from "../assets/logo.svg";
|
||||
---
|
||||
|
||||
<nav class="main-nav glass-container" style="view-transition-name:navigation;">
|
||||
<nav class="main-nav glass-container">
|
||||
<div class="nav-content">
|
||||
<a href="/" class="logo">
|
||||
<Logo class="logo-img" />
|
||||
<span class="logo-text">c0ntroller.de</span>
|
||||
c0ntroller.de
|
||||
</a>
|
||||
<div class="links">
|
||||
<a
|
||||
@@ -25,6 +25,21 @@ import Logo from "../assets/logo.svg";
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<style is:global>
|
||||
body:has(nav a[href="/"]:hover) {
|
||||
--accent-base: var(--accent-base--default);
|
||||
}
|
||||
body:has(nav a[href="/portfolio"]:hover) {
|
||||
--accent-base: var(--accent-base--portfolio);
|
||||
}
|
||||
body:has(nav a[href="/blog"]:hover) {
|
||||
--accent-base: var(--accent-base--blog);
|
||||
}
|
||||
body:has(nav a[href="/book"]:hover) {
|
||||
--accent-base: var(--accent-base--book);
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
.main-nav {
|
||||
position: sticky;
|
||||
@@ -83,13 +98,4 @@ import Logo from "../assets/logo.svg";
|
||||
color: rgb(var(--accent-base));
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
@media (max-width: 500px) {
|
||||
.logo-text {
|
||||
display: none;
|
||||
}
|
||||
.links {
|
||||
gap: 1rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
|
||||
.welcome-typewriter-nostyle {
|
||||
min-height: 1em;
|
||||
border-right: 2px solid rgb(var(--accent-base));
|
||||
border-right: 2px solid orange;
|
||||
margin: 0 auto;
|
||||
display: block;
|
||||
overflow-x: hidden;
|
||||
@@ -70,7 +70,7 @@
|
||||
display: inline-block;
|
||||
height: 1em;
|
||||
width: 0px;
|
||||
border-right: 2px solid rgb(var(--accent-base));
|
||||
border-right: 2px solid orange;
|
||||
animation: blink-caret 1s step-end infinite;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
}
|
||||
|
||||
@keyframes blink-caret {
|
||||
from, to { border-color: rgb(var(--accent-base)) }
|
||||
from, to { border-color: orange }
|
||||
50% { border-color: transparent; }
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ const portfolioCollection = defineCollection({
|
||||
summary: z.string(),
|
||||
tags: z.array(z.string()).optional(),
|
||||
pubDate: z.date(),
|
||||
repository: z.url().regex(/git/).optional(),
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
---
|
||||
title: "Unbegrenzte Möglichkeiten"
|
||||
summary: "... oder: Wie mich der KI-Chat auf Arbeit radikalisiert."
|
||||
pubDate: 2026-04-13
|
||||
---
|
||||
|
||||
Wie alle großen Arbeitgeber darf auch meiner nicht in der Vergangenheit stecken bleiben.
|
||||
Das heißt seit einigen Jahren, wir bewerfen alle Probleme mit KI und schauen mal, ob was bei rumkommt.
|
||||
|
||||
Für mich als Entwickler bringt das natürlich auch Vorteile:
|
||||
Eine interne Open WebUI-Instanz mit GPT- und Claude-Modellen und auch Github Copilot Enterprise bekomme ich einfach so.
|
||||
Für Github Copilot konnte man sogar "Botschafter" werden.
|
||||
Und da ich den Kollegen eh schon häufiger Computer beibringe, dachte ich, es kann auch nicht schaden.
|
||||
|
||||
Aber damit kam man auch in die ganzen unternehmensweiten "AI Community Support" Chatgruppen, in denen man Anwendungsfälle oder Probleme teilen konnte.
|
||||
Nur fragt man sich dann doch, warum eine Person sich als Botschafter\*in Github Copilot bewirbt, die als erstes fragt, was den dieses "VSCode" ist und wie sies installiert.
|
||||
Und dabei hört es nicht auf.
|
||||
|
||||
Nahezu täglich gibt es immer neue schlaue Ideen und ganz interessante Probleme:
|
||||
- Man sollte doch nicht nur den Code, sondern die Code Review auch gleich die KI übernehmen lassen.
|
||||
- Der HTTP Node in n8n gibt irgendwie immer nur einen Haufen HTML-Tags zurück.
|
||||
- Warum ist eigentlich die `--yolo` Flag in Copilot CLI deaktiviert? Immer alles zu bestätigen, ist immer so anstrengend...
|
||||
- "Ich bin mit meinen Premium-Requests in Copilot schon durch, kann man dort das Limit erhöhen??" (5. Tag des Monats, 300 Premium-Requests/Monat verfügbar)
|
||||
- Angemerkt sei hier: Es geht um Requests, Tokens sind dafür völlig irrelevant. Wenn ich einen langen Request schreibe und die KI arbeitet 2 Tage dran, ist das trotzdem 1 Request.
|
||||
|
||||
Und als jetzt ein Vortrag über Copilot geplant wurde, wurde ich sehr verwirrt angeschaut, als ich vorgeschlagen habe, doch auch über Sicherheitsaspekte zu reden.
|
||||
In einer Firma, die aus Sicherheitsgründen Port 22 zu Github blockiert.
|
||||
|
||||
Es fühlt sich an, als hätte man einem Haufen Teenagern Flammenwerfer gegeben.
|
||||
Natürlich zünden die sich nicht _sofort_ an.
|
||||
Aber nur die wenigsten werden etwas Sinnvolles damit machen.
|
||||
Und das Problem ist ja nicht, dass es die Möglichkeiten gibt, sondern dass immer **einen** gibt, der eine dumme Idee hat.
|
||||
Und so haben jetzt Menschen die Möglichkeit sicherheitskritische Webanwendungen zu entwickeln und auszurollen, die nicht wissen was eine REST API ist.
|
||||
|
||||
Nach und nach entferne ich mich von dem ganzen KI-Thema immer mehr.
|
||||
Ich benutzer weiter Copilot weil es auch echt sinnvoll sein kann und ich benutze gern GPT, weil es gut zum Brainstorming funktioniert.
|
||||
Aber Skill-Pakete, Memory-Anwendungen, Token-Optimierung...
|
||||
Ich glaube einfach nicht mehr dran, dass das in die richtige Richtung geht.
|
||||
Bereichsübergreifend versucht die Firma nun seit Jahren endlich ein Interface zu bauen, durch das man alle Dokumentationen mithilfe LLMs ganz einfach durchsuchen lassen kann.
|
||||
Es funktioniert bis jetzt überhaupt nicht.
|
||||
Trotzdem wird daran festgehalten, vielleicht weil man es den Invenstoren schon gezeigt hat.
|
||||
|
||||
Ich bin auf jeden Fall gespannt, wo das endet.
|
||||
Ich denke – nein, hoffe – spätestens wenn das erste Mal KI-Code unsere Produktion lahm legt, werden Konsequenzen gezogen.
|
||||
@@ -1,46 +0,0 @@
|
||||
---
|
||||
title: "Stürme in Wassergläsern"
|
||||
summary: "Immer wieder lösen Internetgiganten mit Änderungen an ihren Produkten große Entrüstung bei den Nutzern aus. Nur damit wenig später alles vergessen ist. Ein paar Gedanken zu Monopolen, Enshittification und Alternativen."
|
||||
pubDate: 2026-05-04
|
||||
---
|
||||
|
||||
Im Februar 2026 die Skandalmeldung:
|
||||
Discord will in naher Zukunft alle seine User einer Altersverifikation unterziehen.
|
||||
Natürlich erst einmal ein Schock für alle Nutzer, denn nicht einmal ein halbes Jahr vorher wurden in Großbritannien - wo die Nutzerverifikation schon einige Zeit gesetzlich notwendig ist - etliche Dokumente der Nutzer von Hackern abgegriffen. Nicht verwunderlich, dass im Internet direkt Fackeln und Mistgabeln rausgeholt wurden. Und auch Medien sprangen sofort darauf an mit Meldungen wie ["Altersprüfung bei Discord – stirbt jetzt die Plattform?"](https://www.br.de/nachrichten/netzwelt/alterspruefung-bei-discord-stirbt-jetzt-die-plattform,VAimgPb). Leute posten die Kündigungen ihrer Nitro-Abonnements. Sensationell, alle in Aufruhr und alle kämpfen für Privatsphäre und Sicherheit. Und die Kinder.
|
||||
|
||||
Und immer wieder vergessen alle, dass sie vergessen werden.
|
||||
|
||||
Es ist immer dasselbe: Große Firma kündigt große Umstellung an, Gegenstimmen werden laut und das Internet stellt sich vereint gegen die große gierige Firma - nur damit dann nach 2 Wochen komplett Ruhe ist und ein halbes Jahr später keiner mehr weiß, was Sache war.
|
||||
Die Firma hat dabei nichts angepasst und vermeldet neue Rekordgewinne.
|
||||
|
||||
Hier ein paar Beispiele, die die letzten Jahre genau das zeigen:
|
||||
- Reddits Änderungen in der Content-Policy die einen "Blackout" nach sich zog
|
||||
- Datenschutz-Anpassungen von WhatsApp
|
||||
- KI-Integration in Windows 11
|
||||
- Jede Preiserhöhung von Netflix, Amazon Prime, YouTube Premium, ...
|
||||
- Netflix' Unterbinden von geteilten Passwörtern
|
||||
- Artikel 13, der das Internet zerstört hat
|
||||
- Jede Änderung von YouTube jemals, angefangen mit der Integration von Google+
|
||||
Ich glaube, das einzige wirklich große Ereignis dieser Art, von dem man noch heute die Auswirkung merkt, ist Elons Übernahme von Twitter.
|
||||
|
||||
Dabei ist es ja komplett richtig, sich gegen die "Enshittification" zu stellen. Nur haben alle Ereignisse etwas gemeinsam: Die Plattformen haben keine oder nur extrem nischige Alternativen. Also bei den Streaming Services noch am ehesten, aber dort gibt es tatsächlich auch genug Leute, die nur einzelne Monate immer buchen.
|
||||
Viel schlimmer sind sozialen Netzwerke, bei denen muss der Freundeskreis auch gleich mit umziehen. Und meinen Freunden erklären, wie Matrix funktioniert? Na toll...
|
||||
|
||||
Es braucht also mehr Konkurrenz. Es muss großen Firmen schwerer gemacht werden, weiter zu wachsen und das bestehende Monopol zu erhalten. Oder eben direkt die Zerschlagung.
|
||||
Und kleinen Firmen muss es einfacher gemacht werden, in den Markt einzusteigen und zu wachsen, bevor sie direkt wieder aufgekauft werden.
|
||||
Und dann schreiben wir alle auf Signal (oder eben sogar Matrix), teilen Kurznachrichten auf BlueSky, Memes kommen ins Fediverse und man trifft sich am Ende des Tages auf dem selbst gehosteten TeamSpeak Server.
|
||||
|
||||
So nebenbei finde ich es auch verwerflich, wie häufig "Alternativen" zur Sprache kommen, die gar keine sind. Telegram ist unverschlüsselt und damit sogar schlechter als WhatsApp. Threads ist von Meta und keine Alternative zu Twitter. Und aus ganz anderen Gründen ist für die überwiegende Mehrheit Linux keine Alternative zu Windows.
|
||||
|
||||
Wahrscheinlich wird auch diesmal die Anzahl der Nutzer, die jetzt TeamSpeak Server aufsetzen statt sich in der bereits bestehenden Discord-Bubble auszuruhen, vernachlässigbar sein.
|
||||
Und sehr wahrscheinlich gehöre auch ich dazu.
|
||||
|
||||
Schade eigentlich.
|
||||
## Eine Meinung
|
||||
|
||||
Und hier nochmal meine persönliche Meinung zum Discord "Drama":
|
||||
Vorab - ja, Datensammeln zu ist immer kritisch zu hinterfragen und zu kritisieren.
|
||||
Aber - ob man das mag oder nicht, von politischer Seite werden immer mehr Stimmen laut, die eine zentrale Altersverifikation im Netz fordern. Und wenn man darauf vertraut, dass die Politik moderne und sichere Lösung bereitstellen, wird man meistens enttäuscht ([\*Hust\*](https://www.heise.de/news/EU-App-zur-Altersverifikation-Sorglos-Paket-mit-Sicherheitsluecken-11262838.html)). Und Discord zeigt hier in Blog-Artikeln nicht nur Einsicht, was den Vorfall im Vorjahr betraf (der ja auch nur durch einen Drittanbieter verursacht wurde), sondern betont auch dringlichst nur auf Anbieter zu setzen, die lokal und ohne weitreichende Datensammlung arbeiten. Und im Profil landet nur noch der Haken, ob ein Nutzer über 18 ist.
|
||||
|
||||
Und zurück zum Anfang: Ja, das sind wieder mehr Daten und ja, ob das am Ende exakt so umgesetzt wird, wie versprochen, ist unklar.
|
||||
Aber ich finde diese Richtung und diese Bestrebungen sogar wichtig um für zukünftige politische Agendas einen klaren Präzedenzfall zu setzen, wie dieses Problem minimalinvasiv angegangen wird.
|
||||
@@ -1,7 +1,9 @@
|
||||
---
|
||||
title: "Hello world!"
|
||||
title: "Dummy Post"
|
||||
summary: "Der Blog steht, jetzt fehlt noch Inhalt..."
|
||||
pubDate: 2026-03-20
|
||||
---
|
||||
|
||||
## Hallo Welt
|
||||
|
||||
Demnächst kommen hier hoffentlich ab und so mal Gedanken hin.
|
||||
|
||||
@@ -210,16 +210,12 @@ Dieser funktioniert genau andersrum: Wenn am Gate eine Spannung anliegt, ist der
|
||||
Dadurch ist dann unser Ausgang immer definiert.
|
||||
Hier nochmal als Schaubild:
|
||||
|
||||
<Image src={cmos} alt="Eine CMOS-Schaltung mit a und b als Eingänge, die ein Und-Gatter bilden." height="400" />
|
||||
<Image src={cmos} alt="Eine CMOS-Schaltung mit a und b als Eingänge, die ein Und-Gatter bilden." height="500" />
|
||||
|
||||
Statt je nachdem, ob bei $a$ und $b$ Spannung anliegt, fließt der Strom von "oben" oder "unten" durch die Transistoren und unser $Out$ nimmt die Spannung von $High$ oder $Low$ an.
|
||||
Genauer: Wenn $a$ und $b$ beide High sind, verbinden die "oberen" Transistoren den Ausgang mit $High$ und die "unteren" sind nicht mehr verbunden.
|
||||
Wenn $a$ oder $b$ Low sind, ist mindestens einer der "oberen" Transistoren nicht mehr durchgeschaltet und mindestens einer der "unteren" verbindet den Ausgang zu $Low$.
|
||||
$High$ und $Low$ sind dabei die Spannungen, die für 1 und 0 stehen.
|
||||
|
||||
> [!info]
|
||||
> Wie genau die Spannungen sind und ob jetzt eine hohe oder niedrige Spannung für 1 oder 0 steht, kann von System zu System unterschiedlich sein.
|
||||
> Nachfolgend ist das auch gar nicht mehr so wichtig, da wir einfach nur noch 1 und 0 als Werte benutzen werden.
|
||||
Was genau die zugehörigen Spannung ist, hängt vom jeweiligen System ab.
|
||||
Die Spannungen sind so zu wählen, dass sie von den Transistoren sicher erkannt werden können.
|
||||
|
||||
Aber gut, jetzt haben wir schon ein Und-Gatter.
|
||||
Man kann sich nun selbst überlegen, wie die anderen Gatter mit Transistoren aufgebaut werden können.
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_nfet"
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,340.38261,-407.58671999999996)"
|
||||
@@ -165,7 +165,7 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-409.43721999999997)"
|
||||
@@ -174,7 +174,7 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-351.23247999999995)"
|
||||
@@ -183,7 +183,7 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,338.53211,-380.33486)"
|
||||
@@ -192,7 +192,7 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.5494034883087,-390.5945499304999)"
|
||||
|
||||
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 9.8 KiB |
@@ -1,6 +1,5 @@
|
||||
{
|
||||
"version": "0.1",
|
||||
"tikzSettings": {},
|
||||
"components": [
|
||||
{
|
||||
"type": "node",
|
||||
@@ -67,7 +66,7 @@
|
||||
{
|
||||
"type": "rect",
|
||||
"position": {
|
||||
"x": 481.89,
|
||||
"x": 401.575,
|
||||
"y": -349.606
|
||||
},
|
||||
"stroke": {
|
||||
@@ -182,8 +181,8 @@
|
||||
{
|
||||
"type": "rect",
|
||||
"position": {
|
||||
"x": 428.977,
|
||||
"y": -283.465
|
||||
"x": 372.283,
|
||||
"y": -223.937
|
||||
},
|
||||
"stroke": {
|
||||
"opacity": 0
|
||||
@@ -208,7 +207,7 @@
|
||||
{
|
||||
"type": "node",
|
||||
"position": {
|
||||
"x": 462.992,
|
||||
"x": 387.402,
|
||||
"y": -349.606
|
||||
},
|
||||
"id": "circ"
|
||||
@@ -221,7 +220,7 @@
|
||||
"y": -349.606
|
||||
},
|
||||
{
|
||||
"x": 462.992,
|
||||
"x": 387.402,
|
||||
"y": -349.606
|
||||
}
|
||||
],
|
||||
@@ -278,8 +277,8 @@
|
||||
{
|
||||
"type": "node",
|
||||
"position": {
|
||||
"x": 434.646,
|
||||
"y": -320.504
|
||||
"x": 377.953,
|
||||
"y": -260.598
|
||||
},
|
||||
"id": "pfet"
|
||||
},
|
||||
@@ -324,24 +323,24 @@
|
||||
{
|
||||
"type": "node",
|
||||
"position": {
|
||||
"x": 434.647,
|
||||
"y": -309.922
|
||||
"x": 377.953,
|
||||
"y": -250.394
|
||||
},
|
||||
"id": "circ"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"position": {
|
||||
"x": 434.647,
|
||||
"y": -291.024
|
||||
"x": 377.953,
|
||||
"y": -231.496
|
||||
},
|
||||
"id": "circ"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"position": {
|
||||
"x": 397.607,
|
||||
"y": -320.504
|
||||
"x": 340.914,
|
||||
"y": -260.598
|
||||
},
|
||||
"id": "circ"
|
||||
},
|
||||
@@ -357,12 +356,12 @@
|
||||
"type": "wire",
|
||||
"points": [
|
||||
{
|
||||
"x": 434.647,
|
||||
"y": -320.126
|
||||
"x": 377.953,
|
||||
"y": -260.598
|
||||
},
|
||||
{
|
||||
"x": 434.647,
|
||||
"y": -309.922
|
||||
"x": 377.953,
|
||||
"y": -250.394
|
||||
}
|
||||
],
|
||||
"stroke": {
|
||||
@@ -393,8 +392,8 @@
|
||||
{
|
||||
"type": "rect",
|
||||
"position": {
|
||||
"x": 385.039,
|
||||
"y": -325.984
|
||||
"x": 328.347,
|
||||
"y": -264.567
|
||||
},
|
||||
"stroke": {
|
||||
"opacity": 0
|
||||
@@ -407,32 +406,6 @@
|
||||
"text": "b",
|
||||
"showPlaceholderText": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "rect",
|
||||
"position": {
|
||||
"x": 372.284,
|
||||
"y": -281.575
|
||||
},
|
||||
"stroke": {
|
||||
"opacity": 0
|
||||
},
|
||||
"size": {
|
||||
"x": 26.457,
|
||||
"y": 22.677
|
||||
},
|
||||
"text": {
|
||||
"text": "Low",
|
||||
"showPlaceholderText": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"position": {
|
||||
"x": 377.954,
|
||||
"y": -289.134
|
||||
},
|
||||
"id": "circ"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -3,11 +3,11 @@
|
||||
version="1.1"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
style="font-size: 10pt; overflow: visible;"
|
||||
viewBox="316.0090026855469 -485.5880126953125 179.16348266601562 211.82464599609375"
|
||||
viewBox="308.11566162109375 -492.6713562011719 113.69015502929688 281.40618896484375"
|
||||
>
|
||||
<defs>
|
||||
<symbol id="node_nfet">
|
||||
<g stroke="var(--text-main, #e0e7f0)" stroke-miterlimit="10" stroke-width=".4">
|
||||
<g stroke="currentStroke" stroke-miterlimit="10" stroke-width=".4">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width=".53134"
|
||||
@@ -41,7 +41,7 @@
|
||||
</g>
|
||||
</symbol>
|
||||
<symbol id="node_pfet">
|
||||
<g stroke="var(--text-main, #e0e7f0)" stroke-miterlimit="10" stroke-width=".4">
|
||||
<g stroke="currentStroke" stroke-miterlimit="10" stroke-width=".4">
|
||||
<path
|
||||
fill="none"
|
||||
stroke-width=".53134"
|
||||
@@ -75,7 +75,11 @@
|
||||
</g>
|
||||
</symbol>
|
||||
<symbol id="node_circ">
|
||||
<g stroke="var(--text-main, #e0e7f0)" stroke-miterlimit="10" stroke-width=".53134">
|
||||
<g
|
||||
stroke="currentStroke"
|
||||
stroke-miterlimit="10"
|
||||
stroke-width=".53134"
|
||||
>
|
||||
<path
|
||||
d="M4.49803 2.38186c0-1.16874-.94744-2.11617-2.11617-2.11617s-2.11617.94743-2.11617 2.11617.94743 2.11617 2.11617 2.11617 2.11617-.94744 2.11617-2.11617Zm-2.11617 0"
|
||||
fill="currentColor"
|
||||
@@ -86,18 +90,36 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_nfet"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,340.38261,-407.58671999999996)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,317.449,-351.055)" />
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,317.449,-351.055)">
|
||||
<rect
|
||||
width="22.288666666666668"
|
||||
height="17.564666666666668"
|
||||
style=""
|
||||
x="0.6666666666666661"
|
||||
y="0.6666666666666661"
|
||||
transform="matrix(1,0,0,1,309.449,-359.055)"
|
||||
stroke-dasharray="1pt 0pt"
|
||||
stroke-opacity="0"
|
||||
stroke-width="0"
|
||||
stroke="hsl(0 0 85)"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
/>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,0)"
|
||||
style="pointer-events: none;"
|
||||
class=""
|
||||
>
|
||||
<g fill="hsl(0 0 85)" transform="matrix(1,0,0,1,317.449,-351.055)" />
|
||||
<g fill="hsl(0 0 85)" transform="matrix(1,0,0,1,317.449,-351.055)">
|
||||
<path
|
||||
d="M0.56 4.73L0.56 4.73Q0.56 3.60 1.89 3.00L1.89 3.00Q2.70 2.61 4.35 2.52L4.35 2.52L4.35 2.03Q4.35 1.20 3.92 0.76Q3.48 0.32 2.94 0.32L2.94 0.32Q1.96 0.32 1.49 0.93L1.49 0.93Q1.89 0.95 2.03 1.15Q2.17 1.35 2.17 1.55L2.17 1.55Q2.17 1.81 2.01 1.99Q1.84 2.16 1.56 2.16L1.56 2.16Q1.30 2.16 1.12 1.99Q0.94 1.83 0.94 1.53L0.94 1.53Q0.94 0.88 1.53 0.45Q2.12 0.02 2.96 0.02L2.96 0.02Q4.06 0.02 4.79 0.76L4.79 0.76Q5.01 0.99 5.13 1.28Q5.24 1.57 5.25 1.76Q5.27 1.96 5.27 2.33L5.27 2.33L5.27 5.00Q5.27 5.08 5.29 5.21Q5.32 5.34 5.44 5.50Q5.56 5.67 5.76 5.67L5.76 5.67Q6.24 5.67 6.24 4.82L6.24 4.82L6.24 4.07L6.58 4.07L6.58 4.82Q6.58 5.52 6.20 5.80Q5.83 6.08 5.48 6.08L5.48 6.08Q5.04 6.08 4.76 5.75Q4.48 5.43 4.44 4.98L4.44 4.98Q4.24 5.49 3.78 5.82Q3.32 6.15 2.70 6.15L2.70 6.15Q2.21 6.15 1.76 6.03Q1.31 5.91 0.93 5.57Q0.56 5.24 0.56 4.73ZM1.59 4.72L1.59 4.72Q1.59 5.21 1.94 5.53Q2.29 5.85 2.79 5.85L2.79 5.85Q3.35 5.85 3.85 5.42Q4.35 4.98 4.35 4.13L4.35 4.13L4.35 2.80Q2.87 2.85 2.23 3.44Q1.59 4.03 1.59 4.72Z"
|
||||
d="M0.56 4.73L0.56 4.73Q0.56 3.59 1.89 2.99L1.89 2.99Q2.70 2.61 4.35 2.51L4.35 2.51L4.35 2.02Q4.35 1.20 3.92 0.76Q3.48 0.32 2.94 0.32L2.94 0.32Q1.96 0.32 1.49 0.93L1.49 0.93Q1.89 0.94 2.03 1.14Q2.17 1.34 2.17 1.54L2.17 1.54Q2.17 1.81 2.01 1.98Q1.84 2.15 1.56 2.15L1.56 2.15Q1.30 2.15 1.12 1.99Q0.94 1.82 0.94 1.53L0.94 1.53Q0.94 0.88 1.53 0.45Q2.12 0.02 2.96 0.02L2.96 0.02Q4.06 0.02 4.79 0.75L4.79 0.75Q5.01 0.98 5.13 1.28Q5.24 1.57 5.25 1.76Q5.27 1.95 5.27 2.33L5.27 2.33L5.27 4.99Q5.27 5.07 5.29 5.20Q5.32 5.33 5.44 5.50Q5.56 5.66 5.76 5.66L5.76 5.66Q6.24 5.66 6.24 4.81L6.24 4.81L6.24 4.06L6.58 4.06L6.58 4.81Q6.58 5.52 6.20 5.80Q5.83 6.07 5.48 6.07L5.48 6.07Q5.04 6.07 4.76 5.75Q4.48 5.42 4.44 4.98L4.44 4.98Q4.24 5.49 3.78 5.82Q3.32 6.15 2.70 6.15L2.70 6.15Q2.21 6.15 1.76 6.03Q1.31 5.90 0.93 5.57Q0.56 5.23 0.56 4.73ZM1.59 4.71L1.59 4.71Q1.59 5.21 1.94 5.53Q2.29 5.85 2.79 5.85L2.79 5.85Q3.35 5.85 3.85 5.41Q4.35 4.98 4.35 4.13L4.35 4.13L4.35 2.79Q2.87 2.84 2.23 3.43Q1.59 4.02 1.59 4.71Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
@@ -109,25 +131,61 @@
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,362.331,-483.338)" />
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,362.331,-483.338)">
|
||||
<rect
|
||||
width="27.012666666666668"
|
||||
height="27.012666666666668"
|
||||
style=""
|
||||
x="0.6666666666666661"
|
||||
y="0.6666666666666661"
|
||||
transform="matrix(1,0,0,1,354.331,-491.338)"
|
||||
stroke-dasharray="1pt 0pt"
|
||||
stroke-opacity="0"
|
||||
stroke-width="0"
|
||||
stroke="hsl(0 0 85)"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
/>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,0)"
|
||||
style="pointer-events: none;"
|
||||
class=""
|
||||
>
|
||||
<g fill="hsl(0 0 85)" transform="matrix(1,0,0,1,362.331,-483.338)" />
|
||||
<g fill="hsl(0 0 85)" transform="matrix(1,0,0,1,362.331,-483.338)">
|
||||
<path
|
||||
d="M0.44 9L0.44 9L0.44 8.59L0.76 8.59Q1.48 8.59 1.65 8.47Q1.82 8.35 1.82 7.96L1.82 7.96L1.82 0.93Q1.82 0.55 1.65 0.43Q1.48 0.31 0.76 0.31L0.76 0.31L0.44 0.31L0.44-0.11Q0.91-0.07 2.42-0.07L2.42-0.07Q3.91-0.07 4.38-0.11L4.38-0.11L4.38 0.31L4.06 0.31Q3.33 0.31 3.17 0.43Q3.00 0.55 3.00 0.93L3.00 0.93L3.00 4.05L6.99 4.05L6.99 0.93Q6.99 0.55 6.82 0.43Q6.65 0.31 5.93 0.31L5.93 0.31L5.61 0.31L5.61-0.11Q6.08-0.07 7.58-0.07L7.58-0.07Q9.08-0.07 9.54-0.11L9.54-0.11L9.54 0.31L9.23 0.31Q8.50 0.31 8.34 0.43Q8.17 0.55 8.17 0.93L8.17 0.93L8.17 7.96Q8.17 8.34 8.34 8.47Q8.51 8.59 9.23 8.59L9.23 8.59L9.54 8.59L9.54 9Q9.08 8.96 7.57 8.96L7.57 8.96Q6.08 8.96 5.61 9L5.61 9L5.61 8.59L5.93 8.59Q6.65 8.59 6.82 8.47Q6.99 8.35 6.99 7.96L6.99 7.96L6.99 4.47L3.00 4.47L3.00 7.96Q3.00 8.34 3.17 8.47Q3.33 8.59 4.06 8.59L4.06 8.59L4.38 8.59L4.38 9Q3.91 8.96 2.40 8.96L2.40 8.96Q0.91 8.96 0.44 9ZM10.44 9L10.44 9L10.44 8.59Q11.15 8.59 11.32 8.50Q11.48 8.41 11.48 7.98L11.48 7.98L11.48 4.40Q11.48 3.90 11.31 3.79Q11.15 3.67 10.49 3.67L10.49 3.67L10.49 3.25L12.36 3.11L12.36 8.00Q12.36 8.39 12.50 8.49Q12.64 8.59 13.29 8.59L13.29 8.59L13.29 9Q11.93 8.96 11.91 8.96L11.91 8.96Q11.73 8.96 10.44 9ZM11.00 0.78L11.00 0.78Q11.00 0.52 11.21 0.30Q11.41 0.08 11.71 0.08Q12.00 0.08 12.21 0.28Q12.42 0.48 12.42 0.79Q12.42 1.10 12.21 1.29Q12.00 1.49 11.71 1.49L11.71 1.49Q11.40 1.49 11.20 1.28Q11.00 1.06 11.00 0.78ZM14.06 10.05L14.06 10.05Q14.06 9.63 14.39 9.25Q14.72 8.88 15.29 8.72L15.29 8.72Q14.71 8.35 14.71 7.54L14.71 7.54Q14.71 6.91 15.12 6.43L15.12 6.43Q14.49 5.91 14.49 5.05L14.49 5.05Q14.49 4.27 15.12 3.69Q15.74 3.11 16.65 3.11L16.65 3.11Q17.45 3.11 18.07 3.59L18.07 3.59Q18.70 2.96 19.48 2.96L19.48 2.96Q19.82 2.96 19.99 3.17Q20.16 3.39 20.16 3.62L20.16 3.62Q20.16 3.82 20.03 3.92Q19.90 4.01 19.77 4.01L19.77 4.01Q19.61 4.01 19.50 3.91Q19.38 3.80 19.38 3.63L19.38 3.63Q19.38 3.35 19.60 3.26L19.60 3.26Q19.56 3.25 19.47 3.25L19.47 3.25Q18.82 3.25 18.26 3.77L18.26 3.77Q18.81 4.28 18.81 5.07Q18.81 5.86 18.18 6.43Q17.56 7.01 16.65 7.01L16.65 7.01Q15.90 7.01 15.33 6.60L15.33 6.60Q15.10 6.86 15.10 7.23L15.10 7.23Q15.10 7.56 15.31 7.82Q15.51 8.08 15.81 8.12L15.81 8.12Q15.90 8.13 16.81 8.13L16.81 8.13Q17.34 8.13 17.64 8.15Q17.93 8.16 18.35 8.25Q18.77 8.34 19.10 8.51L19.10 8.51Q19.97 8.99 19.97 10.03L19.97 10.03Q19.97 10.79 19.10 11.27Q18.22 11.75 17.01 11.75L17.01 11.75Q15.79 11.75 14.93 11.26Q14.06 10.78 14.06 10.05ZM14.76 10.05L14.76 10.05Q14.76 10.60 15.40 11.02Q16.05 11.44 17.02 11.44L17.02 11.44Q17.98 11.44 18.63 11.03Q19.28 10.61 19.28 10.05L19.28 10.05Q19.28 9.66 19.05 9.40Q18.82 9.15 18.36 9.05Q17.89 8.95 17.57 8.93Q17.24 8.91 16.64 8.91L16.64 8.91L15.85 8.91Q15.40 8.93 15.08 9.27Q14.76 9.60 14.76 10.05ZM15.49 5.07L15.49 5.07Q15.49 6.71 16.65 6.71L16.65 6.71Q17.24 6.71 17.60 6.17L17.60 6.17Q17.81 5.82 17.81 5.05L17.81 5.05Q17.81 3.41 16.65 3.41L16.65 3.41Q16.07 3.41 15.70 3.95L15.70 3.95Q15.49 4.31 15.49 5.07ZM20.79 9L20.79 9L20.79 8.59Q21.50 8.59 21.66 8.50Q21.82 8.41 21.82 7.98L21.82 7.98L21.82 1.05Q21.82 0.56 21.65 0.43Q21.48 0.31 20.79 0.31L20.79 0.31L20.79-0.11L22.70-0.25L22.70 4.38L22.71 4.38Q22.93 3.90 23.41 3.51Q23.89 3.11 24.64 3.11L24.64 3.11Q25.64 3.11 26.04 3.60L26.04 3.60Q26.33 3.93 26.39 4.31Q26.45 4.68 26.45 5.64L26.45 5.64L26.45 8.19Q26.46 8.47 26.68 8.53Q26.89 8.59 27.49 8.59L27.49 8.59L27.49 9Q26.13 8.96 26.00 8.96L26.00 8.96Q25.89 8.96 24.49 9L24.49 9L24.49 8.59Q25.20 8.59 25.37 8.50Q25.53 8.41 25.53 7.98L25.53 7.98L25.53 4.88Q25.53 4.20 25.33 3.80Q25.12 3.40 24.54 3.40L24.54 3.40Q23.85 3.40 23.30 3.98Q22.75 4.56 22.75 5.54L22.75 5.54L22.75 7.98Q22.75 8.41 22.91 8.50Q23.08 8.59 23.78 8.59L23.78 8.59L23.78 9Q22.42 8.96 22.29 8.96L22.29 8.96Q22.19 8.96 20.79 9Z"
|
||||
d="M0.44 9.29L0.44 9.29L0.44 8.88L0.76 8.88Q1.48 8.88 1.65 8.76Q1.82 8.64 1.82 8.25L1.82 8.25L1.82 1.22Q1.82 0.84 1.65 0.72Q1.48 0.60 0.76 0.60L0.76 0.60L0.44 0.60L0.44 0.18Q0.91 0.22 2.42 0.22L2.42 0.22Q3.91 0.22 4.38 0.18L4.38 0.18L4.38 0.60L4.06 0.60Q3.33 0.60 3.17 0.72Q3.00 0.84 3.00 1.22L3.00 1.22L3.00 4.34L6.99 4.34L6.99 1.22Q6.99 0.84 6.82 0.72Q6.65 0.60 5.93 0.60L5.93 0.60L5.61 0.60L5.61 0.18Q6.08 0.22 7.58 0.22L7.58 0.22Q9.08 0.22 9.54 0.18L9.54 0.18L9.54 0.60L9.23 0.60Q8.50 0.60 8.34 0.72Q8.17 0.84 8.17 1.22L8.17 1.22L8.17 8.25Q8.17 8.63 8.34 8.75Q8.51 8.88 9.23 8.88L9.23 8.88L9.54 8.88L9.54 9.29Q9.08 9.25 7.57 9.25L7.57 9.25Q6.08 9.25 5.61 9.29L5.61 9.29L5.61 8.88L5.93 8.88Q6.65 8.88 6.82 8.76Q6.99 8.64 6.99 8.25L6.99 8.25L6.99 4.76L3.00 4.76L3.00 8.25Q3.00 8.63 3.17 8.75Q3.33 8.88 4.06 8.88L4.06 8.88L4.38 8.88L4.38 9.29Q3.91 9.25 2.40 9.25L2.40 9.25Q0.91 9.25 0.44 9.29ZM10.44 9.29L10.44 9.29L10.44 8.88Q11.15 8.88 11.32 8.79Q11.48 8.70 11.48 8.27L11.48 8.27L11.48 4.69Q11.48 4.19 11.31 4.07Q11.15 3.96 10.49 3.96L10.49 3.96L10.49 3.54L12.36 3.40L12.36 8.29Q12.36 8.68 12.50 8.78Q12.64 8.88 13.29 8.88L13.29 8.88L13.29 9.29Q11.93 9.25 11.91 9.25L11.91 9.25Q11.73 9.25 10.44 9.29ZM11.00 1.07L11.00 1.07Q11.00 0.80 11.21 0.59Q11.41 0.37 11.71 0.37Q12.00 0.37 12.21 0.57Q12.42 0.77 12.42 1.08Q12.42 1.38 12.21 1.58Q12.00 1.78 11.71 1.78L11.71 1.78Q11.40 1.78 11.20 1.57Q11.00 1.35 11.00 1.07ZM14.06 10.34L14.06 10.34Q14.06 9.91 14.39 9.54Q14.72 9.17 15.29 9.01L15.29 9.01Q14.71 8.64 14.71 7.82L14.71 7.82Q14.71 7.20 15.12 6.72L15.12 6.72Q14.49 6.20 14.49 5.34L14.49 5.34Q14.49 4.55 15.12 3.98Q15.74 3.40 16.65 3.40L16.65 3.40Q17.45 3.40 18.07 3.88L18.07 3.88Q18.70 3.25 19.48 3.25L19.48 3.25Q19.82 3.25 19.99 3.46Q20.16 3.68 20.16 3.90L20.16 3.90Q20.16 4.11 20.03 4.20Q19.90 4.30 19.77 4.30L19.77 4.30Q19.61 4.30 19.50 4.19Q19.38 4.09 19.38 3.92L19.38 3.92Q19.38 3.64 19.60 3.55L19.60 3.55Q19.56 3.54 19.47 3.54L19.47 3.54Q18.82 3.54 18.26 4.06L18.26 4.06Q18.81 4.57 18.81 5.36Q18.81 6.14 18.18 6.72Q17.56 7.30 16.65 7.30L16.65 7.30Q15.90 7.30 15.33 6.89L15.33 6.89Q15.10 7.15 15.10 7.52L15.10 7.52Q15.10 7.85 15.31 8.11Q15.51 8.37 15.81 8.41L15.81 8.41Q15.90 8.42 16.81 8.42L16.81 8.42Q17.34 8.42 17.64 8.44Q17.93 8.45 18.35 8.54Q18.77 8.62 19.10 8.79L19.10 8.79Q19.97 9.28 19.97 10.32L19.97 10.32Q19.97 11.08 19.10 11.56Q18.22 12.04 17.01 12.04L17.01 12.04Q15.79 12.04 14.93 11.55Q14.06 11.07 14.06 10.34ZM14.76 10.34L14.76 10.34Q14.76 10.89 15.40 11.31Q16.05 11.73 17.02 11.73L17.02 11.73Q17.98 11.73 18.63 11.32Q19.28 10.90 19.28 10.34L19.28 10.34Q19.28 9.95 19.05 9.69Q18.82 9.44 18.36 9.34Q17.89 9.24 17.57 9.22Q17.24 9.20 16.64 9.20L16.64 9.20L15.85 9.20Q15.40 9.22 15.08 9.55Q14.76 9.89 14.76 10.34ZM15.49 5.36L15.49 5.36Q15.49 7.00 16.65 7.00L16.65 7.00Q17.24 7.00 17.60 6.46L17.60 6.46Q17.81 6.10 17.81 5.34L17.81 5.34Q17.81 3.70 16.65 3.70L16.65 3.70Q16.07 3.70 15.70 4.24L15.70 4.24Q15.49 4.59 15.49 5.36ZM20.79 9.29L20.79 9.29L20.79 8.88Q21.50 8.88 21.66 8.79Q21.82 8.70 21.82 8.27L21.82 8.27L21.82 1.34Q21.82 0.84 21.65 0.72Q21.48 0.60 20.79 0.60L20.79 0.60L20.79 0.18L22.70 0.04L22.70 4.67L22.71 4.67Q22.93 4.19 23.41 3.79Q23.89 3.40 24.64 3.40L24.64 3.40Q25.64 3.40 26.04 3.89L26.04 3.89Q26.33 4.22 26.39 4.59Q26.45 4.97 26.45 5.93L26.45 5.93L26.45 8.47Q26.46 8.75 26.68 8.82Q26.89 8.88 27.49 8.88L27.49 8.88L27.49 9.29Q26.13 9.25 26.00 9.25L26.00 9.25Q25.89 9.25 24.49 9.29L24.49 9.29L24.49 8.88Q25.20 8.88 25.37 8.79Q25.53 8.70 25.53 8.27L25.53 8.27L25.53 5.17Q25.53 4.49 25.33 4.09Q25.12 3.69 24.54 3.69L24.54 3.69Q23.85 3.69 23.30 4.27Q22.75 4.85 22.75 5.82L22.75 5.82L22.75 8.27Q22.75 8.70 22.91 8.79Q23.08 8.88 23.78 8.88L23.78 8.88L23.78 9.29Q22.42 9.25 22.29 9.25L22.29 9.25Q22.19 9.25 20.79 9.29Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,470.9925,-355.779)" />
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,470.9925,-355.779)">
|
||||
<rect
|
||||
width="36.461666666666666"
|
||||
height="27.012666666666668"
|
||||
style=""
|
||||
x="0.6666666666666679"
|
||||
y="0.6666666666666661"
|
||||
transform="matrix(1,0,0,1,382.6775,-363.779)"
|
||||
stroke-dasharray="1pt 0pt"
|
||||
stroke-opacity="0"
|
||||
stroke-width="0"
|
||||
stroke="hsl(0 0 85)"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
/>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,0)"
|
||||
style="pointer-events: none;"
|
||||
class=""
|
||||
>
|
||||
<g fill="hsl(0 0 85)" transform="matrix(1,0,0,1,390.6775,-355.779)" />
|
||||
<g fill="hsl(0 0 85)" transform="matrix(1,0,0,1,390.6775,-355.779)">
|
||||
<path
|
||||
d="M0.75 5.48L0.75 5.48Q0.75 3.44 2.05 2.02Q3.36 0.60 5.18 0.60L5.18 0.60Q7.01 0.60 8.31 2.02Q9.62 3.45 9.62 5.48L9.62 5.48Q9.62 7.49 8.31 8.89Q7.00 10.29 5.18 10.29L5.18 10.29Q3.38 10.29 2.06 8.90Q0.75 7.51 0.75 5.48ZM2.12 5.29L2.12 5.29Q2.12 6.53 2.42 7.48Q2.71 8.42 3.18 8.94Q3.65 9.45 4.16 9.70Q4.67 9.95 5.19 9.95L5.19 9.95Q5.70 9.95 6.19 9.71Q6.69 9.47 7.17 8.96Q7.64 8.45 7.94 7.50Q8.24 6.55 8.24 5.29L8.24 5.29Q8.24 4.32 8.03 3.53Q7.83 2.75 7.50 2.27Q7.17 1.80 6.75 1.48Q6.33 1.17 5.94 1.05Q5.55 0.93 5.18 0.93L5.18 0.93Q4.71 0.93 4.22 1.14Q3.73 1.35 3.24 1.81Q2.75 2.27 2.43 3.17Q2.12 4.07 2.12 5.29ZM10.79 4.67L10.79 4.67L10.79 4.25L12.75 4.11L12.75 8.54Q12.75 8.85 12.77 9.04Q12.80 9.23 12.91 9.44Q13.01 9.65 13.26 9.75Q13.52 9.85 13.92 9.85L13.92 9.85Q14.64 9.85 15.09 9.26Q15.53 8.67 15.53 7.79L15.53 7.79L15.53 5.41Q15.53 4.92 15.36 4.79Q15.18 4.67 14.49 4.67L14.49 4.67L14.49 4.25L16.45 4.11L16.45 8.84Q16.45 9.34 16.62 9.46Q16.80 9.59 17.49 9.59L17.49 9.59L17.49 10L15.57 10.15L15.57 8.95Q15.01 10.14 13.85 10.15L13.85 10.15Q13.27 10.15 12.87 10Q12.47 9.85 12.27 9.66Q12.06 9.48 11.96 9.12Q11.85 8.76 11.84 8.54Q11.82 8.32 11.82 7.89L11.82 7.89L11.82 5.89Q11.82 4.99 11.69 4.83Q11.56 4.67 10.79 4.67ZM19.14 4.67L18.01 4.67L18.01 4.38Q18.62 4.35 19.03 3.92Q19.43 3.48 19.57 2.95Q19.71 2.42 19.73 1.80L19.73 1.80L20.06 1.80L20.06 4.25L21.97 4.25L21.97 4.67L20.06 4.67L20.06 8.37Q20.06 9.81 20.96 9.81L20.96 9.81Q21.34 9.81 21.60 9.42Q21.85 9.02 21.85 8.32L21.85 8.32L21.85 7.58L22.18 7.58L22.18 8.35Q22.18 9.07 21.85 9.61Q21.52 10.15 20.86 10.15L20.86 10.15Q20.62 10.15 20.38 10.09Q20.14 10.03 19.83 9.87Q19.52 9.71 19.33 9.31Q19.14 8.92 19.14 8.35L19.14 8.35L19.14 4.67Z"
|
||||
d="M0.75 4.92L0.75 4.92Q0.75 2.88 2.05 1.46Q3.36 0.03 5.18 0.03L5.18 0.03Q7.01 0.03 8.31 1.46Q9.62 2.89 9.62 4.92L9.62 4.92Q9.62 6.93 8.31 8.33Q7.00 9.73 5.18 9.73L5.18 9.73Q3.38 9.73 2.06 8.33Q0.75 6.94 0.75 4.92ZM2.12 4.73L2.12 4.73Q2.12 5.97 2.42 6.91Q2.71 7.86 3.18 8.37Q3.65 8.89 4.16 9.14Q4.67 9.38 5.19 9.38L5.19 9.38Q5.70 9.38 6.19 9.14Q6.69 8.90 7.17 8.39Q7.64 7.89 7.94 6.94Q8.24 5.98 8.24 4.73L8.24 4.73Q8.24 3.75 8.03 2.97Q7.83 2.18 7.50 1.71Q7.17 1.23 6.75 0.92Q6.33 0.61 5.94 0.49Q5.55 0.37 5.18 0.37L5.18 0.37Q4.71 0.37 4.22 0.57Q3.73 0.78 3.24 1.24Q2.75 1.70 2.43 2.60Q2.12 3.50 2.12 4.73ZM10.79 4.10L10.79 4.10L10.79 3.69L12.75 3.54L12.75 7.97Q12.75 8.29 12.77 8.47Q12.80 8.66 12.91 8.88Q13.01 9.09 13.26 9.19Q13.52 9.29 13.92 9.29L13.92 9.29Q14.64 9.29 15.09 8.69Q15.53 8.10 15.53 7.22L15.53 7.22L15.53 4.85Q15.53 4.35 15.36 4.23Q15.18 4.10 14.49 4.10L14.49 4.10L14.49 3.69L16.45 3.54L16.45 8.28Q16.45 8.77 16.62 8.90Q16.80 9.03 17.49 9.03L17.49 9.03L17.49 9.44L15.57 9.58L15.57 8.38Q15.01 9.58 13.85 9.58L13.85 9.58Q13.27 9.58 12.87 9.44Q12.47 9.29 12.27 9.10Q12.06 8.91 11.96 8.56Q11.85 8.20 11.84 7.98Q11.82 7.76 11.82 7.33L11.82 7.33L11.82 5.33Q11.82 4.42 11.69 4.26Q11.56 4.10 10.79 4.10ZM19.14 4.10L18.01 4.10L18.01 3.81Q18.62 3.78 19.03 3.35Q19.43 2.92 19.57 2.38Q19.71 1.85 19.73 1.23L19.73 1.23L20.06 1.23L20.06 3.69L21.97 3.69L21.97 4.10L20.06 4.10L20.06 7.81Q20.06 9.25 20.96 9.25L20.96 9.25Q21.34 9.25 21.60 8.85Q21.85 8.46 21.85 7.76L21.85 7.76L21.85 7.02L22.18 7.02L22.18 7.78Q22.18 8.50 21.85 9.04Q21.52 9.58 20.86 9.58L20.86 9.58Q20.62 9.58 20.38 9.52Q20.14 9.46 19.83 9.30Q19.52 9.14 19.33 8.75Q19.14 8.35 19.14 7.78L19.14 7.78L19.14 4.10Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
@@ -135,10 +193,10 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_pfet"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,340.38261,-349.38172)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
@@ -148,7 +206,7 @@
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
@@ -158,43 +216,43 @@
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,330.68914,-351.98786)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,338.53213999999997,-351.98786)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-389.78386)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-312.30286)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
@@ -204,21 +262,39 @@
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<rect
|
||||
width="25.12366666666667"
|
||||
height="21.343666666666667"
|
||||
style=""
|
||||
x="0.6666666666666661"
|
||||
y="0.6666666666666661"
|
||||
transform="matrix(1,0,0,1,359.0545,-235.27550000000002)"
|
||||
stroke-dasharray="1pt 0pt"
|
||||
stroke-opacity="0"
|
||||
stroke-width="0"
|
||||
stroke="hsl(0 0 85)"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
/>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,0)"
|
||||
style="pointer-events: none;"
|
||||
class=""
|
||||
>
|
||||
<g
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,423.74803149606294,-286.8030669291338)"
|
||||
fill="hsl(0 0 85)"
|
||||
transform="matrix(1,0,0,1,367.0545,-227.27550000000002)"
|
||||
/>
|
||||
<g
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,423.74803149606294,-286.8030669291338)"
|
||||
fill="hsl(0 0 85)"
|
||||
transform="matrix(1,0,0,1,367.0545,-227.27550000000002)"
|
||||
>
|
||||
<path
|
||||
d="M7.39 9L0.44 9L0.44 8.59L0.76 8.59Q1.48 8.59 1.65 8.47Q1.82 8.35 1.82 7.96L1.82 7.96L1.82 0.93Q1.82 0.55 1.65 0.43Q1.48 0.31 0.76 0.31L0.76 0.31L0.44 0.31L0.44-0.11Q0.91-0.07 2.47-0.07L2.47-0.07Q4.23-0.07 4.71-0.11L4.71-0.11L4.71 0.31L4.26 0.31Q3.65 0.31 3.37 0.39Q3.09 0.46 3.05 0.57Q3.00 0.68 3.00 0.95L3.00 0.95L3.00 8.06Q3.00 8.40 3.10 8.50Q3.20 8.59 3.65 8.59L3.65 8.59L4.75 8.59Q5.42 8.59 5.91 8.39Q6.40 8.19 6.66 7.93Q6.92 7.68 7.09 7.20Q7.27 6.72 7.32 6.42Q7.38 6.11 7.43 5.56L7.43 5.56L7.76 5.56L7.39 9ZM9.59 8.28Q8.70 7.41 8.70 6.15Q8.70 4.88 9.57 3.95Q10.43 3.02 11.67 3.02L11.67 3.02Q12.88 3.02 13.75 3.94Q14.62 4.87 14.62 6.15L14.62 6.15Q14.62 7.40 13.74 8.28Q12.86 9.15 11.65 9.15L11.65 9.15Q10.47 9.15 9.59 8.28ZM9.81 6.04L9.81 6.04Q9.81 7.33 10.15 7.92L10.15 7.92Q10.67 8.81 11.67 8.81L11.67 8.81Q12.16 8.81 12.57 8.54Q12.99 8.28 13.22 7.83L13.22 7.83Q13.51 7.24 13.51 6.04L13.51 6.04Q13.51 4.76 13.16 4.19L13.16 4.19Q12.64 3.32 11.65 3.32L11.65 3.32Q11.22 3.32 10.80 3.55Q10.38 3.77 10.13 4.21L10.13 4.21Q9.81 4.80 9.81 6.04ZM15.24 3.67L15.24 3.67L15.24 3.25Q15.96 3.29 16.48 3.29L16.48 3.29Q16.73 3.29 17.94 3.25L17.94 3.25L17.94 3.67Q17.15 3.67 17.15 4.03L17.15 4.03Q17.15 4.10 17.21 4.27L17.21 4.27L18.48 7.83L19.63 4.60Q19.39 3.95 19.32 3.87L19.32 3.87Q19.16 3.67 18.48 3.67L18.48 3.67L18.48 3.25Q19.08 3.29 19.67 3.29L19.67 3.29Q19.90 3.29 21.05 3.25L21.05 3.25L21.05 3.67Q20.27 3.67 20.27 4.03L20.27 4.03Q20.27 4.08 20.33 4.28L20.33 4.28L21.65 8.00L22.86 4.59Q22.93 4.41 22.94 4.31L22.94 4.31Q22.94 4.01 22.73 3.85Q22.52 3.68 22.16 3.67L22.16 3.67L22.16 3.25Q22.92 3.29 23.40 3.29L23.40 3.29Q23.93 3.29 24.38 3.25L24.38 3.25L24.38 3.67Q23.55 3.69 23.26 4.52L23.26 4.52L21.69 8.90Q21.54 9.14 21.43 9.15L21.43 9.15Q21.25 9.15 21.16 8.90L21.16 8.90L19.80 5.11L18.45 8.88Q18.40 9.05 18.35 9.10Q18.31 9.15 18.19 9.15Q18.07 9.15 18.01 9.08Q17.96 9.01 17.90 8.85L17.90 8.85L16.22 4.13Q16.11 3.82 15.93 3.75Q15.76 3.67 15.24 3.67Z"
|
||||
d="M7.39 9.14L0.44 9.14L0.44 8.73L0.76 8.73Q1.48 8.73 1.65 8.61Q1.82 8.49 1.82 8.10L1.82 8.10L1.82 1.07Q1.82 0.69 1.65 0.57Q1.48 0.45 0.76 0.45L0.76 0.45L0.44 0.45L0.44 0.03Q0.91 0.07 2.47 0.07L2.47 0.07Q4.23 0.07 4.71 0.03L4.71 0.03L4.71 0.45L4.26 0.45Q3.65 0.45 3.37 0.53Q3.09 0.61 3.05 0.71Q3.00 0.82 3.00 1.09L3.00 1.09L3.00 8.20Q3.00 8.54 3.10 8.64Q3.20 8.73 3.65 8.73L3.65 8.73L4.75 8.73Q5.42 8.73 5.91 8.53Q6.40 8.33 6.66 8.07Q6.92 7.82 7.09 7.34Q7.27 6.86 7.32 6.56Q7.38 6.25 7.43 5.70L7.43 5.70L7.76 5.70L7.39 9.14ZM9.59 8.42Q8.70 7.55 8.70 6.29Q8.70 5.02 9.57 4.09Q10.43 3.16 11.67 3.16L11.67 3.16Q12.88 3.16 13.75 4.09Q14.62 5.01 14.62 6.29L14.62 6.29Q14.62 7.55 13.74 8.42Q12.86 9.29 11.65 9.29L11.65 9.29Q10.47 9.29 9.59 8.42ZM9.81 6.18L9.81 6.18Q9.81 7.47 10.15 8.06L10.15 8.06Q10.67 8.95 11.67 8.95L11.67 8.95Q12.16 8.95 12.57 8.69Q12.99 8.42 13.22 7.97L13.22 7.97Q13.51 7.38 13.51 6.18L13.51 6.18Q13.51 4.90 13.16 4.33L13.16 4.33Q12.64 3.46 11.65 3.46L11.65 3.46Q11.22 3.46 10.80 3.69Q10.38 3.91 10.13 4.36L10.13 4.36Q9.81 4.94 9.81 6.18ZM15.24 3.81L15.24 3.81L15.24 3.39Q15.96 3.43 16.48 3.43L16.48 3.43Q16.73 3.43 17.94 3.39L17.94 3.39L17.94 3.81Q17.15 3.81 17.15 4.17L17.15 4.17Q17.15 4.24 17.21 4.41L17.21 4.41L18.48 7.97L19.63 4.74Q19.39 4.09 19.32 4.01L19.32 4.01Q19.16 3.81 18.48 3.81L18.48 3.81L18.48 3.39Q19.08 3.43 19.67 3.43L19.67 3.43Q19.90 3.43 21.05 3.39L21.05 3.39L21.05 3.81Q20.27 3.81 20.27 4.17L20.27 4.17Q20.27 4.22 20.33 4.42L20.33 4.42L21.65 8.14L22.86 4.73Q22.93 4.55 22.94 4.45L22.94 4.45Q22.94 4.15 22.73 3.99Q22.52 3.82 22.16 3.81L22.16 3.81L22.16 3.39Q22.92 3.43 23.40 3.43L23.40 3.43Q23.93 3.43 24.38 3.39L24.38 3.39L24.38 3.81Q23.55 3.83 23.26 4.66L23.26 4.66L21.69 9.04Q21.54 9.28 21.43 9.29L21.43 9.29Q21.25 9.29 21.16 9.04L21.16 9.04L19.80 5.25L18.45 9.02Q18.40 9.19 18.35 9.24Q18.31 9.29 18.19 9.29Q18.07 9.29 18.01 9.22Q17.96 9.15 17.90 8.99L17.90 8.99L16.22 4.27Q16.11 3.97 15.93 3.89Q15.76 3.81 15.24 3.81Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
@@ -226,56 +302,56 @@
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-351.98786)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,460.61014,-351.98786)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,385.02013999999997,-351.98786)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<polyline
|
||||
points="377.953,-349.606 462.992,-349.606"
|
||||
points="377.953,-349.606 387.402,-349.606"
|
||||
fill="none"
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_nfet"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,340.38261,-468.24771999999996)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-451.20086000000003)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57113999999996,-470.09886)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
@@ -285,128 +361,151 @@
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_pfet"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,397.07561,-350.13772)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<polyline
|
||||
points="377.953,-289.701 377.953,-290.646"
|
||||
fill="none"
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<polyline
|
||||
points="377.953,-407.055 377.953,-409.512"
|
||||
fill="none"
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,432.2646714960629,-312.3034269291338)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,432.2646714960629,-293.4054269291338)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,340.38236590551173,-290.23216299212595)"
|
||||
class=""
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,395.22514,-322.88586000000004)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,338.53213999999997,-440.99586)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<polyline
|
||||
points="434.6465314960629,-320.12556692913375 434.6465314960629,-309.9215669291338"
|
||||
points="377.9527559055117,-289.70080299212594 377.953,-289.70080299212594 377.953,-290.64561999999995"
|
||||
fill="none"
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,328.346,-444.094)" />
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,328.346,-444.094)">
|
||||
<path
|
||||
d="M0.37 0.31L0.37 0.31L0.37-0.11L2.29-0.25L2.29 3.97Q3.07 3.11 4.12 3.11L4.12 3.11Q5.27 3.11 6.11 3.99Q6.95 4.87 6.95 6.12L6.95 6.12Q6.95 7.39 6.07 8.27Q5.19 9.15 3.97 9.15L3.97 9.15Q2.86 9.15 2.23 8.17L2.23 8.17Q1.76 8.99 1.74 9L1.74 9L1.41 9L1.41 1.05Q1.41 0.56 1.24 0.43Q1.06 0.31 0.37 0.31ZM2.33 4.74L2.33 7.48Q2.33 7.76 2.52 8.04L2.52 8.04Q3.05 8.85 3.91 8.85L3.91 8.85Q3.91 8.85 3.92 8.85L3.92 8.85Q4.85 8.85 5.43 8.00L5.43 8.00Q5.84 7.36 5.84 6.11L5.84 6.11Q5.84 4.87 5.46 4.25L5.46 4.25Q4.92 3.40 4.06 3.40L4.06 3.40Q3.08 3.40 2.48 4.25L2.48 4.25Q2.33 4.47 2.33 4.74L2.33 4.74Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,385.039,-325.984)" />
|
||||
<g fill="var(--text-main, #e0e7f0)" transform="matrix(1,0,0,1,385.039,-325.984)">
|
||||
<path
|
||||
d="M0.37 0.31L0.37 0.31L0.37-0.11L2.29-0.25L2.29 3.97Q3.07 3.11 4.12 3.11L4.12 3.11Q5.27 3.11 6.11 3.99Q6.95 4.87 6.95 6.12L6.95 6.12Q6.95 7.39 6.07 8.27Q5.19 9.15 3.97 9.15L3.97 9.15Q2.86 9.15 2.23 8.17L2.23 8.17Q1.76 8.99 1.74 9L1.74 9L1.41 9L1.41 1.05Q1.41 0.56 1.24 0.43Q1.06 0.31 0.37 0.31ZM2.33 4.74L2.33 7.48Q2.33 7.76 2.52 8.04L2.52 8.04Q3.05 8.85 3.91 8.85L3.91 8.85Q3.91 8.85 3.92 8.85L3.92 8.85Q4.85 8.85 5.43 8.00L5.43 8.00Q5.84 7.36 5.84 6.11L5.84 6.11Q5.84 4.87 5.46 4.25L5.46 4.25Q4.92 3.40 4.06 3.40L4.06 3.40Q3.08 3.40 2.48 4.25L2.48 4.25Q2.33 4.47 2.33 4.74L2.33 4.74Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g class="">
|
||||
<g transform="matrix(1,0,0,1,0,0)" style="pointer-events: none;">
|
||||
<g
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,367.0551181102362,-284.9133858267716)"
|
||||
/>
|
||||
<g
|
||||
fill="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,367.0551181102362,-284.9133858267716)"
|
||||
>
|
||||
<path
|
||||
d="M7.39 9L0.44 9L0.44 8.59L0.76 8.59Q1.48 8.59 1.65 8.47Q1.82 8.35 1.82 7.96L1.82 7.96L1.82 0.93Q1.82 0.55 1.65 0.43Q1.48 0.31 0.76 0.31L0.76 0.31L0.44 0.31L0.44-0.11Q0.91-0.07 2.47-0.07L2.47-0.07Q4.23-0.07 4.71-0.11L4.71-0.11L4.71 0.31L4.26 0.31Q3.65 0.31 3.37 0.39Q3.09 0.46 3.05 0.57Q3.00 0.68 3.00 0.95L3.00 0.95L3.00 8.06Q3.00 8.40 3.10 8.50Q3.20 8.59 3.65 8.59L3.65 8.59L4.75 8.59Q5.42 8.59 5.91 8.39Q6.40 8.19 6.66 7.93Q6.92 7.68 7.09 7.20Q7.27 6.72 7.32 6.42Q7.38 6.11 7.43 5.56L7.43 5.56L7.76 5.56L7.39 9ZM9.59 8.28Q8.70 7.41 8.70 6.15Q8.70 4.88 9.57 3.95Q10.43 3.02 11.67 3.02L11.67 3.02Q12.88 3.02 13.75 3.94Q14.62 4.87 14.62 6.15L14.62 6.15Q14.62 7.40 13.74 8.28Q12.86 9.15 11.65 9.15L11.65 9.15Q10.47 9.15 9.59 8.28ZM9.81 6.04L9.81 6.04Q9.81 7.33 10.15 7.92L10.15 7.92Q10.67 8.81 11.67 8.81L11.67 8.81Q12.16 8.81 12.57 8.54Q12.99 8.28 13.22 7.83L13.22 7.83Q13.51 7.24 13.51 6.04L13.51 6.04Q13.51 4.76 13.16 4.19L13.16 4.19Q12.64 3.32 11.65 3.32L11.65 3.32Q11.22 3.32 10.80 3.55Q10.38 3.77 10.13 4.21L10.13 4.21Q9.81 4.80 9.81 6.04ZM15.24 3.67L15.24 3.67L15.24 3.25Q15.96 3.29 16.48 3.29L16.48 3.29Q16.73 3.29 17.94 3.25L17.94 3.25L17.94 3.67Q17.15 3.67 17.15 4.03L17.15 4.03Q17.15 4.10 17.21 4.27L17.21 4.27L18.48 7.83L19.63 4.60Q19.39 3.95 19.32 3.87L19.32 3.87Q19.16 3.67 18.48 3.67L18.48 3.67L18.48 3.25Q19.08 3.29 19.67 3.29L19.67 3.29Q19.90 3.29 21.05 3.25L21.05 3.25L21.05 3.67Q20.27 3.67 20.27 4.03L20.27 4.03Q20.27 4.08 20.33 4.28L20.33 4.28L21.65 8.00L22.86 4.59Q22.93 4.41 22.94 4.31L22.94 4.31Q22.94 4.01 22.73 3.85Q22.52 3.68 22.16 3.67L22.16 3.67L22.16 3.25Q22.92 3.29 23.40 3.29L23.40 3.29Q23.93 3.29 24.38 3.25L24.38 3.25L24.38 3.67Q23.55 3.69 23.26 4.52L23.26 4.52L21.69 8.90Q21.54 9.14 21.43 9.15L21.43 9.15Q21.25 9.15 21.16 8.90L21.16 8.90L19.80 5.11L18.45 8.88Q18.40 9.05 18.35 9.10Q18.31 9.15 18.19 9.15Q18.07 9.15 18.01 9.08Q17.96 9.01 17.90 8.85L17.90 8.85L16.22 4.13Q16.11 3.82 15.93 3.75Q15.76 3.67 15.24 3.67Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
<polyline
|
||||
points="377.953,-407.05535999999995 377.953,-409.51161999999994"
|
||||
fill="none"
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="none"
|
||||
stroke="var(--text-main, #e0e7f0)"
|
||||
transform="matrix(1,0,0,1,375.5717581102362,-291.5157458267716)"
|
||||
style="color: var(--text-main, #e0e7f0);"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57089590551175,-252.77556078740153)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,375.57089590551175,-233.87792299212595)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,338.5318659055117,-262.980302992126)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<use
|
||||
xlink:href="#node_circ"
|
||||
fill="#fff"
|
||||
stroke="hsl(0 0 85)"
|
||||
style="color: hsl(0 0 85);"
|
||||
transform="matrix(1,0,0,1,338.53211,-440.99586)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<polyline
|
||||
points="377.9527559055117,-260.59844299212597 377.95275590551176,-260.59844299212597 377.95275590551176,-250.39370078740154"
|
||||
fill="none"
|
||||
stroke-dasharray="0.4pt 0pt"
|
||||
stroke-opacity="1"
|
||||
stroke-width="0.5333333333333333"
|
||||
stroke="hsl(0 0 85)"
|
||||
/>
|
||||
</g>
|
||||
<g class="">
|
||||
<rect
|
||||
width="12.83989501312332"
|
||||
height="8.115485564304473"
|
||||
style=""
|
||||
stroke-dasharray="1pt 0pt"
|
||||
stroke-opacity="0"
|
||||
stroke-width="0"
|
||||
stroke="hsl(0 0 85)"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
x="0.666666666666667"
|
||||
y="0.666666666666667"
|
||||
transform="matrix(1,0,0,1,321.25984251968504,-448.81889763779526)"
|
||||
/>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,0)"
|
||||
style="pointer-events: none;"
|
||||
class=""
|
||||
>
|
||||
<g
|
||||
fill="hsl(0 0 85)"
|
||||
transform="matrix(1,0,0,1,328.34645669291336,-444.09448818897636)"
|
||||
/>
|
||||
<g
|
||||
fill="hsl(0 0 85)"
|
||||
transform="matrix(1,0,0,1,328.34645669291336,-444.09448818897636)"
|
||||
>
|
||||
<path
|
||||
d="M0.37 0.60L0.37 0.60L0.37 0.18L2.29 0.04L2.29 4.26Q3.07 3.40 4.12 3.40L4.12 3.40Q5.27 3.40 6.11 4.28Q6.95 5.15 6.95 6.41L6.95 6.41Q6.95 7.68 6.07 8.56Q5.19 9.44 3.97 9.44L3.97 9.44Q2.86 9.44 2.23 8.46L2.23 8.46Q1.76 9.28 1.74 9.29L1.74 9.29L1.41 9.29L1.41 1.34Q1.41 0.84 1.24 0.72Q1.06 0.60 0.37 0.60ZM2.33 5.02L2.33 7.77Q2.33 8.05 2.52 8.33L2.52 8.33Q3.05 9.14 3.91 9.14L3.91 9.14Q3.91 9.14 3.92 9.14L3.92 9.14Q4.85 9.14 5.43 8.29L5.43 8.29Q5.84 7.65 5.84 6.40L5.84 6.40Q5.84 5.16 5.46 4.54L5.46 4.54Q4.92 3.69 4.06 3.69L4.06 3.69Q3.08 3.69 2.48 4.54L2.48 4.54Q2.33 4.76 2.33 5.02L2.33 5.02Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g class="">
|
||||
<rect
|
||||
width="12.839666666666666"
|
||||
height="8.115666666666666"
|
||||
style=""
|
||||
x="0.666666666666667"
|
||||
y="0.666666666666667"
|
||||
transform="matrix(1,0,0,1,321.2600708661417,-269.29142913385823)"
|
||||
stroke-dasharray="1pt 0pt"
|
||||
stroke-opacity="0"
|
||||
stroke-width="0"
|
||||
stroke="hsl(0 0 85)"
|
||||
fill-opacity="1"
|
||||
fill="none"
|
||||
/>
|
||||
<g
|
||||
transform="matrix(1,0,0,1,0,0)"
|
||||
style="pointer-events: none;"
|
||||
class=""
|
||||
>
|
||||
<g
|
||||
fill="hsl(0 0 85)"
|
||||
transform="matrix(1,0,0,1,328.3465708661417,-264.56692913385825)"
|
||||
/>
|
||||
<g
|
||||
fill="hsl(0 0 85)"
|
||||
transform="matrix(1,0,0,1,328.3465708661417,-264.56692913385825)"
|
||||
>
|
||||
<path
|
||||
d="M0.37 0.60L0.37 0.60L0.37 0.18L2.29 0.04L2.29 4.26Q3.07 3.40 4.12 3.40L4.12 3.40Q5.27 3.40 6.11 4.28Q6.95 5.15 6.95 6.41L6.95 6.41Q6.95 7.68 6.07 8.56Q5.19 9.44 3.97 9.44L3.97 9.44Q2.86 9.44 2.23 8.46L2.23 8.46Q1.76 9.28 1.74 9.29L1.74 9.29L1.41 9.29L1.41 1.34Q1.41 0.84 1.24 0.72Q1.06 0.60 0.37 0.60ZM2.33 5.02L2.33 7.77Q2.33 8.05 2.52 8.33L2.52 8.33Q3.05 9.14 3.91 9.14L3.91 9.14Q3.91 9.14 3.92 9.14L3.92 9.14Q4.85 9.14 5.43 8.29L5.43 8.29Q5.84 7.65 5.84 6.40L5.84 6.40Q5.84 5.16 5.46 4.54L5.46 4.54Q4.92 3.69 4.06 3.69L4.06 3.69Q3.08 3.69 2.48 4.54L2.48 4.54Q2.33 4.76 2.33 5.02L2.33 5.02Z"
|
||||
/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
BIN
src/content/portfolio/assets/screenshot.jpg:Zone.Identifier
Normal file
BIN
src/content/portfolio/assets/screenshot.jpg:Zone.Identifier
Normal file
Binary file not shown.
@@ -2,65 +2,10 @@
|
||||
title: Astro Rewrite
|
||||
summary: "Next.js entwickelt sich rasend - zu schnell für mich, um Features und Sicherheitsupdates immer zu verfolgen. Und React für einen Blog? Unnötig. Eine einfache statische Lösung aber mit Komponenten? Astro ist genau das. Also: Willkommen zum neuen Anstrich in Astro!"
|
||||
repository: "https://git.c0ntroller.de/c0ntroller/frontpage"
|
||||
pubDate: 2025-03-22
|
||||
pubDate: 2023-04-03
|
||||
tags:
|
||||
- Astro
|
||||
- SSR
|
||||
- Webentwicklung
|
||||
---
|
||||
|
||||
Next.js war einfach Magie.
|
||||
Als ich React lernte und noch überlegte, wie ich am besten ein Backend dazu stelle, fragete ein Freund, warum ich nicht einfach Next.js nehme.
|
||||
Und das war magisch.
|
||||
Denn ich konnte mein Gelerntes nutzen und hatte trotzdem direkt ein Backend mit dabei.
|
||||
Ich hab mir darin nicht nur ein kleines Projekt gebaut, sondern später auch meine erste Website.
|
||||
|
||||
Die Struktur war einfach: Eine Datei in `app` anlegen und... Moment.
|
||||
Stimmt gar nicht mehr.
|
||||
Also: Eine Datei in `pages` anlegen. Oder doch in `app`?
|
||||
Beides Ok.
|
||||
Achso, außer dass `app` dann deprecated wurde.
|
||||
|
||||
Next.js war für mich die erste Berührung mit dem JavaScript Ökosystem und plötzlich verstand ich die ganzen Memes.
|
||||
Dann kam auch plötzlich die Nachricht vom dependebot und ich hatte plötzlich 20 PRs, die alle Next.js Updates waren.
|
||||
Nur, dass ab irgendeinem Punkt man plötzlich sich mit komplizierteren Updates rumschlagen musste und nicht einfach nur `npm audit fix` machen konnte.
|
||||
|
||||
Also brauchte es eine Alternative.
|
||||
|
||||
## Sinneswandel
|
||||
|
||||
React ist cool.
|
||||
Ziemlich performant für das, was es macht, sehr flexibel und einmal gelernt kann man auch andere Frameworks leicht lernen.
|
||||
|
||||
Aber wofür braucht eine Homepage eine komplexe reaktive Komponente?
|
||||
Naja, eigentlich braucht sie das nicht.
|
||||
Aber es war an dem Punkt für mich die einzige Möglichkeit absiets von Vanilla HTML5, CSS und JS zu arbeiten.
|
||||
|
||||
Gleichzeitig merkte ich bei immer mehr Seiten, dass hier Unmengen an Rechenleistung in JavaScript nur für hübsche Effekte drauf ging.
|
||||
Ich bin sehr für schöne Effekte, aber immer mehr fand ich, dass man als **guter** Web Entwickler eigentlich so wenig JavaScript wie möglich einsetzen sollte.
|
||||
JavaScript Frameworks sind im Normalfall aber das genaue Gegenteil.
|
||||
|
||||
Ich wollte meine Seite also neu machen und hatte eien Vision, die nicht ganz erreichbar erschien.
|
||||
Und dann fand ich ein Framework, dass eigentlich genau das war, was ich suchte: Astro.
|
||||
|
||||
## Astro
|
||||
|
||||
Astro zeichnet sich dadurch aus, dass es komplett statische Seiten generiert.
|
||||
Falls man das braucht, kann man aber auch Server Side Rendering nutzen, oder sogar beides gleichzeitig.
|
||||
Islands gibt es sogar für die verschiedensten Frameworks.
|
||||
|
||||
Aber all das brauchte ich gar nicht.
|
||||
Eine cleane modulare Webseite aufbauen, mit verschachtelten Komponenten, scoped CSS und ohne JavaScript, dass man nicht selbst schreibt.
|
||||
Das war genau das, was ich suchte.
|
||||
|
||||
Und so habe ich mich an die Arbeit gemacht, meine Seite neu zu bauen.
|
||||
Und gebaut.
|
||||
Und gebaut.
|
||||
Und gebaut...
|
||||
|
||||
Tja ich fing an zu arbeiten und plötzlich war da gar nicht mehr so viel Zeit.
|
||||
|
||||
Aber nach wirklich langer Zeit und viel Arbeit ist es jetzt endlich soweit - die neue Seite ist hübsch, sehr schnell, hat vollen Score bei Lighthouse und ist komplett in Astro gebaut.
|
||||
Ich bin sehr zufrieden damit.
|
||||
|
||||
Vielleicht kommt irgendwann ja nochmal wieder ein Terminal dazu, dass ich früher als Webseite hatte.
|
||||
Aber vorerst genieße ich es erstmal wieder eine eine hübsche und schnelle Seite zu haben.
|
||||
|
||||
@@ -20,7 +20,6 @@ const {
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<meta name="description" content={description} />
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||
|
||||
@@ -15,10 +15,10 @@ const { entry } = Astro.props;
|
||||
const { Content } = await render(entry);
|
||||
---
|
||||
<BaseLayout title={entry.data.title} theme="blog">
|
||||
<div class="glass-container header" style={`view-transition-name: blog-header-${entry.id};`}>
|
||||
<h1 style={`view-transition-name: blog-headline-${entry.id};`}>{entry.data.title}</h1>
|
||||
<div class="glass-container header">
|
||||
<h1>{entry.data.title}</h1>
|
||||
<div class="meta">
|
||||
<time style={`view-transition-name: blog-pubdate-${entry.id};`}>{entry.data.pubDate.toLocaleDateString("de-DE")}</time>
|
||||
<time>{entry.data.pubDate.toLocaleDateString()}</time>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -6,16 +6,16 @@ const posts = await getCollection('blog');
|
||||
posts.sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
|
||||
---
|
||||
<BaseLayout title="Blog" theme="blog" description="Gedanken über Technologie, Design und das Leben von c0ntroller.de.">
|
||||
<div class="glass-container header" style="view-transition-name:main-glass;">
|
||||
<div class="glass-container header">
|
||||
<h1>Artikel & Gedanken</h1>
|
||||
<p>Gedanken über Technologie, Design und das Leben.</p>
|
||||
</div>
|
||||
|
||||
<div class="list">
|
||||
{posts.map(post => (
|
||||
<a href={`/blog/${post.id}`} class="glass-container link-card" style={`view-transition-name: blog-header-${post.id};`}>
|
||||
<h2 style={`view-transition-name: blog-headline-${post.id};`}>{post.data.title}</h2>
|
||||
<time class="date" style={`view-transition-name: blog-pubdate-${post.id};`}>{post.data.pubDate.toLocaleDateString("de-DE")}</time>
|
||||
<a href={`/blog/${post.id}`} class="glass-container link-card">
|
||||
<h2>{post.data.title}</h2>
|
||||
<p class="date">{post.data.pubDate.toLocaleDateString()}</p>
|
||||
<p>{post.data.summary}</p>
|
||||
</a>
|
||||
))}
|
||||
|
||||
@@ -34,8 +34,8 @@ const chapters = allPages.reduce((acc, p) => {
|
||||
}, {} as Record<string, typeof allPages>);
|
||||
---
|
||||
<BaseLayout title={page.data.title} theme="book">
|
||||
<div class="glass-container content prose" style="view-transition-name:main-glass;">
|
||||
<h1 style={`view-transition-name: book-headline-${page.id.replaceAll("/", "-")};`}>{page.data.title}</h1>
|
||||
<div class="glass-container content prose">
|
||||
<h1>{page.data.title}</h1>
|
||||
<Content />
|
||||
</div>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ const chapters = pages.reduce((acc, page) => {
|
||||
}, {} as Record<string, typeof pages>);
|
||||
---
|
||||
<BaseLayout title="Das Buch" theme="book" description="Ein fortlaufendes Werk über Software, Design und Architektur von c0ntroller.de.">
|
||||
<div class="glass-container header" style="view-transition-name:main-glass;">
|
||||
<div class="glass-container header">
|
||||
<h1>Das Buch</h1>
|
||||
<p>Ein fortlaufendes Werk über Software, Design und Architektur.</p>
|
||||
</div>
|
||||
@@ -25,7 +25,7 @@ const chapters = pages.reduce((acc, page) => {
|
||||
<h3>{chapter.replace(/-/g, ' ').toUpperCase()}</h3>
|
||||
<ul class="page-list">
|
||||
{items.map(item => (
|
||||
<li><a href={`/book/${item.id}`} style={`view-transition-name: book-headline-${item.id.replaceAll("/", "-")};`}>{item.data.title}</a></li>
|
||||
<li><a href={`/book/${item.id}`}>{item.data.title}</a></li>
|
||||
))}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -1,24 +1,23 @@
|
||||
---
|
||||
import WelcomeTypewriter from "../components/WelcomeTypewriter.astro";
|
||||
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||
import { Icon } from "astro-icon/components";
|
||||
import WelcomeTypewriter from '../components/WelcomeTypewriter.astro';
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
import { Icon } from 'astro-icon/components';
|
||||
import socials from "../data/socials.json";
|
||||
---
|
||||
|
||||
<BaseLayout title="c0ntroller.de" theme="default">
|
||||
<div class="landing-wrapper">
|
||||
<div class="hero-section">
|
||||
<div class="socials fade-in-up shadow-glow glass-bg glass-container">
|
||||
{
|
||||
socials.map(({ name, url, icon }) => (
|
||||
<a href={url} target="_blank" referrerpolicy="no-referrer" class="social-link">
|
||||
<Icon name={icon} desc={name} />
|
||||
</a>
|
||||
))
|
||||
}
|
||||
{socials.map(({ name, url, icon }) => (
|
||||
<a href={url} target="_blank" rel="noreferrer" class="social-link">
|
||||
<Icon name={icon} desc={name} />
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
<h1 class="gradient-text reveal-text">Willkommen auf meiner Seite.</h1>
|
||||
<p class="subtitle fade-in-up">Hier geht es unter anderem um:</p>
|
||||
<p class="subtitle fade-in-up">
|
||||
Hier geht es unter anderem um:
|
||||
</p>
|
||||
<WelcomeTypewriter class="fade-in-up" />
|
||||
</div>
|
||||
|
||||
@@ -83,7 +82,7 @@ import socials from "../data/socials.json";
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
gap: 0.5rem;
|
||||
gap: .5rem;
|
||||
margin: 0 auto 2rem auto;
|
||||
padding: 0.5rem 1rem;
|
||||
backdrop-filter: blur(24px);
|
||||
@@ -93,9 +92,7 @@ import socials from "../data/socials.json";
|
||||
.social-link {
|
||||
color: rgb(var(--accent-base));
|
||||
font-size: 2rem;
|
||||
height: 2rem;
|
||||
line-height: 1;
|
||||
margin: 0.25rem 0.5rem;
|
||||
margin: 0 0.5rem;
|
||||
filter: drop-shadow(0px 0px 5px transparent);
|
||||
transition: filter 0.5s ease;
|
||||
}
|
||||
@@ -119,19 +116,10 @@ import socials from "../data/socials.json";
|
||||
max-width: 1000px;
|
||||
}
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.landing-wrapper {
|
||||
padding: 0;
|
||||
margin-top: -1rem;
|
||||
}
|
||||
|
||||
@media (max-width: 800px) {
|
||||
.bento-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.hero-section {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
.bento-card {
|
||||
@@ -189,57 +177,21 @@ import socials from "../data/socials.json";
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.portfolio {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(var(--accent-base--portfolio), 0.5) 0%,
|
||||
rgba(var(--accent-base--portfolio), 0.15) 100%
|
||||
);
|
||||
}
|
||||
.blog {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(var(--accent-base--blog), 0.8) 0%,
|
||||
rgba(var(--accent-base--blog), 0.15) 100%
|
||||
);
|
||||
}
|
||||
.book {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(var(--accent-base--book), 0.8) 0%,
|
||||
rgba(var(--accent-base--book), 0.15) 100%
|
||||
);
|
||||
}
|
||||
.portfolio { background: linear-gradient(135deg, rgba(var(--accent-base--portfolio), 0.5) 0%, rgba(var(--accent-base--portfolio), 0.15) 100%); }
|
||||
.blog { background: linear-gradient(135deg, rgba(var(--accent-base--blog), 0.8) 0%, rgba(var(--accent-base--blog), 0.15) 100%); }
|
||||
.book { background: linear-gradient(135deg, rgba(var(--accent-base--book), 0.8) 0%, rgba(var(--accent-base--book), 0.15) 100%); }
|
||||
|
||||
.portfolio:hover {
|
||||
box-shadow: 0 10px 40px -10px rgba(var(--accent-base--portfolio), 1);
|
||||
}
|
||||
.blog:hover {
|
||||
box-shadow: 0 10px 40px -10px rgba(var(--accent-base--blog), 0.4);
|
||||
}
|
||||
.book:hover {
|
||||
box-shadow: 0 10px 40px -10px rgba(var(--accent-base--book), 0.4);
|
||||
}
|
||||
.portfolio:hover { box-shadow: 0 10px 40px -10px rgba(var(--accent-base--portfolio), 1); }
|
||||
.blog:hover { box-shadow: 0 10px 40px -10px rgba(var(--accent-base--blog), 0.4); }
|
||||
.book:hover { box-shadow: 0 10px 40px -10px rgba(var(--accent-base--book), 0.4); }
|
||||
|
||||
.portfolio .icon {
|
||||
color: rgb(var(--accent-base--portfolio));
|
||||
}
|
||||
.blog .icon {
|
||||
color: rgb(var(--accent-base--blog));
|
||||
}
|
||||
.book .icon {
|
||||
color: rgb(var(--accent-base--book));
|
||||
}
|
||||
.portfolio .icon { color: rgb(var(--accent-base--portfolio)); }
|
||||
.blog .icon { color: rgb(var(--accent-base--blog)); }
|
||||
.book .icon { color: rgb(var(--accent-base--book)); }
|
||||
|
||||
@keyframes fadeUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
from { opacity: 0; transform: translateY(30px); }
|
||||
to { opacity: 1; transform: translateY(0); }
|
||||
}
|
||||
|
||||
.reveal-text {
|
||||
@@ -257,20 +209,12 @@ import socials from "../data/socials.json";
|
||||
animation: fadeUp 0.8s ease-out forwards;
|
||||
opacity: 0;
|
||||
}
|
||||
.portfolio {
|
||||
animation-delay: 0.4s;
|
||||
}
|
||||
.blog {
|
||||
animation-delay: 0.6s;
|
||||
}
|
||||
.book {
|
||||
animation-delay: 0.8s;
|
||||
}
|
||||
.portfolio { animation-delay: 0.4s; }
|
||||
.blog { animation-delay: 0.6s; }
|
||||
.book { animation-delay: 0.8s; }
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.bento-card,
|
||||
.fade-in-up,
|
||||
.reveal-text {
|
||||
.bento-card, .fade-in-up, .reveal-text {
|
||||
animation: none;
|
||||
opacity: 1;
|
||||
transform: none;
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
---
|
||||
import { getCollection, render } from 'astro:content';
|
||||
import { Icon } from "astro-icon/components";
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
import "katex/dist/katex.min.css";
|
||||
import "rehype-callouts/theme/obsidian"
|
||||
@@ -16,26 +15,14 @@ const { entry } = Astro.props;
|
||||
const { Content } = await render(entry);
|
||||
---
|
||||
<BaseLayout title={entry.data.title} theme="portfolio">
|
||||
<div class="glass-container header" style={`view-transition-name: project-header-${entry.id};`}>
|
||||
<h1 style={`view-transition-name: project-headline-${entry.id};`}>{entry.data.title}</h1>
|
||||
<div class="glass-container header">
|
||||
<h1>{entry.data.title}</h1>
|
||||
<p>{entry.data.summary}</p>
|
||||
{(entry.data.tags || entry.data.repository) &&
|
||||
(<div class="additional-meta">
|
||||
<div class="meta-tags">
|
||||
{entry.data.tags && (
|
||||
<div class="tags">
|
||||
{entry.data.tags?.map(tech => <span class="tag">{tech}</span>)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
<div class="meta-repository">
|
||||
{ entry.data.repository && (
|
||||
<a href={entry.data.repository} referrerpolicy="no-referrer">
|
||||
<Icon name="simple-icons:git" style={`view-transition-name: project-git-${entry.id};`} />
|
||||
</a>
|
||||
)}
|
||||
</div>
|
||||
</div>)}
|
||||
{entry.data.tags && (
|
||||
<div class="tags">
|
||||
{entry.data.tags.map(tech => <span class="tag">{tech}</span>)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div class="glass-container content prose">
|
||||
@@ -52,7 +39,6 @@ const { Content } = await render(entry);
|
||||
gap: 0.5rem;
|
||||
margin-top: 1rem;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
}
|
||||
.tag {
|
||||
font-size: 0.8rem;
|
||||
@@ -63,23 +49,4 @@ const { Content } = await render(entry);
|
||||
.content {
|
||||
line-height: 1.8;
|
||||
}
|
||||
.additional-meta {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
gap: 0.5rem;
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
margin-top: 1rem;
|
||||
align-items: center;
|
||||
}
|
||||
.meta-repository {
|
||||
flex-shrink: 1;
|
||||
font-size: 1.2rem;
|
||||
color: rgb(var(--accent-base));
|
||||
}
|
||||
.meta-repository a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,37 +1,26 @@
|
||||
---
|
||||
import { getCollection } from 'astro:content';
|
||||
import { Icon } from "astro-icon/components";
|
||||
import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||
|
||||
const projects = await getCollection('portfolio');
|
||||
projects.sort((a, b) => b.data.pubDate.getTime() - a.data.pubDate.getTime());
|
||||
---
|
||||
<BaseLayout title="Portfolio" theme="portfolio" description="Eine Auswahl aktueller Projekte und Experimente von c0ntroller.de.">
|
||||
<div class="glass-container" style="view-transition-name:main-glass;">
|
||||
<div class="glass-container">
|
||||
<h1>Meine Arbeiten</h1>
|
||||
<p>Eine Auswahl aktueller Projekte und Experimente.</p>
|
||||
</div>
|
||||
|
||||
<div class="grid">
|
||||
{projects.map(project => (
|
||||
<a href={`/portfolio/${project.id}`} class="glass-container link-card" style={`view-transition-name: project-header-${project.id};`}>
|
||||
<h2 style={`view-transition-name: project-headline-${project.id};`}>{project.data.title}</h2>
|
||||
<a href={`/portfolio/${project.id}`} class="glass-container link-card">
|
||||
<h2>{project.data.title}</h2>
|
||||
<p>{project.data.summary}</p>
|
||||
{(project.data.tags || project.data.repository) &&
|
||||
(<div class="additional-meta">
|
||||
<div class="meta-tags">
|
||||
{project.data.tags && (
|
||||
<div class="tags">
|
||||
{project.data.tags?.map(tech => <span class="tag">{tech}</span>)}
|
||||
</div>
|
||||
)}
|
||||
{project.data.tags && (
|
||||
<div class="tags">
|
||||
{project.data.tags?.map(tech => <span class="tag">{tech}</span>)}
|
||||
</div>
|
||||
<div class="meta-repository">
|
||||
{ project.data.repository && (
|
||||
<Icon name="simple-icons:git" style={`view-transition-name: project-git-${project.id};`} />
|
||||
)}
|
||||
</div>
|
||||
</div>)}
|
||||
)}
|
||||
</a>
|
||||
))}
|
||||
</div>
|
||||
@@ -51,22 +40,11 @@ projects.sort((a, b) => b.data.pubDate.getTime() - a.data.pubDate.getTime());
|
||||
.link-card h2 {
|
||||
margin-top: 0;
|
||||
}
|
||||
.additional-meta {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: nowrap;
|
||||
gap: 0.5rem;
|
||||
width: 100%;
|
||||
justify-content: space-between;
|
||||
margin-top: 1rem;
|
||||
align-items: center;
|
||||
}
|
||||
.tags {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
margin-top: 1rem;
|
||||
flex-wrap: wrap;
|
||||
flex-grow: 1;
|
||||
align-items: center;
|
||||
}
|
||||
.tag {
|
||||
font-size: 0.8rem;
|
||||
@@ -74,11 +52,4 @@ projects.sort((a, b) => b.data.pubDate.getTime() - a.data.pubDate.getTime());
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
.meta-repository {
|
||||
flex-shrink: 1;
|
||||
font-size: 1.2rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: rgb(var(--accent-base));
|
||||
}
|
||||
</style>
|
||||
|
||||
22
src/remark-modified-time.mjs
Normal file
22
src/remark-modified-time.mjs
Normal file
@@ -0,0 +1,22 @@
|
||||
import { execSync } from "child_process";
|
||||
import { statSync } from "fs";
|
||||
|
||||
export function remarkModifiedTime() {
|
||||
return function (tree, file) {
|
||||
const filepath = file.history[0];
|
||||
try {
|
||||
const result = execSync(`git log -1 --pretty="format:%cI" "${filepath}"`);
|
||||
// If result is empty or undefined, fallback to fs stat
|
||||
if (!result || !result.toString().trim()) {
|
||||
throw new Error("No git history");
|
||||
}
|
||||
file.data.astro.frontmatter.lastModified = result.toString();
|
||||
return;
|
||||
} catch (e) {
|
||||
// Ignore, fallback to fs stat
|
||||
const result = statSync(filepath);
|
||||
file.data.astro.frontmatter.lastModified = result.mtime.toISOString();
|
||||
return;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -1,14 +1,9 @@
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
*, *::before, *::after {
|
||||
box-sizing: border-box;
|
||||
transition: color .4s ease, background-color .4s ease, border-color .4s ease, box-shadow .4s ease;
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: no-preference) {
|
||||
@view-transition {
|
||||
navigation: auto;
|
||||
}
|
||||
@view-transition {
|
||||
navigation: auto;
|
||||
}
|
||||
|
||||
::view-transition-group(root) {
|
||||
@@ -20,79 +15,66 @@
|
||||
inherits: true;
|
||||
initial-value: 214, 134, 249;
|
||||
}
|
||||
|
||||
@property --bg-image {
|
||||
syntax: '<image>';
|
||||
inherits: true;
|
||||
initial-value: url('../assets/backgrounds/bubble.svg');
|
||||
}
|
||||
|
||||
@property --bg-image-static {
|
||||
syntax: '<image>';
|
||||
inherits: true;
|
||||
initial-value: url('../assets/backgrounds/bubble-static.svg');
|
||||
}
|
||||
|
||||
@property --glass-bg {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: rgba(20, 25, 35, 0.4);
|
||||
}
|
||||
|
||||
@property --glass-border {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: rgba(255, 255, 255, 0.08);
|
||||
}
|
||||
|
||||
@property --glass-blur {
|
||||
syntax: '<length>';
|
||||
inherits: true;
|
||||
initial-value: 16px;
|
||||
}
|
||||
|
||||
@property --glass-shadow {
|
||||
syntax: '<shadow>';
|
||||
inherits: true;
|
||||
initial-value: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
|
||||
}
|
||||
|
||||
@property --text-main {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: #e0e7f0;
|
||||
}
|
||||
|
||||
@property --text-muted {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: #92a1b6;
|
||||
}
|
||||
|
||||
@property --bg-color {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: #0d0117;
|
||||
}
|
||||
|
||||
@property --accent-base--default {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: 214, 134, 249;
|
||||
}
|
||||
|
||||
@property --accent-base--portfolio {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: 255, 181, 102;
|
||||
}
|
||||
|
||||
@property --accent-base--blog {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
initial-value: 111, 221, 246;
|
||||
}
|
||||
|
||||
@property --accent-base--book {
|
||||
syntax: '<color>';
|
||||
inherits: true;
|
||||
@@ -140,25 +122,6 @@ body[data-theme="book"] {
|
||||
--bg-image-static: url('../assets/backgrounds/curve-ripple-static.svg');
|
||||
}
|
||||
|
||||
body:has(nav a[href="/"]:hover) {
|
||||
--accent-base: var(--accent-base--default);
|
||||
}
|
||||
|
||||
body:has(nav a[href="/portfolio"]:hover),
|
||||
body:has(.portfolio:hover) {
|
||||
--accent-base: var(--accent-base--portfolio);
|
||||
}
|
||||
|
||||
body:has(nav a[href="/blog"]:hover),
|
||||
body:has(.blog:hover) {
|
||||
--accent-base: var(--accent-base--blog);
|
||||
}
|
||||
|
||||
body:has(nav a[href="/book"]:hover),
|
||||
body:has(.book:hover) {
|
||||
--accent-base: var(--accent-base--book);
|
||||
}
|
||||
|
||||
html {
|
||||
background-color: var(--bg-color);
|
||||
}
|
||||
@@ -184,12 +147,7 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: rgb(var(--accent-base));
|
||||
font-weight: 600;
|
||||
margin-top: 2rem;
|
||||
@@ -251,24 +209,13 @@ a:hover {
|
||||
}
|
||||
|
||||
/* Mobile Responsiveness */
|
||||
@media (max-width: 500px) {
|
||||
@media (max-width: 600px) {
|
||||
.container {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.glass-container {
|
||||
padding: 1.25rem;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
h1 { font-size: 1.75rem; }
|
||||
h2 { font-size: 1.5rem; }
|
||||
}
|
||||
Reference in New Issue
Block a user