@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
@@ -1 +1 @@
1
- {"version":3,"file":"ext-apps-bridge.d.ts","sourceRoot":"","sources":["../../src/app-bridge/ext-apps-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAG1D,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAoB/D,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CA0CxD"}
1
+ {"version":3,"file":"ext-apps-bridge.d.ts","sourceRoot":"","sources":["../../src/app-bridge/ext-apps-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAG1D,OAAO,EAAsC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAoBjF,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU,CAqExD"}
@@ -72,6 +72,29 @@ export function createExtAppsBridge(app) {
72
72
  app.ontoolresult = undefined;
73
73
  };
74
74
  },
75
+ availableDisplayModes() {
76
+ return app.getHostContext()?.availableDisplayModes ?? [];
77
+ },
78
+ displayMode() {
79
+ return app.getHostContext()?.displayMode ?? 'inline';
80
+ },
81
+ async requestDisplayMode(mode) {
82
+ const result = await app.requestDisplayMode({ mode });
83
+ return result.mode;
84
+ },
85
+ onHostContextChanged(cb) {
86
+ // `onhostcontextchanged` is a single settable callback, so CHAIN over any
87
+ // existing handler (e.g. app-entry's theme follower) rather than clobber
88
+ // it, and restore the prior handler on unsubscribe — matching app-entry.
89
+ const prev = app.onhostcontextchanged;
90
+ app.onhostcontextchanged = (ctx) => {
91
+ cb();
92
+ prev?.(ctx);
93
+ };
94
+ return () => {
95
+ app.onhostcontextchanged = prev;
96
+ };
97
+ },
75
98
  };
76
99
  }
77
100
  //# sourceMappingURL=ext-apps-bridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ext-apps-bridge.js","sourceRoot":"","sources":["../../src/app-bridge/ext-apps-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAY,MAAM,gCAAgC,CAAC;AAE1D,OAAO,EAAmB,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAqC,MAAM,YAAY,CAAC;AAE/D,SAAS,aAAa,CAAC,UAAmB;IACxC,IACE,OAAO,UAAU,KAAK,QAAQ;QAC9B,UAAU,KAAK,IAAI;QACnB,KAAK,CAAC,OAAO,CAAE,UAAmC,CAAC,MAAM,CAAC,EAC1D,CAAC;QACD,OAAQ,UAAuC,CAAC,MAAM,CAAC;IACzD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,MAAsB;IACvC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnE,MAAM,UAAU,GAAG,MAAM,CAAC,iBAAiB,CAAC;gBAC5C,MAAM,OAAO,GAAgB,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7D,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;gBACzC,IAAI,MAAM;oBAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;gBACpC,sEAAsE;gBACtE,mEAAmE;gBACnE,kEAAkE;gBAClE,uEAAuE;gBACvE,kEAAkE;gBAClE,uEAAuE;gBACvE,gEAAgE;gBAChE,uEAAuE;gBACvE,uEAAuE;gBACvE,wEAAwE;gBACxE,iDAAiD;gBACjD,IAAI,UAAU,KAAK,SAAS;oBAAE,OAAO,CAAC,IAAI,GAAG,UAAU,CAAC;gBACxD,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;oBAAE,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC;gBAC/E,OAAO,OAAO,CAAC;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAChF,CAAC;QACH,CAAC;QAED,WAAW,CAAC,IAAI;YACd,KAAK,GAAG,CAAC,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,CAAC,EAAE;YACP,GAAG,CAAC,YAAY,GAAG,CAAC,MAAsB,EAAE,EAAE;gBAC5C,MAAM,IAAI,GAAI,MAAM,CAAC,iBAAwD,EAAE,QAAQ,CAAC;gBACxF,IAAI,IAAI,KAAK,SAAS;oBAAE,EAAE,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC;YACF,OAAO,GAAG,EAAE;gBACV,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC;YAC/B,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ext-apps-bridge.js","sourceRoot":"","sources":["../../src/app-bridge/ext-apps-bridge.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,12 @@
7
7
  * to a different transport (or mcp-ui) is a one-file change here.
8
8
  */
9
9
  import { type NostrEvent } from '../types.js';
10
+ /**
11
+ * Host surface modes (mirrors the MCP-Apps `McpUiDisplayMode`). `inline` is the
12
+ * default scannable card; `fullscreen` hosts a real scrolling timeline/thread;
13
+ * `pip` runs a live ticker alongside the conversation.
14
+ */
15
+ export type DisplayMode = 'inline' | 'fullscreen' | 'pip';
10
16
  /** Normalized outcome of a server tool call. */
