@hraness/design-kit 0.33.0 → 0.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/stylex.css CHANGED
@@ -2431,10 +2431,6 @@
2431
2431
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr));
2432
2432
  }
2433
2433
 
2434
- .x1p797x9 {
2435
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
2436
- }
2437
-
2438
2434
  .x1vfedg7 {
2439
2435
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr));
2440
2436
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hraness/design-kit",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
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.33.0"
9
+ "version": "0.34.0"
10
10
  }
11
11
  ],
12
12
  "contract": "hraness.portfolio-inventory/v1",
@@ -1513,11 +1513,13 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
1513
1513
 
1514
1514
  .hraness-marketing-interface-grid,
1515
1515
  .hraness-marketing-trust-grid {
1516
+ --hraness-marketing-grid-columns: initial;
1517
+ --_hraness-marketing-grid-track: max(16rem, calc((100% - (var(--hraness-marketing-grid-columns) - 1) * 1rem) / var(--hraness-marketing-grid-columns)));
1516
1518
  display: grid;
1517
1519
  align-items: stretch;
1518
1520
  margin: 0;
1519
1521
  gap: 1rem;
1520
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
1522
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 16rem)), 1fr));
1521
1523
  }
1522
1524
 
1523
1525
  .hraness-marketing-interface-grid > *,
