@hraness/design-kit 0.35.3 → 0.36.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.
Files changed (34) hide show
  1. package/MARKETING_COPY.md +1 -0
  2. package/README.md +53 -7
  3. package/dist/{chunk-vst6p4wd.js → chunk-sabcr66p.js} +68 -0
  4. package/dist/{chunk-fmeg5cxf.js → chunk-thv5t11w.js} +1 -1
  5. package/dist/{chunk-4tgt8egt.js → chunk-v8byd3hw.js} +106 -23
  6. package/dist/index.js +2 -2
  7. package/dist/mockups/client.js +169 -21
  8. package/dist/mockups/index.js +4 -0
  9. package/dist/provider-marks.js +1 -1
  10. package/dist/react/index.js +58 -3
  11. package/dist/react/server.js +2 -2
  12. package/dist/stylex-manifest.json +1 -1
  13. package/dist/stylex.css +30 -0
  14. package/package.json +1 -1
  15. package/portfolio-inventory.json +1 -1
  16. package/src/mockups/client.tsx +120 -7
  17. package/src/mockups/frames.tsx +4 -2
  18. package/src/mockups.css +43 -0
  19. package/src/product-marketing-foundation.css +12 -0
  20. package/src/product-marketing.css +59 -0
  21. package/src/provider-marks.generated.ts +20 -0
  22. package/src/provider-marks.ts +5 -0
  23. package/src/react/design-gallery.tsx +11 -0
  24. package/src/react/product-marketing.stylex.ts +50 -2
  25. package/src/react/product-marketing.tsx +38 -28
  26. package/vendor/provider-marks/BEEPER-NOTICE.md +16 -0
  27. package/vendor/provider-marks/SIMPLE-ICONS-LICENSE.md +30 -0
  28. package/vendor/provider-marks/UPSTREAM.md +24 -0
  29. package/vendor/provider-marks/beeper-glyph.svg +3 -0
  30. package/vendor/provider-marks/beeper.svg +16 -0
  31. package/vendor/provider-marks/lobehub/ollama.svg +1 -0
  32. package/vendor/provider-marks/lobehub/vercel.svg +1 -0
  33. package/vendor/provider-marks/simple-icons/imessage.svg +1 -0
  34. package/vendor/provider-marks/simple-icons/whatsapp.svg +1 -0
package/dist/stylex.css CHANGED
@@ -109,6 +109,10 @@
109
109
  padding: 0;
110
110
  }
111
111
 
112
+ .x1aetswf {
113
+ padding: 1.125rem;
114
+ }
115
+
112
116
  .x194jd1b {
113
117
  padding: 1.1rem 7rem 1rem 1rem;
114
118
  }
@@ -1084,6 +1088,10 @@
1084
1088
  accent-color: var(--primary, Highlight);
1085
1089
  }
1086
1090
 
1091
+ .xc26acl {
1092
+ align-content: center;
1093
+ }
1094
+
1087
1095
  .xcdzlcm {
1088
1096
  align-content: space-between;
1089
1097
  }
@@ -1675,6 +1683,10 @@
1675
1683
  block-size: 1rem;
1676
1684
  }
1677
1685
 
1686
+ .x1vlpzvb {
1687
+ block-size: 3.5rem;
1688
+ }
1689
+
1678
1690
  .x18o2qet {
1679
1691
  block-size: 4.5rem;
1680
1692
  }
@@ -2523,6 +2535,10 @@
2523
2535
  grid-template-columns: 2.25rem minmax(0, 1fr);
2524
2536
  }
2525
2537
 
2538
+ .xrdwe0 {
2539
+ grid-template-columns: 3.5rem minmax(0, 1fr);
2540
+ }
2541
+
2526
2542
  .xx9t13c {
2527
2543
  grid-template-columns: auto minmax(0, 1fr) auto;
2528
2544
  }
@@ -2631,6 +2647,10 @@
2631
2647
  inline-size: 2rem;
2632
2648
  }
2633
2649
 
2650
+ .x1pf0uk5 {
2651
+ inline-size: 3.5rem;
2652
+ }
2653
+
2634
2654
  .x6qm275 {
2635
2655
  inline-size: 4.5rem;
2636
2656
  }
@@ -2966,6 +2986,10 @@
2966
2986
  max-block-size: min(38rem, 75dvh);
2967
2987
  }
2968
2988
 
2989
+ .x1vj640n {
2990
+ max-block-size: none;
2991
+ }
2992
+
2969
2993
  .xgyk9h7 {
2970
2994
  max-inline-size: 100%;
2971
2995
  }
@@ -4101,6 +4125,12 @@
4101
4125
  }
4102
4126
  }
4103
4127
 
4128
+ @media (width >= 64rem) {
4129
+ .x13f99nf.x13f99nf {
4130
+ grid-template-columns: minmax(0, 1fr) minmax(0, .8fr);
4131
+ }
4132
+ }
4133
+
4104
4134
  @media (width >= 50rem) {
4105
4135
  .x2k1869.x2k1869 {
4106
4136
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hraness/design-kit",
3
- "version": "0.35.3",
3
+ "version": "0.36.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.35.3"
9
+ "version": "0.36.0"
10
10
  }
11
11
  ],
12
12
  "contract": "hraness.portfolio-inventory/v1",
@@ -6,6 +6,7 @@ import {
6
6
  type ReactNode,
7
7
  useId,
8
8
  useLayoutEffect,
9
+ useMemo,
9
10
  useRef,
10
11
  useState,
11
12
  } from "react";
@@ -145,8 +146,10 @@ export type ModeShowcaseProps<S extends string, M extends string, O extends stri
145
146
  status?: (state: Readonly<{ surface: S; mode: M; option: O | undefined }>) => ReactNode;
146
147
  /** Optional context that adds to the visual. Omit repeated descriptions or generic disclaimers. */
147
148
  caption?: string;
148
- /** Page-window height in CSS pixels at full scale. */
149
+ /** Page-window cap in natural mode; minimum complete stage height in fill mode. */
149
150
  height?: number;
151
+ /** Reserve every authored choice at readable size, up to 128 combinations. */
152
+ fit?: "natural" | "fill";
150
153
  /** Narrowest layout width before the stage scales down. */
151
154
  minWidth?: number;
152
155
  theme?: MockupTheme;
