@orangecheck/design 0.7.4 → 0.7.6

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.mjs CHANGED
@@ -1904,6 +1904,38 @@ function TabsContent({ className, ...props }) {
1904
1904
  }
1905
1905
  );
1906
1906
  }
1907
+ function useSpotPrice(opts = {}) {
1908
+ const { endpoint = "/api/price/btc-usd", intervalMs = 6e4 } = opts;
1909
+ const [state, setState] = useState({
1910
+ btcUsd: REFERENCE_BTC_USD,
1911
+ fetchedAt: null
1912
+ });
1913
+ useEffect(() => {
1914
+ let cancelled = false;
1915
+ async function pull() {
1916
+ try {
1917
+ const res = await fetch(endpoint);
1918
+ if (!res.ok) return;
1919
+ const json = await res.json();
1920
+ if (cancelled) return;
1921
+ if (typeof json.btc_usd === "number" && json.btc_usd > 0) {
1922
+ setState({
1923
+ btcUsd: Math.round(json.btc_usd),
1924
+ fetchedAt: json.fetched_at ?? null
1925
+ });
1926
+ }
1927
+ } catch {
1928
+ }
1929
+ }
1930
+ void pull();
1931
+ const t = setInterval(pull, intervalMs);
1932
+ return () => {
1933
+ cancelled = true;
1934
+ clearInterval(t);
1935
+ };
1936
+ }, [endpoint, intervalMs]);
1937
+ return state;
1938
+ }
1907
1939
 
1908
1940
  // src/format/index.ts
1909
1941
  var REFERENCE_BTC_USD = 95e3;
@@ -1933,6 +1965,16 @@ function usdToSats(usd, btcUsd = REFERENCE_BTC_USD) {
1933
1965
  function priceBoth(sats, btcUsd = REFERENCE_BTC_USD) {
1934
1966
  return `${formatSats(sats)} sats \xB7 ${satsToUsd(sats, btcUsd)}`;
1935
1967
  }
1968
+ function asOf(iso) {
1969
+ if (!iso) return null;
1970
+ const t = new Date(iso);
1971
+ if (Number.isNaN(t.getTime())) return null;
1972
+ return `as of ${t.toLocaleTimeString(void 0, {
1973
+ hour: "2-digit",
1974
+ minute: "2-digit",
1975
+ hour12: false
1976
+ })}`;
1977
+ }
1936
1978
  function relativeTime(when) {
1937
1979
  const t = when instanceof Date ? when.getTime() : new Date(when).getTime();
1938
1980
  if (Number.isNaN(t)) return "";
@@ -2074,28 +2116,46 @@ function QrCode({ value, size = 200, label, className }) {
2074
2116
  );
2075
2117
  }
2076
2118
  function HelpHint({
2077
- title,
2078
2119
  children,
2079
- side = "bottom",
2080
- label = "more information",
2120
+ title,
2121
+ side = "top",
2122
+ size = "sm",
2123
+ tone = "default",
2124
+ label = "what is this?",
2081
2125
  className
2082
2126
  }) {
2083
- return /* @__PURE__ */ jsxs(Popover, { children: [
2127
+ const iconSize = size === "xs" ? 12 : 14;
2128
+ return /* @__PURE__ */ jsxs(PopoverPrimitive.Root, { children: [
2084
2129
  /* @__PURE__ */ jsx(
2085
- PopoverTrigger,
2130
+ PopoverPrimitive.Trigger,
2086
2131
  {
2087
2132
  "aria-label": label,
2133
+ onClick: (e) => e.stopPropagation(),
2088
2134
  className: cn(
2089
- "text-muted-foreground/60 hover:text-foreground inline-flex size-3.5 items-center justify-center align-middle transition-colors outline-none focus-visible:ring-2 focus-visible:ring-ring",
2135
+ "focus-visible:ring-primary/60 inline-flex shrink-0 items-center justify-center rounded-full transition-colors outline-none focus-visible:ring-2",
2136
+ tone === "subtle" ? "text-muted-foreground/60 hover:text-foreground/80" : "text-primary/70 hover:text-primary",
2090
2137
  className
2091
2138
  ),
2092
- children: /* @__PURE__ */ jsx(HelpCircle, { className: "size-3.5", "aria-hidden": true })
2139
+ children: /* @__PURE__ */ jsx(HelpCircle, { size: iconSize, "aria-hidden": true })
2093
2140
  }
2094
2141
  ),
2095
- /* @__PURE__ */ jsxs(PopoverContent, { side, className: "w-72 space-y-1.5", children: [
2096
- title && /* @__PURE__ */ jsx("p", { className: "label-mono text-foreground text-[10px]", children: title }),
2097
- /* @__PURE__ */ jsx("div", { className: "text-muted-foreground text-xs leading-relaxed", children })
2098
- ] })
2142
+ /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
2143
+ PopoverPrimitive.Content,
2144
+ {
2145
+ side,
2146
+ sideOffset: 6,
2147
+ collisionPadding: 12,
2148
+ className: "border-border bg-popover text-popover-foreground 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 z-50 max-w-xs rounded-md border p-3 text-xs leading-relaxed shadow-md outline-none",
2149
+ children: [
2150
+ title && /* @__PURE__ */ jsxs("div", { className: "label-mono text-primary mb-1.5", children: [
2151
+ "\xA7 ",
2152
+ title
2153
+ ] }),
2154
+ /* @__PURE__ */ jsx("div", { className: "text-foreground/90", children }),
2155
+ /* @__PURE__ */ jsx(PopoverPrimitive.Arrow, { className: "fill-popover" })
2156
+ ]
2157
+ }
2158
+ ) })
2099
2159
  ] });
2100
2160
  }
2101
2161
  var TONE_CLASS = {
@@ -3870,6 +3930,6 @@ function LayoutSubHeader({
3870
3930
  ] }) });
