From 1ee4d64cb19129241113e1e12b5e7bac4ea4c93a Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Wed, 12 Aug 2026 20:23:48 +0200 Subject: [PATCH] Add inline glossary tooltips across the deck MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-contained GlossaryTerm (dotted-underline, hover + tap, with an optional "learn more" link) and GlossedText that wraps glossary hits in any string. Wired into every slide subtitle via SlideFrame, plus the entity detail, ecosystem and tech card bodies where the jargon lives. Deliberately not portaled — the deck stage uses transforms + overflow, so a portaled popover would escape the themed .dark tree and lose its tokens; the card floats inline just below the term instead. TechSlide also surfaces the self-hosting line here (reviewer found it the clearest idea but it was buried on the building slide). Registers the Server icon for it. Co-Authored-By: Claude Opus 4.8 --- src/deck/components/EntityDetail.vue | 9 +-- src/deck/components/GlossaryTerm.vue | 96 ++++++++++++++++++++++++++++ src/deck/components/GlossedText.vue | 19 ++++++ src/deck/components/Icon.vue | 2 + src/deck/components/SlideFrame.vue | 3 +- src/deck/slides/EcosystemSlide.vue | 3 +- src/deck/slides/TechSlide.vue | 14 +++- 7 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 src/deck/components/GlossaryTerm.vue create mode 100644 src/deck/components/GlossedText.vue diff --git a/src/deck/components/EntityDetail.vue b/src/deck/components/EntityDetail.vue index e9f7523..48b21b2 100644 --- a/src/deck/components/EntityDetail.vue +++ b/src/deck/components/EntityDetail.vue @@ -2,6 +2,7 @@ import SlideFrame from './SlideFrame.vue' import Icon from './Icon.vue' import PlaceholderBadge from './PlaceholderBadge.vue' +import GlossedText from './GlossedText.vue' import { accentText, accentRing, accentDot, type Entity } from '../data' const props = defineProps<{ entity: Entity }>() @@ -21,7 +22,7 @@ const a = props.entity.accent e.g. {{ entity.example }} -

{{ entity.blurb }}

+

@@ -34,7 +35,7 @@ const a = props.entity.accent - {{ t }} +
@@ -49,7 +50,7 @@ const a = props.entity.accent class="flex items-center gap-2 rounded-lg bg-surface px-3 py-2 text-sm text-fg" > - {{ s }} + @@ -69,7 +70,7 @@ const a = props.entity.accent
- Runs on Lab 484 — same membership, kiosk & app as every node. +
diff --git a/src/deck/components/GlossaryTerm.vue b/src/deck/components/GlossaryTerm.vue new file mode 100644 index 0000000..55fc99b --- /dev/null +++ b/src/deck/components/GlossaryTerm.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/deck/components/GlossedText.vue b/src/deck/components/GlossedText.vue new file mode 100644 index 0000000..cc79d07 --- /dev/null +++ b/src/deck/components/GlossedText.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/deck/components/Icon.vue b/src/deck/components/Icon.vue index e46ad45..a4edda9 100644 --- a/src/deck/components/Icon.vue +++ b/src/deck/components/Icon.vue @@ -32,6 +32,7 @@ import { ChevronRight, Images, Expand, + Server, type LucideProps, } from '@lucide/vue' import type { FunctionalComponent } from 'vue' @@ -68,6 +69,7 @@ const registry: Record> = { ChevronRight, Images, Expand, + Server, } const props = defineProps<{ name: string }>() diff --git a/src/deck/components/SlideFrame.vue b/src/deck/components/SlideFrame.vue index 57e4c21..37fe1b6 100644 --- a/src/deck/components/SlideFrame.vue +++ b/src/deck/components/SlideFrame.vue @@ -1,6 +1,7 @@ @@ -20,7 +21,7 @@ import { userEcosystem, surfaceEntities as entities } from '../data'

{{ item.title }}

-

{{ item.body }}

+

diff --git a/src/deck/slides/TechSlide.vue b/src/deck/slides/TechSlide.vue index 890cd19..ad044ea 100644 --- a/src/deck/slides/TechSlide.vue +++ b/src/deck/slides/TechSlide.vue @@ -1,6 +1,7 @@ @@ -8,7 +9,7 @@ import { tech } from '../data'

{{ t.title }}

-

{{ t.body }}

+

+ + +
+ + + Every node self-hosts — the stack runs on-site, + on the network’s own hardware, not in someone else’s cloud. + +