aboutsummaryrefslogtreecommitdiffstats
path: root/frontend-vanilla/src
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-15 17:30:34 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-15 17:30:34 -0800
commit90c1a68d6478138f538094fc83e48da8ddd21fa0 (patch)
tree90c5e03ec49bb0790ca849f6dac09786cd93bce3 /frontend-vanilla/src
parent7ceec2469ecb047ed8f9c8e2149323d8500773e2 (diff)
downloadneko-90c1a68d6478138f538094fc83e48da8ddd21fa0.tar.gz
neko-90c1a68d6478138f538094fc83e48da8ddd21fa0.tar.bz2
neko-90c1a68d6478138f538094fc83e48da8ddd21fa0.zip
Scaffold Vanilla JS Frontend (v3): Create directory, update Makefile/web.go, embed dist/v3
Diffstat (limited to 'frontend-vanilla/src')
-rw-r--r--frontend-vanilla/src/counter.ts9
-rw-r--r--frontend-vanilla/src/main.ts24
-rw-r--r--frontend-vanilla/src/style.css96
-rw-r--r--frontend-vanilla/src/typescript.svg1
4 files changed, 130 insertions, 0 deletions
diff --git a/frontend-vanilla/src/counter.ts b/frontend-vanilla/src/counter.ts
new file mode 100644
index 0000000..09e5afd
--- /dev/null
+++ b/frontend-vanilla/src/counter.ts
@@ -0,0 +1,9 @@
+export function setupCounter(element: HTMLButtonElement) {
+ let counter = 0
+ const setCounter = (count: number) => {
+ counter = count
+ element.innerHTML = `count is ${counter}`
+ }
+ element.addEventListener('click', () => setCounter(counter + 1))
+ setCounter(0)
+}
diff --git a/frontend-vanilla/src/main.ts b/frontend-vanilla/src/main.ts
new file mode 100644
index 0000000..6396b50
--- /dev/null
+++ b/frontend-vanilla/src/main.ts
@@ -0,0 +1,24 @@
+import './style.css'
+import typescriptLogo from './typescript.svg'
+import viteLogo from '/vite.svg'
+import { setupCounter } from './counter.ts'
+
+document.querySelector<HTMLDivElement>('#app')!.innerHTML = `
+ <div>
+ <a href="https://vite.dev" target="_blank">
+ <img src="${viteLogo}" class="logo" alt="Vite logo" />
+ </a>
+ <a href="https://www.typescriptlang.org/" target="_blank">
+ <img src="${typescriptLogo}" class="logo vanilla" alt="TypeScript logo" />
+ </a>
+ <h1>Vite + TypeScript</h1>
+ <div class="card">
+ <button id="counter" type="button"></button>
+ </div>
+ <p class="read-the-docs">
+ Click on the Vite and TypeScript logos to learn more
+ </p>
+ </div>
+`
+
+setupCounter(document.querySelector<HTMLButtonElement>('#counter')!)
diff --git a/frontend-vanilla/src/style.css b/frontend-vanilla/src/style.css
new file mode 100644
index 0000000..3bcdbd0
--- /dev/null
+++ b/frontend-vanilla/src/style.css
@@ -0,0 +1,96 @@
+:root {
+ font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
+ line-height: 1.5;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+a {
+ font-weight: 500;
+ color: #646cff;
+ text-decoration: inherit;
+}
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ display: flex;
+ place-items: center;
+ min-width: 320px;
+ min-height: 100vh;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+#app {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
+
+.logo {
+ height: 6em;
+ padding: 1.5em;
+ will-change: filter;
+ transition: filter 300ms;
+}
+.logo:hover {
+ filter: drop-shadow(0 0 2em #646cffaa);
+}
+.logo.vanilla:hover {
+ filter: drop-shadow(0 0 2em #3178c6aa);
+}
+
+.card {
+ padding: 2em;
+}
+
+.read-the-docs {
+ color: #888;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: border-color 0.25s;
+}
+button:hover {
+ border-color: #646cff;
+}
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+ a:hover {
+ color: #747bff;
+ }
+ button {
+ background-color: #f9f9f9;
+ }
+}
diff --git a/frontend-vanilla/src/typescript.svg b/frontend-vanilla/src/typescript.svg
new file mode 100644
index 0000000..d91c910
--- /dev/null
+++ b/frontend-vanilla/src/typescript.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="32" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 256"><path fill="#007ACC" d="M0 128v128h256V0H0z"></path><path fill="#FFF" d="m56.612 128.85l-.081 10.483h33.32v94.68h23.568v-94.68h33.321v-10.28c0-5.69-.122-10.444-.284-10.566c-.122-.162-20.4-.244-44.983-.203l-44.74.122l-.121 10.443Zm149.955-10.742c6.501 1.625 11.459 4.51 16.01 9.224c2.357 2.52 5.851 7.111 6.136 8.208c.08.325-11.053 7.802-17.798 11.988c-.244.162-1.22-.894-2.317-2.52c-3.291-4.795-6.745-6.867-12.028-7.233c-7.76-.528-12.759 3.535-12.718 10.321c0 1.992.284 3.17 1.097 4.795c1.707 3.536 4.876 5.649 14.832 9.956c18.326 7.883 26.168 13.084 31.045 20.48c5.445 8.249 6.664 21.415 2.966 31.208c-4.063 10.646-14.14 17.879-28.323 20.276c-4.388.772-14.79.65-19.504-.203c-10.28-1.828-20.033-6.908-26.047-13.572c-2.357-2.6-6.949-9.387-6.664-9.874c.122-.163 1.178-.813 2.356-1.504c1.138-.65 5.446-3.129 9.509-5.485l7.355-4.267l1.544 2.276c2.154 3.29 6.867 7.801 9.712 9.305c8.167 4.307 19.383 3.698 24.909-1.26c2.357-2.153 3.332-4.388 3.332-7.68c0-2.966-.366-4.266-1.91-6.501c-1.99-2.845-6.054-5.242-17.595-10.24c-13.206-5.69-18.895-9.224-24.096-14.832c-3.007-3.25-5.852-8.452-7.03-12.8c-.975-3.617-1.22-12.678-.447-16.335c2.723-12.76 12.353-21.659 26.25-24.3c4.51-.853 14.994-.528 19.424.569Z"></path></svg> \ No newline at end of file