@hanzo/ui 8.0.14 → 8.0.15

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.
@@ -1,99 +1,12 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
+ var chunkMWBFAV3D_cjs = require('./chunk-MWBFAV3D.cjs');
4
5
  var react = require('react');
5
6
  var gui = require('@hanzo/gui');
6
7
  var lucideIcons2 = require('@hanzogui/lucide-icons-2');
7
8
  var jsxRuntime = require('react/jsx-runtime');
8
9
 
9
- // src/product/social/api.ts
10
- var enc = encodeURIComponent;
11
- var str = (v) => typeof v === "string" ? v : v == null ? "" : String(v);
12
- var num = (v) => {
13
- if (typeof v === "number" && Number.isFinite(v)) return v;
14
- if (typeof v === "string" && v.trim() !== "" && Number.isFinite(Number(v))) return Number(v);
15
- return 0;
16
- };
17
- var strs = (v) => Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
18
- var asRecord = (v) => v && typeof v === "object" && !Array.isArray(v) ? v : {};
19
- var rows = (payload) => {
20
- if (Array.isArray(payload)) return payload.filter((x) => x && typeof x === "object");
21
- if (payload && typeof payload === "object") {
22
- for (const k of ["data", "items", "rows"]) {
23
- const v = payload[k];
24
- if (Array.isArray(v)) return v.filter((x) => x && typeof x === "object");
25
- }
26
- }
27
- return [];
28
- };
29
- var PROVIDERS = ["x", "facebook", "instagram", "linkedin", "tiktok", "youtube", "threads"];
30
- var ACCOUNT_STATUSES = ["connected", "disconnected", "error"];
31
- var POST_STATUSES = ["draft", "scheduled", "published", "failed"];
32
- function normalizeAccount(raw) {
33
- const r = asRecord(raw);
34
- return {
35
- id: str(r.id),
36
- provider: str(r.provider) || "x",
37
- handle: str(r.handle),
38
- status: str(r.status) || "connected",
39
- createdAt: num(r.createdAt),
40
- updatedAt: num(r.updatedAt)
41
- };
42
- }
43
- function normalizePost(raw) {
44
- const r = asRecord(raw);
45
- return {
46
- id: str(r.id),
47
- content: str(r.content),
48
- channel: str(r.channel) || "x",
49
- status: str(r.status) || "draft",
50
- scheduleAt: num(r.scheduleAt),
51
- media: strs(r.media),
52
- accountId: str(r.accountId) || void 0,
53
- externalId: str(r.externalId) || void 0,
54
- error: str(r.error) || void 0,
55
- createdAt: num(r.createdAt),
56
- updatedAt: num(r.updatedAt)
57
- };
58
- }
59
- function normalizeSummary(raw) {
60
- const r = asRecord(raw);
61
- return { posts: num(r.posts), scheduled: num(r.scheduled), published: num(r.published), accounts: num(r.accounts) };
62
- }
63
- function normalizeProviderCapability(raw) {
64
- const r = asRecord(raw);
65
- return {
66
- provider: str(r.provider),
67
- credentialsConfigured: Boolean(r.credentialsConfigured),
68
- missingCredentials: strs(r.missingCredentials)
69
- };
70
- }
71
- var normalizeAccounts = (p) => rows(p).map(normalizeAccount).filter((a) => a.id);
72
- var normalizePosts = (p) => rows(p).map(normalizePost).filter((x) => x.id);
73
- var normalizeProviders = (p) => rows(p).map(normalizeProviderCapability).filter((c) => c.provider);
74
- function createSocialApi(rest) {
75
- return {
76
- summary: () => rest.get("summary").then(normalizeSummary),
77
- /** Publish-readiness per network (+ the exact missing OAuth-app credentials). */
78
- providers: () => rest.get("providers").then(normalizeProviders),
79
- accounts: {
80
- list: (provider) => rest.get(`accounts${provider ? `?provider=${enc(provider)}` : ""}`).then(normalizeAccounts),
81
- get: (id) => rest.get(`accounts/${enc(id)}`).then(normalizeAccount),
82
- create: (body) => rest.post("accounts", body).then(normalizeAccount),
83
- update: (id, body) => rest.put(`accounts/${enc(id)}`, body).then(normalizeAccount),
84
- remove: (id) => rest.del(`accounts/${enc(id)}`)
85
- },
86
- posts: {
87
- list: (status) => rest.get(`posts${status ? `?status=${enc(status)}` : ""}`).then(normalizePosts),
88
- get: (id) => rest.get(`posts/${enc(id)}`).then(normalizePost),
89
- create: (body) => rest.post("posts", body).then(normalizePost),
90
- update: (id, body) => rest.put(`posts/${enc(id)}`, body).then(normalizePost),
91
- remove: (id) => rest.del(`posts/${enc(id)}`),
92
- /** Publish a post NOW to its channel's connected accounts. */
93
- publish: (id) => rest.post(`posts/${enc(id)}/publish`).then(normalizePost)
94
- }
95
- };
96
- }
97
10
  var HostCtx = react.createContext({});
98
11
  var HostProvider = ({ actions, children }) => /* @__PURE__ */ jsxRuntime.jsx(HostCtx.Provider, { value: actions, children });
99
12
  var useHost = () => react.useContext(HostCtx);
@@ -170,7 +83,7 @@ function SkeletonRows({ columns, count = 6 }) {
170
83
  }
171
84
  function DataTable({
172
85
  columns,
173
- rows: rows2,
86
+ rows,
174
87
  loading,
175
88
  empty = "Nothing here yet.",
176
89
  rowKey,
@@ -220,7 +133,7 @@ function DataTable({
220
133
  c.key
221
134
  );
222
135
  }) }),
223
- loading ? /* @__PURE__ */ jsxRuntime.jsx(SkeletonRows, { columns }) : rows2.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { children: rows2.map((row) => {
136
+ loading ? /* @__PURE__ */ jsxRuntime.jsx(SkeletonRows, { columns }) : rows.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(gui.YStack, { children: rows.map((row) => {
224
137
  const expanded = (isRowExpanded?.(row) ?? false) && !!renderExpanded;
225
138
  return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { children: [
226
139
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -268,7 +181,7 @@ function DataTable({
268
181
  ] }, rowKey(row));
269
182
  }) }) : null
270
183
  ] }) }),
271
- !loading && rows2.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
184
+ !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
272
185
  ] });
273
186
  }
274
187
  var FLEX_MIN_COL_W = 120;
@@ -426,9 +339,9 @@ function FieldTextArea({
426
339
  value,
427
340
  onChange,
428
341
  disabled,
429
- rows: rows2 = 6
342
+ rows = 6
430
343
  }) {
431
- return /* @__PURE__ */ jsxRuntime.jsx(gui.TextArea, { value, onChangeText: onChange, disabled, numberOfLines: rows2 });
344
+ return /* @__PURE__ */ jsxRuntime.jsx(gui.TextArea, { value, onChangeText: onChange, disabled, numberOfLines: rows });
432
345
  }
