From b54c89c9c47e74afd91329c431cfbfa54fcfc5d2 Mon Sep 17 00:00:00 2001 From: Brian Kirkpatrick Date: Wed, 4 Mar 2026 11:13:15 -0800 Subject: [PATCH] first draft but not working yet --- README.md | 43 +++++++++++++ components/app-root.js | 46 +++++++++++++ components/nav-bar.js | 64 ++++++++++++++++++ components/page-home.js | 44 +++++++++++++ components/page-items.js | 111 ++++++++++++++++++++++++++++++++ controllers/store.js | 23 +++++++ importmap.json | 9 +++ index.html | 14 ++++ store/index.js | 18 ++++++ store/middleware/persistance.js | 8 +++ 10 files changed, 380 insertions(+) create mode 100644 README.md create mode 100644 components/app-root.js create mode 100644 components/nav-bar.js create mode 100644 components/page-home.js create mode 100644 components/page-items.js create mode 100644 controllers/store.js create mode 100644 importmap.json create mode 100644 index.html create mode 100644 store/index.js create mode 100644 store/middleware/persistance.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..f97c3b8 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +## Architecture + +* Lit-based web components + +* No-build tooling (importmap only) + +* Zustand-moderated state management with IndexedDB storage mechanism + +## Layout + +``` +src/ + store/ + index.js ← zustand store definition + middleware/ + persistence.js ← idb-keyval persist adapter + sync.js ← optional cross-tab broadcast + components/ + app-root.js + feature-a/ + feature-a.js ← Lit component + feature-a.css ← adopted stylesheet or constructable + controllers/ + fetch.js ← ReactiveController for API calls + 3d.js ← optional Three/WebGPU controller + lib/ + idb.js ← thin idb-keyval wrapper/schema +index.html +importmap.json ← extracted importmap (referenced via + + + + + + + \ No newline at end of file diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..b9a71ea --- /dev/null +++ b/store/index.js @@ -0,0 +1,18 @@ +import { createStore } from 'zustand/vanilla' +import { persist } from 'zustand/middleware' +import { idbStorage } from './middleware/persistence.js' + +export const store = createStore( + persist( + (set, get) => ({ + user: null, + items: [], + setUser: (user) => set({ user }), + addItem: (item) => set(s => ({ items: [...s.items, item] })), + }), + { + name: 'app-store', + storage: idbStorage, // custom adapter (see below) + } + ) +) \ No newline at end of file diff --git a/store/middleware/persistance.js b/store/middleware/persistance.js new file mode 100644 index 0000000..ab68ec4 --- /dev/null +++ b/store/middleware/persistance.js @@ -0,0 +1,8 @@ +import { get, set, del } from 'idb-keyval' +import { createJSONStorage } from 'zustand/middleware' + +export const idbStorage = createJSONStorage(() => ({ + getItem: (name) => get(name), + setItem: (name, value) => set(name, value), + removeItem: (name) => del(name), +})) \ No newline at end of file