@toon-protocol/views 0.12.0 → 0.12.2

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.
Files changed (71) hide show
  1. package/dist/app/index.html +132 -92
  2. package/dist/app-bridge/ext-apps-bridge.d.ts.map +1 -1
  3. package/dist/app-bridge/ext-apps-bridge.js +23 -0
  4. package/dist/app-bridge/ext-apps-bridge.js.map +1 -1
  5. package/dist/app-bridge/types.d.ts +25 -0
  6. package/dist/app-bridge/types.d.ts.map +1 -1
  7. package/dist/atoms/feed.d.ts +15 -0
  8. package/dist/atoms/feed.d.ts.map +1 -0
  9. package/dist/atoms/feed.js +71 -0
  10. package/dist/atoms/feed.js.map +1 -0
  11. package/dist/atoms/interactive.d.ts.map +1 -1
  12. package/dist/atoms/interactive.js +25 -6
  13. package/dist/atoms/interactive.js.map +1 -1
  14. package/dist/atoms/live-ticker.d.ts +17 -0
  15. package/dist/atoms/live-ticker.d.ts.map +1 -0
  16. package/dist/atoms/live-ticker.js +62 -0
  17. package/dist/atoms/live-ticker.js.map +1 -0
  18. package/dist/atoms/media-gallery.d.ts +14 -0
  19. package/dist/atoms/media-gallery.d.ts.map +1 -0
  20. package/dist/atoms/media-gallery.js +86 -0
  21. package/dist/atoms/media-gallery.js.map +1 -0
  22. package/dist/atoms/media.d.ts +37 -1
  23. package/dist/atoms/media.d.ts.map +1 -1
  24. package/dist/atoms/media.js +90 -4
  25. package/dist/atoms/media.js.map +1 -1
  26. package/dist/atoms/registry.d.ts.map +1 -1
  27. package/dist/atoms/registry.js +8 -0
  28. package/dist/atoms/registry.js.map +1 -1
  29. package/dist/atoms/social-ui.d.ts.map +1 -1
  30. package/dist/atoms/social-ui.js +7 -1
  31. package/dist/atoms/social-ui.js.map +1 -1
  32. package/dist/atoms/social.d.ts +9 -1
  33. package/dist/atoms/social.d.ts.map +1 -1
  34. package/dist/atoms/social.js +24 -3
  35. package/dist/atoms/social.js.map +1 -1
  36. package/dist/atoms/thread-view.d.ts +21 -0
  37. package/dist/atoms/thread-view.d.ts.map +1 -0
  38. package/dist/atoms/thread-view.js +118 -0
  39. package/dist/atoms/thread-view.js.map +1 -0
  40. package/dist/atoms/types.d.ts +21 -0
  41. package/dist/atoms/types.d.ts.map +1 -1
  42. package/dist/atoms/types.js +3 -0
  43. package/dist/atoms/types.js.map +1 -1
  44. package/dist/catalog.d.ts.map +1 -1
  45. package/dist/catalog.js +45 -0
  46. package/dist/catalog.js.map +1 -1
  47. package/dist/engagement-budget.d.ts +68 -0
  48. package/dist/engagement-budget.d.ts.map +1 -0
  49. package/dist/engagement-budget.js +166 -0
  50. package/dist/engagement-budget.js.map +1 -0
  51. package/dist/gallery/gallery.js +27 -0
  52. package/dist/gallery/gallery.js.map +1 -1
  53. package/dist/gallery/mock-bridge.d.ts.map +1 -1
  54. package/dist/gallery/mock-bridge.js +15 -0
  55. package/dist/gallery/mock-bridge.js.map +1 -1
  56. package/dist/paging.d.ts +28 -0
  57. package/dist/paging.d.ts.map +1 -0
  58. package/dist/paging.js +36 -0
  59. package/dist/paging.js.map +1 -0
  60. package/dist/runtime.d.ts.map +1 -1
  61. package/dist/runtime.js +47 -6
  62. package/dist/runtime.js.map +1 -1
  63. package/dist/spendy-consent.d.ts +16 -1
  64. package/dist/spendy-consent.d.ts.map +1 -1
  65. package/dist/spendy-consent.js +42 -8
  66. package/dist/spendy-consent.js.map +1 -1
  67. package/dist/surface.d.ts +37 -0
  68. package/dist/surface.d.ts.map +1 -0
  69. package/dist/surface.js +64 -0
  70. package/dist/surface.js.map +1 -0
  71. package/package.json +3 -3