433
346
  function FieldSwitch({
434
347
  checked,
@@ -993,7 +906,7 @@ function ConnectAccount({
993
906
  return /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$4", p: "$4", children: [
994
907
  /* @__PURE__ */ jsxRuntime.jsx(ProviderReadinessList, { providers }),
995
908
  /* @__PURE__ */ jsxRuntime.jsxs(gui.YStack, { gap: "$3", children: [
996
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Network", children: /* @__PURE__ */ jsxRuntime.jsx(FieldSelect, { value: provider, options: [...PROVIDERS], onChange: setProvider, disabled: saving }) }),
909
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Network", children: /* @__PURE__ */ jsxRuntime.jsx(FieldSelect, { value: provider, options: [...chunkMWBFAV3D_cjs.PROVIDERS], onChange: setProvider, disabled: saving }) }),
997
910
  /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Handle", children: /* @__PURE__ */ jsxRuntime.jsx(FieldText, { value: handle, onChange: setHandle, placeholder: "@hanzo", disabled: saving }) }),
998
911
  error ? /* @__PURE__ */ jsxRuntime.jsx(gui.Text, { fontSize: "$2", color: "$red10", children: error }) : null,
999
912
  /* @__PURE__ */ jsxRuntime.jsx(PrimaryButton, { onPress: submit, disabled: saving, children: saving ? "Connecting\u2026" : "Connect account" })
@@ -1105,7 +1018,7 @@ function SocialResource({
1105
1018
  )
1106
1019
  ] })
1107
1020
  ] }),
1108
- /* @__PURE__ */ jsxRuntime.jsx(SlideOver, { open: composing, onClose: () => setComposing(false), title: "New post", icon: lucideIcons2.Send, ariaLabel: "New post", children: /* @__PURE__ */ jsxRuntime.jsx(PostComposer, { channels: [...PROVIDERS], providers, onSubmit: submitDraft }) }),
1021
+ /* @__PURE__ */ jsxRuntime.jsx(SlideOver, { open: composing, onClose: () => setComposing(false), title: "New post", icon: lucideIcons2.Send, ariaLabel: "New post", children: /* @__PURE__ */ jsxRuntime.jsx(PostComposer, { channels: [...chunkMWBFAV3D_cjs.PROVIDERS], providers, onSubmit: submitDraft }) }),
1109
1022
  /* @__PURE__ */ jsxRuntime.jsx(
1110
1023
  SlideOver,
1111
1024
  {
@@ -1226,7 +1139,6 @@ function PostCard({
1226
1139
  ] });
1227
1140
  }
1228
1141
 
1229
- exports.ACCOUNT_STATUSES = ACCOUNT_STATUSES;
1230
1142
  exports.BackendStateCard = BackendStateCard;
1231
1143
  exports.COMPOSE_MODES = COMPOSE_MODES;
1232
1144
  exports.CampaignCard = CampaignCard;
@@ -1241,8 +1153,6 @@ exports.FieldText = FieldText;
1241
1153
  exports.FieldTextArea = FieldTextArea;
1242
1154
  exports.HostProvider = HostProvider;
1243
1155
  exports.LG = LG;
1244
- exports.POST_STATUSES = POST_STATUSES;
1245
- exports.PROVIDERS = PROVIDERS;
1246
1156
  exports.PageHeader = PageHeader;
1247
1157
  exports.PostAgenda = PostAgenda;
1248
1158
  exports.PostCard = PostCard;
@@ -1259,16 +1169,8 @@ exports.asColor = asColor;
1259
1169
  exports.classifyBackend = classifyBackend;
1260
1170
  exports.classifyRead = classifyRead;
1261
1171
  exports.contrastText = contrastText;
1262
- exports.createSocialApi = createSocialApi;
1263
1172
  exports.formatPostTime = formatPostTime;
1264
1173
  exports.isHexColor = isHexColor;
1265
- exports.normalizeAccount = normalizeAccount;
1266
- exports.normalizeAccounts = normalizeAccounts;
1267
- exports.normalizePost = normalizePost;
1268
- exports.normalizePosts = normalizePosts;
1269
- exports.normalizeProviderCapability = normalizeProviderCapability;
1270
- exports.normalizeProviders = normalizeProviders;
1271
- exports.normalizeSummary = normalizeSummary;
1272
1174
  exports.parsePostTime = parsePostTime;
1273
1175
  exports.postDayBucket = postDayBucket;
1274
1176
  exports.postPreview = postPreview;
@@ -1276,5 +1178,5 @@ exports.resolveAccent = resolveAccent;
1276
1178
  exports.setOrgAccent = setOrgAccent;
1277
1179
  exports.useAccent = useAccent;
1278
1180
  exports.useHost = useHost;
1279
- //# sourceMappingURL=chunk-VGGGGXWS.cjs.map
1280
- //# sourceMappingURL=chunk-VGGGGXWS.cjs.map
1181
+ //# sourceMappingURL=chunk-5MBAHVEO.cjs.map
1182
+ //# sourceMappingURL=chunk-5MBAHVEO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/product/host.tsx","../src/product/BackendState.tsx","../src/product/DataTable.tsx","../src/product/accent.ts","../src/product/PrimaryButton.tsx","../src/product/EmptyState.tsx","../src/product/Field.tsx","../src/product/PageHeader.tsx","../src/product/StatusTag.tsx","../src/product/color.ts","../src/product/SlideOver.tsx","../src/product/social/format.ts","../src/product/social/PostAgenda.tsx","../src/product/social/PostComposer.tsx","../src/product/social/ProviderReadinessList.tsx","../src/product/social/SocialSummaryBar.tsx","../src/product/social/ViewToggle.tsx","../src/product/social/SocialResource.tsx","../src/product/social/ChannelBadge.tsx","../src/product/social/CampaignCard.tsx","../src/product/social/PostCard.tsx"],"names":["createContext","jsx","useContext","jsxs","Card","XStack","TriangleAlert","Text","Button","CreditCard","YStack","ChevronsUpDown","ChevronUp","ChevronDown","useSyncExternalStore","Check","ExternalLink","ArrowRight","Label","Input","TextArea","Switch","Slider","useRef","useEffect","Fragment","X","ScrollView","useMemo","Calendar","useState","AlertTriangle","CheckCircle2","List","Send","PROVIDERS","useCallback","posts","accounts","providers","Plus","Link2","RefreshCw","Share2","Pencil","Trash2"],"mappings":"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","file":"chunk-5MBAHVEO.cjs","sourcesContent":["'use client'\n\n/**\n * The host seam — the ONE place an app injects its effects into this layer.\n *\n * The product layer is presentational and host-agnostic: it never imports a\n * router or an auth module. An honest state card still has to OFFER \"Sign in\n * again\" (401) or \"Add credits\" (402), so the app provides those two effects\n * once at its root and every card below renders the right affordance. Without a\n * provider the affordance is simply not offered — nothing is faked.\n */\nimport { createContext, useContext, type ReactNode } from 'react'\n\nexport type HostActions = {\n /** Re-authenticate and return to this exact page (401). */\n signIn?: () => void\n /** Navigate to the org's top-up surface (402). */\n addCredits?: () => void\n}\n\nconst HostCtx = createContext<HostActions>({})\n\nexport const HostProvider = ({ actions, children }: { actions: HostActions; children: ReactNode }) => (\n <HostCtx.Provider value={actions}>{children}</HostCtx.Provider>\n)\n\nexport const useHost = (): HostActions => useContext(HostCtx)\n","'use client'\n\n/**\n * Honest backend states for `/v1`-backed modules — ONE place that maps a thrown\n * HTTP error to a truthful explanation.\n *\n * A 503 means the runtime/keys aren't wired on this deployment yet, a 404/405\n * means the route isn't mounted here, 401/403 means the session can't read it,\n * 402 means the org has no funded balance. Nothing is fabricated — on failure the\n * caller shows this card instead of placeholder rows/charts.\n *\n * Classification is duck-typed on `status`, so any client's error class works\n * (console's `ApiError`, commerce's `CommerceError`, …) without this layer\n * depending on one. Effects come from `useHost()`.\n */\nimport type { ReactNode } from 'react'\nimport { Button, Card, Text, XStack } from '@hanzo/gui'\nimport { TriangleAlert, CreditCard } from '@hanzogui/lucide-icons-2'\n\nimport { useHost } from './host'\n\nexport type BackendStateKind =\n | 'not-initialized'\n | 'unavailable'\n | 'not-implemented'\n | 'access'\n | 'signin'\n | 'billing'\n | 'error'\n\nexport type BackendState = { kind: BackendStateKind; message: string }\n\n/**\n * Classify a thrown `/v1` error into an honest kind + raw message.\n *\n * 401 and 403 are DISTINCT for a signed-in user: 401 = the session is expired /\n * not recognized (re-auth fixes it → `signin`), 403 = the account IS signed in\n * but this surface isn't authorized/enabled for its org (`access`). A signed-in\n * user is NEVER told to \"sign in\" for a 403 — that would be a false instruction.\n */\nexport function classifyBackend(e: unknown): BackendState {\n const status = typeof (e as { status?: unknown })?.status === 'number' ? (e as { status: number }).status : 0\n const message = e instanceof Error ? e.message : String(e)\n if (status === 503) return { kind: 'not-initialized', message }\n if (status === 404 || status === 405) return { kind: 'unavailable', message }\n // 501 — the route EXISTS and answers honestly that its body ships later (the\n // Cloudflare R2/KV/D1 Phase-2 seams). Distinct from 404 (not mounted here): the\n // capability is real and planned, so say that rather than \"not available yet\".\n if (status === 501) return { kind: 'not-implemented', message }\n if (status === 402) return { kind: 'billing', message }\n if (status === 401) return { kind: 'signin', message }\n if (status === 403) return { kind: 'access', message }\n return { kind: 'error', message }\n}\n\n/**\n * Classify a READ (GET/list) failure. Identical to `classifyBackend` EXCEPT a 402\n * is NOT a wall: listing/reading a resource is never credit-gated, so a 402 on a\n * read means \"nothing is provisioned yet\" — the caller shows its honest EMPTY\n * state (e.g. \"No buckets yet · Create one\"), never an \"add credits\" paywall\n * (that belongs only on a paid WRITE). Returns `null` for a 402 → treat as empty.\n */\nexport function classifyRead(e: unknown): BackendState | null {\n const s = classifyBackend(e)\n return s.kind === 'billing' ? null : s\n}\n\nconst TITLES: Record<BackendStateKind, string> = {\n 'not-initialized': 'Backend not initialized',\n unavailable: 'Not available on this deployment yet',\n 'not-implemented': 'Not yet available',\n access: 'Not enabled for your account',\n signin: 'Your session expired',\n billing: 'Add credits to continue',\n error: 'Could not reach the backend',\n}\n\nconst BODIES: Record<BackendStateKind, string> = {\n 'not-initialized':\n '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 — no placeholder data is shown.',\n unavailable:\n 'This endpoint is not mounted at the gateway on this host yet. The view lights up automatically once the route is live.',\n // 501 — a real, planned capability whose body ships in a later phase.\n 'not-implemented':\n 'This capability is planned but not wired yet. The backend answers honestly rather than pretending it worked — nothing here is fabricated, and the view lights up automatically once it ships.',\n // 403 for a SIGNED-IN user — never \"sign in\".\n access:\n \"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 — nothing is fabricated.\",\n // 401 — the session itself lapsed; re-auth returns to this exact page.\n signin: 'Your session has expired or isn’t recognized here. Sign in again to continue where you left off.',\n // Empty → the card shows the backend's own message (the honest \"Insufficient\n // balance. Please add credits…\" from the gateway billing gate).\n billing: '',\n error: '',\n}\n\n/** A truthful state card for a `/v1` load failure, with an optional retry + hint. */\nexport function BackendStateCard({\n state,\n onRetry,\n hint,\n}: {\n state: BackendState\n onRetry?: () => void\n hint?: ReactNode\n}) {\n const { signIn, addCredits } = useHost()\n return (\n <Card borderWidth={1} borderColor=\"$borderColor\" p=\"$4\" gap=\"$2\" maxWidth={640}>\n <XStack gap=\"$2\" items=\"center\">\n <TriangleAlert size={16} />\n <Text fontSize=\"$4\" fontWeight=\"700\">\n {TITLES[state.kind]}\n </Text>\n </XStack>\n <Text fontSize=\"$3\" color=\"$color11\">\n {BODIES[state.kind] || state.message}\n </Text>\n {hint ? (\n <Text fontSize=\"$2\" color=\"$color10\">\n {hint}\n </Text>\n ) : null}\n {state.kind === 'signin' && signIn ? (\n <Button size=\"$2\" theme=\"light\" self=\"flex-start\" onPress={signIn}>\n Sign in again\n </Button>\n ) : state.kind === 'billing' && addCredits ? (\n // 402 — the org has no funded balance. Offer a top-up CTA (and keep Retry so\n // a returning, funded caller can reload in place).\n <XStack gap=\"$2\" items=\"center\" flexWrap=\"wrap\">\n <Button size=\"$2\" theme=\"light\" self=\"flex-start\" icon={<CreditCard size={14} />} onPress={addCredits}>\n Add credits\n </Button>\n {onRetry ? (\n <Button size=\"$2\" self=\"flex-start\" onPress={onRetry}>\n Retry\n </Button>\n ) : null}\n </XStack>\n ) : onRetry ? (\n <Button size=\"$2\" self=\"flex-start\" onPress={onRetry}>\n Retry\n </Button>\n ) : null}\n </Card>\n )\n}\n","'use client'\n\n/**\n * Generic data table — the shared list primitive for every product module.\n *\n * Rows are typed `<T>`; columns declare a key, header, and optional cell\n * renderer. Built on Hanzo GUI Stacks (shorthand style props per the v5 config)\n * so it adapts across platforms. Loading and empty states are first-class:\n * loading paints SKELETON ROWS in the real column layout (an honest \"loading\",\n * never a spinner void); numeric columns opt into right-aligned Geist Mono\n * tabular figures so amounts/counts/IDs read as precise, column-aligned data.\n *\n * SORTING is opt-in and caller-owned: a column marks itself `sortable`, the caller\n * passes the current `sort` + an `onSortChange`, and the table only reports the\n * clicked key (it never reorders `rows` itself — the caller's own pure comparator\n * stays the one source of order). Omit all three and the table behaves exactly as\n * before, so every existing consumer is unchanged.\n */\nimport type { ReactNode } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { ChevronDown, ChevronsUpDown, ChevronUp } from '@hanzogui/lucide-icons-2'\n\nexport type Column<T> = {\n key: string\n header: string\n /** Cell renderer; defaults to `String(row[key])`. */\n render?: (row: T) => ReactNode\n /** Fixed width (px) for the column; otherwise flexes. */\n width?: number\n /** Horizontal alignment — `right` for numeric/amount columns. */\n align?: 'left' | 'right'\n /** Typeset the default cell + header as Geist Mono tabular (counts, amounts, IDs). */\n mono?: boolean\n /** Clickable header that reports `onSortChange(key)` (needs both table props). */\n sortable?: boolean\n}\n\n/** The active sort — which column key, which direction. */\nexport type SortState = { key: string; dir: 'asc' | 'desc' }\n\n/** Skeleton rows in the real column layout — an honest \"loading\", never a void. */\nfunction SkeletonRows<T>({ columns, count = 6 }: { columns: Column<T>[]; count?: number }) {\n return (\n <YStack>\n {Array.from({ length: count }).map((_, r) => (\n <XStack key={r} py=\"$2.5\" px=\"$3\" gap=\"$3\" borderTopWidth={1} borderColor=\"$borderColor\" items=\"center\">\n {columns.map((c, i) => (\n <YStack key={c.key} width={c.width} flex={c.width ? undefined : 1} minW={c.width ? undefined : FLEX_MIN_COL_W} items={c.align === 'right' ? 'flex-end' : 'flex-start'}>\n <div\n className=\"hz-skeleton\"\n style={{ height: 12, borderRadius: 6, width: `${[62, 40, 54, 34, 48][(i + r) % 5]}%` }}\n aria-hidden\n />\n </YStack>\n ))}\n </XStack>\n ))}\n </YStack>\n )\n}\n\nexport function DataTable<T>({\n columns,\n rows,\n loading,\n empty = 'Nothing here yet.',\n rowKey,\n onRowPress,\n isRowExpanded,\n renderExpanded,\n sort,\n onSortChange,\n}: {\n columns: Column<T>[]\n rows: T[]\n loading?: boolean\n empty?: string\n rowKey: (row: T) => string\n onRowPress?: (row: T) => void\n /** When set + true for a row, its `renderExpanded` panel is shown below it. */\n isRowExpanded?: (row: T) => boolean\n /** Full-width detail panel rendered under an expanded row (master-detail accordion). */\n renderExpanded?: (row: T) => ReactNode\n /** The active sort, for the header caret + `aria-sort`. */\n sort?: SortState\n /** Called with the clicked column key; the caller owns the reordering. */\n onSortChange?: (key: string) => void\n}) {\n // Natural min-width of the table: the sum of the declared column widths, with a\n // sensible floor for flex columns, plus row padding + inter-column gaps. On a\n // narrow (mobile) viewport where this exceeds the container, the inner wrapper\n // scrolls HORIZONTALLY instead of clipping the last columns (the old\n // `overflow:hidden` cut the right edge off, e.g. the Status column). On desktop\n // the flex columns still expand to fill, so wide screens are unchanged.\n const minTableW = columns.reduce((sum, c) => sum + (c.width ?? FLEX_MIN_COL_W), 0) + (columns.length + 1) * 12\n\n return (\n <YStack borderWidth={1} borderColor=\"$borderColor\" rounded=\"$4\" overflow=\"hidden\">\n <YStack style={{ overflowX: 'auto', overflowY: 'visible' }}>\n <YStack minW={minTableW}>\n {/* Header — quiet, uppercase-free, Medium. A hairline under it separates\n the head from the body without a heavy fill. */}\n <XStack bg=\"$color1\" py=\"$2.5\" px=\"$3\" gap=\"$3\" borderBottomWidth={1} borderColor=\"$borderColor\" role=\"row\">\n {columns.map((c) => {\n // Sortable needs BOTH the column opt-in and a caller handler — a column\n // can never look clickable with nothing listening.\n const sortable = c.sortable === true && !!onSortChange\n const active = sortable && sort?.key === c.key\n const Caret = !sortable ? null : !active ? ChevronsUpDown : sort?.dir === 'asc' ? ChevronUp : ChevronDown\n return (\n <XStack\n key={c.key}\n width={c.width}\n flex={c.width ? undefined : 1}\n minW={c.width ? undefined : FLEX_MIN_COL_W}\n items=\"center\"\n gap=\"$1\"\n justify={c.align === 'right' ? 'flex-end' : 'flex-start'}\n role=\"columnheader\"\n aria-sort={sortable ? (active ? (sort?.dir === 'asc' ? 'ascending' : 'descending') : 'none') : undefined}\n aria-label={sortable ? `Sort by ${c.header}` : undefined}\n cursor={sortable ? 'pointer' : undefined}\n hoverStyle={sortable ? { opacity: 0.75 } : undefined}\n onPress={sortable ? () => onSortChange?.(c.key) : undefined}\n >\n <Text\n fontSize=\"$1\"\n fontWeight=\"500\"\n color={active ? '$color12' : '$color10'}\n text={c.align === 'right' ? 'right' : 'left'}\n className={c.mono ? 'hz-tnum' : undefined}\n >\n {c.header}\n </Text>\n {Caret ? <Caret size={12} color={active ? '$color12' : '$color9'} /> : null}\n </XStack>\n )\n })}\n </XStack>\n\n {loading ? (\n <SkeletonRows columns={columns} />\n ) : rows.length > 0 ? (\n <YStack>\n {rows.map((row) => {\n const expanded = (isRowExpanded?.(row) ?? false) && !!renderExpanded\n return (\n <YStack key={rowKey(row)}>\n <XStack\n className=\"hz-row\"\n py=\"$2.5\"\n px=\"$3\"\n gap=\"$3\"\n borderTopWidth={1}\n borderColor=\"$borderColor\"\n items=\"center\"\n bg={expanded ? '$color2' : undefined}\n hoverStyle={onRowPress ? { bg: '$color2' } : undefined}\n cursor={onRowPress ? 'pointer' : undefined}\n onPress={onRowPress ? () => onRowPress(row) : undefined}\n >\n {columns.map((c) => {\n // A cell value is either a column's rendered node or the raw\n // `String(row[key])`. Whenever it resolves to a PRIMITIVE\n // (string|number) — the default cell OR a `render()` that returns\n // `String(count)` / `ttl` / `priority` — it is wrapped in the ONE\n // styled Text below, so the primitive can never emit a bare text\n // node (illegal under a native View → RN red-box + console spam)\n // and always picks up the numeric mono/align styling. Element\n // renders (Text/badges/cells) pass through untouched.\n const cell = c.render ? c.render(row) : String((row as Record<string, unknown>)[c.key] ?? '')\n return (\n <YStack\n key={c.key}\n width={c.width}\n flex={c.width ? undefined : 1}\n minW={c.width ? undefined : FLEX_MIN_COL_W}\n justify=\"center\"\n items={c.align === 'right' ? 'flex-end' : 'flex-start'}\n >\n {typeof cell === 'string' || typeof cell === 'number' ? (\n <Text\n fontSize=\"$3\"\n numberOfLines={1}\n color=\"$color12\"\n text={c.align === 'right' ? 'right' : 'left'}\n className={c.mono ? 'hz-mono' : undefined}\n >\n {cell}\n </Text>\n ) : (\n cell\n )}\n </YStack>\n )\n })}\n </XStack>\n {expanded && renderExpanded ? (\n <YStack borderTopWidth={1} borderColor=\"$borderColor\" bg=\"$color1\">\n {renderExpanded(row)}\n </YStack>\n ) : null}\n </YStack>\n )\n })}\n </YStack>\n ) : null}\n </YStack>\n </YStack>\n\n {/* Empty message lives OUTSIDE the horizontal (min-width) scroll area so it\n centers + wraps within the VISIBLE width — on a phone the min-width table\n scrolls, but \"Nothing here yet.\" must never be clipped off the right edge. */}\n {!loading && rows.length === 0 ? (\n <YStack py=\"$8\" px=\"$4\" items=\"center\" gap=\"$1\" borderTopWidth={1} borderColor=\"$borderColor\">\n <Text color=\"$color10\" fontSize=\"$3\" text=\"center\">\n {empty}\n </Text>\n </YStack>\n ) : null}\n </YStack>\n )\n}\n\n/** Min width for a flex (no explicit `width`) column, so the table has a natural\n * size to scroll to on mobile instead of squishing/clipping its cells. */\nconst FLEX_MIN_COL_W = 120\n","'use client'\n\n/**\n * Org accent theme — the ONE place that turns an organization's saved brand color\n * (`themeData.colorPrimary`, when `themeData.isEnabled`) into the LIVE console accent.\n *\n * The console is monochrome by default; an org opts into a custom accent in Settings →\n * Branding. Saving persists the color on the org record (that half already works). This\n * module is the missing APPLY half: a tiny external store holds the resolved accent\n * (hex + a readable contrast, or null); `setOrgAccent` updates it on load AND on save\n * (one mechanism, two callers), and `useAccent()` lets the genuine accent surfaces (the\n * primary button, the active tabs, the active nav item) read it and recolor with real\n * `@hanzo/gui` props — reverting cleanly to the default monochrome when the org disables\n * its theme (or the hex is invalid). React-prop driven (Tamagui's own styling path), NOT\n * a CSS class — Tamagui does not forward `className` to a Button's DOM node.\n *\n * Pure + SSR-safe: the resolve/contrast helpers are pure (unit-tested); the store starts\n * from a stable default snapshot so the server render and first client paint agree.\n */\nimport { useSyncExternalStore } from 'react'\n\n/** An org's persisted theme block (mirrors IAM `themeData`; only the fields we apply). */\nexport type OrgThemeData = {\n colorPrimary?: string\n isEnabled?: boolean\n}\n\n/** The live accent — a resolved hex + a readable text color for content on it, or null. */\nexport type Accent = { accent: string | null; contrast: string }\n\n/** True for a 3- or 6-digit CSS hex color (`#RGB` / `#RRGGBB`). */\nexport function isHexColor(v: string | undefined | null): boolean {\n return typeof v === 'string' && /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(v.trim())\n}\n\n/**\n * The accent hex to apply for an org, or `null` when no custom accent should be used —\n * i.e. the theme is disabled, missing, or the color is not a valid hex. PURE.\n */\nexport function resolveAccent(theme: OrgThemeData | null | undefined): string | null {\n if (!theme || !theme.isEnabled) return null\n const hex = (theme.colorPrimary ?? '').trim()\n return isHexColor(hex) ? hex : null\n}\n\n/** Expand `#abc` → `#aabbcc`; pass a 6-digit hex through (lowercased). */\nfunction expandHex(hex: string): string {\n const h = hex.trim().toLowerCase()\n if (h.length === 4) return `#${h[1]}${h[1]}${h[2]}${h[2]}${h[3]}${h[3]}`\n return h\n}\n\n/**\n * A readable text color (`#000000` / `#ffffff`) for content placed ON the accent,\n * chosen by the accent's relative luminance (WCAG-style). PURE. Falls back to white\n * for a non-hex input (never throws).\n */\nexport function contrastText(hex: string): '#000000' | '#ffffff' {\n if (!isHexColor(hex)) return '#ffffff'\n const h = expandHex(hex)\n const r = parseInt(h.slice(1, 3), 16) / 255\n const g = parseInt(h.slice(3, 5), 16) / 255\n const b = parseInt(h.slice(5, 7), 16) / 255\n const lin = (c: number) => (c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4)\n const luminance = 0.2126 * lin(r) + 0.7152 * lin(g) + 0.0722 * lin(b)\n return luminance > 0.5 ? '#000000' : '#ffffff'\n}\n\n/** Resolve a theme block to the `Accent` value it should apply (accent+contrast or null). PURE. */\nexport function accentFor(theme: OrgThemeData | null | undefined): Accent {\n const hex = resolveAccent(theme)\n return { accent: hex, contrast: hex ? contrastText(hex) : '#ffffff' }\n}\n\n// ── The live accent store (an external store React subscribes to) ─────────────\n\n/** The default (no custom accent) — a STABLE reference so SSR + first paint agree. */\nconst DEFAULT: Accent = { accent: null, contrast: '#ffffff' }\n\nlet current: Accent = DEFAULT\nconst listeners = new Set<() => void>()\n\n/**\n * Set the live accent from an org theme block. Called on load (from the fetched org) AND\n * immediately on save — the SINGLE mechanism, so the accent survives reload and updates\n * without one. A no-op when the resolved accent is unchanged (keeps the snapshot stable).\n */\nexport function setOrgAccent(theme: OrgThemeData | null | undefined): void {\n const next = accentFor(theme)\n if (next.accent === current.accent) return\n current = next.accent ? next : DEFAULT\n for (const l of listeners) l()\n}\n\nfunction subscribe(cb: () => void): () => void {\n listeners.add(cb)\n return () => {\n listeners.delete(cb)\n }\n}\n\n/** The live accent (subscribes to the store). Returns the default until an org theme is applied. */\nexport function useAccent(): Accent {\n return useSyncExternalStore(\n subscribe,\n () => current,\n () => DEFAULT,\n )\n}\n","'use client'\n\n/**\n * Primary button — the one white, high-emphasis action for the console.\n *\n * Monochrome brand: `theme=\"light\"` flips the button to the light theme inside\n * the dark console, giving a white fill with a near-black label and icon — no\n * hue accent. Use it for the single primary action in a view (sign in, save,\n * get started). Secondary and destructive actions use the default neutral\n * `Button`.\n *\n * When an org enables a custom brand color, this — the console's one primary\n * action — recolors to the org accent (inline bg + the color prop the label/icon\n * inherit), reading the live accent from `useAccent()`; with no custom theme it\n * stays the default white. A caller's own `style`/`color` still win (spread last).\n */\nimport type { ComponentProps } from 'react'\nimport { Button } from '@hanzo/gui'\n\nimport { useAccent } from './accent'\n\nexport function PrimaryButton(props: ComponentProps<typeof Button>) {\n const { accent, contrast } = useAccent()\n // Accent set → a filled accent button (bg + readable text, via inline style Tamagui\n // forwards to the DOM). No accent → the default monochrome white (theme=\"light\").\n if (accent) {\n return <Button style={{ backgroundColor: accent, color: contrast, borderColor: accent }} {...props} />\n }\n return <Button theme=\"light\" {...props} />\n}\n","'use client'\n\n/**\n * Rich empty state — the ONE way the console turns a real, honest \"nothing here\n * yet\" into a helpful onboarding moment (DigitalOcean / Vercel class) instead of\n * a dead screen.\n *\n * It is NOT a fabricated-data fallback: callers render it only when a load\n * genuinely succeeded with zero rows (or a resource has no surface yet). It shows\n * the product icon, a one-line \"what this is\", a couple of guidance bullets, a\n * single primary call-to-action (Deploy / Create / Connect …) and an optional\n * secondary link (Docs / CLI). Orthogonal to `BackendStateCard` (failures) and\n * `DataTable`'s thin inline empty (in-table) — this is the full-bleed first-run\n * surface a module shows in place of its table.\n */\nimport type { ReactElement, ReactNode } from 'react'\nimport { Button, Card, Text, XStack, YStack } from '@hanzo/gui'\nimport { ArrowRight, Check, ExternalLink } from '@hanzogui/lucide-icons-2'\n\nimport type { IconLike } from './color'\nimport { PrimaryButton } from './PrimaryButton'\n\n/** A single call-to-action — primary (filled) or a secondary/external link. */\nexport type EmptyAction = {\n label: string\n /** In-app navigation / handler. */\n onPress?: () => void\n /** External URL — opens in a new tab with an external-link affordance. */\n href?: string\n icon?: ReactElement\n}\n\n/** Open an external URL in a new tab (no-opener), guarded for SSR. */\nfunction openHref(href: string): void {\n if (typeof window !== 'undefined') window.open(href, '_blank', 'noopener')\n}\n\nexport function EmptyState({\n icon: Icon,\n title,\n description,\n bullets,\n primary,\n secondary,\n}: {\n /** Product/section icon — any lucide/Gui icon component (size + optional color). */\n icon: IconLike\n title: string\n description: string\n /** Optional \"here's how to get started\" guidance bullets. */\n bullets?: string[]\n /** The single high-emphasis action (Deploy / Create / Connect). */\n primary?: EmptyAction\n /** An optional lower-emphasis action (Docs / CLI / Learn more). */\n secondary?: EmptyAction\n}) {\n return (\n <Card\n borderWidth={1}\n borderColor=\"$borderColor\"\n borderStyle=\"dashed\"\n p=\"$6\"\n gap=\"$4\"\n items=\"center\"\n maxWidth={640}\n self=\"center\"\n width=\"100%\"\n >\n <YStack\n width={48}\n height={48}\n items=\"center\"\n justify=\"center\"\n rounded=\"$4\"\n bg=\"$color3\"\n >\n <Icon size={24} />\n </YStack>\n\n <YStack gap=\"$2\" items=\"center\" maxW={480}>\n <Text fontSize=\"$6\" fontWeight=\"500\" text=\"center\" letterSpacing={-0.3}>\n {title}\n </Text>\n <Text fontSize=\"$3\" color=\"$color11\" text=\"center\">\n {description}\n </Text>\n </YStack>\n\n {bullets && bullets.length ? (\n <YStack gap=\"$2\" self=\"stretch\" maxW={420} mx=\"auto\">\n {bullets.map((b) => (\n <XStack key={b} gap=\"$2\" items=\"flex-start\">\n <YStack pt=\"$1\">\n <Check size={14} color=\"$color10\" />\n </YStack>\n <Text fontSize=\"$3\" color=\"$color11\" flex={1}>\n {b}\n </Text>\n </XStack>\n ))}\n </YStack>\n ) : null}\n\n {primary || secondary ? (\n <XStack gap=\"$2\" items=\"center\" flexWrap=\"wrap\" justify=\"center\">\n {primary ? (\n <PrimaryButton\n icon={primary.icon}\n iconAfter={primary.href ? <ExternalLink size={15} /> : <ArrowRight size={15} />}\n onPress={() => (primary.href ? openHref(primary.href) : primary.onPress?.())}\n >\n {primary.label}\n </PrimaryButton>\n ) : null}\n {secondary ? (\n <Button\n chromeless\n icon={secondary.icon}\n iconAfter={secondary.href ? <ExternalLink size={14} /> : undefined}\n onPress={() => (secondary.href ? openHref(secondary.href) : secondary.onPress?.())}\n >\n {secondary.label}\n </Button>\n ) : null}\n </XStack>\n ) : null}\n </Card>\n )\n}\n","'use client'\n\n/**\n * Form field primitives — labeled rows over Hanzo GUI inputs.\n *\n * One way to render a labeled control. Every editor field goes through these, so\n * spacing, disabled styling, and the label column stay consistent. Style props\n * use the v5 shorthand set (p/px/items/justify/...).\n */\nimport type { CSSProperties, ReactNode } from 'react'\nimport {\n Input,\n Label,\n Switch,\n TextArea,\n Slider,\n Text,\n XStack,\n YStack,\n} from '@hanzo/gui'\n\n/**\n * Labeled row. STACKED on phones (label full-width above a full-width control) so a\n * form inside a SlideOver stays usable and never clips its labels; a fixed 180px\n * label column + flexing control at $md+ (the two-column desktop/tablet layout).\n */\nexport function FieldRow({ label, children }: { label: string; children: ReactNode }) {\n return (\n <XStack gap=\"$3\" items=\"flex-start\" flexWrap=\"wrap\">\n <Label width=\"100%\" pt=\"$2\" color=\"$color11\" fontSize=\"$3\" $md={{ width: 180 }}>\n {label}\n </Label>\n <YStack flex={1} minW={0} $md={{ minW: 240 }}>\n {children}\n </YStack>\n </XStack>\n )\n}\n\nexport function FieldText({\n value,\n onChange,\n disabled,\n secure,\n placeholder,\n}: {\n value: string\n onChange: (v: string) => void\n disabled?: boolean\n secure?: boolean\n placeholder?: string\n}) {\n return (\n <Input\n value={value}\n onChangeText={onChange}\n disabled={disabled}\n secureTextEntry={secure}\n placeholder={placeholder}\n autoCapitalize=\"none\"\n />\n )\n}\n\nexport function FieldTextArea({\n value,\n onChange,\n disabled,\n rows = 6,\n}: {\n value: string\n onChange: (v: string) => void\n disabled?: boolean\n rows?: number\n}) {\n return (\n <TextArea value={value} onChangeText={onChange} disabled={disabled} numberOfLines={rows} />\n )\n}\n\nexport function FieldSwitch({\n checked,\n onChange,\n disabled,\n}: {\n checked: boolean\n onChange: (v: boolean) => void\n disabled?: boolean\n}) {\n return (\n <Switch checked={checked} onCheckedChange={onChange} disabled={disabled} size=\"$3\">\n <Switch.Thumb />\n </Switch>\n )\n}\n\n/**\n * A labeled dropdown.\n *\n * Renders a REAL native `<select>` on web (and the OS-native picker on mobile),\n * NOT the `@hanzo/gui` `<Select native>` — that primitive is broken in gui 7.3.0:\n * `native` emits bare `<option>` elements with NO `<select>` wrapper, so every\n * dropdown across the console (region/size pickers, all edit forms) rendered as a\n * non-interactive flat list of option text that buried the surrounding controls.\n * A native `<select>` is compact, keyboard/ARIA-accessible, gives the native\n * mobile picker (best small-screen UX), and is themed via the Tamagui CSS custom\n * properties (`--background`/`--color12`/`--borderColor`) so it tracks light/dark.\n */\nconst CHEVRON = `data:image/svg+xml,${encodeURIComponent(\n '<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>',\n)}`\n\nfunction selectStyle(disabled?: boolean): CSSProperties {\n return {\n width: '100%',\n boxSizing: 'border-box',\n appearance: 'none',\n WebkitAppearance: 'none',\n MozAppearance: 'none',\n background: `var(--background) url(\"${CHEVRON}\") no-repeat right 10px center`,\n color: 'var(--color12)',\n border: '1px solid var(--borderColor)',\n borderRadius: 9,\n padding: '9px 34px 9px 12px',\n fontSize: 14,\n lineHeight: '20px',\n fontFamily: 'inherit',\n height: 40,\n outline: 'none',\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n }\n}\n\nconst OPTION_STYLE: CSSProperties = { background: 'var(--color2)', color: 'var(--color12)' }\n\nexport function FieldSelect({\n value,\n options,\n onChange,\n disabled,\n placeholder = 'Select…',\n}: {\n value: string\n options: string[]\n onChange: (v: string) => void\n disabled?: boolean\n placeholder?: string\n}) {\n // When the current value isn't one of the options (empty/unset), show the\n // placeholder as a selected-but-disabled row so the control reads honestly.\n const showPlaceholder = value === '' || !options.includes(value)\n return (\n <select\n value={showPlaceholder ? '' : value}\n onChange={(e) => onChange(e.currentTarget.value)}\n disabled={disabled}\n aria-label={placeholder}\n style={selectStyle(disabled)}\n >\n {showPlaceholder ? (\n <option value=\"\" disabled style={OPTION_STYLE}>\n {placeholder}\n </option>\n ) : null}\n {options.map((opt) => (\n <option key={opt} value={opt} style={OPTION_STYLE}>\n {opt}\n </option>\n ))}\n </select>\n )\n}\n\nexport function FieldSlider({\n value,\n min,\n max,\n step,\n onChange,\n disabled,\n}: {\n value: number\n min: number\n max: number\n step: number\n onChange: (v: number) => void\n disabled?: boolean\n}) {\n return (\n <XStack gap=\"$3\" items=\"center\">\n <Text width={56} fontSize=\"$3\" color=\"$color11\">\n {value}\n </Text>\n <Slider\n flex={1}\n min={min}\n max={max}\n step={step}\n value={[value]}\n onValueChange={(v) => onChange(v[0] ?? min)}\n disabled={disabled}\n >\n <Slider.Track>\n <Slider.TrackActive />\n </Slider.Track>\n <Slider.Thumb index={0} circular />\n </Slider>\n </XStack>\n )\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\n\n/** Section title + optional subtitle and right-aligned actions. */\nexport function PageHeader({\n title,\n subtitle,\n actions,\n}: {\n title: string\n subtitle?: string\n actions?: ReactNode\n}) {\n return (\n // flexWrap lets the actions drop below the title on narrow screens; flex={1}\n // minW={0} lets the title column shrink so a long subtitle WRAPS instead of\n // running off the viewport (a flex child defaults to min-width:auto = content\n // width, which would overflow on mobile).\n <XStack justify=\"space-between\" items=\"flex-start\" gap=\"$3\" flexWrap=\"wrap\">\n <YStack gap=\"$1\" flex={1} minW={200}>\n <Text fontSize=\"$7\" fontWeight=\"500\" letterSpacing={-0.4}>\n {title}\n </Text>\n {subtitle ? (\n <Text fontSize=\"$3\" color=\"$color11\">\n {subtitle}\n </Text>\n ) : null}\n </YStack>\n {/* Actions take a FULL line below the title on phones (width 100%) and WRAP —\n so a header with many buttons (e.g. Tracker's Projects/Refresh/List/Board/\n New issue/Delete) never runs off-screen and clips the last controls. At $md+\n they collapse back to a right-aligned inline row beside the title. */}\n {actions ? (\n <XStack gap=\"$2\" items=\"center\" flexWrap=\"wrap\" width=\"100%\" $md={{ width: 'auto', justify: 'flex-end' }}>\n {actions}\n </XStack>\n ) : null}\n </XStack>\n )\n}\n","'use client'\n\n/**\n * Status pill — maps a resource/cluster status string to a tone, one place.\n *\n * Provisioned things (managed resources, clusters) report free-form lifecycle\n * strings; this normalizes them to green/yellow/red/neutral so every list reads\n * the same. Style props use the v5 shorthand set.\n */\nimport { Text } from '@hanzo/gui'\n\ntype Tone = 'green' | 'yellow' | 'red' | 'neutral'\n\nconst toneOf = (status: string): Tone => {\n const s = status.toLowerCase()\n // Platform health verdicts map straight to a tone (the apps inventory reports\n // green/yellow/red directly).\n if (s === 'green') return 'green'\n if (s === 'yellow') return 'yellow'\n if (s === 'red') return 'red'\n if (['ready', 'active', 'running', 'available', 'ok', 'live', 'succeeded', 'connected', 'synced', 'imported'].includes(s)) return 'green'\n if (['creating', 'provisioning', 'pending', 'updating', 'attaching', 'building', 'deploying', 'queued', 'importing'].includes(s))\n return 'yellow'\n if (['error', 'failed', 'degraded', 'down', 'canceled', 'conflict'].includes(s)) return 'red'\n return 'neutral'\n}\n\n// `as const` keeps the literal token types (not widened to `string`) so they\n// satisfy the GUI `bg`/`color` token unions.\nconst TONE_BG = {\n green: '$color5',\n yellow: '$color4',\n red: '$color4',\n neutral: '$color3',\n} as const\nconst TONE_FG = {\n green: '$color12',\n yellow: '$color12',\n red: '$color12',\n neutral: '$color11',\n} as const\n\nexport function StatusTag({ status }: { status?: string }) {\n const tone = toneOf(status ?? '')\n return (\n <Text fontSize=\"$1\" px=\"$2\" py=\"$1\" rounded=\"$2\" bg={TONE_BG[tone]} color={TONE_FG[tone]}>\n {status || 'unknown'}\n </Text>\n )\n}\n","import type { ComponentType } from 'react'\nimport type { GetThemeValueForKey } from '@hanzo/gui'\n\n/**\n * Bridge between raw CSS colors (product hex accents) and Gui's typed `color`\n * prop. Gui types `color` as a theme-token template (`$color12`, …), but ANY CSS\n * color is valid at runtime — so tinting an icon with a product hex needs one\n * sanctioned cast, in ONE place, rather than `as any` scattered around.\n */\nexport type IconColor = GetThemeValueForKey<'color'>\n\n/** Cast a raw CSS color (e.g. `#5E6AD2`) to Gui's `color` prop type. */\nexport const asColor = (hex: string): IconColor => hex as unknown as IconColor\n\n/** A lucide/Gui icon component that accepts a size + a (token-or-cast) color —\n * the shape the shell passes around for product/nav icons. */\nexport type IconLike = ComponentType<{ size?: number; color?: IconColor }>\n","'use client'\n\n/**\n * SlideOver — the ONE right-side (or left) slide-out overlay for the console.\n *\n * It is the single mechanism behind every off-canvas surface: the mobile nav\n * drawer, the item DetailPane, and the account/settings menu. One definition, many\n * mounts (DRY) — so every drawer slides, dims, traps, and closes identically.\n *\n * Smoothness is CSS-transform driven (never a JS layout branch): the panel is\n * ALWAYS mounted and toggles `translateX(0) ↔ translateX(±100%)` via the shared\n * `.hz-slide` class, and the backdrop cross-fades via `.hz-fade`. Because it never\n * unmounts, the EXIT animates too (a `Dialog` that unmounts on close cannot). Both\n * classes are reduced-motion-aware in `globals.css`, so the whole thing snaps\n * instantly for users who ask for that — no bespoke logic here.\n *\n * Responsive by construction: FULL-WIDTH (full-screen) below `lg`, a fixed-width\n * pane at `lg+` (`size`). Uses `100dvh` so the mobile browser chrome never clips it.\n *\n * A11y: `role=\"dialog\" aria-modal`, Escape to close, backdrop click to close, body\n * scroll lock while open (ref-counted so stacked overlays don't fight), and focus\n * moves into the panel on open and returns to the opener on close.\n */\nimport { useEffect, useRef, type ReactNode } from 'react'\nimport { Button, ScrollView, Text, XStack, YStack } from '@hanzo/gui'\nimport { X } from '@hanzogui/lucide-icons-2'\n\nimport { asColor, type IconLike } from './color'\n\n/** The lg breakpoint (px) — matches the shell's one responsive threshold. */\nconst LG = 1024\n\n// ── Body scroll lock, ref-counted so nested/stacked overlays don't clobber it ──\nlet lockCount = 0\nlet savedOverflow = ''\nfunction lockScroll() {\n if (typeof document === 'undefined') return\n if (lockCount === 0) {\n savedOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n }\n lockCount++\n}\nfunction unlockScroll() {\n if (typeof document === 'undefined') return\n lockCount = Math.max(0, lockCount - 1)\n if (lockCount === 0) document.body.style.overflow = savedOverflow\n}\n\nexport type SlideOverProps = {\n open: boolean\n onClose: () => void\n /** Which edge the panel slides from. Default right. */\n side?: 'right' | 'left'\n /** Panel width at lg+ (px). Below lg it is always full-screen. Default 420. */\n size?: number\n /** Optional header title — when set, SlideOver renders a header + a scroll body. */\n title?: ReactNode\n /** Optional header icon (tinted with `iconColor`). */\n icon?: IconLike\n iconColor?: string\n /** Extra header content, right-aligned before the close button. */\n headerRight?: ReactNode\n /** Accessible label when no visible title is given. */\n ariaLabel?: string\n /** z-index for stacking (a pane opened over a drawer passes a higher value). */\n zIndex?: number\n children: ReactNode\n}\n\nexport function SlideOver({\n open,\n onClose,\n side = 'right',\n size = 420,\n title,\n icon: Icon,\n iconColor,\n headerRight,\n ariaLabel,\n zIndex = 1000,\n children,\n}: SlideOverProps) {\n const panelRef = useRef<HTMLElement | null>(null)\n const openerRef = useRef<Element | null>(null)\n\n // Body scroll lock + focus management, driven by `open`.\n useEffect(() => {\n if (!open) return\n openerRef.current = typeof document !== 'undefined' ? document.activeElement : null\n lockScroll()\n // Move focus into the panel (next frame so it is laid out + on-screen).\n const t = window.setTimeout(() => {\n const el = panelRef.current\n if (el && typeof el.focus === 'function') el.focus()\n }, 0)\n return () => {\n window.clearTimeout(t)\n unlockScroll()\n const opener = openerRef.current\n if (opener && opener instanceof HTMLElement && typeof opener.focus === 'function') opener.focus()\n }\n }, [open])\n\n // Escape closes.\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n onClose()\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [open, onClose])\n\n const offscreen = side === 'right' ? 'translateX(100%)' : 'translateX(-100%)'\n const edge = side === 'right' ? { r: 0 } : { l: 0 }\n\n return (\n <YStack\n // Fixed to the viewport; overflow hidden so the off-screen panel (absolute\n // child) is CLIPPED and never adds a horizontal scrollbar.\n overflow=\"hidden\"\n pointerEvents={open ? 'auto' : 'none'}\n aria-hidden={!open}\n style={{ position: 'fixed', inset: 0, zIndex }}\n >\n {/* Backdrop — cross-fades; click to dismiss. */}\n <YStack\n position=\"absolute\"\n t={0}\n l={0}\n r={0}\n b={0}\n bg=\"rgba(0,0,0,0.55)\"\n className=\"hz-fade\"\n style={{ opacity: open ? 1 : 0 }}\n onPress={onClose}\n />\n\n {/* Panel — slides in from the edge. Full-screen below lg, fixed width at lg+. */}\n <YStack\n // Web DOM ref; Gui forwards it to the underlying node. Cast (not @ts-expect-error)\n // so it is env-agnostic — the ref type is strict under the pkg build, loose here.\n ref={panelRef as never}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal={open ? true : undefined}\n aria-label={typeof title === 'string' ? title : ariaLabel}\n position=\"absolute\"\n t={0}\n b={0}\n {...edge}\n width=\"100%\"\n $lg={{ width: size, maxW: '100vw' }}\n bg=\"$color1\"\n borderLeftWidth={side === 'right' ? 1 : 0}\n borderRightWidth={side === 'left' ? 1 : 0}\n borderColor=\"$borderColor\"\n // Material paper depth — the drawer reads as a sheet lifted above the dimmed\n // list behind it (real layered shadow, theme-aware), not a flat panel.\n className=\"hz-slide hz-elevation-4\"\n // Full-height sheet (100dvh — mobile-safe), inset for the notch (top) + home\n // indicator (bottom) so the drawer header + footer actions clear them on\n // notched devices (env insets are 0 elsewhere, so no effect there).\n style={{\n transform: open ? 'translateX(0)' : offscreen,\n height: '100dvh',\n paddingTop: 'env(safe-area-inset-top)',\n paddingBottom: 'env(safe-area-inset-bottom)',\n }}\n >\n {title !== undefined ? (\n <>\n <XStack\n items=\"center\"\n gap=\"$2.5\"\n px=\"$4\"\n height={56}\n borderBottomWidth={1}\n borderColor=\"$borderColor\"\n >\n {Icon ? <Icon size={18} color={iconColor ? asColor(iconColor) : undefined} /> : null}\n <Text flex={1} fontSize=\"$5\" fontWeight=\"700\" color=\"$color12\" numberOfLines={1}>\n {title}\n </Text>\n {headerRight}\n <Button chromeless width={44} height={44} icon={<X size={18} />} onPress={onClose} aria-label=\"Close\" />\n </XStack>\n <ScrollView flex={1}>\n <YStack flex={1} p=\"$4\" gap=\"$3\">\n {children}\n </YStack>\n </ScrollView>\n </>\n ) : (\n // Bare mode — the caller owns the full panel layout (e.g. the nav drawer\n // renders its own header + scroll + footer).\n children\n )}\n </YStack>\n </YStack>\n )\n}\n\nexport { LG as SLIDEOVER_LG }\n","/**\n * The ONE place a post's schedule time and body are formatted, bucketed by day,\n * and parsed. Pure (no React, no host) so the agenda, the table cells and the\n * composer all read the same clock. Extracted from Hanzo Social.\n */\n\n/** Unix seconds → a short local timestamp, or '—' when unset (0). */\nexport function formatPostTime(unix: number): string {\n if (!unix) return '—'\n return new Date(unix * 1000).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n}\n\n/** Unix seconds → a day bucket key + label for the agenda (calendar) view. */\nexport function postDayBucket(unix: number): { key: string; label: string } {\n const d = new Date(unix * 1000)\n const key = `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`\n const label = d.toLocaleDateString(undefined, { weekday: 'short', month: 'short', day: 'numeric' })\n return { key, label }\n}\n\n/** Truncate a post body for a table cell / agenda card. */\nexport function postPreview(s: string): string {\n const t = s.trim()\n return t.length > 72 ? `${t.slice(0, 72)}…` : t || '—'\n}\n\n/** Parse a user-typed datetime (ISO or local) into unix seconds; invalid → 0. */\nexport function parsePostTime(dt: string): number {\n const ms = Date.parse(dt.trim())\n return Number.isFinite(ms) && ms > 0 ? Math.floor(ms / 1000) : 0\n}\n","'use client'\n\n/**\n * PostAgenda — the calendar view: every post carrying a time, ordered and grouped\n * by local day. Pure: posts and the open handler are injected. Extracted from\n * Hanzo Social (social.hanzo.ai).\n */\nimport { useMemo } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { Calendar } from '@hanzogui/lucide-icons-2'\nimport { EmptyState } from '../EmptyState'\nimport { StatusTag } from '../StatusTag'\nimport { formatPostTime, postDayBucket, postPreview } from './format'\nimport type { Post } from './api'\n\nexport function PostAgenda({ posts, onOpen }: { posts: Post[]; onOpen: (p: Post) => void }) {\n const days = useMemo(() => {\n const timed = posts\n .filter((p) => (p.scheduleAt ?? 0) > 0)\n .sort((a, b) => (a.scheduleAt ?? 0) - (b.scheduleAt ?? 0))\n const groups: { label: string; items: Post[] }[] = []\n const index = new Map<string, number>()\n for (const p of timed) {\n const { key, label } = postDayBucket(p.scheduleAt ?? 0)\n let i = index.get(key)\n if (i === undefined) {\n i = groups.length\n index.set(key, i)\n groups.push({ label, items: [] })\n }\n groups[i].items.push(p)\n }\n return groups\n }, [posts])\n\n if (days.length === 0) {\n return (\n <EmptyState\n icon={Calendar}\n title=\"Nothing on the calendar\"\n description=\"Scheduled and timed posts appear here, grouped by day. Compose a post and pick Schedule to plan ahead.\"\n />\n )\n }\n\n return (\n <YStack gap=\"$4\">\n {days.map((d) => (\n <YStack key={d.label} gap=\"$2\">\n <Text fontSize=\"$3\" fontWeight=\"500\" color=\"$color11\">\n {d.label}\n </Text>\n {d.items.map((p) => (\n <XStack\n key={p.id}\n items=\"center\"\n justify=\"space-between\"\n gap=\"$3\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n rounded=\"$4\"\n px=\"$4\"\n py=\"$3\"\n cursor=\"pointer\"\n hoverStyle={{ bg: '$color2' }}\n onPress={() => onOpen(p)}\n >\n <YStack gap=\"$1\" flex={1}>\n <Text fontSize=\"$3\">{postPreview(p.content)}</Text>\n <XStack gap=\"$2\" items=\"center\">\n <Text fontSize=\"$1\" color=\"$color10\">\n {p.channel}\n </Text>\n <Text fontSize=\"$1\" color=\"$color10\">\n · {formatPostTime(p.scheduleAt ?? 0)}\n </Text>\n </XStack>\n </YStack>\n <StatusTag status={p.status} />\n </XStack>\n ))}\n </YStack>\n ))}\n </YStack>\n )\n}\n","'use client'\n\n/**\n * PostComposer — compose one post: body, network, and the intent (save a draft,\n * schedule it, or publish now). Owns the form state, the validation, and the ONE\n * mapping from an intent to the (status, scheduleAt) the backend stores; the host\n * owns persistence. Extracted from Hanzo Social (social.hanzo.ai).\n */\nimport { useState } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { AlertTriangle } from '@hanzogui/lucide-icons-2'\nimport { FieldRow, FieldSelect, FieldText, FieldTextArea } from '../Field'\nimport { PrimaryButton } from '../PrimaryButton'\nimport { parsePostTime } from './format'\nimport type { ProviderCapability } from './api'\n\n/** Compose intents → the (status, scheduleAt) the backend stores. */\nexport const COMPOSE_MODES = ['draft', 'schedule', 'now'] as const\nexport type ComposeMode = (typeof COMPOSE_MODES)[number]\nconst COMPOSE_LABEL: Record<ComposeMode, string> = {\n draft: 'Save draft',\n schedule: 'Schedule',\n now: 'Publish now',\n}\n\n/** The writable fields of a new post — what the intent above encodes. */\nexport type PostDraft = {\n content: string\n channel: string\n status: string\n /** unix seconds; 0 = not scheduled / publish now */\n scheduleAt: number\n}\n\nexport function PostComposer({\n channels,\n providers,\n onSubmit,\n}: {\n /** The networks offered, in order; the first is the default. */\n channels: string[]\n /** Live publish-readiness, used to warn before a publish that cannot succeed. */\n providers: ProviderCapability[]\n /**\n * Persist the draft. Resolve `null` when it landed — the host then swaps this\n * panel out — or a message to surface, which keeps the panel open and editable.\n * Total by contract: the host classifies its own failures rather than throwing.\n */\n onSubmit: (draft: PostDraft, mode: ComposeMode) => Promise<string | null>\n}) {\n const [content, setContent] = useState('')\n const [channel, setChannel] = useState<string>(channels[0] ?? 'x')\n const [mode, setMode] = useState<ComposeMode>('draft')\n const [scheduleAt, setScheduleAt] = useState('')\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const cap = providers.find((p) => p.provider === channel)\n const unconfigured = (mode === 'now' || mode === 'schedule') && !!cap && !cap.credentialsConfigured\n\n const submit = async () => {\n if (!content.trim()) {\n setError('Content is required.')\n return\n }\n let status = 'draft'\n let at = 0\n if (mode === 'schedule') {\n at = parsePostTime(scheduleAt)\n if (at <= Math.floor(Date.now() / 1000)) {\n setError('Pick a future date and time to schedule.')\n return\n }\n status = 'scheduled'\n } else if (mode === 'now') {\n status = 'scheduled' // scheduled + scheduleAt 0 ⇒ the backend publishes on create\n }\n setSaving(true)\n setError(null)\n const message = await onSubmit({ content: content.trim(), channel, status, scheduleAt: at }, mode)\n // On success the host unmounts this panel, so `saving` deliberately stays set —\n // the button never flickers back to enabled on the way out.\n if (message) {\n setError(message)\n setSaving(false)\n }\n }\n\n return (\n <YStack gap=\"$3\" p=\"$4\">\n <FieldRow label=\"Content\">\n <FieldTextArea value={content} onChange={setContent} disabled={saving} />\n </FieldRow>\n <FieldRow label=\"Channel\">\n <FieldSelect value={channel} options={channels} onChange={setChannel} disabled={saving} />\n </FieldRow>\n <FieldRow label=\"When\">\n <FieldSelect\n value={mode}\n options={[...COMPOSE_MODES]}\n onChange={(v) => setMode(v as ComposeMode)}\n disabled={saving}\n />\n </FieldRow>\n {mode === 'schedule' ? (\n <FieldRow label=\"Schedule at\">\n <FieldText\n value={scheduleAt}\n onChange={setScheduleAt}\n placeholder=\"2026-07-15 09:00\"\n disabled={saving}\n />\n </FieldRow>\n ) : null}\n {unconfigured ? (\n <XStack items=\"flex-start\" gap=\"$2\">\n <AlertTriangle size={14} color=\"var(--yellow10)\" />\n <Text fontSize=\"$1\" color=\"$color10\">\n {channel} isn’t configured to publish yet — needs {cap?.missingCredentials.join(', ')}. The post is saved and\n marked failed on publish until credentials are supplied.\n </Text>\n </XStack>\n ) : null}\n {error ? (\n <Text fontSize=\"$2\" color=\"$red10\">\n {error}\n </Text>\n ) : null}\n <PrimaryButton onPress={submit} disabled={saving}>\n {saving ? 'Working…' : COMPOSE_LABEL[mode]}\n </PrimaryButton>\n </YStack>\n )\n}\n","'use client'\n\n/**\n * ProviderReadinessList — each network's LIVE publish-readiness: ready, or the\n * exact OAuth-app credentials this deployment still needs. Honest by construction\n * (it can only render what the server reported) so a connect flow never fabricates\n * a \"connected\". Extracted from Hanzo Social (social.hanzo.ai).\n */\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { AlertTriangle, CheckCircle2 } from '@hanzogui/lucide-icons-2'\nimport type { ProviderCapability } from './api'\n\nexport function ProviderReadinessList({ providers }: { providers: ProviderCapability[] }) {\n return (\n <YStack gap=\"$2\">\n <Text fontSize=\"$2\" color=\"$color10\">\n Network publish-readiness\n </Text>\n {providers.map((p) => (\n <XStack key={p.provider} items=\"center\" justify=\"space-between\" gap=\"$3\" py=\"$1\">\n <XStack items=\"center\" gap=\"$2\">\n {p.credentialsConfigured ? (\n <CheckCircle2 size={14} color=\"var(--green10)\" />\n ) : (\n <AlertTriangle size={14} color=\"var(--yellow10)\" />\n )}\n <Text fontSize=\"$2\">{p.provider}</Text>\n </XStack>\n <Text fontSize=\"$1\" color=\"$color10\">\n {p.credentialsConfigured ? 'Ready' : `needs ${p.missingCredentials.join(', ')}`}\n </Text>\n </XStack>\n ))}\n </YStack>\n )\n}\n","'use client'\n\n/**\n * SocialSummaryBar — the per-org social roll-up (posts / scheduled / published /\n * accounts) as a row of stat cells. Pure: the counts are injected. Extracted from\n * Hanzo Social (social.hanzo.ai).\n */\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport type { SocialSummary } from './api'\n\nexport function SocialSummaryBar({ summary }: { summary: SocialSummary }) {\n const cells: { label: string; value: number }[] = [\n { label: 'Posts', value: summary.posts },\n { label: 'Scheduled', value: summary.scheduled },\n { label: 'Published', value: summary.published },\n { label: 'Accounts', value: summary.accounts },\n ]\n return (\n <XStack gap=\"$3\" flexWrap=\"wrap\">\n {cells.map((c) => (\n <YStack\n key={c.label}\n gap=\"$1\"\n borderWidth={1}\n borderColor=\"$borderColor\"\n rounded=\"$4\"\n px=\"$4\"\n py=\"$3\"\n minW={140}\n >\n <Text fontSize=\"$1\" color=\"$color10\">\n {c.label}\n </Text>\n <Text fontSize=\"$6\" fontWeight=\"500\" className=\"hz-tnum\">\n {c.value}\n </Text>\n </YStack>\n ))}\n </XStack>\n )\n}\n","'use client'\n\n/**\n * ViewToggle — the list / calendar segmented control over a post collection.\n * Pure: the current view and the change handler are injected. Extracted from\n * Hanzo Social (social.hanzo.ai).\n */\nimport { Text, XStack } from '@hanzo/gui'\nimport { Calendar, List } from '@hanzogui/lucide-icons-2'\nimport type { IconLike } from '../color'\n\nexport type PostView = 'list' | 'calendar'\n\nconst OPTIONS: { id: PostView; label: string; icon: IconLike }[] = [\n { id: 'list', label: 'List', icon: List },\n { id: 'calendar', label: 'Calendar', icon: Calendar },\n]\n\nexport function ViewToggle({\n view,\n onChange,\n}: {\n view: PostView\n onChange: (v: PostView) => void\n}) {\n return (\n <XStack borderWidth={1} borderColor=\"$borderColor\" rounded=\"$4\" overflow=\"hidden\">\n {OPTIONS.map((o) => {\n const Icon = o.icon\n const active = view === o.id\n return (\n <XStack\n key={o.id}\n items=\"center\"\n gap=\"$2\"\n px=\"$3\"\n py=\"$2\"\n cursor=\"pointer\"\n bg={active ? '$color4' : 'transparent'}\n hoverStyle={{ bg: active ? '$color4' : '$color2' }}\n onPress={() => onChange(o.id)}\n >\n <Icon size={14} />\n <Text fontSize=\"$2\" fontWeight={active ? '500' : '400'}>\n {o.label}\n </Text>\n </XStack>\n )\n })}\n </XStack>\n )\n}\n","'use client'\n\n/**\n * SocialResource — the ONE Hanzo Social product, assembled from the pieces in this\n * folder and driven by the injected `/v1/social` client. Sibling of CommerceResource:\n * it owns the fetch → honest loading / empty / error lifecycle and the drawers, so a\n * host is a transport binding plus a mount, nothing more.\n *\n * Every host renders THIS — the console's Publish product (and its social.hanzo.ai\n * host-mode) and the dedicated Hanzo Social app. Before it existed the whole\n * orchestration lived in the console's own SocialModule, so a second app could only\n * copy-paste it.\n *\n * Host-agnostic: no router, no auth module, no app `~/lib`. States are honest —\n * loading, a BackendStateCard on a `/v1` failure, real empty states, and a publish\n * failure surfaced verbatim (a 503 carries the exact missing OAuth-app credentials).\n */\nimport { useCallback, useEffect, useState } from 'react'\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport { Share2, Send, Link2, Plus, RefreshCw } from '@hanzogui/lucide-icons-2'\n\nimport { BackendStateCard, classifyBackend, type BackendState } from '../BackendState'\nimport { DataTable, type Column } from '../DataTable'\nimport { EmptyState } from '../EmptyState'\nimport { FieldRow, FieldText, FieldSelect } from '../Field'\nimport { PageHeader } from '../PageHeader'\nimport { PrimaryButton } from '../PrimaryButton'\nimport { StatusTag } from '../StatusTag'\nimport { SlideOver } from '../SlideOver'\nimport { formatPostTime, postPreview } from './format'\nimport { PostAgenda } from './PostAgenda'\nimport { PostComposer, type ComposeMode, type PostDraft } from './PostComposer'\nimport { ProviderReadinessList } from './ProviderReadinessList'\nimport { SocialSummaryBar } from './SocialSummaryBar'\nimport { ViewToggle, type PostView } from './ViewToggle'\nimport {\n PROVIDERS,\n type Account,\n type Post,\n type ProviderCapability,\n type SocialApi,\n type SocialSummary,\n} from './api'\n\ntype Async<T> =\n | { phase: 'loading' }\n | { phase: 'error'; error: BackendState }\n | { phase: 'ready'; data: T }\n\ntype Data = { summary: SocialSummary; posts: Post[]; accounts: Account[]; providers: ProviderCapability[] }\n\nconst POST_COLUMNS: Column<Post>[] = [\n { key: 'content', header: 'Post', render: (p) => postPreview(p.content) },\n { key: 'channel', header: 'Channel', render: (p) => p.channel || '—' },\n { key: 'status', header: 'Status', render: (p) => <StatusTag status={p.status} /> },\n { key: 'scheduleAt', header: 'Scheduled', render: (p) => formatPostTime(p.scheduleAt) },\n]\n\nconst ACCOUNT_COLUMNS: Column<Account>[] = [\n { key: 'handle', header: 'Account', render: (a) => a.handle || '—' },\n { key: 'provider', header: 'Network', render: (a) => a.provider || '—' },\n { key: 'status', header: 'Status', render: (a) => <StatusTag status={a.status} /> },\n]\n\n/** The post detail drawer — full content + publish results + a real Publish action. */\nfunction PostDetail({ api, post, onChanged }: { api: SocialApi; post: Post; onChanged: () => void }) {\n const [publishing, setPublishing] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const canPublish = post.status === 'draft' || post.status === 'scheduled' || post.status === 'failed'\n\n const publish = async () => {\n setPublishing(true)\n setError(null)\n try {\n await api.posts.publish(post.id)\n onChanged()\n } catch (e) {\n // A 503 (not configured) carries the exact missing credentials — show it verbatim.\n setError(classifyBackend(e).message || 'Publish failed.')\n } finally {\n setPublishing(false)\n }\n }\n\n return (\n <YStack gap=\"$3\" p=\"$4\">\n <FieldRow label=\"Content\">\n <Text fontSize=\"$3\">{post.content || '—'}</Text>\n </FieldRow>\n <FieldRow label=\"Channel\">\n <Text fontSize=\"$3\">{post.channel}</Text>\n </FieldRow>\n <FieldRow label=\"Status\">\n <StatusTag status={post.status} />\n </FieldRow>\n {post.scheduleAt > 0 ? (\n <FieldRow label=\"Scheduled\">\n <Text fontSize=\"$3\">{formatPostTime(post.scheduleAt)}</Text>\n </FieldRow>\n ) : null}\n {post.media.length > 0 ? (\n <FieldRow label=\"Media\">\n <YStack gap=\"$1\">\n {post.media.map((m) => (\n <Text key={m} fontSize=\"$2\" color=\"$color11\">\n {m}\n </Text>\n ))}\n </YStack>\n </FieldRow>\n ) : null}\n {post.externalId ? (\n <FieldRow label=\"External id\">\n <Text fontSize=\"$3\" className=\"hz-tnum\">\n {post.externalId}\n </Text>\n </FieldRow>\n ) : null}\n {post.error ? (\n <FieldRow label=\"Last error\">\n <Text fontSize=\"$2\" color=\"$red10\">\n {post.error}\n </Text>\n </FieldRow>\n ) : null}\n {error ? (\n <Text fontSize=\"$2\" color=\"$red10\">\n {error}\n </Text>\n ) : null}\n {canPublish ? (\n <PrimaryButton onPress={publish} disabled={publishing} icon={<Send size={16} />}>\n {publishing ? 'Publishing…' : 'Publish now'}\n </PrimaryButton>\n ) : null}\n </YStack>\n )\n}\n\n/** The connect drawer — LIVE per-network readiness above a real account add. */\nfunction ConnectAccount({\n api,\n providers,\n onCreated,\n}: {\n api: SocialApi\n providers: ProviderCapability[]\n onCreated: () => void\n}) {\n const [provider, setProvider] = useState<string>('x')\n const [handle, setHandle] = useState('')\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const submit = async () => {\n setSaving(true)\n setError(null)\n try {\n await api.accounts.create({ provider, handle: handle.trim(), status: 'connected' })\n onCreated()\n } catch (e) {\n setError(classifyBackend(e).message || 'Failed to connect account.')\n } finally {\n setSaving(false)\n }\n }\n\n return (\n <YStack gap=\"$4\" p=\"$4\">\n <ProviderReadinessList providers={providers} />\n <YStack gap=\"$3\">\n <FieldRow label=\"Network\">\n <FieldSelect value={provider} options={[...PROVIDERS]} onChange={setProvider} disabled={saving} />\n </FieldRow>\n <FieldRow label=\"Handle\">\n <FieldText value={handle} onChange={setHandle} placeholder=\"@hanzo\" disabled={saving} />\n </FieldRow>\n {error ? (\n <Text fontSize=\"$2\" color=\"$red10\">\n {error}\n </Text>\n ) : null}\n <PrimaryButton onPress={submit} disabled={saving}>\n {saving ? 'Connecting…' : 'Connect account'}\n </PrimaryButton>\n </YStack>\n </YStack>\n )\n}\n\nexport function SocialResource({\n api,\n title = 'Publish',\n subtitle = 'Compose, schedule and publish your content across networks — per org, over the native /v1/social engine.',\n}: {\n /** The bound `/v1/social` client — `createSocialApi(<host transport>)`. */\n api: SocialApi\n title?: string\n subtitle?: string\n}) {\n const [state, setState] = useState<Async<Data>>({ phase: 'loading' })\n const [view, setView] = useState<PostView>('list')\n const [composing, setComposing] = useState(false)\n const [connecting, setConnecting] = useState(false)\n const [openPost, setOpenPost] = useState<Post | null>(null)\n\n const load = useCallback(async () => {\n setState({ phase: 'loading' })\n try {\n const [summary, posts, accounts, providers] = await Promise.all([\n api.summary(),\n api.posts.list(),\n api.accounts.list(),\n api.providers(),\n ])\n setState({ phase: 'ready', data: { summary, posts, accounts, providers } })\n } catch (e) {\n setState({ phase: 'error', error: classifyBackend(e) })\n }\n }, [api])\n\n useEffect(() => {\n void load()\n }, [load])\n\n const providers = state.phase === 'ready' ? state.data.providers : []\n const posts = state.phase === 'ready' ? state.data.posts : []\n const accounts = state.phase === 'ready' ? state.data.accounts : []\n const empty = state.phase === 'ready' && posts.length === 0 && accounts.length === 0\n\n /**\n * Persist a composed draft. Total by contract (the composer never throws): resolve\n * null when it landed, or the message to keep on screen. A publish-now whose fan-out\n * failed comes back as a `failed` post — that is a message, not a success.\n */\n const submitDraft = async (draft: PostDraft, mode: ComposeMode): Promise<string | null> => {\n try {\n const created = await api.posts.create(draft)\n if (mode === 'now' && created.status === 'failed') return created.error || 'Publish failed.'\n } catch (e) {\n return classifyBackend(e).message || 'Failed to create post.'\n }\n setComposing(false)\n void load()\n return null\n }\n\n return (\n <YStack gap=\"$4\" p=\"$4\">\n <PageHeader\n title={title}\n subtitle={subtitle}\n actions={\n <>\n <PrimaryButton onPress={() => setComposing(true)} icon={<Plus size={16} />}>\n New post\n </PrimaryButton>\n <PrimaryButton onPress={() => setConnecting(true)} icon={<Link2 size={16} />}>\n Connect account\n </PrimaryButton>\n <PrimaryButton onPress={() => void load()} icon={<RefreshCw size={16} />}>\n Refresh\n </PrimaryButton>\n </>\n }\n />\n\n {state.phase === 'error' ? (\n <BackendStateCard state={state.error} onRetry={() => void load()} />\n ) : empty ? (\n <YStack gap=\"$4\">\n {state.phase === 'ready' ? <SocialSummaryBar summary={state.data.summary} /> : null}\n <EmptyState\n icon={Share2}\n title=\"No posts or accounts yet\"\n description=\"Connect a social account, then compose, schedule and publish across X, Instagram, LinkedIn, TikTok and more.\"\n primary={{ label: 'New post', onPress: () => setComposing(true) }}\n />\n </YStack>\n ) : (\n <YStack gap=\"$5\">\n {state.phase === 'ready' ? <SocialSummaryBar summary={state.data.summary} /> : null}\n\n <YStack gap=\"$3\">\n <XStack items=\"center\" justify=\"space-between\" gap=\"$2\" flexWrap=\"wrap\">\n <XStack items=\"center\" gap=\"$2\">\n <Send size={16} />\n <Text fontSize=\"$5\" fontWeight=\"500\">\n Posts\n </Text>\n </XStack>\n <ViewToggle view={view} onChange={setView} />\n </XStack>\n\n {view === 'list' ? (\n <DataTable<Post>\n columns={POST_COLUMNS}\n rows={posts}\n loading={state.phase === 'loading'}\n empty=\"No posts yet.\"\n rowKey={(p) => p.id}\n onRowPress={(p) => setOpenPost(p)}\n />\n ) : (\n <PostAgenda posts={posts} onOpen={(p) => setOpenPost(p)} />\n )}\n </YStack>\n\n <YStack gap=\"$2\">\n <XStack items=\"center\" gap=\"$2\">\n <Link2 size={16} />\n <Text fontSize=\"$5\" fontWeight=\"500\">\n Accounts\n </Text>\n </XStack>\n <DataTable<Account>\n columns={ACCOUNT_COLUMNS}\n rows={accounts}\n loading={state.phase === 'loading'}\n empty=\"No accounts connected yet.\"\n rowKey={(a) => a.id}\n />\n </YStack>\n </YStack>\n )}\n\n <SlideOver open={composing} onClose={() => setComposing(false)} title=\"New post\" icon={Send} ariaLabel=\"New post\">\n <PostComposer channels={[...PROVIDERS]} providers={providers} onSubmit={submitDraft} />\n </SlideOver>\n <SlideOver\n open={connecting}\n onClose={() => setConnecting(false)}\n title=\"Connect account\"\n icon={Link2}\n ariaLabel=\"Connect account\"\n >\n <ConnectAccount\n api={api}\n providers={providers}\n onCreated={() => {\n setConnecting(false)\n void load()\n }}\n />\n </SlideOver>\n <SlideOver open={openPost !== null} onClose={() => setOpenPost(null)} title=\"Post\" icon={Send} ariaLabel=\"Post detail\">\n {openPost ? (\n <PostDetail\n api={api}\n post={openPost}\n onChanged={() => {\n setOpenPost(null)\n void load()\n }}\n />\n ) : null}\n </SlideOver>\n </YStack>\n )\n}\n","'use client'\n\n/**\n * ChannelBadge — the ONE way a social network is marked (brand color + glyph +\n * optional label), on @hanzo/gui primitives so it renders on web, native, and\n * desktop. Data-free / host-agnostic. Extracted from Hanzo Social (social.hanzo.ai).\n */\nimport { Text, XStack, YStack } from '@hanzo/gui'\nimport type { Provider } from './api'\n\n/** The network vocabulary is the backend's ONE ordered list (./api PROVIDERS). */\nexport type Channel = Provider\n\n/**\n * A known network, or whatever string the server sent. The badge renders unknown\n * values through the `x` fallback below, so the type says what it really accepts —\n * callers keep autocomplete without having to narrow a `string` field first.\n */\nexport type ChannelLike = Channel | (string & {})\n\nconst META: Record<Channel, { label: string; bg: string; fg: string; mark: string }> = {\n x: { label: 'X', bg: '#0f0f12', fg: '#e6e6ea', mark: '𝕏' },\n facebook: { label: 'Facebook', bg: '#1877f2', fg: '#ffffff', mark: 'f' },\n instagram: { label: 'Instagram', bg: '#e1306c', fg: '#ffffff', mark: 'IG' },\n linkedin: { label: 'LinkedIn', bg: '#0a66c2', fg: '#ffffff', mark: 'in' },\n tiktok: { label: 'TikTok', bg: '#111114', fg: '#25f4ee', mark: 'TT' },\n youtube: { label: 'YouTube', bg: '#ff0000', fg: '#ffffff', mark: '▶' },\n threads: { label: 'Threads', bg: '#111114', fg: '#e6e6ea', mark: '@' },\n}\n\nexport function ChannelBadge({\n channel,\n showLabel = false,\n size = 22,\n}: {\n channel: ChannelLike\n showLabel?: boolean\n size?: number\n}) {\n const m = META[channel as Channel] ?? META.x\n return (\n <XStack items=\"center\" gap=\"$2\">\n <YStack\n width={size}\n height={size}\n items=\"center\"\n justify=\"center\"\n rounded=\"$2\"\n bg={m.bg as never}\n >\n <Text fontSize=\"$1\" fontWeight=\"800\" color={m.fg as never}>\n {m.mark}\n </Text>\n </YStack>\n {showLabel ? (\n <Text fontSize=\"$3\" color=\"$color12\">\n {m.label}\n </Text>\n ) : null}\n </XStack>\n )\n}\n","'use client'\n\n/**\n * CampaignCard — one marketing campaign (name, channel, lifecycle, budget/spend\n * bar). Pure: all data via props. Reuses the shared StatusTag for the lifecycle\n * pill (one status vocabulary). Extracted from Hanzo Social.\n */\nimport { Card, Text, XStack, YStack } from '@hanzo/gui'\nimport { StatusTag } from '../StatusTag'\n\nexport type Campaign = {\n id: string\n name: string\n channel: string\n status: string\n objective?: string\n /** minor units (cents) */\n budget: number\n spend: number\n}\n\nconst money = (cents: number) => `$${Math.round((cents || 0) / 100).toLocaleString()}`\n\nexport function CampaignCard({ campaign }: { campaign: Campaign }) {\n const pct =\n campaign.budget > 0 ? Math.min(100, (campaign.spend / campaign.budget) * 100) : 0\n return (\n <Card p=\"$4\" gap=\"$3\" borderWidth={1} borderColor=\"$borderColor\" width=\"100%\">\n <XStack items=\"flex-start\" justify=\"space-between\" gap=\"$2\">\n <YStack gap=\"$1\">\n <Text fontSize=\"$4\" fontWeight=\"700\">\n {campaign.name}\n </Text>\n <Text fontSize=\"$2\" color=\"$color11\">\n {campaign.channel}\n </Text>\n </YStack>\n <StatusTag status={campaign.status} />\n </XStack>\n\n {campaign.objective ? (\n <Text fontSize=\"$2\" color=\"$color11\">\n {campaign.objective}\n </Text>\n ) : null}\n\n <YStack gap=\"$1.5\">\n <XStack justify=\"space-between\">\n <Text fontSize=\"$1\" color=\"$color11\">\n {money(campaign.spend)} spent\n </Text>\n <Text fontSize=\"$1\" color=\"$color11\">\n {money(campaign.budget)} budget\n </Text>\n </XStack>\n <YStack height={6} rounded=\"$2\" bg=\"$color3\" overflow=\"hidden\">\n <YStack height={6} rounded=\"$2\" bg=\"$color9\" width={`${pct}%` as never} />\n </YStack>\n </YStack>\n </Card>\n )\n}\n","'use client'\n\n/**\n * PostCard — one social post: channel, lifecycle, body, schedule time, a media\n * count, and injected edit/delete affordances. Pure (data + handlers via props);\n * composes ChannelBadge + the shared StatusTag. Extracted from Hanzo Social.\n */\nimport { Card, Text, XStack, YStack, Button } from '@hanzo/gui'\nimport { Pencil, Trash2 } from '@hanzogui/lucide-icons-2'\nimport { StatusTag } from '../StatusTag'\nimport { ChannelBadge } from './ChannelBadge'\nimport { formatPostTime } from './format'\n// The post shape is the BACKEND's (./api, normalized off /v1/social). This file used\n// to declare a second, near-identical `Post` — exactly the drift this package exists\n// to stop.\nimport type { Post } from './api'\n\nexport function PostCard({\n post,\n onEdit,\n onDelete,\n}: {\n post: Post\n onEdit?: (p: Post) => void\n onDelete?: (p: Post) => void\n}) {\n const mediaCount = post.media?.length ?? 0\n return (\n <Card p=\"$3\" gap=\"$2.5\" borderWidth={1} borderColor=\"$borderColor\" width=\"100%\">\n <XStack items=\"center\" justify=\"space-between\" gap=\"$2\">\n <XStack items=\"center\" gap=\"$2\">\n <ChannelBadge channel={post.channel} />\n <StatusTag status={post.status} />\n </XStack>\n <XStack gap=\"$1\">\n {onEdit ? (\n <Button size=\"$2\" chromeless icon={<Pencil size={15} />} onPress={() => onEdit(post)} />\n ) : null}\n {onDelete ? (\n <Button size=\"$2\" chromeless icon={<Trash2 size={15} />} onPress={() => onDelete(post)} />\n ) : null}\n </XStack>\n </XStack>\n\n <Text fontSize=\"$3\" color=\"$color12\">\n {post.content}\n </Text>\n\n <XStack items=\"center\" justify=\"space-between\" gap=\"$2\">\n {post.scheduleAt ? (\n <Text fontSize=\"$1\" color=\"$color11\">\n {formatPostTime(post.scheduleAt)}\n </Text>\n ) : (\n <YStack />\n )}\n {mediaCount ? (\n <Text fontSize=\"$1\" color=\"$color10\">\n {mediaCount} media\n </Text>\n ) : null}\n </XStack>\n </Card>\n )\n}\n"]}