@hraness/design-kit 0.32.0 → 0.34.0

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/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.32.0",
14
+ "@hraness/design-kit": "github:hraness/design-kit#v0.34.0",
15
15
  "@hraness/ui": "github:hraness/ui#v0.5.17"
16
16
  }
17
17
  }
@@ -25,6 +25,10 @@ on their own. React 18 or 19 and React DOM 18 or 19 are also peer dependencies.
25
25
 
26
26
  ### Clearer marketing controls and agent setup
27
27
 
28
+ Version 0.34.0 extends the same finite `columns` API to `MarketingTrustBoundary`, `MarketingInterfaceGrid`, and `MarketingRelated`. Related-product groups can override the section’s column limit, so four-item groups can use two columns while a neighboring three-item group keeps three. The compiled and static styles share the adaptive sizing and nested-grid reset.
29
+
30
+ Version 0.33.0 adds a `columns` prop accepting `1`, `2`, `3`, or `4` to `MarketingCardRow` and `MarketingPrimitives`. Set `columns={2}` for a balanced two-by-two collection. Each grid wraps within its own container, retaining readable card widths on phones and in narrow page sections. The prop uses compiled classes without inline styles; omitting it preserves automatic layout.
31
+
28
32
  Version 0.32.0 pairs filled mockup controls with their semantic foreground, so selected labels remain readable across palettes, light and dark modes, nested themes, and forced colors. Solid provider marks choose foregrounds using measured contrast, including midtone brand colors. Showcase hints and figure captions are optional; figures keep accessible labels without adding a visible “Illustration” prefix or repeating alt text.
29
33
 
30
34
  New client compositions `AgentSetupPrompt` and `AgentCommandTabs` share prompt previews, complete-source copying, provider marks, responsive actions, and keyboard navigation. The framework-neutral `agentSetupTargets(prompt)` helper centralizes documented computer-agent destinations. `MarketingSection.headingContent` places commands and actions beside a result preview, and `MarketingActionLink` uses the existing shared action recipe. The provider registry adds Obsidian, Supermemory, Mem0, and GitHub Copilot. `ProviderMark` gains `tone="inherit"` for glyphs that follow a control’s foreground. See [AGENT_SETUP.md](AGENT_SETUP.md) for usage and verified handoffs.
@@ -365,6 +369,8 @@ existing item-count custom property, including its inline style and arbitrary
365
369
  collection length. Use the compiled standalone stylesheet or the finalized
366
370
  compiler-adopter stylesheet with the finite choices.
367
371
 
372
+ `MarketingCardRow`, `MarketingPrimitives`, `MarketingTrustBoundary`, `MarketingInterfaceGrid`, and `MarketingRelated` also accept `columns` from `1` to `4` as a maximum. Their cards keep a minimum reading width (16rem for card rows, 18rem for capabilities), then collapse to one track as their container narrows. Use `columns={2}` to keep four-item collections balanced. A `MarketingRelated` group may set its own `columns` to override the section default. Plain HTML can set `--hraness-marketing-grid-columns` on the grid through its stylesheet.
373
+
368
374
  `MarketingNotice` renders one status or alert line — a redirect confirmation, a
369
375
  failed action — on the content edge of the page column, with `tone` set to
370
376
  `info`, `success`, or `error`. Errors use `role="alert"`; the other tones use
@@ -733,7 +739,7 @@ bun run browser:install
733
739
  bun run check