11
17
  export interface ToolOutcome {
12
18
  ok: boolean;
@@ -37,5 +43,24 @@ export interface ViewBridge {
37
43
  * Inject a custom function in tests to avoid real modal dialogs.
38
44
  */
39
45
  confirm?: (message: string) => Promise<boolean>;
46
+ /**
47
+ * The surface modes this host offers. Empty/omitted ⇒ assume inline-only
48
+ * (the safe default). Atoms gate "Open timeline" (fullscreen) / live tickers
49
+ * (pip) on the presence of the mode here.
50
+ */
51
+ availableDisplayModes?(): DisplayMode[];
52
+ /** The current display mode (defaults to `'inline'`). */
53
+ displayMode?(): DisplayMode;
54
+ /**
55
+ * Ask the host to switch surface mode; resolves with the mode actually set
56
+ * (which may differ from the request if the host declines).
57
+ */
58
+ requestDisplayMode?(mode: DisplayMode): Promise<DisplayMode>;
59
+ /**
60
+ * Subscribe to host-context changes (display mode, sizing, theme) so a view
61
+ * re-reads {@link displayMode}/{@link availableDisplayModes}. Returns an
62
+ * unsubscribe fn. Chains over any existing handler (it never clobbers theme).
63
+ */
64
+ onHostContextChanged?(cb: () => void): () => void;
40
65
  }
41
66
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app-bridge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,4DAA4D;IAC5D,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5E,+EAA+E;IAC/E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChD;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACjD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app-bridge/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,YAAY,GAAG,KAAK,CAAC;AAE1D,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,4DAA4D;IAC5D,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5E,+EAA+E;IAC/E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAChD;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAOhD;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,WAAW,EAAE,CAAC;IACxC,yDAAyD;IACzD,WAAW,CAAC,IAAI,WAAW,CAAC;IAC5B;;;OAGG;IACH,kBAAkB,CAAC,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC7D;;;;OAIG;IACH,oBAAoB,CAAC,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CACnD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Feed atom — a PAGINATED timeline.
3
+ *
4
+ * Claude Desktop (and hosts like it) give the app a fixed-height iframe and
5
+ * SCROLL the overflow rather than growing the iframe to fit content. An
6
+ * append-style "load more" feed therefore always grew into an internal
7
+ * scrollbar. Instead we show one bounded PAGE of notes and REPLACE it with the
8
+ * next/previous page — the rendered height stays roughly constant, so the feed
9
+ * never grows into a scroll. Older pages are fetched on demand via a free
10
+ * paginated `toon_query` (NIP-01 `until`); already-fetched pages page back
11
+ * instantly.
12
+ */
13
+ import { type Atom } from './types.js';
14
+ export declare const feedAtoms: Atom[];
15
+ //# sourceMappingURL=feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/atoms/feed.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAE,KAAK,IAAI,EAAwB,MAAM,YAAY,CAAC;AAgF7D,eAAO,MAAM,SAAS,EAAE,IAAI,EAA+C,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Feed atom — a PAGINATED timeline.
4
+ *
5
+ * Claude Desktop (and hosts like it) give the app a fixed-height iframe and
6
+ * SCROLL the overflow rather than growing the iframe to fit content. An
7
+ * append-style "load more" feed therefore always grew into an internal
8
+ * scrollbar. Instead we show one bounded PAGE of notes and REPLACE it with the
9
+ * next/previous page — the rendered height stays roughly constant, so the feed
10
+ * never grows into a scroll. Older pages are fetched on demand via a free
11
+ * paginated `toon_query` (NIP-01 `until`); already-fetched pages page back
12
+ * instantly.
13
+ */
14
+ import { useState } from 'react';
15
+ import { ChevronLeft, ChevronRight, Loader2 } from 'lucide-react';
16
+ import { Button } from '@/components/ui/button.js';
17
+ import {} from '../types.js';
18
+ import { mergePage, nextPageFilter } from '../paging.js';
19
+ import {} from './types.js';
20
+ import { NoteCard } from './social.js';
21
+ /** Notes per page — bounded so a page fits the host card without scrolling. */
22
+ const PAGE_SIZE = 5;
23
+ const FeedList = (props) => {
24
+ const { events, bind, loadMore } = props;
25
+ // Older pages fetched beyond the bind, merged + de-duped with the bound events.
26
+ const [extra, setExtra] = useState([]);
27
+ // Index of the current page's first note within `loaded`.
28
+ const [pageStart, setPageStart] = useState(0);
29
+ const [busy, setBusy] = useState(false);
30
+ // Set once an older fetch returns nothing new — the end of the feed.
31
+ const [exhausted, setExhausted] = useState(false);
32
+ const loaded = extra.length ? mergePage(events, extra) : events;
33
+ const baseFilter = bind?.query ?? { kinds: [1] };
34
+ const page = loaded.slice(pageStart, pageStart + PAGE_SIZE);
35
+ const hasNewer = pageStart > 0;
36
+ const hasOlderLoaded = pageStart + PAGE_SIZE < loaded.length;
37
+ const canFetchOlder = Boolean(loadMore) && !exhausted;
38
+ const canOlder = hasOlderLoaded || canFetchOlder;
39
+ const older = async () => {
40
+ if (busy)
41
+ return;
42
+ // Page through already-loaded notes first; only hit the network at the end.
43
+ if (hasOlderLoaded) {
44
+ setPageStart((s) => s + PAGE_SIZE);
45
+ return;
46
+ }
47
+ if (!loadMore || exhausted)
48
+ return;
49
+ setBusy(true);
50
+ try {
51
+ const fetched = await loadMore({ ...nextPageFilter(loaded, baseFilter), limit: PAGE_SIZE });
52
+ const fresh = fetched.filter((e) => !loaded.some((x) => x.id === e.id));
53
+ if (fresh.length === 0)
54
+ setExhausted(true);
55
+ else {
56
+ setExtra((prev) => mergePage(prev, fresh));
57
+ setPageStart((s) => s + PAGE_SIZE);
58
+ }
59
+ }
60
+ finally {
61
+ setBusy(false);
62
+ }
63
+ };
64
+ const newer = () => setPageStart((s) => Math.max(0, s - PAGE_SIZE));
65
+ if (loaded.length === 0) {
66
+ return (_jsx("div", { className: "rounded-xl border border-dashed border-border px-4 py-8 text-center text-sm text-muted-foreground", children: "No posts yet." }));
67
+ }
68
+ return (_jsxs("div", { className: "flex flex-col", children: [_jsx(NoteCard, { ...props, events: page }), hasNewer || canOlder ? (_jsxs("footer", { className: "mt-2 flex items-center justify-between gap-2 border-t border-border pt-2", children: [_jsxs(Button, { variant: "outline", size: "sm", disabled: !hasNewer, onClick: newer, children: [_jsx(ChevronLeft, { "aria-hidden": "true", className: "size-4" }), "Newer"] }), _jsxs("span", { className: "text-xs text-muted-foreground tabular-nums", children: [pageStart + 1, "\u2013", pageStart + page.length] }), _jsxs(Button, { variant: "outline", size: "sm", disabled: !canOlder || busy, onClick: () => void older(), children: [busy ? _jsx(Loader2, { "aria-hidden": "true", className: "size-4 animate-spin" }) : null, "Older", _jsx(ChevronRight, { "aria-hidden": "true", className: "size-4" })] })] })) : null] }));
69
+ };
70
+ export const feedAtoms = [{ id: 'feed-list', Component: FeedList }];
71
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/atoms/feed.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,IAAI,EAA2D,MAAM,YAAY,CAAC;AA2YhG,eAAO,MAAM,gBAAgB,EAAE,IAAI,EAQlC,CAAC"}
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,IAAI,EAA2D,MAAM,YAAY,CAAC;AAgbhG,eAAO,MAAM,gBAAgB,EAAE,IAAI,EAQlC,CAAC"}
@@ -7,7 +7,7 @@ import { Textarea } from '@/components/ui/textarea.js';
7
7
  import { MonoId } from '@/components/mono-id.js';
8
8
  import { SPENDY_CANCELLED } from './types.js';
9
9
  import { byteLength } from './social-ui.js';
10
- import { bytesToBase64 } from './media.js';
10
+ import { bytesToBase64, RelayConfirmation, usePublishConfirmation } from './media.js';
11
11
  /**
12
12
  * The shared composer surface: an auto-sizing textarea over a footer toolbar
13
13
  * that carries the byte counter (TOON fees scale with encoded bytes) and the
@@ -16,7 +16,11 @@ import { bytesToBase64 } from './media.js';
16
16
  */
17
17
  const ComposerSurface = ({ value, onChange, placeholder, actionLabel, actionIcon, disabled, onSubmit, preview, attach }) => {
18
18
  const bytes = byteLength(value);
19
- return (_jsxs("div", { className: "rounded-xl border border-border bg-card focus-within:border-ring focus-within:ring-3 focus-within:ring-ring/30", children: [preview ? _jsx("div", { className: "px-3 pt-3", children: preview }) : null, _jsx(Textarea, { value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, rows: 2, className: "min-h-14 resize-none border-0 bg-transparent px-3.5 pt-3.5 text-base focus-visible:border-0 focus-visible:ring-0 md:text-sm" }), _jsxs("div", { className: "flex items-center justify-between gap-2 border-t border-border px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [attach, _jsxs("span", { className: "font-mono text-xs text-muted-foreground tabular-nums", "aria-label": `${bytes} bytes, the unit pay-to-write fees scale with`, title: "Fees scale with encoded bytes", children: [bytes, " ", bytes === 1 ? 'byte' : 'bytes'] })] }), _jsxs(Button, { size: "sm", disabled: disabled, onClick: onSubmit, children: [actionIcon, actionLabel] })] })] }));
19
+ return (
20
+ // Inherit the host surface (no opaque slab): a bordered, faintly-lifted input
21
+ // that the focus ring defines — not a painted card that reads as a separate
22
+ // widget against the transparent feed below it.
23
+ _jsxs("div", { className: "rounded-xl border border-border bg-muted/20 focus-within:border-ring focus-within:bg-transparent focus-within:ring-3 focus-within:ring-ring/30", children: [preview ? _jsx("div", { className: "px-3 pt-3", children: preview }) : null, _jsx(Textarea, { value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, rows: 2, className: "min-h-14 resize-none border-0 bg-transparent px-3.5 pt-3.5 text-base focus-visible:border-0 focus-visible:ring-0 md:text-sm" }), _jsxs("div", { className: "flex items-center justify-between gap-2 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [attach, bytes > 0 ? (_jsxs("span", { className: "font-mono text-xs text-muted-foreground tabular-nums", "aria-label": `${bytes} bytes, the unit pay-to-write fees scale with`, title: "Fees scale with encoded bytes", children: [bytes, " ", bytes === 1 ? 'byte' : 'bytes'] })) : null] }), _jsxs(Button, { size: "sm", disabled: disabled, onClick: onSubmit, children: [actionIcon, actionLabel] })] })] }));
20
24
  };
21
25
  const Composer = ({ props, actions }) => {
22
26
  const [text, setText] = useState('');
@@ -121,7 +125,7 @@ const Tabs = ({ props, children }) => {
121
125
  ? '-mb-px border-b-2 border-primary text-foreground'
122
126
  : 'text-muted-foreground hover:text-foreground'), children: labels[i] ?? `Tab ${i + 1}` }, i))) }), _jsx("div", { children: panels[active] ?? null })] }));
123
127
  };
124
- const PayConfirm = ({ props, actions, readStatus }) => {
128
+ const PayConfirm = ({ props, actions, readStatus, loadMore }) => {
125
129
  const placeholder = typeof props['placeholder'] === 'string' ? props['placeholder'] : "What's happening?";
126
130
  const label = typeof props['label'] === 'string' ? props['label'] : 'Pay to post';
127
131
  const [text, setText] = useState('');
@@ -129,7 +133,13 @@ const PayConfirm = ({ props, actions, readStatus }) => {
129
133
  const [status, setStatus] = useState(null);
130
134
  const [statusError, setStatusError] = useState(false);
131
135
  const [eventId, setEventId] = useState(null);
136
+ const [receipt, setReceipt] = useState(null);
132
137
  const [failed, setFailed] = useState(null);
138
+ // Optimistic pending→confirmed: once published, poll the free read seam for the
139
+ // event id and flip to "confirmed" when a relay serves it back. A slow/absent
140
+ // read stays "pending (unconfirmed)" — never a false "failed" (the message was
141
+ // already paid for + broadcast).
142
+ const confirmState = usePublishConfirmation(eventId, loadMore);
133
143
  useEffect(() => {
134
144
  if (phase !== 'confirming' || status || statusError || !readStatus)
135
145
  return;
@@ -165,6 +175,10 @@ const PayConfirm = ({ props, actions, readStatus }) => {
165
175
  setPhase('confirming');
166
176
  return;
167
177
  }
178
+ // Prefer the TRUTHFUL fee the daemon actually charged (PublishResponse.feePaid)
179
+ // over the pre-write per-event estimate; surface the post-write balance too.
180
+ const data = (outcome.data ?? {});
181
+ setReceipt({ feePaid: data.feePaid, balanceAfter: data.channelBalanceAfter });
168
182
  setEventId(outcome.eventId ?? null);
169
183
  setPhase('receipt');
170
184
  };
@@ -173,22 +187,27 @@ const PayConfirm = ({ props, actions, readStatus }) => {
173
187
  setStatus(null);
174
188
  setStatusError(false);
175
189
  setEventId(null);
190
+ setReceipt(null);
176
191
  setFailed(null);
177
192
  setPhase('idle');
178
193
  };
194
+ const assetSuffix = status?.asset ? ` ${status.asset}` : '';
179
195
  const feeLabel = status
180
- ? `${status.feePerEvent}${status.asset ? ` ${status.asset}` : ''}`
196
+ ? `${status.feePerEvent}${assetSuffix}`
181
197
  : statusError
182
198
  ? 'unavailable'
183
199
  : '…';
184
200
  const chainLabel = status ? status.settlementChain : statusError ? 'unknown' : '…';
201
+ // The receipt shows what was actually charged; fall back to the estimate only
202
+ // if the daemon didn't report a fee (older daemon).
203
+ const paidLabel = receipt?.feePaid ? `${receipt.feePaid}${assetSuffix}` : feeLabel;
185
204
  const bytes = byteLength(text.trim());
186
205
  if (phase === 'receipt') {
187
- return (_jsxs("div", { className: "overflow-hidden rounded-xl border border-primary/30 bg-card", children: [_jsxs("div", { className: "flex items-center gap-2.5 border-b border-primary/20 bg-primary/5 px-4 py-3", children: [_jsx(CircleCheck, { "aria-hidden": "true", className: "size-5 text-primary" }), _jsxs("div", { children: [_jsx("div", { className: "font-semibold leading-tight", children: "Posted \u2014 and paid" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "The message is the money." })] })] }), _jsxs("dl", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5 px-4 py-3 text-xs", children: [_jsx("dt", { className: "text-muted-foreground", children: "Event" }), _jsx("dd", { children: eventId ? _jsx(MonoId, { value: eventId, prefixLen: 12, suffixLen: 6 }) : '—' }), _jsx("dt", { className: "text-muted-foreground", children: "Fee paid" }), _jsxs("dd", { className: "font-medium", children: [feeLabel, " on ", chainLabel] })] }), _jsx("div", { className: "flex justify-end border-t border-border px-4 py-2.5", children: _jsx(Button, { variant: "outline", size: "sm", onClick: reset, children: "Post another" }) })] }));
206
+ return (_jsxs("div", { className: "overflow-hidden rounded-xl border border-primary/30 bg-card", children: [_jsxs("div", { className: "flex items-center gap-2.5 border-b border-primary/20 bg-primary/5 px-4 py-3", children: [_jsx(CircleCheck, { "aria-hidden": "true", className: "size-5 text-primary" }), _jsxs("div", { children: [_jsx("div", { className: "font-semibold leading-tight", children: "Posted \u2014 and paid" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "The message is the money." })] })] }), _jsxs("dl", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5 px-4 py-3 text-xs", children: [_jsx("dt", { className: "text-muted-foreground", children: "Event" }), _jsx("dd", { children: eventId ? _jsx(MonoId, { value: eventId, prefixLen: 12, suffixLen: 6 }) : '—' }), _jsx("dt", { className: "text-muted-foreground", children: "Status" }), _jsx("dd", { children: _jsx(RelayConfirmation, { state: confirmState }) }), _jsx("dt", { className: "text-muted-foreground", children: "Fee paid" }), _jsxs("dd", { className: "font-medium", children: [paidLabel, " on ", chainLabel] }), receipt?.balanceAfter ? (_jsxs(_Fragment, { children: [_jsx("dt", { className: "text-muted-foreground", children: "Balance" }), _jsxs("dd", { className: "font-medium tabular-nums", children: [receipt.balanceAfter, assetSuffix, " left"] })] })) : null] }), _jsx("div", { className: "flex justify-end border-t border-border px-4 py-2.5", children: _jsx(Button, { variant: "outline", size: "sm", onClick: reset, children: "Post another" }) })] }));
188
207
  }
189
208
  if (phase === 'confirming' || phase === 'publishing') {
190
209
  const publishing = phase === 'publishing';
191
- return (_jsxs("div", { className: "overflow-hidden rounded-xl border border-border bg-card", 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: "Confirm pay-to-write" })] }), _jsxs("div", { className: "flex flex-col gap-3 px-4 py-3", children: [_jsx("blockquote", { className: "max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded-lg border-l-2 border-primary/40 bg-muted/50 px-3 py-2 text-sm", children: text }), _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: "Fee" }), _jsx("dd", { className: "font-medium tabular-nums", children: feeLabel })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("dt", { className: "text-muted-foreground", children: "Settles on" }), _jsx("dd", { className: "font-medium", children: chainLabel })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("dt", { className: "text-muted-foreground", children: "Size" }), _jsxs("dd", { className: "font-mono font-medium tabular-nums", children: [bytes, " bytes"] })] })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Posting pays the fee above per event. The message is the money." }), failed ? (_jsxs("p", { className: "text-xs text-destructive", children: ["Publish failed: ", failed] })) : null] }), _jsxs("div", { className: "flex justify-end gap-2 border-t border-border px-4 py-2.5", children: [_jsxs(Button, { variant: "outline", size: "sm", disabled: publishing, onClick: cancel, children: [_jsx(ArrowLeft, { "aria-hidden": "true" }), "Back"] }), _jsx(Button, { size: "sm", disabled: publishing || statusError, onClick: () => void confirm(), children: publishing ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { "aria-hidden": "true", className: "animate-spin" }), "Publishing\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx(Coins, { "aria-hidden": "true" }), "Confirm & pay"] })) })] })] }));
210
+ return (_jsxs("div", { className: "overflow-hidden rounded-xl border border-border bg-card", 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: "Confirm pay-to-write" })] }), _jsxs("div", { className: "flex flex-col gap-3 px-4 py-3", children: [_jsx("blockquote", { className: "max-h-40 overflow-y-auto whitespace-pre-wrap break-words rounded-lg border-l-2 border-primary/40 bg-muted/50 px-3 py-2 text-sm", children: text }), _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: "Fee" }), _jsx("dd", { className: "font-medium tabular-nums", children: feeLabel })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("dt", { className: "text-muted-foreground", children: "Settles on" }), _jsx("dd", { className: "font-medium", children: chainLabel })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("dt", { className: "text-muted-foreground", children: "Size" }), _jsxs("dd", { className: "font-mono font-medium tabular-nums", children: [bytes, " bytes"] })] })] }), _jsxs("p", { className: "text-xs text-muted-foreground", children: ["Posting pays the fee above per event. ", _jsx("span", { className: "text-foreground/80", children: "This is permanent" }), " \u2014 the note is broadcast to relays and can't be unpublished, and the fee is non-refundable. The message is the money."] }), failed ? (_jsxs("p", { className: "text-xs text-destructive", children: ["Publish failed: ", failed] })) : null] }), _jsxs("div", { className: "flex justify-end gap-2 border-t border-border px-4 py-2.5", children: [_jsxs(Button, { variant: "outline", size: "sm", disabled: publishing, onClick: cancel, children: [_jsx(ArrowLeft, { "aria-hidden": "true" }), "Back"] }), _jsx(Button, { size: "sm", disabled: publishing || statusError, onClick: () => void confirm(), children: publishing ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { "aria-hidden": "true", className: "animate-spin" }), "Publishing\u2026"] })) : (_jsxs(_Fragment, { children: [_jsx(Coins, { "aria-hidden": "true" }), "Confirm & pay"] })) })] })] }));
192
211
  }
