@hraness/design-kit 0.36.4 → 0.38.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/ARTICLE_COPY.md +2 -0
- package/MARKETING_PRESET.md +2 -0
- package/README.md +62 -5
- package/dist/browser/index.js +143 -11
- package/dist/{chunk-0s71p361.js → chunk-13bq7myc.js} +2 -1
- package/dist/{chunk-sabcr66p.js → chunk-gpsekwkj.js} +26 -0
- package/dist/{chunk-evb02bc1.js → chunk-kz59614q.js} +48 -1
- package/dist/{chunk-thv5t11w.js → chunk-s222cmt9.js} +1 -1
- package/dist/chunk-san9drwt.js +1807 -0
- package/dist/chunk-z974c20s.js +775 -0
- package/dist/index.js +2 -2
- package/dist/mockups/client.js +6 -654
- package/dist/mockups/index.js +29 -1797
- package/dist/provider-marks.js +1 -1
- package/dist/react/index.js +196 -19
- package/dist/react/server.js +2 -2
- package/dist/stylex-manifest.json +1 -1
- package/dist/stylex.css +28 -16
- package/package.json +2 -1
- package/portfolio-inventory.json +1 -1
- package/src/browser/index.ts +1 -0
- package/src/browser/marketing-header.ts +113 -0
- package/src/browser/sticky-offset.ts +24 -12
- package/src/compiler-foundation.css +1 -0
- package/src/design-gallery.css +12 -0
- package/src/mockups/client.tsx +157 -66
- package/src/mockups/core.tsx +30 -0
- package/src/mockups.css +158 -23
- package/src/provider-marks.generated.ts +8 -0
- package/src/provider-marks.ts +2 -0
- package/src/react/design-gallery.tsx +34 -0
- package/src/react/design-palette.stylex.ts +2 -2
- package/src/react/product-marketing.stylex.ts +1 -0
- package/src/react/theme.stylex.ts +4 -4
- package/src/styles.css +1 -0
- package/vendor/provider-marks/BOOTSTRAP-ICONS-LICENSE +21 -0
- package/vendor/provider-marks/UPSTREAM.md +14 -0
- package/vendor/provider-marks/bootstrap-icons/linkedin.svg +3 -0
- package/vendor/provider-marks/simple-icons/apple.svg +1 -0
package/ARTICLE_COPY.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
The article components (`MarketingArticle`, `ArticleIndex`, and the static `renderArticleHtml` functions) give every Hraness host the same article shape. This guide says what goes in each part and which posts a host may publish. `STYLE.md` still owns voice and conventions, and `MARKETING_COPY.md` owns the product-page slots.
|
|
4
4
|
|
|
5
|
+
Article and index pages use the host's product header, with the same brand mark, home link, navigation, and final appearance control as its homepage. Place that header before and outside the main landmark; the article's own title header remains inside the article. Breadcrumbs and feed links belong in the reading column. Run `inspectMarketingHeader` from `@hraness/design-kit/browser` against every rendered public route so a missing header cannot pass a layout check.
|
|
6
|
+
|
|
5
7
|
A reader arrives with one question. The title names it, the dek answers it in one sentence, and the body shows the evidence.
|
|
6
8
|
|
|
7
9
|
## Parts of an article
|
package/MARKETING_PRESET.md
CHANGED
|
@@ -46,6 +46,8 @@ Editorial marketing uses the Nebula Sans display role at weight 550 with a fluid
|
|
|
46
46
|
|
|
47
47
|
A sticky `.hraness-marketing-header` or `.hraness-marketing-header-surface` publishes `--hraness-sticky-offset` on `html` and on `.hraness-marketing-page`. The token height is the fallback; `StickyOffsetSync` from `@hraness/design-kit/react` or `syncStickyOffset` from `@hraness/design-kit/browser` replaces it with the measured header border box when the chrome wraps. Attach the site header as a direct child of the page, then put the main landmark immediately after it:
|
|
48
48
|
|
|
49
|
+
The default synchronizer updates `html` and every enclosing marketing page or preset scope. This prevents a preset's fallback height from masking the live measurement in article headings or sticky contents lists. An explicit `target` remains scoped to that target. Teardown restores prior inline values. Use the measured variable for document scroll padding instead of a fixed pixel or rem value; public-route inspection can set `stickyOffset: true` after hydration to verify the measurement reaches `main`.
|
|
50
|
+
|
|
49
51
|
```tsx
|
|
50
52
|
import { MarketingMain, MarketingPage, MarketingSiteHeader, StickyOffsetSync } from "@hraness/design-kit/react";
|
|
51
53
|
|
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.
|
|
14
|
+
"@hraness/design-kit": "github:hraness/design-kit#v0.38.0",
|
|
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
|
+
### Tabbed walkthroughs and brand marks
|
|
27
|
+
|
|
28
|
+
Version 0.38.0 draws `StepThrough` as one tabbed selector: the steps and the
|
|
29
|
+
preview share an edge. Below 720px the tabs sit on the preview's top edge
|
|
30
|
+
between one Back and one Next arrow, and the selected tab takes the window
|
|
31
|
+
title-bar color so it reads as part of the frame. When the labels do not fit,
|
|
32
|
+
the other tabs show only their numbers and keep their labels as accessible
|
|
33
|
+
names. At 720px and wider the steps stack on the preview's start edge, flush
|
|
34
|
+
with its square top corner, and Back and Next follow the list. Step
|
|
35
|
+
explanations now sit below the preview on small screens. Product CSS that
|
|
36
|
+
replaced the arrow glyphs, moved the tabs, or reset the preview's corner
|
|
37
|
+
radius should be deleted; it now draws a second arrow or breaks the shared
|
|
38
|
+
edge.
|
|
39
|
+
|
|
40
|
+
`MockupBrandMark` draws a product's mark from the provider-mark registry as an
|
|
41
|
+
app-icon tile or a plain glyph, and draws a neutral monogram for names without
|
|
42
|
+
a registered mark. The registry adds Apple (also matched by "Apple Contacts")
|
|
43
|
+
from Simple Icons and LinkedIn from Bootstrap Icons, with provenance in
|
|
44
|
+
`vendor/provider-marks/UPSTREAM.md`.
|
|
45
|
+
|
|
46
|
+
### Descriptive walkthroughs
|
|
47
|
+
|
|
48
|
+
Version 0.37.0 updates the shared marketing walkthroughs. `StepThrough` puts plain step numbers, labels, and optional `hint` explanations
|
|
49
|
+
in a stacked selector beside the preview when the component is at least 720px
|
|
50
|
+
wide. On smaller screens, Back and Next bracket a scrolling tab strip; the
|
|
51
|
+
selected explanation sits above the preview in a space reserved for the longest
|
|
52
|
+
hint. Controls and frame titles keep the same sizes between steps. Arrow keys
|
|
53
|
+
follow the selector's orientation, Home and End select the first and last step,
|
|
54
|
+
and Tab reaches the active preview.
|
|
55
|
+
|
|
56
|
+
Illustrate the output or activity with a compact mock interface, document,
|
|
57
|
+
timeline, or diagram. `BrowserFrame` can show a conceptual report or saved
|
|
58
|
+
artifact; describe the illustration clearly without implying a shipped GUI.
|
|
59
|
+
Use terminal examples for commands that need to be read. In filled sequences,
|
|
60
|
+
presentation terminals share one type size that fits every authored state.
|
|
61
|
+
The full stylesheet includes the mockup rules and the public gallery shows a
|
|
62
|
+
graphical job walkthrough. Narrow compositions can still import `mockups.css`.
|
|
63
|
+
`ModeShowcase` accepts optional surface hints and reserves the longest complete
|
|
64
|
+
surface, mode, and option explanation, so changing a selection keeps the preview
|
|
65
|
+
in place.
|
|
66
|
+
|
|
67
|
+
### Consistent navigation on every public page
|
|
68
|
+
|
|
69
|
+
Version 0.36.5 adds `inspectMarketingHeader` to the browser entry. Public-route checks now have a shared way to require a branded header before `main`, compare its home link and mark with the homepage, and verify visible layout and the final appearance control. Use the same product header on articles, documentation, and normal status pages.
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
import { inspectMarketingHeader } from "@hraness/design-kit/browser";
|
|
73
|
+
|
|
74
|
+
const header = await page.evaluate(inspectMarketingHeader, {
|
|
75
|
+
brandLabel: "Relay home",
|
|
76
|
+
brandMark: "/marks/relay.svg",
|
|
77
|
+
});
|
|
78
|
+
assert.deepEqual(header.problems, []);
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The inspector is read-only and returns serializable evidence. Set `measure: false` only for unrendered DOM unit tests; fixed-theme pages may explicitly set `appearance: "omitted"`. Set `stickyOffset: true` after hydration to check live header clearance. The default sticky synchronizer now publishes the measured height to the document and enclosing preset scopes, so local fallback heights cannot mask it. Run the inspector on every public route at phone and desktop widths. Missing-header and missing-layout examples fail the shared browser tests.
|
|
82
|
+
|
|
26
83
|
### System appearance before JavaScript
|
|
27
84
|
|
|
28
85
|
Version 0.36.4 keeps the document’s system appearance when the final compiled stylesheet loads after the palette foundation. Explicit light and dark documents and nested examples keep their selected appearance.
|
|
@@ -46,7 +103,7 @@ for iMessage, WhatsApp, Beeper, Ollama, and Vercel.
|
|
|
46
103
|
In fill mode, `ModeShowcase` renders each authored surface/mode/option combination
|
|
47
104
|
as a hidden, inert, nonanimated measurement fixture. Render functions must be
|
|
48
105
|
pure and provide complete content. The limit is 128 combinations. Visible
|
|
49
|
-
presentation terminals
|
|
106
|
+
presentation terminals share one fitted type size within that shared maximum;
|
|
50
107
|
changing a mode or option never changes the reserved height. At narrower widths
|
|
51
108
|
or larger user text settings, the stage can grow to keep the full content readable.
|
|
52
109
|
Natural mode retains its existing scaling and page-height behavior.
|
|
@@ -795,7 +852,7 @@ bun run browser:install
|
|
|
795
852
|
bun run check
|
|
796
853
|
```
|
|
797
854
|
|
|
798
|
-
The stable dependency pair for this release is `@hraness/ui` `v0.5.17` with `@hraness/design-kit` `v0.36.4`. 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.
|
|
855
|
+
The stable dependency pair for this release is `@hraness/ui` `v0.5.17` with `@hraness/design-kit` `v0.38.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.
|
|
799
856
|
|
|
800
857
|
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.
|
|
801
858
|
|
|
@@ -821,7 +878,7 @@ width from size-contained children. For a figure in a grid with
|
|
|
821
878
|
`justify-items: start`, set `justify-self: stretch`, `inline-size: 100%`, and
|
|
822
879
|
`min-inline-size: 0` on the figure. Keep its maximum width in the product layout.
|
|
823
880
|
|
|
824
|
-
`MarketingPillars` accepts `presentation="benefits"` for a generous open grid with optional decorative `icon`, a short `label`, and one-sentence `summary`. Use explicit columns for six-item grids. Keep statistical evidence in the numerical components; benefits do not need oversized numbers. `StepThrough` uses
|
|
881
|
+
`MarketingPillars` accepts `presentation="benefits"` for a generous open grid with optional decorative `icon`, a short `label`, and one-sentence `summary`. Use explicit columns for six-item grids. Keep statistical evidence in the numerical components; benefits do not need oversized numbers. `StepThrough` uses a descriptive left selector on wide screens and a top tab strip on compact screens, with Back and Next above the preview, plain muted step numbers, and a screen-reader-only progress announcement. Optional hints remain visible beside their labels or above the compact preview. Its render functions stay mounted; use pure mockups and keep inactive panels inert.
|
|
825
882
|
|
|
826
883
|
Icon cards keep a square mark beside the full title and summary while the copy
|
|
827
884
|
has at least 10rem of reading width. When the card is narrower, including at
|
|
@@ -836,7 +893,7 @@ For a sequence that mixes terminals and reports, use `StepThrough fit="fill"`.
|
|
|
836
893
|
Each frame fills the tallest complete slide at the current width; selecting a
|
|
837
894
|
step leaves that height unchanged. This mode wraps content without scaling it,
|
|
838
895
|
so `minWidth` applies only to the default natural layout. Set
|
|
839
|
-
`TerminalFrame density="presentation"` inside that walkthrough to fit complete terminal lines between
|
|
896
|
+
`TerminalFrame density="presentation"` inside that walkthrough to fit complete terminal lines at one shared size between
|
|
840
897
|
1rem and 4rem in the available width and height, without adding line wraps beyond
|
|
841
898
|
the readable baseline. Keep the full lines stable
|
|
842
899
|
while animating their reveal. Text zoom can increase the natural stage height.
|
package/dist/browser/index.js
CHANGED
|
@@ -1529,6 +1529,112 @@ function attachFoil(root) {
|
|
|
1529
1529
|
function attachHeroLight(root) {
|
|
1530
1530
|
return () => {};
|
|
1531
1531
|
}
|
|
1532
|
+
// src/browser/marketing-header.ts
|
|
1533
|
+
function inspectMarketingHeader(options = {}, document = globalThis.document) {
|
|
1534
|
+
const problems = [];
|
|
1535
|
+
const headers = document.querySelectorAll('header[data-hraness-marketing="header"], header.hraness-marketing-header, header.hraness-marketing-header-surface');
|
|
1536
|
+
const appearances = document.querySelectorAll("[data-hraness-appearance-menu]");
|
|
1537
|
+
const mains = document.querySelectorAll("main");
|
|
1538
|
+
const header = headers[0];
|
|
1539
|
+
if (headers.length !== 1)
|
|
1540
|
+
problems.push(`Expected one product header; found ${headers.length}.`);
|
|
1541
|
+
if (mains.length !== 1)
|
|
1542
|
+
problems.push(`Expected one main landmark; found ${mains.length}.`);
|
|
1543
|
+
const appearanceCount = options.appearance === "omitted" ? 0 : 1;
|
|
1544
|
+
if (appearances.length !== appearanceCount)
|
|
1545
|
+
problems.push(`Expected ${appearanceCount} appearance controls; found ${appearances.length}.`);
|
|
1546
|
+
const brand = header?.querySelector("a.hraness-marketing-header__brand");
|
|
1547
|
+
const mark = brand?.querySelector(".hraness-foil-mark");
|
|
1548
|
+
const image = mark?.querySelector("img");
|
|
1549
|
+
const brandHref = brand?.getAttribute("href") ?? null;
|
|
1550
|
+
const brandLabel = (brand?.getAttribute("aria-label") ?? brand?.textContent)?.trim() || null;
|
|
1551
|
+
const brandMark = image?.getAttribute("src") ?? null;
|
|
1552
|
+
const nav = header?.querySelector("nav.hraness-marketing-header__nav");
|
|
1553
|
+
const links = [...nav?.querySelectorAll("a[href]") ?? []].map((link) => ({
|
|
1554
|
+
href: link.getAttribute("href") ?? "",
|
|
1555
|
+
label: (link.getAttribute("aria-label") ?? link.textContent)?.trim() ?? ""
|
|
1556
|
+
}));
|
|
1557
|
+
if (header !== undefined) {
|
|
1558
|
+
const main = mains[0];
|
|
1559
|
+
if (main !== undefined && (main.contains(header) || header.contains(main) || !(header.compareDocumentPosition(main) & 4))) {
|
|
1560
|
+
problems.push("The product header must precede and sit outside the main landmark.");
|
|
1561
|
+
}
|
|
1562
|
+
if (brandHref !== (options.brandHref ?? "/"))
|
|
1563
|
+
problems.push("The product home link is missing or points to a different page.");
|
|
1564
|
+
if (brandLabel === null || options.brandLabel !== undefined && brandLabel !== options.brandLabel)
|
|
1565
|
+
problems.push("The product home link has a missing or inconsistent name.");
|
|
1566
|
+
if (brand?.hasAttribute("data-foil") !== true || mark === null || mark === undefined || image === null || image === undefined || !mark.querySelector(".hraness-foil-mark__paint") || !brandMark) {
|
|
1567
|
+
problems.push("The product home link is missing its foil mark and artwork fallback.");
|
|
1568
|
+
} else if (options.brandMark !== undefined && brandMark !== options.brandMark) {
|
|
1569
|
+
problems.push("The product header uses different mark artwork.");
|
|
1570
|
+
}
|
|
1571
|
+
if (!nav || !(nav.getAttribute("aria-label")?.trim() || nav.getAttribute("aria-labelledby")?.trim()) || links.length === 0 || links.some((link) => !link.label)) {
|
|
1572
|
+
problems.push("The product header needs a named navigation with readable links.");
|
|
1573
|
+
}
|
|
1574
|
+
const appearance = appearances[0];
|
|
1575
|
+
const actions = header.querySelector(".hraness-marketing-header__actions");
|
|
1576
|
+
if (appearanceCount === 1 && appearance !== undefined) {
|
|
1577
|
+
if (!actions?.contains(appearance) || !actions.lastElementChild?.contains(appearance)) {
|
|
1578
|
+
problems.push("Appearance must be the final product-header action.");
|
|
1579
|
+
}
|
|
1580
|
+
if (!appearance.querySelector(":scope > summary, :scope > button, button.hraness-design-theme-toggle__trigger"))
|
|
1581
|
+
problems.push("Appearance is missing its trigger.");
|
|
1582
|
+
}
|
|
1583
|
+
if (options.measure !== false) {
|
|
1584
|
+
const view = document.defaultView;
|
|
1585
|
+
if (view === null)
|
|
1586
|
+
problems.push("Rendered header inspection requires a browser window.");
|
|
1587
|
+
else {
|
|
1588
|
+
const trigger = appearance?.querySelector(":scope > summary, :scope > button, button.hraness-design-theme-toggle__trigger");
|
|
1589
|
+
for (const [name, element] of [["header", header], ["brand", brand], ["mark", mark], ["navigation", nav], ["appearance", appearanceCount === 1 ? appearance : null], ["appearance trigger", appearanceCount === 1 ? trigger : null]]) {
|
|
1590
|
+
if (!element)
|
|
1591
|
+
continue;
|
|
1592
|
+
const box2 = element.getBoundingClientRect();
|
|
1593
|
+
let hidden = false;
|
|
1594
|
+
for (let ancestor = element;ancestor !== null; ancestor = ancestor.parentElement) {
|
|
1595
|
+
const style = view.getComputedStyle(ancestor);
|
|
1596
|
+
if (style.display === "none" || style.visibility === "hidden" || style.visibility === "collapse" || Number(style.opacity) === 0)
|
|
1597
|
+
hidden = true;
|
|
1598
|
+
}
|
|
1599
|
+
if (box2.width <= 0 || box2.height <= 0 || hidden)
|
|
1600
|
+
problems.push(`The product ${name} is not visible.`);
|
|
1601
|
+
}
|
|
1602
|
+
const box = header.getBoundingClientRect();
|
|
1603
|
+
if (box.left < -1 || box.right > view.innerWidth + 1)
|
|
1604
|
+
problems.push("The product header extends outside the viewport.");
|
|
1605
|
+
const inner = header.querySelector(".hraness-marketing-header__inner");
|
|
1606
|
+
if (!inner || !["grid", "flex"].includes(view.getComputedStyle(inner).display))
|
|
1607
|
+
problems.push("The shared product-header layout styles are missing.");
|
|
1608
|
+
if (options.stickyOffset === true && view.getComputedStyle(header).position === "sticky") {
|
|
1609
|
+
for (const target of [document.documentElement, mains[0]]) {
|
|
1610
|
+
if (!target)
|
|
1611
|
+
continue;
|
|
1612
|
+
const offset = Number.parseFloat(view.getComputedStyle(target).getPropertyValue("--hraness-sticky-offset"));
|
|
1613
|
+
if (!Number.isFinite(offset) || Math.abs(offset - box.height) > 1)
|
|
1614
|
+
problems.push("Sticky clearance does not match the measured product header.");
|
|
1615
|
+
}
|
|
1616
|
+
}
|
|
1617
|
+
if (appearanceCount === 1 && trigger) {
|
|
1618
|
+
const triggerBox = trigger.getBoundingClientRect();
|
|
1619
|
+
if (triggerBox.width < 43.5 || triggerBox.height < 43.5)
|
|
1620
|
+
problems.push("The appearance trigger is smaller than 44px.");
|
|
1621
|
+
const actionLinks = actions?.querySelectorAll("a[href]") ?? [];
|
|
1622
|
+
if ([...actionLinks].some((link) => link.getBoundingClientRect().right > triggerBox.right + 1))
|
|
1623
|
+
problems.push("Appearance is not the rightmost header action.");
|
|
1624
|
+
}
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
}
|
|
1628
|
+
return {
|
|
1629
|
+
headerCount: headers.length,
|
|
1630
|
+
appearanceCount: appearances.length,
|
|
1631
|
+
brandHref,
|
|
1632
|
+
brandLabel,
|
|
1633
|
+
brandMark,
|
|
1634
|
+
links,
|
|
1635
|
+
problems
|
|
1636
|
+
};
|
|
1637
|
+
}
|
|
1532
1638
|
// src/status-page.ts
|
|
1533
1639
|
var STATUS_PAGE_MAX_ROUTES = 2000;
|
|
1534
1640
|
function isSitePath(href) {
|
|
@@ -2260,18 +2366,23 @@ function resolveHeader(root, header) {
|
|
|
2260
2366
|
return root.querySelector(header);
|
|
2261
2367
|
return root.querySelector(stickyOffsetHeaderSelector);
|
|
2262
2368
|
}
|
|
2263
|
-
function
|
|
2369
|
+
function resolveTargets(header, target) {
|
|
2264
2370
|
if (target !== undefined)
|
|
2265
|
-
return target;
|
|
2266
|
-
const
|
|
2267
|
-
|
|
2371
|
+
return [target];
|
|
2372
|
+
const targets = new Set([header.ownerDocument.documentElement]);
|
|
2373
|
+
for (let ancestor = header;ancestor !== null; ancestor = ancestor.parentElement) {
|
|
2374
|
+
if (ancestor.matches(".hraness-marketing-page, [data-hraness-marketing-preset]"))
|
|
2375
|
+
targets.add(ancestor);
|
|
2376
|
+
}
|
|
2377
|
+
return [...targets];
|
|
2268
2378
|
}
|
|
2269
2379
|
function measureStickyOffset(header) {
|
|
2270
2380
|
return `${header.getBoundingClientRect().height}px`;
|
|
2271
2381
|
}
|
|
2272
2382
|
function publishStickyOffset(header, target) {
|
|
2273
2383
|
const value = measureStickyOffset(header);
|
|
2274
|
-
|
|
2384
|
+
for (const destination of resolveTargets(header, target))
|
|
2385
|
+
destination.style.setProperty(stickyOffsetCustomProperty, value);
|
|
2275
2386
|
return value;
|
|
2276
2387
|
}
|
|
2277
2388
|
function syncStickyOffset(options = {}) {
|
|
@@ -2282,22 +2393,42 @@ function syncStickyOffset(options = {}) {
|
|
|
2282
2393
|
const header = resolveHeader(root, options.header);
|
|
2283
2394
|
if (header === null)
|
|
2284
2395
|
return () => {};
|
|
2285
|
-
const
|
|
2396
|
+
const targets = resolveTargets(header, options.target);
|
|
2397
|
+
const prior = targets.map((target) => ({
|
|
2398
|
+
target,
|
|
2399
|
+
value: target.style.getPropertyValue(stickyOffsetCustomProperty),
|
|
2400
|
+
priority: typeof target.style.getPropertyPriority === "function" ? target.style.getPropertyPriority(stickyOffsetCustomProperty) : ""
|
|
2401
|
+
}));
|
|
2402
|
+
let published;
|
|
2286
2403
|
const publish = () => {
|
|
2287
|
-
|
|
2404
|
+
published = measureStickyOffset(header);
|
|
2405
|
+
for (const target of targets)
|
|
2406
|
+
target.style.setProperty(stickyOffsetCustomProperty, published);
|
|
2407
|
+
};
|
|
2408
|
+
const restore = () => {
|
|
2409
|
+
for (const {
|
|
2410
|
+
target,
|
|
2411
|
+
value,
|
|
2412
|
+
priority
|
|
2413
|
+
} of prior) {
|
|
2414
|
+
if (target.style.getPropertyValue(stickyOffsetCustomProperty) !== published || typeof target.style.getPropertyPriority === "function" && target.style.getPropertyPriority(stickyOffsetCustomProperty) !== "")
|
|
2415
|
+
continue;
|
|
2416
|
+
if (value)
|
|
2417
|
+
target.style.setProperty(stickyOffsetCustomProperty, value, priority);
|
|
2418
|
+
else
|
|
2419
|
+
target.style.removeProperty(stickyOffsetCustomProperty);
|
|
2420
|
+
}
|
|
2288
2421
|
};
|
|
2289
2422
|
publish();
|
|
2290
2423
|
const view = document.defaultView;
|
|
2291
2424
|
if (view === null || typeof view.ResizeObserver !== "function") {
|
|
2292
|
-
return
|
|
2293
|
-
target.style.removeProperty(stickyOffsetCustomProperty);
|
|
2294
|
-
};
|
|
2425
|
+
return restore;
|
|
2295
2426
|
}
|
|
2296
2427
|
const observer = new view.ResizeObserver(publish);
|
|
2297
2428
|
observer.observe(header);
|
|
2298
2429
|
return () => {
|
|
2299
2430
|
observer.disconnect();
|
|
2300
|
-
|
|
2431
|
+
restore();
|
|
2301
2432
|
};
|
|
2302
2433
|
}
|
|
2303
2434
|
|
|
@@ -2324,6 +2455,7 @@ export {
|
|
|
2324
2455
|
measureStickyOffset,
|
|
2325
2456
|
isDesignTheme2 as isDesignTheme,
|
|
2326
2457
|
installAppearanceMenus2 as installAppearanceMenus,
|
|
2458
|
+
inspectMarketingHeader,
|
|
2327
2459
|
initDesignPalette,
|
|
2328
2460
|
downloadBlob,
|
|
2329
2461
|
designThemes2 as designThemes,
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
providerMark,
|
|
31
31
|
providerMarkFallback,
|
|
32
32
|
providerMarkOnAccent
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-gpsekwkj.js";
|
|
34
34
|
|
|
35
35
|
// src/react/provider-mark.stylex.ts
|
|
36
36
|
import * as stylex from "@stylexjs/stylex";
|
|
@@ -448,6 +448,7 @@ var marketingStyles = {
|
|
|
448
448
|
$$css: true
|
|
449
449
|
},
|
|
450
450
|
header: {
|
|
451
|
+
"--hraness-marketing-header-control-target": "xlhppvv",
|
|
451
452
|
"--hraness-sticky-offset": "x1ez4kp7",
|
|
452
453
|
kMwMTN: "xtylnni xs5hli",
|
|
453
454
|
knIRL8: "xrtw95r",
|
|
@@ -34,6 +34,13 @@ var providerMarkAssets = {
|
|
|
34
34
|
},
|
|
35
35
|
art: null
|
|
36
36
|
},
|
|
37
|
+
apple: {
|
|
38
|
+
glyph: {
|
|
39
|
+
viewBox: "0 0 24 24",
|
|
40
|
+
body: '<path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"/>'
|
|
41
|
+
},
|
|
42
|
+
art: null
|
|
43
|
+
},
|
|
37
44
|
beeper: {
|
|
38
45
|
glyph: {
|
|
39
46
|
viewBox: "62 47 114 143",
|
|
@@ -149,6 +156,13 @@ var providerMarkAssets = {
|
|
|
149
156
|
},
|
|
150
157
|
art: null
|
|
151
158
|
},
|
|
159
|
+
linkedin: {
|
|
160
|
+
glyph: {
|
|
161
|
+
viewBox: "0 0 16 16",
|
|
162
|
+
body: '<path d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854zm4.943 12.248V6.169H2.542v7.225zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248S2.4 3.226 2.4 3.934c0 .694.521 1.248 1.327 1.248zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016l.016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225z"/>'
|
|
163
|
+
},
|
|
164
|
+
art: null
|
|
165
|
+
},
|
|
152
166
|
mem0: {
|
|
153
167
|
glyph: {
|
|
154
168
|
viewBox: "0 0 100 100",
|
|
@@ -342,6 +356,12 @@ var MARK_SPECS = {
|
|
|
342
356
|
kind: "vendor",
|
|
343
357
|
name: "Anthropic"
|
|
344
358
|
},
|
|
359
|
+
apple: {
|
|
360
|
+
accent: "#000000",
|
|
361
|
+
aliases: ["apple", "apple contacts", "macos contacts"],
|
|
362
|
+
kind: "vendor",
|
|
363
|
+
name: "Apple"
|
|
364
|
+
},
|
|
345
365
|
beeper: {
|
|
346
366
|
accent: "#6953f2",
|
|
347
367
|
aliases: ["beeper", "beeper chat"],
|
|
@@ -420,6 +440,12 @@ var MARK_SPECS = {
|
|
|
420
440
|
kind: "vendor",
|
|
421
441
|
name: "iMessage"
|
|
422
442
|
},
|
|
443
|
+
linkedin: {
|
|
444
|
+
accent: "#0a66c2",
|
|
445
|
+
aliases: ["linkedin", "linked in", "linkedin export"],
|
|
446
|
+
kind: "vendor",
|
|
447
|
+
name: "LinkedIn"
|
|
448
|
+
},
|
|
423
449
|
mem0: {
|
|
424
450
|
accent: "#cbb2ff",
|
|
425
451
|
aliases: ["mem0", "memzero"],
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
providerMark,
|
|
3
|
+
providerMarkMonogram,
|
|
4
|
+
providerMarkOnAccent
|
|
5
|
+
} from "./chunk-gpsekwkj.js";
|
|
6
|
+
|
|
1
7
|
// src/mockups/core.tsx
|
|
2
8
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
3
9
|
function joinMockupClasses(...values) {
|
|
@@ -501,6 +507,47 @@ function MockupGlyph({
|
|
|
501
507
|
children: GLYPHS[name]
|
|
502
508
|
});
|
|
503
509
|
}
|
|
510
|
+
function MockupBrandMark({
|
|
511
|
+
className,
|
|
512
|
+
name,
|
|
513
|
+
size = 32,
|
|
514
|
+
variant = "tile"
|
|
515
|
+
}) {
|
|
516
|
+
if (!(size > 0))
|
|
517
|
+
throw new RangeError("MockupBrandMark size must be positive.");
|
|
518
|
+
const mark = providerMark(name);
|
|
519
|
+
const style = {
|
|
520
|
+
"--hkm-mark-size": `${String(size)}px`,
|
|
521
|
+
...mark === undefined || variant !== "tile" ? {} : {
|
|
522
|
+
"--hkm-mark-accent": mark.accent,
|
|
523
|
+
"--hkm-mark-ink": providerMarkOnAccent(mark)
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
if (mark === undefined) {
|
|
527
|
+
return /* @__PURE__ */ jsx("span", {
|
|
528
|
+
"aria-hidden": "true",
|
|
529
|
+
className: joinMockupClasses("hkm-brand-mark", className),
|
|
530
|
+
"data-hkm-monogram": "",
|
|
531
|
+
style,
|
|
532
|
+
children: providerMarkMonogram(name)
|
|
533
|
+
});
|
|
534
|
+
}
|
|
535
|
+
return /* @__PURE__ */ jsx("span", {
|
|
536
|
+
"aria-hidden": "true",
|
|
537
|
+
className: joinMockupClasses("hkm-brand-mark", className),
|
|
538
|
+
"data-hkm-mark": mark.id,
|
|
539
|
+
"data-hkm-variant": variant,
|
|
540
|
+
style,
|
|
541
|
+
children: /* @__PURE__ */ jsx("svg", {
|
|
542
|
+
dangerouslySetInnerHTML: {
|
|
543
|
+
__html: mark.glyph.body
|
|
544
|
+
},
|
|
545
|
+
fill: "currentColor",
|
|
546
|
+
focusable: "false",
|
|
547
|
+
viewBox: mark.glyph.viewBox
|
|
548
|
+
})
|
|
549
|
+
});
|
|
550
|
+
}
|
|
504
551
|
function WindowLights() {
|
|
505
552
|
return /* @__PURE__ */ jsxs("span", {
|
|
506
553
|
"aria-hidden": "true",
|
|
@@ -513,4 +560,4 @@ function WindowLights() {
|
|
|
513
560
|
});
|
|
514
561
|
}
|
|
515
562
|
|
|
516
|
-
export { joinMockupClasses, assertMockupDescription, MockupRoot, SampleText, SampleParagraphs, compact, mockupHash, mockupInitials, Avatar, PlaceholderPhoto, ScrollFade, Hotspot, mockupGlyphNames, MockupGlyph, WindowLights };
|
|
563
|
+
export { joinMockupClasses, assertMockupDescription, MockupRoot, SampleText, SampleParagraphs, compact, mockupHash, mockupInitials, Avatar, PlaceholderPhoto, ScrollFade, Hotspot, mockupGlyphNames, MockupGlyph, MockupBrandMark, WindowLights };
|