@hanzo/ui 8.0.12 → 8.0.14

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.
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkYBXVUV7P_cjs = require('../chunk-YBXVUV7P.cjs');
5
+ var chunkVGGGGXWS_cjs = require('../chunk-VGGGGXWS.cjs');
5
6
  var react = require('react');
6
7
  var gui = require('@hanzo/gui');
7
8
  var jsxRuntime = require('react/jsx-runtime');
@@ -674,12 +675,12 @@ function menuKeyDown(e, onClose) {
674
675
  if (items.length === 0) return;
675
676
  e.preventDefault();
676
677
  const active = document.activeElement;
677
- const current2 = active ? items.indexOf(active) : -1;
678
+ const current = active ? items.indexOf(active) : -1;
678
679
  let next;
679
680
  if (e.key === "Home") next = 0;
680
681
  else if (e.key === "End") next = items.length - 1;
681
- else if (e.key === "ArrowDown") next = current2 < 0 ? 0 : (current2 + 1) % items.length;
682
- else next = current2 <= 0 ? items.length - 1 : current2 - 1;
682
+ else if (e.key === "ArrowDown") next = current < 0 ? 0 : (current + 1) % items.length;
683
+ else next = current <= 0 ? items.length - 1 : current - 1;
683
684
  items[next]?.focus();
684
685
  }
685
686
  var EDGE = 8;
@@ -854,8 +855,8 @@ var SURFACES = ORDER.map((id) => {
854
855
  const s = products.surfaceById(id);
855
856
  return { id, label: s.label, href: s.href, hint: s.domain };
856
857
  });