3871
3931
  }
3872
3932
 
3873
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertTitle, AlertWithAction, AlertWithCountdown, AppShell, Badge, Bar, BitcoinAddress, Button, Callout, Card, Checkbox, ConfirmHost, CopyButton, DEFAULT_OC_THEME, DataRow, DefinitionList, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, EcosystemSwitcher, EmptyState, ErrorBoundary, FAMILY_PROPERTIES, HelpHint, Input, Label, LayoutSubHeader, Modal, OC_DEFAULT_ACCENT, OC_SKIN_COOKIE, OC_THEMES, OcAccountMenu, OcAccountMenuView, OcAppearanceMenu, OcDashboardHub, OcDashboardShell, OcLogoDropdown, OcPrimaryNav, OcThemeBridge, OcThemePicker, OcThemeProvider, Pagination, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PromptHost, QrCode, REFERENCE_BTC_USD, RadioGroup, RadioGroupItem, SITE_STATE_LABEL, SatsAmount, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Sparkline, StatBlock, StatCard, StatGrid, StatTile, StatusPill, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeToggle, ThemeToggleLink, Toaster, Working, WorkingPanel, accentFor, badgeVariants, buttonVariants, cn, confirm, explorerUrl, findFamilyProperty, formatSats, formatSatsCompact, getOcThemeInitScript, isKnownTheme, makeStatusPill, priceBoth, prompt, relativeTime, resolveTheme, satsToUsd, shortenAddress, usdToSats, useOcSkin };
3933
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertTitle, AlertWithAction, AlertWithCountdown, AppShell, Badge, Bar, BitcoinAddress, Button, Callout, Card, Checkbox, ConfirmHost, CopyButton, DEFAULT_OC_THEME, DataRow, DefinitionList, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, EcosystemSwitcher, EmptyState, ErrorBoundary, FAMILY_PROPERTIES, HelpHint, Input, Label, LayoutSubHeader, Modal, OC_DEFAULT_ACCENT, OC_SKIN_COOKIE, OC_THEMES, OcAccountMenu, OcAccountMenuView, OcAppearanceMenu, OcDashboardHub, OcDashboardShell, OcLogoDropdown, OcPrimaryNav, OcThemeBridge, OcThemePicker, OcThemeProvider, Pagination, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, PromptHost, QrCode, REFERENCE_BTC_USD, RadioGroup, RadioGroupItem, SITE_STATE_LABEL, SatsAmount, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Skeleton, Sparkline, StatBlock, StatCard, StatGrid, StatTile, StatusPill, Switch, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeToggle, ThemeToggleLink, Toaster, Working, WorkingPanel, accentFor, asOf, badgeVariants, buttonVariants, cn, confirm, explorerUrl, findFamilyProperty, formatSats, formatSatsCompact, getOcThemeInitScript, isKnownTheme, makeStatusPill, priceBoth, prompt, relativeTime, resolveTheme, satsToUsd, shortenAddress, usdToSats, useOcSkin, useSpotPrice };
3874
3934
  //# sourceMappingURL=index.mjs.map
3875
3935
  //# sourceMappingURL=index.mjs.map