@hraness/design-kit 0.33.0 → 0.35.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 +19 -3
- package/dist/{chunk-mr1vdcjq.js → chunk-8xfssb9c.js} +6 -3
- package/dist/{chunk-95mpmzc9.js → chunk-c9mhn3yb.js} +1130 -442
- package/dist/{chunk-h4k7yv6x.js → chunk-fjf81bww.js} +28 -2
- package/dist/chunk-gmea6p0d.js +13 -0
- package/dist/index.js +5 -1
- package/dist/mockups/client.js +50 -15
- package/dist/portfolio.js +586 -85
- package/dist/react/index.js +141 -13
- package/dist/react/platform-install.js +3 -2
- package/dist/react/server.js +17 -3
- package/dist/stylex-manifest.json +1 -1
- package/dist/stylex.css +350 -36
- package/package.json +14 -3
- package/portfolio-inventory.json +1 -1
- package/src/diagrams.ts +11 -0
- package/src/index.ts +2 -0
- package/src/marketing-comparison.css +162 -0
- package/src/marketing-diagram.css +24 -0
- package/src/mockups/client.tsx +25 -17
- package/src/mockups.css +19 -0
- package/src/plain-publication.css +9 -6
- package/src/portfolio.generated.json +578 -86
- package/src/portfolio.generated.ts +578 -86
- package/src/portfolio.ts +73 -0
- package/src/product-marketing-foundation.css +29 -0
- package/src/product-marketing.css +136 -39
- package/src/react/article.tsx +2 -2
- package/src/react/design-gallery.tsx +37 -8
- package/src/react/index.ts +3 -0
- package/src/react/marketing-account.stylex.ts +74 -0
- package/src/react/marketing-account.tsx +69 -0
- package/src/react/marketing-comparison.stylex.ts +24 -0
- package/src/react/marketing-comparison.tsx +73 -0
- package/src/react/marketing-diagram.stylex.ts +8 -0
- package/src/react/marketing-diagram.tsx +33 -0
- package/src/react/platform-install.stylex.ts +2 -1
- package/src/react/platform-install.tsx +2 -1
- package/src/react/product-marketing.stylex.ts +144 -111
- package/src/react/product-marketing.tsx +83 -45
- package/src/react/server.ts +3 -0
- package/src/styles.css +2 -0
- package/src/typography.css +32 -0
- /package/dist/{chunk-4d79eskk.js → chunk-c80g58j1.js} +0 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as stylex from "@stylexjs/stylex";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
|
|
4
|
+
import { marketingAccountStyles as styles } from "./marketing-account.stylex.js";
|
|
5
|
+
|
|
6
|
+
/** Optional account access near the end of a product's marketing page. */
|
|
7
|
+
export function MarketingAccount({
|
|
8
|
+
children,
|
|
9
|
+
className,
|
|
10
|
+
heading = "Your account",
|
|
11
|
+
id = "account",
|
|
12
|
+
summary,
|
|
13
|
+
}: Readonly<{
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
heading?: string;
|
|
17
|
+
id?: string;
|
|
18
|
+
summary: ReactNode;
|
|
19
|
+
}>) {
|
|
20
|
+
const presentation = stylex.props(styles.section);
|
|
21
|
+
return (
|
|
22
|
+
<section
|
|
23
|
+
{...presentation}
|
|
24
|
+
aria-labelledby={`${id}-heading`}
|
|
25
|
+
className={["hraness-marketing-account", presentation.className, className].filter(Boolean).join(" ")}
|
|
26
|
+
id={id}
|
|
27
|
+
>
|
|
28
|
+
<div {...stylex.props(styles.copy)}>
|
|
29
|
+
<h2 {...stylex.props(styles.heading)} id={`${id}-heading`}>{heading}</h2>
|
|
30
|
+
<div {...stylex.props(styles.summary)}>{summary}</div>
|
|
31
|
+
</div>
|
|
32
|
+
<div {...stylex.props(styles.content)}>{children}</div>
|
|
33
|
+
</section>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MarketingAccountAction {
|
|
38
|
+
readonly href: string;
|
|
39
|
+
readonly analyticsEvent?: string;
|
|
40
|
+
readonly analyticsId?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** One prominent account action and an optional, equally tall sign-in link. */
|
|
44
|
+
export function MarketingAccountActions({ primary, signIn }: Readonly<{
|
|
45
|
+
primary: MarketingAccountAction & Readonly<{ label: string }>;
|
|
46
|
+
signIn?: MarketingAccountAction;
|
|
47
|
+
}>) {
|
|
48
|
+
return (
|
|
49
|
+
<div {...stylex.props(styles.actions)} className={`hraness-marketing-account__actions ${stylex.props(styles.actions).className}`}>
|
|
50
|
+
<a
|
|
51
|
+
{...stylex.props(styles.primary)}
|
|
52
|
+
className={`hraness-marketing-account__primary ${stylex.props(styles.primary).className}`}
|
|
53
|
+
data-analytics-event={primary.analyticsEvent}
|
|
54
|
+
data-analytics-id={primary.analyticsId}
|
|
55
|
+
data-emphasis="primary"
|
|
56
|
+
href={primary.href}
|
|
57
|
+
>{primary.label}</a>
|
|
58
|
+
{signIn === undefined ? null : (
|
|
59
|
+
<a
|
|
60
|
+
{...stylex.props(styles.signIn)}
|
|
61
|
+
className={`hraness-marketing-account__sign-in ${stylex.props(styles.signIn).className}`}
|
|
62
|
+
data-analytics-event={signIn.analyticsEvent}
|
|
63
|
+
data-analytics-id={signIn.analyticsId}
|
|
64
|
+
href={signIn.href}
|
|
65
|
+
>Sign in</a>
|
|
66
|
+
)}
|
|
67
|
+
</div>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as stylex from "@stylexjs/stylex";
|
|
2
|
+
|
|
3
|
+
export const comparisonStyles = stylex.create({
|
|
4
|
+
figure: { "margin": "0", "min-inline-size": "0", "color": "var(--hraness-marketing-ink, var(--foreground))", "font-family": "var(--font-text)" },
|
|
5
|
+
scroll: { "overflow-x": "auto", "max-inline-size": "100%", "outline": { "default": null, ":focus-visible": "2px solid var(--primary)" }, "outline-offset": { "default": null, ":focus-visible": "3px" } },
|
|
6
|
+
table: { "inline-size": "100%", "border-collapse": "collapse", "text-align": "start", "font-size": "0.9375rem", "line-height": "1.4" },
|
|
7
|
+
caption: { "padding-block-end": "1.25rem", "text-align": "start", "font-size": "1.125rem", "font-weight": "550", "color": "var(--foreground)" },
|
|
8
|
+
corner: { "min-inline-size": "9rem", "border-block-end": "1px solid var(--line)" },
|
|
9
|
+
option: { "padding": "1rem", "min-inline-size": "8.5rem", "border-block-end": "1px solid var(--line)", "vertical-align": "bottom", "font-weight": "600" },
|
|
10
|
+
optionLabel: { "display": "flex", "align-items": "center", "gap": "0.6rem" },
|
|
11
|
+
mark: { "object-fit": "contain", "flex-shrink": "0", "inline-size": "1.5rem", "block-size": "1.5rem" },
|
|
12
|
+
rowLabel: { "padding": "1rem 1rem 1rem 0", "min-inline-size": "9rem", "max-inline-size": "15rem", "border-block-end": "1px solid var(--line)", "vertical-align": "top", "font-weight": "500" },
|
|
13
|
+
cell: { "padding": "1rem", "border-block-end": "1px solid var(--line)", "vertical-align": "top" },
|
|
14
|
+
highlight: { "background-color": { "default": "color-mix(in srgb, var(--primary) 5%, transparent)", "@media (forced-colors: active)": "Canvas" }, "color": "var(--foreground)" },
|
|
15
|
+
value: { "display": "grid", "gap": "0.25rem" },
|
|
16
|
+
label: { "display": "flex", "align-items": "flex-start", "gap": "0.45rem" },
|
|
17
|
+
glyph: { "flex-shrink": "0", "margin-block-start": "0.1rem", "inline-size": "1.125rem", "block-size": "1.125rem" },
|
|
18
|
+
positive: { "color": { "default": "var(--hraness-studio-emerald)", "@media (forced-colors: active)": "CanvasText" } },
|
|
19
|
+
negative: { "color": { "default": "var(--muted)", "@media (forced-colors: active)": "CanvasText" } },
|
|
20
|
+
conditional: { "color": { "default": "var(--hraness-studio-amber)", "@media (forced-colors: active)": "CanvasText" } },
|
|
21
|
+
text: { "font-variant-numeric": "tabular-nums" },
|
|
22
|
+
detail: { "display": "block", "color": "var(--muted)", "font-size": "0.8125rem", "font-weight": "400", "line-height": "1.45", "margin-block-start": "0.2rem", "max-inline-size": "26ch" },
|
|
23
|
+
note: { "color": "var(--muted)", "font-size": "0.875rem", "line-height": "1.5", "margin-block-start": "1rem", "max-inline-size": "76ch" },
|
|
24
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import * as stylex from "@stylexjs/stylex";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { ComparisonGlyph } from "./article.js";
|
|
4
|
+
import { comparisonStyles as styles } from "./marketing-comparison.stylex.js";
|
|
5
|
+
|
|
6
|
+
export type MarketingComparisonStatus = "yes" | "no" | "partial" | "optional" | "depends";
|
|
7
|
+
export type MarketingComparisonValue = boolean | "partial" | string | Readonly<{
|
|
8
|
+
status: MarketingComparisonStatus;
|
|
9
|
+
label?: string;
|
|
10
|
+
detail?: string;
|
|
11
|
+
}>;
|
|
12
|
+
export interface MarketingComparisonOption { readonly name: string; readonly mark?: string }
|
|
13
|
+
export interface MarketingComparisonRow {
|
|
14
|
+
readonly label: string;
|
|
15
|
+
readonly values: readonly MarketingComparisonValue[];
|
|
16
|
+
readonly note?: string;
|
|
17
|
+
}
|
|
18
|
+
const labels = { yes: "Yes", no: "No", partial: "Partly", optional: "Optional", depends: "Depends" } as const;
|
|
19
|
+
|
|
20
|
+
function presentation(slot: string, props: ReturnType<typeof stylex.props>) {
|
|
21
|
+
const hook = slot.replace(/[A-Z]/gu, (letter) => `-${letter.toLowerCase()}`);
|
|
22
|
+
return { ...props, className: `hraness-marketing-comparison__${hook} ${props.className}` };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function Value({ value }: Readonly<{ value: MarketingComparisonValue }>) {
|
|
26
|
+
if (typeof value === "string" && value !== "partial") return <span {...presentation("text", stylex.props(styles.text))}>{value}</span>;
|
|
27
|
+
const status = typeof value === "object" ? value.status : value === true ? "yes" : value === false ? "no" : "partial";
|
|
28
|
+
const label = typeof value === "object" ? value.label ?? labels[status] : labels[status];
|
|
29
|
+
const detail = typeof value === "object" ? value.detail : undefined;
|
|
30
|
+
return <div {...presentation("value", stylex.props(styles.value))} data-comparison-status={status}>
|
|
31
|
+
<span {...presentation("label", stylex.props(styles.label))}>
|
|
32
|
+
<ComparisonGlyph className={`hraness-marketing-comparison__glyph ${stylex.props(styles.glyph, status === "yes" ? styles.positive : status === "no" ? styles.negative : styles.conditional).className}`}
|
|
33
|
+
kind={status === "yes" || status === "no" ? status : "partial"} />
|
|
34
|
+
<span>{label}</span>
|
|
35
|
+
</span>
|
|
36
|
+
{detail === undefined ? null : <small {...presentation("detail", stylex.props(styles.detail))}>{detail}</small>}
|
|
37
|
+
</div>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Concise product comparisons with visible words for every icon and conditional claim. */
|
|
41
|
+
export function MarketingComparison({ caption, className, highlight, id, note, options, rows }: Readonly<{
|
|
42
|
+
caption: string;
|
|
43
|
+
className?: string;
|
|
44
|
+
highlight?: number;
|
|
45
|
+
id?: string;
|
|
46
|
+
note?: ReactNode;
|
|
47
|
+
options: readonly MarketingComparisonOption[];
|
|
48
|
+
rows: readonly MarketingComparisonRow[];
|
|
49
|
+
}>) {
|
|
50
|
+
if (caption.trim() === "") throw new RangeError("Marketing comparison needs a caption.");
|
|
51
|
+
if (options.length === 0) throw new RangeError("Marketing comparison needs at least one option.");
|
|
52
|
+
if (highlight !== undefined && (!Number.isInteger(highlight) || highlight < 0 || highlight >= options.length)) throw new RangeError("Marketing comparison highlight must be an option index.");
|
|
53
|
+
for (const row of rows) if (row.values.length !== options.length) throw new RangeError(`Marketing comparison row ${JSON.stringify(row.label)} must have one value per option.`);
|
|
54
|
+
return <figure {...presentation("figure", stylex.props(styles.figure))} className={["hraness-marketing-comparison", stylex.props(styles.figure).className, className].filter(Boolean).join(" ")} id={id}>
|
|
55
|
+
<div {...presentation("scroll", stylex.props(styles.scroll))} aria-label={caption} role="region" tabIndex={0}>
|
|
56
|
+
<table {...presentation("table", stylex.props(styles.table))}>
|
|
57
|
+
<caption {...presentation("caption", stylex.props(styles.caption))}>{caption}</caption>
|
|
58
|
+
<thead><tr><td {...presentation("corner", stylex.props(styles.corner))} />{options.map((option, index) =>
|
|
59
|
+
<th {...presentation("option", stylex.props(styles.option, index === highlight && styles.highlight))} data-highlight={index === highlight ? "" : undefined} key={option.name} scope="col">
|
|
60
|
+
<span {...presentation("optionLabel", stylex.props(styles.optionLabel))}>
|
|
61
|
+
{option.mark === undefined ? null : <img alt="" {...presentation("mark", stylex.props(styles.mark))} height={24} src={option.mark} width={24} />}
|
|
62
|
+
<span>{option.name}</span>
|
|
63
|
+
</span>
|
|
64
|
+
</th>)}</tr></thead>
|
|
65
|
+
<tbody>{rows.map((row) => <tr key={row.label}>
|
|
66
|
+
<th {...presentation("rowLabel", stylex.props(styles.rowLabel))} scope="row">{row.label}{row.note === undefined ? null : <small {...presentation("detail", stylex.props(styles.detail))}>{row.note}</small>}</th>
|
|
67
|
+
{row.values.map((value, index) => <td {...presentation("cell", stylex.props(styles.cell, index === highlight && styles.highlight))} data-highlight={index === highlight ? "" : undefined} key={index}><Value value={value} /></td>)}
|
|
68
|
+
</tr>)}</tbody>
|
|
69
|
+
</table>
|
|
70
|
+
</div>
|
|
71
|
+
{note === undefined || note === null ? null : <figcaption {...presentation("note", stylex.props(styles.note))}>{note}</figcaption>}
|
|
72
|
+
</figure>;
|
|
73
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import * as stylex from "@stylexjs/stylex";
|
|
2
|
+
|
|
3
|
+
export const diagramStyles = stylex.create({
|
|
4
|
+
figure: { "margin": "0", "min-inline-size": "0", "color": "var(--foreground)", "font-family": "var(--font-text)" },
|
|
5
|
+
scroll: { "overflow-x": "auto", "max-inline-size": "100%", "outline": { "default": null, ":focus-visible": "2px solid var(--primary)" }, "outline-offset": { "default": null, ":focus-visible": "3px" } },
|
|
6
|
+
canvas: { "display": "block", "inline-size": "100%", "min-inline-size": "40rem", "block-size": "auto", "font-family": "var(--font-text)", "font-size": "20px", "color": "var(--primary)" },
|
|
7
|
+
caption: { "margin-block-start": "1rem", "max-inline-size": "76ch", "color": "var(--muted)", "font-size": "0.875rem", "line-height": "1.5" },
|
|
8
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as stylex from "@stylexjs/stylex";
|
|
2
|
+
import type { ReactNode } from "react";
|
|
3
|
+
import { diagramMetrics } from "../diagrams.js";
|
|
4
|
+
import { diagramStyles as styles } from "./marketing-diagram.stylex.js";
|
|
5
|
+
|
|
6
|
+
/** A bounded arrowhead whose paint follows its connector's stroke. IDs are caller-owned. */
|
|
7
|
+
export function DiagramArrowhead({ id }: Readonly<{ id: string }>) {
|
|
8
|
+
if (id.trim() === "" || /\s/u.test(id)) throw new RangeError("Diagram arrowhead needs one nonempty SVG ID.");
|
|
9
|
+
return <marker id={id} markerHeight={diagramMetrics.arrowheadSize} markerUnits="userSpaceOnUse" markerWidth={diagramMetrics.arrowheadSize} orient="auto-start-reverse" refX="5.5" refY="3" viewBox="0 0 6 6">
|
|
10
|
+
<path d="M0 0 L6 3 L0 6 Z" fill="context-stroke" />
|
|
11
|
+
</marker>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** An accessible SVG frame. Layout and facts stay with the consuming product. */
|
|
15
|
+
export function MarketingDiagram({ caption, children, className, height, label, width }: Readonly<{
|
|
16
|
+
caption?: ReactNode;
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
className?: string;
|
|
19
|
+
height: number;
|
|
20
|
+
label: string;
|
|
21
|
+
width: number;
|
|
22
|
+
}>) {
|
|
23
|
+
if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) throw new RangeError("Marketing diagram dimensions must be positive.");
|
|
24
|
+
if (label.trim() === "") throw new RangeError("Marketing diagram needs a useful accessible label.");
|
|
25
|
+
return <figure className={["hraness-diagram", stylex.props(styles.figure).className, className].filter(Boolean).join(" ")}>
|
|
26
|
+
<div {...stylex.props(styles.scroll)} className={`hraness-diagram__scroll ${stylex.props(styles.scroll).className}`} aria-label={label} role="region" tabIndex={0}>
|
|
27
|
+
<svg {...stylex.props(styles.canvas)} className={`hraness-diagram__canvas ${stylex.props(styles.canvas).className}`} aria-label={label} height={height} role="img" viewBox={`0 0 ${width} ${height}`} width={width}>
|
|
28
|
+
{children}
|
|
29
|
+
</svg>
|
|
30
|
+
</div>
|
|
31
|
+
{caption === undefined || caption === null ? null : <figcaption {...stylex.props(styles.caption)}>{caption}</figcaption>}
|
|
32
|
+
</figure>;
|
|
33
|
+
}
|
|
@@ -156,11 +156,12 @@ export const platformInstallStyles = stylex.create({
|
|
|
156
156
|
},
|
|
157
157
|
command: {
|
|
158
158
|
backgroundColor: { default: surface, [forced]: "Canvas" },
|
|
159
|
-
borderColor: { default:
|
|
159
|
+
borderColor: { default: `color-mix(in srgb, ${focusRing} 34%, ${line})`, [forced]: "CanvasText" },
|
|
160
160
|
borderRadius: "0.75rem",
|
|
161
161
|
borderStyle: "solid",
|
|
162
162
|
borderWidth: "1px",
|
|
163
163
|
boxSizing: "border-box",
|
|
164
|
+
boxShadow: { default: `0 3px 16px color-mix(in srgb, ${focusRing} 7%, transparent)`, [forced]: "none" },
|
|
164
165
|
display: "grid",
|
|
165
166
|
minInlineSize: 0,
|
|
166
167
|
overflow: "hidden",
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
platformMark,
|
|
12
12
|
type PlatformId,
|
|
13
13
|
} from "../platforms.js";
|
|
14
|
+
import { SyntaxCode } from "./syntax-code.js";
|
|
14
15
|
import { platformInstallClassName as cx } from "./platform-install.stylex.js";
|
|
15
16
|
|
|
16
17
|
/** Another way to install on the same platform, such as npm or Homebrew. */
|
|
@@ -211,7 +212,7 @@ function CommandBlock({
|
|
|
211
212
|
</div>
|
|
212
213
|
{/* Focusable so keyboard users can scroll a long command sideways. */}
|
|
213
214
|
<pre aria-label={subject} className={cx(["pre"])} ref={preRef} tabIndex={0}>
|
|
214
|
-
<
|
|
215
|
+
<SyntaxCode className={cx(["code"])} code={command} language="shell" styles="classes" />
|
|
215
216
|
</pre>
|
|
216
217
|
</div>
|
|
217
218
|
);
|
|
@@ -713,6 +713,7 @@ export const marketingStyles = stylex.create({
|
|
|
713
713
|
"line-height": "var(--hraness-marketing-summary-leading, 1.6)",
|
|
714
714
|
"max-inline-size": "var(--hraness-marketing-copy-measure)"
|
|
715
715
|
},
|
|
716
|
+
"hero__install": { "inline-size": "min(100%, 44rem)", "min-inline-size": "0", "margin-block-start": "0.75rem", "text-align": "start" },
|
|
716
717
|
"hero__example": {
|
|
717
718
|
"margin": "0",
|
|
718
719
|
"color": "var(--hraness-marketing-ink)",
|
|
@@ -1063,6 +1064,9 @@ export const marketingStyles = stylex.create({
|
|
|
1063
1064
|
"@media (max-width: 48rem)": "minmax(0, 1fr)"
|
|
1064
1065
|
}
|
|
1065
1066
|
},
|
|
1067
|
+
"pillarsBenefits": { "border-block": "0", "gap": "2.75rem 3rem" },
|
|
1068
|
+
"pillars__benefit": { "display": "grid", "min-inline-size": "0", "align-content": "start", "gap": "0.75rem", "padding": "0", "border-block": "0", "border-inline": "0" },
|
|
1069
|
+
"pillars__icon": { "display": "block", "inline-size": "1.5rem", "block-size": "1.5rem", "margin-block-end": "1.1rem", "color": "var(--primary)" },
|
|
1066
1070
|
"pillars__item": {
|
|
1067
1071
|
"display": "grid",
|
|
1068
1072
|
"min-inline-size": "0",
|
|
@@ -1694,10 +1698,22 @@ export const marketingStyles = stylex.create({
|
|
|
1694
1698
|
"font-size": "1.125rem",
|
|
1695
1699
|
"line-height": "1.5"
|
|
1696
1700
|
},
|
|
1701
|
+
"related__groups": {
|
|
1702
|
+
"display": "grid",
|
|
1703
|
+
"grid-template-columns": "repeat(auto-fit, minmax(min(100%, 24rem), 1fr))",
|
|
1704
|
+
"gap": "2.5rem 3.5rem",
|
|
1705
|
+
"align-items": "start"
|
|
1706
|
+
},
|
|
1697
1707
|
"related__group": {
|
|
1708
|
+
"--hraness-marketing-related-tone": {
|
|
1709
|
+
"default": "var(--hraness-marketing-ink)",
|
|
1710
|
+
"@media (forced-colors: active)": "CanvasText"
|
|
1711
|
+
},
|
|
1698
1712
|
"display": "grid",
|
|
1699
|
-
"gap": "
|
|
1700
|
-
"min-inline-size": "0"
|
|
1713
|
+
"gap": "1rem",
|
|
1714
|
+
"min-inline-size": "0",
|
|
1715
|
+
"border-block-start": "2px solid var(--hraness-marketing-related-tone)",
|
|
1716
|
+
"padding-block-start": "1rem"
|
|
1701
1717
|
},
|
|
1702
1718
|
"related__group_header": {
|
|
1703
1719
|
"display": "grid",
|
|
@@ -1707,146 +1723,146 @@ export const marketingStyles = stylex.create({
|
|
|
1707
1723
|
"related__group_heading": {
|
|
1708
1724
|
"margin": "0",
|
|
1709
1725
|
"color": "var(--hraness-marketing-ink)",
|
|
1710
|
-
"font-family": "var(--hraness-marketing-
|
|
1711
|
-
"font-weight": "
|
|
1712
|
-
"letter-spacing": "
|
|
1713
|
-
"line-height": "
|
|
1726
|
+
"font-family": "var(--hraness-marketing-text-font)",
|
|
1727
|
+
"font-weight": "600",
|
|
1728
|
+
"letter-spacing": "-0.01em",
|
|
1729
|
+
"line-height": "1.35",
|
|
1714
1730
|
"text-wrap": "balance",
|
|
1715
|
-
"font-size": "
|
|
1731
|
+
"font-size": "1.125rem"
|
|
1716
1732
|
},
|
|
1717
1733
|
"related__group_summary": {
|
|
1718
1734
|
"margin": "0",
|
|
1719
1735
|
"color": "var(--hraness-marketing-muted)",
|
|
1720
1736
|
"font-family": "var(--hraness-marketing-text-font)",
|
|
1721
|
-
"font-size": "
|
|
1737
|
+
"font-size": "1rem",
|
|
1722
1738
|
"line-height": "1.5"
|
|
1723
1739
|
},
|
|
1740
|
+
"related__list": {
|
|
1741
|
+
"--hraness-marketing-grid-columns": "initial",
|
|
1742
|
+
"--_hraness-marketing-grid-track": "max(16rem, calc((100% - (var(--hraness-marketing-grid-columns) - 1) * 0.5rem) / var(--hraness-marketing-grid-columns)))",
|
|
1743
|
+
"grid-template-columns": "repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 100%)), 1fr))",
|
|
1744
|
+
"display": "grid",
|
|
1745
|
+
"gap": "0.5rem",
|
|
1746
|
+
"list-style": "none",
|
|
1747
|
+
"margin": "0",
|
|
1748
|
+
"padding": "0",
|
|
1749
|
+
"min-inline-size": "0"
|
|
1750
|
+
},
|
|
1751
|
+
"related__item": {
|
|
1752
|
+
"margin": "0",
|
|
1753
|
+
"min-inline-size": "0"
|
|
1754
|
+
},
|
|
1724
1755
|
"related__card": {
|
|
1725
1756
|
"display": "flex",
|
|
1726
1757
|
"flex-direction": "row",
|
|
1727
|
-
"align-items": "
|
|
1758
|
+
"align-items": "flex-start",
|
|
1728
1759
|
"position": "relative",
|
|
1729
|
-
"isolation": "isolate",
|
|
1730
1760
|
"min-inline-size": "0",
|
|
1731
|
-
"min-block-size": "
|
|
1732
|
-
"
|
|
1733
|
-
"
|
|
1734
|
-
"
|
|
1735
|
-
"border-top":
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
"border-
|
|
1740
|
-
"default": "var(--hraness-marketing-surface-rule)",
|
|
1741
|
-
"@media (forced-colors: active)": "1px solid CanvasText"
|
|
1742
|
-
},
|
|
1743
|
-
"border-bottom": {
|
|
1744
|
-
"default": "var(--hraness-marketing-surface-rule)",
|
|
1745
|
-
"@media (forced-colors: active)": "1px solid CanvasText"
|
|
1746
|
-
},
|
|
1747
|
-
"border-left": {
|
|
1748
|
-
"default": "var(--hraness-marketing-surface-rule)",
|
|
1749
|
-
"@media (forced-colors: active)": "1px solid CanvasText"
|
|
1750
|
-
},
|
|
1751
|
-
"border-image-source": {
|
|
1752
|
-
"default": "none",
|
|
1753
|
-
"@media (forced-colors: active)": "none"
|
|
1754
|
-
},
|
|
1755
|
-
"border-image-slice": {
|
|
1756
|
-
"default": "100%",
|
|
1757
|
-
"@media (forced-colors: active)": "100%"
|
|
1758
|
-
},
|
|
1759
|
-
"border-image-width": {
|
|
1760
|
-
"default": "1",
|
|
1761
|
-
"@media (forced-colors: active)": "1"
|
|
1762
|
-
},
|
|
1763
|
-
"border-image-outset": {
|
|
1764
|
-
"default": "0",
|
|
1765
|
-
"@media (forced-colors: active)": "0"
|
|
1766
|
-
},
|
|
1767
|
-
"border-image-repeat": {
|
|
1768
|
-
"default": "stretch",
|
|
1769
|
-
"@media (forced-colors: active)": "stretch"
|
|
1770
|
-
},
|
|
1771
|
-
"border-radius": "var(--hraness-marketing-frame-radius)",
|
|
1761
|
+
"min-block-size": "2.75rem",
|
|
1762
|
+
"gap": "0.85rem",
|
|
1763
|
+
"padding": "0.55rem 0.5rem",
|
|
1764
|
+
"margin-inline": "0",
|
|
1765
|
+
"border-top": "0",
|
|
1766
|
+
"border-right": "0",
|
|
1767
|
+
"border-bottom": "0",
|
|
1768
|
+
"border-left": "0",
|
|
1769
|
+
"border-radius": "0.375rem",
|
|
1772
1770
|
"background-color": {
|
|
1773
|
-
"default": "
|
|
1774
|
-
"
|
|
1775
|
-
},
|
|
1776
|
-
"background-image": {
|
|
1777
|
-
"default": "none",
|
|
1778
|
-
"@media (forced-colors: active)": "none"
|
|
1779
|
-
},
|
|
1780
|
-
"background-position": {
|
|
1781
|
-
"default": "0% 0%",
|
|
1782
|
-
"@media (forced-colors: active)": "0% 0%"
|
|
1783
|
-
},
|
|
1784
|
-
"background-size": {
|
|
1785
|
-
"default": "auto auto",
|
|
1786
|
-
"@media (forced-colors: active)": "auto auto"
|
|
1787
|
-
},
|
|
1788
|
-
"background-repeat": {
|
|
1789
|
-
"default": "repeat",
|
|
1790
|
-
"@media (forced-colors: active)": "repeat"
|
|
1791
|
-
},
|
|
1792
|
-
"background-origin": {
|
|
1793
|
-
"default": "padding-box",
|
|
1794
|
-
"@media (forced-colors: active)": "padding-box"
|
|
1795
|
-
},
|
|
1796
|
-
"background-clip": {
|
|
1797
|
-
"default": "border-box",
|
|
1798
|
-
"@media (forced-colors: active)": "border-box"
|
|
1799
|
-
},
|
|
1800
|
-
"background-attachment": {
|
|
1801
|
-
"default": "scroll",
|
|
1802
|
-
"@media (forced-colors: active)": "scroll"
|
|
1803
|
-
},
|
|
1804
|
-
"box-shadow": {
|
|
1805
|
-
"default": "var(--hraness-marketing-surface-shadow)",
|
|
1806
|
-
":hover": "0 0 0 1px var(--hraness-marketing-line-strong)",
|
|
1807
|
-
"@media (forced-colors: active)": "none"
|
|
1808
|
-
},
|
|
1809
|
-
"color": {
|
|
1810
|
-
"default": "inherit",
|
|
1811
|
-
"@media (forced-colors: active)": "CanvasText"
|
|
1771
|
+
"default": "transparent",
|
|
1772
|
+
":hover": "color-mix(in srgb, var(--hraness-marketing-related-tone, var(--hraness-marketing-ink)) 6%, transparent)"
|
|
1812
1773
|
},
|
|
1774
|
+
"color": "var(--hraness-marketing-ink)",
|
|
1813
1775
|
"text-decoration": "none",
|
|
1814
|
-
|
|
1815
|
-
"outline
|
|
1776
|
+
"box-shadow": "none",
|
|
1777
|
+
"outline": {
|
|
1778
|
+
"default": null,
|
|
1779
|
+
":focus-visible": "2px solid var(--hraness-marketing-ink)"
|
|
1780
|
+
},
|
|
1781
|
+
"outline-offset": {
|
|
1782
|
+
"default": null,
|
|
1783
|
+
":focus-visible": "-2px"
|
|
1784
|
+
}
|
|
1816
1785
|
},
|
|
1817
1786
|
"related__card_mark": {
|
|
1787
|
+
"--hraness-foil-text-base": "var(--hraness-marketing-related-tone, var(--hraness-marketing-ink))",
|
|
1788
|
+
"color": "var(--hraness-marketing-related-tone, var(--hraness-marketing-ink))",
|
|
1818
1789
|
"flex-grow": "0",
|
|
1819
1790
|
"flex-shrink": "0",
|
|
1820
1791
|
"flex-basis": "auto",
|
|
1821
1792
|
"display": "inline-flex",
|
|
1822
1793
|
"align-items": "center",
|
|
1823
1794
|
"justify-content": "center",
|
|
1824
|
-
"inline-size": "
|
|
1825
|
-
"block-size": "
|
|
1795
|
+
"inline-size": "1.75rem",
|
|
1796
|
+
"block-size": "1.75rem",
|
|
1797
|
+
"margin-block-start": "0.1rem"
|
|
1826
1798
|
},
|
|
1827
1799
|
"related__card_text": {
|
|
1828
1800
|
"display": "grid",
|
|
1829
|
-
"gap": "0.
|
|
1801
|
+
"gap": "0.05rem",
|
|
1830
1802
|
"min-inline-size": "0"
|
|
1831
1803
|
},
|
|
1804
|
+
"related__card_heading": {
|
|
1805
|
+
"display": "flex",
|
|
1806
|
+
"flex-wrap": "wrap",
|
|
1807
|
+
"align-items": "baseline",
|
|
1808
|
+
"column-gap": "0.6rem"
|
|
1809
|
+
},
|
|
1832
1810
|
"related__card_name": {
|
|
1833
1811
|
"margin": "0",
|
|
1834
1812
|
"color": "var(--hraness-marketing-ink)",
|
|
1835
1813
|
"font-family": "var(--hraness-marketing-text-font)",
|
|
1836
|
-
"font-size": "1.
|
|
1837
|
-
"font-weight": "
|
|
1814
|
+
"font-size": "1.0625rem",
|
|
1815
|
+
"font-weight": "600",
|
|
1838
1816
|
"letter-spacing": "-0.01em",
|
|
1839
|
-
"line-height": "1.
|
|
1817
|
+
"line-height": "1.35",
|
|
1818
|
+
"overflow-wrap": "anywhere",
|
|
1819
|
+
"text-decoration-line": "underline",
|
|
1820
|
+
"text-decoration-style": "dotted",
|
|
1821
|
+
"text-decoration-color": "color-mix(in srgb, currentColor 40%, transparent)",
|
|
1822
|
+
"text-decoration-thickness": "1px",
|
|
1823
|
+
"text-underline-offset": "0.2em"
|
|
1824
|
+
},
|
|
1825
|
+
"related__card_domain": {
|
|
1826
|
+
"color": "var(--hraness-marketing-muted)",
|
|
1827
|
+
"font-family": "var(--hraness-marketing-text-font)",
|
|
1828
|
+
"font-size": "0.8125rem",
|
|
1829
|
+
"font-weight": "400",
|
|
1830
|
+
"line-height": "1.5",
|
|
1840
1831
|
"overflow-wrap": "anywhere"
|
|
1841
1832
|
},
|
|
1842
1833
|
"related__card_role": {
|
|
1843
1834
|
"margin": "0",
|
|
1844
|
-
"color": "var(--hraness-marketing-
|
|
1835
|
+
"color": "var(--hraness-marketing-muted)",
|
|
1845
1836
|
"font-family": "var(--hraness-marketing-text-font)",
|
|
1846
|
-
"font-size": "
|
|
1837
|
+
"font-size": "0.9375rem",
|
|
1847
1838
|
"line-height": "1.45",
|
|
1839
|
+
"overflow-wrap": "anywhere",
|
|
1848
1840
|
"text-wrap": "pretty"
|
|
1849
1841
|
},
|
|
1842
|
+
"relatedToneRose": {
|
|
1843
|
+
"--hraness-marketing-related-tone": {
|
|
1844
|
+
"default": "var(--hraness-studio-rose)",
|
|
1845
|
+
"@media (forced-colors: active)": "CanvasText"
|
|
1846
|
+
}
|
|
1847
|
+
},
|
|
1848
|
+
"relatedToneIndigo": {
|
|
1849
|
+
"--hraness-marketing-related-tone": {
|
|
1850
|
+
"default": "var(--hraness-studio-indigo)",
|
|
1851
|
+
"@media (forced-colors: active)": "CanvasText"
|
|
1852
|
+
}
|
|
1853
|
+
},
|
|
1854
|
+
"relatedToneAmber": {
|
|
1855
|
+
"--hraness-marketing-related-tone": {
|
|
1856
|
+
"default": "var(--hraness-studio-amber)",
|
|
1857
|
+
"@media (forced-colors: active)": "CanvasText"
|
|
1858
|
+
}
|
|
1859
|
+
},
|
|
1860
|
+
"relatedToneEmerald": {
|
|
1861
|
+
"--hraness-marketing-related-tone": {
|
|
1862
|
+
"default": "var(--hraness-studio-emerald)",
|
|
1863
|
+
"@media (forced-colors: active)": "CanvasText"
|
|
1864
|
+
}
|
|
1865
|
+
},
|
|
1850
1866
|
"trust": {
|
|
1851
1867
|
"color": "var(--hraness-marketing-ink)",
|
|
1852
1868
|
"font-family": "var(--hraness-marketing-text-font)",
|
|
@@ -2174,18 +2190,22 @@ export const marketingStyles = stylex.create({
|
|
|
2174
2190
|
"line-height": "1.5"
|
|
2175
2191
|
},
|
|
2176
2192
|
"interface_grid": {
|
|
2193
|
+
"--hraness-marketing-grid-columns": "initial",
|
|
2194
|
+
"--_hraness-marketing-grid-track": "max(16rem, calc((100% - (var(--hraness-marketing-grid-columns) - 1) * 1rem) / var(--hraness-marketing-grid-columns)))",
|
|
2177
2195
|
"display": "grid",
|
|
2178
2196
|
"align-items": "stretch",
|
|
2179
2197
|
"margin": "0",
|
|
2180
2198
|
"gap": "1rem",
|
|
2181
|
-
"grid-template-columns": "repeat(auto-fit, minmax(min(100%, 16rem), 1fr))"
|
|
2199
|
+
"grid-template-columns": "repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 16rem)), 1fr))"
|
|
2182
2200
|
},
|
|
2183
2201
|
"trust_grid": {
|
|
2202
|
+
"--hraness-marketing-grid-columns": "initial",
|
|
2203
|
+
"--_hraness-marketing-grid-track": "max(16rem, calc((100% - (var(--hraness-marketing-grid-columns) - 1) * 1rem) / var(--hraness-marketing-grid-columns)))",
|
|
2184
2204
|
"display": "grid",
|
|
2185
2205
|
"align-items": "stretch",
|
|
2186
2206
|
"margin": "0",
|
|
2187
2207
|
"gap": "1rem",
|
|
2188
|
-
"grid-template-columns": "repeat(auto-fit, minmax(min(100%, 16rem), 1fr))"
|
|
2208
|
+
"grid-template-columns": "repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 16rem)), 1fr))"
|
|
2189
2209
|
},
|
|
2190
2210
|
"interface": {
|
|
2191
2211
|
"display": "grid",
|
|
@@ -2685,10 +2705,15 @@ export const marketingStyles = stylex.create({
|
|
|
2685
2705
|
},
|
|
2686
2706
|
"quote__link": {
|
|
2687
2707
|
"color": "inherit",
|
|
2688
|
-
"text-decoration":
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2708
|
+
"text-decoration-line": "underline",
|
|
2709
|
+
"text-decoration-style": "dotted",
|
|
2710
|
+
"text-decoration-color": {
|
|
2711
|
+
"default": "color-mix(in srgb, currentColor 40%, transparent)",
|
|
2712
|
+
":hover": "currentColor",
|
|
2713
|
+
":focus-visible": "currentColor"
|
|
2714
|
+
},
|
|
2715
|
+
"text-decoration-thickness": "1px",
|
|
2716
|
+
"text-underline-offset": "0.2em"
|
|
2692
2717
|
},
|
|
2693
2718
|
"plan_grid": {
|
|
2694
2719
|
"display": "grid",
|
|
@@ -4272,6 +4297,7 @@ const recipes = {
|
|
|
4272
4297
|
"hraness-marketing-hero__name": { "default": marketingStyles.hero__name },
|
|
4273
4298
|
"hraness-marketing-hero__heading": { "default": marketingStyles.hero__heading },
|
|
4274
4299
|
"hraness-marketing-hero__summary": { "default": marketingStyles.hero__summary },
|
|
4300
|
+
"hraness-marketing-hero__install": { "default": marketingStyles.hero__install },
|
|
4275
4301
|
"hraness-marketing-hero__example": { "default": marketingStyles.hero__example },
|
|
4276
4302
|
"hraness-marketing-hero__actions": { "default": marketingStyles.hero__actions, "start": marketingStyles.hero__actionsStart },
|
|
4277
4303
|
"hraness-marketing-hero__boundary": { "default": marketingStyles.hero__boundary },
|
|
@@ -4298,7 +4324,8 @@ const recipes = {
|
|
|
4298
4324
|
"hraness-marketing-stats__source": { "default": marketingStyles.stats__source },
|
|
4299
4325
|
"hraness-marketing-stats__value": { "default": marketingStyles.stats__value },
|
|
4300
4326
|
"hraness-marketing-pillars": { "default": marketingStyles.pillars },
|
|
4301
|
-
"hraness-marketing-pillars__item": { "default": marketingStyles.pillars__item, "later": marketingStyles.pillars__itemLater },
|
|
4327
|
+
"hraness-marketing-pillars__item": { "default": marketingStyles.pillars__item, "later": marketingStyles.pillars__itemLater, "benefit": marketingStyles.pillars__benefit },
|
|
4328
|
+
"hraness-marketing-pillars__icon": { "default": marketingStyles.pillars__icon },
|
|
4302
4329
|
"hraness-marketing-pillars__label": { "default": marketingStyles.pillars__label },
|
|
4303
4330
|
"hraness-marketing-pillars__summary": { "default": marketingStyles.pillars__summary },
|
|
4304
4331
|
"hraness-marketing-proof-frame": { "default": marketingStyles.proof_frame },
|
|
@@ -4348,7 +4375,12 @@ const recipes = {
|
|
|
4348
4375
|
"hraness-marketing-related__label": { "default": marketingStyles.related__label },
|
|
4349
4376
|
"hraness-marketing-related__heading": { "default": marketingStyles.related__heading },
|
|
4350
4377
|
"hraness-marketing-related__summary": { "default": marketingStyles.related__summary },
|
|
4351
|
-
"hraness-marketing-
|
|
4378
|
+
"hraness-marketing-related__groups": { "default": marketingStyles.related__groups },
|
|
4379
|
+
"hraness-marketing-related__list": { "default": marketingStyles.related__list },
|
|
4380
|
+
"hraness-marketing-related__item": { "default": marketingStyles.related__item },
|
|
4381
|
+
"hraness-marketing-related__card-heading": { "default": marketingStyles.related__card_heading },
|
|
4382
|
+
"hraness-marketing-related__card-domain": { "default": marketingStyles.related__card_domain },
|
|
4383
|
+
"hraness-marketing-related__group": { "default": marketingStyles.related__group, "neutral": marketingStyles.related__group, "rose": [marketingStyles.related__group, marketingStyles.relatedToneRose], "indigo": [marketingStyles.related__group, marketingStyles.relatedToneIndigo], "amber": [marketingStyles.related__group, marketingStyles.relatedToneAmber], "emerald": [marketingStyles.related__group, marketingStyles.relatedToneEmerald] },
|
|
4352
4384
|
"hraness-marketing-related__group-header": { "default": marketingStyles.related__group_header },
|
|
4353
4385
|
"hraness-marketing-related__group-heading": { "default": marketingStyles.related__group_heading },
|
|
4354
4386
|
"hraness-marketing-related__group-summary": { "default": marketingStyles.related__group_summary },
|
|
@@ -4458,18 +4490,19 @@ const gridColumns = {
|
|
|
4458
4490
|
|
|
4459
4491
|
/** Explicit finite columns compose static atoms, including the existing media rules. */
|
|
4460
4492
|
export function marketingColumnClassName(
|
|
4461
|
-
hook: "hraness-marketing-facts" | "hraness-marketing-pillars" | "hraness-marketing-stats__list" | "hraness-marketing-card-row" | "hraness-marketing-primitives__list",
|
|
4493
|
+
hook: "hraness-marketing-facts" | "hraness-marketing-pillars" | "hraness-marketing-stats__list" | "hraness-marketing-card-row" | "hraness-marketing-primitives__list" | "hraness-marketing-interface-grid" | "hraness-marketing-trust-grid" | "hraness-marketing-related__list",
|
|
4462
4494
|
caller: string | undefined,
|
|
4463
4495
|
columns: MarketingColumnCount | undefined,
|
|
4496
|
+
presentation: "default" | "benefits" = "default",
|
|
4464
4497
|
): string {
|
|
4465
4498
|
if (columns !== undefined && columns !== 1 && columns !== 2 && columns !== 3 && columns !== 4) {
|
|
4466
4499
|
throw new RangeError("Marketing columns must be 1, 2, 3, or 4 when specified.");
|
|
4467
4500
|
}
|
|
4468
4501
|
const columnRecipe = columns === undefined ? undefined
|
|
4469
4502
|
: (hook === "hraness-marketing-pillars" ? pillarColumns
|
|
4470
|
-
: hook === "hraness-marketing-card-row" || hook === "hraness-marketing-primitives__list" ? gridColumns
|
|
4503
|
+
: hook === "hraness-marketing-card-row" || hook === "hraness-marketing-primitives__list" || hook === "hraness-marketing-interface-grid" || hook === "hraness-marketing-trust-grid" || hook === "hraness-marketing-related__list" ? gridColumns
|
|
4471
4504
|
: factColumns)[columns];
|
|
4472
|
-
return [hook, stylex.props(recipes[hook].default, columnRecipe).className, caller]
|
|
4505
|
+
return [hook, stylex.props(recipes[hook].default, columnRecipe, hook === "hraness-marketing-pillars" && presentation === "benefits" && marketingStyles.pillarsBenefits).className, caller]
|
|
4473
4506
|
.filter((value) => value !== undefined && value.length > 0).join(" ");
|
|
4474
4507
|
}
|
|
4475
4508
|
|