@hraness/design-kit 0.41.0 → 0.41.1

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/dist/stylex.css CHANGED
@@ -85,6 +85,10 @@
85
85
  padding: .5rem 1rem 4rem;
86
86
  }
87
87
 
88
+ .xrqs5gp {
89
+ padding: .5rem 1rem;
90
+ }
91
+
88
92
  .x1i4hug3 {
89
93
  padding: .65rem .8rem;
90
94
  }
@@ -101,10 +105,6 @@
101
105
  padding: .75rem .95rem;
102
106
  }
103
107
 
104
- .x86o7ao {
105
- padding: .8rem 1rem;
106
- }
107
-
108
108
  .x1717udv {
109
109
  padding: 0;
110
110
  }
@@ -864,6 +864,10 @@
864
864
  padding-inline: var(--hraness-marketing-gutter);
865
865
  }
866
866
 
867
+ .x18wjirm {
868
+ padding-inline: var(--hraness-marketing-question-inline-inset, 1.25rem);
869
+ }
870
+
867
871
  .xfmotut {
868
872
  padding-inline: var(--layout-chrome-inset);
869
873
  }
@@ -2939,6 +2943,10 @@
2939
2943
  margin-block-start: 1rem;
2940
2944
  }
2941
2945
 
2946
+ .x1n5yk0f {
2947
+ margin-block-start: auto;
2948
+ }
2949
+
2942
2950
  .xvc5jky {
2943
2951
  margin-inline-start: auto;
2944
2952
  }
@@ -3386,6 +3394,10 @@
3386
3394
  text-align: center;
3387
3395
  }
3388
3396
 
3397
+ .xp4054r {
3398
+ text-align: end;
3399
+ }
3400
+
3389
3401
  .x1yc453h {
3390
3402
  text-align: start;
3391
3403
  }
@@ -3424,6 +3436,10 @@
3424
3436
  text-transform: uppercase;
3425
3437
  }
3426
3438
 
3439
+ .x5hzr90 {
3440
+ text-underline-offset: .18em;
3441
+ }
3442
+
3427
3443
  .xdsgf93 {
3428
3444
  text-underline-offset: .22em;
3429
3445
  }
@@ -3709,6 +3725,10 @@
3709
3725
  color: var(--hraness-appearance-accent-foreground, var(--hraness-material-ink, var(--ui-accent-foreground, ButtonText)));
3710
3726
  }
3711
3727
 
3728
+ .x1eyr600:focus-visible {
3729
+ color: var(--hraness-marketing-ink);
3730
+ }
3731
+
3712
3732
  .x89zja:is([data-hovered], :hover) {
3713
3733
  color: var(--secondary-foreground);
3714
3734
  }
@@ -4943,8 +4963,26 @@
4943
4963
  transform: translate3d(0, -4vh, 0);
4944
4964
  }
4945
4965
 
4946
- .x1bz48vb.x1bz48vb:where(.x1mw0dh9[open] *):after {
4947
- transform: rotate(45deg);
4966
+ .x78hkw1:after {
4967
+ transition-duration: .24s;
4968
+ }
4969
+
4970
+ .xjocvvi:after {
4971
+ transition-property: transform;
4972
+ }
4973
+
4974
+ .x15fj410:after {
4975
+ transition-timing-function: cubic-bezier(.16, 1, .3, 1);
4976
+ }
4977
+
4978
+ .xba5a1s.xba5a1s:where(.x1mw0dh9[open] *):after {
4979
+ transform: rotate(135deg);
4980
+ }
4981
+
4982
+ @media (prefers-reduced-motion: reduce) {
4983
+ .x4oqjru.x4oqjru:after {
4984
+ transition-duration: 0s;
4985
+ }
4948
4986
  }
4949
4987
  }
4950
4988
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hraness/design-kit",
3
- "version": "0.41.0",
3
+ "version": "0.41.1",
4
4
  "description": "React components and CSS for Hraness apps and product sites: application shells, marketing sections, charts, themes, effects, and syntax highlighting. Built on @hraness/ui.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -6,7 +6,7 @@