@@ -0,0 +1,118 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Thread atom — a focused conversation view reconstructed from NIP-10 `e`/`p`
4
+ * thread tags over the bound notes. The agent supplies a bind that resolves the
5
+ * root + its replies (a `kinds:[1]` query with the thread's `#e` filter); this
6
+ * atom turns that flat event set into a reply structure and renders it two ways:
7
+ *
8
+ * • inline — the focused note, its single direct parent (for context), and a
9
+ * bounded slice of up to {@link INLINE_REPLY_CAP} direct replies, plus a
10
+ * "View full thread (N)" affordance that escalates to the host's fullscreen
11
+ * surface (only when one is available — it simply doesn't render otherwise).
12
+ * • fullscreen — the whole depth-capped reply tree, where deeply-nested replies
13
+ * stop indenting at {@link MAX_DEPTH} and collapse to a "continue thread →"
14
+ * button that re-roots the sub-conversation at the left margin (so the tree
15
+ * never marches off the right edge of a narrow MCP-app surface).
16
+ *
17
+ * Note rows are reused from {@link NoteCard} (one note per call) so a thread reads
18
+ * exactly like the feed, with the same author header / inline media / action bar.
19
+ */
20
+ import { useState } from 'react';
21
+ import { MessagesSquare, CornerDownRight } from 'lucide-react';
22
+ import { Button } from '@/components/ui/button.js';
23
+ import { cn } from '@/lib/utils.js';
24
+ import { parseNote } from '../parsers/social.js';
25
+ import {} from '../types.js';
26
+ import {} from './types.js';
27
+ import { NoteCard } from './social.js';
28
+ /** Direct replies shown inline before the "View full thread" escalation. */
29
+ const INLINE_REPLY_CAP = 3;
30
+ /** Visual indentation cap; deeper replies collapse to a "continue thread" link. */
31
+ const MAX_DEPTH = 4;
32
+ /** Parse the bound events into notes, keeping only real kind:1 text notes. */
33
+ function threadNodes(events) {
34
+ return events
35
+ .map((event) => ({ event, note: parseNote(event) }))
36
+ .filter((n) => n.note !== null);
37
+ }
38
+ /** parentId → its direct replies, ordered oldest-first (reading order). */
39
+ function childrenByParent(nodes) {
40
+ const byId = new Set(nodes.map((n) => n.note.eventId));
41
+ const map = new Map();
42
+ for (const node of nodes) {
43
+ const parent = node.note.thread.replyToId;
44
+ // Only thread under a parent we actually hold; a reply whose parent is
45
+ // outside the bound set is treated as a root of this view.
46
+ if (parent === undefined || !byId.has(parent))
47
+ continue;
48
+ const list = map.get(parent) ?? [];
49
+ list.push(node);
50
+ map.set(parent, list);
51
+ }
52
+ for (const list of map.values())
53
+ list.sort((a, b) => a.note.createdAt - b.note.createdAt);
54
+ return map;
55
+ }
56
+ /** Total replies beneath a node (for the "continue thread (N)" count). */
57
+ function countDescendants(id, childrenMap) {
58
+ const kids = childrenMap.get(id) ?? [];
59
+ return kids.reduce((sum, k) => sum + 1 + countDescendants(k.note.eventId, childrenMap), 0);
60
+ }
61
+ /**
62
+ * One node of the fullscreen reply tree. Recurses through its children, capping
63
+ * indentation at {@link MAX_DEPTH}: at the boundary the descendants collapse to a
64
+ * "continue thread →" button which, once clicked, re-renders them at depth 0 (no
65
+ * further indent) so a long reply chain folds back to the margin instead of
66
+ * disappearing off the side.
67
+ */
68
+ const ReplyTreeNode = ({ node, childrenMap, depth, continued, onContinue, noteProps }) => {
69
+ const kids = childrenMap.get(node.note.eventId) ?? [];
70
+ const atCap = depth + 1 >= MAX_DEPTH;
71
+ const isContinued = continued.has(node.note.eventId);
72
+ return (_jsxs("div", { children: [_jsx(NoteCard, { ...noteProps, events: [node.event] }), kids.length === 0 ? null : atCap && !isContinued ? (_jsxs(Button, { variant: "ghost", size: "sm", className: "ml-3 h-7 gap-1.5 px-2 text-xs text-muted-foreground", onClick: () => onContinue(node.note.eventId), children: [_jsx(CornerDownRight, { "aria-hidden": "true", className: "size-3.5" }), "Continue thread (", countDescendants(node.note.eventId, childrenMap), ")"] })) : (_jsx("div", { className: cn(isContinued ? null : 'ml-3 border-l border-border pl-3'), children: kids.map((kid) => (_jsx(ReplyTreeNode, { node: kid, childrenMap: childrenMap,
73
+ // Re-root continued chains at 0 so indentation never exceeds the cap.
74
+ depth: isContinued ? 0 : depth + 1, continued: continued, onContinue: onContinue, noteProps: noteProps }, kid.note.eventId))) }))] }));
75
+ };
76
+ const ThreadView = (props) => {
77
+ const { events, props: nodeProps, surface } = props;
78
+ // Tracks which over-deep nodes the reader chose to "continue" (fullscreen).
79
+ const [continued, setContinued] = useState(() => new Set());
80
+ const nodes = threadNodes(events);
81
+ if (nodes.length === 0) {
82
+ return (_jsx("div", { className: "rounded-xl border border-dashed border-border px-4 py-8 text-center text-sm text-muted-foreground", children: "No thread to show." }));
83
+ }
84
+ const byId = new Map(nodes.map((n) => [n.note.eventId, n]));
85
+ const childrenMap = childrenByParent(nodes);
86
+ // Roots = notes whose parent is outside this view (or none) — the thread tops.
87
+ const roots = nodes.filter((n) => {
88
+ const parent = n.note.thread.replyToId;
89
+ return parent === undefined || !byId.has(parent);
90
+ });
91
+ // The agent may pin a specific note as the conversation's focus; otherwise the
92
+ // thread root is the focus, falling back to the first node for a flat set.
93
+ const focusId = typeof nodeProps['focusId'] === 'string' ? nodeProps['focusId'] : undefined;
94
+ const focus = (focusId ? byId.get(focusId) : undefined) ?? roots[0] ?? nodes[0];
95
+ if (!focus)
96
+ return null;
97
+ // ── Fullscreen: the whole depth-capped reply tree from every root. ──────────
98
+ if (surface?.mode === 'fullscreen') {
99
+ return (_jsx("div", { className: "flex flex-col gap-2", children: roots.map((root) => (_jsx(ReplyTreeNode, { node: root, childrenMap: childrenMap, depth: 0, continued: continued, onContinue: (id) => setContinued((prev) => new Set(prev).add(id)), noteProps: props }, root.note.eventId))) }));
100
+ }
101
+ // ── Inline: parent (context) → focus → a bounded slice of direct replies. ──
102
+ const parent = focus.note.thread.replyToId ? byId.get(focus.note.thread.replyToId) : undefined;
103
+ const directReplies = childrenMap.get(focus.note.eventId) ?? [];
104
+ const shown = directReplies.slice(0, INLINE_REPLY_CAP);
105
+ const hidden = nodes.length - (parent ? 1 : 0) - 1 - shown.length;
106
+ // We already returned above when mode === 'fullscreen', so capability is enough.
107
+ const canOpenFull = Boolean(surface?.canFullscreen);
108
+ return (_jsxs("div", { className: "flex flex-col", children: [parent ? (_jsx("div", { className: "opacity-70", children: _jsx(NoteCard, { ...props, events: [parent.event] }) })) : null, _jsx("div", { className: cn(parent ? 'ml-3 border-l-2 border-primary/40 pl-3' : null), children: _jsx(NoteCard, { ...props, events: [focus.event] }) }), shown.length > 0 ? (_jsx("div", { className: "ml-3 border-l border-border pl-3", children: shown.map((reply) => (_jsx(NoteCard, { ...props, events: [reply.event] }, reply.note.eventId))) })) : null, canOpenFull ? (_jsx("footer", { className: "mt-2", children: _jsxs(Button, { variant: "ghost", size: "sm", onClick: () => void surface?.request('fullscreen'), children: [_jsx(MessagesSquare, { "aria-hidden": "true", className: "size-4" }), "View full thread (", nodes.length, hidden > 0 ? `, ${hidden} more` : '', ")"] }) })) : null] }));
109
+ };
110
+ export const threadAtoms = [
111
+ {
112
+ id: 'thread-view',
113
+ // reply/react/follow fire on the reused note rows via the unsigned-publish tool.
114
+ writes: [{ name: 'toon_publish_unsigned' }],
115
+ Component: ThreadView,
116
+ },
117
+ ];
118
+ //# sourceMappingURL=thread-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-view.js","sourceRoot":"","sources":["../../src/atoms/thread-view.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAW,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAqB,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAmB,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAmC,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,4EAA4E;AAC5E,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,mFAAmF;AACnF,MAAM,SAAS,GAAG,CAAC,CAAC;AAQpB,8EAA8E;AAC9E,SAAS,WAAW,CAAC,MAAoB;IACvC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SACnD,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC;AAED,2EAA2E;AAC3E,SAAS,gBAAgB,CAAC,KAAmB;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAC1C,uEAAuE;QACvE,2DAA2D;QAC3D,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,SAAS;QACxD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1F,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0EAA0E;AAC1E,SAAS,gBAAgB,CAAC,EAAU,EAAE,WAAsC;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,aAAa,GAOd,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE;IACtE,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC;IACrC,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAErD,OAAO,CACL,0BACE,KAAC,QAAQ,OAAK,SAAS,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAI,EAChD,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAClD,MAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,qDAAqD,EAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAE5C,KAAC,eAAe,mBAAa,MAAM,EAAC,SAAS,EAAC,UAAU,GAAG,uBACzC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,SAC3D,CACV,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC,YACxE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,KAAC,aAAa,IAEZ,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,WAAW;oBACxB,sEAAsE;oBACtE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAClC,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,SAAS,IAPf,GAAG,CAAC,IAAI,CAAC,OAAO,CAQrB,CACH,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,UAAU,GAAwB,CAAC,KAAK,EAAE,EAAE;IAChD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACpD,4EAA4E;IAC5E,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAc,GAAG,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CACL,cAAK,SAAS,EAAC,mGAAmG,mCAE5G,CACP,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC5C,+EAA+E;IAC/E,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QACvC,OAAO,MAAM,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,2EAA2E;IAC3E,MAAM,OAAO,GAAG,OAAO,SAAS,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5F,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,+EAA+E;IAC/E,IAAI,OAAO,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;QACnC,OAAO,CACL,cAAK,SAAS,EAAC,qBAAqB,YACjC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnB,KAAC,aAAa,IAEZ,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,CAAC,EACR,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EACjE,SAAS,EAAE,KAAK,IANX,IAAI,CAAC,IAAI,CAAC,OAAO,CAOtB,CACH,CAAC,GACE,CACP,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAChE,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IAClE,iFAAiF;IACjF,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAEpD,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC3B,MAAM,CAAC,CAAC,CAAC,CACR,cAAK,SAAS,EAAC,YAAY,YACzB,KAAC,QAAQ,OAAK,KAAK,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAI,GAC3C,CACP,CAAC,CAAC,CAAC,IAAI,EACR,cAAK,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,IAAI,CAAC,YAC1E,KAAC,QAAQ,OAAK,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAI,GAC1C,EACL,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClB,cAAK,SAAS,EAAC,kCAAkC,YAC9C,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACpB,KAAC,QAAQ,OAA8B,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAApD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAsC,CACxE,CAAC,GACE,CACP,CAAC,CAAC,CAAC,IAAI,EACP,WAAW,CAAC,CAAC,CAAC,CACb,iBAAQ,SAAS,EAAC,MAAM,YACtB,MAAC,MAAM,IAAC,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,aAClF,KAAC,cAAc,mBAAa,MAAM,EAAC,SAAS,EAAC,QAAQ,GAAG,wBACrC,KAAK,CAAC,MAAM,EAC9B,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,SAC9B,GACF,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAW;IACjC;QACE,EAAE,EAAE,aAAa;QACjB,iFAAiF;QACjF,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3C,SAAS,EAAE,UAAU;KACtB;CACF,CAAC"}
@@ -8,6 +8,9 @@
8
8
  */
9
9
  import { type FC, type ReactNode } from 'react';
10
10
  import { type NostrEvent } from '../types.js';
11
+ import { type ViewBind } from '../spec.js';
12
+ import { type NostrFilterLike } from '../paging.js';
13
+ import { type DisplayModeControl } from '../surface.js';
11
14
  /**
12
15
  * Sentinel `error` value a wired spendy action returns when the user/host
13
16
  * DECLINES the consent prompt (vs. a real tool/leg failure). This is benign and
@@ -167,6 +170,24 @@ export interface AtomRenderProps {
167
170
  * older render paths / tests; treated as "no refresh yet" (mount read only).
168
171
  */
169
172
  refreshNonce?: number;
173
+ /**
174
+ * The node's `bind`, when present — lets a feed atom read its base query
175
+ * filter to page backward (the initial page is already in `events`). Wired by
176
+ * the runtime; `undefined` for unbound atoms / older render paths.
177
+ */
178
+ bind?: ViewBind;
179
+ /**
180
+ * Free paginated read seam (`toon_query`) for "load more": resolve a NIP-01
181
+ * filter to events. Atoms never call the bridge directly, so a feed pages via
182
+ * this. `undefined` in older render paths / tests that don't provide it.
183
+ */
184
+ loadMore?: (filter: NostrFilterLike) => Promise<NostrEvent[]>;
185
+ /**
186
+ * The view's surface-mode control (current mode + feature detection + a
187
+ * `request` to switch). Defaults to inline-only when the host lacks the
188
+ * capability, so a feed only offers "Open timeline" when `canFullscreen`.
189
+ */
190
+ surface?: DisplayModeControl;
170
191
  }
171
192
  /** A registered atom. */
172
193
  export interface Atom {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/atoms/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;iDAEiD;AACjD,MAAM,MAAM,UAAU,GAAG,CACvB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAGrC,aAAa,GAAG,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;AAEvD,8EAA8E;AAC9E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mEAAmE;IACnE,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,qCAAqC;IACrC,SAAS,CAAC,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,qCAAqC;IACrC,KAAK,CAAC,EAAE;QACN,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;KAC1B,CAAC;IACF,yEAAyE;IACzE,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wFAAwF;IACxF,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC3D,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,sDAAsD;IACtD,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACpC,4BAA4B;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,+EAA+E;IAC/E,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,SAAS,CAAC;IAC9C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IACvC;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5C;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAChE;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,yBAAyB;AACzB,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,8EAA8E;IAC9E,MAAM,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC9C,SAAS,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC;CAChC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/atoms/types.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,9 @@
8
8
  */
9
9
  import {} from 'react';
10
10
  import {} from '../types.js';
11
+ import {} from '../spec.js';
12
+ import {} from '../paging.js';
13
+ import {} from '../surface.js';
11
14
  /**
12
15
  * Sentinel `error` value a wired spendy action returns when the user/host
13
16
  * DECLINES the consent prompt (vs. a real tool/leg failure). This is benign and
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/atoms/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA2B,MAAM,OAAO,CAAC;AAChD,OAAO,EAAmB,MAAM,aAAa,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/atoms/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA2B,MAAM,OAAO,CAAC;AAChD,OAAO,EAAmB,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAiB,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAwB,MAAM,cAAc,CAAC;AACpD,OAAO,EAA2B,MAAM,eAAe,CAAC;AAExD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,WAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,YAAY,EAAE,QAAQ,EA6RlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAA0C,CAAC"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,sCAAsC;IACtC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,YAAY,EAAE,QAAQ,EA8UlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAA0C,CAAC"}
package/dist/catalog.js CHANGED
@@ -24,6 +24,31 @@ export const ATOM_CATALOG = [
24
24
  },
25
25
  // social
26
26
  { id: 'profile-header', description: 'NIP-01 kind:0 profile header (avatar, name, nip05, bio).', kinds: [0] },
27
+ {
28
+ id: 'feed-list',
29
+ description: 'A PAGINATED FEED/timeline: binds a kinds:[1] query and reuses note-card ' +
30
+ 'rows (reply/like, Follow in the author popover). Shows one bounded page ' +
31
+ 'with Newer/Older buttons that REPLACE the page (no internal scrollbar — ' +
32
+ 'hosts give a fixed-height card, so the feed pages instead of growing). ' +
33
+ 'Older pages are fetched on demand via a free toon_query. Use for "show ' +
34
+ 'my feed/timeline/home"; prefer this over a bare note-card for browsing a feed.',
35
+ kinds: [],
36
+ writes: [{ name: 'toon_publish_unsigned' }],
37
+ },
38
+ {
39
+ id: 'thread-view',
40
+ description: 'A focused CONVERSATION/THREAD view reconstructed from NIP-10 e/p tags: ' +
41
+ 'binds a kinds:[1] query for the root + its replies and shows the focused ' +
42
+ 'note, its single direct parent (context), and a bounded slice of direct ' +
43
+ 'replies, reusing note-card rows. Adds a "View full thread (N)" affordance ' +
44
+ 'that — where the host supports it — expands to a fullscreen depth-capped ' +
45
+ 'reply tree (deep chains collapse to "continue thread"). Use for "show this ' +
46
+ 'thread/conversation/replies". Pass an optional `focusId` to pin a specific ' +
47
+ 'note as the focus (defaults to the thread root).',
48
+ kinds: [],
49
+ writes: [{ name: 'toon_publish_unsigned' }],
50
+ propsSchema: { focusId: 'string (optional event id to focus; default = thread root)' },
51
+ },
27
52
  {
28
53
  id: 'note-card',
29
54
  description: 'NIP-01 kind:1 text note, rendered as an X-style post (author header with ' +
@@ -71,6 +96,15 @@ export const ATOM_CATALOG = [
71
96
  description: 'Render image/video streamed from Arweave (NIP-68/71/94).',
72
97
  kinds: [20, 21, 22, 1063],
73
98
  },
99
+ {
100
+ id: 'media-gallery',
101
+ description: 'An Album-style responsive GRID of media events (NIP-68 pictures, NIP-71 ' +
102
+ 'videos, NIP-94 files, or any note with NIP-92 imeta): one tile per event, ' +
103
+ 'tapping a tile opens a fullscreen lightbox with prev/next paging. Every ' +
104
+ 'image has alt text. Use for "show my photos/media/gallery" or to render a ' +
105
+ 'collection of images/videos as a grid rather than a vertical feed.',
106
+ kinds: [],
107
+ },
74
108
  {
75
109
  id: 'media-uploader',
76
110
  description: 'Compose & publish a media POST: pick a file (image, video, pdf, audio, …) ' +
@@ -88,6 +122,17 @@ export const ATOM_CATALOG = [
88
122
  captionPlaceholder: 'string (optional placeholder for the caption field)',
89
123
  },
90
124
  },
125
+ {
126
+ id: 'live-ticker',
127
+ description: 'A compact, always-on TICKER of new posts / mentions intended for the ' +
128
+ "host's Picture-in-Picture surface. Where the host supports PiP it offers a " +
129
+ '"Go live" affordance that pops the ticker into the parallel PiP surface; ' +
130
+ 'on an inline-only host it degrades to a static snapshot of recent items ' +
131
+ 'plus a "Refresh" button that re-queries the base filter. The item list is ' +
132
+ 'an aria-live region. Bind a kinds:[1] (or mentions) query; use for "keep an ' +
133
+ 'eye on mentions / new posts" or a live notifications strip.',
134
+ kinds: [],
135
+ },
91
136
  // forge
92
137
  { id: 'repo-card', description: 'NIP-34 kind:30617 repository card.', kinds: [30617] },
93
138
  {
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAkBjF,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,SAAS;IACT;QACE,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,4BAA4B,EAAE;KAC/E;IACD,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;IAC3F,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,0BAA0B,EAAE;IACvD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE,EAAE,MAAM,EAAE,sCAAsC,EAAE;KAChE;IAED,SAAS;IACT,EAAE,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,0DAA0D,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;IAC7G;QACE,EAAE,EAAE,WAAW;QACf,WAAW,EACT,0EAA0E;YAC1E,0EAA0E;YAC1E,0EAA0E;YAC1E,yEAAyE;YACzE,yEAAyE;YACzE,gFAAgF;QAClF,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;KAC5C;IACD;QACE,EAAE,EAAE,aAAa;QACjB,WAAW,EACT,yEAAyE;YACzE,2EAA2E;YAC3E,0EAA0E;YAC1E,4EAA4E;YAC5E,2EAA2E;YAC3E,6EAA6E;YAC7E,6EAA6E;YAC7E,kDAAkD;QACpD,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3C,WAAW,EAAE,EAAE,OAAO,EAAE,4DAA4D,EAAE;KACvF;IACD;QACE,EAAE,EAAE,WAAW;QACf,WAAW,EACT,2EAA2E;YAC3E,sEAAsE;YACtE,2EAA2E;YAC3E,wCAAwC;QAC1C,KAAK,EAAE,CAAC,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;KAC5C;IACD,EAAE,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,yDAAyD,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;IAC1G;QACE,EAAE,EAAE,eAAe;QACnB,WAAW,EAAE,4CAA4C;QACzD,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3C,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE;KACjC;IACD;QACE,EAAE,EAAE,UAAU;QACd,WAAW,EACT,2EAA2E;YAC3E,yEAAyE;YACzE,wEAAwE;YACxE,0EAA0E;YAC1E,4EAA4E;YAC5E,2EAA2E;YAC3E,2CAA2C;QAC7C,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAClF,WAAW,EAAE;YACX,WAAW,EAAE,QAAQ;YACrB,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,qEAAqE;SAC9E;KACF;IACD;QACE,EAAE,EAAE,aAAa;QACjB,WAAW,EACT,0EAA0E;YAC1E,yEAAyE;YACzE,2EAA2E;YAC3E,0DAA0D;QAC5D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3C,WAAW,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,+BAA+B,EAAE;KAC/E;IAED,QAAQ;IACR;QACE,EAAE,EAAE,aAAa;QACjB,WAAW,EAAE,0DAA0D;QACvE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,eAAe;QACnB,WAAW,EACT,0EAA0E;YAC1E,4EAA4E;YAC5E,0EAA0E;YAC1E,4EAA4E;YAC5E,oEAAoE;QACtE,KAAK,EAAE,EAAE;KACV;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,WAAW,EACT,4EAA4E;YAC5E,wEAAwE;YACxE,2EAA2E;YAC3E,4EAA4E;YAC5E,0EAA0E;YAC1E,kEAAkE;YAClE,wEAAwE;YACxE,mEAAmE;QACrE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC/C,WAAW,EAAE;YACX,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,4DAA4D;YACpE,kBAAkB,EAAE,qDAAqD;SAC1E;KACF;IACD;QACE,EAAE,EAAE,aAAa;QACjB,WAAW,EACT,uEAAuE;YACvE,6EAA6E;YAC7E,2EAA2E;YAC3E,0EAA0E;YAC1E,4EAA4E;YAC5E,8EAA8E;YAC9E,6DAA6D;QAC/D,KAAK,EAAE,EAAE;KACV;IAED,QAAQ;IACR,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,oCAAoC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE;IACtF;QACE,EAAE,EAAE,YAAY;QAChB,WAAW,EAAE,oDAAoD;QACjE,KAAK,EAAE,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;KAC5C;IACD,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,4DAA4D,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE;IAC3G;QACE,EAAE,EAAE,gBAAgB;QACpB,WAAW,EAAE,2DAA2D;QACxE,KAAK,EAAE,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;KAC5C;IAED,OAAO;IACP;QACE,EAAE,EAAE,cAAc;QAClB,WAAW,EACT,0EAA0E;YAC1E,sDAAsD;QACxD,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;QACrC,WAAW,EAAE,EAAE,WAAW,EAAE,8CAA8C,EAAE;KAC7E;IACD;QACE,EAAE,EAAE,WAAW;QACf,WAAW,EACT,yEAAyE;QAC3E,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3C,WAAW,EAAE;YACX,WAAW,EAAE,oCAAoC;YACjD,UAAU,EAAE,6CAA6C;YACzD,IAAI,EAAE,kCAAkC;YACxC,cAAc,EAAE,0CAA0C;YAC1D,KAAK,EAAE,8BAA8B;SACtC;KACF;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,WAAW,EACT,yEAAyE;YACzE,mDAAmD;KACtD;IAED,UAAU;IACV;QACE,EAAE,EAAE,cAAc;QAClB,WAAW,EACT,sEAAsE;YACtE,4EAA4E;YAC5E,0DAA0D;QAC5D,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3C,WAAW,EAAE;YACX,MAAM,EAAE,uCAAuC;YAC/C,KAAK,EAAE,oDAAoD;YAC3D,KAAK,EAAE,gDAAgD;SACxD;KACF;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,WAAW,EACT,4EAA4E;YAC5E,2EAA2E;YAC3E,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;QAC7E,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;QAC3C,WAAW,EAAE;YACX,KAAK,EAAE,qCAAqC;SAC7C;KACF;IAED,4EAA4E;IAC5E,+EAA+E;IAC/E,sEAAsE;IACtE;QACE,EAAE,EAAE,SAAS;QACb,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,sCAAsC,EAAE;KAC/E;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,oCAAoC;QACjD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,mCAAmC,EAAE;KAC5E;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACX,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,sDAAsD;SAC7D;KACF;IACD;QACE,EAAE,EAAE,WAAW;QACf,WAAW,EAAE,qFAAqF;QAClG,WAAW,EAAE,EAAE,IAAI,EAAE,6CAA6C,EAAE;KACrE;IACD;QACE,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,sBAAsB;QACnC,WAAW,EAAE;YACX,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,sDAAsD;SAC7D;KACF;IAED,mCAAmC;IACnC;QACE,EAAE,EAAE,eAAe;QACnB,WAAW,EACT,wEAAwE;YACxE,2EAA2E;YAC3E,2EAA2E;YAC3E,iFAAiF;KACpF;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E;QACE,EAAE,EAAE,iBAAiB;QACrB,WAAW,EACT,yEAAyE;YACzE,sEAAsE;YACtE,8EAA8E;YAC9E,sEAAsE;QACxE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;KACrC;IACD;QACE,EAAE,EAAE,cAAc;QAClB,WAAW,EACT,8EAA8E;YAC9E,2EAA2E;YAC3E,iEAAiE;KACpE;IACD;QACE,EAAE,EAAE,cAAc;QAClB,WAAW,EACT,8EAA8E;YAC9E,qEAAqE;YACrE,0EAA0E;QAC5E,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KACzD;IACD;QACE,EAAE,EAAE,eAAe;QACnB,WAAW,EACT,wEAAwE;YACxE,4EAA4E;YAC5E,0EAA0E;YAC1E,uDAAuD;QACzD,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,IAAI,EAAE;YAC5C,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE;SAC9C;KACF;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,kEAAkE;IAClE;QACE,EAAE,EAAE,UAAU;QACd,WAAW,EACT,sEAAsE;YACtE,wEAAwE;QAC1E,WAAW,EAAE;YACX,OAAO,EAAE,+CAA+C;YACxD,KAAK,EAAE,sDAAsD;YAC7D,KAAK,EAAE,2CAA2C;SACnD;KACF;IACD;QACE,EAAE,EAAE,SAAS;QACb,WAAW,EACT,wEAAwE;YACxE,6EAA6E;QAC/E,WAAW,EAAE;YACX,OAAO,EAAE,gCAAgC;YACzC,IAAI,EAAE,+BAA+B;SACtC;KACF;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,WAAW,EACT,4EAA4E;YAC5E,2EAA2E;YAC3E,+CAA+C;QACjD,WAAW,EAAE;YACX,KAAK,EAAE,iCAAiC;YACxC,MAAM,EAAE,4CAA4C;YACpD,KAAK,EAAE,mDAAmD;SAC3D;KACF;IAED,WAAW;IACX,EAAE,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,oEAAoE,EAAE;CAC3G,CAAC;AAEF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Engagement spend-budget — a pre-authorized session allowance for cheap
3
+ * micro-writes.
4
+ *
5
+ * Social engagement on TOON (like = kind:7, follow = kind:3, repost = kind:6) is
6
+ * a paid write: each one settles a payment-channel claim. Showing the full
7
+ * per-action {@link ConsentProvider} prompt before every like is far too heavy
8
+ * for a high-frequency action. So engagement uses a PRE-AUTHORIZED BUDGET: the
9
+ * user approves a small allowance ONCE per session, then likes/follows debit a
10
+ * local counter SILENTLY (no modal) until it runs out — at which point we
11
+ * re-prompt to top up. Larger writes (compose/post, upload, swap, channel ops)
12
+ * keep their per-action consent; the budget governs ONLY engagement micro-writes.
13
+ *
14
+ * This layers OVER {@link ConsentProvider}: it reuses the same `toon_status`
15
+ * read seam for the live fee/asset, and falls back to the per-action consent gate
16
+ * when the fee can't be read (so a spend is never silently auto-approved on a
17
+ * stale/unknown fee). The allowance lives in React state only — it never
18
+ * persists across reloads, so a stale session can't silently keep spending.
19
+ */
20
+ import { type FC, type ReactNode } from 'react';
21
+ import type { AtomStatus } from './atoms/types.js';
22
+ import { type ConsentGate } from './spendy-consent.js';
23
+ /**
24
+ * How many engagement micro-writes one authorization covers: the allowance is
25
+ * `feePerEvent × this`. A small, comprehensible bucket ("up to ~20 likes /
26
+ * follows") rather than an open-ended grant. Exported so tests can drive the
27
+ * exhaustion boundary without hardcoding the count.
28
+ */
29
+ export declare const ENGAGEMENT_BUDGET_EVENTS = 20;
30
+ /**
31
+ * Gate an engagement micro-write against the session budget. Same shape as
32
+ * {@link ConsentGate} so it drops into the runtime's action wiring in place of
33
+ * the per-action consent: resolves `true` to proceed (debited), `false` to
34
+ * decline. Unlike the consent gate it is usually SILENT — it only renders a
35
+ * prompt on the first authorization and on a top-up after exhaustion.
36
+ */
37
+ export type EngagementGate = ConsentGate;
38
+ /** The session budget snapshot a UI affordance reads (the engagement-bar meter). */
39
+ export interface EngagementBudgetState {
40
+ /** True once the user has authorized an allowance this session. */
41
+ authorized: boolean;
42
+ /** Remaining spend, in base (micro) units. */
43
+ remaining: number;
44
+ /** The full allowance granted, in base (micro) units. */
45
+ total: number;
46
+ /** Human asset code (e.g. `'USDC'`), when known. */
47
+ asset?: string;
48
+ /** The per-event engagement fee, in base units, when known. */
49
+ feePerEvent?: number;
50
+ /** Open the (re-)authorization prompt to top the budget back up. */
51
+ requestTopUp: () => void;
52
+ }
53
+ /** The gate the runtime routes engagement micro-writes through. */
54
+ export declare function useEngagementGate(): EngagementGate;
55
+ /** Read the live session budget (for the engagement-bar affordance). */
56
+ export declare function useEngagementBudget(): EngagementBudgetState;
57
+ /**
58
+ * Mounts the engagement-budget layer and provides the {@link EngagementGate}
59
+ * plus the {@link EngagementBudgetState}. Must sit INSIDE a
60
+ * {@link ConsentProvider} so it can fall back to the per-action consent gate when
61
+ * the fee is unavailable. `readStatus` is the same live `toon_status` seam the
62
+ * consent modal uses — atoms never call the bridge directly.
63
+ */
64
+ export declare const BudgetProvider: FC<{
65
+ children: ReactNode;
66
+ readStatus?: () => Promise<AtomStatus>;
67
+ }>;
68
+ //# sourceMappingURL=engagement-budget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engagement-budget.d.ts","sourceRoot":"","sources":["../src/engagement-budget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAOL,KAAK,EAAE,EACP,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAEL,KAAK,WAAW,EAEjB,MAAM,qBAAqB,CAAC;AAE7B;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC;AAEzC,oFAAoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,UAAU,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAUD,mEAAmE;AACnE,wBAAgB,iBAAiB,IAAI,cAAc,CAElD;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,IAAI,qBAAqB,CAE3D;AAkBD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;CACxC,CAiLA,CAAC"}
@@ -0,0 +1,166 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Engagement spend-budget — a pre-authorized session allowance for cheap
4
+ * micro-writes.
5
+ *
6
+ * Social engagement on TOON (like = kind:7, follow = kind:3, repost = kind:6) is
7
+ * a paid write: each one settles a payment-channel claim. Showing the full
8
+ * per-action {@link ConsentProvider} prompt before every like is far too heavy
9
+ * for a high-frequency action. So engagement uses a PRE-AUTHORIZED BUDGET: the
10
+ * user approves a small allowance ONCE per session, then likes/follows debit a
11
+ * local counter SILENTLY (no modal) until it runs out — at which point we
12
+ * re-prompt to top up. Larger writes (compose/post, upload, swap, channel ops)
13
+ * keep their per-action consent; the budget governs ONLY engagement micro-writes.
14
+ *
15
+ * This layers OVER {@link ConsentProvider}: it reuses the same `toon_status`
16
+ * read seam for the live fee/asset, and falls back to the per-action consent gate
17
+ * when the fee can't be read (so a spend is never silently auto-approved on a
18
+ * stale/unknown fee). The allowance lives in React state only — it never
19
+ * persists across reloads, so a stale session can't silently keep spending.
20
+ */
21
+ import { createContext, useCallback, useContext, useMemo, useRef, useState, } from 'react';
22
+ import { Coins } from 'lucide-react';
23
+ import { Button } from '@/components/ui/button.js';
24
+ import { useConsentGate, } from './spendy-consent.js';
25
+ /**
26
+ * How many engagement micro-writes one authorization covers: the allowance is
27
+ * `feePerEvent × this`. A small, comprehensible bucket ("up to ~20 likes /
28
+ * follows") rather than an open-ended grant. Exported so tests can drive the
29
+ * exhaustion boundary without hardcoding the count.
30
+ */
31
+ export const ENGAGEMENT_BUDGET_EVENTS = 20;
32
+ const EngagementGateContext = createContext(() => Promise.resolve(true));
33
+ const EngagementBudgetContext = createContext({
34
+ authorized: false,
35
+ remaining: 0,
36
+ total: 0,
37
+ requestTopUp: () => { },
38
+ });
39
+ /** The gate the runtime routes engagement micro-writes through. */
40
+ export function useEngagementGate() {
41
+ return useContext(EngagementGateContext);
42
+ }
43
+ /** Read the live session budget (for the engagement-bar affordance). */
44
+ export function useEngagementBudget() {
45
+ return useContext(EngagementBudgetContext);
46
+ }
47
+ /**
48
+ * Mounts the engagement-budget layer and provides the {@link EngagementGate}
49
+ * plus the {@link EngagementBudgetState}. Must sit INSIDE a
50
+ * {@link ConsentProvider} so it can fall back to the per-action consent gate when
51
+ * the fee is unavailable. `readStatus` is the same live `toon_status` seam the
52
+ * consent modal uses — atoms never call the bridge directly.
53
+ */
54
+ export const BudgetProvider = ({ children, readStatus }) => {
55
+ // Per-action consent fallback (fee unavailable) — provided by the enclosing
56
+ // ConsentProvider, so a spend is never auto-approved on an unknown fee.
57
+ const consentGate = useConsentGate();
58
+ // The counter is held in a ref (authoritative, read/written synchronously in
59
+ // the gate so rapid clicks debit correctly) with a state mirror that drives
60
+ // the affordance re-render. Both are React state only → reset on reload.
61
+ const allowanceRef = useRef(null);
62
+ const [allowance, setAllowanceState] = useState(null);
63
+ const setAllowance = useCallback((next) => {
64
+ allowanceRef.current = next;
65
+ setAllowanceState(next);
66
+ }, []);
67
+ const [prompt, setPrompt] = useState(null);
68
+ const resolverRef = useRef(null);
69
+ // Cache the fee/asset for the session (engagement fee doesn't change mid-flow).
70
+ const statusRef = useRef(null);
71
+ const readFee = useCallback(async () => {
72
+ if (statusRef.current)
73
+ return statusRef.current;
74
+ if (!readStatus)
75
+ return null;
76
+ try {
77
+ const s = await readStatus();
78
+ const fee = Number(s.feePerEvent);
79
+ // A non-positive / non-finite fee is unusable — refuse to budget on it.
80
+ if (!Number.isFinite(fee) || fee <= 0)
81
+ return null;
82
+ const resolved = { fee, asset: s.asset };
83
+ statusRef.current = resolved;
84
+ return resolved;
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }, [readStatus]);
90
+ const settle = useCallback((ok) => {
91
+ const resolve = resolverRef.current;
92
+ resolverRef.current = null;
93
+ setPrompt(null);
94
+ resolve?.(ok);
95
+ }, []);
96
+ // Open the (re-)authorization prompt. `onConfirm` applies the budget change
97
+ // (debit-this-action vs. refill) when the user approves.
98
+ const openPrompt = useCallback((mode, fee, asset, onConfirm) => {
99
+ // A new prompt supersedes any in-flight one (decline the stale request).
100
+ resolverRef.current?.(false);
101
+ resolverRef.current = (ok) => {
102
+ if (ok)
103
+ onConfirm();
104
+ };
105
+ setPrompt({ mode, fee, asset, allowance: fee * ENGAGEMENT_BUDGET_EVENTS });
106
+ }, []);
107
+ const requestEngagement = useCallback((message, opts) => new Promise((resolve) => {
108
+ void readFee().then((status) => {
109
+ if (!status) {
110
+ // No reliable fee → fall back to the full per-action consent rather
111
+ // than silently spending against an unknown amount.
112
+ void consentGate(message, opts).then(resolve);
113
+ return;
114
+ }
115
+ const { fee, asset } = status;
116
+ const cur = allowanceRef.current;
117
+ if (cur && cur.remaining >= fee) {
118
+ // Silent debit — the whole point of the budget. No modal.
119
+ setAllowance({ ...cur, remaining: cur.remaining - fee });
120
+ resolve(true);
121
+ return;
122
+ }
123
+ // First authorization (no allowance) or exhausted (top-up): prompt,
124
+ // then on approval grant the allowance and debit THIS action.
125
+ const total = fee * ENGAGEMENT_BUDGET_EVENTS;
126
+ const mode = cur ? 'topup' : 'authorize';
127
+ // Replace the superseding resolver so it resolves THIS gate promise.
128
+ resolverRef.current?.(false);
129
+ resolverRef.current = (ok) => {
130
+ if (ok)
131
+ setAllowance({ total, remaining: total - fee, fee, asset });
132
+ resolve(ok);
133
+ };
134
+ setPrompt({ mode, fee, asset, allowance: total });
135
+ });
136
+ }), [readFee, consentGate, setAllowance]);
137
+ const requestTopUp = useCallback(() => {
138
+ void readFee().then((status) => {
139
+ if (!status)
140
+ return;
141
+ const { fee, asset } = status;
142
+ const total = fee * ENGAGEMENT_BUDGET_EVENTS;
143
+ const mode = allowanceRef.current ? 'topup' : 'authorize';
144
+ // A manual top-up refills to the full allowance — no action is pending, so
145
+ // nothing is debited here.
146
+ openPrompt(mode, fee, asset, () => setAllowance({ total, remaining: total, fee, asset }));
147
+ });
148
+ }, [readFee, openPrompt, setAllowance]);
149
+ const budgetState = useMemo(() => ({
150
+ authorized: allowance !== null,
151
+ remaining: allowance?.remaining ?? 0,
152
+ total: allowance?.total ?? 0,
153
+ ...(allowance?.asset ? { asset: allowance.asset } : {}),
154
+ ...(allowance ? { feePerEvent: allowance.fee } : {}),
155
+ requestTopUp,
156
+ }), [allowance, requestTopUp]);
157
+ const assetSuffix = prompt?.asset ? ` ${prompt.asset}` : '';
158
+ const isTopUp = prompt?.mode === 'topup';
159
+ return (_jsx(EngagementGateContext.Provider, { value: requestEngagement, children: _jsxs(EngagementBudgetContext.Provider, { value: budgetState, children: [children, prompt !== null ? (_jsx("div", { role: "dialog", "aria-modal": "true", "aria-label": "Engagement budget",
160
+ // Top-anchored, matching the consent modal — the host gives MCP apps
161
+ // a tall fixed-height iframe, so a centered overlay lands off-screen.
162
+ className: "fixed inset-0 z-50 flex items-start justify-center bg-background/80 p-4 pt-6 backdrop-blur-sm", children: _jsxs("div", { className: "w-full max-w-sm overflow-hidden rounded-xl border border-border bg-card shadow-lg", children: [_jsxs("div", { className: "flex items-center gap-2 border-b border-border px-4 py-3", children: [_jsx(Coins, { "aria-hidden": "true", className: "size-4 text-primary" }), _jsx("span", { className: "text-sm font-semibold", children: isTopUp ? 'Engagement budget used up' : 'Allow engagement spending' })] }), _jsxs("div", { className: "flex flex-col gap-2.5 px-4 py-3", children: [_jsx("p", { className: "text-sm text-muted-foreground", children: isTopUp
163
+ ? 'Your likes & follows budget for this session is spent.'
164
+ : 'Approve a small allowance for likes & follows this session, so they go through without a prompt each time.' }), _jsxs("dl", { className: "flex flex-wrap items-center gap-x-6 gap-y-1 text-xs", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("dt", { className: "text-muted-foreground", children: "Allowance" }), _jsx("dd", { className: "font-medium tabular-nums", children: `${prompt.allowance}${assetSuffix}` })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("dt", { className: "text-muted-foreground", children: "Per like / follow" }), _jsx("dd", { className: "font-medium tabular-nums", children: `${prompt.fee}${assetSuffix}` })] })] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Engagement spends are", ' ', _jsx("span", { className: "text-foreground/80", children: "non-refundable" }), ". We debit this allowance silently until it runs out, then ask again."] })] }), _jsxs("div", { className: "flex justify-end gap-2 border-t border-border px-4 py-2.5", children: [_jsx(Button, { variant: "outline", size: "sm", onClick: () => settle(false), children: "Cancel" }), _jsxs(Button, { size: "sm", onClick: () => settle(true), children: [_jsx(Coins, { "aria-hidden": "true" }), isTopUp ? 'Re-authorize' : 'Allow'] })] })] }) })) : null] }) }));
165
+ };
166
+ //# sourceMappingURL=engagement-budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engagement-budget.js","sourceRoot":"","sources":["../src/engagement-budget.tsx"],"names":[],"mappings":"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"}
@@ -23,6 +23,33 @@ import { PK, CHANNELS, SWAP_PAIR, SETTLEMENT_RECEIPT } from './fixtures.js';
23
23
  const bridge = createMockBridge();
24
24
  /** Extra specs covering atoms the reference examples don't surface. */
25
25
  const EXTRA = [
26
+ {
27
+ name: 'feed-list (+ composer)',
28
+ description: 'Browsable timeline slice with a composer on top — the "show my feed" view.',
29
+ spec: {
30
+ title: 'Feed',
31
+ root: {
32
+ atom: 'stack',
33
+ props: { gap: 3 },
34
+ children: [
35
+ {
36
+ atom: 'composer',
37
+ props: { placeholder: "What's happening?", label: 'Post' },
38
+ actions: { post: { tool: PUBLISH_TOOL, args: { kind: 1 } } },
39
+ },
40
+ {
41
+ atom: 'feed-list',
42
+ bind: { query: { kinds: [1] }, sort: 'desc' },
43
+ actions: {
44
+ reply: { tool: PUBLISH_TOOL, args: { kind: 1 } },
45
+ react: { tool: PUBLISH_TOOL, args: { kind: 7 } },
46
+ follow: { tool: PUBLISH_TOOL, args: { kind: 3 } },
47
+ },
48
+ },
49
+ ],
50
+ },
51
+ },
52
+ },
26
53
  {
27
54
  name: 'wallet-overview',
28
55
  description: 'Per-chain address (copy-to-share) + live balance + devnet faucet.',