@@ -164,6 +167,7 @@ export type ModeShowcaseProps<S extends string, M extends string, O extends stri
164
167
  export function ModeShowcase<S extends string, M extends string, O extends string = string>({
165
168
  caption,
166
169
  className,
170
+ fit = "natural",
167
171
  height = 440,
168
172
  initial,
169
173
  label,
@@ -181,7 +185,9 @@ export function ModeShowcase<S extends string, M extends string, O extends strin
181
185
  assertUniqueIds(modes, "ModeShowcase mode");
182
186
  if (options !== undefined) assertUniqueIds(options, "ModeShowcase option");
183
187
  const captionText = optionalText(caption, "ModeShowcase");
184
- if (!(height > 0)) throw new RangeError("ModeShowcase height must be positive.");
188
+ if (!Number.isFinite(height) || !(height > 0)) throw new RangeError("ModeShowcase height must be finite and positive.");
189
+ if (fit !== "natural" && fit !== "fill") throw new RangeError("ModeShowcase fit must be natural or fill.");
190
+ if (fit === "fill" && surfaces.length * modes.length * (options?.length ?? 1) > 128) throw new RangeError("ModeShowcase fill supports up to 128 surface, mode, and option combinations.");
185
191
 
186
192
  const id = useId();
187
193
  const firstSurface = surfaces.find((surface) => surface.id === initial?.surface) ?? itemAt(surfaces, 0, "ModeShowcase surfaces");
@@ -199,6 +205,17 @@ export function ModeShowcase<S extends string, M extends string, O extends strin
199
205
  const optionChoice = options?.find((entry) => entry.id === option);
200
206
  const optionInactive = optionInactiveModes.includes(mode);
201
207
 
208
+ // Pure, nonanimated authored states reserve one maximum before any choice.
209
+ // They stay hidden and inert; only a detached measurement clone reveals them.
210
+ const measurements = useMemo(() => fit !== "fill" ? null : surfaces.flatMap((entry) => modes.flatMap((choice) => (options ?? [{ id: undefined }]).map((optionChoice) => (
211
+ <div aria-hidden="true" className="hkm-mode-surface" data-hkm-measurement="" hidden inert key={JSON.stringify([entry.id, choice.id, optionChoice.id])}>
212
+ <div className="hkm-fit"><div className="hkm-fit-inner">
213
+ {entry.render({ animated: false, mode: choice.id, option: optionChoice.id, previousMode: choice.id, theme })}
214
+ </div></div>
215
+ </div>
216
+ )))), [fit, modes, options, surfaces, theme]);
217
+ const stage = useFittedShowcaseStage(fit, measurements, JSON.stringify([mode, option]), height);
218
+
202
219
  const chooseMode = (next: M) => {
203
220
  if (next === mode) return;
204
221
  setPreviousMode(mode);
@@ -230,6 +247,7 @@ export function ModeShowcase<S extends string, M extends string, O extends strin
230
247
  <figure
231
248
  aria-label={label?.(surface) ?? `Illustration of ${surface.label.toLowerCase()}`}
232
249
  className={joinMockupClasses("hkm-showcase", "hkm-modes", className)}
250
+ data-hkm-fit={fit === "fill" ? fit : undefined}
233
251
  data-hkm-theme={theme}
234
252
  data-nosnippet=""
235
253
  >
@@ -291,7 +309,8 @@ export function ModeShowcase<S extends string, M extends string, O extends strin
291
309
  </div>
292
310
  {hint === "" ? null : <p className="hkm-showcase-hint">{hint}</p>}
293
311
  </div>
294
- <div className="hkm-mode-stage">
312
+ <div className="hkm-mode-stage" ref={stage}>
313
+ {measurements}
295
314
  {surfaces.map((entry) => (
296
315
  <div
297
316
  aria-hidden={entry.id !== surface.id}
@@ -301,7 +320,7 @@ export function ModeShowcase<S extends string, M extends string, O extends strin
301
320
  inert={entry.id !== surface.id}
302
321
  key={entry.id}
303
322
  >
304
- <FitToWidth minWidth={minWidth}>
323
+ <FitToWidth minWidth={fit === "fill" ? 1 : minWidth}>
305
324
  {entry.render({ animated: entry.id === surface.id && animated, mode, option, previousMode, theme })}
306
325
  </FitToWidth>
307
326
  </div>
@@ -331,6 +350,93 @@ export type ThroughStep = Readonly<{
331
350
  render: (state: Readonly<{ animated: boolean; theme: MockupTheme | undefined }>) => ReactNode;
332
351
  }>;
333
352
 
353
+ /** Measure complete mounted slides at a readable baseline, separately from fitted paint. */
354
+ function fitShowcaseStage(stage: HTMLDivElement, minimumHeight: number): void {
355
+ const owner = stage.parentElement;
356
+ if (owner === null || stage.clientWidth <= 0) return;
357
+ const probe = stage.cloneNode(true) as HTMLDivElement;
358
+ probe.setAttribute("aria-hidden", "true");
359
+ probe.setAttribute("inert", "");
360
+ probe.setAttribute("data-hkm-measuring", "");
361
+ probe.style.cssText = `position:absolute;visibility:hidden;pointer-events:none;inset:0 auto auto 0;inline-size:${stage.getBoundingClientRect().width}px;block-size:auto;`;
362
+ for (const sentinel of probe.querySelectorAll("[data-hkm-font-sentinel]")) sentinel.remove();
363
+ for (const node of probe.querySelectorAll("[id]")) node.removeAttribute("id");
364
+ for (const node of probe.querySelectorAll("[data-hkm-animated]")) node.removeAttribute("data-hkm-animated");
365
+ for (const body of probe.querySelectorAll<HTMLElement>('[data-hkm-density="presentation"]')) body.style.removeProperty("--hkm-terminal-presentation-size");
366
+ for (const fixture of probe.querySelectorAll<HTMLElement>("[data-hkm-measurement]")) fixture.hidden = false;
367
+ owner.append(probe);
368
+ try {
369
+ const naturalHeight = Math.max(minimumHeight, Math.ceil(probe.getBoundingClientRect().height));
370
+ // The tallest complete slide establishes the floor. Fitted type never feeds
371
+ // back into it, and changing the active tab never requests a measurement.
372
+ stage.style.setProperty("--hkm-showcase-fill-height", `${naturalHeight}px`);
373
+ for (const fixture of probe.querySelectorAll("[data-hkm-measurement]")) fixture.remove();
374
+ probe.style.blockSize = `${naturalHeight}px`;
375
+ probe.removeAttribute("data-hkm-measuring");
376
+ const bodies = [...stage.querySelectorAll<HTMLElement>('[data-hkm-density="presentation"]')].filter((body) => body.closest("[data-hkm-measurement]") === null);
377
+ const copies = [...probe.querySelectorAll<HTMLElement>('[data-hkm-density="presentation"]')];
378
+ for (const [index, copy] of copies.entries()) {
379
+ const body = bodies[index];
380
+ if (body === undefined) continue;
381
+ const lines = [...copy.querySelectorAll<HTMLElement>(".hkm-terminal-line")];
382
+ const wrappedRows = (line: HTMLElement) => Math.ceil((line.getBoundingClientRect().height - 0.5) / Number.parseFloat(getComputedStyle(line).lineHeight));
383
+ const baselineRows = lines.map(wrappedRows);
384
+ let low = 1;
385
+ let high = 4;
386
+ for (let attempt = 0; attempt < 9; attempt += 1) {
387
+ const candidate = (low + high) / 2;
388
+ copy.style.setProperty("--hkm-terminal-presentation-size", `${candidate}rem`);
389
+ if (copy.scrollHeight <= copy.clientHeight + 1 && copy.scrollWidth <= copy.clientWidth + 1 && lines.every((line, index) => { const baseline = baselineRows[index]; return baseline !== undefined && wrappedRows(line) <= baseline; })) low = candidate;
390
+ else high = candidate;
391
+ }
392
+ body.style.setProperty("--hkm-terminal-presentation-size", `${Math.floor(low * 1000) / 1000}rem`);
393
+ }
394
+ stage.setAttribute("data-hkm-fitted", "");
395
+ } finally {
396
+ probe.remove();
397
+ }
398
+ }
399
+
400
+ /** Share one measurement lifecycle across surface and walkthrough selectors. */
401
+ function useFittedShowcaseStage(fit: "natural" | "fill", source: unknown, variation = "", minimumHeight = 0) {
402
+ const stage = useRef<HTMLDivElement>(null);
403
+ useIsomorphicLayoutEffect(() => {
404
+ const node = stage.current;
405
+ if (fit !== "fill" || node === null || typeof ResizeObserver === "undefined") return undefined;
406
+ // A rem-sized box changes even when both the document and stage are fixed.
407
+ const fontSentinel = document.createElement("span");
408
+ fontSentinel.setAttribute("data-hkm-font-sentinel", "");
409
+ fontSentinel.setAttribute("aria-hidden", "true");
410
+ fontSentinel.inert = true;
411
+ fontSentinel.style.cssText = "position:absolute;inline-size:1rem;block-size:1rem;visibility:hidden;pointer-events:none;inset:0 auto auto 0;";
412
+ node.append(fontSentinel);
413
+ let previous = "";
414
+ let disposed = false;
415
+ const measure = () => {
416
+ if (disposed) return;
417
+ const key = `${node.clientWidth}/${getComputedStyle(document.documentElement).fontSize}`;
418
+ if (key === previous) return;
419
+ previous = key;
420
+ fitShowcaseStage(node, minimumHeight);
421
+ };
422
+ measure();
423
+ const observer = new ResizeObserver(measure);
424
+ observer.observe(node);
425
+ observer.observe(document.documentElement);
426
+ observer.observe(fontSentinel);
427
+ void document.fonts.ready.then(() => { previous = ""; measure(); });
428
+ return () => {
429
+ disposed = true;
430
+ observer.disconnect();
431
+ fontSentinel.remove();
432
+ node.style.removeProperty("--hkm-showcase-fill-height");
433
+ node.removeAttribute("data-hkm-fitted");
434
+ for (const body of node.querySelectorAll<HTMLElement>('[data-hkm-density="presentation"]')) body.style.removeProperty("--hkm-terminal-presentation-size");
435
+ };
436
+ }, [fit, source, variation, minimumHeight]);
437
+ return stage;
438
+ }
439
+
334
440
  /**
335
441
  * Folder tabs and chevron controls walk a flow. All render functions stay mounted
336
442
  * to reserve the tallest panel; inactive panels are inert and visually hidden.
@@ -340,12 +446,15 @@ export function StepThrough({
340
446
  caption,
341
447
  className,
342
448
  initial,
449
+ fit = "natural",
343
450
  label = "Steps",
344
451
  minWidth = 400,
345
452
  steps,
346
453
  theme,
347
454
  }: Readonly<{
348
455
  steps: readonly ThroughStep[];
456
+ /** Fill the tallest natural slide and fit presentation terminals without scaling. */
457
+ fit?: "natural" | "fill";
349
458
  caption?: string;
350
459
  initial?: string;
351
460
  label?: string;
@@ -354,6 +463,8 @@ export function StepThrough({
354
463
  className?: string;
355
464
  }>) {
356
465
  assertUniqueIds(steps, "StepThrough step");
466
+ if (fit !== "natural" && fit !== "fill") throw new RangeError("StepThrough fit must be natural or fill.");
467
+ const stage = useFittedShowcaseStage(fit, steps);
357
468
  const captionText = optionalText(caption, "StepThrough");
358
469
  const id = useId();
359
470
  const [index, setIndex] = useState(() => Math.max(0, steps.findIndex((step) => step.id === initial)));
@@ -376,7 +487,7 @@ export function StepThrough({
376
487
  };
377
488
 
378
489
  return (
379
- <figure aria-label={`Illustration: ${label.toLowerCase()}`} className={joinMockupClasses("hkm-showcase", "hkm-steps", className)} data-hkm-theme={theme} data-nosnippet="">
490
+ <figure aria-label={`Illustration: ${label.toLowerCase()}`} className={joinMockupClasses("hkm-showcase", "hkm-steps", className)} data-hkm-fit={fit === "fill" ? fit : undefined} data-hkm-theme={theme} data-nosnippet="">
380
491
  <div className="hkm-showcase-controls">
381
492
  <div aria-label={label} className="hkm-tabs hkm-folder-tabs hkm-step-tabs" role="tablist">
382
493
  {steps.map((entry, position) => (
@@ -403,7 +514,7 @@ export function StepThrough({
403
514
  ))}
404
515
  </div>
405
516
  </div>
406
- <div className="hkm-showcase-stage hkm-step-stage">
517
+ <div className="hkm-showcase-stage hkm-step-stage" ref={stage}>
407
518
  {steps.map((entry, position) => (
408
519
  <div
409
520
  aria-hidden={position !== current}
@@ -415,7 +526,9 @@ export function StepThrough({
415
526
  key={entry.id}
416
527
  role="tabpanel"
417
528
  >
418
- <FitToWidth minWidth={minWidth}>{entry.render({ animated: position === current && animated, theme })}</FitToWidth>
529
+ {fit === "fill"
530
+ ? <div className="hkm-fit"><div className="hkm-fit-inner">{entry.render({ animated: position === current && animated, theme })}</div></div>
531
+ : <FitToWidth minWidth={minWidth}>{entry.render({ animated: position === current && animated, theme })}</FitToWidth>}
419
532
  </div>
420
533
  ))}
421
534
  </div>
@@ -106,13 +106,15 @@ const TERMINAL_KINDS = new Set(["input", "output", "comment"]);
106
106
  * Commands and output are sample text; keep them to commands the product ships.
107
107
  */
108
108
  export function TerminalFrame({
109
+ density = "standard",
109
110
  fade,
110
111
  height,
111
112
  lines,
112
113
  prompt = "$",
113
114
  title = "Terminal",
114
115
  ...root
115
- }: MockupRootProps & Readonly<{ title?: string; prompt?: string; lines: readonly TerminalLine[]; height?: number; fade?: boolean }>) {
116
+ }: MockupRootProps & Readonly<{ title?: string; prompt?: string; lines: readonly TerminalLine[]; height?: number; fade?: boolean; density?: "standard" | "presentation" }>) {
117
+ if (density !== "standard" && density !== "presentation") throw new RangeError("Terminal density must be standard or presentation.");
116
118
  for (const line of lines) {
117
119
  if (!TERMINAL_KINDS.has(line.kind)) throw new TypeError(`Unknown terminal line kind ${JSON.stringify(line.kind)}.`);
118
120
  }
@@ -125,7 +127,7 @@ export function TerminalFrame({
125
127
  <span className="hkm-title">{title}</span>
126
128
  <span />
127
129
  </div>
128
- <div className="hkm-page hkm-terminal-body" data-hkm-fade={fades ? "" : undefined} style={pageStyle(height)}>
130
+ <div className="hkm-page hkm-terminal-body" data-hkm-density={density === "presentation" ? density : undefined} data-hkm-fade={fades ? "" : undefined} style={pageStyle(height)}>
129
131
  <div className="hkm-terminal-lines">
130
132
  {lines.map((line, index) => (
131
133
  <div className="hkm-terminal-line" data-hkm-beat={line.beat} data-hkm-line={line.kind} data-hkm-tone={line.tone} key={index}>
package/src/mockups.css CHANGED
@@ -333,6 +333,15 @@
333
333
  font-variant-ligatures: none;
334
334
  }
335
335
 
336
+ .hkm-root .hkm-terminal-body[data-hkm-density="presentation"] {
337
+ font-size: var(--hkm-terminal-presentation-size, 1rem);
338
+ line-height: 1.5;
339
+ }
340
+
341
+ .hkm-root .hkm-terminal-body[data-hkm-density="presentation"] .hkm-terminal-line {
342
+ min-block-size: 1.5em;
343
+ }
344
+
336
345
  .hkm-root .hkm-terminal-lines {
337
346
  display: grid;
338
347
  gap: 1px;
@@ -2522,6 +2531,40 @@
2522
2531
  .hkm-step-panel { grid-area: 1 / 1; min-inline-size: 0; align-self: start; }
2523
2532
  .hkm-step-panel[aria-hidden="true"] { visibility: hidden; pointer-events: none; }
2524
2533
  .hkm-showcase.hkm-steps .hkm-step-panel .hkm-root { border-start-start-radius: 0; border-start-end-radius: 0; box-shadow: none; }
2534
+ /* Fill uses the tallest complete slide as its natural height. It does not
2535
+ * scale text or ask fitted font sizes to determine the stage height. */
2536
+ .hkm-showcase[data-hkm-fit="fill"] [data-hkm-measuring] .hkm-page { max-block-size: none; }
2537
+
2538
+ .hkm-showcase[data-hkm-fit="fill"] :is(.hkm-step-stage, .hkm-mode-stage):not([data-hkm-measuring]) {
2539
+ block-size: var(--hkm-showcase-fill-height, auto);
2540
+ }
2541
+
2542
+ .hkm-showcase[data-hkm-fit="fill"] :is(.hkm-step-stage, .hkm-mode-stage):not([data-hkm-measuring]) :is(.hkm-step-panel, .hkm-mode-surface) {
2543
+ align-self: stretch;
2544
+ min-block-size: 0;
2545
+ }
2546
+
2547
+ .hkm-showcase[data-hkm-fit="fill"] :is(.hkm-step-stage, .hkm-mode-stage):not([data-hkm-measuring]) :is(.hkm-fit, .hkm-fit-inner, .hkm-root, .hkm-root > .hkm-window) {
2548
+ block-size: 100%;
2549
+ min-block-size: 0;
2550
+ }
2551
+
2552
+ .hkm-showcase[data-hkm-fit="fill"] :is(.hkm-step-stage, .hkm-mode-stage):not([data-hkm-measuring]) .hkm-window:has(> .hkm-page) {
2553
+ display: flex;
2554
+ flex-direction: column;
2555
+ }
2556
+
2557
+ .hkm-showcase[data-hkm-fit="fill"] :is(.hkm-step-stage, .hkm-mode-stage):not([data-hkm-measuring]) .hkm-window > .hkm-page {
2558
+ flex: 1 1 auto;
2559
+ block-size: auto;
2560
+ min-block-size: 0;
2561
+ max-block-size: none;
2562
+ }
2563
+
2564
+ .hkm-showcase[data-hkm-fit="fill"] :is(.hkm-step-stage, .hkm-mode-stage):not([data-hkm-measuring]) :is(.hkm-title-bar, .hkm-browser-bar) {
2565
+ flex: none;
2566
+ }
2567
+
2525
2568
  .hkm-showcase.hkm-steps .hkm-step-nav { justify-content: space-between; padding-block-start: 18px; gap: 16px; }
2526
2569
  .hkm-showcase.hkm-steps .hkm-step-button { display: inline-grid; place-items: center; min-inline-size: 52px; min-block-size: 52px; padding: 10px; border: 0; border-radius: 12px; background: transparent; color: var(--hkm-sc-fg); }
2527
2570
  .hkm-showcase.hkm-steps .hkm-step-button[data-hkm-primary] { background: var(--hkm-sc-fg); color: var(--hkm-sc-bg); }
@@ -415,6 +415,13 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
415
415
  z-index: 30;
416
416
  }
417
417
 
418
+ /* Intrinsic media sizing is shared with raw HTML card icons. */
419
+ .hraness-marketing-card__icon > :is(img, svg) {
420
+ inline-size: 100%;
421
+ block-size: 100%;
422
+ object-fit: contain;
423
+ }
424
+
418
425
  .hraness-marketing-card-row,
419
426
  .hraness-marketing-interface-grid,
420
427
  .hraness-marketing-trust-grid,
@@ -439,6 +446,11 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
439
446
  display: none;
440
447
  }
441
448
 
449
+ /* Supplemental proof belongs below both columns of a split hero. */
450
+ .hraness-marketing-hero[data-layout="split"] > :where(.hraness-marketing-proof, .hraness-marketing-facts) {
451
+ grid-column: 1 / -1;
452
+ }
453
+
442
454
  /* Keep all meaningful hero content above the inert decorative backdrop. */
443
455
  .hraness-marketing-hero > :where(.hraness-marketing-hero__copy, .hraness-marketing-hero__frame, .hraness-marketing-proof, .hraness-marketing-facts) {
444
456
  position: relative;
@@ -707,6 +707,17 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
707
707
  padding-block: var(--hraness-marketing-hero-space, clamp(3.5rem, 9vw, 7rem) clamp(2.5rem, 6vw, 4.5rem));
708
708
  }
709
709
 
710
+ .hraness-marketing-hero[data-layout="split"] {
711
+ grid-template-columns: minmax(0, 1fr);
712
+ align-items: center;
713
+ }
714
+
715
+ @media (min-width: 64rem) {
716
+ .hraness-marketing-hero[data-layout="split"] {
717
+ grid-template-columns: minmax(0, 1fr) minmax(0, 0.8fr);
718
+ }
719
+ }
720
+
710
721
  /* Hero backdrops are retired. Hand-authored markup that still ships the old
711
722
  * backdrop hooks paints nothing and takes no space. */
712
723
  .hraness-marketing-hero-backdrop {
@@ -1698,6 +1709,49 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
1698
1709
  box-shadow: var(--hraness-marketing-surface-shadow);
1699
1710
  }
1700
1711
 
1712
+ .hraness-marketing-card[data-layout="icon"] {
1713
+ display: grid;
1714
+ grid-template-columns: 3.5rem minmax(0, 1fr);
1715
+ align-items: center;
1716
+ gap: 1rem;
1717
+ padding: 1.125rem;
1718
+ }
1719
+
1720
+ .hraness-marketing-card[data-layout="icon"]:focus-visible {
1721
+ outline: 2px solid var(--hraness-marketing-ink);
1722
+ outline-offset: 3px;
1723
+ }
1724
+
1725
+ .hraness-marketing-card__icon {
1726
+ display: flex;
1727
+ align-items: center;
1728
+ justify-content: center;
1729
+ inline-size: 3.5rem;
1730
+ block-size: 3.5rem;
1731
+ min-inline-size: 0;
1732
+ pointer-events: none;
1733
+ }
1734
+
1735
+ .hraness-marketing-card__icon > :is(img, svg) {
1736
+ inline-size: 100%;
1737
+ block-size: 100%;
1738
+ object-fit: contain;
1739
+ }
1740
+
1741
+ .hraness-marketing-card__copy {
1742
+ display: grid;
1743
+ align-content: center;
1744
+ min-inline-size: 0;
1745
+ gap: 0.35rem;
1746
+ }
1747
+
1748
+ .hraness-marketing-card[data-layout="icon"] .hraness-marketing-card__meta {
1749
+ overflow: visible;
1750
+ min-block-size: 0;
1751
+ max-block-size: none;
1752
+ overflow-wrap: anywhere;
1753
+ }
1754
+
1701
1755
  .hraness-marketing-card__art {
1702
1756
  display: flex;
1703
1757
  flex: 0 0 auto;
@@ -2266,6 +2320,11 @@ html:has(:is(.hraness-marketing-header, .hraness-marketing-header-surface):not([
2266
2320
  }
2267
2321
  }
2268
2322
 
2323
+ /* Supplemental proof belongs below both columns of a split hero. */
2324
+ .hraness-marketing-hero[data-layout="split"] > :where(.hraness-marketing-proof, .hraness-marketing-facts) {
2325
+ grid-column: 1 / -1;
2326
+ }
2327
+
2269
2328
  /* Keep all meaningful hero content above the inert decorative backdrop. */
2270
2329
  .hraness-marketing-hero > :where(.hraness-marketing-hero__copy, .hraness-marketing-hero__frame, .hraness-marketing-proof, .hraness-marketing-facts) {
2271
2330
  position: relative;
@@ -29,6 +29,10 @@ export const providerMarkAssets = {
29
29
  glyph: { viewBox: "0 0 24 24", body: "<path d=\"M13.827 3.52h3.603L24 20h-3.603l-6.57-16.48zm-7.258 0h3.767L16.906 20h-3.674l-1.343-3.461H5.017l-1.344 3.46H0L6.57 3.522zm4.132 9.959L8.453 7.687 6.205 13.48H10.7z\"></path>" },
30
30
  art: null,
31
31
  },
32
+ "beeper": {
33
+ glyph: { viewBox: "62 47 114 143", body: "<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M62.2222 87.1665C62.2222 65.2221 79.9305 47.1665 102.312 47.1665H135.466C157.607 47.1665 175.555 65.0257 175.555 87.1665C175.529 99.0909 170.321 109.363 163.073 116.194L155.477 123.764C166.539 130.217 175.464 140.342 175.464 154.072C175.464 174.631 158.797 189.389 138.238 189.389H82.2222V121.819C70.3819 114.91 62.2222 101.987 62.2222 87.1665ZM102.312 58.2776C86.1111 58.2776 73.3333 71.2984 73.3333 87.1665C73.3333 103.035 86.1111 116.055 102.312 116.055H116.115L108.437 154.875L155.269 108.286C160.634 103.286 164.444 95.7229 164.444 87.1665C164.444 71.0554 151.25 58.104 135.466 58.2776H102.312Z\" fill=\"currentColor\"/>" },
34
+ art: { viewBox: "0 0 240 241", body: "<g clip-path=\"url(#clip0_2816_41661)\"> <rect width=\"240\" height=\"240\" transform=\"translate(0 0.5)\" fill=\"url(#paint0_linear_2816_41661)\"/> <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M62.2222 87.1665C62.2222 65.2221 79.9305 47.1665 102.312 47.1665H135.466C157.607 47.1665 175.555 65.0257 175.555 87.1665C175.529 99.0909 170.321 109.363 163.073 116.194L155.477 123.764C166.539 130.217 175.464 140.342 175.464 154.072C175.464 174.631 158.797 189.389 138.238 189.389H82.2222V121.819C70.3819 114.91 62.2222 101.987 62.2222 87.1665ZM102.312 58.2776C86.1111 58.2776 73.3333 71.2984 73.3333 87.1665C73.3333 103.035 86.1111 116.055 102.312 116.055H116.115L108.437 154.875L155.269 108.286C160.634 103.286 164.444 95.7229 164.444 87.1665C164.444 71.0554 151.25 58.104 135.466 58.2776H102.312Z\" fill=\"white\"/> </g> <defs> <linearGradient id=\"paint0_linear_2816_41661\" x1=\"240\" y1=\"-20.4739\" x2=\"182.953\" y2=\"299.878\" gradientUnits=\"userSpaceOnUse\"> <stop stop-color=\"#6953F2\"/> <stop offset=\"1\" stop-color=\"#0C52F9\"/> <stop offset=\"1\" stop-color=\"#0C52F9\"/> </linearGradient> <clipPath id=\"clip0_2816_41661\"> <rect y=\"0.5\" width=\"240\" height=\"240\" rx=\"120\" fill=\"white\"/> </clipPath> </defs>" },
35
+ },
32
36
  "claude": {
33
37
  glyph: { viewBox: "0 0 24 24", body: "<path d=\"M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z\"></path>" },
34
38
  art: { viewBox: "0 0 24 24", body: "<path d=\"M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z\" fill=\"#D97757\" fill-rule=\"nonzero\"></path>" },
@@ -73,6 +77,10 @@ export const providerMarkAssets = {
73
77
  glyph: { viewBox: "0 0 24 24", body: "<path d=\"M21.595 23.61c1.167-.254 2.405-.944 2.405-.944l-2.167-1.784a12.124 12.124 0 01-2.695-3.131 12.127 12.127 0 00-3.97-4.049l-.794-.462a1.115 1.115 0 01-.488-.815.844.844 0 01.154-.575c.413-.582 2.548-3.115 2.94-3.44.503-.416 1.065-.762 1.586-1.159.074-.056.148-.112.221-.17.003-.002.007-.004.009-.007.167-.131.325-.272.45-.438.453-.524.563-.988.59-1.193-.061-.197-.244-.639-.753-1.148.319.02.705.272 1.056.569.235-.376.481-.773.727-1.171.165-.266-.08-.465-.086-.471h-.001V3.22c-.007-.007-.206-.25-.471-.086-.567.35-1.134.702-1.639 1.021 0 0-.597-.012-1.305.599a2.464 2.464 0 00-.438.45l-.007.009c-.058.072-.114.147-.17.221-.397.521-.743 1.083-1.16 1.587-.323.391-2.857 2.526-3.44 2.94a.842.842 0 01-.574.153 1.115 1.115 0 01-.815-.488l-.462-.794a12.123 12.123 0 00-4.049-3.97 12.133 12.133 0 01-3.13-2.695L1.332 0S.643 1.238.39 2.405c.352.428 1.27 1.49 2.34 2.302C1.58 4.167.73 3.75.06 3.4c-.103.765-.063 1.92.043 2.816.726.317 1.961.806 3.219 1.066-1.006.236-2.11.278-2.961.262.15.554.358 1.119.64 1.688.119.263.25.52.39.77.452.125 2.222.383 3.164.171l-2.51.897a27.776 27.776 0 002.544 2.726c2.031-1.092 2.494-1.241 4.018-2.238-2.467 2.008-3.108 2.828-3.8 3.67l-.483.678c-.25.351-.469.725-.65 1.117-.61 1.31-1.47 4.1-1.47 4.1-.154.486.202.842.674.674 0 0 2.79-.861 4.1-1.47.392-.182.766-.4 1.118-.65l.677-.483c.227-.187.453-.37.701-.586 0 0 1.705 2.02 3.458 3.349l.896-2.511c-.211.942.046 2.712.17 3.163.252.142.509.272.772.392.569.28 1.134.49 1.688.64-.016-.853.026-1.956.261-2.962.26 1.258.75 2.493 1.067 3.219.895.106 2.051.146 2.816.043a73.87 73.87 0 01-1.308-2.67c.811 1.07 1.874 1.988 2.302 2.34h-.001z\"></path>" },
74
78
  art: null,
75
79
  },
80
+ "imessage": {
81
+ glyph: { viewBox: "0 0 24 24", body: "<path d=\"M5.285 0A5.273 5.273 0 0 0 0 5.285v13.43A5.273 5.273 0 0 0 5.285 24h13.43A5.273 5.273 0 0 0 24 18.715V5.285A5.273 5.273 0 0 0 18.715 0ZM12 4.154a8.809 7.337 0 0 1 8.809 7.338A8.809 7.337 0 0 1 12 18.828a8.809 7.337 0 0 1-2.492-.303A8.656 7.337 0 0 1 5.93 19.93a9.929 7.337 0 0 0 1.54-2.155 8.809 7.337 0 0 1-4.279-6.283A8.809 7.337 0 0 1 12 4.154\"/>" },
82
+ art: null,
83
+ },
76
84
  "mem0": {
77
85
  glyph: { viewBox: "0 0 100 100", body: "<g fill=\"currentColor\" clip-path=\"url(#mem0-clip)\"><path d=\"M50.004 41.547a8.446 8.446 0 0 0-8.45 8.449 8.446 8.446 0 0 0 8.45 8.449 8.447 8.447 0 0 0 8.449-8.45 8.446 8.446 0 0 0-8.45-8.448m.042-16.531a2.513 2.513 0 0 0 2.463-2.553A2.486 2.486 0 0 0 49.955 20a2.486 2.486 0 0 0-2.462 2.553 2.486 2.486 0 0 0 2.552 2.463m-.089 49.963a2.486 2.486 0 0 0-2.463 2.552 2.486 2.486 0 0 0 2.552 2.463 2.513 2.513 0 0 0 2.463-2.552 2.486 2.486 0 0 0-2.553-2.463M32.372 32.3a2.513 2.513 0 0 0-.065-3.547 2.487 2.487 0 0 0-3.548.065 2.487 2.487 0 0 0 .065 3.548 2.487 2.487 0 0 0 3.548-.065m35.262 35.394a2.487 2.487 0 0 0 .065 3.548 2.487 2.487 0 0 0 3.548-.065 2.513 2.513 0 0 0-.065-3.548 2.487 2.487 0 0 0-3.548.065m.065-35.329c.98.944 2.572.946 3.548-.065a2.487 2.487 0 0 0-.065-3.548 2.487 2.487 0 0 0-3.548.065 2.487 2.487 0 0 0 .065 3.548M32.307 67.63a2.487 2.487 0 0 0-3.548.065 2.487 2.487 0 0 0 .065 3.548c.98.944 2.572.946 3.548-.065a2.487 2.487 0 0 0-.065-3.548m45.046-20.136a2.487 2.487 0 0 0-2.364 2.647 2.514 2.514 0 0 0 2.646 2.364 2.487 2.487 0 0 0 2.364-2.646 2.484 2.484 0 0 0-2.646-2.362zM22.65 52.501a2.487 2.487 0 0 0 2.365-2.646 2.485 2.485 0 0 0-2.646-2.362 2.487 2.487 0 0 0-2.365 2.646 2.515 2.515 0 0 0 2.646 2.364zm23.463-16.915a4.37 4.37 0 0 0 6.053 1.152c1.125-.765 1.819-2.005 1.904-3.403.062-.908.261-2.196 1.268-2.89 1.03-.655 2.293-.335 3.154-.04 1.32.467 2.732.313 3.875-.425a4.32 4.32 0 0 0 1.894-2.743 4.32 4.32 0 0 0-.597-3.28l-.174-.26a4.37 4.37 0 0 0-6.053-1.152c-1.126.764-1.82 2.003-1.904 3.402-.063.908-.262 2.196-1.269 2.89-1.029.655-2.293.335-3.154.04-1.317-.467-2.731-.313-3.874.425a4.36 4.36 0 0 0-1.3 6.022l.175.262zm-9.602 40.709a4.37 4.37 0 0 0 6.053 1.152c1.126-.765 1.82-2.005 1.904-3.403.063-.908.262-2.197 1.269-2.89 1.029-.655 2.292-.335 3.154-.04 1.32.467 2.731.313 3.874-.425a4.32 4.32 0 0 0 1.895-2.743 4.32 4.32 0 0 0-.597-3.28l-.175-.26a4.37 4.37 0 0 0-6.053-1.152c-1.125.764-1.819 2.003-1.904 3.401-.062.909-.261 2.197-1.268 2.89-1.03.656-2.293.336-3.154.041-1.318-.468-2.732-.313-3.875.425a4.36 4.36 0 0 0-1.3 6.022l.175.262zM57.42 37.048q-.08.434-.076.872a4.37 4.37 0 0 0 3.548 4.217c1.338.252 2.705-.137 3.75-1.067.686-.6 1.735-1.372 2.939-1.15 1.19.261 1.86 1.38 2.261 2.199.604 1.261 1.714 2.15 3.045 2.434a4.33 4.33 0 0 0 3.28-.604 4.32 4.32 0 0 0 1.892-2.745l.062-.309q.082-.435.076-.872a4.37 4.37 0 0 0-3.548-4.217c-1.337-.253-2.702.137-3.749 1.067-.687.6-1.738 1.371-2.94 1.15-1.19-.262-1.86-1.38-2.26-2.2-.605-1.26-1.714-2.149-3.043-2.433a4.36 4.36 0 0 0-5.172 3.349l-.062.309zm-35.539 22.05q-.08.435-.076.873a4.37 4.37 0 0 0 3.548 4.216c1.338.253 2.704-.136 3.75-1.067.686-.6 1.735-1.37 2.938-1.15 1.19.262 1.862 1.38 2.262 2.2.604 1.261 1.714 2.15 3.045 2.433A4.33 4.33 0 0 0 40.627 66a4.32 4.32 0 0 0 1.892-2.744l.063-.31q.081-.433.076-.871a4.37 4.37 0 0 0-3.548-4.217c-1.337-.253-2.702.136-3.749 1.067-.686.6-1.738 1.371-2.94 1.15-1.19-.262-1.86-1.38-2.26-2.2-.605-1.261-1.714-2.149-3.043-2.433a4.36 4.36 0 0 0-5.172 3.349l-.062.308zm42.525-13.01a4.5 4.5 0 0 0-.671.563 4.37 4.37 0 0 0-.472 5.49c.767 1.125 2.009 1.816 3.404 1.897.909.06 2.197.26 2.893 1.264.657 1.027.34 2.29.045 3.154-.466 1.32-.31 2.731.431 3.874a4.33 4.33 0 0 0 2.745 1.89 4.33 4.33 0 0 0 3.28-.601l.261-.175q.365-.25.671-.563a4.37 4.37 0 0 0 .472-5.49c-.767-1.123-2.006-1.816-3.404-1.897-.909-.06-2.2-.26-2.893-1.264-.657-1.026-.34-2.29-.044-3.154.465-1.32.308-2.731-.432-3.872a4.36 4.36 0 0 0-6.024-1.288l-.262.174zM23.687 36.55a4.5 4.5 0 0 0-.671.564 4.37 4.37 0 0 0-.472 5.49c.767 1.125 2.009 1.816 3.405 1.897.908.06 2.196.26 2.892 1.264.658 1.026.34 2.29.045 3.154-.465 1.32-.309 2.731.432 3.874a4.32 4.32 0 0 0 2.744 1.89 4.33 4.33 0 0 0 3.28-.601l.261-.175q.365-.25.672-.563a4.37 4.37 0 0 0 .472-5.49c-.768-1.123-2.007-1.816-3.405-1.897-.908-.06-2.2-.26-2.892-1.264-.658-1.027-.34-2.29-.045-3.154.465-1.32.308-2.731-.432-3.872a4.36 4.36 0 0 0-6.024-1.289l-.262.175zm39.268 20.868a4.4 4.4 0 0 0-.873-.076 4.37 4.37 0 0 0-4.217 3.548c-.252 1.338.137 2.705 1.067 3.75.6.686 1.372 1.735 1.15 2.939-.261 1.19-1.38 1.86-2.199 2.261-1.261.604-2.15 1.714-2.433 3.045a4.33 4.33 0 0 0 .603 3.28 4.32 4.32 0 0 0 2.745 1.892l.309.062q.435.082.872.076a4.37 4.37 0 0 0 4.217-3.547c.253-1.338-.136-2.703-1.067-3.75-.6-.686-1.371-1.738-1.15-2.94.262-1.19 1.38-1.86 2.2-2.26 1.26-.605 2.149-1.714 2.433-3.043a4.36 4.36 0 0 0-3.349-5.172l-.308-.062zM40.9 21.88a4.4 4.4 0 0 0-.872-.077 4.37 4.37 0 0 0-4.217 3.548c-.253 1.338.136 2.704 1.067 3.75.6.686 1.371 1.735 1.15 2.939-.262 1.19-1.38 1.86-2.2 2.261-1.26.604-2.149 1.714-2.433 3.045a4.33 4.33 0 0 0 .604 3.28 4.32 4.32 0 0 0 2.745 1.892l.308.062q.435.081.873.076a4.37 4.37 0 0 0 4.216-3.548c.253-1.337-.136-2.702-1.067-3.749-.6-.687-1.37-1.738-1.15-2.94.262-1.19 1.38-1.86 2.2-2.26 1.261-.605 2.15-1.714 2.433-3.043a4.36 4.36 0 0 0-3.348-5.172l-.31-.062z\"/></g><defs><clipPath id=\"mem0-clip\"><path fill=\"currentColor\" d=\"M20 20h60v59.998H20z\"/></clipPath></defs>" },
78
86
  art: { viewBox: "0 0 100 100", body: "<rect width=\"100\" height=\"100\" fill=\"#CBB2FF\" rx=\"12\"/><g fill=\"#09090B\" clip-path=\"url(#mem0-clip)\"><path d=\"M50.004 41.547a8.446 8.446 0 0 0-8.45 8.449 8.446 8.446 0 0 0 8.45 8.449 8.447 8.447 0 0 0 8.449-8.45 8.446 8.446 0 0 0-8.45-8.448m.042-16.531a2.513 2.513 0 0 0 2.463-2.553A2.486 2.486 0 0 0 49.955 20a2.486 2.486 0 0 0-2.462 2.553 2.486 2.486 0 0 0 2.552 2.463m-.089 49.963a2.486 2.486 0 0 0-2.463 2.552 2.486 2.486 0 0 0 2.552 2.463 2.513 2.513 0 0 0 2.463-2.552 2.486 2.486 0 0 0-2.553-2.463M32.372 32.3a2.513 2.513 0 0 0-.065-3.547 2.487 2.487 0 0 0-3.548.065 2.487 2.487 0 0 0 .065 3.548 2.487 2.487 0 0 0 3.548-.065m35.262 35.394a2.487 2.487 0 0 0 .065 3.548 2.487 2.487 0 0 0 3.548-.065 2.513 2.513 0 0 0-.065-3.548 2.487 2.487 0 0 0-3.548.065m.065-35.329c.98.944 2.572.946 3.548-.065a2.487 2.487 0 0 0-.065-3.548 2.487 2.487 0 0 0-3.548.065 2.487 2.487 0 0 0 .065 3.548M32.307 67.63a2.487 2.487 0 0 0-3.548.065 2.487 2.487 0 0 0 .065 3.548c.98.944 2.572.946 3.548-.065a2.487 2.487 0 0 0-.065-3.548m45.046-20.136a2.487 2.487 0 0 0-2.364 2.647 2.514 2.514 0 0 0 2.646 2.364 2.487 2.487 0 0 0 2.364-2.646 2.484 2.484 0 0 0-2.646-2.362zM22.65 52.501a2.487 2.487 0 0 0 2.365-2.646 2.485 2.485 0 0 0-2.646-2.362 2.487 2.487 0 0 0-2.365 2.646 2.515 2.515 0 0 0 2.646 2.364zm23.463-16.915a4.37 4.37 0 0 0 6.053 1.152c1.125-.765 1.819-2.005 1.904-3.403.062-.908.261-2.196 1.268-2.89 1.03-.655 2.293-.335 3.154-.04 1.32.467 2.732.313 3.875-.425a4.32 4.32 0 0 0 1.894-2.743 4.32 4.32 0 0 0-.597-3.28l-.174-.26a4.37 4.37 0 0 0-6.053-1.152c-1.126.764-1.82 2.003-1.904 3.402-.063.908-.262 2.196-1.269 2.89-1.029.655-2.293.335-3.154.04-1.317-.467-2.731-.313-3.874.425a4.36 4.36 0 0 0-1.3 6.022l.175.262zm-9.602 40.709a4.37 4.37 0 0 0 6.053 1.152c1.126-.765 1.82-2.005 1.904-3.403.063-.908.262-2.197 1.269-2.89 1.029-.655 2.292-.335 3.154-.04 1.32.467 2.731.313 3.874-.425a4.32 4.32 0 0 0 1.895-2.743 4.32 4.32 0 0 0-.597-3.28l-.175-.26a4.37 4.37 0 0 0-6.053-1.152c-1.125.764-1.819 2.003-1.904 3.401-.062.909-.261 2.197-1.268 2.89-1.03.656-2.293.336-3.154.041-1.318-.468-2.732-.313-3.875.425a4.36 4.36 0 0 0-1.3 6.022l.175.262zM57.42 37.048q-.08.434-.076.872a4.37 4.37 0 0 0 3.548 4.217c1.338.252 2.705-.137 3.75-1.067.686-.6 1.735-1.372 2.939-1.15 1.19.261 1.86 1.38 2.261 2.199.604 1.261 1.714 2.15 3.045 2.434a4.33 4.33 0 0 0 3.28-.604 4.32 4.32 0 0 0 1.892-2.745l.062-.309q.082-.435.076-.872a4.37 4.37 0 0 0-3.548-4.217c-1.337-.253-2.702.137-3.749 1.067-.687.6-1.738 1.371-2.94 1.15-1.19-.262-1.86-1.38-2.26-2.2-.605-1.26-1.714-2.149-3.043-2.433a4.36 4.36 0 0 0-5.172 3.349l-.062.309zm-35.539 22.05q-.08.435-.076.873a4.37 4.37 0 0 0 3.548 4.216c1.338.253 2.704-.136 3.75-1.067.686-.6 1.735-1.37 2.938-1.15 1.19.262 1.862 1.38 2.262 2.2.604 1.261 1.714 2.15 3.045 2.433A4.33 4.33 0 0 0 40.627 66a4.32 4.32 0 0 0 1.892-2.744l.063-.31q.081-.433.076-.871a4.37 4.37 0 0 0-3.548-4.217c-1.337-.253-2.702.136-3.749 1.067-.686.6-1.738 1.371-2.94 1.15-1.19-.262-1.86-1.38-2.26-2.2-.605-1.261-1.714-2.149-3.043-2.433a4.36 4.36 0 0 0-5.172 3.349l-.062.308zm42.525-13.01a4.5 4.5 0 0 0-.671.563 4.37 4.37 0 0 0-.472 5.49c.767 1.125 2.009 1.816 3.404 1.897.909.06 2.197.26 2.893 1.264.657 1.027.34 2.29.045 3.154-.466 1.32-.31 2.731.431 3.874a4.33 4.33 0 0 0 2.745 1.89 4.33 4.33 0 0 0 3.28-.601l.261-.175q.365-.25.671-.563a4.37 4.37 0 0 0 .472-5.49c-.767-1.123-2.006-1.816-3.404-1.897-.909-.06-2.2-.26-2.893-1.264-.657-1.026-.34-2.29-.044-3.154.465-1.32.308-2.731-.432-3.872a4.36 4.36 0 0 0-6.024-1.288l-.262.174zM23.687 36.55a4.5 4.5 0 0 0-.671.564 4.37 4.37 0 0 0-.472 5.49c.767 1.125 2.009 1.816 3.405 1.897.908.06 2.196.26 2.892 1.264.658 1.026.34 2.29.045 3.154-.465 1.32-.309 2.731.432 3.874a4.32 4.32 0 0 0 2.744 1.89 4.33 4.33 0 0 0 3.28-.601l.261-.175q.365-.25.672-.563a4.37 4.37 0 0 0 .472-5.49c-.768-1.123-2.007-1.816-3.405-1.897-.908-.06-2.2-.26-2.892-1.264-.658-1.027-.34-2.29-.045-3.154.465-1.32.308-2.731-.432-3.872a4.36 4.36 0 0 0-6.024-1.289l-.262.175zm39.268 20.868a4.4 4.4 0 0 0-.873-.076 4.37 4.37 0 0 0-4.217 3.548c-.252 1.338.137 2.705 1.067 3.75.6.686 1.372 1.735 1.15 2.939-.261 1.19-1.38 1.86-2.199 2.261-1.261.604-2.15 1.714-2.433 3.045a4.33 4.33 0 0 0 .603 3.28 4.32 4.32 0 0 0 2.745 1.892l.309.062q.435.082.872.076a4.37 4.37 0 0 0 4.217-3.547c.253-1.338-.136-2.703-1.067-3.75-.6-.686-1.371-1.738-1.15-2.94.262-1.19 1.38-1.86 2.2-2.26 1.26-.605 2.149-1.714 2.433-3.043a4.36 4.36 0 0 0-3.349-5.172l-.308-.062zM40.9 21.88a4.4 4.4 0 0 0-.872-.077 4.37 4.37 0 0 0-4.217 3.548c-.253 1.338.136 2.704 1.067 3.75.6.686 1.371 1.735 1.15 2.939-.262 1.19-1.38 1.86-2.2 2.261-1.26.604-2.149 1.714-2.433 3.045a4.33 4.33 0 0 0 .604 3.28 4.32 4.32 0 0 0 2.745 1.892l.308.062q.435.081.873.076a4.37 4.37 0 0 0 4.216-3.548c.253-1.337-.136-2.702-1.067-3.749-.6-.687-1.37-1.738-1.15-2.94.262-1.19 1.38-1.86 2.2-2.26 1.261-.605 2.15-1.714 2.433-3.043a4.36 4.36 0 0 0-3.348-5.172l-.31-.062z\"/></g><defs><clipPath id=\"mem0-clip\"><path fill=\"#fff\" d=\"M20 20h60v59.998H20z\"/></clipPath></defs>" },
@@ -97,6 +105,10 @@ export const providerMarkAssets = {
97
105
  glyph: { viewBox: "0 0 24 24", body: "<path d=\"M9.643 14.012c.615-.183 1.605-.465 2.745-.534-.684-1.725-.849-3.235-.716-4.579.153-1.552.7-2.847 1.234-3.95.114-.235.223-.454.328-.664.149-.297.289-.577.42-.86.217-.47.378-.885.46-1.27.08-.38.08-.719-.014-1.044-.095-.325-.297-.675-.681-1.06a1.6 1.6 0 00-1.475.36l-4.95 4.453a1.602 1.602 0 00-.512.952l-.427 2.83c.67.592 2.327 2.317 3.335 4.71.09.213.174.432.253.656zM5.855 9.937c-.024.1-.057.197-.099.29L3.14 16.058a1.602 1.602 0 00.313 1.772l4.117 4.24c2.102-3.102 1.795-6.02.835-8.3-.728-1.73-1.832-3.083-2.55-3.833z\"></path><path d=\"M8.52 22.57c.073.01.146.018.22.02.781.023 2.095.091 3.16.288.87.16 2.593.642 4.011 1.056 1.082.316 2.197-.548 2.354-1.664.115-.814.33-1.735.725-2.58l-.009.004c-.67-1.87-1.523-3.077-2.417-3.847a5.294 5.294 0 00-2.777-1.258c-1.541-.216-2.952.189-3.841.45.532 2.218.368 4.828-1.425 7.53z\"></path><path d=\"M19.676 18.538a69.072 69.072 0 001.858-2.952.811.811 0 00-.061-.901c-.516-.684-1.504-2.075-2.042-3.362-.554-1.323-.636-3.378-.64-4.378a1.708 1.708 0 00-.359-1.051L15.235 1.83a3.757 3.757 0 01-.076.545c-.107.503-.307 1.004-.536 1.498-.135.29-.29.601-.446.915-.105.21-.21.42-.31.626-.517 1.068-.998 2.227-1.132 3.59-.125 1.262.046 2.73.814 4.484.128.01.257.025.386.043a6.364 6.364 0 013.327 1.506c.916.79 1.743 1.921 2.414 3.5z\"></path>" },
98
106
  art: { viewBox: "0 0 24 24", body: "<path d=\"M9.643 14.012c.615-.183 1.605-.465 2.745-.534-.684-1.725-.849-3.235-.716-4.579.153-1.552.7-2.847 1.234-3.95.114-.235.223-.454.328-.664.149-.297.289-.577.42-.86.217-.47.378-.885.46-1.27.08-.38.08-.719-.014-1.044-.095-.325-.297-.675-.681-1.06a1.6 1.6 0 00-1.475.36l-4.95 4.453a1.602 1.602 0 00-.512.952l-.427 2.83c.67.592 2.327 2.317 3.335 4.71.09.213.174.432.253.656zM5.855 9.937c-.024.1-.057.197-.099.29L3.14 16.058a1.602 1.602 0 00.313 1.772l4.117 4.24c2.102-3.102 1.795-6.02.835-8.3-.728-1.73-1.832-3.083-2.55-3.833z\" fill=\"#A88BFA\"></path><path d=\"M8.52 22.57c.073.01.146.018.22.02.781.023 2.095.091 3.16.288.87.16 2.593.642 4.011 1.056 1.082.316 2.197-.548 2.354-1.664.115-.814.33-1.735.725-2.58l-.009.004c-.67-1.87-1.523-3.077-2.417-3.847a5.294 5.294 0 00-2.777-1.258c-1.541-.216-2.952.189-3.841.45.532 2.218.368 4.828-1.425 7.53z\" fill=\"#A88BFA\"></path><path d=\"M19.676 18.538a69.072 69.072 0 001.858-2.952.811.811 0 00-.061-.901c-.516-.684-1.504-2.075-2.042-3.362-.554-1.323-.636-3.378-.64-4.378a1.708 1.708 0 00-.359-1.051L15.235 1.83a3.757 3.757 0 01-.076.545c-.107.503-.307 1.004-.536 1.498-.135.29-.29.601-.446.915-.105.21-.21.42-.31.626-.517 1.068-.998 2.227-1.132 3.59-.125 1.262.046 2.73.814 4.484.128.01.257.025.386.043a6.364 6.364 0 013.327 1.506c.916.79 1.743 1.921 2.414 3.5z\" fill=\"#A88BFA\"></path>" },
99
107
  },
108
+ "ollama": {
109
+ glyph: { viewBox: "0 0 24 24", body: "<path d=\"M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z\"></path>" },
110
+ art: null,
111
+ },
100
112
  "openai": {
101
113
  glyph: { viewBox: "0 0 24 24", body: "<path d=\"M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z\"></path>" },
102
114
  art: null,
@@ -117,6 +129,14 @@ export const providerMarkAssets = {
117
129
  glyph: { viewBox: "0 0 206 168", body: "<path fill=\"currentColor\" d=\"M205.864 66.263h-76.401V0h-24.684v71.897c0 7.636 3.021 14.97 8.391 20.373l62.383 62.777 17.454-17.564-46.076-46.365h58.948v-24.84l-.015-.015ZM12.872 30.517l46.075 46.365H0v24.84h76.4v66.264h24.685V96.089c0-7.637-3.021-14.97-8.39-20.374l-62.37-62.762-17.453 17.564Z\"/>" },
118
130
  art: null,
119
131
  },
132
+ "vercel": {
133
+ glyph: { viewBox: "0 0 24 24", body: "<path d=\"M12 0l12 20.785H0L12 0z\"></path>" },
134
+ art: null,
135
+ },
136
+ "whatsapp": {
137
+ glyph: { viewBox: "0 0 24 24", body: "<path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413Z\"/>" },
138
+ art: null,
139
+ },
120
140
  "xai": {
121
141
  glyph: { viewBox: "0 0 24 24", body: "<path d=\"M6.469 8.776L16.512 23h-4.464L2.005 8.776H6.47zm-.004 7.9l2.233 3.164L6.467 23H2l4.465-6.324zM22 2.582V23h-3.659V7.764L22 2.582zM22 1l-9.952 14.095-2.233-3.163L17.533 1H22z\"></path>" },
122
142
  art: null,
@@ -31,6 +31,7 @@ const MARK_SPECS = {
31
31
  alibabacloud: { accent: "#ff6a00", aliases: ["alibaba", "alibaba cloud"], kind: "vendor", name: "Alibaba Cloud" },
32
32
  amp: { accent: "#f34e3f", aliases: ["amp"], kind: "agent", name: "Amp" },
33
33
  anthropic: { accent: "#d97757", aliases: ["anthropic"], kind: "vendor", name: "Anthropic" },
34
+ beeper: { accent: "#6953f2", aliases: ["beeper", "beeper chat"], kind: "vendor", name: "Beeper" },
34
35
  claude: { accent: "#d97757", aliases: ["claude"], kind: "vendor", name: "Claude" },
35
36
  claudecode: { accent: "#d97757", aliases: ["claude code", "claude-code"], kind: "agent", name: "Claude Code" },
36
37
  codex: { accent: "#111418", aliases: ["codex", "codex cli"], kind: "agent", name: "Codex" },
@@ -42,17 +43,21 @@ const MARK_SPECS = {
42
43
  geminicli: { accent: "#3186ff", aliases: ["gemini cli", "gemini-cli"], kind: "agent", name: "Gemini CLI" },
43
44
  githubcopilot: { accent: "#1f2328", aliases: ["github copilot", "github-copilot", "copilot"], kind: "agent", name: "GitHub Copilot" },
44
45
  goose: { accent: "#0e7c86", aliases: ["goose", "block goose"], kind: "agent", name: "Goose" },
46
+ imessage: { accent: "#34da50", aliases: ["imessage", "apple messages"], kind: "vendor", name: "iMessage" },
45
47
  mem0: { accent: "#cbb2ff", aliases: ["mem0", "memzero"], kind: "vendor", name: "Mem0" },
46
48
  meta: { accent: "#0082fb", aliases: ["meta", "meta ai", "llama"], kind: "vendor", name: "Meta" },
47
49
  mistral: { accent: "#fa500f", aliases: ["mistral", "mistral ai"], kind: "vendor", name: "Mistral" },
48
50
  moonshot: { accent: "#5b5bd6", aliases: ["moonshot", "moonshot ai", "kimi"], kind: "vendor", name: "Moonshot AI" },
49
51
  nvidia: { accent: "#74b71b", aliases: ["nvidia"], kind: "vendor", name: "NVIDIA" },
50
52
  obsidian: { accent: "#7c3aed", aliases: ["obsidian", "obsidian md"], kind: "vendor", name: "Obsidian" },
53
+ ollama: { accent: "#111111", aliases: ["ollama"], kind: "vendor", name: "Ollama" },
51
54
  openai: { accent: "#0f1014", aliases: ["openai", "chatgpt", "gpt"], kind: "vendor", name: "OpenAI" },
52
55
  perplexity: { accent: "#22b8cd", aliases: ["perplexity", "perplexity ai"], kind: "vendor", name: "Perplexity" },
53
56
  opencode: { accent: "#d97706", aliases: ["opencode", "open code"], kind: "agent", name: "opencode" },
54
57
  qwen: { accent: "#615ced", aliases: ["qwen", "tongyi"], kind: "vendor", name: "Qwen" },
55
58
  supermemory: { accent: "#2563eb", aliases: ["supermemory", "supermemory ai"], kind: "vendor", name: "Supermemory" },
59
+ vercel: { accent: "#000000", aliases: ["vercel", "vercel ai gateway"], kind: "vendor", name: "Vercel" },
60
+ whatsapp: { accent: "#25d366", aliases: ["whatsapp", "whats app"], kind: "vendor", name: "WhatsApp" },
56
61
  xai: { accent: "#1a1a1a", aliases: ["xai", "x.ai", "grok", "spacexai"], kind: "vendor", name: "xAI" },
57
62
  zai: { accent: "#2d4d9e", aliases: ["zai", "z.ai", "z ai", "zhipu"], kind: "vendor", name: "Z.AI" },
58
63
  } as const satisfies Record<keyof typeof providerMarkAssets, ProviderMarkSpec>;