@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
package/dist/styles.js ADDED
@@ -0,0 +1,545 @@
1
+ /**
2
+ * Panel styles, injected once into the document by <UpliftPanel>. Scoped under `.uplift`.
3
+ * D15: every colour, font and radius is a `--u-*` custom property. Defaults below sit at
4
+ * zero specificity (`:where`) so a host overrides them with any ordinary rule, e.g.
5
+ * `.uplift { --u-bg: var(--card); --u-text: var(--foreground); }`.
6
+ * `--u-accent`/`--u-accent-ink` paint primary buttons (Send, Add client); `--u-highlight`/`--u-highlight-soft`
7
+ * paint emphasis (sparkle, draft labels, selected ring, focus, purpose icons) and default to the accent, so a
8
+ * host whose buttons are neutral and whose brand is a colour (PulseKit) can split them.
9
+ * D16: layout answers to the panel's own width through a container query, never the viewport.
10
+ */
11
+ export const STYLE_ELEMENT_ID = "uplifted-react-styles";
12
+ export const upliftStyles = `
13
+ :where(.uplift){
14
+ --u-bg:#ffffff;--u-surface:#ffffff;--u-surface-2:#fafafa;--u-surface-3:#f4f4f5;
15
+ --u-text:#262626;--u-muted:#666666;--u-border:rgba(0,0,0,.08);
16
+ --u-accent:#0f8a63;--u-accent-soft:#e3f5ee;--u-accent-ink:#ffffff;--u-link:#0b6b4c;
17
+ --u-highlight:var(--u-accent);--u-highlight-soft:var(--u-accent-soft);
18
+ --u-gold:#c9971c;--u-gold-hi:#f7e2a0;--u-gold-ink:#8a6410;--u-gold-ink-hi:#c9971c;
19
+ --u-seg-l:88%;
20
+ --u-danger:#c10007;--u-warn:#bb4d00;--u-out:#eaf1ff;--u-out-ink:#12244d;
21
+ --u-font:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,sans-serif;--u-radius:10px;
22
+ }
23
+ :where(.uplift[data-theme="dark"],[data-theme="dark"] .uplift){
24
+ --u-bg:#111111;--u-surface:#111111;--u-surface-2:#0a0a0a;--u-surface-3:#1a1a1a;
25
+ --u-text:#f5f5f5;--u-muted:#9a9a9a;--u-border:rgba(255,255,255,.08);
26
+ --u-accent:#70d7b0;--u-accent-soft:#17342a;--u-accent-ink:#062a1e;--u-link:#70d7b0;
27
+ --u-gold:#d9a830;--u-gold-hi:#fff1b8;--u-gold-ink:#d9a830;--u-gold-ink-hi:#f3d47a;
28
+ --u-seg-l:26%;
29
+ --u-danger:#ff6467;--u-warn:#ffb900;--u-out:#1d2b4a;--u-out-ink:#e3ebff;
30
+ }
31
+ .uplift,.uplift *,.uplift *::before,.uplift *::after{box-sizing:border-box}
32
+ .uplift{font:15px/1.45 var(--u-font);color:var(--u-text);background:var(--u-bg);border:1px solid var(--u-border);border-radius:14px;overflow:hidden;container-type:inline-size;container-name:panel;position:relative;-webkit-font-smoothing:antialiased}
33
+ :where(.uplift) button{font:inherit;color:inherit;cursor:pointer}
34
+ :where(.uplift) button:disabled{cursor:not-allowed}
35
+ .uplift :focus-visible{outline:2px solid var(--u-highlight);outline-offset:2px;border-radius:6px}
36
+ .uplift h2,.uplift h3,.uplift h4,.uplift p{margin:0}
37
+ .u-sp{flex:1}
38
+ .u-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
39
+ .u-pill{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--u-border);background:var(--u-surface-2);border-radius:999px;padding:4px 10px;font-size:13px;color:var(--u-muted)}
40
+ .u-pill b{color:var(--u-text);font-weight:600}
41
+ .u-linkbtn{background:none;border:0;padding:4px 2px;color:var(--u-link);font-weight:600;text-decoration:underline;text-underline-offset:3px}
42
+ .u-split{display:grid;grid-template-columns:320px minmax(0,1fr);height:min(max(520px,62.5cqw),86vh)}
43
+ .u-split>*{min-height:0}
44
+ .u-list{overflow:hidden}
45
+ .u-pane{overflow:hidden}
46
+ .u-iconbtn{display:inline-grid;place-items:center;width:34px;height:34px;border:1px solid var(--u-border);background:var(--u-bg);border-radius:8px;color:var(--u-muted);padding:0}
47
+ .u-iconbtn:hover{color:var(--u-text)}
48
+ .u-iconbtn-pair{width:auto;padding:0 9px;display:inline-flex;align-items:center;gap:4px}
49
+ .u-ai-spark{display:inline-flex;color:var(--u-highlight)}
50
+ .u-iconbtn .u-ai-spark svg{width:14px;height:14px}
51
+ .u-iconbtn svg{width:16px;height:16px}
52
+ .u-iconbtn[aria-pressed="true"]{color:var(--u-text);background:var(--u-surface-2)}
53
+ .u-bulkbtn svg{width:14px;height:14px}
54
+ .uplift.u-full{position:fixed;inset:0;z-index:2147483000;border-radius:0;border:0;display:flex;flex-direction:column}
55
+ .uplift.u-full .u-split{flex:1;height:auto;min-height:0}
56
+ .u-back{display:none;border:1px solid var(--u-border);background:var(--u-bg);border-radius:8px;padding:6px 10px;font-size:16px;min-height:36px;align-items:center;flex:none}
57
+ .u-list{border-right:1px solid var(--u-border);display:flex;flex-direction:column;min-width:0}
58
+ /* inbox toolbar: native Uplift's collapsed search + segmented sort + Bulk generate */
59
+ .u-toolbar{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--u-border)}
60
+ .u-search{position:relative;flex:0 1 32px;min-width:32px;display:flex;align-items:center;cursor:pointer;transition:flex-basis .2s ease,flex-grow .2s ease}
61
+ .u-search-open{flex:1 1 140px;cursor:auto}
62
+ .u-search svg{position:absolute;left:9px;width:14px;height:14px;color:var(--u-muted);pointer-events:none}
63
+ .u-search input{width:100%;min-height:32px;padding:6px 10px 6px 30px;border-radius:999px;border:1px solid var(--u-border);background:var(--u-surface-2);font:inherit;font-size:13px;color:var(--u-text)}
64
+ .u-search:not(.u-search-open) input{cursor:pointer;padding-right:0}
65
+ .u-search:not(.u-search-open) input::placeholder{opacity:0}
66
+ .u-search input:focus{outline:none;border-color:var(--u-accent);background:var(--u-bg)}
67
+ .u-search input::-webkit-search-cancel-button{cursor:pointer}
68
+ .u-sortgroup{display:inline-flex;align-items:center;padding:2px;border-radius:999px;background:var(--u-surface-2);flex:none}
69
+ .u-sortgroup button{border:0;background:none;border-radius:999px;padding:4px 9px;font-size:12px;font-weight:600;color:var(--u-muted);min-height:28px;white-space:nowrap}
70
+ .u-sortgroup button:hover{color:var(--u-text)}
71
+ .u-sortgroup button[aria-pressed="true"]{background:var(--u-bg);color:var(--u-text);box-shadow:0 1px 2px rgba(0,0,0,.08),0 0 0 1px var(--u-border)}
72
+ .u-toolbar button.u-bulkbtn{margin-left:auto;display:inline-flex;align-items:center;gap:1px;border:0;border-radius:999px;background:none;color:var(--u-muted);padding:0 6px;min-height:32px;flex:none}
73
+ .u-toolbar button.u-bulkbtn:hover:not(:disabled){color:var(--u-accent);background:var(--u-surface-2)}
74
+ .u-toolbar button.u-bulkbtn:disabled{opacity:.45}
75
+ .u-rows{list-style:none;margin:0;padding:0;overflow:auto;flex:1;min-height:0}
76
+ .u-rows li{display:flex;flex-wrap:wrap;align-items:stretch;border-bottom:1px solid var(--u-border)}
77
+ .u-row-open{flex:1;min-width:0;text-align:left;border:0;background:transparent;padding:11px 12px;display:grid;grid-template-columns:36px minmax(0,1fr);gap:2px 10px;min-height:64px}
78
+ .u-av{grid-row:span 3;width:36px;height:36px;border-radius:999px;display:grid;place-items:center;font-size:13px;font-weight:700;color:#fff}
79
+ .u-av.u-av-sm{grid-row:auto;width:32px;height:32px}
80
+ .u-r-top{display:flex;gap:6px;align-items:baseline;min-width:0}
81
+ .u-r-name{font-weight:600;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
82
+ .u-r-time{margin-left:auto;font-size:12.5px;color:var(--u-muted);flex:none}
83
+ .u-r-line{font-size:13.5px;color:var(--u-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
84
+ .u-r-tags{display:flex;flex-wrap:wrap;gap:4px}
85
+ .u-tag{font-size:12px;font-weight:600;border-radius:999px;padding:1px 8px;border:1px solid var(--u-border);color:var(--u-muted);background:var(--u-surface-2)}
86
+ .u-tag.u-need{color:var(--u-danger);border-color:color-mix(in srgb,var(--u-danger) 35%,transparent)}
87
+ .u-tag.u-ok{color:var(--u-link);border-color:color-mix(in srgb,var(--u-highlight) 35%,transparent)}
88
+ .u-tag.u-warn{color:var(--u-warn);border-color:color-mix(in srgb,var(--u-warn) 35%,transparent)}
89
+ .u-list-foot{padding:10px 12px;font-size:13px;color:var(--u-muted)}
90
+ .u-skel{height:12px;border-radius:6px;background:var(--u-surface-3);margin:6px 0}
91
+ .u-skel-row{padding:14px 12px;border-bottom:1px solid var(--u-border)}
92
+ .u-state{padding:22px 16px;display:flex;flex-direction:column;gap:8px;align-items:flex-start;font-size:14.5px;color:var(--u-muted)}
93
+ .u-state h3{font-size:16px;color:var(--u-text)}
94
+ .u-state p{max-width:52ch}
95
+ .u-pane{display:flex;flex-direction:column;min-width:0}
96
+ .u-pane-head{display:flex;align-items:center;gap:10px;padding:11px 16px;border-bottom:1px solid var(--u-border)}
97
+ .u-who{display:flex;flex-direction:column;min-width:0}
98
+ .u-who strong{font-size:15px}
99
+ .u-who small{font-size:13px;color:var(--u-muted)}
100
+ .u-chan{margin-left:auto;font-size:13px;color:var(--u-muted)}
101
+ .u-feed{flex:1;overflow:auto;padding:14px 16px;display:flex;flex-direction:column;gap:8px;background:var(--u-surface-2);min-height:200px}
102
+ .u-tpl-chip{display:inline-flex;align-items:center;gap:4px;margin-left:6px;border:1px solid var(--u-border);border-radius:999px;padding:0 7px;font-size:11px;color:var(--u-muted);background:var(--u-bg);min-height:18px}
103
+ .u-bub.u-tpl-shown{opacity:.85;border:1px dashed color-mix(in srgb,var(--u-out-ink) 50%,transparent)}
104
+ .u-day{align-self:center;font-size:12px;color:var(--u-muted);background:var(--u-bg);border:1px solid var(--u-border);padding:2px 10px;border-radius:999px}
105
+ .u-older{align-self:center;border:1px solid var(--u-border);background:var(--u-bg);border-radius:999px;padding:5px 12px;font-size:13px;color:var(--u-muted);min-height:32px}
106
+ .u-ev{align-self:center;max-width:92%;display:flex;gap:8px;align-items:flex-start;font-size:13.5px;background:var(--u-bg);border:1px solid var(--u-border);border-radius:10px;padding:8px 11px}
107
+ .u-ev svg{width:16px;height:16px;flex:none;margin-top:2px;color:var(--u-muted)}
108
+ .u-ev b{font-weight:600}
109
+ .u-ev .u-meta{color:var(--u-muted);font-size:12.5px}
110
+ .u-bub{max-width:78%;padding:8px 12px;border-radius:14px;font-size:14.5px;white-space:pre-wrap;overflow-wrap:anywhere}
111
+ .u-bub.u-in{align-self:flex-start;background:var(--u-bg);border:1px solid var(--u-border);border-bottom-left-radius:4px}
112
+ .u-bub.u-out{align-self:flex-end;background:var(--u-out);color:var(--u-out-ink);border-bottom-right-radius:4px}
113
+ .u-bmeta{font-size:12px;color:var(--u-muted)}
114
+ .u-bmeta.u-r{align-self:flex-end}
115
+ /* ---- Composer footer (port of native ChatPage footer) ---- */
116
+ .u-composer{display:flex;flex-direction:column;gap:8px;padding:10px 16px 12px;background:var(--u-surface-2);border-top:1px solid var(--u-border)}
117
+ .u-composer>*:empty{display:none}
118
+ .u-rail{align-self:center;display:inline-flex;align-items:center;gap:6px;border:0;background:transparent;color:var(--u-muted);font-size:12px;padding:2px 10px;border-radius:999px;min-height:24px}
119
+ .u-rail:hover{color:var(--u-text);background:var(--u-surface-3)}
120
+ .u-rail svg{width:14px;height:14px}
121
+ .u-extras-wrap{position:relative;display:flex;flex-direction:column}
122
+ .u-extras-wrap>.u-rail{align-self:flex-end}
123
+ .u-extras-wrap>.u-rail[aria-expanded="true"]{position:absolute;top:0;right:0;z-index:1}
124
+ .u-extras-wrap:has(>.u-rail[aria-expanded="true"]) .u-ag-h{padding-right:34px}
125
+ .u-extras{display:contents}
126
+ .u-extras-off{display:none}
127
+ /* draft grid (ComposerAssistant) */
128
+ .u-ag{display:flex;flex-direction:column;gap:6px}
129
+ .u-ag-h{display:flex;align-items:center;gap:2px}
130
+ .u-ag-toggle{display:inline-flex;align-items:center;gap:8px;padding:4px 8px;border:0;background:transparent;color:var(--u-muted);font-size:12px;font-weight:600;border-radius:6px;min-height:28px}
131
+ .u-ag-toggle:hover{background:var(--u-surface-3);color:var(--u-text)}
132
+ .u-ag-spark{display:inline-flex;color:var(--u-highlight)}.u-ag-spark svg{width:12px;height:12px}
133
+ .u-ag-label{letter-spacing:.02em}
134
+ .u-ag-chev{display:inline-flex;color:var(--u-muted);transition:transform .15s}.u-ag-chev svg{width:14px;height:14px}
135
+ .u-ag-chev-open{transform:rotate(180deg)}
136
+ .u-ag-by{font-size:12px;color:var(--u-muted);margin-left:6px}
137
+ .u-ag-regen{display:inline-flex;align-items:center;justify-content:center;padding:4px;border:0;background:transparent;color:var(--u-muted);border-radius:6px;min-width:24px;min-height:24px}
138
+ .u-ag-regen svg{width:11px;height:11px}
139
+ .u-ag-regen:hover:not(:disabled){color:var(--u-highlight);background:var(--u-surface-3)}
140
+ .u-ag-regen:disabled{opacity:.5}
141
+ .u-ag-spinning svg{animation:u-spin 1s linear infinite}
142
+ @keyframes u-spin{to{transform:rotate(360deg)}}
143
+ .u-ag-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
144
+ .u-ag-cell{position:relative;display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;min-height:56px;padding:10px 12px;background:var(--u-surface-2);border:1px solid transparent;border-radius:var(--u-radius);color:var(--u-text);text-align:left;transition:background .15s,transform .15s}
145
+ .u-ag-cell:hover:not(:disabled){background:var(--u-bg)}
146
+ /* Gold shimmer ring on finished drafts (Ian, 2026-10-11): a gradient pseudo-element masked to the edge. Reduced motion leaves a still ring. */
147
+ .u-ag-cell:not(.u-ag-loading)::before{content:"";position:absolute;inset:-1px;border-radius:calc(var(--u-radius) + 1px);padding:1.5px;pointer-events:none;background:linear-gradient(110deg,var(--u-gold) 0%,var(--u-gold-hi) 25%,var(--u-gold) 50%,var(--u-gold-hi) 75%,var(--u-gold) 100%);background-size:250% 100%;animation:u-shimmer 3.2s linear infinite;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude}
148
+ @keyframes u-shimmer{from{background-position:0% 50%}to{background-position:250% 50%}}
149
+ .u-ag-cell[aria-checked="true"]{box-shadow:0 0 0 2px var(--u-highlight)}
150
+ .u-ag-cell[aria-checked="true"]::before{display:none}
151
+ .u-ag-lab{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;color:var(--u-highlight);text-transform:uppercase;letter-spacing:.04em}
152
+ .u-ag-pencil{display:inline-flex;opacity:.6}.u-ag-pencil svg{width:10px;height:10px}
153
+ .u-ag-txt{font-size:14px;line-height:1.35;color:var(--u-text);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;word-break:break-word}
154
+ .u-ag-loading{overflow:hidden;cursor:default;pointer-events:none;justify-content:center;align-items:center;border-color:var(--u-border)}
155
+ .u-ag-loading-txt{position:relative;z-index:1;font-size:12px;color:var(--u-muted)}
156
+ .u-ag-shimmer{position:absolute;inset:0;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.55) 50%,transparent 100%);animation:u-ag-sheen 1.4s infinite;transform:translateX(-100%)}
157
+ @keyframes u-ag-sheen{0%{transform:translateX(-100%)}100%{transform:translateX(100%)}}
158
+ .u-ag-empty{font-size:12.5px;color:var(--u-muted);padding:6px 0;display:flex;gap:10px;align-items:center;flex-wrap:wrap}
159
+ .u-ag-foot{font-size:12.5px;color:var(--u-muted);margin:0}
160
+ /* attachments */
161
+ .u-attach-row{align-items:center;gap:8px;flex-wrap:wrap}
162
+ .u-limits{font-size:12px;color:var(--u-muted)}
163
+ .u-limits-warn{color:var(--u-warn)}
164
+ .u-chips{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0}
165
+ .u-chip{display:inline-flex;align-items:center;gap:6px;max-width:240px;padding:4px 8px;border-radius:999px;background:var(--u-bg);border:1px solid var(--u-border);font-size:12px;color:var(--u-muted)}
166
+ .u-chip svg{width:13px;height:13px;flex:none}
167
+ .u-chip-err{border-color:var(--u-danger);color:var(--u-danger)}
168
+ .u-chip-errtxt{font-size:10px}
169
+ .u-chip-thumb{width:22px;height:22px;object-fit:cover;border-radius:5px}
170
+ .u-chip-name{max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
171
+ .u-chip-x{display:inline-flex;align-items:center;border:0;background:none;color:inherit;padding:2px;min-height:0}
172
+ .u-chip-x svg{width:12px;height:12px}
173
+ .u-spin{animation:u-spin 1s linear infinite}
174
+ .u-rec{display:flex;align-items:center;gap:8px;padding:6px 10px;border-radius:9px;background:var(--u-bg);font-size:12px;color:var(--u-muted)}
175
+ .u-rec-dot{width:8px;height:8px;border-radius:50%;background:#ff3b30;animation:u-rec-pulse 1.2s ease-in-out infinite}
176
+ @keyframes u-rec-pulse{0%,100%{opacity:1}50%{opacity:.35}}
177
+ .u-rec-btn{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--u-border);background:var(--u-bg);color:var(--u-text);border-radius:999px;width:28px;height:28px;min-height:0;padding:0}
178
+ .u-rec-btn svg{width:14px;height:14px}
179
+ .u-rec-done{background:var(--u-accent);color:var(--u-accent-ink);border-color:var(--u-accent)}
180
+ .u-sms-note{font-size:12px;color:var(--u-warn)}
181
+ /* editor row: + button, pill with the editor and the inline send/✨ */
182
+ .u-c-row{display:flex;align-items:flex-end;gap:8px;width:100%}
183
+ .u-attach-wrap{position:relative;flex:none}
184
+ .u-attach-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;min-height:0;padding:0;margin-bottom:3px;border:1px solid var(--u-border);border-radius:999px;background:var(--u-bg);color:var(--u-muted);transition:color .15s,background .15s}
185
+ .u-attach-btn svg{width:18px;height:18px}
186
+ .u-attach-btn:hover:not(:disabled){color:var(--u-highlight);background:var(--u-highlight-soft)}
187
+ .u-attach-btn:disabled{opacity:.45}
188
+ .u-pill{position:relative;flex:1;min-width:0;display:flex;align-items:flex-end;gap:6px;background:var(--u-bg);border:1px solid var(--u-border);border-radius:14px;padding:4px 4px 4px 8px}
189
+ .u-pill-grow{flex:1;min-width:0}
190
+ .u-pill .u-editor{border:0;background:transparent;border-radius:0;padding:6px 4px;min-height:38px;max-height:220px;resize:none}
191
+ .u-pill .u-editor:focus{outline:none}
192
+ .u-pill:focus-within{border-color:var(--u-highlight)}
193
+ /* Locked pill (stock intro, nothing to edit): gold shimmer ring like the draft cells. Reduced motion leaves a still ring. */
194
+ .u-pill-locked{border-color:transparent}
195
+ .u-pill-locked::before{content:"";position:absolute;inset:-1px;border-radius:15px;padding:1.5px;pointer-events:none;background:linear-gradient(110deg,var(--u-gold) 0%,var(--u-gold-hi) 25%,var(--u-gold) 50%,var(--u-gold-hi) 75%,var(--u-gold) 100%);background-size:250% 100%;animation:u-shimmer 3.2s linear infinite;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude}
196
+ .u-pill-locked:focus-within{border-color:transparent}
197
+ .u-editor-locked{cursor:default;caret-color:transparent}
198
+ .u-send-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;min-height:0;padding:0;flex:none;border-radius:999px;border:0;background:var(--u-accent);color:var(--u-accent-ink);transition:transform .15s,opacity .15s}
199
+ .u-send-btn svg{width:15px;height:15px;stroke:var(--u-accent-ink)}
200
+ .u-send-btn:hover:not(:disabled){transform:translateY(-1px)}
201
+ .u-send-btn:disabled{opacity:.4;cursor:not-allowed}
202
+ .u-gen-btn{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;min-height:0;padding:0;flex:none;border:0;border-radius:999px;background:transparent;color:var(--u-highlight);transition:background .15s}
203
+ .u-gen-btn svg{width:16px;height:16px}
204
+ .u-gen-btn:hover:not(:disabled){background:var(--u-highlight-soft)}
205
+ .u-gen-btn:disabled{opacity:.4}
206
+ .u-menu-backdrop{position:fixed;inset:0;z-index:40}
207
+ .u-menu{position:absolute;bottom:calc(100% + 6px);z-index:41;display:flex;flex-direction:column;min-width:150px;padding:4px;border-radius:12px;background:var(--u-bg);border:1px solid var(--u-border);box-shadow:0 10px 30px rgba(0,0,0,.18)}
208
+ .u-menu-left{left:0}.u-menu-right{right:0}
209
+ .u-menu-title{padding:6px 12px 4px;font-size:11.5px;font-weight:600;color:var(--u-muted)}
210
+ .u-menu-titlerow{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 6px 2px 0}
211
+ .u-menu-titlerow .u-menu-title{padding:2px 12px 2px}
212
+ .u-menu-cfg{display:inline-flex;align-items:center;justify-content:center;padding:4px;min-width:24px;min-height:24px;border:0;background:none;color:var(--u-muted);border-radius:6px}
213
+ .u-menu-cfg svg{width:13px;height:13px}
214
+ .u-menu-cfg:hover{color:var(--u-text);background:var(--u-surface-3)}
215
+ /* proactive options editor */
216
+ .u-po-help{font-size:13.5px;color:var(--u-muted);margin:0 0 10px}
217
+ .u-po-list{display:flex;flex-direction:column;gap:10px}
218
+ .u-po-row{border:1px solid var(--u-border);border-radius:12px;padding:10px;display:flex;flex-direction:column;gap:8px;background:var(--u-surface-2)}
219
+ .u-po-top{display:flex;align-items:center;gap:6px}
220
+ .u-po-label{flex:1;min-width:0;border:1px solid var(--u-border);border-radius:8px;padding:7px 10px;font:inherit;font-size:14px;background:var(--u-bg);color:var(--u-text)}
221
+ .u-po-text{width:100%;border:1px solid var(--u-border);border-radius:8px;padding:7px 10px;font:inherit;font-size:13.5px;background:var(--u-bg);color:var(--u-text);resize:vertical}
222
+ .u-po-iconwrap{position:relative;flex:none}
223
+ .u-po-iconbtn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;min-height:0;padding:0;border:1px solid var(--u-border);border-radius:8px;background:var(--u-bg);color:var(--u-text)}
224
+ .u-po-iconbtn svg{width:15px;height:15px}
225
+ .u-po-iconbtn:disabled{opacity:.4}
226
+ .u-po-iconbtn-on{border-color:var(--u-highlight);box-shadow:0 0 0 1px var(--u-highlight);color:var(--u-highlight)}
227
+ .u-po-remove:hover{color:var(--u-danger);border-color:var(--u-danger)}
228
+ .u-po-iconpick{position:absolute;top:calc(100% + 4px);left:0;z-index:5;display:grid;grid-template-columns:repeat(6,32px);gap:4px;padding:6px;background:var(--u-bg);border:1px solid var(--u-border);border-radius:10px;box-shadow:0 10px 30px rgba(0,0,0,.18)}
229
+ .u-po-add{margin-top:10px;border:1px dashed var(--u-border);background:transparent;border-radius:9px;padding:8px 12px;font-weight:600;color:var(--u-link);min-height:38px;width:100%}
230
+ .u-po-actions{display:flex;gap:8px;align-items:center;margin-top:12px;flex-wrap:wrap}
231
+ .u-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 12px;border:0;border-radius:8px;background:none;text-align:left;font-size:14px;color:var(--u-text);min-height:36px}
232
+ .u-menu-item:hover{background:var(--u-surface-3)}
233
+ .u-menu-purpose svg{width:14px;height:14px;color:var(--u-highlight);flex:none}
234
+ /* inbox rows (native ClientRow) */
235
+ .u-row-open{position:relative}
236
+ .u-r-ind{position:absolute;left:3px;top:50%;transform:translateY(-50%);width:20px;display:grid;place-items:center}
237
+ .u-rows .u-row-open{padding-left:26px}
238
+ .u-r-dot{width:8px;height:8px;border-radius:50%;background:var(--u-highlight)}
239
+ .u-r-badge{min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--u-highlight);color:#fff;font-size:11px;font-weight:700;display:grid;place-items:center}
240
+ /* The open conversation is the only row with a colour: a clear shade and an accent bar on the left
241
+ edge, like WhatsApp's selected chat. Unread shows by the dot and bold name, never a tint. Built
242
+ from the text colour so it reads on any host theme, light or dark. */
243
+ .u-rows li:has(.u-row-open[aria-current="true"]){background:color-mix(in srgb,var(--u-text) 8%,var(--u-bg));box-shadow:inset 3px 0 0 var(--u-accent)}
244
+ .u-rows li:has(.u-row-open[aria-current="true"]) .u-row-open{background:transparent}
245
+ .u-r-name-unread{font-weight:700}
246
+ .u-r-follow,.u-r-fail{display:inline-flex;align-items:center;flex:none}
247
+ .u-r-follow svg,.u-r-fail svg{width:13px;height:13px}
248
+ .u-r-follow{color:var(--u-warn)}
249
+ .u-r-fail{color:var(--u-danger)}
250
+ .u-r-prev{display:inline-flex;align-items:center;gap:5px;max-width:100%}
251
+ .u-r-pico{display:inline-flex;flex:none}.u-r-pico svg{width:11px;height:11px}
252
+ .u-r-prev-in .u-r-ptxt{color:var(--u-text)}
253
+ .u-r-prev-in .u-r-pico{color:var(--u-highlight)}
254
+ .u-r-prev-out .u-r-ptxt,.u-r-prev-out .u-r-pico{color:var(--u-muted)}
255
+ .u-r-prev-ev .u-r-ptxt,.u-r-prev-ev .u-r-pico{color:var(--u-muted);font-style:italic}
256
+ .u-r-ptxt{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
257
+ .u-r-hosttags{flex:1 0 100%;display:flex;flex-wrap:wrap;gap:4px;padding:0 12px 10px 72px;margin-top:-6px}
258
+ .u-tag-connect{cursor:pointer;font:inherit;font-size:12px;font-weight:600;line-height:inherit}
259
+ .u-tag-connect:hover{border-color:var(--u-highlight);color:var(--u-highlight);background:var(--u-highlight-soft)}
260
+ .u-r-quick{flex:1 0 100%;display:flex;justify-content:flex-end;align-items:center;min-width:0;padding:0 12px 10px 72px}
261
+ .u-qsend{display:inline-flex;align-items:center;gap:6px;max-width:100%;border:1px solid var(--u-highlight);background:var(--u-highlight);color:#fff;border-radius:999px;padding:4px 11px;font-size:12px;font-weight:600;min-height:26px}
262
+ .u-qsend:hover:not(:disabled){filter:brightness(1.08)}
263
+ /* Bulk generate states in the quick-send slot (native: Generating… / Generation failed) */
264
+ .u-qsend.u-qsend-bulk{background:var(--u-surface-2);border-color:var(--u-border);color:var(--u-muted);cursor:default}
265
+ .u-qsend-busy svg{width:12px;height:12px}
266
+ /* Bulk generate sheet (native BulkGenerateModal) */
267
+ .u-bulk-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:6px}
268
+ .u-bulk-spark{color:var(--u-highlight);display:grid;place-items:center;padding-top:9px}
269
+ .u-bulk-spark svg{width:18px;height:18px}
270
+ .u-bulk-titles{flex:1;min-width:0}
271
+ .u-bulk-titles h3{margin:4px 0 2px;font-size:18px}
272
+ .u-bulk-sub{margin:0;font-size:13.5px;color:var(--u-muted)}
273
+ .u-bulk-sub .u-linkbtn{font-size:13px}
274
+ .u-bulk-sec{margin-top:14px}
275
+ .u-bulk-sechead{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
276
+ .u-bulk-sechead .u-linkbtn{font-size:13px}
277
+ .u-bulk-label{font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--u-muted)}
278
+ .u-bulk-chips{display:flex;flex-wrap:wrap;gap:6px;max-height:180px;overflow:auto;padding:2px}
279
+ .u-bulk-empty{font-size:13px;color:var(--u-muted)}
280
+ .u-bulk-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--u-border);background:var(--u-bg);border-radius:999px;padding:3px 10px 3px 3px;font-size:13px;color:var(--u-muted);min-height:30px;max-width:100%}
281
+ .u-bulk-chip-on{border-color:var(--u-highlight);background:var(--u-highlight-soft);color:var(--u-text)}
282
+ .u-bulk-av{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;color:#fff;font-size:10px;font-weight:700;flex:none}
283
+ .u-bulk-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
284
+ .u-bulk-meta{font-size:11px;color:var(--u-muted)}
285
+ .u-bulk-prompt{width:100%;box-sizing:border-box;border:1px solid var(--u-border);border-radius:10px;padding:10px 12px;font:inherit;font-size:14px;color:var(--u-text);background:var(--u-bg);resize:vertical}
286
+ .u-bulk-prompt:focus{outline:none;border-color:var(--u-accent)}
287
+ .u-bulk-hist{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px}
288
+ .u-bulk-histlabel{font-size:12px;color:var(--u-muted)}
289
+ .u-bulk-histbtn{border:1px solid var(--u-border);background:var(--u-surface-2);border-radius:999px;padding:3px 10px;font-size:12px;color:var(--u-text);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
290
+ .u-bulk-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}
291
+ .u-bulk-go{display:inline-flex;align-items:center;gap:6px}
292
+ .u-bulk-go svg{width:14px;height:14px}
293
+ /* Gold shimmer ring on a ready quick reply, same as the draft cells. Countdown, sending, sent and error states drop it. */
294
+ .u-qsend{position:relative}
295
+ .u-qsend:not(.u-qsend-count):not(.u-qsend-sending):not(.u-qsend-sent):not(.u-qsend-err):not(:disabled)::before{content:"";position:absolute;inset:-2px;border-radius:999px;padding:2px;pointer-events:none;background:linear-gradient(110deg,var(--u-gold) 0%,var(--u-gold-hi) 25%,var(--u-gold) 50%,var(--u-gold-hi) 75%,var(--u-gold) 100%);background-size:250% 100%;animation:u-shimmer 3.2s linear infinite;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude}
296
+ .u-qsend svg{width:12px;height:12px;flex:none}
297
+ .u-qsend-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
298
+ .u-qsend-count{border-color:var(--u-warn);background:color-mix(in srgb,var(--u-warn) 12%,transparent);color:var(--u-warn)}
299
+ .u-qsend-sent{border-color:var(--u-accent);background:var(--u-accent);color:var(--u-accent-ink)}
300
+ .u-qsend-err{border-color:var(--u-danger);color:var(--u-danger);background:transparent}
301
+ .u-qsend:disabled{opacity:.9}
302
+ /* delivery receipts */
303
+ .u-rcpt{display:inline-flex;align-items:center;margin-left:4px;color:var(--u-muted)}
304
+ .u-rcpt svg{width:13px;height:13px}
305
+ .u-rcpt-ok{color:var(--u-highlight)}
306
+ .u-rcpt-bad{color:var(--u-danger)}
307
+ /* inline reply drafts under the latest client message */
308
+ .u-inl{align-self:flex-start;max-width:78%;display:flex;flex-direction:column;gap:6px;margin-top:2px}
309
+ .u-inl-h{display:flex;align-items:center;gap:4px}
310
+ .u-inl-toggle{display:inline-flex;align-items:center;gap:6px;border:0;background:transparent;color:var(--u-muted);font-size:12px;font-weight:600;padding:2px 6px;border-radius:6px;min-height:24px}
311
+ .u-inl-toggle:hover{background:var(--u-surface-3);color:var(--u-text)}
312
+ .u-inl-notnow{border:0;background:transparent;color:var(--u-muted);font-size:12px;padding:2px 6px;min-height:24px;border-radius:6px}
313
+ .u-inl-notnow:hover{color:var(--u-text);background:var(--u-surface-3)}
314
+ .u-inl-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;width:100%}
315
+ .u-inl-cell{position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:0;border:1px solid var(--u-border);background:var(--u-bg);border-radius:12px;padding:7px 10px;text-align:left;color:var(--u-text)}
316
+ /* Gold shimmer ring, same as the composer's draft cells. Reduced motion leaves a still ring. */
317
+ .u-inl-cell::before{content:"";position:absolute;inset:-1px;border-radius:13px;padding:1.5px;pointer-events:none;background:linear-gradient(110deg,var(--u-gold) 0%,var(--u-gold-hi) 25%,var(--u-gold) 50%,var(--u-gold-hi) 75%,var(--u-gold) 100%);background-size:250% 100%;animation:u-shimmer 3.2s linear infinite;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask-composite:exclude}
318
+ .u-inl-cell:hover{border-color:var(--u-highlight)}
319
+ .u-inl-txt{font-size:13px;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
320
+ /* Item action row (native InlineDrafts): under client messages, and inside activity cards. */
321
+ .u-ia{align-self:flex-start;width:78%;display:flex;flex-direction:column;gap:6px;margin-top:2px}
322
+ .u-ev .u-ia{width:100%;margin-top:6px}
323
+ .u-ev>div{flex:1}
324
+ .u-ev>div{min-width:0}
325
+ .u-ev .u-ia svg{width:13px;height:13px;margin-top:0}
326
+ .u-ia-h{display:flex;flex-wrap:wrap;align-items:center;gap:2px;margin-left:-6px}
327
+ .u-ia-h .u-inl-toggle svg{width:13px;height:13px}
328
+ .u-ia-ai{display:flex;flex-direction:column;gap:6px;border:1px solid var(--u-border);background:var(--u-bg);border-radius:12px;padding:10px;min-width:min(420px,100%)}
329
+ .u-ia-ai-label{font-size:12.5px;font-weight:700}
330
+ .u-ia-ai-hint{font-size:12px;color:var(--u-muted)}
331
+ .u-ia-ai-note{font-size:12px;color:var(--u-warn);background:color-mix(in srgb,var(--u-warn) 10%,transparent);border-radius:8px;padding:6px 8px}
332
+ .u-ia-ai textarea{font:inherit;font-size:13.5px;color:var(--u-text);background:var(--u-surface-2);border:1px solid var(--u-border);border-radius:8px;padding:8px 10px;resize:vertical;min-height:64px}
333
+ .u-ia-ai-row{display:flex;align-items:center;gap:10px;font-size:12px}
334
+ .u-ia-ai-count{color:var(--u-muted);font-variant-numeric:tabular-nums}
335
+ .u-ia-ai-err{color:var(--u-danger)}
336
+ .u-cx-h4{display:flex;align-items:center;gap:6px}
337
+ .u-cx-info{display:inline-grid;place-items:center;width:22px;height:22px;border:0;border-radius:999px;background:transparent;color:var(--u-muted);padding:0;cursor:pointer}
338
+ .u-cx-info:hover{color:var(--u-highlight);background:var(--u-highlight-soft)}
339
+ .u-cx-info svg{width:15px;height:15px}
340
+ .u-cx-head{display:flex;align-items:center;gap:10px}
341
+ .u-cx-mark{display:inline-grid;place-items:center;width:30px;height:30px;border-radius:999px;color:#fff;flex:none}
342
+ .u-cx-rule{margin:10px 0}
343
+ .u-cx-rule h4{margin:0 0 3px;font-size:14px}
344
+ .u-cx-rule p{margin:0;font-size:13.5px;line-height:1.5;color:var(--u-muted)}
345
+ .u-cx-sec{display:block;margin-top:14px;font-size:13px;font-weight:600}
346
+ .u-cx-mocks{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:8px 0 10px}
347
+ .u-cx-col{display:flex;flex-direction:column;gap:4px;min-width:0}
348
+ .u-cx-label{font-size:11.5px;font-weight:500;color:var(--u-muted)}
349
+ .u-cx-phone{border:1px solid var(--u-border);border-radius:12px;padding:10px;display:flex;flex-direction:column;gap:8px;min-height:120px}
350
+ .u-cx-coach{background:var(--u-surface-2)}
351
+ .u-cx-coach-bub{align-self:flex-end;max-width:95%;background:var(--u-highlight);color:#fff;border-radius:12px;border-bottom-right-radius:4px;padding:8px 10px;font-size:12px;line-height:1.45}
352
+ .u-cx-tpl{display:inline-block;margin-top:6px;padding:2px 8px;border-radius:999px;background:rgba(255,255,255,.22);font-size:10px;font-weight:500}
353
+ .u-cx-client{background:#e5ddd5;border-color:#d5cdc4}
354
+ .u-cx-client-bub{align-self:flex-start;max-width:95%;background:#fff;color:#1c1c1e;border-radius:12px;border-top-left-radius:4px;padding:8px 10px;font-size:12px;line-height:1.45;box-shadow:0 1px 1px rgba(0,0,0,.08)}
355
+ .u-cx-link{display:block;margin-top:6px;color:#027eb5;font-weight:500}
356
+ .u-cx-meta{font-size:10px;color:var(--u-muted);text-align:center;margin-top:auto}
357
+ .u-cx-client .u-cx-meta{color:#7a7269}
358
+ .u-cx-foot{font-size:12px;line-height:1.5;color:var(--u-muted)}
359
+ .u-offer-who{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--u-muted);margin:2px 0 8px}
360
+ .u-offer-avs{display:inline-flex}
361
+ .u-offer-avs .u-av{border:2px solid var(--u-bg);margin-left:-6px}
362
+ .u-offer-avs .u-av:first-child{margin-left:0}
363
+ .u-offer-list{list-style:none;margin:10px 0;padding:0;display:flex;flex-direction:column;gap:7px;font-size:13.5px}
364
+ .u-offer-list li{display:flex;gap:8px;align-items:flex-start}
365
+ .u-offer-tick{display:inline-flex;color:var(--u-accent);flex:none;margin-top:2px}
366
+ .u-offer-tick svg{width:15px;height:15px}
367
+ .u-ai-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
368
+ .u-ai-plan{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border:1px solid var(--u-border);border-radius:10px;padding:8px 11px;font-size:13px;margin:0 0 10px}
369
+ .u-ai-plan .u-linkbtn{font-size:13px}
370
+ .u-ai-err{color:var(--u-danger,#b42318);font-size:12.5px;width:100%}
371
+ .u-ai-disclaimer{display:flex;gap:8px;align-items:flex-start;background:var(--u-highlight-soft);border-radius:10px;padding:9px 11px;font-size:12.5px;line-height:1.45;margin:6px 0 10px}
372
+ .u-ai-disclaimer svg{width:15px;height:15px;flex:none;margin-top:2px;color:var(--u-highlight)}
373
+ .u-ai-tabs{display:flex;flex-wrap:wrap;gap:4px;border-bottom:1px solid var(--u-border);margin-bottom:10px}
374
+ .u-ai-tab{border:0;background:transparent;padding:7px 10px;font-size:13px;font-weight:600;color:var(--u-muted);border-bottom:2px solid transparent;margin-bottom:-1px;border-radius:0}
375
+ .u-ai-tab-on{color:var(--u-text);border-bottom-color:var(--u-highlight)}
376
+ .u-ai-body{display:flex;flex-direction:column;gap:14px}
377
+ .u-ai-sec{display:flex;flex-direction:column;gap:6px}
378
+ .u-ai-sec h4{margin:0;font-size:14px}
379
+ .u-ai-area,.u-ai-input{font:inherit;font-size:13.5px;color:var(--u-text);background:var(--u-surface-2);border:1px solid var(--u-border);border-radius:8px;padding:8px 10px;width:100%;box-sizing:border-box}
380
+ .u-ai-area{resize:vertical}
381
+ .u-ai-hr{border:0;border-top:1px solid var(--u-border);margin:8px 0}
382
+ .u-ai-form{display:flex;flex-direction:column;gap:6px;border:1px solid var(--u-border);border-radius:10px;padding:10px}
383
+ .u-ai-form label{font-size:12.5px;font-weight:700}
384
+ .u-ai-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
385
+ .u-ai-list li{border:1px solid var(--u-border);border-radius:10px;padding:8px 10px;display:flex;flex-direction:column;gap:3px}
386
+ .u-ai-item-head{display:flex;align-items:center;gap:6px;font-size:13px}
387
+ .u-ai-check{color:var(--u-accent);display:inline-flex}
388
+ .u-ai-check svg{width:14px;height:14px}
389
+ .u-ai-tags{display:flex;flex-wrap:wrap;gap:4px}
390
+ .u-ai-k{font-size:11.5px;font-weight:700;color:var(--u-muted);text-transform:uppercase;letter-spacing:.04em}
391
+ .u-ai-v{font-size:13.5px;white-space:pre-wrap}
392
+ .u-ai-voice{display:flex;flex-direction:column;gap:6px}
393
+ .u-ai-locked{border:1px dashed var(--u-border);border-radius:10px;padding:12px;font-size:13px;color:var(--u-muted)}
394
+ .u-ai-locked strong{color:var(--u-text)}
395
+ .u-ai-field{display:flex;flex-direction:column;gap:3px;margin-top:10px}
396
+ .u-ai-field textarea{font:inherit;font-size:13.5px;color:var(--u-text);background:var(--u-surface-2);border:1px solid var(--u-border);border-radius:8px;padding:8px 10px;resize:vertical}
397
+ .u-ai-labelrow{display:flex;justify-content:space-between;gap:8px;font-size:13px;font-weight:700}
398
+ .u-ai-sub{margin-top:16px!important;font-size:12.5px;font-weight:700;color:var(--u-muted)}
399
+ .u-ai-ok{color:var(--u-accent);font-size:13px;font-weight:600}
400
+ .u-ai-more{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid var(--u-border);font-size:13px;color:var(--u-muted)}
401
+ .u-ia-save{border:1px solid var(--u-accent);background:var(--u-accent);color:var(--u-accent-ink);border-radius:8px;padding:5px 12px;font-weight:600;font-size:13px;min-height:30px}
402
+ .u-ia-save:disabled{opacity:.5}
403
+ /* WhatsApp closed window */
404
+ .u-wa{display:flex;gap:8px;align-items:flex-start;padding:8px 12px;border-radius:9px;background:color-mix(in srgb,var(--u-warn) 10%,var(--u-bg));border:1px solid color-mix(in srgb,var(--u-warn) 35%,transparent);font-size:13px;line-height:1.4}
405
+ .u-wa-ico{display:inline-flex;color:var(--u-warn);flex:none;margin-top:2px}.u-wa-ico svg{width:14px;height:14px}
406
+ .u-wa-body{min-width:0}
407
+ .u-wa-more{display:inline-flex;align-items:center;gap:2px;border:0;background:transparent;color:var(--u-link);font-weight:600;font-size:12.5px;padding:0 4px;min-height:0;margin-left:4px}
408
+ .u-wa-more svg{width:12px;height:12px}
409
+ .u-wa-why{margin:6px 0 0;color:var(--u-muted);font-size:12.5px}
410
+ .u-ghost{display:flex;flex-direction:column;align-items:flex-end;gap:2px;opacity:.7}
411
+ .u-ghost-bub{border:1px dashed color-mix(in srgb,var(--u-out-ink) 50%,transparent);background:color-mix(in srgb,var(--u-out) 60%,transparent)}
412
+ .u-ghost-cut{font-weight:700}
413
+ /* beginning of history */
414
+ .u-hist-start{align-self:center;font-size:12px;color:var(--u-muted);padding:4px 0}
415
+ /* header badges */
416
+ .u-chan-badge{display:inline-flex;align-items:center;justify-content:center;position:absolute;right:-2px;bottom:-2px;width:16px;height:16px;border-radius:50%;color:#fff;border:2px solid var(--u-bg);box-sizing:content-box}
417
+ .u-chan-wa{background:#25d366}
418
+ .u-chan-sms{background:var(--u-highlight)}
419
+ .u-r-av{grid-row:span 3;align-self:start}
420
+ .u-r-av .u-av{grid-row:auto}
421
+ .u-av-wrap{position:relative;display:inline-flex;flex:none}
422
+ .u-head-status{margin-left:4px}
423
+ /* attachments on thread messages */
424
+ .u-att{display:flex;flex-wrap:wrap;gap:6px;max-width:78%}
425
+ .u-att-out{align-self:flex-end;justify-content:flex-end}.u-att-in{align-self:flex-start}
426
+ .u-att-img{border:0;background:none;padding:0;min-height:0;cursor:zoom-in}
427
+ .u-att-img img{display:block;max-width:220px;max-height:220px;border-radius:12px;border:1px solid var(--u-border)}
428
+ .u-att-desc{display:block;font-size:12px;color:var(--u-muted);max-width:220px}
429
+ .u-att-video{display:block;max-width:280px;max-height:320px;border-radius:12px;background:#000;object-fit:contain}
430
+ .u-att-audio{display:flex;flex-direction:column;gap:4px;max-width:300px}
431
+ .u-att-player{width:100%;max-width:300px}
432
+ .u-att-trans{font-size:13px;color:var(--u-muted);font-style:italic}
433
+ .u-lightbox{position:fixed;inset:0;z-index:60;background:rgba(0,0,0,.85);display:grid;place-items:center;padding:24px}
434
+ .u-lightbox img{max-width:100%;max-height:100%;border-radius:8px}
435
+ .u-lightbox-x{position:absolute;top:16px;right:16px;width:40px;height:40px;border-radius:999px;border:0;background:rgba(255,255,255,.15);color:#fff;display:grid;place-items:center}
436
+ .u-lightbox-x svg{width:18px;height:18px}
437
+ .u-att-file{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;background:var(--u-bg);border:1px solid var(--u-border);font-size:13px;color:var(--u-link);text-decoration:none}
438
+ .u-att-file svg{width:14px;height:14px}
439
+ .u-editor{width:100%;border:1px solid var(--u-border);border-radius:var(--u-radius);padding:10px 12px;min-height:64px;font:inherit;font-size:14.5px;background:var(--u-bg);color:var(--u-text);resize:vertical}
440
+ .u-editor::placeholder{color:var(--u-muted)}
441
+ .u-editor-rich{min-height:64px;max-height:220px;overflow-y:auto;white-space:normal;word-break:break-word;line-height:1.5}
442
+ .u-editor-rich:empty::before{content:attr(data-placeholder);color:var(--u-muted);pointer-events:none}
443
+ .u-editor-rich[aria-disabled="true"]{opacity:.6}
444
+ /* Draft pills, ported from native: one per clause, hue hashed from the text, × drops it. */
445
+ .u-seg{display:inline;padding:1px 2px;margin:0 2px;border-radius:3px;background:hsl(var(--u-seg-h) 55% var(--u-seg-l));color:var(--u-text);font-weight:500;user-select:none;transition:opacity .15s ease}
446
+ .u-seg:hover{opacity:.85}
447
+ /* Stock intro: no pill highlight, the text itself shimmers gold (gradient clipped to the glyphs). Reduced motion leaves a still gold gradient. */
448
+ .u-seg-lock{cursor:default;user-select:text;padding:0;margin:0;border-radius:0;font-weight:600;background:linear-gradient(110deg,var(--u-gold-ink) 0%,var(--u-gold-ink-hi) 30%,var(--u-gold-ink) 50%,var(--u-gold-ink-hi) 70%,var(--u-gold-ink) 100%);background-size:250% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:u-shimmer 4s linear infinite}
449
+ .u-seg-lock:hover{opacity:1}
450
+ .u-seg-x{display:inline-flex;align-items:center;justify-content:center;margin-left:4px;padding:0 8px;min-width:24px;min-height:22px;cursor:pointer;font-size:15px;font-weight:700;color:#111;background:rgba(255,200,0,.8);border-radius:999px;line-height:1;vertical-align:middle;touch-action:manipulation;-webkit-tap-highlight-color:transparent}
451
+ .u-seg-x:hover,.u-seg-x:active,.u-seg-x:focus-visible{color:#fff;background:#c00;outline:none}
452
+ .u-editor:disabled{opacity:.6}
453
+ .u-send{border:0;background:var(--u-accent);color:var(--u-accent-ink);font-weight:700;border-radius:9px;padding:8px 16px;min-height:40px}
454
+ .u-send:disabled{opacity:.45}
455
+ .u-gen{border:1px solid var(--u-border);background:var(--u-bg);border-radius:9px;padding:8px 14px;font-weight:600;min-height:40px}
456
+ .u-gen:disabled{opacity:.5}
457
+ .u-note{margin-top:8px;border-radius:9px;padding:9px 12px;font-size:13.5px;display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center}
458
+ .u-note-err{background:color-mix(in srgb,var(--u-danger) 9%,var(--u-bg));border:1px solid color-mix(in srgb,var(--u-danger) 35%,transparent)}
459
+ .u-note-warn{background:color-mix(in srgb,var(--u-warn) 10%,var(--u-bg));border:1px solid color-mix(in srgb,var(--u-warn) 35%,transparent)}
460
+ .u-note-ok{background:var(--u-highlight-soft)}
461
+ .u-banner{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;padding:10px 16px;font-size:14px;border-bottom:1px solid var(--u-border);background:var(--u-accent-soft)}
462
+ .u-headbtn{border:1px solid var(--u-border);background:var(--u-bg);border-radius:8px;padding:6px 11px;font-size:14px;font-weight:600;min-height:34px}
463
+ .u-headbtn:disabled{opacity:.5}
464
+ .u-connect{margin-left:4px;display:inline-flex;align-items:center;gap:7px;flex:none}
465
+ /* AI settings + full screen: the right end of the conversation header (no panel header row). */
466
+ .u-head-acts{margin-left:auto;display:inline-flex;align-items:center;gap:6px;flex:none}
467
+ .u-chan ~ .u-head-acts{margin-left:6px}
468
+ .u-pane-head-empty{justify-content:flex-end;min-height:62px;box-sizing:border-box}
469
+ /* On wide panels the toolbar leaves them to the conversation header. */
470
+ .u-toolbar-acts{display:none}
471
+ .u-toolbar .u-addbtn{flex:none}
472
+ .u-connect svg{flex:none}
473
+ .u-example{width:100%;border:1px dashed var(--u-border);border-radius:12px;padding:12px;background:var(--u-surface-2);display:flex;flex-direction:column}
474
+ .u-ex-lab{font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--u-muted);margin-bottom:6px}
475
+ .u-sheet-wrap{position:absolute;inset:0;background:rgba(10,10,10,.45);display:grid;place-items:center;padding:16px;z-index:5}
476
+ .u-sheet{width:min(560px,100%);max-height:100%;overflow:auto;background:var(--u-bg);color:var(--u-text);border:1px solid var(--u-border);border-radius:16px;box-shadow:0 18px 50px rgba(0,0,0,.25);padding:20px;outline:none}
477
+ .u-eyebrow{font-size:12px;font-weight:700;letter-spacing:.1em;text-transform:uppercase;color:var(--u-muted)}
478
+ .u-sheet h3{font-size:21px;margin:6px 0 8px}
479
+ .u-lede{font-size:14.5px;color:var(--u-muted)}
480
+ .u-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px;align-items:center}
481
+ .u-secondary{border:1px solid var(--u-border);background:var(--u-bg);border-radius:9px;padding:8px 14px;font-weight:600;min-height:40px}
482
+ .u-steps{display:flex;gap:6px;margin-bottom:12px}
483
+ .u-steps span{flex:1;height:4px;border-radius:999px;background:var(--u-surface-3)}
484
+ .u-steps span.u-on{background:var(--u-highlight)}
485
+ .u-plan{margin-top:14px;border:1px solid var(--u-highlight);border-radius:12px;padding:14px;background:var(--u-highlight-soft)}
486
+ .u-plan-name{font-weight:700;font-size:15px}
487
+ .u-plan-price{font-size:30px;font-weight:700;margin-top:2px}
488
+ .u-plan-price small{font-size:15px;font-weight:500;color:var(--u-muted)}
489
+ .u-plan-vs{font-size:13.5px;color:var(--u-muted)}
490
+ .u-feats{margin:12px 0 0;padding-left:18px;font-size:14px}
491
+ .u-feats li{margin:3px 0}
492
+ .u-chanbox{margin-top:12px;border:1px solid var(--u-border);border-radius:12px;padding:11px 13px}
493
+ .u-chanbox h4{font-size:15px}
494
+ .u-chanbox p{font-size:14px;margin-top:4px;color:var(--u-text)}
495
+ .u-tick{display:flex;gap:10px;align-items:flex-start;margin-top:12px;font-size:14.5px}
496
+ .u-tick input{width:20px;height:20px;margin-top:1px;accent-color:var(--u-highlight)}
497
+ .u-field{margin-top:12px;display:flex;flex-direction:column;gap:5px}
498
+ .u-field>label,.u-field>span:first-child{font-size:13.5px;font-weight:600}
499
+ .u-field select{border:1px solid var(--u-border);background:var(--u-bg);color:var(--u-text);border-radius:9px;padding:9px 11px;font:inherit;min-height:42px}
500
+ .u-field input{border:1px solid var(--u-border);background:var(--u-bg);color:var(--u-text);border-radius:9px;padding:9px 11px;font:inherit;min-height:42px}
501
+ .u-field input[aria-invalid="true"]{border-color:var(--u-danger)}
502
+ .u-hint{font-size:13px;color:var(--u-muted)}
503
+ .u-err{font-size:13px;color:var(--u-danger)}
504
+ .u-chanpick{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
505
+ .u-chanpick button{border:1px solid var(--u-border);background:var(--u-bg);border-radius:10px;padding:9px;text-align:left;min-height:56px}
506
+ .u-chanpick button[aria-checked="true"]{border-color:var(--u-highlight);box-shadow:0 0 0 1px var(--u-highlight)}
507
+ .u-chanpick b{display:block;font-size:14.5px}
508
+ .u-chanpick small{font-size:12.5px;color:var(--u-muted)}
509
+ @media (prefers-reduced-motion:reduce){.uplift *{transition:none!important;animation:none!important}}
510
+ @container panel (max-width:759px){
511
+ .u-cx-mocks{grid-template-columns:1fr}
512
+ .u-inl-grid{grid-template-columns:1fr}
513
+ .u-ia{width:100%}
514
+ .u-split{grid-template-columns:1fr;height:min(80vh,720px)}
515
+ .u-split.u-show-thread .u-list{display:none}
516
+ .u-split:not(.u-show-thread) .u-pane{display:none}
517
+ .u-back{display:inline-flex}
518
+ .u-toolbar-acts{display:inline-flex;flex:none;margin-left:auto}
519
+ .u-toolbar-acts .u-head-acts{margin-left:0}
520
+ /* Phone widths: the toolbar wraps its buttons rather than cutting them off; the conversation header
521
+ keeps name, Connect and the buttons on one line by dropping the phone number and Connect's label. */
522
+ .u-toolbar{flex-wrap:wrap;row-gap:6px}
523
+ .u-sortgroup button{padding:4px 7px}
524
+ .u-pane-head{gap:8px;padding:10px 12px}
525
+ .u-pane-head .u-chan{display:none}
526
+ .u-who{flex:0 1 auto}
527
+ .u-who strong,.u-who small{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
528
+ .u-connect{padding:6px 9px}
529
+ .u-connect span{display:none}
530
+ .u-ag-grid{grid-template-columns:1fr}
531
+ .u-c-actions .u-meta{flex-basis:100%}
532
+ .u-sheet-wrap{padding:0}
533
+ .u-sheet{width:100%;height:100%;border-radius:0}
534
+ }
535
+ `;
536
+ /** Add the panel stylesheet to `doc` once. Safe to call on every render. */
537
+ export function injectStyles(doc = typeof document === "undefined" ? undefined : document) {
538
+ if (!doc || doc.getElementById(STYLE_ELEMENT_ID))
539
+ return;
540
+ const el = doc.createElement("style");
541
+ el.id = STYLE_ELEMENT_ID;
542
+ el.textContent = upliftStyles;
543
+ doc.head.appendChild(el);
544
+ }
545
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAExD,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2gB3B,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,MAA4B,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;IAC7G,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC;QAAE,OAAO;IACzD,MAAM,EAAE,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtC,EAAE,CAAC,EAAE,GAAG,gBAAgB,CAAC;IACzB,EAAE,CAAC,WAAW,GAAG,YAAY,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
package/dist/time.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ export declare function isSameDay(a: Date, b: Date): boolean;
2
+ /** "5 Oct", or "5 Oct 2025" when the year differs from `now`. */
3
+ export declare function shortDate(d: Date, now?: Date): string;
4
+ /** Compact age for list rows: "now", "35m", "2h", "4d", "3w", then a short date. Empty for null. */
5
+ export declare function relativeShort(iso: string | null | undefined, now?: Date): string;
6
+ /** Sentence-ready age: "just now", "35m ago", "4d ago", "3w ago", then "on 5 Oct". Empty for null. */
7
+ export declare function relativeAgo(iso: string | null | undefined, now?: Date): string;
8
+ /** Day separator text: "Today", "Yesterday", a weekday inside the last week, else a short date. */
9
+ export declare function dayLabel(iso: string, now?: Date): string;
10
+ /** Local 24-hour clock, "07:02". */
11
+ export declare function clockLabel(iso: string | null | undefined): string;
12
+ /** Local calendar-day key for grouping, "2026-10-05". */
13
+ export declare function dayKey(iso: string | null | undefined): string;
14
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAeA,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAEnD;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAGjE;AAED,oGAAoG;AACpG,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAa5F;AAED,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAK1F;AAED,mGAAmG;AACnG,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAQpE;AAED,oCAAoC;AACpC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAIjE;AAED,yDAAyD;AACzD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAI7D"}