857
- function otherSurfaces(current2) {
858
- return current2 ? SURFACES.filter((s) => s.id !== current2) : SURFACES;
858
+ function otherSurfaces(current) {
859
+ return current ? SURFACES.filter((s) => s.id !== current) : SURFACES;
859
860
  }
860
861
  function HanzoMark({ size = 22, color = "currentColor" }) {
861
862
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -912,7 +913,7 @@ function AppHeader({
912
913
  onBrand,
913
914
  org,
914
915
  children,
915
- current: current2,
916
+ current,
916
917
  surfaces,
917
918
  open,
918
919
  user,
@@ -925,7 +926,7 @@ function AppHeader({
925
926
  }) {
926
927
  const [appsOpen, setAppsOpen] = react.useState(false);
927
928
  const [menuOpen, setMenuOpen] = react.useState(false);
928
- const items = surfaces ?? otherSurfaces(current2);
929
+ const items = surfaces ?? otherSurfaces(current);
929
930
  const launch = (s) => {
930
931
  setAppsOpen(false);
931
932
  if (open) open(s);
@@ -1131,11 +1132,11 @@ function OrgSwitcher({ scope, orgs, pageSize = 20, current: given, create, picke
1131
1132
  if (orgs) return filterOrgs(rows, query);
1132
1133
  return [{ name: currentId, displayName: titleCase(currentId) }];
1133
1134
  }, [orgs, rows, query, currentId]);
1134
- const current2 = react.useMemo(() => {
1135
+ const current = react.useMemo(() => {
1135
1136
  if (given && given.name === currentId) return given;
1136
1137
  return rows.find((o) => o.name === currentId) ?? { name: currentId, displayName: titleCase(currentId) };
1137
1138
  }, [given, rows, currentId]);
1138
- const currentLabel = current2.displayName || titleCase(current2.name);
1139
+ const currentLabel = current.displayName || titleCase(current.name);
1139
1140
  const select = react.useCallback(
1140
1141
  (org) => {
1141
1142
  setOpen(false);
@@ -1158,7 +1159,7 @@ function OrgSwitcher({ scope, orgs, pageSize = 20, current: given, create, picke
1158
1159
  };
1159
1160
  return /* @__PURE__ */ jsxRuntime.jsxs(gui.Popover, { open, onOpenChange: setOpen, placement: "bottom-start", children: [
1160
1161
  /* @__PURE__ */ jsxRuntime.jsx(gui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { chromeless: true, height: 44, px: "$2", justify: "flex-start", "aria-label": `${currentLabel} \xB7 switch organization`, children: /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2.5", flex: 1, minW: 0, children: [
1161
- /* @__PURE__ */ jsxRuntime.jsx(OrgMark, { org: current2, size: 30 }),
1162
+ /* @__PURE__ */ jsxRuntime.jsx(OrgMark, { org: current, size: 30 }),
1162
1163
  /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { flex: 1, minW: 0, fontSize: "$4", fontWeight: "800", color: "$color12", numberOfLines: 1, children: currentLabel }),
1163
1164
  /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.ChevronsUpDown, { size: 15, color: "$color9" })
1164
1165
  ] }) }) }),
@@ -1589,203 +1590,6 @@ function SiteFooter({ footer, brand, tagline, meta, link = defaultLink2 }) {
1589
1590
  ] })
1590
1591
  ] });
1591
1592
  }
1592
- var HostCtx = react.createContext({});
1593
- var HostProvider = ({ actions, children }) => /* @__PURE__ */ jsxRuntime.jsx(HostCtx.Provider, { value: actions, children });
1594
- var useHost = () => react.useContext(HostCtx);
1595
- function classifyBackend(e) {
1596
- const status = typeof e?.status === "number" ? e.status : 0;
1597
- const message = e instanceof Error ? e.message : String(e);
1598
- if (status === 503) return { kind: "not-initialized", message };
1599
- if (status === 404 || status === 405) return { kind: "unavailable", message };
1600
- if (status === 501) return { kind: "not-implemented", message };
1601
- if (status === 402) return { kind: "billing", message };
1602
- if (status === 401) return { kind: "signin", message };
1603
- if (status === 403) return { kind: "access", message };
1604
- return { kind: "error", message };
1605
- }
1606
- function classifyRead(e) {
1607
- const s = classifyBackend(e);
1608
- return s.kind === "billing" ? null : s;
1609
- }
1610
- var TITLES = {
1611
- "not-initialized": "Backend not initialized",
1612
- unavailable: "Not available on this deployment yet",
1613
- "not-implemented": "Not yet available",
1614
- access: "Not enabled for your account",
1615
- signin: "Your session expired",
1616
- billing: "Add credits to continue",
1617
- error: "Could not reach the backend"
1618
- };
1619
- var BODIES = {
1620
- "not-initialized": "The /v1 route is mounted but its runtime (or the console API key it proxies to) is not configured on this deployment yet. Real data appears here once it is \u2014 no placeholder data is shown.",
1621
- unavailable: "This endpoint is not mounted at the gateway on this host yet. The view lights up automatically once the route is live.",
1622
- // 501 — a real, planned capability whose body ships in a later phase.
1623
- "not-implemented": "This capability is planned but not wired yet. The backend answers honestly rather than pretending it worked \u2014 nothing here is fabricated, and the view lights up automatically once it ships.",
1624
- // 403 for a SIGNED-IN user — never "sign in".
1625
- access: "You're signed in, but this isn't enabled for your organization on this deployment, or it's an admin-only surface. It appears here automatically once your account has access \u2014 nothing is fabricated.",
1626
- // 401 — the session itself lapsed; re-auth returns to this exact page.
1627
- signin: "Your session has expired or isn\u2019t recognized here. Sign in again to continue where you left off.",
1628
- // Empty → the card shows the backend's own message (the honest "Insufficient
1629
- // balance. Please add credits…" from the gateway billing gate).
1630
- billing: "",
1631
- error: ""
1632
- };
1633
- function BackendStateCard({
1634
- state,
1635
- onRetry,
1636
- hint
1637
- }) {
1638
- const { signIn, addCredits } = useHost();
1639
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.Card, { borderWidth: 1, borderColor: "$borderColor", p: "$4", gap: "$2", maxWidth: 640, children: [
1640
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", items: "center", children: [
1641
- /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.TriangleAlert, { size: 16 }),
1642
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$4", fontWeight: "700", children: TITLES[state.kind] })
1643
- ] }),
1644
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color11", children: BODIES[state.kind] || state.message }),
1645
- hint ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color10", children: hint }) : null,
1646
- state.kind === "signin" && signIn ? /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", theme: "light", self: "flex-start", onPress: signIn, children: "Sign in again" }) : state.kind === "billing" && addCredits ? (
1647
- // 402 — the org has no funded balance. Offer a top-up CTA (and keep Retry so
1648
- // a returning, funded caller can reload in place).
1649
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", items: "center", flexWrap: "wrap", children: [
1650
- /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", theme: "light", self: "flex-start", icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.CreditCard, { size: 14 }), onPress: addCredits, children: "Add credits" }),
1651
- onRetry ? /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", self: "flex-start", onPress: onRetry, children: "Retry" }) : null
1652
- ] })
1653
- ) : onRetry ? /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", self: "flex-start", onPress: onRetry, children: "Retry" }) : null
1654
- ] });
1655
- }
1656
- function PageHeader({
1657
- title,
1658
- subtitle,
1659
- actions
1660
- }) {
1661
- return (
1662
- // flexWrap lets the actions drop below the title on narrow screens; flex={1}
1663
- // minW={0} lets the title column shrink so a long subtitle WRAPS instead of
1664
- // running off the viewport (a flex child defaults to min-width:auto = content
1665
- // width, which would overflow on mobile).
1666
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { justify: "space-between", items: "flex-start", gap: "$3", flexWrap: "wrap", children: [
1667
- /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1", flex: 1, minW: 200, children: [
1668
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$7", fontWeight: "500", letterSpacing: -0.4, children: title }),
1669
- subtitle ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color11", children: subtitle }) : null
1670
- ] }),
1671
- actions ? /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { gap: "$2", items: "center", flexWrap: "wrap", width: "100%", $md: { width: "auto", justify: "flex-end" }, children: actions }) : null
1672
- ] })
1673
- );
1674
- }
1675
- function SkeletonRows({ columns, count = 6 }) {
1676
- return /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { children: Array.from({ length: count }).map((_, r) => /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { py: "$2.5", px: "$3", gap: "$3", borderTopWidth: 1, borderColor: "$borderColor", items: "center", children: columns.map((c, i) => /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { width: c.width, flex: c.width ? void 0 : 1, minW: c.width ? void 0 : FLEX_MIN_COL_W, items: c.align === "right" ? "flex-end" : "flex-start", children: /* @__PURE__ */ jsxRuntime.jsx(
1677
- "div",
1678
- {
1679
- className: "hz-skeleton",
1680
- style: { height: 12, borderRadius: 6, width: `${[62, 40, 54, 34, 48][(i + r) % 5]}%` },
1681
- "aria-hidden": true
1682
- }
1683
- ) }, c.key)) }, r)) });
1684
- }
1685
- function DataTable({
1686
- columns,
1687
- rows,
1688
- loading,
1689
- empty = "Nothing here yet.",
1690
- rowKey,
1691
- onRowPress,
1692
- isRowExpanded,
1693
- renderExpanded,
1694
- sort,
1695
- onSortChange
1696
- }) {
1697
- const minTableW = columns.reduce((sum, c) => sum + (c.width ?? FLEX_MIN_COL_W), 0) + (columns.length + 1) * 12;
1698
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { borderWidth: 1, borderColor: "$borderColor", rounded: "$4", overflow: "hidden", children: [
1699
- /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { style: { overflowX: "auto", overflowY: "visible" }, children: /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { minW: minTableW, children: [
1700
- /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { bg: "$color1", py: "$2.5", px: "$3", gap: "$3", borderBottomWidth: 1, borderColor: "$borderColor", role: "row", children: columns.map((c) => {
1701
- const sortable = c.sortable === true && !!onSortChange;
1702
- const active = sortable && sort?.key === c.key;
1703
- const Caret = !sortable ? null : !active ? lucideIcons2.ChevronsUpDown : sort?.dir === "asc" ? lucideIcons2.ChevronUp : lucideIcons2.ChevronDown;
1704
- return /* @__PURE__ */ jsxRuntime.jsxs(
1705
- gui.XStack,
1706
- {
1707
- width: c.width,
1708
- flex: c.width ? void 0 : 1,
1709
- minW: c.width ? void 0 : FLEX_MIN_COL_W,
1710
- items: "center",
1711
- gap: "$1",
1712
- justify: c.align === "right" ? "flex-end" : "flex-start",
1713
- role: "columnheader",
1714
- "aria-sort": sortable ? active ? sort?.dir === "asc" ? "ascending" : "descending" : "none" : void 0,
1715
- "aria-label": sortable ? `Sort by ${c.header}` : void 0,
1716
- cursor: sortable ? "pointer" : void 0,
1717
- hoverStyle: sortable ? { opacity: 0.75 } : void 0,
1718
- onPress: sortable ? () => onSortChange?.(c.key) : void 0,
1719
- children: [
1720
- /* @__PURE__ */ jsxRuntime.jsx(
1721
- gui.Text,
1722
- {
1723
- fontSize: "$1",
1724
- fontWeight: "500",
1725
- color: active ? "$color12" : "$color10",
1726
- text: c.align === "right" ? "right" : "left",
1727
- className: c.mono ? "hz-tnum" : void 0,
1728
- children: c.header
1729
- }
1730
- ),
1731
- Caret ? /* @__PURE__ */ jsxRuntime.jsx(Caret, { size: 12, color: active ? "$color12" : "$color9" }) : null
1732
- ]
1733
- },
1734
- c.key
1735
- );
1736
- }) }),
1737
- loading ? /* @__PURE__ */ jsxRuntime.jsx(SkeletonRows, { columns }) : rows.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { children: rows.map((row) => {
1738
- const expanded = (isRowExpanded?.(row) ?? false) && !!renderExpanded;
1739
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { children: [
1740
- /* @__PURE__ */ jsxRuntime.jsx(
1741
- gui.XStack,
1742
- {
1743
- className: "hz-row",
1744
- py: "$2.5",
1745
- px: "$3",
1746
- gap: "$3",
1747
- borderTopWidth: 1,
1748
- borderColor: "$borderColor",
1749
- items: "center",
1750
- bg: expanded ? "$color2" : void 0,
1751
- hoverStyle: onRowPress ? { bg: "$color2" } : void 0,
1752
- cursor: onRowPress ? "pointer" : void 0,
1753
- onPress: onRowPress ? () => onRowPress(row) : void 0,
1754
- children: columns.map((c) => {
1755
- const cell = c.render ? c.render(row) : String(row[c.key] ?? "");
1756
- return /* @__PURE__ */ jsxRuntime.jsx(
1757
- gui.YStack,
1758
- {
1759
- width: c.width,
1760
- flex: c.width ? void 0 : 1,
1761
- minW: c.width ? void 0 : FLEX_MIN_COL_W,
1762
- justify: "center",
1763
- items: c.align === "right" ? "flex-end" : "flex-start",
1764
- children: typeof cell === "string" || typeof cell === "number" ? /* @__PURE__ */ jsxRuntime.jsx(
1765
- gui.Text,
1766
- {
1767
- fontSize: "$3",
1768
- numberOfLines: 1,
1769
- color: "$color12",
1770
- text: c.align === "right" ? "right" : "left",
1771
- className: c.mono ? "hz-mono" : void 0,
1772
- children: cell
1773
- }
1774
- ) : cell
1775
- },
1776
- c.key
1777
- );
1778
- })
1779
- }
1780
- ),
1781
- expanded && renderExpanded ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { borderTopWidth: 1, borderColor: "$borderColor", bg: "$color1", children: renderExpanded(row) }) : null
1782
- ] }, rowKey(row));
1783
- }) }) : null
1784
- ] }) }),
1785
- !loading && rows.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { py: "$8", px: "$4", items: "center", gap: "$1", borderTopWidth: 1, borderColor: "$borderColor", children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { color: "$color10", fontSize: "$3", text: "center", children: empty }) }) : null
1786
- ] });
1787
- }
1788
- var FLEX_MIN_COL_W = 120;
1789
1593
  function CommerceResource({
1790
1594
  title,
1791
1595
  subtitle,
@@ -1801,14 +1605,14 @@ function CommerceResource({
1801
1605
  loadRef.current = load;
1802
1606
  const reload = react.useCallback(() => {
1803
1607
  setState({ phase: "loading" });
1804
- loadRef.current().then((r) => setState({ phase: "ready", data: r.rows })).catch((e) => setState({ phase: "error", error: classifyBackend(e) }));
1608
+ loadRef.current().then((r) => setState({ phase: "ready", data: r.rows })).catch((e) => setState({ phase: "error", error: chunkVGGGGXWS_cjs.classifyBackend(e) }));
1805
1609
  }, []);
1806
1610
  react.useEffect(() => {
1807
1611
  reload();
1808
1612
  }, [reload]);
1809
1613
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1810
1614
  /* @__PURE__ */ jsxRuntime.jsx(
1811
- PageHeader,
1615
+ chunkVGGGGXWS_cjs.PageHeader,
1812
1616
  {
1813
1617
  title,
1814
1618
  subtitle,
@@ -1818,8 +1622,8 @@ function CommerceResource({
1818
1622
  ] })
1819
1623
  }
1820
1624
  ),
1821
- state.phase === "error" ? /* @__PURE__ */ jsxRuntime.jsx(BackendStateCard, { state: state.error, onRetry: reload, hint }) : /* @__PURE__ */ jsxRuntime.jsx(
1822
- DataTable,
1625
+ state.phase === "error" ? /* @__PURE__ */ jsxRuntime.jsx(chunkVGGGGXWS_cjs.BackendStateCard, { state: state.error, onRetry: reload, hint }) : /* @__PURE__ */ jsxRuntime.jsx(
1626
+ chunkVGGGGXWS_cjs.DataTable,
1823
1627
  {
1824
1628
  columns,
1825
1629
  rows: state.phase === "ready" ? state.data : [],
@@ -1845,7 +1649,7 @@ function ConfirmDelete({
1845
1649
  await run();
1846
1650
  onDone();
1847
1651
  } catch (e) {
1848
- setErr(classifyBackend(e).message || "Failed to delete.");
1652
+ setErr(chunkVGGGGXWS_cjs.classifyBackend(e).message || "Failed to delete.");
1849
1653
  setBusy(false);
1850
1654
  }
1851
1655
  };
@@ -2068,131 +1872,6 @@ function AnimatedLogo({
2068
1872
  }
2069
1873
  );
2070
1874
  }
2071
- function isHexColor(v) {
2072
- return typeof v === "string" && /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(v.trim());
2073
- }
2074
- function resolveAccent(theme) {
2075
- if (!theme || !theme.isEnabled) return null;
2076
- const hex = (theme.colorPrimary ?? "").trim();
2077
- return isHexColor(hex) ? hex : null;
2078
- }
2079
- function expandHex(hex) {
2080
- const h = hex.trim().toLowerCase();
2081
- if (h.length === 4) return `#${h[1]}${h[1]}${h[2]}${h[2]}${h[3]}${h[3]}`;
2082
- return h;
2083
- }
2084
- function contrastText(hex) {
2085
- if (!isHexColor(hex)) return "#ffffff";
2086
- const h = expandHex(hex);
2087
- const r = parseInt(h.slice(1, 3), 16) / 255;
2088
- const g = parseInt(h.slice(3, 5), 16) / 255;
2089
- const b = parseInt(h.slice(5, 7), 16) / 255;
2090
- const lin = (c) => c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;
2091
- const luminance = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b);
2092
- return luminance > 0.5 ? "#000000" : "#ffffff";
2093
- }
2094
- function accentFor(theme) {
2095
- const hex = resolveAccent(theme);
2096
- return { accent: hex, contrast: hex ? contrastText(hex) : "#ffffff" };
2097
- }
2098
- var DEFAULT = { accent: null, contrast: "#ffffff" };
2099
- var current = DEFAULT;
2100
- var listeners = /* @__PURE__ */ new Set();
2101
- function setOrgAccent(theme) {
2102
- const next = accentFor(theme);
2103
- if (next.accent === current.accent) return;
2104
- current = next.accent ? next : DEFAULT;
2105
- for (const l of listeners) l();
2106
- }
2107
- function subscribe(cb) {
2108
- listeners.add(cb);
2109
- return () => {
2110
- listeners.delete(cb);
2111
- };
2112
- }
2113
- function useAccent() {
2114
- return react.useSyncExternalStore(
2115
- subscribe,
2116
- () => current,
2117
- () => DEFAULT
2118
- );
2119
- }
2120
- function PrimaryButton(props) {
2121
- const { accent, contrast } = useAccent();
2122
- if (accent) {
2123
- return /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { style: { backgroundColor: accent, color: contrast, borderColor: accent }, ...props });
2124
- }
2125
- return /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { theme: "light", ...props });
2126
- }
2127
- function openHref2(href) {
2128
- if (typeof window !== "undefined") window.open(href, "_blank", "noopener");
2129
- }
2130
- function EmptyState({
2131
- icon: Icon,
2132
- title,
2133
- description,
2134
- bullets,
2135
- primary,
2136
- secondary
2137
- }) {
2138
- return /* @__PURE__ */ jsxRuntime.jsxs(
2139
- gui.Card,
2140
- {
2141
- borderWidth: 1,
2142
- borderColor: "$borderColor",
2143
- borderStyle: "dashed",
2144
- p: "$6",
2145
- gap: "$4",
2146
- items: "center",
2147
- maxWidth: 640,
2148
- self: "center",
2149
- width: "100%",
2150
- children: [
2151
- /* @__PURE__ */ jsxRuntime.jsx(
2152
- gui.YStack,
2153
- {
2154
- width: 48,
2155
- height: 48,
2156
- items: "center",
2157
- justify: "center",
2158
- rounded: "$4",
2159
- bg: "$color3",
2160
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 24 })
2161
- }
2162
- ),
2163
- /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$2", items: "center", maxW: 480, children: [
2164
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$6", fontWeight: "500", text: "center", letterSpacing: -0.3, children: title }),
2165
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color11", text: "center", children: description })
2166
- ] }),
2167
- bullets && bullets.length ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$2", self: "stretch", maxW: 420, mx: "auto", children: bullets.map((b) => /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", items: "flex-start", children: [
2168
- /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { pt: "$1", children: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Check, { size: 14, color: "$color10" }) }),
2169
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color11", flex: 1, children: b })
2170
- ] }, b)) }) : null,
2171
- primary || secondary ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", items: "center", flexWrap: "wrap", justify: "center", children: [
2172
- primary ? /* @__PURE__ */ jsxRuntime.jsx(
2173
- PrimaryButton,
2174
- {
2175
- icon: primary.icon,
2176
- iconAfter: primary.href ? /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.ExternalLink, { size: 15 }) : /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.ArrowRight, { size: 15 }),
2177
- onPress: () => primary.href ? openHref2(primary.href) : primary.onPress?.(),
2178
- children: primary.label
2179
- }
2180
- ) : null,
2181
- secondary ? /* @__PURE__ */ jsxRuntime.jsx(
2182
- gui.Button,
2183
- {
2184
- chromeless: true,
2185
- icon: secondary.icon,
2186
- iconAfter: secondary.href ? /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.ExternalLink, { size: 14 }) : void 0,
2187
- onPress: () => secondary.href ? openHref2(secondary.href) : secondary.onPress?.(),
2188
- children: secondary.label
2189
- }
2190
- ) : null
2191
- ] }) : null
2192
- ]
2193
- }
2194
- );
2195
- }
2196
1875
  function FadeIn({
2197
1876
  children,
2198
1877
  index = 0,
@@ -2203,125 +1882,6 @@ function FadeIn({
2203
1882
  const delay = delayMs ?? index * step;
2204
1883
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "hz-fade-up", style: { animationDelay: `${delay}ms`, ...style }, children });
2205
1884
  }
2206
- function FieldRow({ label, children }) {
2207
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$3", items: "flex-start", flexWrap: "wrap", children: [
2208
- /* @__PURE__ */ jsxRuntime.jsx(gui.Label, { width: "100%", pt: "$2", color: "$color11", fontSize: "$3", $md: { width: 180 }, children: label }),
2209
- /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { flex: 1, minW: 0, $md: { minW: 240 }, children })
2210
- ] });
2211
- }
2212
- function FieldText({
2213
- value,
2214
- onChange,
2215
- disabled,
2216
- secure,
2217
- placeholder
2218
- }) {
2219
- return /* @__PURE__ */ jsxRuntime.jsx(
2220
- gui.Input,
2221
- {
2222
- value,
2223
- onChangeText: onChange,
2224
- disabled,
2225
- secureTextEntry: secure,
2226
- placeholder,
2227
- autoCapitalize: "none"
2228
- }
2229
- );
2230
- }
2231
- function FieldTextArea({
2232
- value,
2233
- onChange,
2234
- disabled,
2235
- rows = 6
2236
- }) {
2237
- return /* @__PURE__ */ jsxRuntime.jsx(gui.TextArea, { value, onChangeText: onChange, disabled, numberOfLines: rows });
2238
- }
2239
- function FieldSwitch({
2240
- checked,
2241
- onChange,
2242
- disabled
2243
- }) {
2244
- return /* @__PURE__ */ jsxRuntime.jsx(gui.Switch, { checked, onCheckedChange: onChange, disabled, size: "$3", children: /* @__PURE__ */ jsxRuntime.jsx(gui.Switch.Thumb, {}) });
2245
- }
2246
- var CHEVRON = `data:image/svg+xml,${encodeURIComponent(
2247
- '<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#9a9a9a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 9 6 6 6-6"/></svg>'
2248
- )}`;
2249
- function selectStyle(disabled) {
2250
- return {
2251
- width: "100%",
2252
- boxSizing: "border-box",
2253
- appearance: "none",
2254
- WebkitAppearance: "none",
2255
- MozAppearance: "none",
2256
- background: `var(--background) url("${CHEVRON}") no-repeat right 10px center`,
2257
- color: "var(--color12)",
2258
- border: "1px solid var(--borderColor)",
2259
- borderRadius: 9,
2260
- padding: "9px 34px 9px 12px",
2261
- fontSize: 14,
2262
- lineHeight: "20px",
2263
- fontFamily: "inherit",
2264
- height: 40,
2265
- outline: "none",
2266
- cursor: disabled ? "not-allowed" : "pointer",
2267
- opacity: disabled ? 0.5 : 1
2268
- };
2269
- }
2270
- var OPTION_STYLE = { background: "var(--color2)", color: "var(--color12)" };
2271
- function FieldSelect({
2272
- value,
2273
- options,
2274
- onChange,
2275
- disabled,
2276
- placeholder = "Select\u2026"
2277
- }) {
2278
- const showPlaceholder = value === "" || !options.includes(value);
2279
- return /* @__PURE__ */ jsxRuntime.jsxs(
2280
- "select",
2281
- {
2282
- value: showPlaceholder ? "" : value,
2283
- onChange: (e) => onChange(e.currentTarget.value),
2284
- disabled,
2285
- "aria-label": placeholder,
2286
- style: selectStyle(disabled),
2287
- children: [
2288
- showPlaceholder ? /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: true, style: OPTION_STYLE, children: placeholder }) : null,
2289
- options.map((opt) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: opt, style: OPTION_STYLE, children: opt }, opt))
2290
- ]
2291
- }
2292
- );
2293
- }
2294
- function FieldSlider({
2295
- value,
2296
- min,
2297
- max,
2298
- step,
2299
- onChange,
2300
- disabled
2301
- }) {
2302
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$3", items: "center", children: [
2303
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { width: 56, fontSize: "$3", color: "$color11", children: value }),
2304
- /* @__PURE__ */ jsxRuntime.jsxs(
2305
- gui.Slider,
2306
- {
2307
- flex: 1,
2308
- min,
2309
- max,
2310
- step,
2311
- value: [value],
2312
- onValueChange: (v) => onChange(v[0] ?? min),
2313
- disabled,
2314
- children: [
2315
- /* @__PURE__ */ jsxRuntime.jsx(gui.Slider.Track, { children: /* @__PURE__ */ jsxRuntime.jsx(gui.Slider.TrackActive, {}) }),
2316
- /* @__PURE__ */ jsxRuntime.jsx(gui.Slider.Thumb, { index: 0, circular: true })
2317
- ]
2318
- }
2319
- )
2320
- ] });
2321
- }
2322
-
2323
- // src/product/color.ts
2324
- var asColor = (hex) => hex;
2325
1885
  function ProductIcon({
2326
1886
  icon: Icon,
2327
1887
  color,
@@ -2340,7 +1900,7 @@ function ProductIcon({
2340
1900
  justify: "center",
2341
1901
  rounded: radius,
2342
1902
  style: { backgroundColor: color },
2343
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: glyph, color: asColor("#ffffff") })
1903
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: glyph, color: chunkVGGGGXWS_cjs.asColor("#ffffff") })
2344
1904
  }
