@hraness/design-kit 0.40.1 → 0.40.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/MARKETING_COPY.md CHANGED
@@ -4,6 +4,18 @@ The product-marketing components give every Hraness site the same page shape. Th
4
4
 
5
5
  A reader arrives asking "What is this, and is it for me?" Answer that in the hero, show evidence next, and keep build details for the documentation.
6
6
 
7
+ ## Product names
8
+
9
+ Every product name is the exact display name from the portfolio messaging record, `messaging.names.name`. Use that value in headers, footers, heroes, related-product cards, social cards, metadata, README headings, and CLI banners. Preserve its case and punctuation: `PeopleBlade`, `TextButler`, `GhostGet`, `SlopCamera`, `SlopTrade`, `ALGAL`, `Sys1`, `Rough Day`, and `Hraness`. Intentionally lowercase names such as `aicharts`, `icon.place`, and `act60.me` stay lowercase.
10
+
11
+ Pass the display name unchanged to `MarketingSiteHeader.brand`, `MarketingSiteFooter.name`, `ProductHero.name`, and related-product `name` slots. Derive accessible labels from the same value, such as `${displayName} home`. Social-image declarations use it for both `name` and the visible `brand`; keep the domain in `domain`.
12
+
13
+ Commands, package names, repository names, domains, URL paths, anchor IDs, and audience keys are technical identifiers. Keep them separate and unchanged. `sys1.io` remains a domain, but its wordmark is `Sys1`; `rough.day` remains a domain, but its wordmark is `Rough Day`. A domain-shaped display name is valid only when the messaging record itself names the product that way.
14
+
15
+ Do not call `toLowerCase()` or `toUpperCase()` on a display name, and do not use CSS `text-transform` to restyle it. Source text must already contain the canonical form. Wordmark roles preserve source casing even when surrounding copy has a different typographic convention.
16
+
17
+ In public-page checks, pass the registry name as ``inspectMarketingHeader({ brandName: displayName, brandLabel: `${displayName} home` })``. `brandName` checks visible text independently of the accessible label and, in a rendered browser, rejects CSS casing transforms. Keep that expectation independent of the homepage's current text so the same mistake on every route cannot pass.
18
+
7
19
  ## Slots
8
20
 
9
21
  Limits are maximums. Count characters in the rendered text.
@@ -24,6 +36,7 @@ Limits are maximums. Count characters in the rendered text.
24
36
  | `MarketingCodeBlock` | Commands and output a reader can copy and run on the current release. Keep lines inside about 32 characters on a phone. | | Prompts, placeholders, or output the release cannot produce. |
25
37
  | `MarketingMarquee` `label` | One sentence with `{count}`, which renders as the number of items: "Works with {count} services". | 48 characters | Counting items the band does not show, rounded or "+" counts, and superlatives such as "every service". |
26
38
  | `MarketingMarquee` `items` | The services or sources the count covers, each under the name its own site uses or the name the product's source list gives it. Pass a registry mark, or a `generic` glyph for files and sites without a brand. | Name: 32 characters | Unreleased, unverified, or planned integrations; customer logos; marks for products the integration does not use. |
39
+ | `MarketingAccountActions` `primary` label | "Create account" for a signed-out visitor; "Open account" once they are signed in. The sign-in link always reads "Sign in". | | "Sign up", "Get started", "Join", or "Sign in with" a provider name on one site and a different label on another. |
27
40
  | `MarketingPillars`, `MarketingPrimitives` | Two to four items. Labels name a thing or state a fact ("A log for every run"); each summary is one sentence. | Label: five words. Summary: 120 characters | Adjective triads ("Fast / Legible / Yours") and abstract nouns ("durable objects"). |
28
41
  | Section `heading` | Sentence case. A full sentence in the editorial preset may end with a period; other headings do not. | 70 characters | Slogans and headings that promise more than the section shows. |
29
42
  | `MarketingTrustBoundary` | What stays on the reader's machine, what is shared, and what the product will not do, each stated once on the page. | Four items | Authority, custody, admission, or lease vocabulary. |
