@trading-game/design-intelligence-layer 0.13.3 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -594,6 +594,8 @@ var badgeVariants = cva3(
594
594
  variant: {
595
595
  // Default (solid)
596
596
  default: "bg-primary text-on-primary [a&]:hover:bg-primary/90",
597
+ // Standard (neutral chip — for non-status meta like contract type, duration)
598
+ standard: "bg-subtle text-on-prominent [a&]:hover:bg-subtle/80",
597
599
  "default-success": "bg-semantic-win text-on-semantic-win [a&]:hover:bg-semantic-win/90",
598
600
  "default-fail": "bg-semantic-loss text-on-semantic-loss [a&]:hover:bg-semantic-loss/90",
599
601
  "default-warning": "bg-semantic-warning text-on-semantic-warning [a&]:hover:bg-semantic-warning/90",
@@ -6319,6 +6321,18 @@ function TabsContent(_a) {
6319
6321
  // components/ui/ticket-card.tsx
6320
6322
  import { ArrowRight as ArrowRight2, Info, Rocket } from "lucide-react";
6321
6323
  import { Fragment as Fragment3, jsx as jsx57, jsxs as jsxs27 } from "react/jsx-runtime";
6324
+ function formatBalanceValue(raw) {
6325
+ const match = raw.match(/^(\D*)([\d,]+(?:\.\d+)?)(\D*)$/);
6326
+ if (!match) return raw;
6327
+ const [, prefix = "", numericPart, suffix = ""] = match;
6328
+ const parsed = Number.parseFloat(numericPart.replace(/,/g, ""));
6329
+ if (Number.isNaN(parsed)) return raw;
6330
+ const formatted = parsed.toLocaleString("en-US", {
6331
+ minimumFractionDigits: 2,
6332
+ maximumFractionDigits: 2
6333
+ });
6334
+ return `${prefix}${formatted}${suffix}`;
6335
+ }
6322
6336
  function TicketCard({
6323
6337
  className,
6324
6338
  icon,
@@ -6336,7 +6350,7 @@ function TicketCard({
6336
6350
  /* @__PURE__ */ jsxs27("div", { className: "flex h-11 flex-col justify-center gap-1 whitespace-nowrap", children: [
6337
6351
  /* @__PURE__ */ jsx57("p", { className: "text-xs text-on-subtle", children: label }),
6338
6352
  /* @__PURE__ */ jsxs27("p", { className: "leading-none", children: [
6339
- /* @__PURE__ */ jsx57("span", { className: "text-[20px] font-bold text-on-prominent", children: value }),
6353
+ /* @__PURE__ */ jsx57("span", { className: "text-[20px] font-bold text-on-prominent", children: formatBalanceValue(value) }),
6340
6354
  currency && /* @__PURE__ */ jsxs27(Fragment3, { children: [
6341
6355
  " ",
6342
6356
  /* @__PURE__ */ jsx57("span", { className: "text-sm text-on-subtle", children: currency })
@@ -6407,40 +6421,62 @@ function BoostTicketCard({
6407
6421
  compact = false
6408
6422
  }) {
6409
6423
  return /* @__PURE__ */ jsx57("div", { className: cn("flex w-full flex-col gap-2", className), children: /* @__PURE__ */ jsxs27("div", { className: "relative flex w-full items-stretch justify-between rounded-sm bg-subtle", children: [
6410
- /* @__PURE__ */ jsxs27("div", { className: cn("flex flex-1 items-center overflow-hidden py-4", compact ? "gap-2 px-2" : "gap-4 px-4"), children: [
6411
- icon && /* @__PURE__ */ jsx57("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full border-2 border-primary text-primary", children: icon }),
6412
- /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-2 whitespace-nowrap", children: [
6413
- /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-1", children: [
6414
- /* @__PURE__ */ jsx57("p", { className: "text-xs text-on-subtle", children: label }),
6415
- /* @__PURE__ */ jsxs27("p", { className: "leading-none", children: [
6416
- /* @__PURE__ */ jsx57("span", { className: "text-[20px] font-bold text-on-prominent", children: value }),
6417
- currency && /* @__PURE__ */ jsxs27(Fragment3, { children: [
6418
- " ",
6419
- /* @__PURE__ */ jsx57("span", { className: "text-sm text-on-subtle", children: currency })
6420
- ] })
6424
+ (() => {
6425
+ const boostBadge = /* @__PURE__ */ jsxs27(Badge, { variant: "fill-boost", size: "sm", className: "!gap-1 !font-medium !tracking-normal", children: [
6426
+ /* @__PURE__ */ jsx57(Rocket, { className: "!size-3.5", strokeWidth: 2 }),
6427
+ "Boost: ",
6428
+ boostAmount,
6429
+ " ",
6430
+ boostCurrency,
6431
+ boostInfo && /* @__PURE__ */ jsx57(TooltipProvider, { children: /* @__PURE__ */ jsxs27(Tooltip2, { children: [
6432
+ /* @__PURE__ */ jsx57(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx57(
6433
+ "button",
6434
+ {
6435
+ type: "button",
6436
+ "aria-label": "More info about boost",
6437
+ className: "inline-flex shrink-0 items-center justify-center rounded-full text-on-semantic-boost outline-none transition-opacity hover:opacity-70 focus-visible:opacity-70 focus-visible:ring-2 focus-visible:ring-on-semantic-boost/40 cursor-pointer",
6438
+ children: /* @__PURE__ */ jsx57(Info, { className: "!size-3.5", strokeWidth: 2 })
6439
+ }
6440
+ ) }),
6441
+ /* @__PURE__ */ jsx57(TooltipContent, { side: boostInfoSide, align: boostInfoAlign, title: boostInfoTitle, closeLabel: boostInfoCloseLabel, variant: "inverse", className: "max-w-xs whitespace-normal", children: boostInfo })
6442
+ ] }) })
6443
+ ] });
6444
+ const labelValue = /* @__PURE__ */ jsxs27(Fragment3, { children: [
6445
+ /* @__PURE__ */ jsx57("p", { className: "text-xs text-on-subtle", children: label }),
6446
+ /* @__PURE__ */ jsxs27("p", { className: "leading-none", children: [
6447
+ /* @__PURE__ */ jsx57("span", { className: "text-[20px] font-bold text-on-prominent", children: formatBalanceValue(value) }),
6448
+ currency && /* @__PURE__ */ jsxs27(Fragment3, { children: [
6449
+ " ",
6450
+ /* @__PURE__ */ jsx57("span", { className: "text-sm text-on-subtle", children: currency })
6421
6451
  ] })
6422
- ] }),
6423
- /* @__PURE__ */ jsxs27(Badge, { variant: "fill-boost", size: "sm", className: "!gap-1 !font-medium !tracking-normal", children: [
6424
- /* @__PURE__ */ jsx57(Rocket, { className: "!size-3.5", strokeWidth: 2 }),
6425
- "Boost: ",
6426
- boostAmount,
6427
- " ",
6428
- boostCurrency,
6429
- boostInfo && /* @__PURE__ */ jsx57(TooltipProvider, { children: /* @__PURE__ */ jsxs27(Tooltip2, { children: [
6430
- /* @__PURE__ */ jsx57(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx57(
6431
- "button",
6432
- {
6433
- type: "button",
6434
- "aria-label": "More info about boost",
6435
- className: "inline-flex shrink-0 items-center justify-center rounded-full text-on-semantic-boost outline-none transition-opacity hover:opacity-70 focus-visible:opacity-70 focus-visible:ring-2 focus-visible:ring-on-semantic-boost/40 cursor-pointer",
6436
- children: /* @__PURE__ */ jsx57(Info, { className: "!size-3.5", strokeWidth: 2 })
6437
- }
6438
- ) }),
6439
- /* @__PURE__ */ jsx57(TooltipContent, { side: boostInfoSide, align: boostInfoAlign, title: boostInfoTitle, closeLabel: boostInfoCloseLabel, variant: "inverse", className: "max-w-xs whitespace-normal", children: boostInfo })
6440
- ] }) })
6441
6452
  ] })
6442
- ] })
6443
- ] }),
6453
+ ] });
6454
+ return /* @__PURE__ */ jsxs27("div", { className: cn("flex flex-1 items-center overflow-hidden py-4", compact ? "gap-2 px-2" : "gap-4 px-4"), children: [
6455
+ icon && /* @__PURE__ */ jsx57("div", { className: "flex size-10 shrink-0 items-center justify-center rounded-full border-2 border-primary text-primary", children: icon }),
6456
+ compact ? (
6457
+ /* Mobile / compact: badge stacked under the value */
6458
+ /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-2 whitespace-nowrap", children: [
6459
+ /* @__PURE__ */ jsx57("div", { className: "flex flex-col gap-1", children: labelValue }),
6460
+ boostBadge
6461
+ ] })
6462
+ ) : (
6463
+ /* Desktop: badge inline next to the value (16px gap = gap-4) */
6464
+ /* @__PURE__ */ jsxs27("div", { className: "flex flex-col gap-1 whitespace-nowrap", children: [
6465
+ /* @__PURE__ */ jsx57("p", { className: "text-xs text-on-subtle", children: label }),
6466
+ /* @__PURE__ */ jsxs27("div", { className: "flex items-center gap-4", children: [
6467
+ /* @__PURE__ */ jsxs27("p", { className: "leading-none", children: [
6468
+ /* @__PURE__ */ jsx57("span", { className: "text-[20px] font-bold text-on-prominent", children: formatBalanceValue(value) }),
6469
+ currency && /* @__PURE__ */ jsxs27(Fragment3, { children: [
6470
+ " ",
6471
+ /* @__PURE__ */ jsx57("span", { className: "text-sm text-on-subtle", children: currency })
6472
+ ] })
6473
+ ] }),
6474
+ boostBadge
6475
+ ] })
6476
+ ] })
6477
+ )
6478
+ ] });
6479
+ })(),
6444
6480
  /* @__PURE__ */ jsx57("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] top-[-12px] z-10 size-6 rounded-full bg-prominent" }),
6445
6481
  /* @__PURE__ */ jsx57("div", { "aria-hidden": true, className: "pointer-events-none absolute right-[88px] bottom-[-12px] z-10 size-6 rounded-full bg-prominent" }),
6446
6482
  /* @__PURE__ */ jsx57(
@@ -6604,6 +6640,496 @@ function ToggleGroupItem(_a) {
6604
6640
  })
6605
6641
  );
6606
6642
  }
6643
+
6644
+ // components/blocks/result-block.tsx
6645
+ import { Fragment as Fragment4, jsx as jsx60, jsxs as jsxs28 } from "react/jsx-runtime";
6646
+ var THUMBS_UP_DATA_URL = "data:image/webp;base64,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";
6647
+ var THUMBS_DOWN_DATA_URL = "data:image/webp;base64,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";
6648
+ function ResultBlock({
6649
+ status,
6650
+ amount,
6651
+ currency,
6652
+ contractLabel,
6653
+ pickedDigit,
6654
+ duration,
6655
+ ctaMode
6656
+ }) {
6657
+ const isWin = status === "win";
6658
+ const titleText = isWin ? "You won!" : "You lost!";
6659
+ const signedAmount = isWin ? `+${amount}` : `\u2212${amount}`;
6660
+ const amountColorClass = isWin ? "text-semantic-win" : "text-semantic-loss";
6661
+ const haloBgClass = isWin ? "bg-semantic-win" : "bg-semantic-loss";
6662
+ return /* @__PURE__ */ jsxs28(Card, { className: "w-80 shrink-0 overflow-hidden rounded-md shadow-sm px-5 py-5 items-center gap-3", children: [
6663
+ /* @__PURE__ */ jsxs28("div", { className: "relative flex items-center justify-center py-2", children: [
6664
+ /* @__PURE__ */ jsx60(
6665
+ "span",
6666
+ {
6667
+ "aria-hidden": true,
6668
+ "data-results-motion": "halo",
6669
+ className: `absolute size-24 rounded-full blur-2xl opacity-20 ${haloBgClass}`
6670
+ }
6671
+ ),
6672
+ /* @__PURE__ */ jsx60(
6673
+ "img",
6674
+ {
6675
+ "data-results-motion": isWin ? "icon-win" : "icon-loss",
6676
+ src: isWin ? THUMBS_UP_DATA_URL : THUMBS_DOWN_DATA_URL,
6677
+ alt: isWin ? "Win" : "Loss",
6678
+ className: "relative size-20"
6679
+ }
6680
+ )
6681
+ ] }),
6682
+ /* @__PURE__ */ jsx60("p", { className: "text-lg font-semibold text-on-prominent", children: titleText }),
6683
+ /* @__PURE__ */ jsxs28("p", { className: `flex items-baseline gap-1.5 ${amountColorClass}`, children: [
6684
+ /* @__PURE__ */ jsx60("span", { className: "font-display text-4xl font-bold tabular-nums tracking-tight", children: signedAmount }),
6685
+ /* @__PURE__ */ jsx60("span", { className: "text-lg font-semibold", children: currency })
6686
+ ] }),
6687
+ /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
6688
+ /* @__PURE__ */ jsxs28(Badge, { variant: "standard", size: "sm", children: [
6689
+ contractLabel,
6690
+ pickedDigit !== void 0 && /* @__PURE__ */ jsxs28(Fragment4, { children: [
6691
+ /* @__PURE__ */ jsx60("span", { "aria-hidden": true, className: "h-3 w-px bg-border-prominent/40 mx-1" }),
6692
+ /* @__PURE__ */ jsx60("span", { className: "tabular-nums", children: pickedDigit })
6693
+ ] })
6694
+ ] }),
6695
+ /* @__PURE__ */ jsx60(Badge, { variant: "standard", size: "sm", children: duration })
6696
+ ] }),
6697
+ /* @__PURE__ */ jsxs28("div", { className: "w-full pt-2", children: [
6698
+ ctaMode === "next-round" && /* @__PURE__ */ jsx60(Button, { className: "w-full", children: "Next round" }),
6699
+ ctaMode === "go-again" && /* @__PURE__ */ jsx60(Button, { className: "w-full", children: "Go again" }),
6700
+ ctaMode === "conversion" && /* @__PURE__ */ jsxs28("div", { className: "w-full flex flex-col gap-3", children: [
6701
+ /* @__PURE__ */ jsx60("p", { className: "text-center text-base font-semibold text-on-prominent", children: "Ready to play for real?" }),
6702
+ /* @__PURE__ */ jsx60(Button, { className: "w-full", children: "Deposit now" }),
6703
+ /* @__PURE__ */ jsx60(Button, { variant: "secondary", className: "w-full", children: "Stay in demo" })
6704
+ ] })
6705
+ ] })
6706
+ ] });
6707
+ }
6708
+ function ResultDialog({
6709
+ title,
6710
+ body,
6711
+ primaryLabel,
6712
+ secondaryLabel
6713
+ }) {
6714
+ return /* @__PURE__ */ jsxs28(Card, { className: "w-80 shrink-0 overflow-hidden rounded-md shadow-sm px-5 py-6 items-center gap-4", children: [
6715
+ /* @__PURE__ */ jsxs28("div", { className: "flex flex-col items-center gap-2 text-center", children: [
6716
+ /* @__PURE__ */ jsx60("p", { className: "text-lg font-semibold text-on-prominent", children: title }),
6717
+ /* @__PURE__ */ jsx60("p", { className: "text-sm text-on-subtle", children: body })
6718
+ ] }),
6719
+ /* @__PURE__ */ jsxs28("div", { className: "w-full flex flex-col gap-2", children: [
6720
+ /* @__PURE__ */ jsx60(Button, { className: "w-full", children: primaryLabel }),
6721
+ /* @__PURE__ */ jsx60(Button, { variant: "secondary", className: "w-full", children: secondaryLabel })
6722
+ ] })
6723
+ ] });
6724
+ }
6725
+
6726
+ // components/blocks/header-navigation-block.tsx
6727
+ import { ArrowLeft as ArrowLeft2, History } from "lucide-react";
6728
+ import { jsx as jsx61, jsxs as jsxs29 } from "react/jsx-runtime";
6729
+ function HeaderNavigationBlock({
6730
+ onBack,
6731
+ badge,
6732
+ balance,
6733
+ history,
6734
+ actions
6735
+ }) {
6736
+ var _a;
6737
+ return /* @__PURE__ */ jsx61("div", { className: "w-full min-w-80 max-w-layout-diagram-small border border-border-subtle rounded-md overflow-hidden bg-prominent", children: /* @__PURE__ */ jsxs29("header", { className: "flex items-center gap-2 border-b border-border-subtle bg-prominent px-layout-margin-inline py-3", children: [
6738
+ onBack && /* @__PURE__ */ jsx61(NavigationButton, { type: "button", size: "md", "aria-label": "Back", onClick: onBack, children: /* @__PURE__ */ jsx61(ArrowLeft2, { className: "size-5" }) }),
6739
+ /* @__PURE__ */ jsxs29("div", { className: "flex min-w-0 flex-1 items-center justify-center gap-2", children: [
6740
+ badge && /* @__PURE__ */ jsx61(Badge, { variant: (_a = badge.variant) != null ? _a : "fill-warning", size: "sm", children: badge.label }),
6741
+ /* @__PURE__ */ jsx61("span", { className: "font-display font-semibold tabular-nums text-on-prominent", children: balance.amount }),
6742
+ /* @__PURE__ */ jsx61("span", { className: "text-sm text-on-subtle", children: balance.currency })
6743
+ ] }),
6744
+ /* @__PURE__ */ jsxs29("div", { className: "flex shrink-0 items-center gap-1", children: [
6745
+ history && /* @__PURE__ */ jsx61(HistoryButton, __spreadValues({}, history)),
6746
+ actions
6747
+ ] })
6748
+ ] }) });
6749
+ }
6750
+ function HistoryButton({
6751
+ count,
6752
+ onClick,
6753
+ "aria-label": ariaLabelOverride
6754
+ }) {
6755
+ const show = typeof count === "number" && count > 0;
6756
+ const label = show ? count > 99 ? "99+" : String(count) : null;
6757
+ const ariaLabel = ariaLabelOverride != null ? ariaLabelOverride : show ? `Open history, ${count} new` : "Open history";
6758
+ return /* @__PURE__ */ jsxs29("div", { className: "relative inline-flex", children: [
6759
+ /* @__PURE__ */ jsx61(NavigationButton, { type: "button", size: "md", "aria-label": ariaLabel, onClick, children: /* @__PURE__ */ jsx61(History, { className: "size-5" }) }),
6760
+ show && /* @__PURE__ */ jsx61(
6761
+ "span",
6762
+ {
6763
+ "aria-hidden": true,
6764
+ className: "pointer-events-none absolute -top-0.5 -right-0.5 min-w-[1.125rem] h-[1.125rem] px-1 rounded-full bg-primary text-on-primary text-[10px] leading-none font-semibold tabular-nums inline-flex items-center justify-center ring-2 ring-prominent",
6765
+ children: label
6766
+ }
6767
+ )
6768
+ ] });
6769
+ }
6770
+
6771
+ // components/blocks/faq-block.tsx
6772
+ import { jsx as jsx62, jsxs as jsxs30 } from "react/jsx-runtime";
6773
+ function FAQBlock({
6774
+ eyebrow = "FAQ Section",
6775
+ title = "Frequently asked questions",
6776
+ intro,
6777
+ items,
6778
+ defaultValue,
6779
+ helpCard,
6780
+ layout = "desktop"
6781
+ }) {
6782
+ var _a;
6783
+ const headingClass = layout === "desktop" ? "text-5xl font-bold font-display text-on-prominent text-center tracking-tight" : "text-4xl font-bold font-display text-on-prominent text-center tracking-tight";
6784
+ const helpTitleClass = layout === "desktop" ? "text-2xl font-semibold font-display text-on-prominent" : "text-xl font-semibold font-display text-on-prominent";
6785
+ const helpCardPaddingClass = layout === "desktop" ? "p-8" : "p-6";
6786
+ const gapClass = layout === "desktop" ? "gap-12" : "gap-10";
6787
+ const headerGapClass = layout === "desktop" ? "gap-5" : "gap-4";
6788
+ return /* @__PURE__ */ jsxs30("div", { className: `w-full flex flex-col ${gapClass}`, children: [
6789
+ /* @__PURE__ */ jsxs30("div", { className: `flex flex-col ${headerGapClass} items-center w-full`, children: [
6790
+ /* @__PURE__ */ jsx62("span", { className: "text-sm text-on-subtle font-body", children: eyebrow }),
6791
+ /* @__PURE__ */ jsx62("h2", { className: headingClass, children: title }),
6792
+ intro && /* @__PURE__ */ jsx62("p", { className: "text-lg text-on-subtle font-body text-center", children: intro })
6793
+ ] }),
6794
+ /* @__PURE__ */ jsx62(
6795
+ Accordion,
6796
+ {
6797
+ type: "single",
6798
+ collapsible: true,
6799
+ defaultValue: defaultValue != null ? defaultValue : (_a = items[0]) == null ? void 0 : _a.value,
6800
+ className: "w-full",
6801
+ children: items.map(({ value, question, answer }) => /* @__PURE__ */ jsxs30(AccordionItem, { value, children: [
6802
+ /* @__PURE__ */ jsx62(AccordionTrigger, { className: "text-base font-medium font-body text-on-prominent hover:no-underline", children: question }),
6803
+ /* @__PURE__ */ jsx62(AccordionContent, { children: /* @__PURE__ */ jsx62("p", { className: "text-sm text-on-subtle font-body pb-4", children: answer }) })
6804
+ ] }, value))
6805
+ }
6806
+ ),
6807
+ helpCard && /* @__PURE__ */ jsxs30("div", { className: `flex flex-col gap-6 items-center w-full bg-subtle rounded-xl ${helpCardPaddingClass}`, children: [
6808
+ /* @__PURE__ */ jsxs30("div", { className: "flex flex-col gap-2 w-full", children: [
6809
+ /* @__PURE__ */ jsx62("h3", { className: helpTitleClass, children: helpCard.title }),
6810
+ /* @__PURE__ */ jsx62("p", { className: "text-base text-on-subtle font-body", children: helpCard.body })
6811
+ ] }),
6812
+ /* @__PURE__ */ jsx62(Button, { size: "sm", onClick: helpCard.onCtaClick, children: helpCard.ctaLabel })
6813
+ ] })
6814
+ ] });
6815
+ }
6816
+
6817
+ // components/blocks/hero-block.tsx
6818
+ import { ArrowRight as ArrowRight3, ArrowUpRight } from "lucide-react";
6819
+ import { jsx as jsx63, jsxs as jsxs31 } from "react/jsx-runtime";
6820
+ function HeroBlock({
6821
+ layout = "centered",
6822
+ tagline,
6823
+ heading,
6824
+ body,
6825
+ primaryCta,
6826
+ secondaryCta,
6827
+ image
6828
+ }) {
6829
+ if (layout === "centered") {
6830
+ return /* @__PURE__ */ jsx63("div", { className: "w-full border border-border-subtle rounded-xl overflow-hidden bg-prominent", children: /* @__PURE__ */ jsxs31("div", { className: "flex flex-col items-center justify-center gap-8 px-layout-margin-inline py-24 max-w-2xl mx-auto text-center", children: [
6831
+ /* @__PURE__ */ jsxs31("div", { className: "flex flex-col items-center gap-6 w-full", children: [
6832
+ tagline && /* @__PURE__ */ jsx63(TaglinePill, __spreadValues({}, tagline)),
6833
+ /* @__PURE__ */ jsx63("h1", { className: "text-5xl font-semibold font-display tracking-tight text-on-prominent text-center", children: heading }),
6834
+ /* @__PURE__ */ jsx63("p", { className: "text-lg font-body text-on-subtle text-center", children: body })
6835
+ ] }),
6836
+ /* @__PURE__ */ jsxs31(Button, { size: "sm", onClick: primaryCta.onClick, children: [
6837
+ primaryCta.label,
6838
+ primaryCta.trailingArrow !== false && /* @__PURE__ */ jsx63(ArrowRight3, { className: "size-4" })
6839
+ ] })
6840
+ ] }) });
6841
+ }
6842
+ return /* @__PURE__ */ jsx63("div", { className: "w-full border border-border-subtle rounded-xl overflow-hidden bg-prominent", children: /* @__PURE__ */ jsxs31("div", { className: "flex flex-col min-[600px]:flex-row items-center gap-layout-gutter px-layout-margin-inline py-16 min-[600px]:py-24 max-w-5xl mx-auto", children: [
6843
+ /* @__PURE__ */ jsxs31("div", { className: "flex flex-col gap-6 min-[600px]:gap-8 flex-1 min-w-0 items-center min-[600px]:items-start text-center min-[600px]:text-left w-full", children: [
6844
+ /* @__PURE__ */ jsxs31("div", { className: "flex flex-col gap-5 min-[600px]:gap-6 items-center min-[600px]:items-start w-full", children: [
6845
+ tagline && /* @__PURE__ */ jsx63(TaglinePill, __spreadProps(__spreadValues({}, tagline), { responsive: true })),
6846
+ /* @__PURE__ */ jsx63("h1", { className: "text-4xl min-[600px]:text-5xl font-semibold font-display tracking-tight text-on-prominent", children: heading }),
6847
+ /* @__PURE__ */ jsx63("p", { className: "text-lg font-body text-on-subtle", children: body })
6848
+ ] }),
6849
+ /* @__PURE__ */ jsxs31("div", { className: "flex items-center justify-center min-[600px]:justify-start gap-2", children: [
6850
+ /* @__PURE__ */ jsx63(Button, { size: "sm", onClick: primaryCta.onClick, children: primaryCta.label }),
6851
+ secondaryCta && /* @__PURE__ */ jsx63(Button, { variant: "secondary", size: "sm", onClick: secondaryCta.onClick, children: secondaryCta.label })
6852
+ ] })
6853
+ ] }),
6854
+ /* @__PURE__ */ jsx63("div", { className: "w-full min-[600px]:flex-1 min-[600px]:min-w-0 aspect-square rounded-xl bg-subtle shrink-0", "aria-hidden": "true", children: image })
6855
+ ] }) });
6856
+ }
6857
+ function TaglinePill({
6858
+ label,
6859
+ suffix,
6860
+ responsive
6861
+ }) {
6862
+ return /* @__PURE__ */ jsxs31("div", { className: "inline-flex items-center gap-1.5 h-7 px-3 rounded-full border border-border-subtle bg-prominent shadow-sm shrink-0", children: [
6863
+ /* @__PURE__ */ jsx63("span", { className: "size-1.5 rounded-full bg-semantic-win shrink-0", "aria-hidden": "true" }),
6864
+ responsive && suffix ? /* @__PURE__ */ jsxs31("span", { className: "text-sm font-body text-on-prominent whitespace-nowrap", children: [
6865
+ /* @__PURE__ */ jsxs31("span", { className: "hidden min-[600px]:inline", children: [
6866
+ label,
6867
+ /* @__PURE__ */ jsx63("span", { className: "text-on-subtle", children: " \xB7 " })
6868
+ ] }),
6869
+ /* @__PURE__ */ jsx63("span", { className: "text-on-subtle min-[600px]:text-on-prominent", children: suffix })
6870
+ ] }) : /* @__PURE__ */ jsxs31("span", { className: "text-sm font-body text-on-prominent whitespace-nowrap", children: [
6871
+ label,
6872
+ suffix && /* @__PURE__ */ jsx63("span", { className: "text-on-subtle", children: ` \xB7 ${suffix}` })
6873
+ ] }),
6874
+ /* @__PURE__ */ jsx63(ArrowUpRight, { className: "size-4 text-on-subtle shrink-0", "aria-hidden": "true" })
6875
+ ] });
6876
+ }
6877
+
6878
+ // components/blocks/auth-block.tsx
6879
+ import * as React14 from "react";
6880
+ import { jsx as jsx64, jsxs as jsxs32 } from "react/jsx-runtime";
6881
+ function AuthBlock({
6882
+ mode,
6883
+ logoSrc,
6884
+ wordmark = "trading.game",
6885
+ providers = ["google", "telegram", "x"],
6886
+ onSubmit,
6887
+ crossLinkHref = "#",
6888
+ idPrefix = "auth"
6889
+ }) {
6890
+ const headingText = mode === "sign-in" ? "Sign in" : "Sign up";
6891
+ const termsText = mode === "sign-in" ? "By signing in" : "By signing up";
6892
+ const ctaText = mode === "sign-in" ? "Sign in" : "Sign up";
6893
+ const footerPrompt = mode === "sign-in" ? "Don't have an account?" : "Already have an account?";
6894
+ const footerLinkLabel = mode === "sign-in" ? "Sign up" : "Log in";
6895
+ const [email, setEmail] = React14.useState("");
6896
+ return /* @__PURE__ */ jsxs32("div", { className: "flex flex-col items-center gap-6 w-full", children: [
6897
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-2", children: [
6898
+ /* @__PURE__ */ jsx64("img", { src: logoSrc, alt: wordmark, className: "size-8 object-contain" }),
6899
+ /* @__PURE__ */ jsx64("span", { className: "font-display font-semibold text-base text-on-prominent tracking-tight", children: wordmark })
6900
+ ] }),
6901
+ /* @__PURE__ */ jsx64("h2", { className: "text-3xl font-bold font-display text-on-prominent text-center", children: headingText }),
6902
+ /* @__PURE__ */ jsx64("div", { className: "flex flex-col gap-3 w-full", children: providers.map((p) => /* @__PURE__ */ jsx64(ProviderButton, { provider: p }, p)) }),
6903
+ /* @__PURE__ */ jsxs32("div", { className: "flex items-center gap-3 w-full", children: [
6904
+ /* @__PURE__ */ jsx64("div", { className: "flex-1 h-px bg-border-subtle" }),
6905
+ /* @__PURE__ */ jsx64("span", { className: "text-sm text-on-subtle font-body", children: "or" }),
6906
+ /* @__PURE__ */ jsx64("div", { className: "flex-1 h-px bg-border-subtle" })
6907
+ ] }),
6908
+ /* @__PURE__ */ jsx64("div", { className: "flex items-center gap-2 w-full", children: /* @__PURE__ */ jsx64(
6909
+ Input,
6910
+ {
6911
+ id: `${idPrefix}-email`,
6912
+ type: "text",
6913
+ placeholder: "Email or phone number",
6914
+ className: "flex-1",
6915
+ value: email,
6916
+ onChange: (e) => setEmail(e.target.value)
6917
+ }
6918
+ ) }),
6919
+ /* @__PURE__ */ jsxs32("p", { className: "text-sm text-on-subtle font-body text-left w-full", children: [
6920
+ termsText,
6921
+ ", you agree to our",
6922
+ " ",
6923
+ /* @__PURE__ */ jsx64(Link, { size: "sm", href: "#", children: "Terms & Conditions" })
6924
+ ] }),
6925
+ /* @__PURE__ */ jsx64(Button, { size: "md", className: "w-full", onClick: () => onSubmit == null ? void 0 : onSubmit({ email }), children: ctaText }),
6926
+ /* @__PURE__ */ jsxs32("p", { className: "text-sm text-on-subtle font-body text-center", children: [
6927
+ footerPrompt,
6928
+ " ",
6929
+ /* @__PURE__ */ jsx64(Link, { size: "sm", href: crossLinkHref, children: footerLinkLabel })
6930
+ ] })
6931
+ ] });
6932
+ }
6933
+ function ProviderButton({ provider }) {
6934
+ switch (provider) {
6935
+ case "google":
6936
+ return /* @__PURE__ */ jsxs32(Button, { variant: "secondary", size: "lg", className: "w-full", children: [
6937
+ /* @__PURE__ */ jsxs32("svg", { width: "18", height: "18", viewBox: "0 0 18 18", "aria-hidden": "true", fill: "none", className: "shrink-0", children: [
6938
+ /* @__PURE__ */ jsx64("path", { d: "M17.64 9.205c0-.639-.057-1.252-.164-1.841H9v3.481h4.844a4.14 4.14 0 0 1-1.796 2.716v2.259h2.908c1.702-1.567 2.684-3.875 2.684-6.615Z", fill: "#4285F4" }),
6939
+ /* @__PURE__ */ jsx64("path", { d: "M9 18c2.43 0 4.467-.806 5.956-2.18l-2.908-2.259c-.806.54-1.837.86-3.048.86-2.344 0-4.328-1.584-5.036-3.711H.957v2.332A8.997 8.997 0 0 0 9 18Z", fill: "#34A853" }),
6940
+ /* @__PURE__ */ jsx64("path", { d: "M3.964 10.71A5.41 5.41 0 0 1 3.682 9c0-.593.102-1.17.282-1.71V4.958H.957A8.996 8.996 0 0 0 0 9c0 1.452.348 2.827.957 4.042l3.007-2.332Z", fill: "#FBBC05" }),
6941
+ /* @__PURE__ */ jsx64("path", { d: "M9 3.58c1.321 0 2.508.454 3.44 1.345l2.582-2.58C13.463.891 11.426 0 9 0A8.997 8.997 0 0 0 .957 4.958L3.964 7.29C4.672 5.163 6.656 3.58 9 3.58Z", fill: "#EA4335" })
6942
+ ] }),
6943
+ "Continue with Google"
6944
+ ] });
6945
+ case "telegram":
6946
+ return /* @__PURE__ */ jsxs32(Button, { variant: "secondary", size: "lg", className: "w-full", children: [
6947
+ /* @__PURE__ */ jsxs32("svg", { width: "18", height: "18", viewBox: "0 0 18 18", "aria-hidden": "true", fill: "none", className: "shrink-0", children: [
6948
+ /* @__PURE__ */ jsx64("circle", { cx: "9", cy: "9", r: "9", fill: "#29B6F6" }),
6949
+ /* @__PURE__ */ jsx64("path", { d: "M13.5 5.25 11.25 13.5l-2.25-3-3 1.5 1.5-5.25 6-1.5Z", fill: "white", opacity: "0.3" }),
6950
+ /* @__PURE__ */ jsx64("path", { d: "m4.5 8.625 7.5-3-1.125 7.125-2.625-2.25-1.5 1.5.375-3.375Z", fill: "white" })
6951
+ ] }),
6952
+ "Continue with Telegram"
6953
+ ] });
6954
+ case "x":
6955
+ return /* @__PURE__ */ jsxs32(Button, { variant: "secondary", size: "lg", className: "w-full", children: [
6956
+ /* @__PURE__ */ jsx64("svg", { width: "18", height: "18", viewBox: "0 0 18 18", "aria-hidden": "true", fill: "currentColor", className: "shrink-0", children: /* @__PURE__ */ jsx64("path", { d: "M13.955 2.25h2.423L10.977 8.28 17.25 15.75h-4.812l-3.913-5.116-4.477 5.116H1.645l5.703-6.52L1.125 2.25h4.934l3.538 4.678 4.358-4.678Zm-.85 12.105h1.343L5.025 3.627H3.579l9.526 10.728Z" }) }),
6957
+ "Continue with X (Twitter)"
6958
+ ] });
6959
+ }
6960
+ }
6961
+
6962
+ // components/blocks/navbar-block.tsx
6963
+ import * as React15 from "react";
6964
+ import { Menu, X } from "lucide-react";
6965
+ import { jsx as jsx65, jsxs as jsxs33 } from "react/jsx-runtime";
6966
+ function NavBarBlock({ brand, links, signIn, signUp }) {
6967
+ var _a, _b, _c, _d;
6968
+ const [mobileMenuOpen, setMobileMenuOpen] = React15.useState(false);
6969
+ return /* @__PURE__ */ jsx65("div", { className: "w-full border border-border-subtle rounded-md overflow-hidden", children: /* @__PURE__ */ jsxs33("nav", { className: "bg-prominent", children: [
6970
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between px-layout-margin-inline py-3", children: [
6971
+ /* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-6", children: [
6972
+ /* @__PURE__ */ jsx65(
6973
+ "img",
6974
+ {
6975
+ src: brand.fullLogoSrc,
6976
+ alt: brand.alt,
6977
+ className: "hidden min-[600px]:block h-7 w-auto shrink-0 object-contain object-left"
6978
+ }
6979
+ ),
6980
+ /* @__PURE__ */ jsx65(
6981
+ "img",
6982
+ {
6983
+ src: brand.iconLogoSrc,
6984
+ alt: brand.alt,
6985
+ className: "min-[600px]:hidden size-7 shrink-0 object-contain"
6986
+ }
6987
+ ),
6988
+ /* @__PURE__ */ jsx65("div", { className: "hidden min-[600px]:flex items-center gap-1", children: links.map((l) => /* @__PURE__ */ jsx65(Button, { variant: "tertiary", size: "sm", onClick: l.onClick, children: l.label }, l.label)) })
6989
+ ] }),
6990
+ /* @__PURE__ */ jsxs33("div", { className: "hidden min-[600px]:flex items-center gap-2", children: [
6991
+ signIn && /* @__PURE__ */ jsx65(Button, { variant: "tertiary", size: "sm", onClick: signIn.onClick, children: (_a = signIn.label) != null ? _a : "Sign in" }),
6992
+ signUp && /* @__PURE__ */ jsx65(Button, { size: "sm", onClick: signUp.onClick, children: (_b = signUp.label) != null ? _b : "Sign up" })
6993
+ ] }),
6994
+ /* @__PURE__ */ jsx65(
6995
+ Button,
6996
+ {
6997
+ variant: "tertiary",
6998
+ size: "icon-sm",
6999
+ "aria-label": mobileMenuOpen ? "Close navigation menu" : "Open navigation menu",
7000
+ "aria-expanded": mobileMenuOpen,
7001
+ className: "min-[600px]:hidden",
7002
+ onClick: () => setMobileMenuOpen((prev) => !prev),
7003
+ children: mobileMenuOpen ? /* @__PURE__ */ jsx65(X, { className: "size-4" }) : /* @__PURE__ */ jsx65(Menu, { className: "size-4" })
7004
+ }
7005
+ )
7006
+ ] }),
7007
+ mobileMenuOpen && /* @__PURE__ */ jsxs33("div", { className: "min-[600px]:hidden flex flex-col border-t border-border-subtle px-layout-margin-inline py-3 gap-1", children: [
7008
+ links.map((l) => /* @__PURE__ */ jsx65(
7009
+ Button,
7010
+ {
7011
+ variant: "tertiary",
7012
+ size: "sm",
7013
+ className: "justify-start w-full",
7014
+ onClick: l.onClick,
7015
+ children: l.label
7016
+ },
7017
+ l.label
7018
+ )),
7019
+ (signIn || signUp) && /* @__PURE__ */ jsxs33("div", { className: "flex flex-col gap-2 pt-3 mt-2 border-t border-border-subtle", children: [
7020
+ signIn && /* @__PURE__ */ jsx65(Button, { variant: "secondary", size: "sm", className: "w-full", onClick: signIn.onClick, children: (_c = signIn.label) != null ? _c : "Sign in" }),
7021
+ signUp && /* @__PURE__ */ jsx65(Button, { size: "sm", className: "w-full", onClick: signUp.onClick, children: (_d = signUp.label) != null ? _d : "Sign up" })
7022
+ ] })
7023
+ ] })
7024
+ ] }) });
7025
+ }
7026
+
7027
+ // components/blocks/open-positions-block.tsx
7028
+ import * as React16 from "react";
7029
+ import { History as History2, X as X2 } from "lucide-react";
7030
+ import { jsx as jsx66, jsxs as jsxs34 } from "react/jsx-runtime";
7031
+ function OpenPositionsBlock({
7032
+ trigger,
7033
+ sheetTitle = "Positions",
7034
+ positions,
7035
+ onViewHistory,
7036
+ emptyState
7037
+ }) {
7038
+ const isMobile = useIsMobile();
7039
+ const body = positions.length === 0 ? emptyState != null ? emptyState : /* @__PURE__ */ jsx66(DefaultEmptyState, { onViewHistory }) : /* @__PURE__ */ jsx66(PositionsList, { positions, onViewHistory });
7040
+ if (isMobile) {
7041
+ return /* @__PURE__ */ jsxs34(Drawer, { children: [
7042
+ /* @__PURE__ */ jsx66(DrawerTrigger, { asChild: true, children: trigger }),
7043
+ /* @__PURE__ */ jsxs34(DrawerContent, { className: "p-0 flex flex-col", children: [
7044
+ /* @__PURE__ */ jsxs34(DrawerHeader, { className: "flex-row items-center justify-between px-4 py-3 shrink-0 text-left", children: [
7045
+ /* @__PURE__ */ jsx66(DrawerTitle, { className: "text-base font-semibold font-display text-on-prominent", children: sheetTitle }),
7046
+ /* @__PURE__ */ jsx66(DrawerClose, { asChild: true, children: /* @__PURE__ */ jsx66(NavigationButton, { size: "sm", "aria-label": "Close", children: /* @__PURE__ */ jsx66(X2, {}) }) })
7047
+ ] }),
7048
+ /* @__PURE__ */ jsx66(Separator, {}),
7049
+ body
7050
+ ] })
7051
+ ] });
7052
+ }
7053
+ return /* @__PURE__ */ jsxs34(Sheet, { children: [
7054
+ /* @__PURE__ */ jsx66(SheetTrigger, { asChild: true, children: trigger }),
7055
+ /* @__PURE__ */ jsxs34(SheetContent, { side: "right", showCloseButton: false, className: "p-0 flex flex-col w-80 sm:max-w-xs", children: [
7056
+ /* @__PURE__ */ jsxs34(SheetHeader, { className: "flex-row items-center justify-between px-4 py-3 shrink-0", children: [
7057
+ /* @__PURE__ */ jsx66(SheetTitle, { className: "text-base font-semibold font-display text-on-prominent", children: sheetTitle }),
7058
+ /* @__PURE__ */ jsx66(SheetClose, { asChild: true, children: /* @__PURE__ */ jsx66(NavigationButton, { size: "sm", "aria-label": "Close", children: /* @__PURE__ */ jsx66(X2, {}) }) })
7059
+ ] }),
7060
+ /* @__PURE__ */ jsx66(Separator, {}),
7061
+ body
7062
+ ] })
7063
+ ] });
7064
+ }
7065
+ function PositionsList({
7066
+ positions,
7067
+ onViewHistory
7068
+ }) {
7069
+ return /* @__PURE__ */ jsxs34("div", { className: "flex flex-col flex-1 min-h-0", children: [
7070
+ /* @__PURE__ */ jsx66(ItemGroup, { className: "min-h-0 overflow-y-auto", children: positions.map((pos, i) => /* @__PURE__ */ jsxs34(React16.Fragment, { children: [
7071
+ /* @__PURE__ */ jsx66(PositionRow, { position: pos }),
7072
+ i < positions.length - 1 && /* @__PURE__ */ jsx66("div", { className: "h-px mx-4 bg-border-subtle" })
7073
+ ] }, i)) }),
7074
+ /* @__PURE__ */ jsx66(Separator, {}),
7075
+ /* @__PURE__ */ jsx66("div", { className: "shrink-0 flex justify-center py-4", children: /* @__PURE__ */ jsx66(Button, { variant: "tertiary", size: "md", onClick: onViewHistory, children: "View transaction history" }) })
7076
+ ] });
7077
+ }
7078
+ function PositionRow({ position }) {
7079
+ const { label, suffix } = positionTitleParts(position);
7080
+ return /* @__PURE__ */ jsxs34(Item, { size: "sm", children: [
7081
+ /* @__PURE__ */ jsxs34(ItemContent, { children: [
7082
+ /* @__PURE__ */ jsxs34(ItemTitle, { children: [
7083
+ /* @__PURE__ */ jsx66("span", { className: "text-on-prominent", children: label }),
7084
+ suffix && /* @__PURE__ */ jsx66("span", { className: "text-on-subtle", children: ` ${suffix}` })
7085
+ ] }),
7086
+ /* @__PURE__ */ jsx66(MetaNote, { market: position.market, duration: position.duration })
7087
+ ] }),
7088
+ /* @__PURE__ */ jsx66(ItemActions, { children: /* @__PURE__ */ jsx66(PnlMeta, { pnl: position.pnl, win: position.win, stake: position.stake }) })
7089
+ ] });
7090
+ }
7091
+ var DIGITS_TYPE_LABEL = {
7092
+ matches: "Matches",
7093
+ differs: "Differs",
7094
+ odd: "Odd",
7095
+ even: "Even",
7096
+ over: "Over",
7097
+ under: "Under"
7098
+ };
7099
+ function positionTitleParts(p) {
7100
+ switch (p.kind) {
7101
+ case "rise-fall":
7102
+ return { label: p.direction };
7103
+ case "swipe":
7104
+ return { label: `Swipe-${p.direction.toLowerCase()}` };
7105
+ case "box-o":
7106
+ return { label: "Box-O", suffix: p.multiplier };
7107
+ // Digits with a picked value (matches/differs/over/under) show it as a
7108
+ // subtle suffix; odd/even have no digit so just the label.
7109
+ case "digits":
7110
+ return { label: DIGITS_TYPE_LABEL[p.type], suffix: p.digit };
7111
+ }
7112
+ }
7113
+ function MetaNote({ market, duration }) {
7114
+ return /* @__PURE__ */ jsxs34("span", { className: "text-xs text-on-subtle whitespace-nowrap", children: [
7115
+ market,
7116
+ " \xB7 ",
7117
+ duration
7118
+ ] });
7119
+ }
7120
+ function PnlMeta({ pnl, win, stake }) {
7121
+ return /* @__PURE__ */ jsxs34("div", { className: "flex flex-col items-end gap-0.5", children: [
7122
+ /* @__PURE__ */ jsx66("span", { className: `font-display font-bold tabular-nums text-base ${win ? "text-semantic-win" : "text-semantic-loss"}`, children: pnl }),
7123
+ /* @__PURE__ */ jsx66("span", { className: "tabular-nums text-xs text-on-subtle", children: stake })
7124
+ ] });
7125
+ }
7126
+ function DefaultEmptyState({ onViewHistory }) {
7127
+ return /* @__PURE__ */ jsx66(Empty, { className: "flex min-h-0 flex-1 flex-col justify-center border-none rounded-none p-6 text-center", children: /* @__PURE__ */ jsxs34(EmptyHeader, { className: "gap-4", children: [
7128
+ /* @__PURE__ */ jsx66(EmptyMedia, { children: /* @__PURE__ */ jsx66(History2, { className: "size-8 text-on-subtle" }) }),
7129
+ /* @__PURE__ */ jsx66(EmptyTitle, { className: "text-base leading-6 font-semibold tracking-normal body-md text-on-subtle", children: "No trades yet." }),
7130
+ /* @__PURE__ */ jsx66(Button, { variant: "tertiary", size: "md", onClick: onViewHistory, children: "View transaction history" })
7131
+ ] }) });
7132
+ }
6607
7133
  export {
6608
7134
  Accordion,
6609
7135
  AccordionContent,
@@ -6625,6 +7151,7 @@ export {
6625
7151
  AlertDialogTrigger,
6626
7152
  AlertTitle,
6627
7153
  AspectRatio,
7154
+ AuthBlock,
6628
7155
  Avatar,
6629
7156
  AvatarBadge,
6630
7157
  AvatarFallback,
@@ -6746,6 +7273,7 @@ export {
6746
7273
  EmptyHeader,
6747
7274
  EmptyMedia,
6748
7275
  EmptyTitle,
7276
+ FAQBlock,
6749
7277
  Field,
6750
7278
  FieldContent,
6751
7279
  FieldDescription,
@@ -6763,6 +7291,8 @@ export {
6763
7291
  FormItem,
6764
7292
  FormLabel,
6765
7293
  FormMessage,
7294
+ HeaderNavigationBlock,
7295
+ HeroBlock,
6766
7296
  HoverCard,
6767
7297
  HoverCardContent,
6768
7298
  HoverCardTrigger,
@@ -6810,6 +7340,7 @@ export {
6810
7340
  NativeSelect,
6811
7341
  NativeSelectOptGroup,
6812
7342
  NativeSelectOption,
7343
+ NavBarBlock,
6813
7344
  NavigationButton,
6814
7345
  NavigationMenu,
6815
7346
  NavigationMenuContent,
@@ -6819,6 +7350,7 @@ export {
6819
7350
  NavigationMenuList,
6820
7351
  NavigationMenuTrigger,
6821
7352
  NavigationMenuViewport,
7353
+ OpenPositionsBlock,
6822
7354
  Pagination,
6823
7355
  PaginationContent,
6824
7356
  PaginationEllipsis,
@@ -6839,6 +7371,8 @@ export {
6839
7371
  ResizableHandle,
6840
7372
  ResizablePanel,
6841
7373
  ResizablePanelGroup,
7374
+ ResultBlock,
7375
+ ResultDialog,
6842
7376
  ScrollArea,
6843
7377
  ScrollBar,
6844
7378
  Select,