2345
1905
  );
2346
1906
  }
@@ -2525,169 +2085,6 @@ function SelectMenu({
2525
2085
  }
2526
2086
  );
2527
2087
  }
2528
- var LG = 1024;
2529
- var lockCount = 0;
2530
- var savedOverflow = "";
2531
- function lockScroll() {
2532
- if (typeof document === "undefined") return;
2533
- if (lockCount === 0) {
2534
- savedOverflow = document.body.style.overflow;
2535
- document.body.style.overflow = "hidden";
2536
- }
2537
- lockCount++;
2538
- }
2539
- function unlockScroll() {
2540
- if (typeof document === "undefined") return;
2541
- lockCount = Math.max(0, lockCount - 1);
2542
- if (lockCount === 0) document.body.style.overflow = savedOverflow;
2543
- }
2544
- function SlideOver({
2545
- open,
2546
- onClose,
2547
- side = "right",
2548
- size = 420,
2549
- title,
2550
- icon: Icon,
2551
- iconColor,
2552
- headerRight,
2553
- ariaLabel,
2554
- zIndex = 1e3,
2555
- children
2556
- }) {
2557
- const panelRef = react.useRef(null);
2558
- const openerRef = react.useRef(null);
2559
- react.useEffect(() => {
2560
- if (!open) return;
2561
- openerRef.current = typeof document !== "undefined" ? document.activeElement : null;
2562
- lockScroll();
2563
- const t = window.setTimeout(() => {
2564
- const el = panelRef.current;
2565
- if (el && typeof el.focus === "function") el.focus();
2566
- }, 0);
2567
- return () => {
2568
- window.clearTimeout(t);
2569
- unlockScroll();
2570
- const opener = openerRef.current;
2571
- if (opener && opener instanceof HTMLElement && typeof opener.focus === "function") opener.focus();
2572
- };
2573
- }, [open]);
2574
- react.useEffect(() => {
2575
- if (!open) return;
2576
- const onKey = (e) => {
2577
- if (e.key === "Escape") {
2578
- e.stopPropagation();
2579
- onClose();
2580
- }
2581
- };
2582
- window.addEventListener("keydown", onKey);
2583
- return () => window.removeEventListener("keydown", onKey);
2584
- }, [open, onClose]);
2585
- const offscreen = side === "right" ? "translateX(100%)" : "translateX(-100%)";
2586
- const edge = side === "right" ? { r: 0 } : { l: 0 };
2587
- return /* @__PURE__ */ jsxRuntime.jsxs(
2588
- gui.YStack,
2589
- {
2590
- overflow: "hidden",
2591
- pointerEvents: open ? "auto" : "none",
2592
- "aria-hidden": !open,
2593
- style: { position: "fixed", inset: 0, zIndex },
2594
- children: [
2595
- /* @__PURE__ */ jsxRuntime.jsx(
2596
- gui.YStack,
2597
- {
2598
- position: "absolute",
2599
- t: 0,
2600
- l: 0,
2601
- r: 0,
2602
- b: 0,
2603
- bg: "rgba(0,0,0,0.55)",
2604
- className: "hz-fade",
2605
- style: { opacity: open ? 1 : 0 },
2606
- onPress: onClose
2607
- }
2608
- ),
2609
- /* @__PURE__ */ jsxRuntime.jsx(
2610
- gui.YStack,
2611
- {
2612
- ref: panelRef,
2613
- tabIndex: -1,
2614
- role: "dialog",
2615
- "aria-modal": open ? true : void 0,
2616
- "aria-label": typeof title === "string" ? title : ariaLabel,
2617
- position: "absolute",
2618
- t: 0,
2619
- b: 0,
2620
- ...edge,
2621
- width: "100%",
2622
- $lg: { width: size, maxW: "100vw" },
2623
- bg: "$color1",
2624
- borderLeftWidth: side === "right" ? 1 : 0,
2625
- borderRightWidth: side === "left" ? 1 : 0,
2626
- borderColor: "$borderColor",
2627
- className: "hz-slide hz-elevation-4",
2628
- style: {
2629
- transform: open ? "translateX(0)" : offscreen,
2630
- height: "100dvh",
2631
- paddingTop: "env(safe-area-inset-top)",
2632
- paddingBottom: "env(safe-area-inset-bottom)"
2633
- },
2634
- children: title !== void 0 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
2635
- /* @__PURE__ */ jsxRuntime.jsxs(
2636
- gui.XStack,
2637
- {
2638
- items: "center",
2639
- gap: "$2.5",
2640
- px: "$4",
2641
- height: 56,
2642
- borderBottomWidth: 1,
2643
- borderColor: "$borderColor",
2644
- children: [
2645
- Icon ? /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 18, color: iconColor ? asColor(iconColor) : void 0 }) : null,
2646
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { flex: 1, fontSize: "$5", fontWeight: "700", color: "$color12", numberOfLines: 1, children: title }),
2647
- headerRight,
2648
- /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { chromeless: true, width: 44, height: 44, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.X, { size: 18 }), onPress: onClose, "aria-label": "Close" })
2649
- ]
2650
- }
2651
- ),
2652
- /* @__PURE__ */ jsxRuntime.jsx(gui.ScrollView, { flex: 1, children: /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { flex: 1, p: "$4", gap: "$3", children }) })
2653
- ] }) : (
2654
- // Bare mode — the caller owns the full panel layout (e.g. the nav drawer
2655
- // renders its own header + scroll + footer).
2656
- children
2657
- )
2658
- }
2659
- )
2660
- ]
2661
- }
2662
- );
2663
- }
2664
- var toneOf = (status) => {
2665
- const s = status.toLowerCase();
2666
- if (s === "green") return "green";
2667
- if (s === "yellow") return "yellow";
2668
- if (s === "red") return "red";
2669
- if (["ready", "active", "running", "available", "ok", "live", "succeeded", "connected", "synced", "imported"].includes(s)) return "green";
2670
- if (["creating", "provisioning", "pending", "updating", "attaching", "building", "deploying", "queued", "importing"].includes(s))
2671
- return "yellow";
2672
- if (["error", "failed", "degraded", "down", "canceled", "conflict"].includes(s)) return "red";
2673
- return "neutral";
2674
- };
2675
- var TONE_BG = {
2676
- green: "$color5",
2677
- yellow: "$color4",
2678
- red: "$color4",
2679
- neutral: "$color3"
2680
- };
2681
- var TONE_FG = {
2682
- green: "$color12",
2683
- yellow: "$color12",
2684
- red: "$color12",
2685
- neutral: "$color11"
2686
- };
2687
- function StatusTag({ status }) {
2688
- const tone2 = toneOf(status ?? "");
2689
- return /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", px: "$2", py: "$1", rounded: "$2", bg: TONE_BG[tone2], color: TONE_FG[tone2], children: status || "unknown" });
2690
- }
2691
2088
  var ToastContext = react.createContext(null);
