fix(brand): capitalize "Punktfunk" in user-facing text; name the legal copyright holder #81

Merged
enricobuehler merged 2 commits from worktree-docs-title-casing into main 2026-08-06 21:33:39 +00:00
39 changed files with 53 additions and 53 deletions
+1 -1
View File
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 unom
Copyright 2026 unom - Enrico Bühler
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2026 unom
Copyright (c) 2026 unom - Enrico Bühler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+1 -1
View File
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates listed
below. Each is distributed under its own permissive license; the full license texts
follow the manifest. This file is generated by scripts/gen-third-party-notices.py
+1 -1
View File
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates below.
Each is distributed under its own permissive license; full texts follow.
Generated by `cargo about generate about.hbs` (see about.toml) — do not edit by hand.
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates listed
below. Each is distributed under its own permissive license; the full license texts
follow the manifest. This file is generated by scripts/gen-third-party-notices.py
@@ -168,9 +168,9 @@ internal fun LocalNetworkDialog(onAllow: () -> Unit, onSettings: () -> Unit, onD
title = { Text("Allow local network access") },
text = {
Text(
"Android blocks punktfunk from talking to devices on your network, so it can't " +
"Android blocks Punktfunk from talking to devices on your network, so it can't " +
"find or reach any host until you allow it. If no prompt appears when you tap " +
"Allow, enable “Nearby devices” for punktfunk in system settings.",
"Allow, enable “Nearby devices” for Punktfunk in system settings.",
)
},
confirmButton = {
@@ -941,7 +941,7 @@ fun ConnectScreen(
color = MaterialTheme.colorScheme.onErrorContainer,
)
Text(
"Android blocks punktfunk from finding or reaching hosts until you allow it.",
"Android blocks Punktfunk from finding or reaching hosts until you allow it.",
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onErrorContainer,
textAlign = TextAlign.Center,
@@ -191,7 +191,7 @@ fun ControllersScreen(gamepadSetting: Int, onBack: () -> Unit) {
dsUsb?.let { DsRow(it) }
if (pads.isEmpty() && !sc2Present) {
Text(
"No controller detected. punktfunk can only forward devices Android " +
"No controller detected. Punktfunk can only forward devices Android " +
"classifies as a gamepad or joystick — a pad connected through an adapter " +
"or hub may show up under \"Other input devices\" below with the adapter's " +
"identity, or not at all.",
@@ -463,11 +463,11 @@ fun GamepadLocalNetworkDialog(onAllow: () -> Unit, onSettings: () -> Unit, onDis
),
) {
DialogText(
"Android blocks punktfunk from talking to devices on your network, so it can't find " +
"Android blocks Punktfunk from talking to devices on your network, so it can't find " +
"or reach any host until you allow it.",
)
DialogText(
"If no prompt appears after Allow, enable “Nearby devices” for punktfunk in " +
"If no prompt appears after Allow, enable “Nearby devices” for Punktfunk in " +
"system settings.",
)
}
@@ -344,7 +344,7 @@ struct HomeView: View {
ContentUnavailableView {
Label("No Hosts", systemImage: "rectangle.connected.to.line.below")
} description: {
Text("Add your punktfunk host with the + button, or scan the network again.")
Text("Add your Punktfunk host with the + button, or scan the network again.")
} actions: {
Button("Add Host") { showAddHost = true }
.glassProminentButtonStyle()
@@ -453,7 +453,7 @@ public final class HostDiscovery: ObservableObject {
private static func instanceName(_ endpoint: NWEndpoint) -> String {
if case let .service(name, _, _, _) = endpoint { return name }
return "punktfunk host"
return "Punktfunk host"
}
private static func entry(_ txt: NWTXTRecord, _ field: String) -> String? {
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 unom
Copyright 2026 unom - Enrico Bühler
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2026 unom
Copyright (c) 2026 unom - Enrico Bühler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -1,7 +1,7 @@
THIRD-PARTY SOFTWARE NOTICES
============================================================================
punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.
The binaries it ships statically/dynamically link the third-party Rust crates listed
below. Each is distributed under its own permissive license; the full license texts
follow the manifest. This file is generated by scripts/gen-third-party-notices.py
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2026 unom
Copyright (c) 2026 unom - Enrico Bühler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+1 -1
View File
@@ -244,7 +244,7 @@ fn run_headless_cli(args: &[String], identity: (String, String)) {
#[cfg(windows)]
fn discover_and_print() {
use std::time::{Duration, Instant};
println!("Browsing the LAN for punktfunk hosts (~5 s)…");
println!("Browsing the LAN for Punktfunk hosts (~5 s)…");
let (rx, _rescan) = discovery::browse();
let deadline = Instant::now() + Duration::from_secs(5);
let mut seen = std::collections::HashSet::new();
@@ -271,7 +271,7 @@ impl KwinFakeInjector {
)?;
// Authenticate (the legacy handshake; for an interface-authorized client KWin accepts it
// without a dialog — same as krdpserver/krfb headless).
fake.authenticate("punktfunk".into(), "remote streaming input".into());
fake.authenticate("Punktfunk".into(), "remote streaming input".into());
queue
.roundtrip(&mut state)
.context("fake_input authenticate roundtrip")?;
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "punktfunk-docs",
"private": true,
"type": "module",
"description": "punktfunk documentation site — Fumadocs on TanStack Start (Vite + Nitro/bun)",
"description": "Punktfunk documentation site — Fumadocs on TanStack Start (Vite + Nitro/bun)",
"scripts": {
"dev": "vite dev --port 3001",
"build": "vite build",
+3 -3
View File
@@ -1,17 +1,17 @@
// punktfunk brand mark: two overlapping circles forming a lens — the violet
// Punktfunk brand mark: two overlapping circles forming a lens — the violet
// brand identity. Copied verbatim from the marketing site (flattened from the
// clients/apple punktfunk_Logo.icon). Back-to-front: large light-violet circle,
// deep-violet circle, light highlight where they overlap.
export default function BrandMark({ className }: { className?: string }) {
return (
<svg
aria-label="punktfunk"
aria-label="Punktfunk"
role="img"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1000 1000"
className={className}
>
<title>punktfunk</title>
<title>Punktfunk</title>
<path
d="M403.037,791.672c107.586,0 194.41,-86.824 194.41,-194.41c0,-107.586 -86.824,-194.41 -194.41,-194.41c-107.586,0 -194.41,86.824 -194.41,194.41c0,107.586 86.824,194.41 194.41,194.41Z"
fill="#a79ff8"
+3 -3
View File
@@ -1,4 +1,4 @@
// The punktfunk "funk" wordmark — vectorised from
// The Punktfunk "funk" wordmark — vectorised from
// Export/Punktfunk_Logo-Text_No-Border_Dark.svg (the white export background is
// dropped). Inline SVG using currentColor so it recolours per theme: the
// deep-violet brand on light, the light-violet lens highlight on dark (matching
@@ -7,13 +7,13 @@ export default function Wordmark({ className = '' }: { className?: string }) {
return (
<svg
role="img"
aria-label="punktfunk"
aria-label="Punktfunk"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 579 136"
fill="currentColor"
className={`w-auto text-[var(--pf-brand)] dark:text-[var(--pf-highlight)] ${className}`}
>
<title>punktfunk</title>
<title>Punktfunk</title>
<path d="M16.782,16.051l0,102.687l31.253,0l0,-35.563l73.436,0l0,-23.555l-73.436,0l0,-19.398l77.285,0l0,-24.171l-108.537,0Z" />
<path d="M131.785,16.051l0,47.264c0.154,16.627 0.154,16.627 0.308,20.014c0.77,15.087 2.463,21.4 7.544,26.634c7.698,8.16 20.014,10.315 59.272,10.315c23.863,0 34.178,-0.616 43.415,-2.463c11.7,-2.463 19.552,-10.623 21.246,-22.323c0.924,-7.236 1.078,-8.929 1.54,-32.176l0,-47.264l-31.253,0l0,47.264c0,2.155 -0.154,7.082 -0.308,10.623c-0.462,9.699 -1.232,12.47 -3.695,15.087c-3.387,3.695 -9.853,4.619 -31.407,4.619c-26.634,0 -32.638,-1.693 -34.332,-9.853c-0.77,-4.157 -0.77,-4.311 -1.078,-20.476l0,-47.264l-31.253,0Z" />
<path d="M271.575,15.943l0,102.687l31.868,0l-0.77,-76.669l3.387,0l54.038,76.669l54.346,0l0,-102.687l-31.868,0l0.77,76.515l-3.233,0l-53.73,-76.515l-54.808,0Z" />
+1 -1
View File
@@ -1,4 +1,4 @@
// The docs reuse the punktfunk footer from the shared unom CMS (cms.unom.io).
// The docs reuse the Punktfunk footer from the shared unom CMS (cms.unom.io).
// The footer shape comes from @unom/app-ui/footer so the docs and the marketing
// site share one type. The CMS is multi-tenant: footer is a per-tenant
// collection, so scope the read to this project's tenant. Read-only GET, so a
+1 -1
View File
@@ -3,7 +3,7 @@ import BrandMark from '@/components/BrandMark'
import Wordmark from '@/components/Wordmark'
// Shared chrome (nav title, links) for both the docs layout and the home layout.
// The lens mark + wordmark mirror the punktfunk marketing site's header.
// The lens mark + wordmark mirror the Punktfunk marketing site's header.
export function baseOptions(): BaseLayoutProps {
return {
nav: {
+1 -1
View File
@@ -30,7 +30,7 @@ export const Route = createRootRoute({
{ charSet: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ name: 'color-scheme', content: 'dark light' },
{ title: 'punktfunk docs' },
{ title: 'Punktfunk Docs' },
],
links: [
{ rel: 'stylesheet', href: appCss },
+6 -6
View File
@@ -13,18 +13,18 @@ export const Route = createFileRoute('/api/')({
component: ApiReference,
head: () => ({
meta: [
{ title: 'punktfunk — Management API reference' },
{ title: 'Punktfunk — Management API Reference' },
{
name: 'description',
content:
'Interactive reference for the punktfunk host management REST API (OpenAPI).',
'Interactive reference for the Punktfunk host management REST API (OpenAPI).',
},
],
links: [{ rel: 'stylesheet', href: scalarCss }],
}),
})
// The full punktfunk theme rolled out onto Scalar — the same dark-violet (and
// The full Punktfunk theme rolled out onto Scalar — the same dark-violet (and
// light-lavender) product chrome as the docs/management console.
//
// IMPORTANT: Scalar toggles `.light-mode` / `.dark-mode` on `document.body`,
@@ -191,7 +191,7 @@ function ApiReference() {
url: '/openapi.json',
darkMode: isDark,
hideDarkModeToggle: true,
metaData: { title: 'punktfunk Management API' },
metaData: { title: 'Punktfunk Management API' },
hideDownloadButton: false,
customCss: SCALAR_CSS,
}),
@@ -200,13 +200,13 @@ function ApiReference() {
return (
<div className="flex min-h-screen flex-col">
{/* Slim branded bar so the reference stays inside the punktfunk identity
{/* Slim branded bar so the reference stays inside the Punktfunk identity
and links back into the docs. */}
<header className="flex h-14 shrink-0 items-center justify-between border-b border-fd-border px-4 md:px-6">
<Link
to="/docs/$"
params={{ _splat: '' }}
aria-label="punktfunk documentation"
aria-label="Punktfunk documentation"
className="flex items-center gap-2 no-underline"
>
<BrandMark className="size-6" />
+3 -3
View File
@@ -4,12 +4,12 @@
/* Pull Fumadocs UI's own classes — and @unom/ui's compiled components into
the Tailwind 4 scan so their utilities aren't purged. @unom/ui is the shared
design-token system the punktfunk marketing site also builds on. */
design-token system the Punktfunk marketing site also builds on. */
@source '../../node_modules/fumadocs-ui/dist/**/*.js';
@source '../../node_modules/@unom/ui/dist/**/*.{js,mjs}';
@source '../../node_modules/@unom/app-ui/dist/**/*.{js,mjs}';
/* punktfunk brand
/* Punktfunk brand
The brand colour is the violet lens mark. (The marketing site's blue is just
a page background, not the brand.) These values feed both @unom/ui's semantic
token contract (--brand/--primary/--accent/--highlight) and the Fumadocs
@@ -61,7 +61,7 @@
}
@theme {
/* Geist the punktfunk brand typeface, same as the marketing site
/* Geist the Punktfunk brand typeface, same as the marketing site
(the @fontsource-variable/geist face is loaded in __root.tsx). */
--font-sans: 'Geist Variable', ui-sans-serif, system-ui, sans-serif;
--font-display: 'Geist Variable', ui-sans-serif, system-ui, sans-serif;
+1 -1
View File
@@ -224,7 +224,7 @@ path below is the maintainer's test box — substitute your own `punktfunk-probe
# Recover a WEDGED driver. Symptom: every session fails with
# create virtual output: pf-vdisplay ADD ...: DeviceIoControl(0x222400): Element nicht gefunden (0x80070490)
# i.e. ERROR_NOT_FOUND — sustained ADD/REMOVE churn exhausted the IddCx monitor slots (ghost
# "Generic Monitor (punktfunk)" nodes pile up, target_ids climb). A host restart's CLEAR_ALL does NOT
# "Generic Monitor (Punktfunk)" nodes pile up, target_ids climb). A host restart's CLEAR_ALL does NOT
# fix it; the driver instance must be reloaded. This clears the ghosts + cycles the adapter (no reboot —
# this box boots to Proxmox).
powershell -ExecutionPolicy Bypass -File reset-pf-vdisplay.ps1 -Verify -Probe C:\t-goal1\debug\punktfunk-probe.exe
+1 -1
View File
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 unom
Copyright 2026 unom - Enrico Bühler
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2026 unom
Copyright (c) 2026 unom - Enrico Bühler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -186,7 +186,7 @@
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 unom
Copyright 2026 unom - Enrico Bühler
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2026 unom
Copyright (c) 2026 unom - Enrico Bühler
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+1 -1
View File
@@ -83,7 +83,7 @@ export const runPluginCli = async <E, R>(opts: {
} catch (e) {
const hint =
e instanceof HostRequestError
? " (is the punktfunk host running?)"
? " (is the Punktfunk host running?)"
: "";
console.error(`${opts.def.name}: ${name} failed: ${e}${hint}`);
process.exitCode = 1;
+1 -1
View File
@@ -137,7 +137,7 @@ def main():
w("THIRD-PARTY SOFTWARE NOTICES")
w("=" * 76)
w("")
w("punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.")
w("Punktfunk (https://git.unom.io/unom/punktfunk) is licensed under MIT OR Apache-2.0.")
w("The binaries it ships statically/dynamically link the third-party Rust crates listed")
w("below. Each is distributed under its own permissive license; the full license texts")
w("follow the manifest. This file is generated by scripts/gen-third-party-notices.py")
+1 -1
View File
@@ -1,4 +1,4 @@
// punktfunk brand mark: two overlapping circles forming a lens — the violet
// Punktfunk brand mark: two overlapping circles forming a lens — the violet
// brand identity (flattened from the clients/apple punktfunk_Logo.icon, shared
// verbatim with the marketing site + docs). Back-to-front: large light-violet
// circle, deep-violet circle, light highlight where they overlap.
+1 -1
View File
@@ -2,7 +2,7 @@ import { cn } from "@/lib/utils";
import { BrandMark } from "./brand-mark";
import { Wordmark } from "./wordmark";
// Full punktfunk lockup: the lens mark anchored to the top-left corner of the
// Full Punktfunk lockup: the lens mark anchored to the top-left corner of the
// "funk" wordmark. Size the lockup with a width on the wrapper (e.g. `w-40`);
// the mark scales as a fraction of that width.
export function Logo({ className }: { className?: string }) {
+1 -1
View File
@@ -3,7 +3,7 @@ import { useEffect, useRef } from "react";
import { cn } from "@/lib/utils";
import { m } from "@/paraglide/messages";
// The punktfunk lens, alive. The two overlapping circles of the brand mark are
// The Punktfunk lens, alive. The two overlapping circles of the brand mark are
// recreated from divs and animated as if orbiting on a path whose long axis points
// INTO the screen, so depth is the dominant motion: each circle surges toward and
// away from the viewer in antiphase, passing in front of and behind the other.
+1 -1
View File
@@ -1,6 +1,6 @@
import { cn } from "@/lib/utils";
// The punktfunk "funk" wordmark — the real brand typo, vectorised from the
// The Punktfunk "funk" wordmark — the real brand typo, vectorised from the
// marketing logo. currentColor so it recolours per surface; defaults to the
// light-violet lens highlight that reads on the dark console chrome. Size via
// height (e.g. `h-5`); width follows the viewBox.
+1 -1
View File
@@ -73,7 +73,7 @@ export const Incompatible: Story = {
...BASE,
compatible: false,
incompatible_reason:
"needs punktfunk host ≥ 0.16.0 (this host is 0.15.0)",
"needs Punktfunk host ≥ 0.16.0 (this host is 0.15.0)",
},
},
};
+2 -2
View File
@@ -9,7 +9,7 @@
Tailwind 4 scan so their utilities aren't purged. */
@source "../node_modules/@unom/ui/dist/**/*.{js,mjs}";
/* punktfunk brand · violet product chrome
/* Punktfunk brand · violet product chrome
Two themes on one violet identity: LIGHT (lavender docs surface the same
palette the design/Scalar reference uses: white bg, faint-violet cards/borders,
#6c5bf3 brand) is the :root default; DARK (the violet-tinted app-icon chrome
@@ -27,7 +27,7 @@
:root {
--radius: 0.625rem;
/* Brand — the violet lens mark (from the punktfunk app icon). Theme-independent. */
/* Brand — the violet lens mark (from the Punktfunk app icon). Theme-independent. */
--pf-brand: #6c5bf3; /* deep violet — primary on light */
--pf-brand-light: #a79ff8; /* light violet — primary on dark */
--pf-highlight: #d2c9fb; /* lens highlight */
+1 -1
View File
@@ -1,4 +1,4 @@
/* Penner easing tokens shared with the punktfunk marketing site + @unom/ui.
/* Penner easing tokens shared with the Punktfunk marketing site + @unom/ui.
@unom/ui's accordion/collapsible/material animations resolve these by name. */
@theme {
--ease-in-sine: cubic-bezier(0.47, 0, 0.745, 0.715);