Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
[0.9.2] - 2026-03-05
Added
- Syntax highlighting in code blocks: All fenced code blocks now render with full token colors via
lowlight+hast-util-to-jsx-runtime. Supports 42 common languages (TypeScript, Python, Rust, Go, SQL, shell, JSON, etc.) plus 28 functional and scientific extras: Scala, Haskell, Clojure, Elixir, Erlang, F#, OCaml, Elm, Scheme, SML, Julia, MATLAB, LaTeX, Coq, Prolog, and more. Token colors are driven by 13 new--glyph-code-token-*CSS custom properties, overridable in any custom theme. - Nested
ui:components inui:tabsandui:steps: Tab and stepcontentfields now compile recursively — anyui:component, code fence, list, or blockquote can be embedded directly inside acontent:field using standard Markdown fenced block syntax. Nested blocks are stored inblock.childrenand rendered via therenderBlockprop. - GFM strikethrough:
~~text~~now renders as<del>in prose and in all inline markdown-enabled component fields.
Changed
- Inline markdown always-on: The
markdown: trueYAML flag andparseComponentMarkdowncompiler option have been removed. Inline markdown parsing is now unconditionally active for all 26 text-heavy components. Existing documents with or without the flag continue to render identically. screenshotviewport-matchedmax-width: The CLIrendercommand now sets the documentmax-widthto match the--widthoption (default 1280px) instead of the former hardcoded64rem. This ensures multi-column layouts render at the requested width.- Theme system expanded:
GlyphThemeVarKeygrows from 53 to 66 required tokens to include the 13 code-token color keys. Custom themes and the Obsidian plugin theme-sync must add these keys (all have sensible built-in fallbacks).
[0.9.1] - 2026-03-05
Added
- CLI
--viewport-heightflag (export & render): Controls Playwright viewport height in pixels. Default1024for PDF export,800forrender. Prevents tall blocks from being clipped. - CLI
--max-widthflag (export): Sets the CSSmax-widthof the content column. Default64rem; passnoneto fill the full viewport width. - CLI
--device-scale-factorflag (export md): Sets the HiDPI device pixel ratio for block screenshots. Default2.
Fixed
markdown: trueruntime validation error: Schema fields that the compiler converts fromstringtoInlineNode[]now accept both types. Previously, the runtime re-validated already-processed IR and logged spurious “Expected string, received array” warnings, falling back to raw (unrendered) data. Affects all 22 markdown-eligible fields acrosscallout,steps,tabs,accordion,card,kpi,comparison,quiz,infographic,timeline,poll,ranker,form,kanban,table,chart,equation,codediff,graph,relation,flowchart, andsequence.serveblank render: React components now hydrate correctly in the browser. Previously the client bundle was not injected into served HTML.servelive-reload injection: Live-reload script is now injected before the last</body>tag rather than the first match. The previous approach matched a literal</body>string inside the DOMPurify bundle, breaking JavaScript parsing.infographicrating description:RatingItem.descriptionnow acceptsstring | InlineNode[]and renders via<RichText>, consistent withmarkdown: truebehaviour on other item types.
[0.9.0] - 2026-03-04
Added
- Compile-time variables & macros: Scalar substitution via
{{key}}from frontmattervars:keys orui:varsblocks. Block variables (=varName) bind a rendered block to a name; suppressed block variables (=_varName) compile without rendering. Parameterized block templates (=_name(p1,p2)) combined with{{name("arg1","arg2")}}invocation enable reusable, data-driven block patterns. All expansion is compile-time — the IR remains flat and schema-valid. - Layout components — three new primitives for 2D document structure:
ui:columns: Horizontal grid.ratio: [2, 1]distributes width as CSSfrunits;gapaccepts any CSS length.childrenis an ordered list of suppressed block variable names resolved at compile time.ui:rows: Vertical counterpart toui:columns. Nestable inside column cells —ratiotakes effect when the container height is constrained.height: 100%ensuresfrunits work in nested contexts.ui:panel: Wraps a single suppressed block variable in a styled container. Four styles:card(default),bordered,elevated,ghost. Accepts any block includingui:columnsandui:rows.
- 12 starter and community themes in
themes/:default,dark,minimal,high-contrast,warmplus community themescatppuccin-mocha,tokyo-night,solarized-dark,gruvbox-dark,nord,dracula,one-dark. Pass via--theme-filein CLI exports. - CLI
--continuousflag: Renders all blocks in a single continuous page (no page breaks) for PDF export. - CLI
--paddingoption: Sets page padding for PDF exports. - New diagnostic codes:
UNDEFINED_VARIABLE,CIRCULAR_VARIABLE_REF,VARS_BLOCK_INVALID_VALUE,UNDEFINED_BLOCK_VAR,TEMPLATE_ARITY_MISMATCH,LAYOUT_CHILD_UNDEFINED.
Fixed
- CLI PDF full-bleed theme background: Theme background color now fills the entire page, not just the content area.
- Obsidian plugin Reading View rendering: Fixed blank render caused by
enhance.jscrash; switched to post-processor approach. - Obsidian plugin BRAT discovery: Added root
manifest.jsonfor BRAT plugin manager. - Obsidian plugin CI: Cross-repo publishing to
glyphjs-obsidiandist repo now usesDIST_REPO_PAT.
[0.8.0] - 2026-03-03
Added
- Two-tier theme system: Reduced required CSS variables from ~155 to 53 semantic tokens (
GlyphThemeVarKey). Component-specific variables are now optional CSS-only overrides that cascade from the Tier 1 tokens via built-in fallback chains — no TypeScript required. Breaking for theme authors: drop the ~100 removed component-specific vars and add the 4 new--glyph-color-*state vars. - Semantic state tokens:
--glyph-color-success,--glyph-color-warning,--glyph-color-error,--glyph-color-info— a universal palette for state-bearing components (KPI, Kanban, Steps, Comparison, Quiz, Callout, Form). - Shared palette:
--glyph-palette-color-1..10replaces the old--glyph-chart-color-Nand--glyph-timeline-color-Nvariables. One palette drives charts, timelines, infographics, architecture diagrams, and graph groups. --glyph-radius-xs: Extra-small border radius token (0.25rem).- Obsidian plugin (
@glyphjs/obsidian-plugin): Renders all 28ui:*component types natively in Obsidian notes (Reading View + Live Preview). Automatically maps Obsidian theme CSS vars to GlyphJS Tier 1 tokens. Includes a Settings tab with debug logging. Distributable via BRAT. glyphjs lintcommand: Validatesui:blocks in a Markdown file and reports diagnostics. Supports--format jsonfor structured output suitable for LLM tool loops,--strictto promote warnings to errors, and--quietfor exit-code-only use in scripts. Exit 0 = clean, 1 = errors, 2 = unreadable input.
Changed
GlyphThemeVarstype now contains exactly 53 required keys (was ~155). Custom themes must be updated.--glyph-chart-color-1..10renamed to--glyph-palette-color-1..10.- Dynamic CSS var templates in Kpi, Callout, Comparison, and Kanban components replaced with static color maps keyed by sentiment/type. The old vars remain valid CSS overrides; TypeScript no longer requires them.
Removed
- ~100 component-specific CSS variables removed from
GlyphThemeVarKey(still work as optional CSS overrides): all--glyph-callout-*-bg/border,--glyph-kanban-*,--glyph-steps-*,--glyph-kpi-*,--glyph-comparison-*,--glyph-chart-bullish/bearish,--glyph-timeline-*,--glyph-relation-*,--glyph-infographic-*,--glyph-table-*,--glyph-poll-*,--glyph-rating-star-empty/hover,--glyph-slider-*,--glyph-annotate-*,--glyph-form-error,--glyph-grid,--glyph-edge-color,--glyph-node-*,--glyph-icon-*,--glyph-blockquote-*,--glyph-codediff-gutter-bg. - Dropped entirely (no longer valid CSS overrides):
--glyph-shadow-glow,--glyph-text-shadow,--glyph-backdrop,--glyph-gradient-accent.
[0.6.0] - 2026-02-07
Added
- Interaction modes for Architecture component: Added zoom/pan interaction modes (modifier-key, click-to-activate, always) to Architecture component, completing the interaction modes feature across all diagram components
interactionModeandshowZoomControlsschema fields for Architecture component- Interactive overlay and zoom controls for Architecture diagrams
- Storybook stories demonstrating all three interaction modes for Architecture
Changed
- All 4 diagram components (Graph, Flowchart, Relation, Architecture) now support consistent zoom/pan interaction modes with the same API
[0.5.1] - 2026-02-07
Fixed
- TypeScript compilation error with xmlns attribute in ForeignObjectText component
[0.5.0] - 2026-02-07
Added
- Extended markdown support to 10 additional components: Tabs, Kanban, Table, Chart, Equation, CodeDiff (standard components) and Graph, Relation, Flowchart, Sequence (diagram components)
- Total components with markdown support increased from 17 to 27 (68% coverage)
measureTextutility for dynamic text measurement in SVG diagramsForeignObjectTextcomponent for rendering rich text in SVG contexts using foreignObjectinlineToTextutility for converting InlineNode[] to plain strings for SVG text elements- Markdown support in diagram node labels, edges, and titles
- Dynamic node sizing in graph layouts based on label content
- Storybook examples demonstrating markdown in Tabs, Graph, Flowchart, and Sequence components
Changed
- Graph, Relation, Flowchart, and Sequence components now support
string | InlineNode[]union types for labels - Chart component now supports markdown in axis labels and series names
- Table component now supports markdown in column labels
- Updated component documentation to reflect 27 components with markdown support
[0.4.0] - 2026-02-06
Added
- Markdown support in component text fields: Enable inline markdown formatting (bold, italic, links, code, strikethrough) in component text fields by setting
markdown: truein component YAML or using theparseComponentMarkdowncompiler option. Supports 17 components including Callout, Card, Accordion, Steps, Timeline, Quiz, Poll, and more. (#74) RichTextcomponent in@glyphjs/runtimefor renderingstring | InlineNode[]union typesparseInlineMarkdown()utility function in compiler for parsing markdown strings to InlineNode arrays- Compiler option
parseComponentMarkdownto enable markdown parsing globally for all components - Configurable interaction modes for graph visualizations: Add three interaction modes to prevent accidental zooming when scrolling past graphs:
modifier-key(Alt+scroll to zoom),click-to-activate(click to enable zoom/pan), andalways(traditional behavior). Includes button-driven zoom controls (+/-/reset) for all visualization components (Graph, Flowchart, Relation) useZoomInteractionhook for managing D3 zoom behavior with mode-specific filtersInteractionOverlaycomponent for visual feedback (tooltips, activation prompts)ZoomControlscomponent with accessible button-driven zoom controls- E2E tests for all interaction modes and zoom controls (30 tests total)
Changed
- Component data TypeScript interfaces now support
string | InlineNode[]union types for text fields, enabling both plain strings and formatted content - All 17 interactive component schemas now include optional
markdown: booleanfield (defaults tofalsefor backward compatibility) - BREAKING: Default
interactionModefor Graph, Flowchart, and Relation components changed from'always'to'modifier-key'. To restore old behavior, setinteractionMode: 'always'in component data. See migration guide for details
[0.1.0] - 2026-02-02
Added
- Initial monorepo setup with 8 packages
- 8 UI components: Callout, Tabs, Steps, Table, Graph, Relation, Chart, Timeline
- Architecture component for interactive architecture diagrams
- Compiler pipeline: markdown → AST → IR → React components
- Zod-based schema validation for all components
- Theming system with light/dark modes
- Animation, navigation, and diagnostics systems
- SSR support
- Storybook stories for all components
- Astro/Starlight documentation site
- Playground for live editing
- GitHub Actions CI/CD (lint, test, e2e, a11y, bundle size, docs deploy, npm publish)
- Changesets for version management