@@ -436,7 +436,7 @@ export function DesignSystemGallery({
436
436
  <MarketingSectionLabel size="body">Reference</MarketingSectionLabel>
437
437
  <p>Consumer-owned content can include <a href="#gallery-install">links</a> and <code>inline code</code>.</p>
438
438
  </MarketingSection>
439
- <MarketingInterfaceGrid heading="Choose your interface." headingId="gallery-marketing-interfaces" headingLevel={3} label="Interfaces" interfaces={[
439
+ <MarketingInterfaceGrid columns={2} heading="Choose your interface." headingId="gallery-marketing-interfaces" headingLevel={3} label="Interfaces" interfaces={[
440
440
  { label: "CLI", summary: "Run a named job.", example: <MarketingCodeBlock code="relay run job-01" /> },
441
441
  { label: "SDK", summary: "Use typed application code." },
442
442
  ]} />
@@ -444,7 +444,7 @@ export function DesignSystemGallery({
444
444
  { 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." },
445
445
  { art: <svg aria-hidden="true" viewBox="0 0 24 24" width="24" height="24"><rect x="4" y="4" width="16" height="16" rx="4" /></svg>, href: "#gallery-install", title: "GLM 5.3 Flash", meta: "First observed 26 August 2026. Early DeepSWE coverage on OpenRouter." },
446
446
  ]} />
447
- <MarketingTrustBoundary heading="What leaves your machine." headingId="gallery-marketing-trust" headingLevel={3} label="Boundary" items={[
447
+ <MarketingTrustBoundary columns={2} heading="What leaves your machine." headingId="gallery-marketing-trust" headingLevel={3} label="Boundary" items={[
448
448
  { label: "Stays local", detail: "Source files and credentials." },
449
449
  { label: "Shared", detail: "Only the logs you choose to sync." },
450
450
  ]} />
@@ -520,6 +520,7 @@ export function DesignSystemGallery({
520
520
  ]}
521
521
  />
522
522
  <MarketingRelated
523
+ columns={2}
523
524
  groups={[
524
525
  {
525
526
  heading: "Sibling tools",
@@ -538,6 +539,7 @@ export function DesignSystemGallery({
538
539
  ],
539
540
  },
540
541
  {
542
+ columns: 1,
541
543
  heading: "Shared infrastructure",
542
544
  headingId: "design-gallery-related-infra",
543
545
  items: [
@@ -2174,18 +2174,22 @@ export const marketingStyles = stylex.create({
2174
2174
  "line-height": "1.5"
2175
2175
  },
2176
2176
  "interface_grid": {
2177
+ "--hraness-marketing-grid-columns": "initial",
2178
+ "--_hraness-marketing-grid-track": "max(16rem, calc((100% - (var(--hraness-marketing-grid-columns) - 1) * 1rem) / var(--hraness-marketing-grid-columns)))",
2177
2179
  "display": "grid",
2178
2180
  "align-items": "stretch",
2179
2181
  "margin": "0",
2180
2182
  "gap": "1rem",
2181
- "grid-template-columns": "repeat(auto-fit, minmax(min(100%, 16rem), 1fr))"
2183
+ "grid-template-columns": "repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 16rem)), 1fr))"
2182
2184
  },
2183
2185
  "trust_grid": {
2186
+ "--hraness-marketing-grid-columns": "initial",
2187
+ "--_hraness-marketing-grid-track": "max(16rem, calc((100% - (var(--hraness-marketing-grid-columns) - 1) * 1rem) / var(--hraness-marketing-grid-columns)))",
2184
2188
  "display": "grid",
2185
2189
  "align-items": "stretch",
2186
2190
  "margin": "0",
2187
2191
  "gap": "1rem",
2188
- "grid-template-columns": "repeat(auto-fit, minmax(min(100%, 16rem), 1fr))"
2192
+ "grid-template-columns": "repeat(auto-fit, minmax(min(100%, var(--_hraness-marketing-grid-track, 16rem)), 1fr))"
2189
2193
  },
2190
2194
  "interface": {
2191
2195
  "display": "grid",
@@ -4458,7 +4462,7 @@ const gridColumns = {
4458
4462
 
4459
4463
  /** Explicit finite columns compose static atoms, including the existing media rules. */
4460
4464
  export function marketingColumnClassName(
4461
- hook: "hraness-marketing-facts" | "hraness-marketing-pillars" | "hraness-marketing-stats__list" | "hraness-marketing-card-row" | "hraness-marketing-primitives__list",
4465
+ 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",
4462
4466
  caller: string | undefined,
4463
4467
  columns: MarketingColumnCount | undefined,
4464
4468
  ): string {
@@ -4467,7 +4471,7 @@ export function marketingColumnClassName(
4467
4471
  }
4468
4472
  const columnRecipe = columns === undefined ? undefined
4469
4473
  : (hook === "hraness-marketing-pillars" ? pillarColumns
4470
- : hook === "hraness-marketing-card-row" || hook === "hraness-marketing-primitives__list" ? gridColumns
4474
+ : hook === "hraness-marketing-card-row" || hook === "hraness-marketing-primitives__list" || hook === "hraness-marketing-interface-grid" || hook === "hraness-marketing-trust-grid" ? gridColumns
4471
4475
  : factColumns)[columns];
4472
4476
  return [hook, stylex.props(recipes[hook].default, columnRecipe).className, caller]
4473
4477
  .filter((value) => value !== undefined && value.length > 0).join(" ");
@@ -1148,6 +1148,7 @@ export interface MarketingInterface {
1148
1148
 
1149
1149
  export function MarketingInterfaceGrid({
1150
1150
  className,
1151
+ columns,
1151
1152
  heading,
1152
1153
  headingId,
1153
1154
  headingLevel = 2,
@@ -1157,6 +1158,8 @@ export function MarketingInterfaceGrid({
1157
1158
  summary,
1158
1159
  }: Readonly<{
1159
1160
  className?: string;
1161
+ /** Maximum columns; cards wrap within the available container width. */
1162
+ columns?: MarketingColumnCount;
1160
1163
  heading: string;
1161
1164
  headingId: string;
1162
1165
  headingLevel?: MarketingHeadingLevel;
@@ -1173,7 +1176,7 @@ export function MarketingInterfaceGrid({
1173
1176
  id={id}
1174
1177
  >
1175
1178
  <MarketingCollectionHeader {...{ heading, headingId, headingLevel, label, summary }} prefix="interfaces" />
1176
- <div className={classNames("hraness-marketing-interface-grid")}>
1179
+ <div className={marketingColumnClassName("hraness-marketing-interface-grid", undefined, columns)}>
1177
1180
  {interfaces.map((entry) => (
1178
1181
  <article className={classNames("hraness-marketing-interface")} key={entry.label}>
1179
1182
  <Heading
@@ -1198,6 +1201,7 @@ export interface MarketingTrustItem {
1198
1201
 
1199
1202
  export function MarketingTrustBoundary({
1200
1203
  className,
1204
+ columns,
1201
1205
  heading,
1202
1206
  headingId,
1203
1207
  headingLevel = 2,
@@ -1207,6 +1211,8 @@ export function MarketingTrustBoundary({
1207
1211
  summary,
1208
1212
  }: Readonly<{
1209
1213
  className?: string;
1214
+ /** Maximum columns; cards wrap within the available container width. */
1215
+ columns?: MarketingColumnCount;
1210
1216
  heading: string;
1211
1217
  headingId: string;
1212
1218
  headingLevel?: MarketingHeadingLevel;
@@ -1223,7 +1229,7 @@ export function MarketingTrustBoundary({
1223
1229
  id={id}
1224
1230
  >
1225
1231
  <MarketingCollectionHeader {...{ heading, headingId, headingLevel, label, summary }} prefix="trust" />
1226
- <dl className={classNames("hraness-marketing-trust-grid")}>
1232
+ <dl className={marketingColumnClassName("hraness-marketing-trust-grid", undefined, columns)}>
1227
1233
  {items.map((item) => (
1228
1234
  <div className={classNames("hraness-marketing-trust-item")} key={item.label}>
1229
1235
  <dt className={classNames("hraness-marketing-trust-item__label")}>{item.label}</dt>
@@ -1497,6 +1503,8 @@ export interface MarketingRelatedProduct {
1497
1503
  }
1498
1504
 
1499
1505
  export interface MarketingRelatedGroup {
1506
+ /** Maximum columns for this group, overriding the section default. */
1507
+ readonly columns?: MarketingColumnCount;
1500
1508
  /** Heading naming this tier of siblings, rendered one level below the section heading. */
1501
1509
  readonly heading: string;
1502
1510
  readonly headingId: string;
@@ -1539,6 +1547,7 @@ type MarketingRelatedBody =
1539
1547
  /** Linked cards for sibling products: each shows the product's mark, name, and one-line description. */
1540
1548
  export function MarketingRelated({
1541
1549
  className,
1550
+ columns,
1542
1551
  heading,
1543
1552
  headingId,
1544
1553
  headingLevel = 2,
@@ -1549,6 +1558,8 @@ export function MarketingRelated({
1549
1558
  summary,
1550
1559
  }: Readonly<{
1551
1560
  className?: string;
1561
+ /** Maximum columns for each card row; a group can override it. */
1562
+ columns?: MarketingColumnCount;
1552
1563
  heading: string;
1553
1564
  headingId: string;
1554
1565
  headingLevel?: MarketingHeadingLevel;
@@ -1557,6 +1568,7 @@ export function MarketingRelated({
1557
1568
  summary?: string;
1558
1569
  }> &
1559
1570
  MarketingRelatedBody) {
1571
+ const defaultColumnProps = columns === undefined ? {} : { columns };
1560
1572
  return (
1561
1573
  <section
1562
1574
  aria-labelledby={headingId}
@@ -1574,7 +1586,7 @@ export function MarketingRelated({
1574
1586
  />
1575
1587
  {groups === undefined
1576
1588
  ? (
1577
- <MarketingCardRow>
1589
+ <MarketingCardRow {...defaultColumnProps}>
1578
1590
  <MarketingRelatedCards items={items} level={childHeadingLevel(headingLevel)} />
1579
1591
  </MarketingCardRow>
1580
1592
  )
@@ -1592,7 +1604,7 @@ export function MarketingRelated({
1592
1604
  ? null
1593
1605
  : <p className={classNames("hraness-marketing-related__group-summary")}>{group.summary}</p>}
1594
1606
  </div>
1595
- <MarketingCardRow ariaLabel={group.heading}>
1607
+ <MarketingCardRow ariaLabel={group.heading} {...(group.columns === undefined ? defaultColumnProps : { columns: group.columns })}>
1596
1608
  <MarketingRelatedCards items={group.items} level={childHeadingLevel(childHeadingLevel(headingLevel))} />
1597
1609
  </MarketingCardRow>
1598
1610
  </div>