@orangecheck/design 0.19.0 → 0.21.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 (42) hide show
  1. package/dist/chrome.d.mts +1 -1
  2. package/dist/chrome.d.ts +1 -1
  3. package/dist/chrome.js +16 -0
  4. package/dist/chrome.js.map +1 -1
  5. package/dist/chrome.mjs +16 -0
  6. package/dist/chrome.mjs.map +1 -1
  7. package/dist/components.d.mts +1 -1
  8. package/dist/components.d.ts +1 -1
  9. package/dist/components.js +830 -178
  10. package/dist/components.js.map +1 -1
  11. package/dist/components.mjs +780 -143
  12. package/dist/components.mjs.map +1 -1
  13. package/dist/composites.d.mts +142 -1
  14. package/dist/composites.d.ts +142 -1
  15. package/dist/composites.js +641 -3
  16. package/dist/composites.js.map +1 -1
  17. package/dist/composites.mjs +627 -4
  18. package/dist/composites.mjs.map +1 -1
  19. package/dist/index.d.mts +2 -2
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.js +538 -11
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +522 -13
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/primitives.d.mts +24 -4
  26. package/dist/primitives.d.ts +24 -4
  27. package/dist/primitives.js +123 -11
  28. package/dist/primitives.js.map +1 -1
  29. package/dist/primitives.mjs +121 -13
  30. package/dist/primitives.mjs.map +1 -1
  31. package/dist/styles/fonts/hanken-grotesk-latin-ext.woff2 +0 -0
  32. package/dist/styles/fonts/hanken-grotesk-latin.woff2 +0 -0
  33. package/dist/styles/fonts.css +29 -0
  34. package/dist/styles/theme.css +43 -5
  35. package/dist/styles/themes/ember.css +223 -0
  36. package/dist/styles/themes.css +1 -0
  37. package/dist/styles.css +1 -0
  38. package/dist/tokens.js +6 -0
  39. package/dist/tokens.js.map +1 -1
  40. package/dist/tokens.mjs +6 -0
  41. package/dist/tokens.mjs.map +1 -1
  42. package/package.json +1 -1
@@ -6,10 +6,23 @@ var clsx = require('clsx');
6
6
  var tailwindMerge = require('tailwind-merge');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
8
  var Link6 = require('next/link');
9
- var React = require('react');
9
+ var React2 = require('react');
10
+ var reactSlot = require('@radix-ui/react-slot');
11
+ var classVarianceAuthority = require('class-variance-authority');
12
+ require('@radix-ui/react-label');
13
+ require('@radix-ui/react-checkbox');
14
+ require('@radix-ui/react-radio-group');
15
+ require('@radix-ui/react-switch');
16
+ var nextThemes = require('next-themes');
17
+ require('@radix-ui/react-separator');
18
+ require('@radix-ui/react-dialog');
19
+ var AccordionPrimitive = require('@radix-ui/react-accordion');
20
+ require('@radix-ui/react-select');
21
+ require('sonner');
22
+ require('@radix-ui/react-tabs');
23
+ require('qrcode');
10
24
  var router = require('next/router');
11
25
  var authClient = require('@orangecheck/auth-client');
12
- var nextThemes = require('next-themes');
13
26
 
14
27
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
15
28
 
@@ -33,7 +46,8 @@ function _interopNamespace(e) {
33
46
 
34
47
  var Popover__namespace = /*#__PURE__*/_interopNamespace(Popover);
35
48
  var Link6__default = /*#__PURE__*/_interopDefault(Link6);
36
- var React__namespace = /*#__PURE__*/_interopNamespace(React);
49
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
50
+ var AccordionPrimitive__namespace = /*#__PURE__*/_interopNamespace(AccordionPrimitive);
37
51
 
38
52
  // src/composites/help-hint.tsx
39
53
  function cn(...inputs) {
@@ -190,7 +204,7 @@ function StatTile({ children, ...item }) {
190
204
  function StatBlock({ label, value, sub, delta, tone = "default", className }) {
191
205
  const toneClass = tone === "success" ? "text-success" : tone === "warning" ? "text-warning" : tone === "destructive" ? "text-destructive" : "text-foreground";
192
206
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-1", className), children: [
193
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "label-mono text-[10px]", children: label }),
207
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "label-mono text-muted-foreground text-[10px]", children: label }),
194
208
  /* @__PURE__ */ jsxRuntime.jsx(
195
209
  "span",
196
210
  {
@@ -262,7 +276,7 @@ function DefinitionList({ items, className }) {
262
276
  "grid gap-x-5 gap-y-2 text-sm sm:grid-cols-[auto_1fr] sm:items-baseline",
263
277
  className
264
278
  ),
265
- children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(React.Fragment, { children: [
279
+ children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(React2.Fragment, { children: [
266
280
  /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "label-mono text-muted-foreground text-[10px]", children: item.label }),
267
281
  /* @__PURE__ */ jsxRuntime.jsx("dd", { className: "text-foreground font-mono text-xs break-all", children: item.value })
268
282
  ] }, i))
@@ -288,6 +302,749 @@ function DataRow({ children, meta, action, as, className }) {
288
302
  }
289
303
  );
290
304
  }