193
212
  return (_jsx(ComposerSurface, { value: text, onChange: setText, placeholder: placeholder, actionLabel: label, actionIcon: _jsx(Coins, { "aria-hidden": "true" }), disabled: !text.trim() || !actions['confirm'], onSubmit: review }));
194
213
  };
@@ -1 +1 @@
1
- {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Live ticker atom — a compact, always-on stream of new posts / mentions, built
3
+ * for the host's Picture-in-Picture surface so it can ride alongside the
4
+ * conversation. It feature-detects PiP and degrades gracefully:
5
+ *
6
+ * • host supports PiP (`surface.canPip`) — offer a "Go live" affordance that
7
+ * pops the ticker into the parallel PiP surface (`surface.request('pip')`).
8
+ * • inline-only host — degrade to a static SNAPSHOT of the most recent items
9
+ * plus a "Refresh" button that re-queries the base filter via the free
10
+ * `loadMore` seam and merges any new items to the top.
11
+ *
12
+ * The item list is an `aria-live="polite"` region so screen readers announce new
13
+ * entries without stealing focus, in either mode.
14
+ */
15
+ import { type Atom } from './types.js';
16
+ export declare const liveTickerAtoms: Atom[];
17
+ //# sourceMappingURL=live-ticker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-ticker.d.ts","sourceRoot":"","sources":["../../src/atoms/live-ticker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,OAAO,EAAE,KAAK,IAAI,EAAwB,MAAM,YAAY,CAAC;AA8E7D,eAAO,MAAM,eAAe,EAAE,IAAI,EAAmD,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Live ticker atom — a compact, always-on stream of new posts / mentions, built
4
+ * for the host's Picture-in-Picture surface so it can ride alongside the
5
+ * conversation. It feature-detects PiP and degrades gracefully:
6
+ *
7
+ * • host supports PiP (`surface.canPip`) — offer a "Go live" affordance that
8
+ * pops the ticker into the parallel PiP surface (`surface.request('pip')`).
9
+ * • inline-only host — degrade to a static SNAPSHOT of the most recent items
10
+ * plus a "Refresh" button that re-queries the base filter via the free
11
+ * `loadMore` seam and merges any new items to the top.
12
+ *
13
+ * The item list is an `aria-live="polite"` region so screen readers announce new
14
+ * entries without stealing focus, in either mode.
15
+ */
16
+ import { useState } from 'react';
17
+ import { Radio, RotateCw, AtSign } from 'lucide-react';
18
+ import { Button } from '@/components/ui/button.js';
19
+ import { MonoId } from '@/components/mono-id.js';
20
+ import { parseNote } from '../parsers/social.js';
21
+ import { mergePage } from '../paging.js';
22
+ import {} from '../types.js';
23
+ import {} from './types.js';
24
+ import { relativeTime } from './social-ui.js';
25
+ /** Recent items kept in the ticker snapshot (it stays a glanceable slice). */
26
+ const TICKER_SIZE = 6;
27
+ /** One compact ticker line: who, a one-line excerpt, and when. */
28
+ const TickerItem = ({ event }) => {
29
+ const note = parseNote(event);
30
+ // Fall back to the raw content for non-kind:1 mentions (e.g. reactions).
31
+ const text = (note?.content ?? event.content).replace(/\s+/g, ' ').trim();
32
+ return (_jsxs("li", { className: "flex items-baseline gap-2 px-1 py-1.5 text-sm", children: [_jsx(AtSign, { "aria-hidden": "true", className: "size-3.5 shrink-0 translate-y-0.5 text-primary" }), _jsx(MonoId, { value: event.pubkey, className: "shrink-0 text-muted-foreground" }), _jsx("span", { className: "min-w-0 flex-1 truncate text-foreground", children: text || '—' }), _jsx("span", { className: "shrink-0 text-xs text-muted-foreground tabular-nums", children: relativeTime(event.created_at) })] }));
33
+ };
34
+ const LiveTicker = ({ events, bind, loadMore, surface }) => {
35
+ // Items pulled in by "Refresh", merged + de-duped with the bound events.
36
+ const [extra, setExtra] = useState([]);
37
+ const [busy, setBusy] = useState(false);
38
+ const all = (extra.length ? mergePage(events, extra) : events).slice(0, TICKER_SIZE);
39
+ const baseFilter = bind?.query ?? { kinds: [1] };
40
+ const onRefresh = async () => {
41
+ if (!loadMore || busy)
42
+ return;
43
+ setBusy(true);
44
+ try {
45
+ // Re-query the BASE filter (newest items), not an older page — the ticker
46
+ // surfaces what's NEW, so fresh ids merge to the top and dupes drop out.
47
+ const page = await loadMore({ ...baseFilter, limit: TICKER_SIZE });
48
+ setExtra((prev) => mergePage(prev, page));
49
+ }
50
+ finally {
51
+ setBusy(false);
52
+ }
53
+ };
54
+ const canPip = Boolean(surface?.canPip) && surface?.mode !== 'pip';
55
+ return (_jsxs("div", { className: "flex flex-col rounded-xl border border-border", children: [_jsxs("header", { className: "flex items-center justify-between gap-2 border-b border-border px-3 py-2", children: [_jsxs("span", { className: "flex items-center gap-1.5 text-xs font-semibold text-foreground", children: [_jsx(Radio, { "aria-hidden": "true", className: "size-3.5 text-primary" }), "Live"] }), canPip ? (
56
+ // Host has a parallel surface — pop the ticker out to ride live.
57
+ _jsxs(Button, { variant: "outline", size: "sm", onClick: () => void surface?.request('pip'), children: [_jsx(Radio, { "aria-hidden": "true", className: "size-3.5" }), "Go live"] })) : loadMore ? (
58
+ // Inline-only: a manual Refresh stands in for the live feed.
59
+ _jsxs(Button, { variant: "ghost", size: "sm", disabled: busy, onClick: () => void onRefresh(), children: [_jsx(RotateCw, { "aria-hidden": "true", className: busy ? 'size-3.5 animate-spin' : 'size-3.5' }), "Refresh"] })) : null] }), _jsx("ul", { "aria-live": "polite", "aria-label": "New posts and mentions", className: "divide-y divide-border px-2 py-1", children: all.length === 0 ? (_jsx("li", { className: "px-1 py-4 text-center text-sm text-muted-foreground", children: "Nothing new yet." })) : (all.map((event) => _jsx(TickerItem, { event: event }, event.id))) })] }));
60
+ };
61
+ export const liveTickerAtoms = [{ id: 'live-ticker', Component: LiveTicker }];
62
+ //# sourceMappingURL=live-ticker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-ticker.js","sourceRoot":"","sources":["../../src/atoms/live-ticker.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Media gallery atom — an Album-style responsive grid of media events (NIP-68
3
+ * pictures, NIP-71 videos, NIP-94 files, and any note carrying NIP-92 `imeta`).
4
+ * Each event contributes one tile; tapping a tile opens an in-component
5
+ * fullscreen lightbox that renders the full media via {@link InlineMediaList}
6
+ * (the same gateway-fallback embed the feed uses), with prev/next paging across
7
+ * the gallery.
8
+ *
9
+ * Every image tile carries alt text — the publisher's `imeta alt` when present,
10
+ * else a stable positional label — so the grid is navigable by assistive tech.
11
+ */
12
+ import { type Atom } from './types.js';
13
+ export declare const mediaGalleryAtoms: Atom[];
14
+ //# sourceMappingURL=media-gallery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-gallery.d.ts","sourceRoot":"","sources":["../../src/atoms/media-gallery.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAaH,OAAO,EAAE,KAAK,IAAI,EAAwB,MAAM,YAAY,CAAC;AAyM7D,eAAO,MAAM,iBAAiB,EAAE,IAAI,EAAuD,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Media gallery atom — an Album-style responsive grid of media events (NIP-68
4
+ * pictures, NIP-71 videos, NIP-94 files, and any note carrying NIP-92 `imeta`).
5
+ * Each event contributes one tile; tapping a tile opens an in-component
6
+ * fullscreen lightbox that renders the full media via {@link InlineMediaList}
7
+ * (the same gateway-fallback embed the feed uses), with prev/next paging across
8
+ * the gallery.
9
+ *
10
+ * Every image tile carries alt text — the publisher's `imeta alt` when present,
11
+ * else a stable positional label — so the grid is navigable by assistive tech.
12
+ */
13
+ import { useState } from 'react';
14
+ import { X, ChevronLeft, ChevronRight, Images, Play } from 'lucide-react';
15
+ import { arweaveGatewayCandidates } from '@toon-protocol/arweave';
16
+ import { Button } from '@/components/ui/button.js';
17
+ import { parseMediaPost, parseFileMetadata, parseInlineMedia, } from '../parsers/media.js';
18
+ import {} from '../types.js';
19
+ import {} from './types.js';
20
+ import { InlineMediaList } from './media.js';
21
+ function isVideoVariant(variant) {
22
+ return variant.mime?.startsWith('video/') ?? false;
23
+ }
24
+ /**
25
+ * Collect renderable media variants from any supported event (NIP-68/71 posts,
26
+ * NIP-94 files, else NIP-92 inline `imeta`). Mirrors the feed's media resolution
27
+ * so a gallery shows exactly what a note's media-embed would.
28
+ */
29
+ function variantsFor(event) {
30
+ const post = parseMediaPost(event);
31
+ if (post)
32
+ return { variants: post.variants, video: post.mediaType === 'video' };
33
+ const file = parseFileMetadata(event);
34
+ if (file) {
35
+ const v = { url: file.url, fallbacks: [] };
36
+ if (file.mime)
37
+ v.mime = file.mime;
38
+ if (file.dim)
39
+ v.dim = file.dim;
40
+ if (file.caption)
41
+ v.alt = file.caption;
42
+ return { variants: [v], video: file.mime?.startsWith('video/') ?? false };
43
+ }
44
+ return { variants: parseInlineMedia(event), video: false };
45
+ }
46
+ /** Build the gallery items, dropping events that carry no renderable media. */
47
+ function galleryItems(events) {
48
+ const items = [];
49
+ for (const event of events) {
50
+ const { variants, video } = variantsFor(event);
51
+ const variant = variants[0];
52
+ if (!variant)
53
+ continue;
54
+ items.push({ event, variant, variants, video: video || isVideoVariant(variant) });
55
+ }
56
+ return items;
57
+ }
58
+ /** A single grid tile, with gateway-fallback image loading + guaranteed alt. */
59
+ const GalleryTile = ({ item, index, onOpen, }) => {
60
+ const candidates = arweaveGatewayCandidates(item.variant.url, item.variant.fallbacks);
61
+ const [idx, setIdx] = useState(0);
62
+ const src = candidates[idx] ?? item.variant.url;
63
+ const onError = () => setIdx((i) => (i + 1 < candidates.length ? i + 1 : i));
64
+ // Always supply alt text: the publisher's, else a stable positional label.
65
+ const alt = item.variant.alt?.trim() || `Media item ${index + 1}`;
66
+ return (_jsx("button", { type: "button", onClick: onOpen, "aria-label": `Open ${alt}`, className: "group relative aspect-square overflow-hidden rounded-lg border border-border bg-muted/30 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: item.video ? (_jsxs(_Fragment, { children: [_jsx("video", { src: src, muted: true, playsInline: true, preload: "metadata", className: "size-full object-cover", onError: onError }), _jsx("span", { "aria-hidden": "true", className: "absolute inset-0 flex items-center justify-center bg-black/20 text-white transition-colors group-hover:bg-black/30", children: _jsx(Play, { className: "size-7 fill-current" }) })] })) : (_jsx("img", { src: src, alt: alt, loading: "lazy", className: "size-full object-cover transition-transform group-hover:scale-[1.03]", onError: onError })) }));
67
+ };
68
+ /** Fullscreen lightbox overlay: the full media + prev/next + close. */
69
+ const Lightbox = ({ items, index, onClose, onStep }) => {
70
+ const item = items[index];
71
+ if (!item)
72
+ return null;
73
+ const alt = item.variant.alt?.trim() || `Media item ${index + 1}`;
74
+ return (_jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": `${alt} (${index + 1} of ${items.length})`, className: "fixed inset-0 z-50 flex flex-col bg-black/90 p-3", children: [_jsxs("div", { className: "flex items-center justify-between text-white", children: [_jsxs("span", { className: "text-xs tabular-nums opacity-80", children: [index + 1, " / ", items.length] }), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Close lightbox", className: "text-white hover:bg-white/10 hover:text-white", onClick: onClose, children: _jsx(X, { "aria-hidden": "true", className: "size-5" }) })] }), _jsxs("div", { className: "flex min-h-0 flex-1 items-center gap-2", children: [items.length > 1 ? (_jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Previous media", className: "shrink-0 text-white hover:bg-white/10 hover:text-white", onClick: () => onStep(-1), children: _jsx(ChevronLeft, { "aria-hidden": "true", className: "size-6" }) })) : null, _jsx("div", { className: "flex min-w-0 flex-1 items-center justify-center overflow-auto", children: _jsx(InlineMediaList, { variants: item.variants }) }), items.length > 1 ? (_jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Next media", className: "shrink-0 text-white hover:bg-white/10 hover:text-white", onClick: () => onStep(1), children: _jsx(ChevronRight, { "aria-hidden": "true", className: "size-6" }) })) : null] })] }));
75
+ };
76
+ const MediaGallery = ({ events }) => {
77
+ const items = galleryItems(events);
78
+ // The currently open lightbox tile, or null when the grid is at rest.
79
+ const [open, setOpen] = useState(null);
80
+ if (items.length === 0) {
81
+ return (_jsxs("div", { className: "rounded-xl border border-dashed border-border px-4 py-8 text-center text-sm text-muted-foreground", children: [_jsx(Images, { "aria-hidden": "true", className: "mx-auto mb-1 size-5 opacity-60" }), "No media to show."] }));
82
+ }
83
+ return (_jsxs("div", { children: [_jsx("div", { className: "grid grid-cols-2 gap-2 sm:grid-cols-3", children: items.map((item, i) => (_jsx(GalleryTile, { item: item, index: i, onOpen: () => setOpen(i) }, item.event.id))) }), open !== null ? (_jsx(Lightbox, { items: items, index: open, onClose: () => setOpen(null), onStep: (delta) => setOpen((cur) => cur === null ? cur : (cur + delta + items.length) % items.length) })) : null] }));
84
+ };
85
+ export const mediaGalleryAtoms = [{ id: 'media-gallery', Component: MediaGallery }];
86
+ //# sourceMappingURL=media-gallery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-gallery.js","sourceRoot":"","sources":["../../src/atoms/media-gallery.tsx"],"names":[],"mappings":"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"}