From 2dce270ac71e821d747657d068ffa134b397cf63 Mon Sep 17 00:00:00 2001 From: Oleh Omelchenko Date: Thu, 25 Jun 2026 01:08:24 +0300 Subject: [PATCH] About: acknowledge the projects Astrolabe is built on and shaped by --- src/app/components/AboutModal.module.css | 21 ++++- src/app/components/AboutModal.tsx | 97 +++++++++++++++++++++++- 2 files changed, 115 insertions(+), 3 deletions(-) diff --git a/src/app/components/AboutModal.module.css b/src/app/components/AboutModal.module.css index 7000e7b..fb587ea 100644 --- a/src/app/components/AboutModal.module.css +++ b/src/app/components/AboutModal.module.css @@ -94,7 +94,26 @@ vertical-align: top; } -/* Privacy list */ +/* Acknowledgements — a labelled group above each credit list. */ +.ackGroup { + display: flex; + flex-direction: column; + gap: var(--space-2); +} + +.ackLabel { + margin: 0; + font-size: 13px; + font-weight: 600; + color: var(--text); +} + +/* Trailing "— what it's for" gloss after the project links. */ +.ackNote { + color: var(--text-secondary); +} + +/* Privacy + acknowledgement lists */ .list { margin: 0; padding-left: var(--space-5); diff --git a/src/app/components/AboutModal.tsx b/src/app/components/AboutModal.tsx index d169784..e6bbd3e 100644 --- a/src/app/components/AboutModal.tsx +++ b/src/app/components/AboutModal.tsx @@ -3,10 +3,12 @@ * * Rendered inside ModalShell — no backdrop, close button, or focus trap here; * the shell owns all of that (docs/architecture/03 → Layer 3). This component - * is pure content: app identity, keyboard shortcuts (§01D), and privacy posture - * (SOUL.md — local-only, no accounts, no telemetry). + * is pure content: app identity, keyboard shortcuts (§01D), privacy posture + * (SOUL.md — local-only, no accounts, no telemetry), and acknowledgements of + * the projects Astrolabe is built on and shaped by. */ +import type { ReactNode } from 'react'; import { FEEDBACK_EMAIL, feedbackMailtoHref } from '../feedback'; import styles from './AboutModal.module.css'; @@ -23,6 +25,18 @@ const SHORTCUTS: readonly { keys: string; action: string }[] = [ { keys: 'Esc', action: 'Close the active modal' }, ]; +/** + * External acknowledgement link. Opens in a new tab so following a credit never + * unloads the workspace mid-edit; `rel` isolates the opened context. + */ +function Ack({ href, children }: { href: string; children: ReactNode }) { + return ( + + {children} + + ); +} + export function AboutModal() { return (
@@ -88,6 +102,85 @@ export function AboutModal() { .

+ + {/* Acknowledgements */} +
+

Acknowledgements

+

Astrolabe stands on the work of many open projects.

+ +
+

Built on

+
    +
  • + Vega-Lite,{' '} + Vega,{' '} + vega-embed + — render every chart +
  • +
  • + Monaco + — the JSON editor +
  • +
  • + React,{' '} + Zustand,{' '} + Vite +
  • +
+
+ +
+

Chart guidance shaped by

+
    +
  • + Draco,{' '} + Voyager + — encoding rules +
  • +
  • + FT Visual Vocabulary + , Datawrapper +
  • +
  • + Lyra + — authoring interactions +
  • +
+
+ +
+

Design informed by

+
    +
  • + IBM Carbon,{' '} + GOV.UK +
  • +
  • + WAI-ARIA APG,{' '} + Nielsen Norman +
  • +
+
+ +
+

Typography

+
    +
  • + IBM Plex and other open typefaces, + self-hosted via Fontsource +
  • +
+
+
+ + {/* Sibling project */} +
+

Also from the maker

+

+ Astrolabe has a sibling: Syto, a workspace for cleaning + and reshaping data before you chart it. Go take a look. +

+
); }