@toon-protocol/views 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/index.html +146 -71
- package/dist/atoms/content.d.ts +6 -0
- package/dist/atoms/content.d.ts.map +1 -0
- package/dist/atoms/content.js +83 -0
- package/dist/atoms/content.js.map +1 -0
- package/dist/atoms/interactive.d.ts.map +1 -1
- package/dist/atoms/interactive.js +32 -11
- package/dist/atoms/interactive.js.map +1 -1
- package/dist/atoms/media.d.ts +7 -0
- package/dist/atoms/media.d.ts.map +1 -1
- package/dist/atoms/media.js +9 -5
- package/dist/atoms/media.js.map +1 -1
- package/dist/atoms/registry.d.ts.map +1 -1
- package/dist/atoms/registry.js +4 -0
- package/dist/atoms/registry.js.map +1 -1
- package/dist/atoms/social-ui.d.ts +41 -0
- package/dist/atoms/social-ui.d.ts.map +1 -0
- package/dist/atoms/social-ui.js +80 -0
- package/dist/atoms/social-ui.js.map +1 -0
- package/dist/atoms/social.d.ts.map +1 -1
- package/dist/atoms/social.js +37 -11
- package/dist/atoms/social.js.map +1 -1
- package/dist/atoms/status.d.ts +3 -0
- package/dist/atoms/status.d.ts.map +1 -0
- package/dist/atoms/status.js +83 -0
- package/dist/atoms/status.js.map +1 -0
- package/dist/atoms/types.d.ts +43 -3
- package/dist/atoms/types.d.ts.map +1 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +43 -0
- package/dist/catalog.js.map +1 -1
- package/dist/examples.d.ts +13 -0
- package/dist/examples.d.ts.map +1 -1
- package/dist/examples.js +46 -0
- package/dist/examples.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +12 -0
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Atom } from './types.js';
|
|
2
|
+
/** Status tone → semantic colour, shared by `stat` and `badge`. */
|
|
3
|
+
export type Tone = 'default' | 'success' | 'warn' | 'danger';
|
|
4
|
+
export declare function toTone(value: unknown): Tone;
|
|
5
|
+
export declare const contentAtoms: Atom[];
|
|
6
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/atoms/content.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,IAAI,EAAwB,MAAM,YAAY,CAAC;AAE7D,mEAAmE;AACnE,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAiB7D,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAE3C;AAqED,eAAO,MAAM,YAAY,EAAE,IAAI,EAM9B,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Generic content primitives — the props-driven vocabulary the agent composes
|
|
4
|
+
* with to render arbitrary, non-event structured data (daemon status, write
|
|
5
|
+
* targets, balances, identity) without falling back to plain text. Like
|
|
6
|
+
* `composer`/`tabs`, these are pure and carry no event `kinds`: they render
|
|
7
|
+
* exactly what the ViewSpec hands them.
|
|
8
|
+
*/
|
|
9
|
+
import {} from 'react';
|
|
10
|
+
import { cn } from '@/lib/utils.js';
|
|
11
|
+
import { Badge } from '@/components/ui/badge.js';
|
|
12
|
+
import {} from './types.js';
|
|
13
|
+
const TONE_TEXT = {
|
|
14
|
+
default: 'text-foreground',
|
|
15
|
+
success: 'text-emerald-600 dark:text-emerald-400',
|
|
16
|
+
warn: 'text-amber-600 dark:text-amber-400',
|
|
17
|
+
danger: 'text-destructive',
|
|
18
|
+
};
|
|
19
|
+
/** shadcn badge variant for each tone (the pill colours). */
|
|
20
|
+
const TONE_BADGE = {
|
|
21
|
+
default: 'secondary',
|
|
22
|
+
success: 'default',
|
|
23
|
+
warn: 'secondary',
|
|
24
|
+
danger: 'destructive',
|
|
25
|
+
};
|
|
26
|
+
export function toTone(value) {
|
|
27
|
+
return value === 'success' || value === 'warn' || value === 'danger' ? value : 'default';
|
|
28
|
+
}
|
|
29
|
+
const str = (v, fallback = '') => typeof v === 'string' ? v : typeof v === 'number' ? String(v) : fallback;
|
|
30
|
+
const Heading = ({ props }) => {
|
|
31
|
+
const text = str(props['text']);
|
|
32
|
+
if (!text)
|
|
33
|
+
return null;
|
|
34
|
+
const level = props['level'] === 2 || props['level'] === 3 ? props['level'] : 1;
|
|
35
|
+
const cls = level === 1
|
|
36
|
+
? 'text-lg font-semibold tracking-tight'
|
|
37
|
+
: level === 2
|
|
38
|
+
? 'text-base font-semibold'
|
|
39
|
+
: 'text-sm font-semibold uppercase tracking-wide text-muted-foreground';
|
|
40
|
+
if (level === 2)
|
|
41
|
+
return _jsx("h2", { className: cls, children: text });
|
|
42
|
+
if (level === 3)
|
|
43
|
+
return _jsx("h3", { className: cls, children: text });
|
|
44
|
+
return _jsx("h1", { className: cls, children: text });
|
|
45
|
+
};
|
|
46
|
+
const Text = ({ props }) => {
|
|
47
|
+
const text = str(props['text']);
|
|
48
|
+
if (!text)
|
|
49
|
+
return null;
|
|
50
|
+
const muted = props['muted'] === true;
|
|
51
|
+
return (_jsx("p", { className: cn('text-sm leading-relaxed', muted && 'text-muted-foreground'), children: text }));
|
|
52
|
+
};
|
|
53
|
+
const Stat = ({ props }) => {
|
|
54
|
+
const label = str(props['label']);
|
|
55
|
+
const value = str(props['value'], '—');
|
|
56
|
+
const tone = toTone(props['tone']);
|
|
57
|
+
return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-xs font-medium uppercase tracking-wide text-muted-foreground", children: label }), _jsx("span", { className: cn('text-xl font-semibold tabular-nums', TONE_TEXT[tone]), children: value })] }));
|
|
58
|
+
};
|
|
59
|
+
const KeyValue = ({ props }) => {
|
|
60
|
+
const rows = Array.isArray(props['rows'])
|
|
61
|
+
? props['rows']
|
|
62
|
+
.filter((r) => !!r && typeof r === 'object')
|
|
63
|
+
.map((r) => ({ label: str(r['label']), value: str(r['value'], '—') }))
|
|
64
|
+
: [];
|
|
65
|
+
if (rows.length === 0)
|
|
66
|
+
return null;
|
|
67
|
+
return (_jsx("dl", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5 text-sm", children: rows.map((row, i) => (_jsxs("div", { className: "contents", children: [_jsx("dt", { className: "text-muted-foreground", children: row.label }), _jsx("dd", { className: "min-w-0 break-words text-right font-medium tabular-nums", children: row.value })] }, i))) }));
|
|
68
|
+
};
|
|
69
|
+
const BadgeAtom = ({ props }) => {
|
|
70
|
+
const label = str(props['label']);
|
|
71
|
+
if (!label)
|
|
72
|
+
return null;
|
|
73
|
+
const tone = toTone(props['tone']);
|
|
74
|
+
return _jsx(Badge, { variant: TONE_BADGE[tone], children: label });
|
|
75
|
+
};
|
|
76
|
+
export const contentAtoms = [
|
|
77
|
+
{ id: 'heading', Component: Heading },
|
|
78
|
+
{ id: 'text', Component: Text },
|
|
79
|
+
{ id: 'stat', Component: Stat },
|
|
80
|
+
{ id: 'key-value', Component: KeyValue },
|
|
81
|
+
{ id: 'badge', Component: BadgeAtom },
|
|
82
|
+
];
|
|
83
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/atoms/content.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,IAAI,EAAyC,MAAM,YAAY,CAAC;AAyQ9E,eAAO,MAAM,gBAAgB,EAAE,IAAI,EAIlC,CAAC"}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/** Interactive atoms that hold local UI state (composer, tabs, pay-confirm). */
|
|
3
3
|
import { Children, useEffect, useState } from 'react';
|
|
4
|
+
import { ArrowLeft, CircleCheck, Coins, Loader2 } from 'lucide-react';
|
|
4
5
|
import { Button } from '@/components/ui/button.js';
|
|
5
6
|
import { Textarea } from '@/components/ui/textarea.js';
|
|
6
7
|
import { MonoId } from '@/components/mono-id.js';
|
|
7
8
|
import {} from './types.js';
|
|
9
|
+
import { byteLength } from './social-ui.js';
|
|
10
|
+
/**
|
|
11
|
+
* The shared composer surface: an auto-sizing textarea over a footer toolbar
|
|
12
|
+
* that carries the byte counter (TOON fees scale with encoded bytes) and the
|
|
13
|
+
* primary action. Used by both the free `composer` and the paid `pay-confirm`
|
|
14
|
+
* idle phase so the two read as the same control.
|
|
15
|
+
*/
|
|
16
|
+
const ComposerSurface = ({ value, onChange, placeholder, actionLabel, actionIcon, disabled, onSubmit }) => {
|
|
17
|
+
const bytes = byteLength(value);
|
|
18
|
+
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: [_jsx(Textarea, { value: value, onChange: (e) => onChange(e.target.value), placeholder: placeholder, rows: 3, className: "min-h-20 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("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
|
+
};
|
|
8
20
|
const Composer = ({ props, actions }) => {
|
|
9
21
|
const [text, setText] = useState('');
|
|
10
22
|
const placeholder = typeof props['placeholder'] === 'string' ? props['placeholder'] : "What's happening?";
|
|
@@ -16,7 +28,7 @@ const Composer = ({ props, actions }) => {
|
|
|
16
28
|
void actions['post']({ content: value });
|
|
17
29
|
setText('');
|
|
18
30
|
};
|
|
19
|
-
return (
|
|
31
|
+
return (_jsx(ComposerSurface, { value: text, onChange: setText, placeholder: placeholder, actionLabel: label, disabled: !text.trim() || !actions['post'], onSubmit: submit }));
|
|
20
32
|
};
|
|
21
33
|
const Tabs = ({ props, children }) => {
|
|
22
34
|
const labels = Array.isArray(props['labels'])
|
|
@@ -43,11 +55,17 @@ const PayConfirm = ({ props, actions, readStatus }) => {
|
|
|
43
55
|
return;
|
|
44
56
|
let cancelled = false;
|
|
45
57
|
void readStatus()
|
|
46
|
-
.then((s) => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
.then((s) => {
|
|
59
|
+
if (!cancelled)
|
|
60
|
+
setStatus(s);
|
|
61
|
+
})
|
|
62
|
+
.catch(() => {
|
|
63
|
+
if (!cancelled)
|
|
64
|
+
setStatusError(true);
|
|
65
|
+
});
|
|
66
|
+
return () => {
|
|
67
|
+
cancelled = true;
|
|
68
|
+
};
|
|
51
69
|
}, [phase, status, statusError, readStatus]);
|
|
52
70
|
const review = () => {
|
|
53
71
|
if (!text.trim() || !actions['confirm'])
|
|
@@ -80,16 +98,19 @@ const PayConfirm = ({ props, actions, readStatus }) => {
|
|
|
80
98
|
};
|
|
81
99
|
const feeLabel = status
|
|
82
100
|
? `${status.feePerEvent}${status.asset ? ` ${status.asset}` : ''}`
|
|
83
|
-
: statusError
|
|
101
|
+
: statusError
|
|
102
|
+
? 'unavailable'
|
|
103
|
+
: '…';
|
|
84
104
|
const chainLabel = status ? status.settlementChain : statusError ? 'unknown' : '…';
|
|
105
|
+
const bytes = byteLength(text.trim());
|
|
85
106
|
if (phase === 'receipt') {
|
|
86
|
-
return (_jsxs("div", { className: "rounded-
|
|
107
|
+
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" }) })] }));
|
|
87
108
|
}
|
|
88
109
|
if (phase === 'confirming' || phase === 'publishing') {
|
|
89
110
|
const publishing = phase === 'publishing';
|
|
90
|
-
return (_jsxs("div", { className: "
|
|
111
|
+
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"] })) })] })] }));
|
|
91
112
|
}
|
|
92
|
-
return (
|
|
113
|
+
return (_jsx(ComposerSurface, { value: text, onChange: setText, placeholder: placeholder, actionLabel: label, actionIcon: _jsx(Coins, { "aria-hidden": "true" }), disabled: !text.trim() || !actions['confirm'], onSubmit: review }));
|
|
93
114
|
};
|
|
94
115
|
export const interactiveAtoms = [
|
|
95
116
|
{ id: 'composer', writes: [{ name: 'toon_publish_unsigned' }], Component: Composer },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/atoms/interactive.tsx"],"names":[],"mappings":"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"}
|
package/dist/atoms/media.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
/** Media atoms — NIP-68/71 posts + NIP-94 files (read), and the spendy uploader. */
|
|
2
|
+
import { type FC } from 'react';
|
|
3
|
+
import { type MediaVariant } from '../parsers/media.js';
|
|
1
4
|
import { type Atom } from './types.js';
|
|
5
|
+
/** Renders a list of NIP-92 media variants (image → img, video → video). */
|
|
6
|
+
export declare const InlineMediaList: FC<{
|
|
7
|
+
variants: MediaVariant[];
|
|
8
|
+
}>;
|
|
2
9
|
export declare const mediaAtoms: Atom[];
|
|
3
10
|
//# sourceMappingURL=media.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/atoms/media.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/atoms/media.tsx"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,OAAO,EAAoB,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAuD,MAAM,qBAAqB,CAAC;AAE7G,OAAO,EAAE,KAAK,IAAI,EAAwB,MAAM,YAAY,CAAC;AAoB7D,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC;IAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;CAAE,CAmB5D,CAAC;AAgFF,eAAO,MAAM,UAAU,EAAE,IAAI,EAO5B,CAAC"}
|
package/dist/atoms/media.js
CHANGED
|
@@ -23,17 +23,21 @@ function variantsFor(event) {
|
|
|
23
23
|
}
|
|
24
24
|
return { variants: parseInlineMedia(event), video: false };
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (!event)
|
|
29
|
-
return null;
|
|
30
|
-
const { variants } = variantsFor(event);
|
|
26
|
+
/** Renders a list of NIP-92 media variants (image → img, video → video). */
|
|
27
|
+
export const InlineMediaList = ({ variants }) => {
|
|
31
28
|
if (variants.length === 0)
|
|
32
29
|
return null;
|
|
33
30
|
return (_jsx("div", { className: "flex flex-col gap-2", children: variants.map((v, i) => isVideo(v) ? (
|
|
34
31
|
// eslint-disable-next-line jsx-a11y/media-has-caption
|
|
35
32
|
_jsx("video", { src: v.url, controls: true, className: "max-h-96 w-full rounded-md" }, i)) : (_jsx("img", { src: v.url, alt: v.alt ?? '', className: "max-h-96 w-full rounded-md object-contain" }, i))) }));
|
|
36
33
|
};
|
|
34
|
+
const MediaEmbed = ({ events }) => {
|
|
35
|
+
const event = events[0];
|
|
36
|
+
if (!event)
|
|
37
|
+
return null;
|
|
38
|
+
const { variants } = variantsFor(event);
|
|
39
|
+
return _jsx(InlineMediaList, { variants: variants });
|
|
40
|
+
};
|
|
37
41
|
const MediaUploader = ({ props, actions }) => {
|
|
38
42
|
const label = typeof props['label'] === 'string' ? props['label'] : 'Upload media';
|
|
39
43
|
const inputRef = useRef(null);
|
package/dist/atoms/media.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/atoms/media.tsx"],"names":[],"mappings":";AAAA,oFAAoF;AACpF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAW,MAAM,OAAO,CAAC;AAClD,OAAO,EAAqB,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7G,OAAO,EAAmB,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAmC,MAAM,YAAY,CAAC;AAE7D,SAAS,OAAO,CAAC,OAAqB;IACpC,OAAO,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;AACrD,CAAC;AAED,kEAAkE;AAClE,SAAS,WAAW,CAAC,KAAiB;IACpC,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;IAChF,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,CAAC,GAAiB,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACzD,IAAI,IAAI,CAAC,IAAI;YAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAClC,IAAI,IAAI,CAAC,GAAG;YAAE,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QAC/B,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC;IAC5E,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/atoms/media.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/atoms/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/atoms/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAUvC,OAAO,EAAgB,eAAe,EAAE,MAAM,eAAe,CAAC;AAe9D,sBAAsB;AACtB,eAAO,MAAM,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAA4C,CAAC;AAEzF,kEAAkE;AAClE,eAAO,MAAM,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAyB,CAAC;AAYnE,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,0EAA0E;AAC1E,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAAC,IAAI,CAAC,CAStD;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/atoms/registry.js
CHANGED
|
@@ -14,6 +14,8 @@ import { forgeAtoms } from './forge.js';
|
|
|
14
14
|
import { interactiveAtoms } from './interactive.js';
|
|
15
15
|
import { defiAtoms } from './defi.js';
|
|
16
16
|
import { onboardAtoms } from './onboard.js';
|
|
17
|
+
import { contentAtoms } from './content.js';
|
|
18
|
+
import { statusAtoms } from './status.js';
|
|
17
19
|
import { fallbackAtom, GENERIC_ATOM_ID } from './fallback.js';
|
|
18
20
|
const ALL_ATOMS = [
|
|
19
21
|
...layoutAtoms,
|
|
@@ -23,6 +25,8 @@ const ALL_ATOMS = [
|
|
|
23
25
|
...interactiveAtoms,
|
|
24
26
|
...defiAtoms,
|
|
25
27
|
...onboardAtoms,
|
|
28
|
+
...contentAtoms,
|
|
29
|
+
...statusAtoms,
|
|
26
30
|
fallbackAtom,
|
|
27
31
|
];
|
|
28
32
|
/** Atom id → Atom. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/atoms/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAa,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,SAAS,GAAW;IACxB,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,UAAU;IACb,GAAG,UAAU;IACb,GAAG,gBAAgB;IACnB,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,YAAY;CACb,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,KAAK,GAA8B,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzF,kEAAkE;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAEnE,MAAM,YAAY,GAA8B,CAAC,GAAG,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgB,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,EAAE,CAAC;AAEL,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;AAChD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,YAAY;YAAE,SAAS;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,OAAO,EAAwE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/atoms/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAa,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,SAAS,GAAW;IACxB,GAAG,WAAW;IACd,GAAG,WAAW;IACd,GAAG,UAAU;IACb,GAAG,UAAU;IACb,GAAG,gBAAgB;IACnB,GAAG,SAAS;IACZ,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,WAAW;IACd,YAAY;CACb,CAAC;AAEF,sBAAsB;AACtB,MAAM,CAAC,MAAM,KAAK,GAA8B,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAEzF,kEAAkE;AAClE,MAAM,CAAC,MAAM,QAAQ,GAAwB,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAEnE,MAAM,YAAY,GAA8B,CAAC,GAAG,EAAE;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAgB,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC,EAAE,CAAC;AAEL,mEAAmE;AACnE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC;AAChD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,eAAe;IAC7B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,IAAI,YAAY,EAAQ,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,KAAK,YAAY;YAAE,SAAS;QACpC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,eAAe,EAAE,CAAC;AAC3B,OAAO,EAAwE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared presentational helpers for the social atoms.
|
|
3
|
+
*
|
|
4
|
+
* Pure, deterministic, no network calls and no new deps — everything is derived
|
|
5
|
+
* from the data already on the event (pubkey, timestamps, content bytes).
|
|
6
|
+
*/
|
|
7
|
+
import { type FC } from 'react';
|
|
8
|
+
/** Two-char initials from a pubkey/npub, for the avatar fallback. */
|
|
9
|
+
export declare function initialsFor(pubkey: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* A deterministic gradient + readable foreground for an identity, derived from
|
|
12
|
+
* its pubkey. No network, no persisted state — the same key always renders the
|
|
13
|
+
* same colour, so a feed reads as a set of stable identities. Hue comes from the
|
|
14
|
+
* hash; lightness/chroma are fixed so it stays legible in light and dark.
|
|
15
|
+
*/
|
|
16
|
+
export declare function avatarColorsFor(pubkey: string): {
|
|
17
|
+
from: string;
|
|
18
|
+
to: string;
|
|
19
|
+
fg: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Format a unix timestamp (seconds) as a compact relative label: now, 5m, 3h,
|
|
23
|
+
* 2d, then an absolute month/day for anything older than a week. `nowMs` is
|
|
24
|
+
* injectable for deterministic tests.
|
|
25
|
+
*/
|
|
26
|
+
export declare function relativeTime(createdAtSec: number, nowMs?: number): string;
|
|
27
|
+
/** UTF-8 byte length of a string — the unit pay-to-write fees scale with. */
|
|
28
|
+
export declare function byteLength(value: string): number;
|
|
29
|
+
/**
|
|
30
|
+
* Identity avatar: profile picture when we have one, otherwise a deterministic
|
|
31
|
+
* gradient fallback with initials. The gradient hue is the only inline style and
|
|
32
|
+
* is derived from the pubkey; everything else rides the design tokens.
|
|
33
|
+
*/
|
|
34
|
+
export declare const IdentityAvatar: FC<{
|
|
35
|
+
pubkey: string;
|
|
36
|
+
name?: string | undefined;
|
|
37
|
+
picture?: string | undefined;
|
|
38
|
+
className?: string;
|
|
39
|
+
size?: 'default' | 'sm' | 'lg';
|
|
40
|
+
}>;
|
|
41
|
+
//# sourceMappingURL=social-ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social-ui.d.ts","sourceRoot":"","sources":["../../src/atoms/social-ui.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAC;AAchC,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAQxF;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,GAAE,MAAmB,GAAG,MAAM,CAWrF;AAED,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC,CAiBA,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Shared presentational helpers for the social atoms.
|
|
4
|
+
*
|
|
5
|
+
* Pure, deterministic, no network calls and no new deps — everything is derived
|
|
6
|
+
* from the data already on the event (pubkey, timestamps, content bytes).
|
|
7
|
+
*/
|
|
8
|
+
import {} from 'react';
|
|
9
|
+
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar.js';
|
|
10
|
+
import { cn } from '@/lib/utils.js';
|
|
11
|
+
/** A small fnv-1a hash → 32-bit unsigned int, stable for a given string. */
|
|
12
|
+
function hashString(value) {
|
|
13
|
+
let h = 0x811c9dc5;
|
|
14
|
+
for (let i = 0; i < value.length; i++) {
|
|
15
|
+
h ^= value.charCodeAt(i);
|
|
16
|
+
h = Math.imul(h, 0x01000193);
|
|
17
|
+
}
|
|
18
|
+
return h >>> 0;
|
|
19
|
+
}
|
|
20
|
+
/** Two-char initials from a pubkey/npub, for the avatar fallback. */
|
|
21
|
+
export function initialsFor(pubkey) {
|
|
22
|
+
const cleaned = pubkey.replace(/^npub1?/i, '') || pubkey;
|
|
23
|
+
return cleaned.slice(0, 2).toUpperCase();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* A deterministic gradient + readable foreground for an identity, derived from
|
|
27
|
+
* its pubkey. No network, no persisted state — the same key always renders the
|
|
28
|
+
* same colour, so a feed reads as a set of stable identities. Hue comes from the
|
|
29
|
+
* hash; lightness/chroma are fixed so it stays legible in light and dark.
|
|
30
|
+
*/
|
|
31
|
+
export function avatarColorsFor(pubkey) {
|
|
32
|
+
const hue = hashString(pubkey) % 360;
|
|
33
|
+
const hue2 = (hue + 38) % 360;
|
|
34
|
+
return {
|
|
35
|
+
from: `oklch(0.62 0.17 ${hue})`,
|
|
36
|
+
to: `oklch(0.55 0.19 ${hue2})`,
|
|
37
|
+
fg: 'oklch(0.99 0 0)',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Format a unix timestamp (seconds) as a compact relative label: now, 5m, 3h,
|
|
42
|
+
* 2d, then an absolute month/day for anything older than a week. `nowMs` is
|
|
43
|
+
* injectable for deterministic tests.
|
|
44
|
+
*/
|
|
45
|
+
export function relativeTime(createdAtSec, nowMs = Date.now()) {
|
|
46
|
+
const deltaSec = Math.max(0, Math.floor(nowMs / 1000 - createdAtSec));
|
|
47
|
+
if (deltaSec < 45)
|
|
48
|
+
return 'now';
|
|
49
|
+
const min = Math.floor(deltaSec / 60);
|
|
50
|
+
if (min < 60)
|
|
51
|
+
return `${min}m`;
|
|
52
|
+
const hr = Math.floor(min / 60);
|
|
53
|
+
if (hr < 24)
|
|
54
|
+
return `${hr}h`;
|
|
55
|
+
const day = Math.floor(hr / 24);
|
|
56
|
+
if (day < 7)
|
|
57
|
+
return `${day}d`;
|
|
58
|
+
const d = new Date(createdAtSec * 1000);
|
|
59
|
+
return d.toLocaleDateString(undefined, { month: 'short', day: 'numeric' });
|
|
60
|
+
}
|
|
61
|
+
/** UTF-8 byte length of a string — the unit pay-to-write fees scale with. */
|
|
62
|
+
export function byteLength(value) {
|
|
63
|
+
if (typeof TextEncoder !== 'undefined')
|
|
64
|
+
return new TextEncoder().encode(value).length;
|
|
65
|
+
return unescape(encodeURIComponent(value)).length;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Identity avatar: profile picture when we have one, otherwise a deterministic
|
|
69
|
+
* gradient fallback with initials. The gradient hue is the only inline style and
|
|
70
|
+
* is derived from the pubkey; everything else rides the design tokens.
|
|
71
|
+
*/
|
|
72
|
+
export const IdentityAvatar = ({ pubkey, name, picture, className, size = 'lg' }) => {
|
|
73
|
+
const colors = avatarColorsFor(pubkey);
|
|
74
|
+
const label = name ?? pubkey;
|
|
75
|
+
return (_jsxs(Avatar, { size: size, className: cn('shrink-0', className), children: [picture ? _jsx(AvatarImage, { src: picture, alt: `${label} avatar` }) : null, _jsx(AvatarFallback, { className: "font-semibold tracking-tight", style: {
|
|
76
|
+
backgroundImage: `linear-gradient(135deg, ${colors.from}, ${colors.to})`,
|
|
77
|
+
color: colors.fg,
|
|
78
|
+
}, children: initialsFor(pubkey) })] }));
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=social-ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social-ui.js","sourceRoot":"","sources":["../../src/atoms/social-ui.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../../src/atoms/social.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../../src/atoms/social.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,IAAI,EAAwB,MAAM,YAAY,CAAC;AAgM7D,eAAO,MAAM,WAAW,EAAE,IAAI,EAS7B,CAAC"}
|
package/dist/atoms/social.js
CHANGED
|
@@ -1,28 +1,54 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/** Social atoms — NIP-01 profile/note, NIP-25 reactions, NIP-02 follow. */
|
|
3
3
|
import {} from 'react';
|
|
4
|
+
import { Heart, MessageCircle } from 'lucide-react';
|
|
4
5
|
import { Button } from '@/components/ui/button.js';
|
|
5
6
|
import { Badge } from '@/components/ui/badge.js';
|
|
6
|
-
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar.js';
|
|
7
7
|
import { MonoId } from '@/components/mono-id.js';
|
|
8
|
-
import { parseProfile, parseNote, parseReaction } from '../parsers/social.js';
|
|
8
|
+
import { parseProfile, parseNote, parseReaction, } from '../parsers/social.js';
|
|
9
|
+
import { parseInlineMedia } from '../parsers/media.js';
|
|
10
|
+
import {} from '../types.js';
|
|
11
|
+
import { InlineMediaList } from './media.js';
|
|
9
12
|
import {} from './types.js';
|
|
10
|
-
|
|
11
|
-
return pubkey.slice(0, 2).toUpperCase();
|
|
12
|
-
}
|
|
13
|
+
import { IdentityAvatar, relativeTime } from './social-ui.js';
|
|
13
14
|
const ProfileHeader = ({ events }) => {
|
|
14
15
|
const profile = events.map(parseProfile).find((p) => p !== null) ?? null;
|
|
15
16
|
if (!profile)
|
|
16
17
|
return null;
|
|
17
18
|
const name = profile.displayName ?? profile.name ?? profile.pubkey;
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
return (_jsxs("div", { className: "flex items-center gap-3", children: [_jsx(IdentityAvatar, { pubkey: profile.pubkey, name: name, picture: profile.picture }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate font-semibold leading-tight", children: name }), profile.nip05 ? (_jsx("div", { className: "truncate text-xs text-muted-foreground", children: profile.nip05 })) : (_jsx(MonoId, { value: profile.pubkey, className: "text-muted-foreground" })), profile.about ? (_jsx("p", { className: "mt-1 line-clamp-2 text-sm text-muted-foreground", children: profile.about })) : null] })] }));
|
|
20
|
+
};
|
|
21
|
+
/** A single feed item: identity row, note body, inline media, engagement. */
|
|
22
|
+
const NoteRow = ({ event, note, profile, reactionCount, actions }) => {
|
|
23
|
+
const media = parseInlineMedia(event);
|
|
24
|
+
const displayName = profile?.displayName ?? profile?.name;
|
|
25
|
+
const reply = actions['reply'];
|
|
26
|
+
const react = actions['react'];
|
|
27
|
+
return (_jsxs("article", { className: "group/note flex gap-3 px-1 py-3 transition-colors first:pt-0 last:pb-0 hover:bg-muted/30", children: [_jsx(IdentityAvatar, { pubkey: note.authorPubkey, name: displayName, picture: profile?.picture }), _jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [_jsxs("header", { className: "flex items-baseline gap-2", children: [displayName ? (_jsx("span", { className: "truncate font-semibold leading-tight", children: displayName })) : (_jsx(MonoId, { value: note.authorPubkey })), note.isReply ? (_jsx(Badge, { variant: "secondary", className: "px-1.5 py-0 text-[10px] font-normal", children: "reply" })) : null, _jsx("span", { className: "ml-auto shrink-0 text-xs text-muted-foreground tabular-nums", children: relativeTime(note.createdAt) })] }), note.content ? (_jsx("p", { className: "whitespace-pre-wrap break-words text-sm leading-relaxed text-foreground", children: note.content })) : null, media.length > 0 ? (_jsx("div", { className: "mt-1", children: _jsx(InlineMediaList, { variants: media }) })) : null, reply || react ? (_jsxs("footer", { className: "mt-1 flex items-center gap-1 text-muted-foreground", children: [reply ? (_jsxs(Button, { variant: "ghost", size: "sm", "aria-label": "Reply to this note", className: "h-7 gap-1.5 px-2 text-xs hover:text-foreground", onClick: () => void reply({ parentId: note.eventId }), children: [_jsx(MessageCircle, { "aria-hidden": "true" }), "Reply"] })) : null, react ? (_jsxs(Button, { variant: "ghost", size: "sm", "aria-label": "React to this note", className: "h-7 gap-1.5 px-2 text-xs hover:text-foreground", onClick: () => void react({ content: '+' }), children: [_jsx(Heart, { "aria-hidden": "true" }), "React", reactionCount > 0 ? (_jsx("span", { className: "tabular-nums", children: reactionCount })) : null] })) : null] })) : null] })] }));
|
|
20
28
|
};
|
|
21
29
|
const NoteCard = ({ events, actions }) => {
|
|
22
|
-
const
|
|
23
|
-
|
|
30
|
+
const noteItems = events
|
|
31
|
+
.map((event) => ({ event, note: parseNote(event) }))
|
|
32
|
+
.filter((item) => item.note !== null);
|
|
33
|
+
if (noteItems.length === 0)
|
|
24
34
|
return null;
|
|
25
|
-
|
|
35
|
+
// A feed bind may carry kind:0 profiles alongside the notes; join them by
|
|
36
|
+
// pubkey so an author renders with a real name/picture when one is present.
|
|
37
|
+
const profiles = new Map();
|
|
38
|
+
for (const event of events) {
|
|
39
|
+
const profile = parseProfile(event);
|
|
40
|
+
if (profile)
|
|
41
|
+
profiles.set(profile.pubkey, profile);
|
|
42
|
+
}
|
|
43
|
+
// Reaction counts, keyed by the targeted note (NIP-25 `e` tag).
|
|
44
|
+
const reactionCounts = new Map();
|
|
45
|
+
for (const event of events) {
|
|
46
|
+
const reaction = parseReaction(event);
|
|
47
|
+
if (reaction?.targetEventId) {
|
|
48
|
+
reactionCounts.set(reaction.targetEventId, (reactionCounts.get(reaction.targetEventId) ?? 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return (_jsx("div", { className: "flex flex-col divide-y divide-border", children: noteItems.map(({ event, note }) => (_jsx(NoteRow, { event: event, note: note, profile: profiles.get(note.authorPubkey), reactionCount: reactionCounts.get(note.eventId) ?? 0, actions: actions }, note.eventId))) }));
|
|
26
52
|
};
|
|
27
53
|
const ReactionBar = ({ events, actions }) => {
|
|
28
54
|
const counts = new Map();
|
|
@@ -33,7 +59,7 @@ const ReactionBar = ({ events, actions }) => {
|
|
|
33
59
|
const key = reaction.content || '+';
|
|
34
60
|
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
35
61
|
}
|
|
36
|
-
return (_jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [[...counts.entries()].map(([emoji, n]) => (_jsxs(Badge, { variant: "secondary", children: [emoji, " ", n] }, emoji))), actions['react'] ? (
|
|
62
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [[...counts.entries()].map(([emoji, n]) => (_jsxs(Badge, { variant: "secondary", className: "gap-1 tabular-nums", children: [emoji, " ", n] }, emoji))), actions['react'] ? (_jsxs(Button, { variant: "outline", size: "sm", "aria-label": "Add a reaction", className: "h-6 gap-1 rounded-full px-2 text-xs", onClick: () => void actions['react']?.({ content: '+' }), children: [_jsx(Heart, { "aria-hidden": "true" }), "React"] })) : null] }));
|
|
37
63
|
};
|
|
38
64
|
const FollowButton = ({ props, actions }) => {
|
|
39
65
|
const label = typeof props['label'] === 'string' ? props['label'] : 'Follow';
|