734
740
  ```
735
741
 
736
- The stable dependency pair for this release is `@hraness/ui` `v0.5.17` with `@hraness/design-kit` `v0.32.0`. 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.
742
+ The stable dependency pair for this release is `@hraness/ui` `v0.5.17` with `@hraness/design-kit` `v0.34.0`. 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.
737
743
 
738
744
  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.
739
745
 
@@ -429,6 +429,22 @@ var marketingStyles = {
429
429
  "--hraness-marketing-pillar-columns": "xj4arhr",
430
430
  $$css: true
431
431
  },
432
+ gridColumns1: {
433
+ "--hraness-marketing-grid-columns": "x166dvhg",
434
+ $$css: true
435
+ },
436
+ gridColumns2: {
437
+ "--hraness-marketing-grid-columns": "x10q4e6v",
438
+ $$css: true
439
+ },
440
+ gridColumns3: {
441
+ "--hraness-marketing-grid-columns": "xyqi4l0",
442
+ $$css: true
443
+ },
444
+ gridColumns4: {
445
+ "--hraness-marketing-grid-columns": "x1g57y38",
446
+ $$css: true
447
+ },
432
448
  actionFocus: {
433
449
  kI3sdo: "x13mrud1",
434
450
  kVtf5F: "x7s97pk",
@@ -2040,13 +2056,15 @@ var marketingStyles = {
2040
2056
  $$css: true
2041
2057
  },
2042
2058
  primitives__list: {
2059
+ "--hraness-marketing-grid-columns": "xogmzgw",
2060
+ "--_hraness-marketing-grid-track": "xwl1ywu",
2043
2061
  k1xSpc: "xrvj5dj",
2044
2062
  kkeX5w: "x1qjc9v5",
2045
2063
  kogj98: "x1ghz6dp",
2046
2064
  kmVPX3: "x1717udv",
2047
2065
  kohv2D: "xe8uvvx",
2048
2066
  kOIVth: "x8fetqu",
2049
- kg9kkx: "xeonaw6",
2067
+ kg9kkx: "x1ui45ma",
2050
2068
  $$css: true
2051
2069
  },
2052
2070
  primitive: {
@@ -2100,19 +2118,23 @@ var marketingStyles = {
2100
2118
  $$css: true
2101
2119
  },
2102
2120
  interface_grid: {
2121
+ "--hraness-marketing-grid-columns": "xogmzgw",
2122
+ "--_hraness-marketing-grid-track": "x9wro72",
2103
2123
  k1xSpc: "xrvj5dj",
2104
2124
  kkeX5w: "x1qjc9v5",
2105
2125
  kogj98: "x1ghz6dp",
2106
2126
  kOIVth: "x8fetqu",
2107
- kg9kkx: "x1p797x9",
2127
+ kg9kkx: "x1v4bfo1",
2108
2128
  $$css: true
2109
2129
  },
2110
2130
  trust_grid: {
2131
+ "--hraness-marketing-grid-columns": "xogmzgw",
2132
+ "--_hraness-marketing-grid-track": "x9wro72",
2111
2133
  k1xSpc: "xrvj5dj",
2112
2134
  kkeX5w: "x1qjc9v5",
2113
2135
  kogj98: "x1ghz6dp",
2114
2136
  kOIVth: "x8fetqu",
2115
- kg9kkx: "x1p797x9",
2137
+ kg9kkx: "x1v4bfo1",
2116
2138
  $$css: true
2117
2139
  },
2118
2140
  interface: {
@@ -2202,11 +2224,13 @@ var marketingStyles = {
2202
2224
  $$css: true
2203
2225
  },
2204
2226
  card_row: {
2227
+ "--hraness-marketing-grid-columns": "xogmzgw",
2228
+ "--_hraness-marketing-grid-track": "x9wro72",
2205
2229
  k1xSpc: "xrvj5dj",
2206
2230
  kkeX5w: "x1qjc9v5",
2207
2231
  kogj98: "x1ghz6dp",
2208
2232
  kOIVth: "x8fetqu",
2209
- kg9kkx: "x1p797x9",
2233
+ kg9kkx: "x1v4bfo1",
2210
2234
  $$css: true
2211
2235
  },
2212
2236
  card: {
@@ -3624,11 +3648,17 @@ var pillarColumns = {
3624
3648
  3: marketingStyles.pillarColumns3,
3625
3649
  4: marketingStyles.pillarColumns4
3626
3650
  };
3651
+ var gridColumns = {
3652
+ 1: marketingStyles.gridColumns1,
3653
+ 2: marketingStyles.gridColumns2,
3654
+ 3: marketingStyles.gridColumns3,
3655
+ 4: marketingStyles.gridColumns4
3656
+ };
3627
3657
  function marketingColumnClassName(hook, caller, columns) {
3628
3658
  if (columns !== undefined && columns !== 1 && columns !== 2 && columns !== 3 && columns !== 4) {
3629
3659
  throw new RangeError("Marketing columns must be 1, 2, 3, or 4 when specified.");
3630
3660
  }
3631
- const columnRecipe = columns === undefined ? undefined : (hook === "hraness-marketing-pillars" ? pillarColumns : factColumns)[columns];
3661
+ const columnRecipe = columns === undefined ? undefined : (hook === "hraness-marketing-pillars" ? pillarColumns : hook === "hraness-marketing-card-row" || hook === "hraness-marketing-primitives__list" || hook === "hraness-marketing-interface-grid" || hook === "hraness-marketing-trust-grid" ? gridColumns : factColumns)[columns];
3632
3662
  return [hook, stylex3.props(recipes[hook].default, columnRecipe).className, caller].filter((value) => value !== undefined && value.length > 0).join(" ");
3633
3663
  }
3634
3664
  function marketingClassName(hook, caller, variant = "default") {
@@ -3767,11 +3797,12 @@ function MarketingCardRow({
3767
3797
  ariaLabel,
3768
3798
  cards,
3769
3799
  children,
3770
- className
3800
+ className,
3801
+ columns
3771
3802
  }) {
3772
3803
  return /* @__PURE__ */ jsxs3("div", {
3773
3804
  "aria-label": ariaLabel,
3774
- className: marketingClassName("hraness-marketing-card-row", className),
3805
+ className: marketingColumnClassName("hraness-marketing-card-row", className, columns),
3775
3806
  "data-hraness-marketing": "card-row",
3776
3807
  children: [
3777
3808
  cards?.map((card) => /* @__PURE__ */ jsx4(MarketingCard, {
@@ -4479,6 +4510,7 @@ function MarketingCollectionHeader({
4479
4510
  }
4480
4511
  function MarketingPrimitives({
4481
4512
  className,
4513
+ columns,
4482
4514
  heading,
4483
4515
  headingId,
4484
4516
  headingLevel = 2,
@@ -4504,7 +4536,7 @@ function MarketingPrimitives({
4504
4536
  prefix: "primitives"
4505
4537
  }),
4506
4538
  /* @__PURE__ */ jsx4("ol", {
4507
- className: marketingClassName("hraness-marketing-primitives__list"),
4539
+ className: marketingColumnClassName("hraness-marketing-primitives__list", undefined, columns),
4508
4540
  children: items.map((item, index) => /* @__PURE__ */ jsxs3("li", {
4509
4541
  className: marketingClassName("hraness-marketing-primitive"),
4510
4542
  children: [
@@ -4596,6 +4628,7 @@ function MarketingStatStrip({
4596
4628
  }
4597
4629
  function MarketingInterfaceGrid({
4598
4630
  className,
4631
+ columns,
4599
4632
  heading,
4600
4633
  headingId,
4601
4634
  headingLevel = 2,
@@ -4621,7 +4654,7 @@ function MarketingInterfaceGrid({
4621
4654
  prefix: "interfaces"
4622
4655
  }),
4623
4656
  /* @__PURE__ */ jsx4("div", {
4624
- className: marketingClassName("hraness-marketing-interface-grid"),
4657
+ className: marketingColumnClassName("hraness-marketing-interface-grid", undefined, columns),
4625
4658
  children: interfaces.map((entry) => /* @__PURE__ */ jsxs3("article", {
4626
4659
  className: marketingClassName("hraness-marketing-interface"),
4627
4660
  children: [
@@ -4643,6 +4676,7 @@ function MarketingInterfaceGrid({
4643
4676
  }
4644
4677
  function MarketingTrustBoundary({
4645
4678
  className,
4679
+ columns,
4646
4680
  heading,
4647
4681
  headingId,
4648
4682
  headingLevel = 2,
@@ -4668,7 +4702,7 @@ function MarketingTrustBoundary({
4668
4702
  prefix: "trust"
4669
4703
  }),
4670
4704
  /* @__PURE__ */ jsx4("dl", {
4671
- className: marketingClassName("hraness-marketing-trust-grid"),
4705
+ className: marketingColumnClassName("hraness-marketing-trust-grid", undefined, columns),
4672
4706
  children: items.map((item) => /* @__PURE__ */ jsxs3("div", {
4673
4707
  className: marketingClassName("hraness-marketing-trust-item"),
4674
4708
  children: [
@@ -4968,6 +5002,7 @@ function MarketingRelatedCards({
4968
5002
  }
4969
5003
  function MarketingRelated({
4970
5004
  className,
5005
+ columns,
4971
5006
  heading,
4972
5007
  headingId,
4973
5008
  headingLevel = 2,
@@ -4977,6 +5012,9 @@ function MarketingRelated({
4977
5012
  label,
4978
5013
  summary
4979
5014
  }) {
5015
+ const defaultColumnProps = columns === undefined ? {} : {
5016
+ columns
5017
+ };
4980
5018
  return /* @__PURE__ */ jsxs3("section", {
4981
5019
  "aria-labelledby": headingId,
4982
5020
  className: marketingClassName("hraness-marketing-related", className),
@@ -4992,6 +5030,7 @@ function MarketingRelated({
4992
5030
  summary
4993
5031
  }),
4994
5032
  groups === undefined ? /* @__PURE__ */ jsx4(MarketingCardRow, {
5033
+ ...defaultColumnProps,
4995
5034
  children: /* @__PURE__ */ jsx4(MarketingRelatedCards, {
4996
5035
  items,
4997
5036
  level: childHeadingLevel(headingLevel)
@@ -5016,6 +5055,9 @@ function MarketingRelated({
5016
5055
  }),
5017
5056
  /* @__PURE__ */ jsx4(MarketingCardRow, {
5018
5057
  ariaLabel: group.heading,
5058
+ ...group.columns === undefined ? defaultColumnProps : {
5059
+ columns: group.columns
5060
+ },
5019
5061
  children: /* @__PURE__ */ jsx4(MarketingRelatedCards, {
5020
5062
  items: group.items,
5021
5063
  level: childHeadingLevel(childHeadingLevel(headingLevel))
@@ -83,7 +83,7 @@ import {
83
83
  marketingProofFrameAddress,
84
84
  proceduralBackdropVariants,
85
85
  proceduralRecipeVersion
86
- } from "../chunk-95p0j72v.js";
86
+ } from "../chunk-nwpcjm48.js";
87
87
  import"../chunk-h4k7yv6x.js";
88
88
  import {
89
89
  STATUS_PAGE_AGENT_PREFIX,
@@ -6618,6 +6618,7 @@ Run the job, then show me its log.`,
6618
6618
  ]