package/README.md CHANGED
@@ -11,7 +11,7 @@ Pin a GitHub release tag:
11
11
  ```json
12
12
  {
13
13
  "dependencies": {
14
- "@hraness/design-kit": "github:hraness/design-kit#v0.40.1",
14
+ "@hraness/design-kit": "github:hraness/design-kit#v0.40.3",
15
15
  "@hraness/ui": "github:hraness/ui#v0.5.17"
16
16
  }
17
17
  }
@@ -23,6 +23,63 @@ Pin a GitHub release tag:
23
23
  installation so the framework-neutral root and syntax highlighter can be used
24
24
  on their own. React 18 or 19 and React DOM 18 or 19 are also peer dependencies.
25
25
 
26
+ ## Render a first application header
27
+
28
+ In an existing React 18 or 19 application with the dependencies above installed,
29
+ load the complete precompiled stylesheet once in your global CSS file:
30
+
31
+ ```css
32
+ @import "@hraness/design-kit/styles.css";
33
+ ```
34
+
35
+ If you use Tailwind, put its import first. This route needs no application StyleX
36
+ compiler. It loads the shared presentation layers and default webfonts; do not
37
+ combine it with the compiler-adopter route described in
38
+ [Load the presentation layer](#load-the-presentation-layer).
39
+
40
+ In `App.tsx`, render a header and your application content:
41
+
42
+ ```tsx
43
+ import { TopBar } from "@hraness/design-kit/react";
44
+
45
+ export default function App() {
46
+ return (
47
+ <>
48
+ <TopBar title="My workspace" />
49
+ <main>
50
+ <h1>Saved work</h1>
51
+ <p>Your application owns the content and state.</p>
52
+ </main>
53
+ </>
54
+ );
55
+ }
56
+ ```
57
+
58
+ Run your application's existing development command. You see a solid, non-sticky
59
+ header titled “My workspace” above “Saved work”. `TopBar` renders a semantic
60
+ `header`; it does not supply application routing or a `main` landmark for you.
61
+
62
+ ## Find the right documentation
63
+
64
+ - [Load styles or adopt the StyleX compiler](#load-the-presentation-layer): choose one stylesheet route.
65
+ - [Use application compositions](#use-application-compositions): shells, navigation, and surfaces.
66
+ - [Explain a technical product](#explain-a-technical-product): marketing compositions and complete examples.
67
+ - [Publish articles](#publish-articles) and [article copy guidance](ARTICLE_COPY.md): article structure and review requirements.
68
+ - [Show status pages](#show-status-pages): error and not-found pages.
69
+ - [Use charts and syntax](#use-charts-and-syntax): application-owned data and code display.
70
+ - [Appearance and fonts](#appearance-and-fonts) and [palette reference](PALETTES.md): themes and typography.
71
+ - [Run the gallery](#gallery) or [develop the package](#development).
72
+
73
+ ## Release notes and focused examples
74
+
75
+ ### Canonical install labels
76
+
77
+ Version 0.40.3 keeps `SlopCamera` spelled consistently in install labels supplied by `@hraness/design-kit/portfolio`. The snapshot comes from registry commit `64d51361`; technical IDs, commands, and domains are unchanged.
78
+
79
+ ### Portfolio snapshot refresh
80
+
81
+ Version 0.40.2 refreshes the `@hraness/design-kit/portfolio` snapshot from registry commit `26b167cd`. It adds the Alt, midi.place, and Textmock products and the `runtime:xcb:aicharts:installs` and `runtime:gobstopper:aicharts:installs` relations, which fold the retired `contract:xcb:aicharts:exports-sessions-for` entry into each installer's detail sentence. Sites that render a "How X uses aicharts" post can now resolve the relation their admission names.
82
+
26
83
  ### Article links and account actions
27
84
 
28
85
  Version 0.40.1 strengthens the dotted underline on embedded article author links during hover and keyboard focus. Account prompts in plain pages retain a readable Create account button and a dotted Sign in link, with visible keyboard focus and system colors in high contrast mode.
@@ -595,6 +652,8 @@ On screens that allow motion, the band scrolls slowly toward the start of the li
595
652
 
596
653
  `MarketingAccount` gives account access a full section with a heading, short summary, and content slot. `MarketingAccountActions` pairs a prominent `primary` link with an optional `signIn` link; both have 56px minimum touch targets. Product authentication forms and session state remain in the consuming site. Add a direct account link to the site's header so visitors can find it without scrolling. Prose links and `.hraness-text-link` use subtle dotted underlines; header navigation and primary buttons retain their own presentation.
597
654
 
655
+ Wherever a signed-out visitor needs an account, offer the same two choices with `MarketingAccountActions`: a `primary` link labeled “Create account” and the `signIn` link, which reads “Sign in”. This covers the account section and any page that asks a visitor to sign in before it shows private content. When one sign-in flow creates new accounts and signs in existing ones, both links may point to it. Place the actions directly in the section or page, not inside a card, panel, or other surface: Sign in is a text link, and a surrounding surface makes it look like an oversized button.
656
+
598
657
  `ArticleIndex` lists posts, `ArticleCallout` marks a note, limit, or warning, and `ArticleRelatedProducts` wraps `MarketingRelated`. Static site builders import `renderArticleHtml`, `renderArticleIndexHtml`, `renderArticleSourcesHtml`, `renderArticleCalloutHtml`, and `renderArticleRelatedHtml` from the framework-neutral root and load `@hraness/design-kit/plain-publication.css` after `plain-site.css`. Text arguments are escaped; `bodyHtml` and `afterHtml` take HTML the site already rendered.
599
658
 
600
659
  Each host keeps an `ArticleAdmission` record per article and checks the registry in a test:
@@ -894,7 +953,7 @@ bun run browser:install
894
953
  bun run check
895
954
  ```
896
955
 