6
6
  "name": "@hraness/design-kit",
7
7
  "path": ".",
8
8
  "visibility": "public",
9
- "version": "0.41.0"
9
+ "version": "0.41.1"
10
10
  }
11
11
  ],
12
12
  "contract": "hraness.portfolio-inventory/v1",
@@ -304,10 +304,14 @@
304
304
  line-height: 1.5;
305
305
  }
306
306
 
307
- .hraness-marketing-interface pre {
307
+ .hraness-marketing-interface > :where(pre) {
308
308
  margin-block-start: 0.5rem;
309
309
  }
310
310
 
311
+ .hraness-marketing-interface :where(pre) {
312
+ font-size: 0.78rem;
313
+ }
314
+
311
315
  .hraness-marketing-question__answer > :first-child {
312
316
  margin-block-start: 0;
313
317
  }
@@ -1081,7 +1081,7 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
1081
1081
  display: flex;
1082
1082
  align-items: center;
1083
1083
  gap: 0.75rem;
1084
- padding: 0.8rem 1rem;
1084
+ padding: 0.5rem 1rem;
1085
1085
  background-image: var(--hraness-marketing-frame-chrome, none);
1086
1086
  box-shadow: var(--hraness-marketing-chrome-shadow);
1087
1087
  border-block-end: var(--hraness-marketing-chrome-rule);
@@ -1641,10 +1641,8 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
1641
1641
 
1642
1642
  .hraness-marketing-interface,
1643
1643
  .hraness-marketing-trust-item {
1644
- display: grid;
1645
1644
  min-inline-size: 0;
1646
1645
  min-block-size: 100%;
1647
- align-content: start;
1648
1646
  gap: 0.5rem;
1649
1647
  padding: clamp(1.25rem, 2.5vw, 1.75rem);
1650
1648
  border: var(--hraness-marketing-surface-rule);
@@ -1653,6 +1651,17 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
1653
1651
  box-shadow: var(--hraness-marketing-surface-shadow);
1654
1652
  }
1655
1653
 
1654
+ /* A vertical column lets the optional action pin to the foot of the card. */
1655
+ .hraness-marketing-interface {
1656
+ display: flex;
1657
+ flex-direction: column;
1658
+ }
1659
+
1660
+ .hraness-marketing-trust-item {
1661
+ display: grid;
1662
+ align-content: start;
1663
+ }
1664
+
1656
1665
  .hraness-marketing-interface :where(.hraness-marketing-interface__heading, p),
1657
1666
  .hraness-marketing-trust-item :where(dt, dd) {
1658
1667
  margin: 0;
@@ -1672,10 +1681,42 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
1672
1681
  line-height: 1.5;
1673
1682
  }
1674
1683
 
1675
- .hraness-marketing-interface pre {
1684
+ /* The card's reference link sits at the foot, quiet and end-aligned. */
1685
+ .hraness-marketing-interface .hraness-marketing-interface__action {
1686
+ margin-block-start: auto;
1687
+ font-size: 0.85rem;
1688
+ text-align: end;
1689
+ }
1690
+
1691
+ .hraness-marketing-interface__link {
1692
+ color: var(--hraness-marketing-muted);
1693
+ text-decoration-line: underline;
1694
+ text-decoration-style: dotted;
1695
+ text-decoration-color: color-mix(in srgb, currentColor 40%, transparent);
1696
+ text-decoration-thickness: 1px;
1697
+ text-underline-offset: 0.18em;
1698
+ }
1699
+
1700
+ .hraness-marketing-interface__link:hover,
1701
+ .hraness-marketing-interface__link:focus-visible {
1702
+ color: var(--hraness-marketing-ink);
1703
+ text-decoration-color: currentColor;
1704
+ }
1705
+
1706
+ @media (forced-colors: active) {
1707
+ .hraness-marketing-interface__link {
1708
+ color: LinkText;
1709
+ }
1710
+ }
1711
+
1712
+ .hraness-marketing-interface > :where(pre) {
1676
1713
  margin-block-start: 0.5rem;
1677
1714
  }
1678
1715
 
1716
+ .hraness-marketing-interface :where(pre) {
1717
+ font-size: 0.78rem;
1718
+ }
1719
+
1679
1720
  /* Equal-height product card rows. Direct children stretch to the tallest
1680
1721
  * item. Meta occupies a reserved two-line block so one long blurb does not
1681
1722
  * stagger the row. Titles wrap without clamping. Each card is a containing
@@ -2009,6 +2050,7 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
2009
2050
  justify-content: space-between;
2010
2051
  gap: 1rem;
2011
2052
  padding-block: 1rem;
2053
+ padding-inline: var(--hraness-marketing-question-inline-inset, 1.25rem);
2012
2054
  color: var(--hraness-marketing-ink);
2013
2055
  cursor: pointer;
2014
2056
  font-size: 1.05rem;
@@ -2027,10 +2069,11 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
2027
2069
  font-size: 1.25rem;
2028
2070
  font-weight: 400;
2029
2071
  line-height: 1;
2072
+ transition: transform 240ms cubic-bezier(0.16, 1, 0.3, 1);
2030
2073
  }
2031
2074
 
2032
2075
  .hraness-marketing-question[open] summary::after {
2033
- transform: rotate(45deg);
2076
+ transform: rotate(135deg);
2034
2077
  }
2035
2078
 
2036
2079
  .hraness-marketing-question summary:focus-visible {
@@ -2042,6 +2085,7 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
2042
2085
  .hraness-marketing-question__answer {
2043
2086
  max-inline-size: var(--hraness-marketing-prose-measure);
2044
2087
  padding-block: 0 1.5rem;
2088
+ padding-inline: var(--hraness-marketing-question-inline-inset, 1.25rem);
2045
2089
  color: var(--hraness-marketing-muted);
2046
2090
  line-height: 1.6;
2047
2091
  }
@@ -2259,6 +2303,12 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
2259
2303
  }
2260
2304
  }
2261
2305
 
2306
+ @media (prefers-reduced-motion: reduce) {
2307
+ .hraness-marketing-question summary::after {
2308
+ transition: none;
2309
+ }
2310
+ }
2311
+
2262
2312
  @media (forced-colors: active) {
2263
2313
  .hraness-marketing-plan[data-emphasis="primary"] {
2264
2314
  border-color: CanvasText;
@@ -512,8 +512,8 @@ export function DesignSystemGallery({
512
512
  <p>Consumer-owned content can include <a href="#gallery-install">links</a> and <code>inline code</code>.</p>
513
513
  </MarketingSection>
514
514
  <MarketingInterfaceGrid columns={2} heading="Choose your interface." headingId="gallery-marketing-interfaces" headingLevel={3} label="Interfaces" interfaces={[
515
- { label: "CLI", summary: "Run a named job.", example: <MarketingCodeBlock code="relay run job-01" /> },
516
- { label: "SDK", summary: "Use typed application code." },
515
+ { label: "CLI", summary: "Run a named job.", example: <MarketingCodeBlock code="relay run job-01" />, link: { href: "#gallery-install", label: "Read the CLI guide" } },
516
+ { label: "SDK", summary: "Use typed application code.", link: { href: "#gallery-install", label: "Read the SDK guide" } },
517
517
  ]} />
518
518
  <MarketingCardRow ariaLabel="Release radar" columns={2} cards={[
519
519
  { art: <svg aria-hidden="true" viewBox="0 0 24 24" width="24" height="24"><circle cx="12" cy="12" r="8" /></svg>, href: "#marketing", title: "Grok 4.7", meta: "First observed 21 September 2026." },
@@ -1195,7 +1195,7 @@ export const marketingStyles = stylex.create({
1195
1195
  "display": "flex",
1196
1196
  "align-items": "center",
1197
1197
  "gap": "0.75rem",
1198
- "padding": "0.8rem 1rem",
1198
+ "padding": "0.5rem 1rem",
1199
1199
  "background-image": { default: "var(--hraness-marketing-frame-chrome, none)", "@media (forced-colors: active)": "none" },
1200
1200
  "box-shadow": { default: "var(--hraness-marketing-chrome-shadow)", "@media (forced-colors: active)": "none" },
1201
1201
  "border-block-end": { "default": "var(--hraness-marketing-chrome-rule)", "@media (forced-colors: active)": "1px solid CanvasText" },
@@ -2216,10 +2216,10 @@ export const marketingStyles = stylex.create({
2216
2216
  "grid-template-columns": "repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 16rem)), 1fr))"
2217
2217
  },
2218
2218
  "interface": {
2219
- "display": "grid",
2219
+ "display": "flex",
2220
+ "flex-direction": "column",
2220
2221
  "min-inline-size": "0",
2221
2222
  "min-block-size": "100%",
2222
- "align-content": "start",
2223
2223
  "gap": "0.5rem",
2224
2224
  "padding": "clamp(1.25rem, 2.5vw, 1.75rem)",
2225
2225
  "border-top": {
@@ -2395,6 +2395,28 @@ export const marketingStyles = stylex.create({
2395
2395
  "font-size": "0.95rem",
2396
2396
  "line-height": "1.5"
2397
2397
  },
2398
+ "interface__action": {
2399
+ "margin-block-start": "auto",
2400
+ "font-size": "0.85rem",
2401
+ "text-align": "end"
2402
+ },
2403
+ "interface__link": {
2404
+ "color": {
2405
+ "default": "var(--hraness-marketing-muted)",
2406
+ ":hover": "var(--hraness-marketing-ink)",
2407
+ ":focus-visible": "var(--hraness-marketing-ink)",
2408
+ "@media (forced-colors: active)": "LinkText"
2409
+ },
2410
+ "text-decoration-line": "underline",
2411
+ "text-decoration-style": "dotted",
2412
+ "text-decoration-color": {
2413
+ "default": "color-mix(in srgb, currentColor 40%, transparent)",
2414
+ ":hover": "currentColor",
2415
+ ":focus-visible": "currentColor"
2416
+ },
2417
+ "text-decoration-thickness": "1px",
2418
+ "text-underline-offset": "0.18em"
2419
+ },
2398
2420
  "trust_item__label": {
2399
2421
  "margin": "0",
2400
2422
  "font-size": "1.05rem",
@@ -3026,6 +3048,7 @@ export const marketingStyles = stylex.create({
3026
3048
  "justify-content": "space-between",
3027
3049
  "gap": "1rem",
3028
3050
  "padding-block": "1rem",
3051
+ "padding-inline": "var(--hraness-marketing-question-inline-inset, 1.25rem)",
3029
3052
  "color": "var(--hraness-marketing-ink)",
3030
3053
  "cursor": "pointer",
3031
3054
  "font-size": "1.05rem",
@@ -3041,15 +3064,22 @@ export const marketingStyles = stylex.create({
3041
3064
  "font-size": "1.25rem",
3042
3065
  "font-weight": "400",
3043
3066
  "line-height": "1",
3067
+ "transition-duration": {
3068
+ "default": "240ms",
3069
+ "@media (prefers-reduced-motion: reduce)": "0ms"
3070
+ },
3071
+ "transition-property": "transform",
3072
+ "transition-timing-function": "cubic-bezier(0.16, 1, 0.3, 1)",
3044
3073
  "transform": {
3045
3074
  "default": null,
3046
- [stylex.when.ancestor("[open]", questionMarker)]: "rotate(45deg)"
3075
+ [stylex.when.ancestor("[open]", questionMarker)]: "rotate(135deg)"
3047
3076
  }
3048
3077
  }
3049
3078
  },
3050
3079
  "question__answer": {
3051
3080
  "max-inline-size": "var(--hraness-marketing-prose-measure)",
3052
3081
  "padding-block": "0 1.5rem",
3082
+ "padding-inline": "var(--hraness-marketing-question-inline-inset, 1.25rem)",
3053
3083
  "color": "var(--hraness-marketing-muted)",
3054
3084
  "line-height": "1.6"
3055
3085
  },
@@ -4475,6 +4505,8 @@ const recipes = {
4475
4505
  "hraness-marketing-trust-item": { "default": marketingStyles.trust_item },
4476
4506
  "hraness-marketing-interface__heading": { "default": marketingStyles.interface__heading },
4477
4507
  "hraness-marketing-interface__summary": { "default": marketingStyles.interface__summary },
4508
+ "hraness-marketing-interface__action": { "default": marketingStyles.interface__action },
4509
+ "hraness-marketing-interface__link": { "default": marketingStyles.interface__link },
4478
4510
  "hraness-marketing-trust-item__label": { "default": marketingStyles.trust_item__label },
4479
4511
  "hraness-marketing-trust-item__detail": { "default": marketingStyles.trust_item__detail },
4480
4512
  "hraness-marketing-card-row": { "default": marketingStyles.card_row },
@@ -745,7 +745,8 @@ export function marketingProofFrameAddress(url: string): string {
745
745
  * A captioned frame around a screenshot, recording, or code-built mockup.
746
746
  * `chrome` draws a window title bar, a browser address bar, or a terminal
747
747
  * title bar above the content. A `title` without `chrome` keeps the window
748
- * bar. The browser bar shows `url` as host and path.
748
+ * bar. The browser bar shows `url` as host and path. A window or terminal
749
+ * bar without a title draws only the window lights.
749
750
  */
750
751
  export function MarketingProofFrame({
751
752
  caption,
@@ -773,8 +774,8 @@ export function MarketingProofFrame({
773
774
  if (url !== undefined && chrome !== "browser") throw new RangeError("Proof frame url needs chrome=\"browser\".");
774
775
  const bar = chrome ?? (title === undefined ? undefined : "window");
775
776
  const label = bar === "browser" ? (url === undefined ? title : marketingProofFrameAddress(url)) : title;
776
- if (bar !== undefined && (label === undefined || label.trim() === "")) {
777
- throw new RangeError(`Proof frame chrome=${bar} needs ${bar === "browser" ? "a url or title" : "a title"}.`);
777
+ if (bar === "browser" && (label === undefined || label.trim() === "")) {
778
+ throw new RangeError("Proof frame chrome=browser needs a url or title.");
778
779
  }
779
780
  return (
780
781
  <figure
@@ -793,7 +794,9 @@ export function MarketingProofFrame({
793
794
  </span>
794
795
  {bar === "browser"
795
796
  ? <span className={classNames("hraness-marketing-proof-frame__address")}>{label}</span>
796
- : <span className={classNames("hraness-marketing-proof-frame__title", undefined, bar === "terminal" ? "terminal" : "default")}>{label}</span>}
797
+ : label === undefined || label.trim() === ""
798
+ ? null
799
+ : <span className={classNames("hraness-marketing-proof-frame__title", undefined, bar === "terminal" ? "terminal" : "default")}>{label}</span>}
797
800
  </div>
798
801
  )}
799
802
  <div className={classNames("hraness-marketing-proof-frame__content")}>{children}</div>
@@ -1168,6 +1171,8 @@ export function MarketingStatStrip({
1168
1171
  export interface MarketingInterface {
1169
1172
  readonly example?: ReactNode;
1170
1173
  readonly label: string;
1174
+ /** A reference link pinned to the foot of the card, aligned to the end. */
1175
+ readonly link?: MarketingLink;
1171
1176
  readonly summary: string;
1172
1177
  }
1173
1178
 
@@ -1212,6 +1217,13 @@ export function MarketingInterfaceGrid({
1212
1217
  </Heading>
1213
1218
  <p className={classNames("hraness-marketing-interface__summary")}>{entry.summary}</p>
1214
1219
  {entry.example}
1220
+ {entry.link === undefined
1221
+ ? null
1222
+ : (
1223
+ <p className={classNames("hraness-marketing-interface__action")}>
1224
+ <a className={classNames("hraness-marketing-interface__link")} data-hraness-marketing="interfaces" href={entry.link.href}>{entry.link.label}</a>
1225
+ </p>
1226
+ )}
1215
1227
  </article>
1216
1228
  ))}
1217
1229
  </div>