@uplifted/react 0.22.6

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 (221) hide show
  1. package/dist/AddClientSheet.d.ts +39 -0
  2. package/dist/AddClientSheet.d.ts.map +1 -0
  3. package/dist/AddClientSheet.js +108 -0
  4. package/dist/AddClientSheet.js.map +1 -0
  5. package/dist/AiSettingsSheet.d.ts +20 -0
  6. package/dist/AiSettingsSheet.d.ts.map +1 -0
  7. package/dist/AiSettingsSheet.js +274 -0
  8. package/dist/AiSettingsSheet.js.map +1 -0
  9. package/dist/AssistantGrid.d.ts +30 -0
  10. package/dist/AssistantGrid.d.ts.map +1 -0
  11. package/dist/AssistantGrid.js +68 -0
  12. package/dist/AssistantGrid.js.map +1 -0
  13. package/dist/AttachmentPicker.d.ts +38 -0
  14. package/dist/AttachmentPicker.d.ts.map +1 -0
  15. package/dist/AttachmentPicker.js +173 -0
  16. package/dist/AttachmentPicker.js.map +1 -0
  17. package/dist/BulkGenerateSheet.d.ts +25 -0
  18. package/dist/BulkGenerateSheet.d.ts.map +1 -0
  19. package/dist/BulkGenerateSheet.js +65 -0
  20. package/dist/BulkGenerateSheet.js.map +1 -0
  21. package/dist/ChannelBadge.d.ts +16 -0
  22. package/dist/ChannelBadge.d.ts.map +1 -0
  23. package/dist/ChannelBadge.js +19 -0
  24. package/dist/ChannelBadge.js.map +1 -0
  25. package/dist/ChannelExplainer.d.ts +17 -0
  26. package/dist/ChannelExplainer.d.ts.map +1 -0
  27. package/dist/ChannelExplainer.js +25 -0
  28. package/dist/ChannelExplainer.js.map +1 -0
  29. package/dist/ClientList.d.ts +43 -0
  30. package/dist/ClientList.d.ts.map +1 -0
  31. package/dist/ClientList.js +76 -0
  32. package/dist/ClientList.js.map +1 -0
  33. package/dist/ClosedWindowBanner.d.ts +12 -0
  34. package/dist/ClosedWindowBanner.d.ts.map +1 -0
  35. package/dist/ClosedWindowBanner.js +15 -0
  36. package/dist/ClosedWindowBanner.js.map +1 -0
  37. package/dist/Composer.d.ts +49 -0
  38. package/dist/Composer.d.ts.map +1 -0
  39. package/dist/Composer.js +99 -0
  40. package/dist/Composer.js.map +1 -0
  41. package/dist/ComposerExtras.d.ts +15 -0
  42. package/dist/ComposerExtras.d.ts.map +1 -0
  43. package/dist/ComposerExtras.js +14 -0
  44. package/dist/ComposerExtras.js.map +1 -0
  45. package/dist/ConversationPane.d.ts +33 -0
  46. package/dist/ConversationPane.d.ts.map +1 -0
  47. package/dist/ConversationPane.js +126 -0
  48. package/dist/ConversationPane.js.map +1 -0
  49. package/dist/DeliveryReceipt.d.ts +7 -0
  50. package/dist/DeliveryReceipt.d.ts.map +1 -0
  51. package/dist/DeliveryReceipt.js +13 -0
  52. package/dist/DeliveryReceipt.js.map +1 -0
  53. package/dist/DraftGrid.d.ts +17 -0
  54. package/dist/DraftGrid.d.ts.map +1 -0
  55. package/dist/DraftGrid.js +43 -0
  56. package/dist/DraftGrid.js.map +1 -0
  57. package/dist/HostPreviewPane.d.ts +37 -0
  58. package/dist/HostPreviewPane.d.ts.map +1 -0
  59. package/dist/HostPreviewPane.js +106 -0
  60. package/dist/HostPreviewPane.js.map +1 -0
  61. package/dist/InlineDrafts.d.ts +14 -0
  62. package/dist/InlineDrafts.d.ts.map +1 -0
  63. package/dist/InlineDrafts.js +19 -0
  64. package/dist/InlineDrafts.js.map +1 -0
  65. package/dist/ItemActions.d.ts +23 -0
  66. package/dist/ItemActions.d.ts.map +1 -0
  67. package/dist/ItemActions.js +83 -0
  68. package/dist/ItemActions.js.map +1 -0
  69. package/dist/MediaAttachment.d.ts +7 -0
  70. package/dist/MediaAttachment.d.ts.map +1 -0
  71. package/dist/MediaAttachment.js +37 -0
  72. package/dist/MediaAttachment.js.map +1 -0
  73. package/dist/OfferSheet.d.ts +32 -0
  74. package/dist/OfferSheet.d.ts.map +1 -0
  75. package/dist/OfferSheet.js +84 -0
  76. package/dist/OfferSheet.js.map +1 -0
  77. package/dist/ProactiveOptionsSheet.d.ts +14 -0
  78. package/dist/ProactiveOptionsSheet.d.ts.map +1 -0
  79. package/dist/ProactiveOptionsSheet.js +58 -0
  80. package/dist/ProactiveOptionsSheet.js.map +1 -0
  81. package/dist/QuickSend.d.ts +15 -0
  82. package/dist/QuickSend.d.ts.map +1 -0
  83. package/dist/QuickSend.js +90 -0
  84. package/dist/QuickSend.js.map +1 -0
  85. package/dist/SegmentEditor.d.ts +25 -0
  86. package/dist/SegmentEditor.d.ts.map +1 -0
  87. package/dist/SegmentEditor.js +95 -0
  88. package/dist/SegmentEditor.js.map +1 -0
  89. package/dist/Sheet.d.ts +13 -0
  90. package/dist/Sheet.d.ts.map +1 -0
  91. package/dist/Sheet.js +64 -0
  92. package/dist/Sheet.js.map +1 -0
  93. package/dist/ThreadFeed.d.ts +27 -0
  94. package/dist/ThreadFeed.d.ts.map +1 -0
  95. package/dist/ThreadFeed.js +42 -0
  96. package/dist/ThreadFeed.js.map +1 -0
  97. package/dist/UpliftPanel.d.ts +40 -0
  98. package/dist/UpliftPanel.d.ts.map +1 -0
  99. package/dist/UpliftPanel.js +219 -0
  100. package/dist/UpliftPanel.js.map +1 -0
  101. package/dist/UpliftProvider.d.ts +15 -0
  102. package/dist/UpliftProvider.d.ts.map +1 -0
  103. package/dist/UpliftProvider.js +19 -0
  104. package/dist/UpliftProvider.js.map +1 -0
  105. package/dist/WaitingTemplateGhost.d.ts +12 -0
  106. package/dist/WaitingTemplateGhost.d.ts.map +1 -0
  107. package/dist/WaitingTemplateGhost.js +16 -0
  108. package/dist/WaitingTemplateGhost.js.map +1 -0
  109. package/dist/channels.d.ts +22 -0
  110. package/dist/channels.d.ts.map +1 -0
  111. package/dist/channels.js +31 -0
  112. package/dist/channels.js.map +1 -0
  113. package/dist/errors.d.ts +6 -0
  114. package/dist/errors.d.ts.map +1 -0
  115. package/dist/errors.js +20 -0
  116. package/dist/errors.js.map +1 -0
  117. package/dist/host.d.ts +45 -0
  118. package/dist/host.d.ts.map +1 -0
  119. package/dist/host.js +35 -0
  120. package/dist/host.js.map +1 -0
  121. package/dist/icons.d.ts +48 -0
  122. package/dist/icons.d.ts.map +1 -0
  123. package/dist/icons.js +71 -0
  124. package/dist/icons.js.map +1 -0
  125. package/dist/index.d.ts +58 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +36 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/labels.d.ts +58 -0
  130. package/dist/labels.d.ts.map +1 -0
  131. package/dist/labels.js +86 -0
  132. package/dist/labels.js.map +1 -0
  133. package/dist/phone.d.ts +18 -0
  134. package/dist/phone.d.ts.map +1 -0
  135. package/dist/phone.js +27 -0
  136. package/dist/phone.js.map +1 -0
  137. package/dist/proactiveIcons.d.ts +6 -0
  138. package/dist/proactiveIcons.d.ts.map +1 -0
  139. package/dist/proactiveIcons.js +39 -0
  140. package/dist/proactiveIcons.js.map +1 -0
  141. package/dist/purposes.d.ts +19 -0
  142. package/dist/purposes.d.ts.map +1 -0
  143. package/dist/purposes.js +20 -0
  144. package/dist/purposes.js.map +1 -0
  145. package/dist/segments.d.ts +29 -0
  146. package/dist/segments.d.ts.map +1 -0
  147. package/dist/segments.js +75 -0
  148. package/dist/segments.js.map +1 -0
  149. package/dist/smsSegments.d.ts +28 -0
  150. package/dist/smsSegments.d.ts.map +1 -0
  151. package/dist/smsSegments.js +100 -0
  152. package/dist/smsSegments.js.map +1 -0
  153. package/dist/styles.d.ts +15 -0
  154. package/dist/styles.d.ts.map +1 -0
  155. package/dist/styles.js +545 -0
  156. package/dist/styles.js.map +1 -0
  157. package/dist/time.d.ts +14 -0
  158. package/dist/time.d.ts.map +1 -0
  159. package/dist/time.js +80 -0
  160. package/dist/time.js.map +1 -0
  161. package/dist/useAiSettings.d.ts +11 -0
  162. package/dist/useAiSettings.d.ts.map +1 -0
  163. package/dist/useAiSettings.js +21 -0
  164. package/dist/useAiSettings.js.map +1 -0
  165. package/dist/useBilling.d.ts +40 -0
  166. package/dist/useBilling.d.ts.map +1 -0
  167. package/dist/useBilling.js +155 -0
  168. package/dist/useBilling.js.map +1 -0
  169. package/dist/useBulkDrafts.d.ts +41 -0
  170. package/dist/useBulkDrafts.d.ts.map +1 -0
  171. package/dist/useBulkDrafts.js +112 -0
  172. package/dist/useBulkDrafts.js.map +1 -0
  173. package/dist/useClients.d.ts +16 -0
  174. package/dist/useClients.d.ts.map +1 -0
  175. package/dist/useClients.js +22 -0
  176. package/dist/useClients.js.map +1 -0
  177. package/dist/useDeliveryStatus.d.ts +7 -0
  178. package/dist/useDeliveryStatus.d.ts.map +1 -0
  179. package/dist/useDeliveryStatus.js +39 -0
  180. package/dist/useDeliveryStatus.js.map +1 -0
  181. package/dist/useDrafts.d.ts +19 -0
  182. package/dist/useDrafts.d.ts.map +1 -0
  183. package/dist/useDrafts.js +60 -0
  184. package/dist/useDrafts.js.map +1 -0
  185. package/dist/useInstructions.d.ts +9 -0
  186. package/dist/useInstructions.d.ts.map +1 -0
  187. package/dist/useInstructions.js +20 -0
  188. package/dist/useInstructions.js.map +1 -0
  189. package/dist/useLiveUpdates.d.ts +9 -0
  190. package/dist/useLiveUpdates.d.ts.map +1 -0
  191. package/dist/useLiveUpdates.js +48 -0
  192. package/dist/useLiveUpdates.js.map +1 -0
  193. package/dist/usePolling.d.ts +6 -0
  194. package/dist/usePolling.d.ts.map +1 -0
  195. package/dist/usePolling.js +31 -0
  196. package/dist/usePolling.js.map +1 -0
  197. package/dist/usePreviewDrafts.d.ts +15 -0
  198. package/dist/usePreviewDrafts.d.ts.map +1 -0
  199. package/dist/usePreviewDrafts.js +77 -0
  200. package/dist/usePreviewDrafts.js.map +1 -0
  201. package/dist/useProactiveOptions.d.ts +15 -0
  202. package/dist/useProactiveOptions.d.ts.map +1 -0
  203. package/dist/useProactiveOptions.js +39 -0
  204. package/dist/useProactiveOptions.js.map +1 -0
  205. package/dist/useSend.d.ts +16 -0
  206. package/dist/useSend.d.ts.map +1 -0
  207. package/dist/useSend.js +50 -0
  208. package/dist/useSend.js.map +1 -0
  209. package/dist/useStickToBottom.d.ts +12 -0
  210. package/dist/useStickToBottom.d.ts.map +1 -0
  211. package/dist/useStickToBottom.js +71 -0
  212. package/dist/useStickToBottom.js.map +1 -0
  213. package/dist/useThread.d.ts +26 -0
  214. package/dist/useThread.d.ts.map +1 -0
  215. package/dist/useThread.js +76 -0
  216. package/dist/useThread.js.map +1 -0
  217. package/dist/useWhatsAppWindow.d.ts +8 -0
  218. package/dist/useWhatsAppWindow.d.ts.map +1 -0
  219. package/dist/useWhatsAppWindow.js +22 -0
  220. package/dist/useWhatsAppWindow.js.map +1 -0
  221. package/package.json +36 -0
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { IconAlert, IconCheck, IconCheckDouble } from "./icons.js";
3
+ /** WhatsApp-style receipt, a port of native DeliveryReceipt: ✓ handed off, ✓✓ delivered, ⚠ failed (title carries the error). */
4
+ export function DeliveryReceipt({ status, error }) {
5
+ if (!status)
6
+ return null;
7
+ if (status === "delivered" || status === "read")
8
+ return _jsx("span", { className: "u-rcpt u-rcpt-ok", title: "Delivered", "aria-label": "Delivered", children: _jsx(IconCheckDouble, {}) });
9
+ if (status === "failed" || status === "undelivered")
10
+ return _jsx("span", { className: "u-rcpt u-rcpt-bad", title: `Not delivered${error ? `: ${error}` : ""}`, "aria-label": `Not delivered${error ? `: ${error}` : ""}`, children: _jsx(IconAlert, {}) });
11
+ return _jsx("span", { className: "u-rcpt", title: "Sent", "aria-label": "Sent", children: _jsx(IconCheck, {}) });
12
+ }
13
+ //# sourceMappingURL=DeliveryReceipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeliveryReceipt.js","sourceRoot":"","sources":["../src/DeliveryReceipt.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnE,gIAAgI;AAChI,MAAM,UAAU,eAAe,CAAC,EAAE,MAAM,EAAE,KAAK,EAAoF;IACjI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,eAAM,SAAS,EAAC,kBAAkB,EAAC,KAAK,EAAC,WAAW,gBAAY,WAAW,YAAC,KAAC,eAAe,KAAG,GAAO,CAAC;IAC/J,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,aAAa;QAAE,OAAO,eAAM,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,gBAAgB,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAc,gBAAgB,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,YAAE,KAAC,SAAS,KAAG,GAAO,CAAC;IAClO,OAAO,eAAM,SAAS,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,gBAAY,MAAM,YAAC,KAAC,SAAS,KAAG,GAAO,CAAC;AACtF,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { Tone } from "@uplifted/sdk";
2
+ import type { DraftsState } from "./useDrafts.js";
3
+ export interface DraftGridProps {
4
+ drafts: DraftsState;
5
+ selected: Tone | null;
6
+ onPick: (tone: Tone, text: string) => void;
7
+ onGenerate: () => void;
8
+ clientFirstName: string;
9
+ /** D19 preview: drafted from host activity only, for a client not on Uplift. Changes the labels, not the grid. */
10
+ preview?: boolean | undefined;
11
+ }
12
+ /**
13
+ * Four drafts as a radio group (D17): arrows move, Enter or click loads the composer.
14
+ * Loading, error and rate-limit states follow the T9 state table and D11.
15
+ */
16
+ export declare function DraftGrid({ drafts, selected, onPick, onGenerate, clientFirstName, preview }: DraftGridProps): import("react").JSX.Element | null;
17
+ //# sourceMappingURL=DraftGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraftGrid.d.ts","sourceRoot":"","sources":["../src/DraftGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kHAAkH;IAClH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,OAAe,EAAE,EAAE,cAAc,sCAsEnH"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef } from "react";
3
+ import { TONES } from "./labels.js";
4
+ /**
5
+ * Four drafts as a radio group (D17): arrows move, Enter or click loads the composer.
6
+ * Loading, error and rate-limit states follow the T9 state table and D11.
7
+ */
8
+ export function DraftGrid({ drafts, selected, onPick, onGenerate, clientFirstName, preview = false }) {
9
+ const cells = useRef([]);
10
+ if (drafts.status === "idle")
11
+ return null;
12
+ const refused = drafts.status === "error" && drafts.error?.code === "refused";
13
+ const limited = drafts.retryIn !== null;
14
+ const regenDisabled = drafts.status === "loading" || limited;
15
+ const onKey = (i) => (e) => {
16
+ const n = TONES.length;
17
+ let next = null;
18
+ if (e.key === "ArrowRight" || e.key === "ArrowDown")
19
+ next = (i + 1) % n;
20
+ if (e.key === "ArrowLeft" || e.key === "ArrowUp")
21
+ next = (i - 1 + n) % n;
22
+ if (next === null)
23
+ return;
24
+ e.preventDefault();
25
+ const btn = cells.current[next];
26
+ btn?.focus();
27
+ const tone = TONES[next];
28
+ if (btn && tone && drafts.drafts)
29
+ onPick(tone.key, drafts.drafts[tone.key]);
30
+ };
31
+ return (_jsxs("section", { className: "u-assist", "aria-label": "Drafts", children: [_jsxs("div", { className: "u-assist-h", children: [_jsx("h4", { children: preview ? "Preview drafts" : "Reply drafts" }), _jsx("span", { className: "u-by", children: preview ? "· Uplift, from activity only" : "· Uplift, in your voice" }), _jsx("span", { className: "u-sp" }), limited && _jsxs("span", { className: "u-by", role: "status", children: ["Try again in ", drafts.retryIn, "s"] }), _jsx("button", { type: "button", className: "u-iconbtn", "aria-label": "Regenerate drafts", title: "Regenerate", disabled: regenDisabled, onClick: onGenerate, children: "\u21BB" })] }), !refused && (_jsx("div", { className: "u-grid", role: "radiogroup", "aria-label": "Pick a draft", "aria-busy": drafts.status === "loading", children: TONES.map((t, i) => {
32
+ if (drafts.status === "loading") {
33
+ return _jsxs("div", { className: "u-cell u-loading", children: [_jsx("span", { className: "u-lab", children: t.label }), _jsx("span", { className: "u-txt", children: "Writing in your voice\u2026" })] }, t.key);
34
+ }
35
+ if (drafts.status === "error") {
36
+ return (_jsxs("div", { className: "u-cell u-err", role: "group", "aria-label": `${t.label} draft failed`, children: [_jsx("span", { className: "u-lab", children: t.label }), _jsx("span", { className: "u-txt", children: "Couldn't write this one." }), i === 0 && !limited && _jsx("button", { type: "button", className: "u-retry", onClick: onGenerate, children: "Retry" })] }, t.key));
37
+ }
38
+ const text = drafts.drafts?.[t.key] ?? "";
39
+ const checked = selected === t.key;
40
+ return (_jsxs("button", { ref: (el) => { cells.current[i] = el; }, type: "button", role: "radio", "aria-checked": checked, tabIndex: checked || (selected === null && i === 0) ? 0 : -1, className: "u-cell", onClick: () => onPick(t.key, text), onKeyDown: onKey(i), children: [_jsx("span", { className: "u-lab", children: t.label }), _jsx("span", { className: "u-txt", children: text || "…" })] }, t.key));
41
+ }) })), _jsx("div", { className: "u-assist-f", children: _jsx("span", { children: refused ? "Uplift won't draft this one. Write it yourself." : preview ? `Based on ${clientFirstName}'s recent activity only. Connect ${clientFirstName} and Uplift drafts from the whole conversation, in your voice.` : `Based on this conversation and ${clientFirstName}'s training.` }) })] }));
42
+ }
43
+ //# sourceMappingURL=DraftGrid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraftGrid.js","sourceRoot":"","sources":["../src/DraftGrid.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type ReactNode } from "react";
2
+ import type { DraftSet } from "@uplifted/sdk";
3
+ import { type Purpose } from "./purposes.js";
4
+ import { type HostActivityLoader, type HostClient } from "./host.js";
5
+ import type { InstructionsState } from "./useInstructions.js";
6
+ export interface HostPreviewPaneProps {
7
+ host: HostClient;
8
+ hostName: string;
9
+ coachName?: string | undefined;
10
+ loadActivity?: HostActivityLoader | undefined;
11
+ now: Date;
12
+ onBack: () => void;
13
+ /** Open the add-client sheet for this host client. */
14
+ /** Connect this client; `draft` is what the coach had written, to wait in their new conversation. */
15
+ onConnect: (host: HostClient, draft?: string) => void;
16
+ purposes?: readonly Purpose[] | undefined;
17
+ onCustomize?: (() => void) | undefined;
18
+ /** The coach's AI instructions, for Config AI on each card. Without it the card action rows are not shown. */
19
+ instructions?: InstructionsState | undefined;
20
+ /** How many clients the coach has connected; with none, Config AI opens the connect sheet first. */
21
+ connectedCount?: number;
22
+ /** Opens the plan offer when preview drafts are refused because the coach's plan lapsed. */
23
+ onPlanInactive?: (() => void) | undefined;
24
+ /** Drafts Bulk generate already wrote for this client: shown instead of drafting again. */
25
+ cachedDrafts?: DraftSet | null | undefined;
26
+ /** The panel's AI settings and full screen buttons, at the right end of this header. */
27
+ headActions?: ReactNode;
28
+ }
29
+ /**
30
+ * Right pane for a host client who is not on Uplift yet (D19). Same layout as a conversation:
31
+ * the host's activity as the feed, preview drafts from that activity, and the normal composer.
32
+ * Send opens the connect sheet instead of sending; once connected the real conversation opens
33
+ * fresh and the coach drafts again from there (Ian, 2026-10-11: no auto-send, just reset).
34
+ * Nothing here is stored on Uplift.
35
+ */
36
+ export declare function HostPreviewPane({ host, hostName, coachName, loadActivity, now, onBack, onConnect, purposes, onCustomize, instructions, connectedCount, onPlanInactive, cachedDrafts, headActions }: HostPreviewPaneProps): import("react").JSX.Element;
37
+ //# sourceMappingURL=HostPreviewPane.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostPreviewPane.d.ts","sourceRoot":"","sources":["../src/HostPreviewPane.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClF,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG7D,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAsC,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAKzG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG9D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC9C,GAAG,EAAE,IAAI,CAAC;IACV,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,sDAAsD;IACtD,qGAAqG;IACrG,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACvC,8GAA8G;IAC9G,YAAY,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAC7C,oGAAoG;IACpG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,cAAc,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC1C,2FAA2F;IAC3F,YAAY,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,wFAAwF;IACxF,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,QAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,cAAkB,EAAE,cAAc,EAAE,YAAmB,EAAE,WAAW,EAAE,EAAE,oBAAoB,+BAwI9O"}
@@ -0,0 +1,106 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useState } from "react";
3
+ import { Composer } from "./Composer.js";
4
+ import { IconUplift } from "./icons.js";
5
+ import { PURPOSES } from "./purposes.js";
6
+ import { ThreadFeed } from "./ThreadFeed.js";
7
+ import { stockIntro } from "./host.js";
8
+ import { avatarColor, firstName, initials } from "./labels.js";
9
+ import { toPreviewEvent, usePreviewDrafts } from "./usePreviewDrafts.js";
10
+ import { ItemActions } from "./ItemActions.js";
11
+ import { useUplift } from "./UpliftProvider.js";
12
+ /**
13
+ * Right pane for a host client who is not on Uplift yet (D19). Same layout as a conversation:
14
+ * the host's activity as the feed, preview drafts from that activity, and the normal composer.
15
+ * Send opens the connect sheet instead of sending; once connected the real conversation opens
16
+ * fresh and the coach drafts again from there (Ian, 2026-10-11: no auto-send, just reset).
17
+ * Nothing here is stored on Uplift.
18
+ */
19
+ export function HostPreviewPane({ host, hostName, coachName, loadActivity, now, onBack, onConnect, purposes = PURPOSES, onCustomize, instructions, connectedCount = 0, onPlanInactive, cachedDrafts = null, headActions }) {
20
+ const { client: api } = useUplift();
21
+ const [events, setEvents] = useState(null);
22
+ const [failed, setFailed] = useState(null);
23
+ const [tick, setTick] = useState(0);
24
+ const first = firstName(host.name);
25
+ useEffect(() => {
26
+ let live = true;
27
+ setEvents(null);
28
+ setFailed(null);
29
+ if (!loadActivity) {
30
+ setEvents([]);
31
+ return;
32
+ }
33
+ loadActivity(host.id).then((r) => { if (live)
34
+ setEvents(r.events); }, (err) => { if (live)
35
+ setFailed(err instanceof Error ? err.message : "Could not load activity"); });
36
+ return () => { live = false; };
37
+ }, [host.id, loadActivity, tick]);
38
+ const thread = useMemo(() => ({
39
+ status: failed ? "error" : events === null ? "loading" : "ready",
40
+ messages: (events ?? [])
41
+ .slice()
42
+ .sort((a, b) => a.occurredAt.localeCompare(b.occurredAt))
43
+ .map((e) => ({ id: e.id, kind: "event", body: e.title, sentAt: e.occurredAt, eventType: e.type })),
44
+ error: failed ? { name: "UpliftError", message: failed, code: "unknown", status: 0, retryable: true } : null,
45
+ hasMore: false,
46
+ loadingOlder: false,
47
+ loadOlder: () => { },
48
+ append: () => { },
49
+ reload: () => setTick((t) => t + 1),
50
+ replyDrafts: null,
51
+ unreadCount: 0,
52
+ setReplyDrafts: () => { },
53
+ refresh: () => { },
54
+ patch: () => { },
55
+ }), [events, failed]);
56
+ // With nothing logged there is nothing to draft from, so the model is never asked (it would
57
+ // invent a session). The editor holds Uplift's stock intro instead, as one locked pill: the
58
+ // message that actually goes first once the client is connected.
59
+ const hasActivity = events !== null && events.length > 0;
60
+ const drafts = usePreviewDrafts(hasActivity ? { clientName: host.name, coachName, events } : null);
61
+ const [tone, setTone] = useState(null);
62
+ const [text, setText] = useState("");
63
+ const [inject, setInject] = useState(null);
64
+ const onPick = useCallback((picked, draft) => {
65
+ setTone(picked);
66
+ setText(draft);
67
+ setInject((i) => ({ text: draft, key: (i?.key ?? 0) + 1 }));
68
+ }, []);
69
+ const onText = useCallback((t) => { setText(t); setTone(null); }, []);
70
+ // The ✨ menu works here too: a purpose goes to the preview endpoint as free text (same as the
71
+ // connected pane), and the grid is labelled after it.
72
+ const [draftsLabel, setDraftsLabel] = useState(cachedDrafts ? "Bulk drafts" : "Preview drafts");
73
+ const onGenerate = useCallback((purpose) => {
74
+ setDraftsLabel(purpose ? `${purpose.label} options` : "Preview drafts");
75
+ drafts.generate(purpose ? { purpose: purpose.cannedText ?? purpose.prompt } : {});
76
+ }, [drafts]);
77
+ useEffect(() => {
78
+ if (events === null || hasActivity)
79
+ return;
80
+ const intro = stockIntro({ clientName: host.name, coachName });
81
+ setText(intro);
82
+ setInject((i) => ({ text: intro, key: (i?.key ?? 0) + 1, locked: true }));
83
+ }, [events, hasActivity, host.name, coachName]);
84
+ // Bulk drafts first, before the auto-draft below sees an idle grid (no second model call).
85
+ const { generate, status, seed } = drafts;
86
+ useEffect(() => { if (cachedDrafts)
87
+ seed(cachedDrafts); }, []); // eslint-disable-line react-hooks/exhaustive-deps
88
+ // The preview is the point of this pane: draft as soon as the activity is in, no button.
89
+ useEffect(() => {
90
+ if (hasActivity && status === "idle")
91
+ generate();
92
+ }, [hasActivity, status, generate]);
93
+ return (_jsxs("div", { className: "u-pane", "data-host-preview": host.id, children: [_jsxs("div", { className: "u-pane-head", children: [_jsx("button", { type: "button", className: "u-back", "aria-label": "Back to clients", title: "Back to clients", onClick: onBack, children: "\u2190" }), _jsx("span", { className: "u-av u-av-sm", style: { background: avatarColor(host.id) }, "aria-hidden": "true", children: initials(host.name) }), _jsxs("span", { className: "u-who", children: [_jsx("strong", { children: host.name }), _jsxs("small", { children: [hostName, " client"] })] }), _jsxs("button", { type: "button", className: "u-headbtn u-connect", "aria-label": `Connect ${first}`, title: `Connect ${first} to Uplift`, onClick: () => onConnect(host, text), children: [_jsx(IconUplift, {}), _jsx("span", { children: "Connect" })] }), headActions] }), thread.status === "ready" && thread.messages.length === 0
94
+ ? (_jsx("div", { className: "u-feed", role: "log", "aria-label": `Activity for ${host.name}`, children: _jsx("div", { className: "u-state", children: _jsxs("p", { children: ["No ", hostName, " activity for Uplift to analyze."] }) }) }))
95
+ : (_jsx(ThreadFeed, { thread: thread, clientName: host.name, activitySourceLabel: hostName, now: now,
96
+ // Per-card reply options come from the stateless preview endpoint with just that card, so
97
+ // nothing is stored on Uplift. Config AI is the coach's account-wide rules: with no clients
98
+ // connected yet it opens the connect sheet instead.
99
+ actions: (m) => {
100
+ const ev = events?.find((e) => e.id === m.id);
101
+ if (!ev || !instructions)
102
+ return null;
103
+ return (_jsx(ItemActions, { generate: () => api.previewDrafts({ clientName: host.name, ...(coachName ? { coachName } : {}), events: [toPreviewEvent(ev)] }), surface: "update", onPick: onPick, instructions: instructions, onConfigure: connectedCount === 0 ? () => onConnect(host) : undefined, notConnectedName: first, onNeedsPlan: onPlanInactive }, m.id));
104
+ } })), _jsx(Composer, { recipient: { name: host.name }, text: text, onText: onText, inject: inject, drafts: drafts, draftsLabel: draftsLabel, selectedTone: tone, onPick: onPick, onGenerate: onGenerate, purposes: purposes, onCustomize: onCustomize, generateDisabled: !hasActivity || drafts.status === "loading" || drafts.retryIn !== null, onSend: ({ body }) => onConnect(host, body), onNeedsPlan: (reason) => (reason === "plan_inactive" && onPlanInactive ? onPlanInactive() : onConnect(host, text)), attachments: false })] }));
105
+ }
106
+ //# sourceMappingURL=HostPreviewPane.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HostPreviewPane.js","sourceRoot":"","sources":["../src/HostPreviewPane.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { DraftSet, Tone } from "@uplifted/sdk";
2
+ /**
3
+ * Reply drafts shown right under the client's latest message, a port of native InlineDrafts: the
4
+ * four tones as compact chips, a regenerate control, and "Not now" to hide them. Picking one loads
5
+ * the editor; nothing sends.
6
+ */
7
+ export declare function InlineDrafts({ drafts, onPick, onRegenerate, regenerating, onDismiss }: {
8
+ drafts: DraftSet;
9
+ onPick: (tone: Tone, text: string) => void;
10
+ onRegenerate: () => void;
11
+ regenerating: boolean;
12
+ onDismiss: () => void;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=InlineDrafts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineDrafts.d.ts","sourceRoot":"","sources":["../src/InlineDrafts.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAIpD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,YAAY,EAAE,MAAM,IAAI,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE,+BA6B/N"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { TONES } from "./AssistantGrid.js";
4
+ import { IconChevronDown, IconPencil, IconRefresh, IconSparkles } from "./icons.js";
5
+ /**
6
+ * Reply drafts shown right under the client's latest message, a port of native InlineDrafts: the
7
+ * four tones as compact chips, a regenerate control, and "Not now" to hide them. Picking one loads
8
+ * the editor; nothing sends.
9
+ */
10
+ export function InlineDrafts({ drafts, onPick, onRegenerate, regenerating, onDismiss }) {
11
+ const [open, setOpen] = useState(true);
12
+ return (_jsxs("div", { className: "u-inl", "data-testid": "inline-drafts", children: [_jsxs("div", { className: "u-inl-h", children: [_jsxs("button", { type: "button", className: "u-inl-toggle", "aria-expanded": open, onClick: () => setOpen((o) => !o), children: [_jsx("span", { className: "u-ag-spark", children: _jsx(IconSparkles, {}) }), _jsx("span", { children: "Reply drafts" }), _jsx("span", { className: `u-ag-chev${open ? " u-ag-chev-open" : ""}`, children: _jsx(IconChevronDown, {}) })] }), _jsx("button", { type: "button", className: `u-ag-regen${regenerating ? " u-ag-spinning" : ""}`, "aria-label": "Regenerate reply drafts", title: "Regenerate reply drafts", disabled: regenerating, onClick: onRegenerate, children: _jsx(IconRefresh, {}) }), _jsx("button", { type: "button", className: "u-inl-notnow", onClick: onDismiss, children: "Not now" })] }), open && (_jsx("div", { className: "u-inl-grid", children: TONES.map((t) => {
13
+ const text = drafts[t.key];
14
+ if (!text)
15
+ return null;
16
+ return (_jsxs("button", { type: "button", className: "u-inl-cell", title: `Edit this draft — nothing sends until you press send\n\n${text}`, onClick: () => onPick(t.key, text), children: [_jsxs("span", { className: "u-ag-lab", children: [t.label, _jsx("span", { className: "u-ag-pencil", children: _jsx(IconPencil, {}) })] }), _jsx("span", { className: "u-inl-txt", children: text })] }, t.key));
17
+ }) }))] }));
18
+ }
19
+ //# sourceMappingURL=InlineDrafts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InlineDrafts.js","sourceRoot":"","sources":["../src/InlineDrafts.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAA4I;IAC9N,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CACL,eAAK,SAAS,EAAC,OAAO,iBAAa,eAAe,aAChD,eAAK,SAAS,EAAC,SAAS,aACtB,kBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,mBAAgB,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,aACnG,eAAM,SAAS,EAAC,YAAY,YAAC,KAAC,YAAY,KAAG,GAAO,EACpD,0CAAyB,EACzB,eAAM,SAAS,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,YAAE,KAAC,eAAe,KAAG,GAAO,IACjF,EACT,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAE,aAAa,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,gBAAa,yBAAyB,EAAC,KAAK,EAAC,yBAAyB,EAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,YAAE,KAAC,WAAW,KAAG,GAAS,EAClO,iBAAQ,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,cAAc,EAAC,OAAO,EAAE,SAAS,wBAAkB,IAC/E,EACL,IAAI,IAAI,CACP,cAAK,SAAS,EAAC,YAAY,YACxB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACf,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC3B,IAAI,CAAC,IAAI;wBAAE,OAAO,IAAI,CAAC;oBACvB,OAAO,CACL,kBAAoB,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,YAAY,EAAC,KAAK,EAAE,2DAA2D,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,aACnK,gBAAM,SAAS,EAAC,UAAU,aAAE,CAAC,CAAC,KAAK,EAAC,eAAM,SAAS,EAAC,aAAa,YAAC,KAAC,UAAU,KAAG,GAAO,IAAO,EAC9F,eAAM,SAAS,EAAC,WAAW,YAAE,IAAI,GAAQ,KAF9B,CAAC,CAAC,GAAG,CAGT,CACV,CAAC;gBACJ,CAAC,CAAC,GACE,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { DraftSet, Tone } from "@uplifted/sdk";
2
+ import type { InstructionsState } from "./useInstructions.js";
3
+ /**
4
+ * The action row under an activity card or a client's message, a port of native InlineDrafts:
5
+ * "Reply options" (generated on first open, then Regenerate) and "Config AI" (the coach's rules
6
+ * for this kind of draft), each expanding in place, one at a time. Picking a draft loads the
7
+ * editor; nothing sends. `generate` is where drafts come from: the stored per-item drafts for a
8
+ * connected client, the stateless preview endpoint for a host client who is not connected yet.
9
+ */
10
+ export declare function ItemActions({ generate: fetchDrafts, surface, initialDrafts, onPick, instructions, onConfigure, notConnectedName, onNeedsPlan }: {
11
+ generate: () => Promise<DraftSet>;
12
+ surface: "message" | "update";
13
+ initialDrafts?: DraftSet | null;
14
+ onPick: (tone: Tone, text: string) => void;
15
+ instructions: InstructionsState;
16
+ /** When set, Config AI calls this instead of opening the editor (no connected clients yet: connect first). */
17
+ onConfigure?: (() => void) | undefined;
18
+ /** First name of a client who is not connected: the editor says the rules apply once they are. */
19
+ notConnectedName?: string | undefined;
20
+ /** Opens the plan offer when drafting is refused because the coach's plan lapsed (plan_inactive). */
21
+ onNeedsPlan?: (() => void) | undefined;
22
+ }): import("react").JSX.Element;
23
+ //# sourceMappingURL=ItemActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemActions.d.ts","sourceRoot":"","sources":["../src/ItemActions.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAe,MAAM,eAAe,CAAC;AAGjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAW9D;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,aAAoB,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,WAAW,EAAE,EAAE;IACtJ,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC9B,aAAa,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,iBAAiB,CAAC;IAChC,8GAA8G;IAC9G,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IACvC,kGAAkG;IAClG,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,qGAAqG;IACrG,WAAW,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACxC,+BAqFA"}
@@ -0,0 +1,83 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { TONES } from "./AssistantGrid.js";
4
+ import { IconChevronDown, IconLoader, IconPencil, IconRefresh } from "./icons.js";
5
+ const SURFACE_LABEL = {
6
+ message: "Replies to a message",
7
+ update: "Responses to logged activity",
8
+ };
9
+ const SURFACE_PLACEHOLDER = {
10
+ message: "e.g. Answer their question first, then encourage.",
11
+ update: "e.g. Always call out the specific number they hit.",
12
+ };
13
+ /**
14
+ * The action row under an activity card or a client's message, a port of native InlineDrafts:
15
+ * "Reply options" (generated on first open, then Regenerate) and "Config AI" (the coach's rules
16
+ * for this kind of draft), each expanding in place, one at a time. Picking a draft loads the
17
+ * editor; nothing sends. `generate` is where drafts come from: the stored per-item drafts for a
18
+ * connected client, the stateless preview endpoint for a host client who is not connected yet.
19
+ */
20
+ export function ItemActions({ generate: fetchDrafts, surface, initialDrafts = null, onPick, instructions, onConfigure, notConnectedName, onNeedsPlan }) {
21
+ const [drafts, setDrafts] = useState(initialDrafts);
22
+ const [section, setSection] = useState(null);
23
+ const [busy, setBusy] = useState(null);
24
+ const [error, setError] = useState(null);
25
+ const [planInactive, setPlanInactive] = useState(false);
26
+ const canEdit = instructions.data?.canEdit === true;
27
+ const showConfig = Boolean(onConfigure) || canEdit;
28
+ const generate = async (mode) => {
29
+ setBusy(mode);
30
+ setError(null);
31
+ setPlanInactive(false);
32
+ try {
33
+ setDrafts(await fetchDrafts());
34
+ setSection("drafts");
35
+ }
36
+ catch (e) {
37
+ if (e.code === "plan_inactive") {
38
+ setPlanInactive(true);
39
+ setSection(null);
40
+ return;
41
+ }
42
+ setError(e.retryable === false ? "Couldn't write drafts" : "Failed to load, try again");
43
+ }
44
+ finally {
45
+ setBusy(null);
46
+ }
47
+ };
48
+ const toggleDrafts = () => {
49
+ if (section === "drafts")
50
+ return setSection(null);
51
+ if (!drafts)
52
+ return void generate("load");
53
+ setSection("drafts");
54
+ };
55
+ return (_jsxs("div", { className: "u-ia", "data-testid": "item-actions", children: [_jsxs("div", { className: "u-ia-h", children: [_jsx("button", { type: "button", className: "u-inl-toggle", "aria-expanded": section === "drafts", disabled: busy === "load", onClick: toggleDrafts, children: busy === "load"
56
+ ? _jsxs(_Fragment, { children: [_jsx(IconLoader, {}), _jsx("span", { children: "Generating\u2026" })] })
57
+ : _jsxs(_Fragment, { children: [_jsx("span", { children: error ?? "Reply options" }), _jsx("span", { className: `u-ag-chev${section === "drafts" ? " u-ag-chev-open" : ""}`, children: _jsx(IconChevronDown, {}) })] }) }), showConfig && (_jsxs("button", { type: "button", className: "u-inl-toggle", "aria-expanded": onConfigure ? undefined : section === "ai", title: "Rules the AI follows when it writes these drafts", onClick: () => (onConfigure ? onConfigure() : setSection((s) => (s === "ai" ? null : "ai"))), children: [_jsx("span", { children: "Config AI" }), _jsx("span", { className: `u-ag-chev${section === "ai" ? " u-ag-chev-open" : ""}`, children: _jsx(IconChevronDown, {}) })] })), drafts && (_jsx("button", { type: "button", className: `u-ag-regen${busy === "regen" ? " u-ag-spinning" : ""}`, "aria-label": "Regenerate drafts", title: "Regenerate drafts", disabled: busy !== null, onClick: () => void generate("regen"), children: _jsx(IconRefresh, {}) }))] }), planInactive && (_jsxs("div", { className: "u-ag-empty", role: "status", children: [_jsx("span", { children: "Your Uplift plan isn't active, so drafts are paused." }), onNeedsPlan && _jsx("button", { type: "button", className: "u-retry", onClick: onNeedsPlan, children: "Reactivate" })] })), section === "ai" && instructions.data && (_jsx(InstructionsEditor, { surface: surface, initial: instructions.data.instructions[surface] ?? "", notConnectedName: notConnectedName, maxLength: instructions.data.maxLength, onCancel: () => setSection(null), onSave: async (content) => {
58
+ await instructions.save(surface, content);
59
+ // Regenerate straight away so the coach sees the rule take effect, like native.
60
+ if (drafts)
61
+ await generate("regen");
62
+ else
63
+ setSection(null);
64
+ } })), section === "drafts" && drafts && (_jsx("div", { className: "u-inl-grid", children: TONES.map((t) => {
65
+ const text = drafts[t.key];
66
+ if (!text)
67
+ return null;
68
+ return (_jsxs("button", { type: "button", className: "u-inl-cell", title: `Edit this ${t.label} draft — nothing sends until you press send`, onClick: () => onPick(t.key, text), children: [_jsxs("span", { className: "u-ag-lab", children: [t.label, _jsx("span", { className: "u-ag-pencil", children: _jsx(IconPencil, {}) })] }), _jsx("span", { className: "u-inl-txt", children: text })] }, t.key));
69
+ }) }))] }));
70
+ }
71
+ function InstructionsEditor({ surface, initial, maxLength, onCancel, onSave, notConnectedName }) {
72
+ const [text, setText] = useState(initial);
73
+ const [saving, setSaving] = useState(false);
74
+ const [error, setError] = useState(null);
75
+ const id = `u-ia-${surface}`;
76
+ return (_jsxs("form", { className: "u-ia-ai", onSubmit: (e) => {
77
+ e.preventDefault();
78
+ setSaving(true);
79
+ setError(null);
80
+ onSave(text).catch((err) => setError(err.message || "Couldn't save")).finally(() => setSaving(false));
81
+ }, children: [_jsx("label", { htmlFor: id, className: "u-ia-ai-label", children: SURFACE_LABEL[surface] }), _jsx("p", { className: "u-ia-ai-hint", children: "Rules the AI follows for this kind of draft, for all your clients. Your rules for every draft still apply." }), notConnectedName && _jsxs("p", { className: "u-ia-ai-note", children: [notConnectedName, " isn't connected to Uplift yet. These rules apply to ", notConnectedName, "'s drafts once connected; the preview drafts here don't use them."] }), _jsx("textarea", { id: id, value: text, maxLength: maxLength, rows: 3, placeholder: SURFACE_PLACEHOLDER[surface], onChange: (e) => setText(e.target.value) }), _jsxs("div", { className: "u-ia-ai-row", children: [_jsxs("span", { className: "u-ia-ai-count", children: [text.length, "/", maxLength] }), error && _jsx("span", { className: "u-ia-ai-err", role: "alert", children: error }), _jsx("span", { className: "u-sp" }), _jsx("button", { type: "button", className: "u-linkbtn", onClick: onCancel, children: "Cancel" }), _jsx("button", { type: "submit", className: "u-ia-save", disabled: saving || text === initial, children: saving ? "Saving…" : "Save" })] })] }));
82
+ }
83
+ //# sourceMappingURL=ItemActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemActions.js","sourceRoot":"","sources":["../src/ItemActions.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Attachment } from "@uplifted/sdk";
2
+ /** One attachment in a bubble, a port of native MediaAttachment: image → lightbox, video and audio inline, PDF as a chip, with the voice-note transcription. */
3
+ export declare function MediaAttachment({ a, out }: {
4
+ a: Attachment;
5
+ out: boolean;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=MediaAttachment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaAttachment.d.ts","sourceRoot":"","sources":["../src/MediaAttachment.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAWhD,gKAAgK;AAChK,wBAAgB,eAAe,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE;IAAE,CAAC,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,+BAqC1E"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { IconFile, IconX } from "./icons.js";
4
+ function kind(a) {
5
+ if (a.type)
6
+ return a.type;
7
+ if (a.mimeType.startsWith("image/"))
8
+ return "image";
9
+ if (a.mimeType.startsWith("video/"))
10
+ return "video";
11
+ if (a.mimeType.startsWith("audio/"))
12
+ return "audio";
13
+ return "document";
14
+ }
15
+ /** One attachment in a bubble, a port of native MediaAttachment: image → lightbox, video and audio inline, PDF as a chip, with the voice-note transcription. */
16
+ export function MediaAttachment({ a, out }) {
17
+ const [open, setOpen] = useState(false);
18
+ useEffect(() => {
19
+ if (!open)
20
+ return;
21
+ const onKey = (e) => { if (e.key === "Escape")
22
+ setOpen(false); };
23
+ window.addEventListener("keydown", onKey);
24
+ return () => window.removeEventListener("keydown", onKey);
25
+ }, [open]);
26
+ const k = kind(a);
27
+ if (k === "image") {
28
+ return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "u-att-img", onClick: () => setOpen(true), "aria-label": `Open ${a.filename ?? "photo"}`, children: _jsx("img", { src: a.url, alt: a.description ?? a.filename ?? "Photo", loading: "lazy" }) }), a.description && _jsx("span", { className: "u-att-desc", children: a.description }), open && (_jsxs("div", { className: "u-lightbox", role: "dialog", "aria-modal": "true", "aria-label": a.filename ?? "Photo", onClick: () => setOpen(false), children: [_jsx("button", { type: "button", className: "u-lightbox-x", "aria-label": "Close", onClick: () => setOpen(false), children: _jsx(IconX, {}) }), _jsx("img", { src: a.url, alt: a.description ?? a.filename ?? "Photo", onClick: (e) => e.stopPropagation() })] }))] }));
29
+ }
30
+ if (k === "video")
31
+ return _jsx("video", { className: `u-att-video${out ? " u-att-video-out" : ""}`, controls: true, playsInline: true, preload: "metadata", src: a.url });
32
+ if (k === "audio") {
33
+ return (_jsxs("span", { className: "u-att-audio", children: [_jsx("audio", { className: "u-att-player", controls: true, preload: "metadata", src: a.url, children: _jsx("a", { href: a.url, target: "_blank", rel: "noopener noreferrer", children: "Download voice note" }) }), a.transcription && _jsxs("span", { className: "u-att-trans", children: ["\u201C", a.transcription, "\u201D"] })] }));
34
+ }
35
+ return (_jsxs("a", { href: a.url, target: "_blank", rel: "noopener noreferrer", className: "u-att-file", children: [_jsx(IconFile, {}), _jsx("span", { children: a.filename ?? "File" })] }));
36
+ }
37
+ //# sourceMappingURL=MediaAttachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaAttachment.js","sourceRoot":"","sources":["../src/MediaAttachment.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /** Why the offer opened: the free-plan client limit, a lapsed plan, a locked paid feature, or a first look at Uplift. */
2
+ export type OfferReason = "client_limit" | "plan_inactive" | "feature" | "pitch";
3
+ export interface OfferSheetProps {
4
+ onClose: () => void;
5
+ /**
6
+ * Optional override. By default Uplift bills the coach itself: Stripe Checkout opens in a new
7
+ * tab and the sheet waits for the plan to go active. Pass this only if the host bills.
8
+ */
9
+ onCheckout?: (() => void | Promise<void>) | undefined;
10
+ /** S1: clients included without a plan. Default 2. */
11
+ freeClients?: number | undefined;
12
+ /** Name of the host app for the transparency copy. */
13
+ hostName: string;
14
+ reason?: OfferReason | undefined;
15
+ /** The client the coach was connecting when they hit the limit. */
16
+ connecting?: string | undefined;
17
+ /** Clients already connected (the ones on the free plan). */
18
+ connected?: ReadonlyArray<{
19
+ id: string;
20
+ name: string;
21
+ }> | undefined;
22
+ /** Called once the plan is active, e.g. to resume connecting the client. */
23
+ onUpgraded?: (() => void) | undefined;
24
+ }
25
+ /**
26
+ * The paywall (S5 pricing), worded for why it opened, then the required "How Uplift messaging
27
+ * works" step before checkout (D9). A coach who already has connected clients went through that
28
+ * explanation when adding them, so the CTA goes straight to checkout. The price comes from the
29
+ * Stripe price via GET /billing/plan, never from the host. Copy follows the Uplift Propane page.
30
+ */
31
+ export declare function OfferSheet({ onClose, onCheckout, freeClients, hostName, reason, connecting, connected, onUpgraded }: OfferSheetProps): import("react").JSX.Element;
32
+ //# sourceMappingURL=OfferSheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OfferSheet.d.ts","sourceRoot":"","sources":["../src/OfferSheet.tsx"],"names":[],"mappings":"AASA,yHAAyH;AACzH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC;IACtD,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,6DAA6D;IAC7D,SAAS,CAAC,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IACpE,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CACvC;AAiBD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,WAAe,EAAE,QAAQ,EAAE,MAAgB,EAAE,UAAU,EAAE,SAAc,EAAE,UAAU,EAAE,EAAE,eAAe,+BAsIvJ"}