6619
6619
  }),
6620
6620
  /* @__PURE__ */ jsx17(MarketingPrimitives, {
6621
+ columns: 3,
6621
6622
  heading: "Three objects cover most work.",
6622
6623
  headingId: "design-gallery-primitives-title",
6623
6624
  headingLevel: 3,
@@ -6674,6 +6675,7 @@ Run the job, then show me its log.`,
6674
6675
  ]
6675
6676
  }),
6676
6677
  /* @__PURE__ */ jsx17(MarketingInterfaceGrid, {
6678
+ columns: 2,
6677
6679
  heading: "Choose your interface.",
6678
6680
  headingId: "gallery-marketing-interfaces",
6679
6681
  headingLevel: 3,
@@ -6691,6 +6693,7 @@ Run the job, then show me its log.`,
6691
6693
  }),
6692
6694
  /* @__PURE__ */ jsx17(MarketingCardRow, {
6693
6695
  ariaLabel: "Release radar",
6696
+ columns: 2,
6694
6697
  cards: [{
6695
6698
  art: /* @__PURE__ */ jsx17("svg", {
6696
6699
  "aria-hidden": "true",
@@ -6726,6 +6729,7 @@ Run the job, then show me its log.`,
6726
6729
  }]
6727
6730
  }),
6728
6731
  /* @__PURE__ */ jsx17(MarketingTrustBoundary, {
6732
+ columns: 2,
6729
6733
  heading: "What leaves your machine.",
6730
6734
  headingId: "gallery-marketing-trust",
6731
6735
  headingLevel: 3,
@@ -6838,6 +6842,7 @@ Run the job, then show me its log.`,
6838
6842
  }]
6839
6843
  }),
6840
6844
  /* @__PURE__ */ jsx17(MarketingRelated, {
6845
+ columns: 2,
6841
6846
  groups: [{
6842
6847
  heading: "Sibling tools",
6843
6848
  headingId: "design-gallery-related-tools",
@@ -6851,6 +6856,7 @@ Run the job, then show me its log.`,
6851
6856
  role: "A local search index"
6852
6857
  }]
6853
6858
  }, {
6859
+ columns: 1,
6854
6860
  heading: "Shared infrastructure",
6855
6861
  headingId: "design-gallery-related-infra",
6856
6862
  items: [{
@@ -63,7 +63,7 @@ import {
63
63
  marketingProofFrameAddress,
64
64
  proceduralBackdropVariants,
65
65
  proceduralRecipeVersion
66
- } from "../chunk-95p0j72v.js";
66
+ } from "../chunk-nwpcjm48.js";
67
67
  import"../chunk-h4k7yv6x.js";
68
68
  import"../chunk-wzvdn8ey.js";
69
69
  import"../chunk-he8eznb1.js";