2692
2089
  var ACCENT3 = {
2693
2090
  success: "$green10",
@@ -2784,323 +2181,6 @@ function useToast() {
2784
2181
  if (!ctx) throw new Error("useToast must be used within <ToastProvider>");
2785
2182
  return ctx;
2786
2183
  }
2787
- var META = {
2788
- x: { label: "X", bg: "#0f0f12", fg: "#e6e6ea", mark: "\u{1D54F}" },
2789
- facebook: { label: "Facebook", bg: "#1877f2", fg: "#ffffff", mark: "f" },
2790
- instagram: { label: "Instagram", bg: "#e1306c", fg: "#ffffff", mark: "IG" },
2791
- linkedin: { label: "LinkedIn", bg: "#0a66c2", fg: "#ffffff", mark: "in" },
2792
- tiktok: { label: "TikTok", bg: "#111114", fg: "#25f4ee", mark: "TT" },
2793
- youtube: { label: "YouTube", bg: "#ff0000", fg: "#ffffff", mark: "\u25B6" },
2794
- threads: { label: "Threads", bg: "#111114", fg: "#e6e6ea", mark: "@" }
2795
- };
2796
- function ChannelBadge({
2797
- channel,
2798
- showLabel = false,
2799
- size = 22
2800
- }) {
2801
- const m = META[channel] ?? META.x;
2802
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", children: [
2803
- /* @__PURE__ */ jsxRuntime.jsx(
2804
- gui.YStack,
2805
- {
2806
- width: size,
2807
- height: size,
2808
- items: "center",
2809
- justify: "center",
2810
- rounded: "$2",
2811
- bg: m.bg,
2812
- children: /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", fontWeight: "800", color: m.fg, children: m.mark })
2813
- }
2814
- ),
2815
- showLabel ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color12", children: m.label }) : null
2816
- ] });
2817
- }
2818
- var money = (cents) => `$${Math.round((cents || 0) / 100).toLocaleString()}`;
2819
- function CampaignCard({ campaign }) {
2820
- const pct = campaign.budget > 0 ? Math.min(100, campaign.spend / campaign.budget * 100) : 0;
2821
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.Card, { p: "$4", gap: "$3", borderWidth: 1, borderColor: "$borderColor", width: "100%", children: [
2822
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "flex-start", justify: "space-between", gap: "$2", children: [
2823
- /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1", children: [
2824
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$4", fontWeight: "700", children: campaign.name }),
2825
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: campaign.channel })
2826
- ] }),
2827
- /* @__PURE__ */ jsxRuntime.jsx(StatusTag, { status: campaign.status })
2828
- ] }),
2829
- campaign.objective ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color11", children: campaign.objective }) : null,
2830
- /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1.5", children: [
2831
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { justify: "space-between", children: [
2832
- /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$1", color: "$color11", children: [
2833
- money(campaign.spend),
2834
- " spent"
2835
- ] }),
2836
- /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$1", color: "$color11", children: [
2837
- money(campaign.budget),
2838
- " budget"
2839
- ] })
2840
- ] }),
2841
- /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { height: 6, rounded: "$2", bg: "$color3", overflow: "hidden", children: /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { height: 6, rounded: "$2", bg: "$color9", width: `${pct}%` }) })
2842
- ] })
2843
- ] });
2844
- }
2845
-
2846
- // src/product/social/format.ts
2847
- function formatPostTime(unix) {
2848
- if (!unix) return "\u2014";
2849
- return new Date(unix * 1e3).toLocaleString(void 0, {
2850
- month: "short",
2851
- day: "numeric",
2852
- hour: "2-digit",
2853
- minute: "2-digit"
2854
- });
2855
- }
2856
- function postDayBucket(unix) {
2857
- const d = new Date(unix * 1e3);
2858
- const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;
2859
- const label = d.toLocaleDateString(void 0, { weekday: "short", month: "short", day: "numeric" });
2860
- return { key, label };
2861
- }
2862
- function postPreview(s) {
2863
- const t = s.trim();
2864
- return t.length > 72 ? `${t.slice(0, 72)}\u2026` : t || "\u2014";
2865
- }
2866
- function parsePostTime(dt) {
2867
- const ms = Date.parse(dt.trim());
2868
- return Number.isFinite(ms) && ms > 0 ? Math.floor(ms / 1e3) : 0;
2869
- }
2870
- function PostCard({
2871
- post,
2872
- onEdit,
2873
- onDelete
2874
- }) {
2875
- const mediaCount = post.media?.length ?? 0;
2876
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.Card, { p: "$3", gap: "$2.5", borderWidth: 1, borderColor: "$borderColor", width: "100%", children: [
2877
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", justify: "space-between", gap: "$2", children: [
2878
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", children: [
2879
- /* @__PURE__ */ jsxRuntime.jsx(ChannelBadge, { channel: post.channel }),
2880
- /* @__PURE__ */ jsxRuntime.jsx(StatusTag, { status: post.status })
2881
- ] }),
2882
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$1", children: [
2883
- onEdit ? /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", chromeless: true, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Pencil, { size: 15 }), onPress: () => onEdit(post) }) : null,
2884
- onDelete ? /* @__PURE__ */ jsxRuntime.jsx(gui.Button, { size: "$2", chromeless: true, icon: /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.Trash2, { size: 15 }), onPress: () => onDelete(post) }) : null
2885
- ] })
2886
- ] }),
2887
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", color: "$color12", children: post.content }),
2888
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", justify: "space-between", gap: "$2", children: [
2889
- post.scheduleAt ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color11", children: formatPostTime(post.scheduleAt) }) : /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, {}),
2890
- mediaCount ? /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$1", color: "$color10", children: [
2891
- mediaCount,
2892
- " media"
2893
- ] }) : null
2894
- ] })
2895
- ] });
2896
- }
2897
- function PostAgenda({ posts, onOpen }) {
2898
- const days = react.useMemo(() => {
2899
- const timed = posts.filter((p) => (p.scheduleAt ?? 0) > 0).sort((a, b) => (a.scheduleAt ?? 0) - (b.scheduleAt ?? 0));
2900
- const groups = [];
2901
- const index = /* @__PURE__ */ new Map();
2902
- for (const p of timed) {
2903
- const { key, label } = postDayBucket(p.scheduleAt ?? 0);
2904
- let i = index.get(key);
2905
- if (i === void 0) {
2906
- i = groups.length;
2907
- index.set(key, i);
2908
- groups.push({ label, items: [] });
2909
- }
2910
- groups[i].items.push(p);
2911
- }
2912
- return groups;
2913
- }, [posts]);
2914
- if (days.length === 0) {
2915
- return /* @__PURE__ */ jsxRuntime.jsx(
2916
- EmptyState,
2917
- {
2918
- icon: lucideIcons2.Calendar,
2919
- title: "Nothing on the calendar",
2920
- description: "Scheduled and timed posts appear here, grouped by day. Compose a post and pick Schedule to plan ahead."
2921
- }
2922
- );
2923
- }
2924
- return /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { gap: "$4", children: days.map((d) => /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$2", children: [
2925
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", fontWeight: "500", color: "$color11", children: d.label }),
2926
- d.items.map((p) => /* @__PURE__ */ jsxRuntime.jsxs(
2927
- gui.XStack,
2928
- {
2929
- items: "center",
2930
- justify: "space-between",
2931
- gap: "$3",
2932
- borderWidth: 1,
2933
- borderColor: "$borderColor",
2934
- rounded: "$4",
2935
- px: "$4",
2936
- py: "$3",
2937
- cursor: "pointer",
2938
- hoverStyle: { bg: "$color2" },
2939
- onPress: () => onOpen(p),
2940
- children: [
2941
- /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$1", flex: 1, children: [
2942
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$3", children: postPreview(p.content) }),
2943
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { gap: "$2", items: "center", children: [
2944
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color10", children: p.channel }),
2945
- /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$1", color: "$color10", children: [
2946
- "\xB7 ",
2947
- formatPostTime(p.scheduleAt ?? 0)
2948
- ] })
2949
- ] })
2950
- ] }),
2951
- /* @__PURE__ */ jsxRuntime.jsx(StatusTag, { status: p.status })
2952
- ]
2953
- },
2954
- p.id
2955
- ))
2956
- ] }, d.label)) });
2957
- }
2958
- var COMPOSE_MODES = ["draft", "schedule", "now"];
2959
- var COMPOSE_LABEL = {
2960
- draft: "Save draft",
2961
- schedule: "Schedule",
2962
- now: "Publish now"
2963
- };
2964
- function PostComposer({
2965
- channels,
2966
- providers,
2967
- onSubmit
2968
- }) {
2969
- const [content, setContent] = react.useState("");
2970
- const [channel, setChannel] = react.useState(channels[0] ?? "x");
2971
- const [mode, setMode] = react.useState("draft");
2972
- const [scheduleAt, setScheduleAt] = react.useState("");
2973
- const [saving, setSaving] = react.useState(false);
2974
- const [error, setError] = react.useState(null);
2975
- const cap = providers.find((p) => p.provider === channel);
2976
- const unconfigured = (mode === "now" || mode === "schedule") && !!cap && !cap.credentialsConfigured;
2977
- const submit = async () => {
2978
- if (!content.trim()) {
2979
- setError("Content is required.");
2980
- return;
2981
- }
2982
- let status = "draft";
2983
- let at = 0;
2984
- if (mode === "schedule") {
2985
- at = parsePostTime(scheduleAt);
2986
- if (at <= Math.floor(Date.now() / 1e3)) {
2987
- setError("Pick a future date and time to schedule.");
2988
- return;
2989
- }
2990
- status = "scheduled";
2991
- } else if (mode === "now") {
2992
- status = "scheduled";
2993
- }
2994
- setSaving(true);
2995
- setError(null);
2996
- const message = await onSubmit({ content: content.trim(), channel, status, scheduleAt: at }, mode);
2997
- if (message) {
2998
- setError(message);
2999
- setSaving(false);
3000
- }
3001
- };
3002
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$3", p: "$4", children: [
3003
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Content", children: /* @__PURE__ */ jsxRuntime.jsx(FieldTextArea, { value: content, onChange: setContent, disabled: saving }) }),
3004
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Channel", children: /* @__PURE__ */ jsxRuntime.jsx(FieldSelect, { value: channel, options: channels, onChange: setChannel, disabled: saving }) }),
3005
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "When", children: /* @__PURE__ */ jsxRuntime.jsx(
3006
- FieldSelect,
3007
- {
3008
- value: mode,
3009
- options: [...COMPOSE_MODES],
3010
- onChange: (v) => setMode(v),
3011
- disabled: saving
3012
- }
3013
- ) }),
3014
- mode === "schedule" ? /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Schedule at", children: /* @__PURE__ */ jsxRuntime.jsx(
3015
- FieldText,
3016
- {
3017
- value: scheduleAt,
3018
- onChange: setScheduleAt,
3019
- placeholder: "2026-07-15 09:00",
3020
- disabled: saving
3021
- }
3022
- ) }) : null,
3023
- unconfigured ? /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "flex-start", gap: "$2", children: [
3024
- /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.AlertTriangle, { size: 14, color: "var(--yellow10)" }),
3025
- /* @__PURE__ */ jsxRuntime.jsxs(gui.Text, { fontSize: "$1", color: "$color10", children: [
3026
- channel,
3027
- " isn\u2019t configured to publish yet \u2014 needs ",
3028
- cap?.missingCredentials.join(", "),
3029
- ". The post is saved and marked failed on publish until credentials are supplied."
3030
- ] })
3031
- ] }) : null,
3032
- error ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$red10", children: error }) : null,
3033
- /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onPress: submit, disabled: saving, children: saving ? "Working\u2026" : COMPOSE_LABEL[mode] })
3034
- ] });
3035
- }
3036
- function ProviderReadinessList({ providers }) {
3037
- return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$2", children: [
3038
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$color10", children: "Network publish-readiness" }),
3039
- providers.map((p) => /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", justify: "space-between", gap: "$3", py: "$1", children: [
3040
- /* @__PURE__ */ jsxRuntime.jsxs(gui.XStack, { items: "center", gap: "$2", children: [
3041
- p.credentialsConfigured ? /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.CheckCircle2, { size: 14, color: "var(--green10)" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideIcons2.AlertTriangle, { size: 14, color: "var(--yellow10)" }),
3042
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", children: p.provider })
3043
- ] }),
3044
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color10", children: p.credentialsConfigured ? "Ready" : `needs ${p.missingCredentials.join(", ")}` })
3045
- ] }, p.provider))
3046
- ] });
3047
- }
3048
- function SocialSummaryBar({ summary }) {
3049
- const cells = [
3050
- { label: "Posts", value: summary.posts },
3051
- { label: "Scheduled", value: summary.scheduled },
3052
- { label: "Published", value: summary.published },
3053
- { label: "Accounts", value: summary.accounts }
3054
- ];
3055
- return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { gap: "$3", flexWrap: "wrap", children: cells.map((c) => /* @__PURE__ */ jsxRuntime.jsxs(
3056
- gui.YStack,
3057
- {
3058
- gap: "$1",
3059
- borderWidth: 1,
3060
- borderColor: "$borderColor",
3061
- rounded: "$4",
3062
- px: "$4",
3063
- py: "$3",
3064
- minW: 140,
3065
- children: [
3066
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$1", color: "$color10", children: c.label }),
3067
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$6", fontWeight: "500", className: "hz-tnum", children: c.value })
3068
- ]
3069
- },
3070
- c.label
3071
- )) });
3072
- }
3073
- var OPTIONS = [
3074
- { id: "list", label: "List", icon: lucideIcons2.List },
3075
- { id: "calendar", label: "Calendar", icon: lucideIcons2.Calendar }
3076
- ];
3077
- function ViewToggle({
3078
- view,
3079
- onChange
3080
- }) {
3081
- return /* @__PURE__ */ jsxRuntime.jsx(gui.XStack, { borderWidth: 1, borderColor: "$borderColor", rounded: "$4", overflow: "hidden", children: OPTIONS.map((o) => {
3082
- const Icon = o.icon;
3083
- const active = view === o.id;
3084
- return /* @__PURE__ */ jsxRuntime.jsxs(
3085
- gui.XStack,
3086
- {
3087
- items: "center",
3088
- gap: "$2",
3089
- px: "$3",
3090
- py: "$2",
3091
- cursor: "pointer",
3092
- bg: active ? "$color4" : "transparent",
3093
- hoverStyle: { bg: active ? "$color4" : "$color2" },
3094
- onPress: () => onChange(o.id),
3095
- children: [
3096
- /* @__PURE__ */ jsxRuntime.jsx(Icon, { size: 14 }),
3097
- /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", fontWeight: active ? "500" : "400", children: o.label })
3098
- ]
3099
- },
3100
- o.id
3101
- );
3102
- }) });
3103
- }
3104
2184
 
