@hanzo/ui 8.0.24 → 8.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +59 -0
- package/dist/chunk-3NG33DV2.cjs +607 -0
- package/dist/chunk-3NG33DV2.cjs.map +1 -0
- package/dist/chunk-5CZOYONP.js +343 -0
- package/dist/chunk-5CZOYONP.js.map +1 -0
- package/dist/{chunk-P2P6ST6J.js → chunk-7ZNK6JSS.js} +9 -394
- package/dist/chunk-7ZNK6JSS.js.map +1 -0
- package/dist/chunk-GVCOAJLO.js +397 -0
- package/dist/chunk-GVCOAJLO.js.map +1 -0
- package/dist/chunk-GWNNLYX4.cjs +353 -0
- package/dist/chunk-GWNNLYX4.cjs.map +1 -0
- package/dist/{chunk-NBZDIMP3.cjs → chunk-ONVERVFG.cjs} +33 -438
- package/dist/chunk-ONVERVFG.cjs.map +1 -0
- package/dist/chunk-P2QU5MN5.js +555 -0
- package/dist/chunk-P2QU5MN5.js.map +1 -0
- package/dist/chunk-WHJR5S4L.cjs +418 -0
- package/dist/chunk-WHJR5S4L.cjs.map +1 -0
- package/dist/framework/CollectionBuilder.d.ts +12 -0
- package/dist/framework/CollectionsBrowser.d.ts +26 -19
- package/dist/framework/DocTypeRecords.d.ts +31 -11
- package/dist/framework/MediaGrid.d.ts +42 -0
- package/dist/framework/RecordCards.d.ts +35 -0
- package/dist/framework/builder-logic.d.ts +76 -0
- package/dist/framework/client.d.ts +31 -44
- package/dist/framework/core.cjs +213 -0
- package/dist/framework/core.cjs.map +1 -0
- package/dist/framework/core.d.ts +6 -0
- package/dist/framework/core.js +4 -0
- package/dist/framework/core.js.map +1 -0
- package/dist/framework/data.d.ts +2 -2
- package/dist/framework/fields.d.ts +47 -4
- package/dist/framework/index.cjs +1340 -0
- package/dist/framework/index.cjs.map +1 -0
- package/dist/framework/index.d.ts +9 -23
- package/dist/framework/index.js +1119 -0
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/media.d.ts +53 -0
- package/dist/framework/parts.d.ts +74 -0
- package/dist/framework/responsive.d.ts +41 -0
- package/dist/framework/types.d.ts +13 -7
- package/dist/product/SelectMenu.d.ts +13 -1
- package/dist/product/index.cjs +2061 -336
- package/dist/product/index.cjs.map +1 -1
- package/dist/product/index.js +1909 -3
- package/dist/product/index.js.map +1 -1
- package/dist/product/social/index.cjs +17 -16
- package/dist/product/social/index.js +3 -2
- package/package.json +11 -5
- package/dist/chunk-2BM42AZR.cjs +0 -2301
- package/dist/chunk-2BM42AZR.cjs.map +0 -1
- package/dist/chunk-7P7R7FC5.js +0 -2231
- package/dist/chunk-7P7R7FC5.js.map +0 -1
- package/dist/chunk-NBZDIMP3.cjs.map +0 -1
- package/dist/chunk-P2P6ST6J.js.map +0 -1
- package/dist/framework/Loader.d.ts +0 -4
- package/dist/framework.cjs +0 -760
- package/dist/framework.cjs.map +0 -1
- package/dist/framework.d.ts +0 -1
- package/dist/framework.js +0 -730
- package/dist/framework.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/product/DataTable.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":["jsx","YStack","XStack","useEmit","jsxs","ChevronsUpDown","ChevronUp","ChevronDown","Text","useRef","useEffect","Fragment","Button","X","ScrollView","useMemo","EmptyState","Calendar","useState","FieldRow","FieldTextArea","FieldSelect","FieldText","AlertTriangle","PrimaryButton","CheckCircle2","List","classifyBackend","Send","PROVIDERS","useCallback","posts","accounts","providers","PageHeader","Plus","Link2","RefreshCw","BackendStateCard","Share2","Card","Pencil","Trash2"],"mappings":"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","file":"chunk-ONVERVFG.cjs","sourcesContent":["'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\nimport { useEmit } from './instrument'\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 // Every table in the fleet reports the same two interactions with no app code.\n const track = useEmit()\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={\n sortable\n ? () => {\n track({ component: 'DataTable', action: 'sort', id: c.key, value: sort?.key === c.key && sort?.dir === 'asc' ? 'desc' : 'asc' })\n onSortChange?.(c.key)\n }\n : undefined\n }\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={\n onRowPress\n ? () => {\n track({ component: 'DataTable', action: 'select', id: rowKey(row), value: rows.length })\n onRowPress(row)\n }\n : undefined\n }\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 * 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\nimport { useEmit } from './instrument'\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 track = useEmit()\n const panelRef = useRef<HTMLElement | null>(null)\n const openerRef = useRef<Element | null>(null)\n\n // One open/close pair per drawer, keyed by its title — the shared way every\n // product reports \"a detail pane was looked at\".\n useEffect(() => {\n track({ component: 'SlideOver', action: open ? 'open' : 'close', id: typeof title === 'string' ? title : ariaLabel })\n // Only the open/close transition matters; `track` is stable per surface.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open])\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"]}
|