Vibecoded CI/CD
Some checks failed
Build and Deploy Lean / build (push) Failing after 16m44s
Build and Deploy Nuxt / build (push) Failing after 48s

This commit is contained in:
2026-10-06 00:23:17 +02:00
parent a57770619e
commit e2c2c66d7f
79 changed files with 6044 additions and 47 deletions

View File

@@ -0,0 +1,65 @@
/* The window's own habits.
These are the two things the wiki does differently once it is a desktop app
rather than a page of the web — see utils/desktop.ts for the asking, and
src-tauri/ for the shell. The web build takes the first line and returns:
nothing here changes how a browser sees the wiki.
Runs after the auth plugin (plugins come in name order), which matters: by
now a signed-in person's account has already had its say about the interface
language, and an account outranks this device. */
import { isDesktop, leadsOutward, openExternal, storeGet, storeSet } from '~/utils/desktop'
/** Where a window keeps the interface language it was last shown. Also the
* name of the cookie the web build writes it to — the same choice, remembered
* the way this kind of host can be sure of remembering it. */
const LOCALE_KEY = 'mathew-locale'
export default defineNuxtPlugin(() => {
if (!import.meta.client || !isDesktop()) return
/* Links. The wiki's own addresses are relative and the router turns them as
it always does; an absolute one is about something outside this window —
and a window has one page, no tab strip, no back button a reader would
trust after the wiki had been replaced by some other site's document. So
those go out to the system's browser instead, and the window keeps
showing the wiki it was asked to show.
Captured on the way in, so it also catches the links drawn from article
Markdown — the rendered text belongs to the article, which has no reason
to know it is not in a browser. */
document.addEventListener(
'click',
(event) => {
if (event.defaultPrevented || event.button !== 0) return
// a modified click is the reader asking for the browser's own gesture
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return
const target = event.target as Element | null
const href = target?.closest?.('a')?.getAttribute('href')
if (!href || !leadsOutward(href)) return
event.preventDefault()
void openExternal(href)
},
true,
)
/* The interface language, kept where a window can be certain of keeping it.
On the web the choice rides on the `mathew-locale` cookie, which the server
reads so the first draw already speaks it. A window draws nothing on a
server, and its own address — `tauri://localhost` — is one a webview is
not everywhere obliged to keep cookies for, so the choice is mirrored into
localStorage: a lost cookie costs a language switch at the next start, and
that is all.
An account's own choice outranks the mirror, as it outranks the cookie —
hence the guard, the auth plugin having run first. Whatever the UI ends up
speaking is then written back, so the mirror always says what this window
last showed. */
const { locale, choose } = useAppLocale()
const { user } = useAuth()
const remembered = storeGet(LOCALE_KEY)
if (remembered && !user.value?.locale) void choose(remembered)
watch(locale, (code) => storeSet(LOCALE_KEY, code))
})