305
+ function TwoToneHeading({
306
+ lead,
307
+ muted,
308
+ as,
309
+ tone = "default",
310
+ className
311
+ }) {
312
+ const Tag = as ?? "h2";
313
+ const leadColor = tone === "onBrand" ? "text-primary-foreground" : "text-foreground";
314
+ const mutedColor = tone === "onBrand" ? "text-primary-foreground/60" : "text-foreground/40";
315
+ return /* @__PURE__ */ jsxRuntime.jsxs(
316
+ Tag,
317
+ {
318
+ className: cn(
319
+ "font-extrabold tracking-[-0.02em] leading-[1.0] text-balance",
320
+ "text-3xl sm:text-4xl md:text-5xl",
321
+ leadColor,
322
+ className
323
+ ),
324
+ children: [
325
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: lead }),
326
+ muted ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: mutedColor, children: [
327
+ " ",
328
+ muted
329
+ ] }) : null
330
+ ]
331
+ }
332
+ );
333
+ }
334
+ function MarketingHeading({
335
+ eyebrow,
336
+ lead,
337
+ muted,
338
+ body,
339
+ align = "start",
340
+ tone = "default",
341
+ as,
342
+ className
343
+ }) {
344
+ const centered = align === "center";
345
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col", centered && "items-center text-center", className), children: [
346
+ eyebrow && /* @__PURE__ */ jsxRuntime.jsx(
347
+ "p",
348
+ {
349
+ className: cn(
350
+ "label-mono mb-3",
351
+ tone === "onBrand" ? "text-primary-foreground/80" : "text-primary"
352
+ ),
353
+ children: eyebrow
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsxRuntime.jsx(
357
+ TwoToneHeading,
358
+ {
359
+ lead,
360
+ muted,
361
+ as,
362
+ tone,
363
+ className: cn("max-w-4xl", centered && "mx-auto")
364
+ }
365
+ ),
366
+ body && /* @__PURE__ */ jsxRuntime.jsx(
367
+ "p",
368
+ {
369
+ className: cn(
370
+ "mt-4 max-w-2xl text-base sm:text-lg",
371
+ tone === "onBrand" ? "text-primary-foreground/80" : "text-muted-foreground",
372
+ centered && "mx-auto"
373
+ ),
374
+ children: body
375
+ }
376
+ )
377
+ ] });
378
+ }
379
+ var buttonVariants = classVarianceAuthority.cva(
380
+ "focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive inline-flex shrink-0 items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-all outline-none focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
381
+ {
382
+ variants: {
383
+ variant: {
384
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
385
+ destructive: "bg-destructive hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60 text-white",
386
+ outline: "bg-background hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50 border shadow-xs",
387
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
388
+ ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
389
+ link: "text-primary underline-offset-4 hover:underline",
390
+ // For CTAs placed ON a saturated brand band or a dark section
391
+ // (e.g. a terracotta hero / footer / a forced-dark block) where
392
+ // the surface is dark+light-text in either mode. A neutral white
393
+ // pill + a translucent-white ghost read on any such surface;
394
+ // hardcoded white is deliberate (cf. destructive's text-white).
395
+ onBrand: "bg-white text-neutral-900 shadow-sm hover:bg-white/90",
396
+ onBrandOutline: "border border-white/40 bg-transparent text-white hover:bg-white/10"
397
+ },
398
+ size: {
399
+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
400
+ sm: "h-8 gap-1.5 rounded-md px-3 has-[>svg]:px-2.5",
401
+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
402
+ icon: "size-9"
403
+ }
404
+ },
405
+ defaultVariants: {
406
+ variant: "default",
407
+ size: "default"
408
+ }
409
+ }
410
+ );
411
+ function Button({
412
+ className,
413
+ variant,
414
+ size,
415
+ asChild = false,
416
+ ...props
417
+ }) {
418
+ const Comp = asChild ? reactSlot.Slot : "button";
419
+ return /* @__PURE__ */ jsxRuntime.jsx(
420
+ Comp,
421
+ {
422
+ "data-slot": "button",
423
+ className: cn(buttonVariants({ variant, size, className })),
424
+ ...props
425
+ }
426
+ );
427
+ }
428
+ classVarianceAuthority.cva(
429
+ "focus-visible:border-ring focus-visible:ring-ring/50 inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-md border px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] [&>svg]:pointer-events-none [&>svg]:size-3",
430
+ {
431
+ variants: {
432
+ variant: {
433
+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90 border-transparent",
434
+ secondary: "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90 border-transparent",
435
+ destructive: "bg-destructive text-destructive-foreground [a&]:hover:bg-destructive/90 border-transparent",
436
+ warning: "bg-warning text-warning-foreground [a&]:hover:bg-warning/90 border-transparent",
437
+ success: "bg-success text-success-foreground [a&]:hover:bg-success/90 border-transparent",
438
+ info: "bg-info text-info-foreground [a&]:hover:bg-info/90 border-transparent",
439
+ brand: "bg-brand-soft text-accent-foreground border-transparent",
440
+ neutral: "bg-foreground text-background [a&]:hover:bg-foreground/90 border-transparent",
441
+ outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground"
442
+ }
443
+ },
444
+ defaultVariants: { variant: "default" }
445
+ }
446
+ );
447
+ function Input({ className, type, ...props }) {
448
+ return /* @__PURE__ */ jsxRuntime.jsx(
449
+ "input",
450
+ {
451
+ type,
452
+ "data-slot": "input",
453
+ className: cn(
454
+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground border-input bg-input/30 hover:bg-input/50 dark:bg-input/30 dark:hover:bg-input/50 h-9 w-full min-w-0 rounded-md border px-3 py-1 text-base shadow-xs transition-[color,box-shadow,background-color] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
455
+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
456
+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
457
+ className
458
+ ),
459
+ ...props
460
+ }
461
+ );
462
+ }
463
+ classVarianceAuthority.cva(
464
+ "relative grid w-full grid-cols-[0_1fr] items-start gap-x-0 gap-y-0.5 rounded-md border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
465
+ {
466
+ variants: {
467
+ variant: {
468
+ default: "bg-card text-card-foreground",
469
+ destructive: "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
470
+ success: "text-success bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-success/90",
471
+ warning: "text-warning bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-warning/90"
472
+ }
473
+ },
474
+ defaultVariants: { variant: "default" }
475
+ }
476
+ );
477
+ globalThis.process?.env?.NODE_ENV;
478
+ globalThis.process?.env?.NODE_ENV;
479
+ var TOOLTIP_SURFACE_CLASS = "bg-popover text-popover-foreground border-border rounded-md border p-2.5 shadow-md";
480
+ var TOOLTIP_MOTION_CLASS = "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 origin-(--radix-popover-content-transform-origin) duration-150 ease-out";
481
+ function compose(theirs, ours) {
482
+ return (e) => {
483
+ theirs?.(e);
484
+ ours(e);
485
+ };
486
+ }
487
+ var lastInputWasKeyboard = false;
488
+ var modalityInstalled = false;
489
+ function installModalityTracking() {
490
+ if (modalityInstalled || typeof window === "undefined") return;
491
+ modalityInstalled = true;
492
+ window.addEventListener("keydown", () => lastInputWasKeyboard = true, true);
493
+ window.addEventListener("pointerdown", () => lastInputWasKeyboard = false, true);
494
+ }
495
+ function Tooltip({
496
+ content,
497
+ children,
498
+ side = "bottom",
499
+ align = "start",
500
+ sideOffset = 8,
501
+ collisionPadding = 12,
502
+ openDelay = 300,
503
+ closeDelay = 90,
504
+ disabled = false,
505
+ portal = true,
506
+ zIndexClassName = "z-50",
507
+ contentClassName
508
+ }) {
509
+ const [hovering, setHovering] = React2__namespace.useState(false);
510
+ const [focusing, setFocusing] = React2__namespace.useState(false);
511
+ const [isFinePointer, setIsFinePointer] = React2__namespace.useState(false);
512
+ const openTimer = React2__namespace.useRef(null);
513
+ const closeTimer = React2__namespace.useRef(null);
514
+ React2__namespace.useEffect(() => {
515
+ installModalityTracking();
516
+ const mq = window.matchMedia("(hover: hover) and (pointer: fine)");
517
+ const apply = () => setIsFinePointer(mq.matches);
518
+ apply();
519
+ mq.addEventListener("change", apply);
520
+ return () => mq.removeEventListener("change", apply);
521
+ }, []);
522
+ const clearTimers = React2__namespace.useCallback(() => {
523
+ if (openTimer.current) clearTimeout(openTimer.current);
524
+ if (closeTimer.current) clearTimeout(closeTimer.current);
525
+ }, []);
526
+ React2__namespace.useEffect(() => clearTimers, [clearTimers]);
527
+ React2__namespace.useEffect(() => {
528
+ if (disabled) {
529
+ clearTimers();
530
+ setHovering(false);
531
+ }
532
+ }, [disabled, clearTimers]);
533
+ const handlePointerEnter = () => {
534
+ if (!isFinePointer) return;
535
+ if (closeTimer.current) clearTimeout(closeTimer.current);
536
+ openTimer.current = setTimeout(() => setHovering(true), openDelay);
537
+ };
538
+ const handlePointerLeave = () => {
539
+ if (openTimer.current) clearTimeout(openTimer.current);
540
+ closeTimer.current = setTimeout(() => setHovering(false), closeDelay);
541
+ };
542
+ const handlePointerDown = () => {
543
+ clearTimers();
544
+ setHovering(false);
545
+ setFocusing(false);
546
+ };
547
+ const handleFocus = () => {
548
+ if (lastInputWasKeyboard) {
549
+ clearTimers();
550
+ setFocusing(true);
551
+ }
552
+ };
553
+ const handleBlur = () => {
554
+ clearTimers();
555
+ setFocusing(false);
556
+ };
557
+ const handleKeyDown = (e) => {
558
+ if (e.key === "Escape") {
559
+ clearTimers();
560
+ setHovering(false);
561
+ setFocusing(false);
562
+ }
563
+ };
564
+ const effectiveOpen = !disabled && (isFinePointer && hovering || focusing);
565
+ const extra = {};
566
+ const childProps = children.props;
567
+ extra.onPointerEnter = compose(childProps.onPointerEnter, handlePointerEnter);
568
+ extra.onPointerLeave = compose(childProps.onPointerLeave, handlePointerLeave);
569
+ extra.onPointerDown = compose(childProps.onPointerDown, handlePointerDown);
570
+ extra.onFocus = compose(childProps.onFocus, handleFocus);
571
+ extra.onBlur = compose(childProps.onBlur, handleBlur);
572
+ extra.onKeyDown = compose(childProps.onKeyDown, handleKeyDown);
573
+ const trigger = React2__namespace.cloneElement(children, extra);
574
+ const contentEl = /* @__PURE__ */ jsxRuntime.jsx(
575
+ Popover__namespace.Content,
576
+ {
577
+ side,
578
+ align,
579
+ sideOffset,
580
+ collisionPadding,
581
+ "aria-hidden": true,
582
+ onOpenAutoFocus: (e) => e.preventDefault(),
583
+ onCloseAutoFocus: (e) => e.preventDefault(),
584
+ onFocusOutside: (e) => e.preventDefault(),
585
+ className: cn(
586
+ TOOLTIP_SURFACE_CLASS,
587
+ TOOLTIP_MOTION_CLASS,
588
+ "pointer-events-none",
589
+ zIndexClassName,
590
+ contentClassName
591
+ ),
592
+ children: content
593
+ }
594
+ );
595
+ return /* @__PURE__ */ jsxRuntime.jsxs(
596
+ Popover__namespace.Root,
597
+ {
598
+ open: effectiveOpen,
599
+ onOpenChange: (o) => {
600
+ if (!o) {
601
+ clearTimers();
602
+ setHovering(false);
603
+ setFocusing(false);
604
+ }
605
+ },
606
+ modal: false,
607
+ children: [
608
+ /* @__PURE__ */ jsxRuntime.jsx(Popover__namespace.Anchor, { asChild: true, children: trigger }),
609
+ portal ? /* @__PURE__ */ jsxRuntime.jsx(Popover__namespace.Portal, { children: contentEl }) : contentEl
610
+ ]
611
+ }
612
+ );
613
+ }
614
+ var Accordion = AccordionPrimitive__namespace.Root;
615
+ var AccordionItem = React2__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Item, { ref, className: cn("border-b", className), ...props }));
616
+ AccordionItem.displayName = "AccordionItem";
617
+ var AccordionTrigger = React2__namespace.forwardRef(({ className, children, icon = "chevron", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
618
+ AccordionPrimitive__namespace.Trigger,
619
+ {
620
+ ref,
621
+ className: cn(
622
+ "flex flex-1 items-center justify-between gap-4 py-4 text-left font-medium transition-all hover:underline",
623
+ icon === "chevron" ? "[&[data-state=open]>svg]:rotate-180" : "[&[data-state=open]>svg]:rotate-45",
624
+ className
625
+ ),
626
+ ...props,
627
+ children: [
628
+ children,
629
+ icon === "chevron" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 shrink-0 transition-transform duration-200" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "text-primary h-5 w-5 shrink-0 transition-transform duration-200" })
630
+ ]
631
+ }
632
+ ) }));
633
+ AccordionTrigger.displayName = AccordionPrimitive__namespace.Trigger.displayName;
634
+ var AccordionContent = React2__namespace.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
635
+ AccordionPrimitive__namespace.Content,
636
+ {
637
+ ref,
638
+ className: "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm transition-all",
639
+ ...props,
640
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pt-0 pb-4", className), children })
641
+ }
642
+ ));
643
+ AccordionContent.displayName = AccordionPrimitive__namespace.Content.displayName;
644
+ var surfaceVariants = classVarianceAuthority.cva("rounded-xl transition-colors", {
645
+ variants: {
646
+ tone: {
647
+ /* Crisp panel floating on the page — the default soft card. */
648
+ default: "bg-card text-card-foreground",
649
+ /* Warm-gray recessed panel. */
650
+ muted: "bg-muted text-foreground",
651
+ /* Solid brand fill — small terracotta panel; inverts child text. */
652
+ brand: "bg-brand text-brand-foreground",
653
+ /* High-contrast neutral panel (near-black in light, near-white in dark). */
654
+ contrast: "bg-foreground text-background",
655
+ /* Translucent lightened tile for cards sitting ON a brand band. */
656
+ onBrand: "text-brand-foreground [background:color-mix(in_oklch,white_16%,var(--brand))] [border-color:color-mix(in_oklch,white_24%,transparent)]",
657
+ /* Frame only, transparent fill. */
658
+ outline: "bg-transparent text-foreground"
659
+ },
660
+ elevation: {
661
+ none: "shadow-none",
662
+ sm: "shadow-sm",
663
+ md: "shadow-md",
664
+ lg: "shadow-lg",
665
+ xl: "shadow-xl"
666
+ },
667
+ bordered: {
668
+ true: "border",
669
+ false: ""
670
+ },
671
+ pad: {
672
+ none: "p-0",
673
+ sm: "p-4",
674
+ md: "p-5 sm:p-6",
675
+ lg: "p-6 sm:p-8"
676
+ }
677
+ },
678
+ defaultVariants: {
679
+ tone: "default",
680
+ elevation: "sm",
681
+ bordered: true,
682
+ pad: "md"
683
+ }
684
+ });
685
+ function Surface({
686
+ className,
687
+ tone,
688
+ elevation,
689
+ bordered,
690
+ pad,
691
+ ...props
692
+ }) {
693
+ return /* @__PURE__ */ jsxRuntime.jsx(
694
+ "div",
695
+ {
696
+ "data-slot": "surface",
697
+ className: cn(surfaceVariants({ tone, elevation, bordered, pad }), className),
698
+ ...props
699
+ }
700
+ );
701
+ }
702
+ var iconBadgeVariants = classVarianceAuthority.cva(
703
+ "inline-flex shrink-0 items-center justify-center rounded-md font-semibold [&_svg]:pointer-events-none",
704
+ {
705
+ variants: {
706
+ tone: {
707
+ /* The signature peach tile — soft accent fill, terracotta glyph.
708
+ Auto-swaps to warm-dark + light-peach in dark mode via tokens. */
709
+ peach: "bg-accent text-accent-foreground",
710
+ /* Inverted near-black tile, light glyph ("never do" promises). */
711
+ dark: "bg-foreground text-background",
712
+ /* Solid brand tile. */
713
+ brand: "bg-primary text-primary-foreground",
714
+ /* White tile on a brand band, terracotta glyph (numbered steps). */
715
+ onBrand: "bg-brand-foreground text-primary",
716
+ /* Quiet neutral tile. */
717
+ muted: "bg-muted text-foreground",
718
+ /* Crisp white (card-colored) tile with a terracotta glyph and a
719
+ soft lift — the elevated icon chip on muted/colored cards. */
720
+ surface: "bg-card text-primary shadow-sm"
721
+ },
722
+ size: {
723
+ sm: "size-9 text-xs [&_svg]:size-4",
724
+ md: "size-11 text-sm [&_svg]:size-5",
725
+ lg: "size-12 text-base [&_svg]:size-6",
726
+ xl: "size-14 text-lg [&_svg]:size-7"
727
+ }
728
+ },
729
+ defaultVariants: { tone: "peach", size: "md" }
730
+ }
731
+ );
732
+ function IconBadge({ className, tone, size, children, ...props }) {
733
+ return /* @__PURE__ */ jsxRuntime.jsx(
734
+ "span",
735
+ {
736
+ "data-slot": "icon-badge",
737
+ className: cn(iconBadgeVariants({ tone, size }), className),
738
+ ...props,
739
+ children
740
+ }
741
+ );
742
+ }
743
+ function FeatureCard({
744
+ icon,
745
+ iconTone = "peach",
746
+ title,
747
+ children,
748
+ orientation = "vertical",
749
+ align = "start",
750
+ tone = "default",
751
+ elevation = "sm",
752
+ className
753
+ }) {
754
+ const horizontal = orientation === "horizontal";
755
+ const centered = !horizontal && align === "center";
756
+ return /* @__PURE__ */ jsxRuntime.jsxs(
757
+ Surface,
758
+ {
759
+ tone,
760
+ elevation,
761
+ pad: horizontal ? "md" : "lg",
762
+ className: cn(
763
+ "flex h-full",
764
+ horizontal ? "flex-row gap-4" : "flex-col",
765
+ centered && "items-center text-center",
766
+ className
767
+ ),
768
+ children: [
769
+ icon && /* @__PURE__ */ jsxRuntime.jsx(
770
+ IconBadge,
771
+ {
772
+ tone: iconTone,
773
+ size: "lg",
774
+ className: cn(horizontal ? "shrink-0" : "mb-4"),
775
+ children: icon
776
+ }
777
+ ),
778
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(horizontal && "min-w-0"), children: [
779
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold", children: title }),
780
+ children && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mt-1.5 text-sm leading-relaxed", children })
781
+ ] })
782
+ ]
783
+ }
784
+ );
785
+ }
786
+ var TONE = {
787
+ default: "bg-background text-foreground",
788
+ muted: "bg-muted text-foreground",
789
+ brand: "bg-brand text-brand-foreground",
790
+ // `dark` activates the .dark variant locally so descendant package
791
+ // components render their dark arm even on an otherwise light page.
792
+ dark: "dark bg-background text-foreground"
793
+ };
794
+ var WIDTH = {
795
+ default: "container",
796
+ wide: "mx-auto w-full max-w-screen-2xl px-4 sm:px-6 lg:px-8",
797
+ full: ""
798
+ };
799
+ function Section({
800
+ tone = "default",
801
+ width = "default",
802
+ diagonal,
803
+ id,
804
+ className,
805
+ innerClassName,
806
+ children
807
+ }) {
808
+ const showDiagonal = diagonal ?? tone === "brand";
809
+ return /* @__PURE__ */ jsxRuntime.jsx(
810
+ "div",
811
+ {
812
+ id,
813
+ className: cn("w-full", TONE[tone], showDiagonal && "oc-diagonal", className),
814
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("py-16 sm:py-20 md:py-24", WIDTH[width], innerClassName), children })
815
+ }
816
+ );
817
+ }
818
+ function BrandBand(props) {
819
+ return /* @__PURE__ */ jsxRuntime.jsx(Section, { tone: "brand", ...props });
820
+ }
821
+ function ComparisonTable({ rows, columns, className }) {
822
+ const cols = { feature: "", theirs: "A normal login", ours: "OrangeCheck", ...columns };
823
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("overflow-hidden rounded-xl border", className), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-[32rem]", children: [
824
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1.4fr_1fr_1fr]", children: [
825
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "label-mono text-muted-foreground px-4 py-3.5 sm:px-6", children: cols.feature }),
826
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-3.5 font-semibold text-foreground sm:px-6", children: cols.theirs }),
827
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "bg-accent/60 border-border/60 border-l px-4 py-3.5 font-semibold text-primary sm:px-6", children: cols.ours })
828
+ ] }),
829
+ rows.map((row, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1.4fr_1fr_1fr] border-t", children: [
830
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-4 py-3.5 font-medium text-foreground sm:px-6", children: row.label }),
831
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-muted-foreground flex items-center gap-2 px-4 py-3.5 sm:px-6", children: [
832
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "text-muted-foreground/70 size-4" }),
833
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: row.theirs })
834
+ ] }),
835
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-accent/40 border-border/60 flex items-center gap-2 border-l px-4 py-3.5 text-foreground sm:px-6", children: [
836
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-4 text-primary" }),
837
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: row.ours })
838
+ ] })
839
+ ] }, i))
840
+ ] }) }) });
841
+ }
842
+ function NumberedStep({
843
+ n,
844
+ title,
845
+ children,
846
+ tone = "default",
847
+ card = false,
848
+ className
849
+ }) {
850
+ const onBrand = tone === "onBrand";
851
+ const body = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(!card && className), children: [
852
+ /* @__PURE__ */ jsxRuntime.jsx(IconBadge, { tone: onBrand ? "onBrand" : "peach", size: "sm", children: n }),
853
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-4 text-lg font-semibold", children: title }),
854
+ children && /* @__PURE__ */ jsxRuntime.jsx(
855
+ "div",
856
+ {
857
+ className: cn(
858
+ "mt-1.5 text-sm leading-relaxed",
859
+ onBrand ? "text-brand-foreground/80" : "text-muted-foreground"
860
+ ),
861
+ children
862
+ }
863
+ )
864
+ ] });
865
+ if (!card) return body;
866
+ return /* @__PURE__ */ jsxRuntime.jsx(
867
+ Surface,
868
+ {
869
+ tone: onBrand ? "onBrand" : "default",
870
+ elevation: onBrand ? "none" : "sm",
871
+ pad: "md",
872
+ className,
873
+ children: body
874
+ }
875
+ );
876
+ }
877
+ var COLUMNS = {
878
+ 2: "md:grid-cols-2",
879
+ 3: "md:grid-cols-3",
880
+ 4: "md:grid-cols-4"
881
+ };
882
+ function StepList({
883
+ steps,
884
+ variant = "bare",
885
+ tone = "default",
886
+ columns = 3,
887
+ className
888
+ }) {
889
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("grid gap-6 sm:grid-cols-2 sm:gap-8", COLUMNS[columns], className), children: steps.map((step, index) => /* @__PURE__ */ jsxRuntime.jsx(
890
+ NumberedStep,
891
+ {
892
+ n: index + 1,
893
+ title: step.title,
894
+ tone,
895
+ card: variant === "card",
896
+ children: step.children
897
+ },
898
+ index
899
+ )) });
900
+ }
901
+ function Faq({ items, defaultOpen, className }) {
902
+ return /* @__PURE__ */ jsxRuntime.jsx(
903
+ Accordion,
904
+ {
905
+ type: "single",
906
+ collapsible: true,
907
+ defaultValue: defaultOpen != null ? String(defaultOpen) : void 0,
908
+ className: cn("w-full", className),
909
+ children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(AccordionItem, { value: String(i), children: [
910
+ /* @__PURE__ */ jsxRuntime.jsx(
911
+ AccordionTrigger,
912
+ {
913
+ icon: "plusMinus",
914
+ className: "text-foreground text-base font-semibold",
915
+ children: item.q
916
+ }
917
+ ),
918
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "text-muted-foreground leading-relaxed", children: item.a })
919
+ ] }, i))
920
+ }
921
+ );
922
+ }
923
+ function EmailCapture({
924
+ action,
925
+ method,
926
+ onSubmit,
927
+ name = "email",
928
+ placeholder = "you@email.com",
929
+ cta = "Join the waitlist",
930
+ note,
931
+ tone = "default",
932
+ className
933
+ }) {
934
+ const onBrand = tone === "onBrand";
935
+ return /* @__PURE__ */ jsxRuntime.jsxs("form", { action, method, onSubmit, className: cn(className), children: [
936
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 sm:flex-row sm:items-center", children: [
937
+ /* @__PURE__ */ jsxRuntime.jsx(
938
+ Input,
939
+ {
940
+ type: "email",
941
+ name,
942
+ required: true,
943
+ placeholder,
944
+ className: cn(
945
+ "rounded-full text-base md:text-sm",
946
+ onBrand && "[background:color-mix(in_oklch,white_18%,transparent)] placeholder:text-primary-foreground/60 border-transparent text-primary-foreground"
947
+ )
948
+ }
949
+ ),
950
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", variant: onBrand ? "onBrand" : "default", className: "rounded-full", children: cta })
951
+ ] }),
952
+ note && /* @__PURE__ */ jsxRuntime.jsx(
953
+ "p",
954
+ {
955
+ className: cn(
956
+ "mt-3 text-sm",
957
+ onBrand ? "text-primary-foreground/70" : "text-muted-foreground"
958
+ ),
959
+ children: note
960
+ }
961
+ )
962
+ ] });
963
+ }
964
+ function CheckList({
965
+ items,
966
+ orientation = "horizontal",
967
+ tone = "default",
968
+ className
969
+ }) {
970
+ const glyph = tone === "onBrand" ? "text-brand-foreground" : "text-primary";
971
+ const label = tone === "onBrand" ? "text-brand-foreground/90" : "text-foreground";
972
+ return /* @__PURE__ */ jsxRuntime.jsx(
973
+ "ul",
974
+ {
975
+ className: cn(
976
+ orientation === "horizontal" ? "flex flex-wrap gap-x-6 gap-y-2 text-sm" : "flex flex-col gap-2 text-sm",
977
+ className
978
+ ),
979
+ children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("inline-flex items-center gap-2", label), children: [
980
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: cn("size-4 shrink-0", glyph) }),
981
+ item
982
+ ] }, i))
983
+ }
984
+ );
985
+ }
986
+ function AccentNote({ lead, children, tone = "default", className }) {
987
+ const onBrand = tone === "onBrand";
988
+ return /* @__PURE__ */ jsxRuntime.jsxs(
989
+ "div",
990
+ {
991
+ className: cn(
992
+ "border-l-2 pl-4 text-sm leading-relaxed",
993
+ onBrand ? "border-primary-foreground/60 text-primary-foreground/80" : "border-primary text-muted-foreground",
994
+ className
995
+ ),
996
+ children: [
997
+ lead && /* @__PURE__ */ jsxRuntime.jsx(
998
+ "strong",
999
+ {
1000
+ className: cn(
1001
+ "mr-1.5 font-semibold",
1002
+ onBrand ? "text-primary-foreground" : "text-foreground"
1003
+ ),
1004
+ children: lead
1005
+ }
1006
+ ),
1007
+ children
1008
+ ]
1009
+ }
1010
+ );
1011
+ }
1012
+ function AccentList({ items, className }) {
1013
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex flex-col", className), children: items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
1014
+ "div",
1015
+ {
1016
+ className: cn("border-l-2 py-2 pl-5", item.active ? "border-primary" : "border-border"),
1017
+ children: [
1018
+ /* @__PURE__ */ jsxRuntime.jsx(
1019
+ "div",
1020
+ {
1021
+ className: cn(
1022
+ "font-semibold",
1023
+ item.active ? "text-foreground" : "text-muted-foreground"
1024
+ ),
1025
+ children: item.title
1026
+ }
1027
+ ),
1028
+ item.active && item.children && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground mt-1 text-sm leading-relaxed", children: item.children })
1029
+ ]
1030
+ },
1031
+ i
1032
+ )) });
1033
+ }
1034
+ function VerifiedChip({ icon, iconTone = "peach", label, className }) {
1035
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1036
+ Surface,
1037
+ {
1038
+ elevation: "lg",
1039
+ pad: "none",
1040
+ className: cn("inline-flex items-center gap-3 rounded-full px-3 py-2", className),
1041
+ children: [
1042
+ /* @__PURE__ */ jsxRuntime.jsx(IconBadge, { tone: iconTone, size: "sm", children: icon ?? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, {}) }),
1043
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "pr-2 text-sm font-semibold text-foreground", children: label })
1044
+ ]
1045
+ }
1046
+ );
1047
+ }
291
1048
  var ENTRIES = [
292
1049
  {
293
1050
  slug: "home",
@@ -331,6 +1088,13 @@ var ENTRIES = [
331
1088
  sub: "cofound \u2014 get behind builders",
332
1089
  docsHref: "https://docs.ochk.io/cosign"
333
1090
  },
1091
+ {
1092
+ slug: "btc",
1093
+ href: "https://btc.ochk.io",
1094
+ label: "oc\xB7btc",
1095
+ sub: "read \u2014 bitcoin desk",
1096
+ docsHref: "https://btc.ochk.io/data"
1097
+ },
334
1098
  {
335
1099
  slug: "attest",
336
1100
  href: "https://attest.ochk.io",
@@ -409,9 +1173,9 @@ function EcosystemSwitcher({
409
1173
  className,
410
1174
  showOwnerEntries = false
411
1175
  }) {
412
- const [open, setOpen] = React.useState(false);
413
- const containerRef = React.useRef(null);
414
- React.useEffect(() => {
1176
+ const [open, setOpen] = React2.useState(false);
1177
+ const containerRef = React2.useRef(null);
1178
+ React2.useEffect(() => {
415
1179
  if (!open) return;
416
1180
  function onDoc(e) {
417
1181
  if (!containerRef.current) return;
@@ -494,141 +1258,6 @@ function EcosystemSwitcher({
494
1258
  )
495
1259
  ] });
496
1260
  }
497
- var TOOLTIP_SURFACE_CLASS = "bg-popover text-popover-foreground border-border rounded-md border p-2.5 shadow-md";
498
- var TOOLTIP_MOTION_CLASS = "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-1 data-[side=top]:slide-in-from-bottom-1 data-[side=left]:slide-in-from-right-1 data-[side=right]:slide-in-from-left-1 origin-(--radix-popover-content-transform-origin) duration-150 ease-out";
499
- function compose(theirs, ours) {
500
- return (e) => {
501
- theirs?.(e);
502
- ours(e);
503
- };
504
- }
505
- var lastInputWasKeyboard = false;
506
- var modalityInstalled = false;
507
- function installModalityTracking() {
508
- if (modalityInstalled || typeof window === "undefined") return;
509
- modalityInstalled = true;
510
- window.addEventListener("keydown", () => lastInputWasKeyboard = true, true);
511
- window.addEventListener("pointerdown", () => lastInputWasKeyboard = false, true);
512
- }
513
- function Tooltip({
514
- content,
515
- children,
516
- side = "bottom",
517
- align = "start",
518
- sideOffset = 8,
519
- collisionPadding = 12,
520
- openDelay = 300,
521
- closeDelay = 90,
522
- disabled = false,
523
- portal = true,
524
- zIndexClassName = "z-50",
525
- contentClassName
526
- }) {
527
- const [hovering, setHovering] = React__namespace.useState(false);
528
- const [focusing, setFocusing] = React__namespace.useState(false);
529
- const [isFinePointer, setIsFinePointer] = React__namespace.useState(false);
530
- const openTimer = React__namespace.useRef(null);
531
- const closeTimer = React__namespace.useRef(null);
532
- React__namespace.useEffect(() => {
533
- installModalityTracking();
534
- const mq = window.matchMedia("(hover: hover) and (pointer: fine)");
535
- const apply = () => setIsFinePointer(mq.matches);
536
- apply();
537
- mq.addEventListener("change", apply);
538
- return () => mq.removeEventListener("change", apply);
539
- }, []);
540
- const clearTimers = React__namespace.useCallback(() => {
541
- if (openTimer.current) clearTimeout(openTimer.current);
542
- if (closeTimer.current) clearTimeout(closeTimer.current);
543
- }, []);
544
- React__namespace.useEffect(() => clearTimers, [clearTimers]);
545
- React__namespace.useEffect(() => {
546
- if (disabled) {
547
- clearTimers();
548
- setHovering(false);
549
- }
550
- }, [disabled, clearTimers]);
551
- const handlePointerEnter = () => {
552
- if (!isFinePointer) return;
553
- if (closeTimer.current) clearTimeout(closeTimer.current);
554
- openTimer.current = setTimeout(() => setHovering(true), openDelay);
555
- };
556
- const handlePointerLeave = () => {
557
- if (openTimer.current) clearTimeout(openTimer.current);
558
- closeTimer.current = setTimeout(() => setHovering(false), closeDelay);
559
- };
560
- const handlePointerDown = () => {
561
- clearTimers();
562
- setHovering(false);
563
- setFocusing(false);
564
- };
565
- const handleFocus = () => {
566
- if (lastInputWasKeyboard) {
567
- clearTimers();
568
- setFocusing(true);
569
- }
570
- };
571
- const handleBlur = () => {
572
- clearTimers();
573
- setFocusing(false);
574
- };
575
- const handleKeyDown = (e) => {
576
- if (e.key === "Escape") {
577
- clearTimers();
578
- setHovering(false);
579
- setFocusing(false);
580
- }
581
- };
582
- const effectiveOpen = !disabled && (isFinePointer && hovering || focusing);
583
- const extra = {};
584
- const childProps = children.props;
585
- extra.onPointerEnter = compose(childProps.onPointerEnter, handlePointerEnter);
586
- extra.onPointerLeave = compose(childProps.onPointerLeave, handlePointerLeave);
587
- extra.onPointerDown = compose(childProps.onPointerDown, handlePointerDown);
588
- extra.onFocus = compose(childProps.onFocus, handleFocus);
589
- extra.onBlur = compose(childProps.onBlur, handleBlur);
590
- extra.onKeyDown = compose(childProps.onKeyDown, handleKeyDown);
591
- const trigger = React__namespace.cloneElement(children, extra);
592
- const contentEl = /* @__PURE__ */ jsxRuntime.jsx(
593
- Popover__namespace.Content,
594
- {
595
- side,
596
- align,
597
- sideOffset,
598
- collisionPadding,
599
- "aria-hidden": true,
600
- onOpenAutoFocus: (e) => e.preventDefault(),
601
- onCloseAutoFocus: (e) => e.preventDefault(),
602
- onFocusOutside: (e) => e.preventDefault(),
603
- className: cn(
604
- TOOLTIP_SURFACE_CLASS,
605
- TOOLTIP_MOTION_CLASS,
606
- "pointer-events-none",
607
- zIndexClassName,
608
- contentClassName
609
- ),
610
- children: content
611
- }
612
- );
613
- return /* @__PURE__ */ jsxRuntime.jsxs(
614
- Popover__namespace.Root,
615
- {
616
- open: effectiveOpen,
617
- onOpenChange: (o) => {
618
- if (!o) {
619
- clearTimers();
620
- setHovering(false);
621
- setFocusing(false);
622
- }
623
- },
624
- modal: false,
625
- children: [
626
- /* @__PURE__ */ jsxRuntime.jsx(Popover__namespace.Anchor, { asChild: true, children: trigger }),
627
- portal ? /* @__PURE__ */ jsxRuntime.jsx(Popover__namespace.Portal, { children: contentEl }) : contentEl
628
- ]
629
- }
630
- );
631
- }
632
1261
 
633
1262
  // src/chrome/family-properties.ts
634
1263
  var FAMILY_PROPERTIES = [
@@ -686,6 +1315,15 @@ var FAMILY_PROPERTIES = [
686
1315
  docsHref: "https://docs.ochk.io/cosign",
687
1316
  category: "product"
688
1317
  },
1318
+ {
1319
+ slug: "btc",
1320
+ origin: "https://btc.ochk.io",
1321
+ hostname: "btc.ochk.io",
1322
+ label: "oc\xB7btc",
1323
+ sub: "read \u2014 bitcoin desk",
1324
+ docsHref: "https://btc.ochk.io/data",
1325
+ category: "product"
1326
+ },
689
1327
  {
690
1328
  slug: "attest",
691
1329
  origin: "https://attest.ochk.io",
@@ -864,9 +1502,9 @@ function OcLogoDropdown({
864
1502
  popoverClassName,
865
1503
  showOwnerEntries = false
866
1504
  }) {
867
- const [open, setOpen] = React.useState(false);
868
- const containerRef = React.useRef(null);
869
- const menuId = React.useId();
1505
+ const [open, setOpen] = React2.useState(false);
1506
+ const containerRef = React2.useRef(null);
1507
+ const menuId = React2.useId();
870
1508
  const router$1 = router.useRouter();
871
1509
  const currentCategory = findFamilyProperty(current)?.category ?? "hub";
872
1510
  function handleTriggerClick(e) {
@@ -878,7 +1516,7 @@ function OcLogoDropdown({
878
1516
  }
879
1517
  setOpen((v) => !v);
880
1518
  }
881
- React.useEffect(() => {
1519
+ React2.useEffect(() => {
882
1520
  if (!open) return;
883
1521
  function onDoc(e) {
884
1522
  if (!containerRef.current) return;
@@ -1042,9 +1680,9 @@ function OcLogoDropdown({
1042
1680
  }
1043
1681
  );
1044
1682
  }
1045
- var OcSkinContext = React.createContext(null);
1683
+ var OcSkinContext = React2.createContext(null);
1046
1684
  function useOcSkin() {
1047
- const ctx = React.useContext(OcSkinContext);
1685
+ const ctx = React2.useContext(OcSkinContext);
1048
1686
  if (!ctx) {
1049
1687
  throw new Error("useOcSkin must be used within <OcThemeProvider>");
1050
1688
  }
@@ -1058,12 +1696,12 @@ var MODES = [
1058
1696
  function AppearanceControls({ className }) {
1059
1697
  const { skin, setSkin, themes } = useOcSkin();
1060
1698
  const { theme, setTheme } = nextThemes.useTheme();
1061
- const [mounted, setMounted] = React.useState(false);
1062
- React.useEffect(() => setMounted(true), []);
1699
+ const [mounted, setMounted] = React2.useState(false);
1700
+ React2.useEffect(() => setMounted(true), []);
1063
1701
  const activeMode = mounted ? theme ?? "system" : null;
1064
1702
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
1065
1703
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "label-mono text-muted-foreground px-3 pt-3 pb-2", children: "mode" }),
1066
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-1 px-2 pb-2", children: MODES.map(({ id, label, Icon }) => {
1704
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-3 gap-1 px-2 pb-2", children: MODES.map(({ id, label, Icon: Icon2 }) => {
1067
1705
  const active = activeMode === id;
1068
1706
  return /* @__PURE__ */ jsxRuntime.jsxs(
1069
1707
  "button",
@@ -1077,7 +1715,7 @@ function AppearanceControls({ className }) {
1077
1715
  active ? "border-primary text-foreground bg-accent" : "border-transparent text-muted-foreground hover:bg-accent hover:text-accent-foreground"
1078
1716
  ),
1079
1717
  children: [
1080
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-4", "aria-hidden": true }),
1718
+ /* @__PURE__ */ jsxRuntime.jsx(Icon2, { className: "size-4", "aria-hidden": true }),
1081
1719
  label
1082
1720
  ]
1083
1721
  },
@@ -1147,9 +1785,9 @@ async function writeClipboard(text) {
1147
1785
  }
1148
1786
  }
1149
1787
  function CopyableDid({ did }) {
1150
- const [copied, setCopied] = React.useState(false);
1151
- const timerRef = React.useRef(null);
1152
- React.useEffect(
1788
+ const [copied, setCopied] = React2.useState(false);
1789
+ const timerRef = React2.useRef(null);
1790
+ React2.useEffect(
1153
1791
  () => () => {
1154
1792
  if (timerRef.current) clearTimeout(timerRef.current);
1155
1793
  },
@@ -1195,9 +1833,9 @@ function PromoteRow({
1195
1833
  disabled,
1196
1834
  onPromote
1197
1835
  }) {
1198
- const [copied, setCopied] = React.useState(false);
1199
- const timerRef = React.useRef(null);
1200
- React.useEffect(
1836
+ const [copied, setCopied] = React2.useState(false);
1837
+ const timerRef = React2.useRef(null);
1838
+ React2.useEffect(
1201
1839
  () => () => {
1202
1840
  if (timerRef.current) clearTimeout(timerRef.current);
1203
1841
  },
@@ -1268,12 +1906,12 @@ function IdentityPromoteSection({
1268
1906
  open,
1269
1907
  setDisplayIdentity
1270
1908
  }) {
1271
- const [identities, setIdentities] = React.useState(null);
1272
- const [loadFailed, setLoadFailed] = React.useState(false);
1273
- const [promoting, setPromoting] = React.useState(null);
1274
- const [promoteErr, setPromoteErr] = React.useState(null);
1275
- const lastFetchKeyRef = React.useRef(null);
1276
- React.useEffect(() => {
1909
+ const [identities, setIdentities] = React2.useState(null);
1910
+ const [loadFailed, setLoadFailed] = React2.useState(false);
1911
+ const [promoting, setPromoting] = React2.useState(null);
1912
+ const [promoteErr, setPromoteErr] = React2.useState(null);
1913
+ const lastFetchKeyRef = React2.useRef(null);
1914
+ React2.useEffect(() => {
1277
1915
  if (!open) return;
1278
1916
  if (lastFetchKeyRef.current === didOc) return;
1279
1917
  lastFetchKeyRef.current = didOc;
@@ -1364,9 +2002,9 @@ function MobileMenu({
1364
2002
  primary,
1365
2003
  secondary
1366
2004
  }) {
1367
- const [open, setOpen] = React.useState(false);
1368
- const ref = React.useRef(null);
1369
- React.useEffect(() => {
2005
+ const [open, setOpen] = React2.useState(false);
2006
+ const ref = React2.useRef(null);
2007
+ React2.useEffect(() => {
1370
2008
  if (!open) return;
1371
2009
  const onClick = (e) => {
1372
2010
  if (ref.current && !ref.current.contains(e.target)) setOpen(false);
@@ -1473,15 +2111,15 @@ function OcAccountMenuView({
1473
2111
  addAccountUrl,
1474
2112
  tabPinned
1475
2113
  } = session;
1476
- const [hydrated, setHydrated] = React.useState(false);
1477
- const [open, setOpen] = React.useState(false);
1478
- const wrapRef = React.useRef(null);
2114
+ const [hydrated, setHydrated] = React2.useState(false);
2115
+ const [open, setOpen] = React2.useState(false);
2116
+ const wrapRef = React2.useRef(null);
1479
2117
  const property = findFamilyProperty(current);
1480
2118
  const hostname = property?.hostname ?? `${current}.ochk.io`;
1481
2119
  const isHome = current === "home";
1482
2120
  const familyDashboardEnabled = showFamilyDashboard ?? !isHome;
1483
- React.useEffect(() => setHydrated(true), []);
1484
- React.useEffect(() => {
2121
+ React2.useEffect(() => setHydrated(true), []);
2122
+ React2.useEffect(() => {
1485
2123
  const onWake = () => {
1486
2124
  if (document.visibilityState === "visible") void refresh();
1487
2125
  };
@@ -1493,7 +2131,7 @@ function OcAccountMenuView({
1493
2131
  window.removeEventListener("focus", onFocus);
1494
2132
  };
1495
2133
  }, [refresh]);
1496
- React.useEffect(() => {
2134
+ React2.useEffect(() => {
1497
2135
  if (!open) return;
1498
2136
  const onClick = (e) => {
1499
2137
  if (wrapRef.current && !wrapRef.current.contains(e.target)) setOpen(false);
@@ -1741,8 +2379,8 @@ function AccountsSection({
1741
2379
  signOut,
1742
2380
  onActionStart
1743
2381
  }) {
1744
- const [switching, setSwitching] = React.useState(null);
1745
- const [err, setErr] = React.useState(null);
2382
+ const [switching, setSwitching] = React2.useState(null);
2383
+ const [err, setErr] = React2.useState(null);
1746
2384
  if (!addAccountUrl) return null;
1747
2385
  const onSwitch = async (didOc) => {
1748
2386
  if (!switchAccount || switching) return;
@@ -2005,8 +2643,8 @@ function OcDashboardShell({
2005
2643
  children,
2006
2644
  className
2007
2645
  }) {
2008
- const [drawerOpen, setDrawerOpen] = React.useState(false);
2009
- React.useEffect(() => {
2646
+ const [drawerOpen, setDrawerOpen] = React2.useState(false);
2647
+ React2.useEffect(() => {
2010
2648
  if (!drawerOpen) return;
2011
2649
  function onKey(e) {
2012
2650
  if (e.key === "Escape") setDrawerOpen(false);
@@ -2336,15 +2974,25 @@ function OcAppBar({
2336
2974
  );
2337
2975
  }
2338
2976
 
2977
+ exports.AccentList = AccentList;
2978
+ exports.AccentNote = AccentNote;
2339
2979
  exports.AppShell = AppShell;
2980
+ exports.BrandBand = BrandBand;
2340
2981
  exports.Callout = Callout;
2982
+ exports.CheckList = CheckList;
2983
+ exports.ComparisonTable = ComparisonTable;
2341
2984
  exports.DataRow = DataRow;
2342
2985
  exports.DefinitionList = DefinitionList;
2343
2986
  exports.EcosystemSwitcher = EcosystemSwitcher;
2987
+ exports.EmailCapture = EmailCapture;
2344
2988
  exports.EmptyState = EmptyState;
2345
2989
  exports.FAMILY_PROPERTIES = FAMILY_PROPERTIES;
2990
+ exports.Faq = Faq;
2991
+ exports.FeatureCard = FeatureCard;
2346
2992
  exports.HelpHint = HelpHint;
2347
2993
  exports.LayoutSubHeader = LayoutSubHeader;
2994
+ exports.MarketingHeading = MarketingHeading;
2995
+ exports.NumberedStep = NumberedStep;
2348
2996
  exports.OcAccountMenu = OcAccountMenu;
2349
2997
  exports.OcAccountMenuView = OcAccountMenuView;
2350
2998
  exports.OcAppBar = OcAppBar;
@@ -2353,10 +3001,14 @@ exports.OcDashboardShell = OcDashboardShell;
2353
3001
  exports.OcLogoDropdown = OcLogoDropdown;
2354
3002
  exports.OcPrimaryNav = OcPrimaryNav;
2355
3003
  exports.SITE_STATE_LABEL = SITE_STATE_LABEL;
3004
+ exports.Section = Section;
2356
3005
  exports.SectionHeader = SectionHeader;
2357
3006
  exports.StatCard = StatCard;
2358
3007
  exports.StatGrid = StatGrid;
2359
3008
  exports.StatTile = StatTile;
3009
+ exports.StepList = StepList;
3010
+ exports.TwoToneHeading = TwoToneHeading;
3011
+ exports.VerifiedChip = VerifiedChip;
2360
3012
  exports.findFamilyProperty = findFamilyProperty;
2361
3013
  //# sourceMappingURL=components.js.map
2362
3014
  //# sourceMappingURL=components.js.map