897
- The stable dependency pair for this release is `@hraness/ui` `v0.5.17` with `@hraness/design-kit` `v0.40.1`. Version 0.31.0 keeps the `limits` beat and beats marked `social: false` out of the social kit and adds `socialPost` for social wording that stands without a caveat. Version 0.30.3 refreshes the portfolio snapshot so related-product cards use each product's own spelling, such as GhostGet and TextButler. Version 0.30.2 keeps the narrow and stacked install-tab layout when another package compiles the same atoms into a later cascade layer. Version 0.30.1 keeps every PlatformInstall tab name whole in columns down to 200px by stacking each mark above its name, using a container query on the component. Version 0.30.0 adds `site-shell.css`, which keeps short-page footers at the viewport bottom. Version 0.29.3 preserves readable selected install tabs in forced colors. Version 0.29.2 keeps all three PlatformInstall tabs visible at 320 to 360px and draws each platform mark once per component. Version 0.29.1 keeps marketing action labels readable in forced colors. Version 0.29.0 adds `PlatformInstall`, one install block for every CLI site: a tab per operating system with its mark, the install command with a Copy button that announces the result, optional alternative commands such as npm or Homebrew, and a note for platforms without a native build. After hydration it selects the visitor's operating system; without JavaScript every command shows. It also adds `PlatformIcon` (Apple, Tux, and Windows marks in `currentColor`) and a `PlatformBadges` "Runs on" row, plus `platformLabel`, `platformMark`, `detectPlatform`, and `matchDetectedPlatform` at the package root. See [Install commands for each platform](#install-commands-for-each-platform). No existing export changes. Version 0.28.0 adds the launch kit. `@hraness/design-kit/mockups` draws labelled illustrations of chat, feeds, inboxes, articles, terminals, browsers, desktop windows, menu bars, and phones in server-safe plain React with no StyleX or React Aria, styled by `@hraness/design-kit/mockups.css`; each renders as one image with a text description and no headings. `@hraness/design-kit/mockups/client` adds `ModeShowcase`, `FitToWidth`, and `StepThrough`. `@hraness/design-kit/launch`, with no React, holds the `LaunchBeat`, `LaunchFacts`, and `SocialKit` shapes with `resolveLaunchBeats`, `buildSocialKit`, and `assertLaunchKit`. `@hraness/design-kit/testing` gives product repositories `blogConformance`, `renderMatrix`, `assertNoHeadings`, `assertRoleImgWithLabel`, and `assertFakeHandles`. The React entries add `ArticleFigure`, `ArticleVideo` with `articleVideoJsonLd`, `ArticleTable`, `ArticleBarChart`, `ComparisonTable`, `LaunchBeats`, and `SocialKitPanel`, and `MarketingProofFrame` takes `chrome` (`window`, `browser` with `url`, or `terminal`). [ARTICLE_COPY.md](ARTICLE_COPY.md) now writes "Introducing a product" as beats; the admission rules are unchanged. No existing export changes. Version 0.27.0 adds explicit Rust, TOML, YAML, Lean, and TLA+ code highlighting, including nested comments and multiline strings. The existing highlighter API and stylesheet remain the shared entry points; unsupported languages still render as escaped text. Version 0.26.0 adds `MarketingNotice` and the raw `.hraness-marketing-notice` class: one status or alert line (`info`, `success`, or `error`) that sits on the content edge of the page column instead of spanning the window. Errors are announced as alerts and other tones as status. Signed-in account pages that render inside `MarketingSiteHeader` should compose `MarketingMain`, `MarketingNotice`, `MarketingStatStrip`, and `MarketingSection` so every block shares the header's measure and gutter, rather than hand-rolled full-bleed banners and nested cards. Version 0.25.0 moves bordered foil surfaces off the spectrum: `.hraness-foil` and `[data-emphasis="primary"]` actions keep their flat surface fill under one theme-aware monochrome edge — black on light, white on dark, overridable through the new `--hraness-foil-edge` token — while the metallic spectrum stays on wordmarks and marks. The foil material contract advances to version 3: `surfaceImage` and `surfaceBackgroundClip` are replaced by `surfaceFill`, `edge`, `edgeDark`, and `edgeColor`. Reinstall any vendored marketing snapshot from the 0.25.0 commit. Version 0.24.0 joins a marketing footer directly followed by the shared `@hraness/site-footer` network footer into one band: the product row's bottom space collapses to a compact gap and the network row's content follows the marketing measure and gutter through `--hraness-site-footer-measure`, so product links and the organization row share one column instead of reading as two stacked bars. Mount the network footer directly after `MarketingSiteFooter`; no prop or markup change is needed inside either landmark. Version 0.23.0 moves marketing pages to the Quiet direction described in [DESIGN.md](DESIGN.md). `ProductHero` no longer renders a backdrop, `HeroBackdrop` renders nothing, and `attachHeroLight` is an inert disposer; their names and props stay so existing code compiles and are marked deprecated. The `cells`, `weave`, `contour`, and `mesh` patterns render as `none`, and marketing fields and Lantern walls paint the flat palette background. Both marketing presets use Nebula Sans for display headings (editorial at weight 550); Instrument Serif stays vendored for explicit opt-in only. Hero eyebrows are plain labels, the accent band loses its grid, and cards and header chrome use hairline edges instead of lifted shadows. On phones `MarketingSiteHeader` keeps the brand, primary action, and appearance menu on one row and moves the links to a second row that scrolls sideways, with 44px targets. To migrate, delete `backdrop` artwork, `HeroBackdrop`, `attachHeroLight`, pattern values, and product CSS that recreated textures or serif headings, then reinstall any vendored marketing snapshot from the 0.23.0 commit. Version 0.22.2 restores the canonical roughday mark — the rain-cloud artwork pinned by the portfolio registry — after the mark slot briefly carried a stray illustration. Version 0.22.1 completes the icon library with the roughday inline chip family (65 admitted assets, no pending members). Version 0.22.0 adds the `./icons` surface: 62 vetted single-ink assets across ten sets — a shared illustration family, product illustration families, and the product marks, each admitted through a measured gate (single ink, bounded aspect, coverage, stroke, paths, bytes) and per-set family coherence, distributed as a typed registry module (`hranessIcons`, `hranessIcon`, `hranessIconMarkup`, `hranessIconsForSet`) and as canonical `./icons/<set>/<slug>.svg` files for image consumers. See [ICONS.md](ICONS.md). Version 0.21.1 accepts status-page `routes` straight from a sitemap: long titles are shortened for the "Did you mean" line and unusable entries are dropped instead of failing the render. Version 0.21.0 replaces the 404 and route-error pages with one shared status page: the product's main action, a "Did you mean" link to the closest known page, at most three next links with one-line descriptions, an optional line for AI agents, and a glyph drawn as dots that gather, move away from the pointer, and settle. `RouteNotFoundPage`, `RouteErrorPage`, and `GlobalErrorDocument` render it; `renderStatusPageHtml` and `attachStatusPage` bring the same page to static sites; `status-page.css` ships in `styles.css` and `compiler-foundation.css`. The default copy changes to "We can’t find that page". See [STATUS_PAGES.md](STATUS_PAGES.md). Version 0.20.0 gives `ThemeMenuButton` the Lantern material: under `data-hraness-material="lantern"` its trigger is raised at rest and inset while pressed, and its menu uses the material plane, lift and warm selection, with no new props. Sites can delete their local Lantern CSS for the appearance menu. It also adds `formatRelativeTime` at the package root and a hydration-safe `RelativeTime` component in `@hraness/design-kit/react`. Version 0.19.0 redraws related-product cards as the hraness.com project cards: each shows the product's mark, its name, and its one-line `role` at reading size, and no longer renders the `relationship` sentence (the prop stays accepted and is deprecated). `MarketingRelatedProduct` and the static `ArticleRelatedLink` take a `mark`, and every `@hraness/design-kit/portfolio` product and `relatedFor()` item now carries its portfolio mark as an inert `data:image/svg+xml` URL. Related-tier and proof headings move to the new `--hraness-marketing-h3-size` token, so the editorial display face never renders below 1.75rem. `typography.css` gains per-level heading tokens (`--hraness-type-h1-font` through `--hraness-type-h4-font`, the matching `-weight` tokens, `--hraness-type-subheading-font`, and `--hraness-type-display-min`). h3 and h4 in `.hraness-prose` and publication articles now use the text face, and the h2 floor rises to 1.75rem. Version 0.18.3 adds the Sponge and Wordcell runtime relations to Oh to the `@hraness/design-kit/portfolio` snapshot, so related-product cards on all three sites can link them. Version 0.18.2 refreshes the `@hraness/design-kit/portfolio` snapshot from the registry: the public ghostget.com entry, updated Gobstopper and xcb naming and descriptions, and the current sibling-product relations for related-product cards. Version 0.18.1 adds the Perplexity mark and a dependency-free `@hraness/design-kit/provider-marks` leaf entry (`providerMark`, `providerMarks`, `providerMarkFallback`, `providerMarkGlyphDataUri`, `providerMarkArtDataUri`, `providerMarkOnAccent`, `providerMarkMonogram`) so packages such as `@hraness/ui` can consume the registry without pulling the marketing surface. Version 0.18.0 adds the shared provider-mark registry: `providerMarks`, `providerMark()` alias resolution, `ProviderMark`/`ProviderMarkChip` accent-tinted tile components on both React entry points, vendored agent and vendor artwork from LobeHub icons 1.95.1 plus documented Crush and Aider marks, monogram fallbacks for uncovered names, and data-URI helpers for CSS-mask consumers. See `vendor/provider-marks/UPSTREAM.md` for asset provenance. Version 0.17.2 carries the canonical portfolio messaging record per product (`names`, `category`, `tagline`, `short`, `meta`, `medium`, `long`, and hero copy) in the `/portfolio` snapshot. Version 0.17.1 lets Next.js apps that compile dependencies with Babel build the article layer: its link check no longer uses a Unicode property escape that Babel cannot rewrite, and it rejects the same control characters and whitespace as before. Version 0.17.0 adds the article layer: server-safe `MarketingArticle`, byline, provenance, sources, callout, related-product, and index components, a matching static HTML renderer for sites without React, long-form article styles in `plain-publication.css`, and the `ArticleAdmission` rubric with `assertArticleAdmissions()`. It also adds `@hraness/design-kit/portfolio`, a snapshot of public product names, one-liners, links, and relations for related-product cards and "How X uses Y" posts. See [ARTICLE_COPY.md](ARTICLE_COPY.md). Version 0.16.4 keeps native appearance-menu labels usable inside keyboard-focusable page landmarks, including mouse and touch selection. Version 0.16.3 keeps decorative hero backgrounds hidden in forced colors and reduced transparency when other packages load their styles afterward. Version 0.16.2 preserves palette hues in translucent headers, material surfaces, and decorative highlights. Version 0.16.1 keeps plain reading pages and nested compiled surfaces in their selected palette, including system appearance without JavaScript. Version 0.16.0 adds a shared bounded hero light, product-owned backdrop slots, five Lantern patterns, palette-derived soft surfaces, and responsive typography across marketing and reading layouts. Static sites can use the palette bridge for system appearance before JavaScript. See [HERO_FIELDS.md](HERO_FIELDS.md), [LANTERN_MATERIAL.md](LANTERN_MATERIAL.md), and [MARKETING_PRESET.md](MARKETING_PRESET.md). Version 0.15.0 lets `MarketingRelated` present labeled tiers of sibling products: a `groups` collection renders each tier under its own heading with an accessible card-row label, while the flat `items` shape stays available for a single group. Version 0.14.0 adds `MarketingRelated`, a collection section that presents sibling products as linked cards, each framed by its relationship to the featured product. Version 0.13.0 publishes `--hraness-sticky-offset` from sticky marketing chrome, gives `MarketingMain` and the next sticky sibling a clearance contract, stretches marketing card rows to the tallest item with a reserved two-line meta block, and clips per-card art wells so a logo surface cannot paint through the gutter. Version 0.12.0 replaces pointer-driven gradient rotation with a steady material and a moving light: the spectrum and its 115deg direction stay fixed while `--hraness-foil-x`/`--hraness-foil-y` highlights travel across each lockup, and marketing footers can opt into the same icon-plus-wordmark foil as the site header with `brandMark`. Version 0.11.1 preserves visible metallic marks when another package repeats a generic hidden atom in a later CSS layer. React consumers load `components.css` or `styles.css`; the raw marketing entry supports authored HTML hooks. Version 0.11 adds server-rendered `FoilMark` artwork and metallic text with subtle rainbow reflections, including a shared header mark seam and original-artwork fallbacks. Version 0.10.1 adds conservative server syntax defaults, includes their styles in the narrow marketing entry, and pins the icon dependency to preserve fresh Linux installs. Version 0.10 adds the shared foil contract: `.hraness-foil` surfaces and `.hraness-foil-text` wordmarks render a pointer-following metallic spectrum from the `--hraness-foil-*` custom properties, applied by default to marketing header brands and primary actions. The `attachFoil` browser export drives the bounded `x`/`y`/`angle` inputs with damped easing, reduced-motion and forced-color fallbacks, and no style injection; the same spectrum feeds `@hraness/site-footer` signup controls. Dark appearances use a deeper palette so the sheen stays visible. Version 0.8 removes Jelly's optional API, stylesheet, vendor runtime and theme-provider side effect. Migrate direct Jelly surfaces to native shared primitives before upgrading. Lantern now uses softer directional depth and shaded faces; the marketing preset adds individually shaded static cells, theme-aware terminal colors and window chrome. Code blocks retain source lines and follow the active palette. Paper preferences, semantic palettes, and compiler identity stay stable. Compiler adopters must regenerate their finalized stylesheet with the new package manifest.
956
+ The stable dependency pair for this release is `@hraness/ui` `v0.5.17` with `@hraness/design-kit` `v0.40.3`. Version 0.31.0 keeps the `limits` beat and beats marked `social: false` out of the social kit and adds `socialPost` for social wording that stands without a caveat. Version 0.30.3 refreshes the portfolio snapshot so related-product cards use each product's own spelling, such as GhostGet and TextButler. Version 0.30.2 keeps the narrow and stacked install-tab layout when another package compiles the same atoms into a later cascade layer. Version 0.30.1 keeps every PlatformInstall tab name whole in columns down to 200px by stacking each mark above its name, using a container query on the component. Version 0.30.0 adds `site-shell.css`, which keeps short-page footers at the viewport bottom. Version 0.29.3 preserves readable selected install tabs in forced colors. Version 0.29.2 keeps all three PlatformInstall tabs visible at 320 to 360px and draws each platform mark once per component. Version 0.29.1 keeps marketing action labels readable in forced colors. Version 0.29.0 adds `PlatformInstall`, one install block for every CLI site: a tab per operating system with its mark, the install command with a Copy button that announces the result, optional alternative commands such as npm or Homebrew, and a note for platforms without a native build. After hydration it selects the visitor's operating system; without JavaScript every command shows. It also adds `PlatformIcon` (Apple, Tux, and Windows marks in `currentColor`) and a `PlatformBadges` "Runs on" row, plus `platformLabel`, `platformMark`, `detectPlatform`, and `matchDetectedPlatform` at the package root. See [Install commands for each platform](#install-commands-for-each-platform). No existing export changes. Version 0.28.0 adds the launch kit. `@hraness/design-kit/mockups` draws labelled illustrations of chat, feeds, inboxes, articles, terminals, browsers, desktop windows, menu bars, and phones in server-safe plain React with no StyleX or React Aria, styled by `@hraness/design-kit/mockups.css`; each renders as one image with a text description and no headings. `@hraness/design-kit/mockups/client` adds `ModeShowcase`, `FitToWidth`, and `StepThrough`. `@hraness/design-kit/launch`, with no React, holds the `LaunchBeat`, `LaunchFacts`, and `SocialKit` shapes with `resolveLaunchBeats`, `buildSocialKit`, and `assertLaunchKit`. `@hraness/design-kit/testing` gives product repositories `blogConformance`, `renderMatrix`, `assertNoHeadings`, `assertRoleImgWithLabel`, and `assertFakeHandles`. The React entries add `ArticleFigure`, `ArticleVideo` with `articleVideoJsonLd`, `ArticleTable`, `ArticleBarChart`, `ComparisonTable`, `LaunchBeats`, and `SocialKitPanel`, and `MarketingProofFrame` takes `chrome` (`window`, `browser` with `url`, or `terminal`). [ARTICLE_COPY.md](ARTICLE_COPY.md) now writes "Introducing a product" as beats; the admission rules are unchanged. No existing export changes. Version 0.27.0 adds explicit Rust, TOML, YAML, Lean, and TLA+ code highlighting, including nested comments and multiline strings. The existing highlighter API and stylesheet remain the shared entry points; unsupported languages still render as escaped text. Version 0.26.0 adds `MarketingNotice` and the raw `.hraness-marketing-notice` class: one status or alert line (`info`, `success`, or `error`) that sits on the content edge of the page column instead of spanning the window. Errors are announced as alerts and other tones as status. Signed-in account pages that render inside `MarketingSiteHeader` should compose `MarketingMain`, `MarketingNotice`, `MarketingStatStrip`, and `MarketingSection` so every block shares the header's measure and gutter, rather than hand-rolled full-bleed banners and nested cards. Version 0.25.0 moves bordered foil surfaces off the spectrum: `.hraness-foil` and `[data-emphasis="primary"]` actions keep their flat surface fill under one theme-aware monochrome edge — black on light, white on dark, overridable through the new `--hraness-foil-edge` token — while the metallic spectrum stays on wordmarks and marks. The foil material contract advances to version 3: `surfaceImage` and `surfaceBackgroundClip` are replaced by `surfaceFill`, `edge`, `edgeDark`, and `edgeColor`. Reinstall any vendored marketing snapshot from the 0.25.0 commit. Version 0.24.0 joins a marketing footer directly followed by the shared `@hraness/site-footer` network footer into one band: the product row's bottom space collapses to a compact gap and the network row's content follows the marketing measure and gutter through `--hraness-site-footer-measure`, so product links and the organization row share one column instead of reading as two stacked bars. Mount the network footer directly after `MarketingSiteFooter`; no prop or markup change is needed inside either landmark. Version 0.23.0 moves marketing pages to the Quiet direction described in [DESIGN.md](DESIGN.md). `ProductHero` no longer renders a backdrop, `HeroBackdrop` renders nothing, and `attachHeroLight` is an inert disposer; their names and props stay so existing code compiles and are marked deprecated. The `cells`, `weave`, `contour`, and `mesh` patterns render as `none`, and marketing fields and Lantern walls paint the flat palette background. Both marketing presets use Nebula Sans for display headings (editorial at weight 550); Instrument Serif stays vendored for explicit opt-in only. Hero eyebrows are plain labels, the accent band loses its grid, and cards and header chrome use hairline edges instead of lifted shadows. On phones `MarketingSiteHeader` keeps the brand, primary action, and appearance menu on one row and moves the links to a second row that scrolls sideways, with 44px targets. To migrate, delete `backdrop` artwork, `HeroBackdrop`, `attachHeroLight`, pattern values, and product CSS that recreated textures or serif headings, then reinstall any vendored marketing snapshot from the 0.23.0 commit. Version 0.22.2 restores the canonical roughday mark — the rain-cloud artwork pinned by the portfolio registry — after the mark slot briefly carried a stray illustration. Version 0.22.1 completes the icon library with the roughday inline chip family (65 admitted assets, no pending members). Version 0.22.0 adds the `./icons` surface: 62 vetted single-ink assets across ten sets — a shared illustration family, product illustration families, and the product marks, each admitted through a measured gate (single ink, bounded aspect, coverage, stroke, paths, bytes) and per-set family coherence, distributed as a typed registry module (`hranessIcons`, `hranessIcon`, `hranessIconMarkup`, `hranessIconsForSet`) and as canonical `./icons/<set>/<slug>.svg` files for image consumers. See [ICONS.md](ICONS.md). Version 0.21.1 accepts status-page `routes` straight from a sitemap: long titles are shortened for the "Did you mean" line and unusable entries are dropped instead of failing the render. Version 0.21.0 replaces the 404 and route-error pages with one shared status page: the product's main action, a "Did you mean" link to the closest known page, at most three next links with one-line descriptions, an optional line for AI agents, and a glyph drawn as dots that gather, move away from the pointer, and settle. `RouteNotFoundPage`, `RouteErrorPage`, and `GlobalErrorDocument` render it; `renderStatusPageHtml` and `attachStatusPage` bring the same page to static sites; `status-page.css` ships in `styles.css` and `compiler-foundation.css`. The default copy changes to "We can’t find that page". See [STATUS_PAGES.md](STATUS_PAGES.md). Version 0.20.0 gives `ThemeMenuButton` the Lantern material: under `data-hraness-material="lantern"` its trigger is raised at rest and inset while pressed, and its menu uses the material plane, lift and warm selection, with no new props. Sites can delete their local Lantern CSS for the appearance menu. It also adds `formatRelativeTime` at the package root and a hydration-safe `RelativeTime` component in `@hraness/design-kit/react`. Version 0.19.0 redraws related-product cards as the hraness.com project cards: each shows the product's mark, its name, and its one-line `role` at reading size, and no longer renders the `relationship` sentence (the prop stays accepted and is deprecated). `MarketingRelatedProduct` and the static `ArticleRelatedLink` take a `mark`, and every `@hraness/design-kit/portfolio` product and `relatedFor()` item now carries its portfolio mark as an inert `data:image/svg+xml` URL. Related-tier and proof headings move to the new `--hraness-marketing-h3-size` token, so the editorial display face never renders below 1.75rem. `typography.css` gains per-level heading tokens (`--hraness-type-h1-font` through `--hraness-type-h4-font`, the matching `-weight` tokens, `--hraness-type-subheading-font`, and `--hraness-type-display-min`). h3 and h4 in `.hraness-prose` and publication articles now use the text face, and the h2 floor rises to 1.75rem. Version 0.18.3 adds the Sponge and Wordcell runtime relations to Oh to the `@hraness/design-kit/portfolio` snapshot, so related-product cards on all three sites can link them. Version 0.18.2 refreshes the `@hraness/design-kit/portfolio` snapshot from the registry: the public ghostget.com entry, updated Gobstopper and xcb naming and descriptions, and the current sibling-product relations for related-product cards. Version 0.18.1 adds the Perplexity mark and a dependency-free `@hraness/design-kit/provider-marks` leaf entry (`providerMark`, `providerMarks`, `providerMarkFallback`, `providerMarkGlyphDataUri`, `providerMarkArtDataUri`, `providerMarkOnAccent`, `providerMarkMonogram`) so packages such as `@hraness/ui` can consume the registry without pulling the marketing surface. Version 0.18.0 adds the shared provider-mark registry: `providerMarks`, `providerMark()` alias resolution, `ProviderMark`/`ProviderMarkChip` accent-tinted tile components on both React entry points, vendored agent and vendor artwork from LobeHub icons 1.95.1 plus documented Crush and Aider marks, monogram fallbacks for uncovered names, and data-URI helpers for CSS-mask consumers. See `vendor/provider-marks/UPSTREAM.md` for asset provenance. Version 0.17.2 carries the canonical portfolio messaging record per product (`names`, `category`, `tagline`, `short`, `meta`, `medium`, `long`, and hero copy) in the `/portfolio` snapshot. Version 0.17.1 lets Next.js apps that compile dependencies with Babel build the article layer: its link check no longer uses a Unicode property escape that Babel cannot rewrite, and it rejects the same control characters and whitespace as before. Version 0.17.0 adds the article layer: server-safe `MarketingArticle`, byline, provenance, sources, callout, related-product, and index components, a matching static HTML renderer for sites without React, long-form article styles in `plain-publication.css`, and the `ArticleAdmission` rubric with `assertArticleAdmissions()`. It also adds `@hraness/design-kit/portfolio`, a snapshot of public product names, one-liners, links, and relations for related-product cards and "How X uses Y" posts. See [ARTICLE_COPY.md](ARTICLE_COPY.md). Version 0.16.4 keeps native appearance-menu labels usable inside keyboard-focusable page landmarks, including mouse and touch selection. Version 0.16.3 keeps decorative hero backgrounds hidden in forced colors and reduced transparency when other packages load their styles afterward. Version 0.16.2 preserves palette hues in translucent headers, material surfaces, and decorative highlights. Version 0.16.1 keeps plain reading pages and nested compiled surfaces in their selected palette, including system appearance without JavaScript. Version 0.16.0 adds a shared bounded hero light, product-owned backdrop slots, five Lantern patterns, palette-derived soft surfaces, and responsive typography across marketing and reading layouts. Static sites can use the palette bridge for system appearance before JavaScript. See [HERO_FIELDS.md](HERO_FIELDS.md), [LANTERN_MATERIAL.md](LANTERN_MATERIAL.md), and [MARKETING_PRESET.md](MARKETING_PRESET.md). Version 0.15.0 lets `MarketingRelated` present labeled tiers of sibling products: a `groups` collection renders each tier under its own heading with an accessible card-row label, while the flat `items` shape stays available for a single group. Version 0.14.0 adds `MarketingRelated`, a collection section that presents sibling products as linked cards, each framed by its relationship to the featured product. Version 0.13.0 publishes `--hraness-sticky-offset` from sticky marketing chrome, gives `MarketingMain` and the next sticky sibling a clearance contract, stretches marketing card rows to the tallest item with a reserved two-line meta block, and clips per-card art wells so a logo surface cannot paint through the gutter. Version 0.12.0 replaces pointer-driven gradient rotation with a steady material and a moving light: the spectrum and its 115deg direction stay fixed while `--hraness-foil-x`/`--hraness-foil-y` highlights travel across each lockup, and marketing footers can opt into the same icon-plus-wordmark foil as the site header with `brandMark`. Version 0.11.1 preserves visible metallic marks when another package repeats a generic hidden atom in a later CSS layer. React consumers load `components.css` or `styles.css`; the raw marketing entry supports authored HTML hooks. Version 0.11 adds server-rendered `FoilMark` artwork and metallic text with subtle rainbow reflections, including a shared header mark seam and original-artwork fallbacks. Version 0.10.1 adds conservative server syntax defaults, includes their styles in the narrow marketing entry, and pins the icon dependency to preserve fresh Linux installs. Version 0.10 adds the shared foil contract: `.hraness-foil` surfaces and `.hraness-foil-text` wordmarks render a pointer-following metallic spectrum from the `--hraness-foil-*` custom properties, applied by default to marketing header brands and primary actions. The `attachFoil` browser export drives the bounded `x`/`y`/`angle` inputs with damped easing, reduced-motion and forced-color fallbacks, and no style injection; the same spectrum feeds `@hraness/site-footer` signup controls. Dark appearances use a deeper palette so the sheen stays visible. Version 0.8 removes Jelly's optional API, stylesheet, vendor runtime and theme-provider side effect. Migrate direct Jelly surfaces to native shared primitives before upgrading. Lantern now uses softer directional depth and shaded faces; the marketing preset adds individually shaded static cells, theme-aware terminal colors and window chrome. Code blocks retain source lines and follow the active palette. Paper preferences, semantic palettes, and compiler identity stay stable. Compiler adopters must regenerate their finalized stylesheet with the new package manifest.
898
957
 
899
958
  The complete check runs linting, typechecking, production builds, an installed-package smoke test, deterministic examples, property tests, server rendering, vendor-integrity checks, and headless Chromium regressions. The browser gate verifies responsive shell ownership, extracted AnimatedRailStage, Fader, layout-surface, and playback-transport delivery, reduced-motion stage fallback, Fader keyboard and focus behavior, forced-color behavior, keyboard-operable appearance, browser-chrome synchronization across opposing device and saved preferences, global-error static metadata and runtime lifecycle, accessible title and copy, deterministic procedural layers, viewport containment, and the absence of the excluded canvas effect. Provision the pinned Chromium with `bun run browser:install`. An explicit `CHROMIUM_EXECUTABLE_PATH` must resolve to a provisioned Chrome for Testing; the browser gate rejects installed auto-updating Chrome.
900
959
 
@@ -1548,6 +1548,9 @@ function inspectMarketingHeader(options = {}, document = globalThis.document) {
1548
1548
  const image = mark?.querySelector("img");
1549
1549
  const brandHref = brand?.getAttribute("href") ?? null;
1550
1550
  const brandLabel = (brand?.getAttribute("aria-label") ?? brand?.textContent)?.trim() || null;
1551
+ const brandCopy = brand?.cloneNode(true);
1552
+ brandCopy?.querySelectorAll(".hraness-foil-mark, svg, img").forEach((element) => element.remove());
1553
+ const brandName = brandCopy?.textContent?.replace(/\s+/gu, " ").trim() || null;
1551
1554
  const brandMark = image?.getAttribute("src") ?? null;
1552
1555
  const nav = header?.querySelector("nav.hraness-marketing-header__nav");
1553
1556
  const links = [...nav?.querySelectorAll("a[href]") ?? []].map((link) => ({
@@ -1563,6 +1566,8 @@ function inspectMarketingHeader(options = {}, document = globalThis.document) {
1563
1566
  problems.push("The product home link is missing or points to a different page.");
1564
1567
  if (brandLabel === null || options.brandLabel !== undefined && brandLabel !== options.brandLabel)
1565
1568
  problems.push("The product home link has a missing or inconsistent name.");
1569
+ if (options.brandName !== undefined && brandName !== options.brandName)
1570
+ problems.push("The visible product wordmark does not match its canonical display name.");
1566
1571
  if (brand?.hasAttribute("data-foil") !== true || mark === null || mark === undefined || image === null || image === undefined || !mark.querySelector(".hraness-foil-mark__paint") || !brandMark) {
1567
1572
  problems.push("The product home link is missing its foil mark and artwork fallback.");
1568
1573
  } else if (options.brandMark !== undefined && brandMark !== options.brandMark) {
@@ -1599,6 +1604,32 @@ function inspectMarketingHeader(options = {}, document = globalThis.document) {
1599
1604
  if (box2.width <= 0 || box2.height <= 0 || hidden)
1600
1605
  problems.push(`The product ${name} is not visible.`);
1601
1606
  }
1607
+ if (options.brandName !== undefined && brand) {
1608
+ const textNodes = [];
1609
+ const walker = document.createTreeWalker(brand, 4);
1610
+ for (let node = walker.nextNode();node !== null; node = walker.nextNode()) {
1611
+ if (node.parentElement && !node.parentElement.closest(".hraness-foil-mark, svg, img"))
1612
+ textNodes.push(node);
1613
+ }
1614
+ if (textNodes.some((node) => node.textContent?.trim() && node.parentElement && view.getComputedStyle(node.parentElement).textTransform !== "none")) {
1615
+ problems.push("The product wordmark changes canonical casing with CSS.");
1616
+ }
1617
+ const renderedName = textNodes.filter((node) => {
1618
+ const range = document.createRange();
1619
+ range.selectNodeContents(node);
1620
+ const box2 = range.getBoundingClientRect();
1621
+ if (box2.width <= 0 || box2.height <= 0)
1622
+ return false;
1623
+ for (let ancestor = node.parentElement;ancestor !== null; ancestor = ancestor.parentElement) {
1624
+ const style = view.getComputedStyle(ancestor);
1625
+ if (style.display === "none" || style.visibility === "hidden" || style.visibility === "collapse" || Number(style.opacity) === 0)
1626
+ return false;
1627
+ }
1628
+ return true;
1629
+ }).map((node) => node.textContent).join("").replace(/\s+/gu, " ").trim();
1630
+ if (renderedName !== options.brandName)
1631
+ problems.push("The rendered product wordmark is not visible with its canonical display name.");
1632
+ }
1602
1633
  const box = header.getBoundingClientRect();
1603
1634
  if (box.left < -1 || box.right > view.innerWidth + 1)
1604
1635
  problems.push("The product header extends outside the viewport.");
@@ -1630,6 +1661,7 @@ function inspectMarketingHeader(options = {}, document = globalThis.document) {
1630
1661
  appearanceCount: appearances.length,
1631
1662
  brandHref,
1632
1663
  brandLabel,
1664
+ brandName,
1633
1665
  brandMark,
1634
1666
  links,
1635
1667
  problems
@@ -533,6 +533,7 @@ var marketingStyles = {
533
533
  $$css: true
534
534
  },
535
535
  header__brand: {
536
+ ksq1ai: "x6mezaz",
536
537
  k1xSpc: "x3nfvp2",
537
538
  kkeX5w: "x6s0dn4",
538
539
  kOIVth: "x1neeqzj",
@@ -659,6 +660,7 @@ var marketingStyles = {
659
660
  $$css: true
660
661
  },
661
662
  footer__name: {
663
+ ksq1ai: "x6mezaz",
662
664
  kVQacm: "xb3r6kr",
663
665
  kd00dl: "xlyipyv",
664
666
  kBYq9C: "xuxw1ft",
@@ -1844,6 +1846,7 @@ var marketingStyles = {
1844
1846
  $$css: true
1845
1847
  },
1846
1848
  related__card_name: {
1849
+ ksq1ai: "x6mezaz",
1847
1850
  kogj98: "x1ghz6dp",
1848
1851
  kMwMTN: "xtylnni",
1849
1852
  knIRL8: "xrtw95r",