3105
2185
  Object.defineProperty(exports, "AgnosticThemeToggle", {
3106
2186
  enumerable: true,
@@ -3114,6 +2194,206 @@ Object.defineProperty(exports, "ThemeToggleNext", {
3114
2194
  enumerable: true,
3115
2195
  get: function () { return chunkYBXVUV7P_cjs.ThemeToggleNext; }
3116
2196
  });
2197
+ Object.defineProperty(exports, "ACCOUNT_STATUSES", {
2198
+ enumerable: true,
2199
+ get: function () { return chunkVGGGGXWS_cjs.ACCOUNT_STATUSES; }
2200
+ });
2201
+ Object.defineProperty(exports, "BackendStateCard", {
2202
+ enumerable: true,
2203
+ get: function () { return chunkVGGGGXWS_cjs.BackendStateCard; }
2204
+ });
2205
+ Object.defineProperty(exports, "COMPOSE_MODES", {
2206
+ enumerable: true,
2207
+ get: function () { return chunkVGGGGXWS_cjs.COMPOSE_MODES; }
2208
+ });
2209
+ Object.defineProperty(exports, "CampaignCard", {
2210
+ enumerable: true,
2211
+ get: function () { return chunkVGGGGXWS_cjs.CampaignCard; }
2212
+ });
2213
+ Object.defineProperty(exports, "ChannelBadge", {
2214
+ enumerable: true,
2215
+ get: function () { return chunkVGGGGXWS_cjs.ChannelBadge; }
2216
+ });
2217
+ Object.defineProperty(exports, "DataTable", {
2218
+ enumerable: true,
2219
+ get: function () { return chunkVGGGGXWS_cjs.DataTable; }
2220
+ });
2221
+ Object.defineProperty(exports, "EmptyState", {
2222
+ enumerable: true,
2223
+ get: function () { return chunkVGGGGXWS_cjs.EmptyState; }
2224
+ });
2225
+ Object.defineProperty(exports, "FieldRow", {
2226
+ enumerable: true,
2227
+ get: function () { return chunkVGGGGXWS_cjs.FieldRow; }
2228
+ });
2229
+ Object.defineProperty(exports, "FieldSelect", {
2230
+ enumerable: true,
2231
+ get: function () { return chunkVGGGGXWS_cjs.FieldSelect; }
2232
+ });
2233
+ Object.defineProperty(exports, "FieldSlider", {
2234
+ enumerable: true,
2235
+ get: function () { return chunkVGGGGXWS_cjs.FieldSlider; }
2236
+ });
2237
+ Object.defineProperty(exports, "FieldSwitch", {
2238
+ enumerable: true,
2239
+ get: function () { return chunkVGGGGXWS_cjs.FieldSwitch; }
2240
+ });
2241
+ Object.defineProperty(exports, "FieldText", {
2242
+ enumerable: true,
2243
+ get: function () { return chunkVGGGGXWS_cjs.FieldText; }
2244
+ });
2245
+ Object.defineProperty(exports, "FieldTextArea", {
2246
+ enumerable: true,
2247
+ get: function () { return chunkVGGGGXWS_cjs.FieldTextArea; }
2248
+ });
2249
+ Object.defineProperty(exports, "HostProvider", {
2250
+ enumerable: true,
2251
+ get: function () { return chunkVGGGGXWS_cjs.HostProvider; }
2252
+ });
2253
+ Object.defineProperty(exports, "POST_STATUSES", {
2254
+ enumerable: true,
2255
+ get: function () { return chunkVGGGGXWS_cjs.POST_STATUSES; }
2256
+ });
2257
+ Object.defineProperty(exports, "PROVIDERS", {
2258
+ enumerable: true,
2259
+ get: function () { return chunkVGGGGXWS_cjs.PROVIDERS; }
2260
+ });
2261
+ Object.defineProperty(exports, "PageHeader", {
2262
+ enumerable: true,
2263
+ get: function () { return chunkVGGGGXWS_cjs.PageHeader; }
2264
+ });
2265
+ Object.defineProperty(exports, "PostAgenda", {
2266
+ enumerable: true,
2267
+ get: function () { return chunkVGGGGXWS_cjs.PostAgenda; }
2268
+ });
2269
+ Object.defineProperty(exports, "PostCard", {
2270
+ enumerable: true,
2271
+ get: function () { return chunkVGGGGXWS_cjs.PostCard; }
2272
+ });
2273
+ Object.defineProperty(exports, "PostComposer", {
2274
+ enumerable: true,
2275
+ get: function () { return chunkVGGGGXWS_cjs.PostComposer; }
2276
+ });
2277
+ Object.defineProperty(exports, "PrimaryButton", {
2278
+ enumerable: true,
2279
+ get: function () { return chunkVGGGGXWS_cjs.PrimaryButton; }
2280
+ });
2281
+ Object.defineProperty(exports, "ProviderReadinessList", {
2282
+ enumerable: true,
2283
+ get: function () { return chunkVGGGGXWS_cjs.ProviderReadinessList; }
2284
+ });
2285
+ Object.defineProperty(exports, "SLIDEOVER_LG", {
2286
+ enumerable: true,
2287
+ get: function () { return chunkVGGGGXWS_cjs.LG; }
2288
+ });
2289
+ Object.defineProperty(exports, "SlideOver", {
2290
+ enumerable: true,
2291
+ get: function () { return chunkVGGGGXWS_cjs.SlideOver; }
2292
+ });
2293
+ Object.defineProperty(exports, "SocialResource", {
2294
+ enumerable: true,
2295
+ get: function () { return chunkVGGGGXWS_cjs.SocialResource; }
2296
+ });
2297
+ Object.defineProperty(exports, "SocialSummaryBar", {
2298
+ enumerable: true,
2299
+ get: function () { return chunkVGGGGXWS_cjs.SocialSummaryBar; }
2300
+ });
2301
+ Object.defineProperty(exports, "StatusTag", {
2302
+ enumerable: true,
2303
+ get: function () { return chunkVGGGGXWS_cjs.StatusTag; }
2304
+ });
2305
+ Object.defineProperty(exports, "ViewToggle", {
2306
+ enumerable: true,
2307
+ get: function () { return chunkVGGGGXWS_cjs.ViewToggle; }
2308
+ });
2309
+ Object.defineProperty(exports, "accentFor", {
2310
+ enumerable: true,
2311
+ get: function () { return chunkVGGGGXWS_cjs.accentFor; }
2312
+ });
2313
+ Object.defineProperty(exports, "asColor", {
2314
+ enumerable: true,
2315
+ get: function () { return chunkVGGGGXWS_cjs.asColor; }
2316
+ });
2317
+ Object.defineProperty(exports, "classifyBackend", {
2318
+ enumerable: true,
2319
+ get: function () { return chunkVGGGGXWS_cjs.classifyBackend; }
2320
+ });
2321
+ Object.defineProperty(exports, "classifyRead", {
2322
+ enumerable: true,
2323
+ get: function () { return chunkVGGGGXWS_cjs.classifyRead; }
2324
+ });
2325
+ Object.defineProperty(exports, "contrastText", {
2326
+ enumerable: true,
2327
+ get: function () { return chunkVGGGGXWS_cjs.contrastText; }
2328
+ });
2329
+ Object.defineProperty(exports, "createSocialApi", {
2330
+ enumerable: true,
2331
+ get: function () { return chunkVGGGGXWS_cjs.createSocialApi; }
2332
+ });
2333
+ Object.defineProperty(exports, "formatPostTime", {
2334
+ enumerable: true,
2335
+ get: function () { return chunkVGGGGXWS_cjs.formatPostTime; }
2336
+ });
2337
+ Object.defineProperty(exports, "isHexColor", {
2338
+ enumerable: true,
2339
+ get: function () { return chunkVGGGGXWS_cjs.isHexColor; }
2340
+ });
2341
+ Object.defineProperty(exports, "normalizeAccount", {
2342
+ enumerable: true,
2343
+ get: function () { return chunkVGGGGXWS_cjs.normalizeAccount; }
2344
+ });
2345
+ Object.defineProperty(exports, "normalizeAccounts", {
2346
+ enumerable: true,
2347
+ get: function () { return chunkVGGGGXWS_cjs.normalizeAccounts; }
2348
+ });
2349
+ Object.defineProperty(exports, "normalizePost", {
2350
+ enumerable: true,
2351
+ get: function () { return chunkVGGGGXWS_cjs.normalizePost; }
2352
+ });
2353
+ Object.defineProperty(exports, "normalizePosts", {
2354
+ enumerable: true,
2355
+ get: function () { return chunkVGGGGXWS_cjs.normalizePosts; }
2356
+ });
2357
+ Object.defineProperty(exports, "normalizeProviderCapability", {
2358
+ enumerable: true,
2359
+ get: function () { return chunkVGGGGXWS_cjs.normalizeProviderCapability; }
2360
+ });
2361
+ Object.defineProperty(exports, "normalizeProviders", {
2362
+ enumerable: true,
2363
+ get: function () { return chunkVGGGGXWS_cjs.normalizeProviders; }
2364
+ });
2365
+ Object.defineProperty(exports, "normalizeSummary", {
2366
+ enumerable: true,
2367
+ get: function () { return chunkVGGGGXWS_cjs.normalizeSummary; }
2368
+ });
2369
+ Object.defineProperty(exports, "parsePostTime", {
2370
+ enumerable: true,
2371
+ get: function () { return chunkVGGGGXWS_cjs.parsePostTime; }
2372
+ });
2373
+ Object.defineProperty(exports, "postDayBucket", {
2374
+ enumerable: true,
2375
+ get: function () { return chunkVGGGGXWS_cjs.postDayBucket; }
2376
+ });
2377
+ Object.defineProperty(exports, "postPreview", {
2378
+ enumerable: true,
2379
+ get: function () { return chunkVGGGGXWS_cjs.postPreview; }
2380
+ });
2381
+ Object.defineProperty(exports, "resolveAccent", {
2382
+ enumerable: true,
2383
+ get: function () { return chunkVGGGGXWS_cjs.resolveAccent; }
2384
+ });
2385
+ Object.defineProperty(exports, "setOrgAccent", {
2386
+ enumerable: true,
2387
+ get: function () { return chunkVGGGGXWS_cjs.setOrgAccent; }
2388
+ });
2389
+ Object.defineProperty(exports, "useAccent", {
2390
+ enumerable: true,
2391
+ get: function () { return chunkVGGGGXWS_cjs.useAccent; }
2392
+ });
2393
+ Object.defineProperty(exports, "useHost", {
2394
+ enumerable: true,
2395
+ get: function () { return chunkVGGGGXWS_cjs.useHost; }
2396
+ });
3117
2397
  Object.defineProperty(exports, "CustomModelMark", {
3118
2398
  enumerable: true,
3119
2399
  get: function () { return lucideIcons2.Boxes; }
@@ -3121,38 +2401,25 @@ Object.defineProperty(exports, "CustomModelMark", {
3121
2401
  exports.AnimatedLogo = AnimatedLogo;
3122
2402
  exports.AppHeader = AppHeader;
3123
2403
  exports.BRANDS = BRANDS;
3124
- exports.BackendStateCard = BackendStateCard;
3125
2404
  exports.BarChart = BarChart;
3126
2405
  exports.BarRows = BarRows;
3127
2406
  exports.BrandMark = BrandMark;
3128
2407
  exports.CHART_OTHER = CHART_OTHER;
3129
2408
  exports.CHART_PALETTE = CHART_PALETTE;
3130
- exports.COMPOSE_MODES = COMPOSE_MODES;
3131
- exports.CampaignCard = CampaignCard;
3132
- exports.ChannelBadge = ChannelBadge;
3133
2409
  exports.ComboBox = ComboBox;
3134
2410
  exports.CommerceResource = CommerceResource;
3135
2411
  exports.ConfirmDelete = ConfirmDelete;
3136
2412
  exports.ContextMenu = ContextMenu;
3137
- exports.DataTable = DataTable;
3138
2413
  exports.Donut = Donut;
3139
2414
  exports.DonutRing = Donut2;
3140
2415
  exports.DropdownMenu = DropdownMenu;
3141
- exports.EmptyState = EmptyState;
3142
2416
  exports.FadeIn = FadeIn;
3143
- exports.FieldRow = FieldRow;
3144
- exports.FieldSelect = FieldSelect;
3145
- exports.FieldSlider = FieldSlider;
3146
- exports.FieldSwitch = FieldSwitch;
3147
- exports.FieldText = FieldText;
3148
- exports.FieldTextArea = FieldTextArea;
3149
2417
  exports.FloatingMenu = FloatingMenu;
3150
2418
  exports.GenericLogo = GenericLogo;
3151
2419
  exports.HANZO = HANZO;
3152
2420
  exports.HANZO_MARK_CONTENT = HANZO_MARK_CONTENT;
3153
2421
  exports.HanzoMark = HanzoMark;
3154
2422
  exports.HintButton = HintButton;
3155
- exports.HostProvider = HostProvider;
3156
2423
  exports.LUX = LUX;
3157
2424
  exports.LegendDot = LegendDot;
3158
2425
  exports.LineChart = LineChart;
@@ -3166,60 +2433,35 @@ exports.MiniBars = MiniBars;
3166
2433
  exports.OrgMark = OrgMark;
3167
2434
  exports.OrgSwitcher = OrgSwitcher;
3168
2435
  exports.PARS = PARS;
3169
- exports.PageHeader = PageHeader;
3170
2436
  exports.Panel = Panel;
3171
2437
  exports.PortalTheme = PortalTheme;
3172
- exports.PostAgenda = PostAgenda;
3173
- exports.PostCard = PostCard;
3174
- exports.PostComposer = PostComposer;
3175
- exports.PrimaryButton = PrimaryButton;
3176
2438
  exports.ProductIcon = ProductIcon;
3177
2439
  exports.ProviderLogo = ProviderLogo;
3178
- exports.ProviderReadinessList = ProviderReadinessList;
3179
2440
  exports.Reorder = Reorder;
3180
2441
  exports.SERIES = SERIES;
3181
- exports.SLIDEOVER_LG = LG;
3182
2442
  exports.SURFACES = SURFACES;
3183
2443
  exports.SearchInput = SearchInput;
3184
2444
  exports.Segmented = Segmented;
3185
2445
  exports.SelectMenu = SelectMenu;
3186
2446
  exports.SiteFooter = SiteFooter;
3187
2447
  exports.SiteNav = SiteNav;
3188
- exports.SlideOver = SlideOver;
3189
- exports.SocialSummaryBar = SocialSummaryBar;
3190
2448
  exports.Sparkline = Sparkline;
3191
- exports.StatusTag = StatusTag;
3192
2449
  exports.ToastProvider = ToastProvider;
3193
2450
  exports.UtilBar = UtilBar;
3194
- exports.ViewToggle = ViewToggle;
3195
2451
  exports.ZOO = ZOO;
3196
- exports.accentFor = accentFor;
3197
- exports.asColor = asColor;
3198
- exports.classifyBackend = classifyBackend;
3199
- exports.classifyRead = classifyRead;
3200
2452
  exports.colorForIndex = colorForIndex;
3201
- exports.contrastText = contrastText;
3202
2453
  exports.filterOptions = filterOptions;
3203
2454
  exports.filterOrgs = filterOrgs;
3204
- exports.formatPostTime = formatPostTime;
3205
- exports.isHexColor = isHexColor;
3206
2455
  exports.isKnownOption = isKnownOption;
3207
2456
  exports.monogram = monogram;
3208
2457
  exports.orgScope = orgScope;
3209
2458
  exports.otherSurfaces = otherSurfaces;
3210
- exports.parsePostTime = parsePostTime;
3211
- exports.postDayBucket = postDayBucket;
3212
- exports.postPreview = postPreview;
3213
2459
  exports.providerInitials = providerInitials;
3214
2460
  exports.renderMenuItems = renderMenuItems;
3215
- exports.resolveAccent = resolveAccent;
3216
2461
  exports.resolveBrand = resolveBrand;
3217
2462
  exports.rowShift = rowShift;
3218
- exports.setOrgAccent = setOrgAccent;
3219
2463
  exports.targetIndex = targetIndex;
3220
- exports.useAccent = useAccent;
3221
2464
  exports.useContainerWidth = useContainerWidth;
3222
- exports.useHost = useHost;
3223
2465
  exports.useToast = useToast;
3224
2466
  exports.utilColor = utilColor;
3225
2467
  //# sourceMappingURL=index.cjs.map