diff --git a/gateway/wrangler.jsonc b/gateway/wrangler.jsonc index a3115647..510b7c9f 100644 --- a/gateway/wrangler.jsonc +++ b/gateway/wrangler.jsonc @@ -57,9 +57,9 @@ // Channel service bindings (Gateway → Channel RPC) "services": [ { - "binding": "CHANNEL_WHATSAPP", - "service": "gsv-channel-whatsapp", - "entrypoint": "WhatsAppChannelEntrypoint" + "binding": "CHANNEL_TELEGRAM", + "service": "gsv-channel-telegram", + "entrypoint": "TelegramChannel" }, { "binding": "CHANNEL_DISCORD", diff --git a/scripts/dev-stack.sh b/scripts/dev-stack.sh index 0c0101b0..587a8074 100755 --- a/scripts/dev-stack.sh +++ b/scripts/dev-stack.sh @@ -7,13 +7,13 @@ STATE_ROOT="$ROOT_DIR/.wrangler/dev-state/v3" mkdir -p "$STATE_ROOT/do/ripgit-Repository" mkdir -p "$STATE_ROOT/do/gsv-Kernel" mkdir -p "$STATE_ROOT/do/gsv-Process" -mkdir -p "$STATE_ROOT/do/gsv-channel-whatsapp-WhatsAppAccount" +mkdir -p "$STATE_ROOT/do/gsv-channel-telegram-TelegramAccount" cd "$ROOT_DIR/ripgit" exec npm exec -- wrangler dev \ -c ../gateway/wrangler.jsonc \ -c ../assembler/wrangler.toml \ - -c ../adapters/whatsapp/wrangler.jsonc \ + -c ../adapters/telegram/wrangler.jsonc \ -c wrangler.toml \ --ip 0.0.0.0 \ --persist-to ../.wrangler/dev-state diff --git a/web/src/app/components/ui/Link.css b/web/src/app/components/ui/Link.css new file mode 100644 index 00000000..75ca71c6 --- /dev/null +++ b/web/src/app/components/ui/Link.css @@ -0,0 +1,39 @@ +.gsv-link { + display: inline-flex; + align-items: center; + gap: 6px; + color: var(--link, #8fb6ff); + font-family: var(--gsv-font-mono); + font-size: 13px; + letter-spacing: 0.04em; + text-decoration: none; + cursor: pointer; + transition: color 120ms ease; +} + +.gsv-link-label { + border-bottom: 1px solid var(--link, #8fb6ff); + padding-bottom: 2px; + transition: border-color 120ms ease; +} + +.gsv-link:hover, +.gsv-link:focus-visible { + color: var(--link-hover, #b8d2ff); +} + +.gsv-link:hover .gsv-link-label, +.gsv-link:focus-visible .gsv-link-label { + border-color: var(--link-hover, #b8d2ff); +} + +.gsv-link:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 3px; + border-radius: 1px; +} + +.gsv-link-arrow { + font-size: 12px; + line-height: 1; +} diff --git a/web/src/app/components/ui/Link.tsx b/web/src/app/components/ui/Link.tsx new file mode 100644 index 00000000..ca7bad6f --- /dev/null +++ b/web/src/app/components/ui/Link.tsx @@ -0,0 +1,34 @@ +import type { ComponentChildren } from "preact"; +import "./Link.css"; + +export interface LinkProps { + href: string; + children: ComponentChildren; + /** Open in a new tab with a safe `rel`. Defaults to true for http(s) URLs. */ + external?: boolean; + /** Render a trailing arrow glyph (for "read more"-style links). */ + arrow?: boolean; + className?: string; + onClick?: () => void; +} + +/** Link — the design system's text link / anchor primitive. Token-styled + * (accent colour + underline rule, focus-visible ring) and, unlike + * `Button variant="link"`, it is a real `` so external destinations, + * middle-click, and right-click "open in new tab" all behave natively. */ +export function Link({ href, children, external, arrow = false, className = "", onClick }: LinkProps) { + const isExternal = external ?? /^https?:\/\//i.test(href); + const cls = ["gsv-link", className].filter(Boolean).join(" "); + + return ( + + {children} + {arrow ? : null} + + ); +} diff --git a/web/src/app/components/ui/SectionHeader.tsx b/web/src/app/components/ui/SectionHeader.tsx index 92053347..5d4eb9b3 100644 --- a/web/src/app/components/ui/SectionHeader.tsx +++ b/web/src/app/components/ui/SectionHeader.tsx @@ -69,7 +69,7 @@ export function SectionHeader({ {title} {hasMeta ? ( - {meta} + {meta} ) : null} {chevron ?