@lindaui/blocks 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +56 -0
  2. package/dist/ai-cost-card-f403ypsg.js +99 -0
  3. package/dist/ai-performance-card-cggm09nc.js +191 -0
  4. package/dist/analytics/ai-cost-card.d.ts +3 -0
  5. package/dist/analytics/ai-cost-card.d.ts.map +1 -0
  6. package/dist/analytics/ai-performance-card.d.ts +3 -0
  7. package/dist/analytics/ai-performance-card.d.ts.map +1 -0
  8. package/dist/analytics/analytics-card.d.ts +3 -0
  9. package/dist/analytics/analytics-card.d.ts.map +1 -0
  10. package/dist/analytics/analytics-skeleton.d.ts +5 -0
  11. package/dist/analytics/analytics-skeleton.d.ts.map +1 -0
  12. package/dist/analytics/entity-health-card.d.ts +3 -0
  13. package/dist/analytics/entity-health-card.d.ts.map +1 -0
  14. package/dist/analytics/status-distribution-chart.d.ts +3 -0
  15. package/dist/analytics/status-distribution-chart.d.ts.map +1 -0
  16. package/dist/analytics/time-range-picker.d.ts +3 -0
  17. package/dist/analytics/time-range-picker.d.ts.map +1 -0
  18. package/dist/analytics/top-entities-table.d.ts +3 -0
  19. package/dist/analytics/top-entities-table.d.ts.map +1 -0
  20. package/dist/analytics/types.d.ts +104 -0
  21. package/dist/analytics/types.d.ts.map +1 -0
  22. package/dist/analytics-card-bcmijpt6.js +38 -0
  23. package/dist/analytics-skeleton-imve37du.js +164 -0
  24. package/dist/analytics.d.ts +11 -0
  25. package/dist/analytics.d.ts.map +1 -0
  26. package/dist/analytics.js +8 -0
  27. package/dist/app-shell/drawer-focus.d.ts +8 -0
  28. package/dist/app-shell/drawer-focus.d.ts.map +1 -0
  29. package/dist/app-shell/footer.d.ts +39 -0
  30. package/dist/app-shell/footer.d.ts.map +1 -0
  31. package/dist/app-shell/logout-dialog.d.ts +6 -0
  32. package/dist/app-shell/logout-dialog.d.ts.map +1 -0
  33. package/dist/app-shell/navigation.d.ts +15 -0
  34. package/dist/app-shell/navigation.d.ts.map +1 -0
  35. package/dist/app-shell/types.d.ts +55 -0
  36. package/dist/app-shell/types.d.ts.map +1 -0
  37. package/dist/app-shell.d.ts +7 -0
  38. package/dist/app-shell.d.ts.map +1 -0
  39. package/dist/app-shell.js +254 -0
  40. package/dist/channel-settings.d.ts +24 -0
  41. package/dist/channel-settings.d.ts.map +1 -0
  42. package/dist/channel-settings.js +60 -0
  43. package/dist/chat-avatar-jdmeyf2o.js +30 -0
  44. package/dist/chat-layout-fwx3x26g.js +25 -0
  45. package/dist/chat.d.ts +22 -0
  46. package/dist/chat.d.ts.map +1 -0
  47. package/dist/chat.js +66 -0
  48. package/dist/command-palette.d.ts +22 -0
  49. package/dist/command-palette.d.ts.map +1 -0
  50. package/dist/command-palette.js +141 -0
  51. package/dist/compat-chat/chat-avatar.d.ts +16 -0
  52. package/dist/compat-chat/chat-avatar.d.ts.map +1 -0
  53. package/dist/compat-chat/chat-header.d.ts +9 -0
  54. package/dist/compat-chat/chat-header.d.ts.map +1 -0
  55. package/dist/compat-chat/chat-layout.d.ts +10 -0
  56. package/dist/compat-chat/chat-layout.d.ts.map +1 -0
  57. package/dist/compat-chat/conversation-list-item.d.ts +10 -0
  58. package/dist/compat-chat/conversation-list-item.d.ts.map +1 -0
  59. package/dist/compat-chat/conversation-list.d.ts +24 -0
  60. package/dist/compat-chat/conversation-list.d.ts.map +1 -0
  61. package/dist/compat-chat/conversation-thread.d.ts +18 -0
  62. package/dist/compat-chat/conversation-thread.d.ts.map +1 -0
  63. package/dist/compat-chat/date-divider.d.ts +5 -0
  64. package/dist/compat-chat/date-divider.d.ts.map +1 -0
  65. package/dist/compat-chat/empty-chat-view.d.ts +6 -0
  66. package/dist/compat-chat/empty-chat-view.d.ts.map +1 -0
  67. package/dist/compat-chat/image-lightbox.d.ts +7 -0
  68. package/dist/compat-chat/image-lightbox.d.ts.map +1 -0
  69. package/dist/compat-chat/message-bubble.d.ts +6 -0
  70. package/dist/compat-chat/message-bubble.d.ts.map +1 -0
  71. package/dist/compat-chat/message-composer.d.ts +11 -0
  72. package/dist/compat-chat/message-composer.d.ts.map +1 -0
  73. package/dist/compat-chat/time-divider.d.ts +5 -0
  74. package/dist/compat-chat/time-divider.d.ts.map +1 -0
  75. package/dist/compat-chat/time-grouping.d.ts +5 -0
  76. package/dist/compat-chat/time-grouping.d.ts.map +1 -0
  77. package/dist/compat-chat/types.d.ts +35 -0
  78. package/dist/compat-chat/types.d.ts.map +1 -0
  79. package/dist/compat-chat/whatsapp-audio-player.d.ts +7 -0
  80. package/dist/compat-chat/whatsapp-audio-player.d.ts.map +1 -0
  81. package/dist/compat.d.ts +9 -0
  82. package/dist/compat.d.ts.map +1 -0
  83. package/dist/compat.js +4 -0
  84. package/dist/connected-panel-lhwy25yk.js +132 -0
  85. package/dist/connection-panel/connected-panel.d.ts +26 -0
  86. package/dist/connection-panel/connected-panel.d.ts.map +1 -0
  87. package/dist/connection-panel/disconnected-panel.d.ts +12 -0
  88. package/dist/connection-panel/disconnected-panel.d.ts.map +1 -0
  89. package/dist/connection-panel/instructions.d.ts +5 -0
  90. package/dist/connection-panel/instructions.d.ts.map +1 -0
  91. package/dist/connection-panel/qr-panel.d.ts +14 -0
  92. package/dist/connection-panel/qr-panel.d.ts.map +1 -0
  93. package/dist/connection-panel/use-qr-refresh.d.ts +18 -0
  94. package/dist/connection-panel/use-qr-refresh.d.ts.map +1 -0
  95. package/dist/connection-panel.d.ts +39 -0
  96. package/dist/connection-panel.d.ts.map +1 -0
  97. package/dist/connection-panel.js +328 -0
  98. package/dist/conversation-list-ekq2dzca.js +133 -0
  99. package/dist/conversation-list-item-fy6t5af2.js +55 -0
  100. package/dist/conversation-thread-c60431oa.js +205 -0
  101. package/dist/entity-card.d.ts +17 -0
  102. package/dist/entity-card.d.ts.map +1 -0
  103. package/dist/entity-card.js +69 -0
  104. package/dist/entity-health-card-ggnmrtrq.js +192 -0
  105. package/dist/entity-switcher.d.ts +33 -0
  106. package/dist/entity-switcher.d.ts.map +1 -0
  107. package/dist/entity-switcher.js +137 -0
  108. package/dist/filter-bar.d.ts +41 -0
  109. package/dist/filter-bar.d.ts.map +1 -0
  110. package/dist/filter-bar.js +155 -0
  111. package/dist/footer-f7r5e42b.js +192 -0
  112. package/dist/image-lightbox-ci3arb6z.js +62 -0
  113. package/dist/kanban/drop-utils.d.ts +18 -0
  114. package/dist/kanban/drop-utils.d.ts.map +1 -0
  115. package/dist/kanban/navigation-buttons.d.ts +9 -0
  116. package/dist/kanban/navigation-buttons.d.ts.map +1 -0
  117. package/dist/kanban/scroll-indicators.d.ts +6 -0
  118. package/dist/kanban/scroll-indicators.d.ts.map +1 -0
  119. package/dist/kanban/use-keyboard-navigation.d.ts +4 -0
  120. package/dist/kanban/use-keyboard-navigation.d.ts.map +1 -0
  121. package/dist/kanban-board.d.ts +31 -0
  122. package/dist/kanban-board.d.ts.map +1 -0
  123. package/dist/kanban-board.js +128 -0
  124. package/dist/kanban-column.d.ts +13 -0
  125. package/dist/kanban-column.d.ts.map +1 -0
  126. package/dist/kanban-column.js +58 -0
  127. package/dist/legacy-kpi-card.d.ts +16 -0
  128. package/dist/legacy-kpi-card.d.ts.map +1 -0
  129. package/dist/legacy-kpi-card.js +4 -0
  130. package/dist/logout-dialog-bbv59tbi.js +93 -0
  131. package/dist/message-bubble-odjvhroq.js +110 -0
  132. package/dist/message-composer-m2n6soo7.js +59 -0
  133. package/dist/navigation-buttons-e77mshh0.js +65 -0
  134. package/dist/navigation-hotcrqoq.js +115 -0
  135. package/dist/save-bar.d.ts +15 -0
  136. package/dist/save-bar.d.ts.map +1 -0
  137. package/dist/save-bar.js +38 -0
  138. package/dist/scroll-indicators-gvxapogd.js +39 -0
  139. package/dist/settings-layout.d.ts +20 -0
  140. package/dist/settings-layout.d.ts.map +1 -0
  141. package/dist/settings-layout.js +56 -0
  142. package/dist/source-selector.d.ts +18 -0
  143. package/dist/source-selector.d.ts.map +1 -0
  144. package/dist/source-selector.js +59 -0
  145. package/dist/status-distribution-chart-oucedzv7.js +87 -0
  146. package/dist/status-filters.d.ts +12 -0
  147. package/dist/status-filters.d.ts.map +1 -0
  148. package/dist/status-filters.js +31 -0
  149. package/dist/stepper.d.ts +15 -0
  150. package/dist/stepper.d.ts.map +1 -0
  151. package/dist/stepper.js +42 -0
  152. package/dist/time-range-picker-mu38hul4.js +123 -0
  153. package/dist/top-entities-table-o7xzpq96.js +78 -0
  154. package/dist/use-keyboard-navigation-he1xmriz.js +52 -0
  155. package/dist/whatsapp-audio-player-nooty6jb.js +277 -0
  156. package/llms.txt +87 -4
  157. package/package.json +191 -46
  158. package/src/analytics/ai-cost-card.tsx +31 -0
  159. package/src/analytics/ai-performance-card.tsx +48 -0
  160. package/src/analytics/analytics-card.tsx +14 -0
  161. package/src/analytics/analytics-skeleton.tsx +15 -0
  162. package/src/analytics/entity-health-card.tsx +50 -0
  163. package/src/analytics/status-distribution-chart.tsx +20 -0
  164. package/src/analytics/time-range-picker.tsx +43 -0
  165. package/src/analytics/top-entities-table.tsx +24 -0
  166. package/src/analytics/types.ts +43 -0
  167. package/src/analytics.ts +10 -0
  168. package/src/app-shell/drawer-focus.ts +42 -0
  169. package/src/app-shell/footer.tsx +160 -0
  170. package/src/app-shell/logout-dialog.tsx +68 -0
  171. package/src/app-shell/navigation.tsx +147 -0
  172. package/src/app-shell/types.ts +57 -0
  173. package/src/app-shell.tsx +166 -0
  174. package/src/area-chart.tsx +85 -0
  175. package/src/audio-player.tsx +74 -0
  176. package/src/auth-layout.tsx +132 -0
  177. package/src/auth-provider.tsx +29 -0
  178. package/src/bar-chart.tsx +78 -0
  179. package/src/channel-settings.tsx +76 -0
  180. package/src/chart-card.tsx +45 -0
  181. package/src/chat-avatar.tsx +57 -0
  182. package/src/chat-date-divider.tsx +18 -0
  183. package/src/chat-header.tsx +24 -0
  184. package/src/chat-layout.tsx +41 -0
  185. package/src/chat-time-divider.tsx +20 -0
  186. package/src/chat-types.ts +32 -0
  187. package/src/chat.ts +21 -0
  188. package/src/command-palette.tsx +110 -0
  189. package/src/compat-chat/chat-avatar.tsx +23 -0
  190. package/src/compat-chat/chat-header.tsx +12 -0
  191. package/src/compat-chat/chat-layout.tsx +14 -0
  192. package/src/compat-chat/conversation-list-item.tsx +27 -0
  193. package/src/compat-chat/conversation-list.tsx +49 -0
  194. package/src/compat-chat/conversation-thread.tsx +92 -0
  195. package/src/compat-chat/date-divider.tsx +7 -0
  196. package/src/compat-chat/empty-chat-view.tsx +9 -0
  197. package/src/compat-chat/image-lightbox.tsx +22 -0
  198. package/src/compat-chat/message-bubble.tsx +28 -0
  199. package/src/compat-chat/message-composer.tsx +26 -0
  200. package/src/compat-chat/time-divider.tsx +5 -0
  201. package/src/compat-chat/time-grouping.ts +19 -0
  202. package/src/compat-chat/types.ts +31 -0
  203. package/src/compat-chat/whatsapp-audio-player.tsx +100 -0
  204. package/src/compat.ts +8 -0
  205. package/src/confirm-dialog.tsx +85 -0
  206. package/src/connection-panel/connected-panel.tsx +106 -0
  207. package/src/connection-panel/disconnected-panel.tsx +48 -0
  208. package/src/connection-panel/instructions.tsx +9 -0
  209. package/src/connection-panel/qr-panel.tsx +62 -0
  210. package/src/connection-panel/use-qr-refresh.ts +52 -0
  211. package/src/connection-panel.tsx +141 -0
  212. package/src/conversation-list-item.tsx +53 -0
  213. package/src/conversation-list.tsx +67 -0
  214. package/src/conversation-thread.tsx +64 -0
  215. package/src/detail-panel.tsx +123 -0
  216. package/src/document-panel.tsx +109 -0
  217. package/src/document-reader.tsx +29 -0
  218. package/src/empty-chat-view.tsx +25 -0
  219. package/src/entity-card.tsx +74 -0
  220. package/src/entity-health-card.tsx +53 -0
  221. package/src/entity-switcher.tsx +126 -0
  222. package/src/fetching-indicator.tsx +16 -0
  223. package/src/field-array-form.tsx +166 -0
  224. package/src/filter-bar.tsx +203 -0
  225. package/src/image-viewer.tsx +129 -0
  226. package/src/kanban/drop-utils.ts +31 -0
  227. package/src/kanban/navigation-buttons.tsx +80 -0
  228. package/src/kanban/scroll-indicators.tsx +47 -0
  229. package/src/kanban/use-keyboard-navigation.ts +43 -0
  230. package/src/kanban-board.tsx +160 -0
  231. package/src/kanban-column.tsx +62 -0
  232. package/src/legacy-kpi-card.tsx +38 -0
  233. package/src/line-chart.tsx +58 -0
  234. package/src/list-item.tsx +63 -0
  235. package/src/list-pane.tsx +143 -0
  236. package/src/login-form.tsx +128 -0
  237. package/src/message-bubble.tsx +70 -0
  238. package/src/message-composer.tsx +52 -0
  239. package/src/pie-chart.tsx +70 -0
  240. package/src/radar-chart.tsx +55 -0
  241. package/src/radial-chart.tsx +103 -0
  242. package/src/recording-overlay.tsx +159 -0
  243. package/src/save-bar.tsx +35 -0
  244. package/src/settings-layout.tsx +79 -0
  245. package/src/source-selector.tsx +71 -0
  246. package/src/split-workspace.tsx +74 -0
  247. package/src/stat-card.tsx +166 -0
  248. package/src/stats-grid.tsx +23 -0
  249. package/src/status-filters.tsx +28 -0
  250. package/src/stepper.tsx +47 -0
  251. package/src/table-pane.tsx +194 -0
  252. package/src/time-range-picker.tsx +89 -0
  253. package/src/workspace-back-button.tsx +32 -0
  254. package/dist/chat-types.test.d.ts +0 -2
  255. package/dist/chat-types.test.d.ts.map +0 -1
@@ -0,0 +1,7 @@
1
+ export interface WhatsAppAudioPlayerProps {
2
+ isBot?: boolean;
3
+ src: string;
4
+ }
5
+ /** Voice-note playback, buffering, duration tracking and click-to-seek. */
6
+ export declare function WhatsAppAudioPlayer({ src, isBot }: WhatsAppAudioPlayerProps): import("react").JSX.Element;
7
+ //# sourceMappingURL=whatsapp-audio-player.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-audio-player.d.ts","sourceRoot":"","sources":["../../src/compat-chat/whatsapp-audio-player.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,wBAAwB;IAAG,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AA0B3E,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,EAAE,GAAG,EAAE,KAAa,EAAE,EAAE,wBAAwB,+BAoEnF"}
@@ -0,0 +1,9 @@
1
+ /** Legacy presentation API isolated from the existing lindaui entry points. */
2
+ export * from "@lindaui/ui/compat";
3
+ export { KPICard } from "./legacy-kpi-card.js";
4
+ export type { KPICardProps, KPICardColor } from "./legacy-kpi-card.js";
5
+ export { StatusFilters } from "./status-filters.js";
6
+ export type { StatusFiltersProps } from "./status-filters.js";
7
+ export { DateDivider } from "./compat-chat/date-divider.js";
8
+ export type { DateDividerProps } from "./compat-chat/date-divider.js";
9
+ //# sourceMappingURL=compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compat.d.ts","sourceRoot":"","sources":["../src/compat.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAmB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAmB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAkB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA4B,CAAC;AACzD,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA4B,CAAC"}
package/dist/compat.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from '@lindaui/ui/compat';
2
+ export { K as KPICard } from './analytics-skeleton-imve37du.js';
3
+ export { StatusFilters } from './status-filters.js';
4
+ export { D as DateDivider } from './conversation-thread-c60431oa.js';
@@ -0,0 +1,132 @@
1
+ 'use client';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { Button, Modal, Spinner } from '@lindaui/ui/compound';
4
+ import { useState, useRef } from 'react';
5
+
6
+ /** Connection metadata and an async, non-dismissable-while-pending confirmation. */ function ConnectedPanel({ details, labels, error: connectionError, onDisconnect }) {
7
+ const [isOpen, setIsOpen] = useState(false);
8
+ const [isPending, setIsPending] = useState(false);
9
+ const [error, setError] = useState(null);
10
+ const pending = useRef(false);
11
+ async function disconnect() {
12
+ if (pending.current) return;
13
+ pending.current = true;
14
+ setIsPending(true);
15
+ setError(null);
16
+ try {
17
+ await onDisconnect();
18
+ setIsOpen(false);
19
+ } catch {
20
+ setError(labels.disconnectError);
21
+ } finally{
22
+ pending.current = false;
23
+ setIsPending(false);
24
+ }
25
+ }
26
+ return /*#__PURE__*/ jsxs("div", {
27
+ className: "space-y-6",
28
+ children: [
29
+ /*#__PURE__*/ jsx("dl", {
30
+ className: "divide-y divide-border/60 text-sm",
31
+ children: details.map(({ id, label, value, valueClassName, dateTime })=>/*#__PURE__*/ jsxs("div", {
32
+ className: "flex flex-col gap-1 py-4 sm:flex-row sm:justify-between sm:gap-6",
33
+ children: [
34
+ /*#__PURE__*/ jsx("dt", {
35
+ className: "text-muted",
36
+ children: label
37
+ }),
38
+ /*#__PURE__*/ jsx("dd", {
39
+ className: valueClassName,
40
+ children: dateTime ? /*#__PURE__*/ jsx("time", {
41
+ dateTime: dateTime,
42
+ children: value
43
+ }) : value
44
+ })
45
+ ]
46
+ }, id))
47
+ }),
48
+ /*#__PURE__*/ jsxs("div", {
49
+ className: "flex flex-col items-start gap-3 border-border/60 border-t pt-5 sm:flex-row sm:items-center sm:justify-between sm:gap-6",
50
+ children: [
51
+ /*#__PURE__*/ jsx("p", {
52
+ className: "max-w-sm text-muted text-xs leading-relaxed",
53
+ children: labels.disconnectHint
54
+ }),
55
+ /*#__PURE__*/ jsx(Button, {
56
+ className: "min-h-11 shrink-0",
57
+ onPress: ()=>{
58
+ setError(null);
59
+ setIsOpen(true);
60
+ },
61
+ variant: "danger-soft",
62
+ children: labels.disconnect
63
+ })
64
+ ]
65
+ }),
66
+ connectionError && !isOpen && /*#__PURE__*/ jsx("p", {
67
+ className: "text-danger text-sm",
68
+ role: "alert",
69
+ children: connectionError
70
+ }),
71
+ /*#__PURE__*/ jsx(Modal.Backdrop, {
72
+ isDismissable: !isPending,
73
+ isKeyboardDismissDisabled: isPending,
74
+ isOpen: isOpen,
75
+ onOpenChange: (open)=>{
76
+ if (!pending.current) setIsOpen(open);
77
+ },
78
+ children: /*#__PURE__*/ jsx(Modal.Container, {
79
+ children: /*#__PURE__*/ jsxs(Modal.Dialog, {
80
+ className: "sm:max-w-md",
81
+ role: "alertdialog",
82
+ children: [
83
+ /*#__PURE__*/ jsx(Modal.Header, {
84
+ children: /*#__PURE__*/ jsx(Modal.Heading, {
85
+ children: labels.confirmTitle
86
+ })
87
+ }),
88
+ /*#__PURE__*/ jsxs(Modal.Body, {
89
+ children: [
90
+ /*#__PURE__*/ jsx("p", {
91
+ className: "text-muted text-sm leading-relaxed",
92
+ children: labels.confirmDescription
93
+ }),
94
+ error && /*#__PURE__*/ jsx("p", {
95
+ className: "mt-3 text-danger text-sm",
96
+ role: "alert",
97
+ children: error
98
+ })
99
+ ]
100
+ }),
101
+ /*#__PURE__*/ jsxs(Modal.Footer, {
102
+ children: [
103
+ /*#__PURE__*/ jsx(Button, {
104
+ autoFocus: true,
105
+ isDisabled: isPending,
106
+ onPress: ()=>setIsOpen(false),
107
+ variant: "tertiary",
108
+ children: labels.cancel
109
+ }),
110
+ /*#__PURE__*/ jsxs(Button, {
111
+ isPending: isPending,
112
+ onPress: disconnect,
113
+ variant: "danger",
114
+ children: [
115
+ isPending && /*#__PURE__*/ jsx(Spinner, {
116
+ color: "current",
117
+ size: "sm"
118
+ }),
119
+ isPending ? labels.disconnecting : labels.disconnect
120
+ ]
121
+ })
122
+ ]
123
+ })
124
+ ]
125
+ })
126
+ })
127
+ })
128
+ ]
129
+ });
130
+ }
131
+
132
+ export { ConnectedPanel as C };
@@ -0,0 +1,26 @@
1
+ import { type ReactNode } from "react";
2
+ export interface ConnectionDetail {
3
+ id: string;
4
+ label: ReactNode;
5
+ value: ReactNode;
6
+ valueClassName?: string;
7
+ dateTime?: string;
8
+ }
9
+ export interface ConnectedPanelLabels {
10
+ disconnectHint: ReactNode;
11
+ disconnect: ReactNode;
12
+ disconnecting: ReactNode;
13
+ disconnectError: ReactNode;
14
+ confirmTitle: ReactNode;
15
+ confirmDescription: ReactNode;
16
+ cancel: ReactNode;
17
+ }
18
+ export interface ConnectedPanelProps {
19
+ details: readonly ConnectionDetail[];
20
+ labels: ConnectedPanelLabels;
21
+ error?: ReactNode;
22
+ onDisconnect: () => Promise<void>;
23
+ }
24
+ /** Connection metadata and an async, non-dismissable-while-pending confirmation. */
25
+ export declare function ConnectedPanel({ details, labels, error: connectionError, onDisconnect }: ConnectedPanelProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=connected-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connected-panel.d.ts","sourceRoot":"","sources":["../../src/connection-panel/connected-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,SAAS,CAAC;IAC1B,UAAU,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,SAAS,CAAC;IACzB,eAAe,EAAE,SAAS,CAAC;IAC3B,YAAY,EAAE,SAAS,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,MAAM,EAAE,oBAAoB,CAAC;IAC7B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,EAAE,mBAAmB,+BA0E5G"}
@@ -0,0 +1,12 @@
1
+ import type { ReactNode } from "react";
2
+ import type { ConnectionPanelLabels } from "../connection-panel.js";
3
+ interface DisconnectedPanelProps {
4
+ generating: boolean;
5
+ pending: boolean;
6
+ labels: ConnectionPanelLabels;
7
+ error?: ReactNode;
8
+ onConnect: () => Promise<void>;
9
+ }
10
+ export declare function DisconnectedPanel({ generating, pending, labels, error, onConnect }: DisconnectedPanelProps): import("react").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=disconnected-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disconnected-panel.d.ts","sourceRoot":"","sources":["../../src/connection-panel/disconnected-panel.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAqB,CAAC;AAGjE,UAAU,sBAAsB;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,qBAAqB,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,wBAAgB,iBAAiB,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,sBAAsB,+BAkC1G"}
@@ -0,0 +1,5 @@
1
+ import type { ReactNode } from "react";
2
+ export declare function ConnectionInstructions({ items }: {
3
+ items: readonly ReactNode[];
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../../src/connection-panel/instructions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,wBAAgB,sBAAsB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,+BAMhF"}
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ import type { ConnectionPanelLabels } from "../connection-panel.js";
3
+ interface QRPanelProps {
4
+ qrCode: ReactNode;
5
+ qrFormat?: "ascii" | "image";
6
+ labels: ConnectionPanelLabels;
7
+ timeRemaining: number;
8
+ isRefreshing: boolean;
9
+ error?: ReactNode;
10
+ onRefresh: () => Promise<void>;
11
+ }
12
+ export declare function QRPanel({ qrCode, qrFormat, labels, timeRemaining, isRefreshing, error, onRefresh }: QRPanelProps): import("react").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=qr-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-panel.d.ts","sourceRoot":"","sources":["../../src/connection-panel/qr-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAqB,CAAC;AAGjE,UAAU,YAAY;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC7B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAMD,wBAAgB,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,+BAyChH"}
@@ -0,0 +1,18 @@
1
+ import { type ReactNode } from "react";
2
+ interface QRRefreshOptions {
3
+ enabled: boolean;
4
+ expirySeconds: number;
5
+ error?: ReactNode;
6
+ errorLabel: ReactNode;
7
+ onRefresh: () => Promise<void>;
8
+ }
9
+ /** Pause hidden challenges and never overlap refreshes or automatically retry failures. */
10
+ export declare function useQRRefresh({ enabled, expirySeconds, error, errorLabel, onRefresh }: QRRefreshOptions): {
11
+ timeRemaining: number;
12
+ isRefreshing: boolean;
13
+ actionError: ReactNode;
14
+ setActionError: import("react").Dispatch<import("react").SetStateAction<ReactNode>>;
15
+ refresh: () => Promise<void>;
16
+ };
17
+ export {};
18
+ //# sourceMappingURL=use-qr-refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-qr-refresh.d.ts","sourceRoot":"","sources":["../../src/connection-panel/use-qr-refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjF,UAAU,gBAAgB;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,gBAAgB;;;;;;EAwCtG"}
@@ -0,0 +1,39 @@
1
+ import { type ReactNode } from "react";
2
+ export { ConnectedPanel } from "./connection-panel/connected-panel.js";
3
+ export type { ConnectedPanelProps, ConnectedPanelLabels, ConnectionDetail } from "./connection-panel/connected-panel.js";
4
+ export type ConnectionPanelState = {
5
+ status: "checking" | "disconnected" | "generating";
6
+ } | {
7
+ status: "awaiting_scan";
8
+ qrCode: ReactNode;
9
+ qrFormat?: "ascii" | "image";
10
+ } | {
11
+ status: "connected";
12
+ content: ReactNode;
13
+ };
14
+ export interface ConnectionPanelLabels {
15
+ checking: ReactNode;
16
+ generating: ReactNode;
17
+ waiting: ReactNode;
18
+ disconnectedDescription: ReactNode;
19
+ connect: ReactNode;
20
+ connectError: ReactNode;
21
+ refresh: ReactNode;
22
+ expiresSoon: ReactNode;
23
+ expiresIn: (time: string) => ReactNode;
24
+ instructions: readonly ReactNode[];
25
+ disconnectedInstructions: readonly ReactNode[];
26
+ }
27
+ export interface ConnectionPanelProps {
28
+ state: ConnectionPanelState;
29
+ labels: ConnectionPanelLabels;
30
+ error?: ReactNode;
31
+ isActive?: boolean;
32
+ className?: string;
33
+ qrExpirySeconds?: number;
34
+ onConnect: () => Promise<void>;
35
+ onRefreshQR: () => Promise<void>;
36
+ }
37
+ /** Controlled connection presentation. Authentication and automatic connection policy stay in the app. */
38
+ export declare function ConnectionPanel({ state, labels, error, isActive, className, qrExpirySeconds, onConnect, onRefreshQR, }: ConnectionPanelProps): import("react").JSX.Element;
39
+ //# sourceMappingURL=connection-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-panel.d.ts","sourceRoot":"","sources":["../src/connection-panel.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKzD,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAoC,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,uCAAoC,CAAC;AAEtH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,YAAY,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,GAC5E;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,SAAS,CAAA;CAAE,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,SAAS,CAAC;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,uBAAuB,EAAE,SAAS,CAAC;IACnC,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,OAAO,EAAE,SAAS,CAAC;IACnB,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IACvC,YAAY,EAAE,SAAS,SAAS,EAAE,CAAC;IACnC,wBAAwB,EAAE,SAAS,SAAS,EAAE,CAAC;CAChD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,oBAAoB,CAAC;IAC5B,MAAM,EAAE,qBAAqB,CAAC;IAC9B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC;AAED,0GAA0G;AAC1G,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,MAAM,EACN,KAAK,EACL,QAAe,EACf,SAAc,EACd,eAAoB,EACpB,SAAS,EACT,WAAW,GACZ,EAAE,oBAAoB,+BAwFtB"}
@@ -0,0 +1,328 @@
1
+ 'use client';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { Spinner, Button } from '@lindaui/ui/compound';
4
+ import { AnimatePresence, motion } from 'framer-motion';
5
+ import { useState, useRef, useCallback, useEffect } from 'react';
6
+ import { RefreshCw } from 'lucide-react';
7
+ export { C as ConnectedPanel } from './connected-panel-lhwy25yk.js';
8
+
9
+ function ConnectionInstructions({ items }) {
10
+ return /*#__PURE__*/ jsx("ol", {
11
+ className: "mx-auto w-fit list-inside list-decimal space-y-2 text-left text-muted text-sm",
12
+ children: items.map((item, index)=>/*#__PURE__*/ jsx("li", {
13
+ children: item
14
+ }, index))
15
+ });
16
+ }
17
+
18
+ function DisconnectedPanel({ generating, pending, labels, error, onConnect }) {
19
+ return /*#__PURE__*/ jsxs(Fragment, {
20
+ children: [
21
+ generating && /*#__PURE__*/ jsxs("div", {
22
+ className: "space-y-3",
23
+ role: "status",
24
+ children: [
25
+ /*#__PURE__*/ jsx("div", {
26
+ className: "mx-auto flex size-48 items-center justify-center rounded-xl bg-surface-secondary",
27
+ children: /*#__PURE__*/ jsx(Spinner, {
28
+ size: "lg"
29
+ })
30
+ }),
31
+ /*#__PURE__*/ jsx("p", {
32
+ className: "text-muted text-sm",
33
+ children: labels.generating
34
+ })
35
+ ]
36
+ }),
37
+ /*#__PURE__*/ jsxs("div", {
38
+ className: "space-y-5",
39
+ children: [
40
+ /*#__PURE__*/ jsx("p", {
41
+ className: "max-w-md text-muted text-sm leading-relaxed",
42
+ children: labels.disconnectedDescription
43
+ }),
44
+ /*#__PURE__*/ jsx(ConnectionInstructions, {
45
+ items: labels.disconnectedInstructions
46
+ })
47
+ ]
48
+ }),
49
+ error && /*#__PURE__*/ jsx("p", {
50
+ className: "text-danger text-sm",
51
+ role: "alert",
52
+ children: error
53
+ }),
54
+ !generating && /*#__PURE__*/ jsx(Button, {
55
+ className: "mt-2 min-h-11 w-full whitespace-nowrap sm:w-auto",
56
+ isPending: pending,
57
+ onPress: onConnect,
58
+ size: "lg",
59
+ variant: "secondary",
60
+ children: ({ isPending })=>/*#__PURE__*/ jsxs(Fragment, {
61
+ children: [
62
+ isPending && /*#__PURE__*/ jsx(Spinner, {
63
+ color: "current",
64
+ size: "sm"
65
+ }),
66
+ labels.connect
67
+ ]
68
+ })
69
+ })
70
+ ]
71
+ });
72
+ }
73
+
74
+ function formatTime(seconds) {
75
+ return `${Math.floor(seconds / 60)}:${(seconds % 60).toString().padStart(2, "0")}`;
76
+ }
77
+ function QRPanel({ qrCode, qrFormat, labels, timeRemaining, isRefreshing, error, onRefresh }) {
78
+ return /*#__PURE__*/ jsxs(Fragment, {
79
+ children: [
80
+ /*#__PURE__*/ jsx("div", {
81
+ className: "flex justify-center",
82
+ children: /*#__PURE__*/ jsxs("div", {
83
+ className: qrFormat === "ascii" ? "relative overflow-hidden rounded-xl bg-white p-2 shadow-md ring-1 ring-black/5" : "relative flex aspect-square w-48 items-center justify-center rounded-xl bg-white p-3 shadow-md ring-1 ring-black/5",
84
+ children: [
85
+ qrCode,
86
+ timeRemaining <= 10 && /*#__PURE__*/ jsx("div", {
87
+ className: "absolute inset-0 flex items-center justify-center rounded-xl bg-black/60 backdrop-blur-sm",
88
+ children: /*#__PURE__*/ jsxs("div", {
89
+ className: "text-center",
90
+ children: [
91
+ /*#__PURE__*/ jsx("p", {
92
+ className: "font-bold text-2xl text-white",
93
+ children: formatTime(timeRemaining)
94
+ }),
95
+ /*#__PURE__*/ jsx("p", {
96
+ className: "text-white/80 text-xs",
97
+ children: labels.expiresSoon
98
+ })
99
+ ]
100
+ })
101
+ })
102
+ ]
103
+ })
104
+ }),
105
+ /*#__PURE__*/ jsxs("div", {
106
+ className: "space-y-2 text-center",
107
+ children: [
108
+ /*#__PURE__*/ jsxs("div", {
109
+ className: "flex items-center justify-center gap-2 text-muted",
110
+ role: "status",
111
+ children: [
112
+ /*#__PURE__*/ jsx(Spinner, {
113
+ color: "current",
114
+ size: "sm"
115
+ }),
116
+ /*#__PURE__*/ jsx("span", {
117
+ className: "font-medium text-sm",
118
+ children: labels.waiting
119
+ })
120
+ ]
121
+ }),
122
+ /*#__PURE__*/ jsx("p", {
123
+ className: "text-muted text-xs",
124
+ children: labels.expiresIn(formatTime(timeRemaining))
125
+ })
126
+ ]
127
+ }),
128
+ /*#__PURE__*/ jsx("div", {
129
+ className: "border-border/60 border-t pt-5",
130
+ children: /*#__PURE__*/ jsx(ConnectionInstructions, {
131
+ items: labels.instructions
132
+ })
133
+ }),
134
+ error && /*#__PURE__*/ jsx("p", {
135
+ className: "text-danger text-sm",
136
+ role: "alert",
137
+ children: error
138
+ }),
139
+ /*#__PURE__*/ jsx(Button, {
140
+ className: "min-h-11 w-full sm:w-auto",
141
+ isPending: isRefreshing,
142
+ onPress: onRefresh,
143
+ variant: "tertiary",
144
+ children: ({ isPending })=>/*#__PURE__*/ jsxs(Fragment, {
145
+ children: [
146
+ isPending ? /*#__PURE__*/ jsx(Spinner, {
147
+ color: "current",
148
+ size: "sm"
149
+ }) : /*#__PURE__*/ jsx(RefreshCw, {
150
+ className: "h-4 w-4"
151
+ }),
152
+ labels.refresh
153
+ ]
154
+ })
155
+ })
156
+ ]
157
+ });
158
+ }
159
+
160
+ /** Pause hidden challenges and never overlap refreshes or automatically retry failures. */ function useQRRefresh({ enabled, expirySeconds, error, errorLabel, onRefresh }) {
161
+ const [timeRemaining, setTimeRemaining] = useState(expirySeconds);
162
+ const [isRefreshing, setIsRefreshing] = useState(false);
163
+ const [actionError, setActionError] = useState(null);
164
+ const pending = useRef(false);
165
+ const refresh = useCallback(async ()=>{
166
+ if (pending.current) return;
167
+ pending.current = true;
168
+ setIsRefreshing(true);
169
+ setActionError(null);
170
+ try {
171
+ await onRefresh();
172
+ setTimeRemaining(expirySeconds);
173
+ } catch {
174
+ setActionError(errorLabel);
175
+ } finally{
176
+ pending.current = false;
177
+ setIsRefreshing(false);
178
+ }
179
+ }, [
180
+ onRefresh,
181
+ expirySeconds,
182
+ errorLabel
183
+ ]);
184
+ useEffect(()=>{
185
+ if (!enabled) {
186
+ setTimeRemaining(expirySeconds);
187
+ return;
188
+ }
189
+ if (isRefreshing || error || actionError) return;
190
+ const timer = setInterval(()=>setTimeRemaining((value)=>Math.max(0, value - 1)), 1000);
191
+ return ()=>clearInterval(timer);
192
+ }, [
193
+ enabled,
194
+ expirySeconds,
195
+ isRefreshing,
196
+ error,
197
+ actionError
198
+ ]);
199
+ useEffect(()=>{
200
+ if (enabled && timeRemaining === 0 && !error && !actionError && !isRefreshing) {
201
+ setTimeRemaining(expirySeconds);
202
+ void refresh();
203
+ }
204
+ }, [
205
+ enabled,
206
+ timeRemaining,
207
+ expirySeconds,
208
+ error,
209
+ actionError,
210
+ isRefreshing,
211
+ refresh
212
+ ]);
213
+ return {
214
+ timeRemaining,
215
+ isRefreshing,
216
+ actionError,
217
+ setActionError,
218
+ refresh
219
+ };
220
+ }
221
+
222
+ /** Controlled connection presentation. Authentication and automatic connection policy stay in the app. */ function ConnectionPanel({ state, labels, error, isActive = true, className = "", qrExpirySeconds = 60, onConnect, onRefreshQR }) {
223
+ const [isConnecting, setIsConnecting] = useState(false);
224
+ const pending = useRef(false);
225
+ const hasQR = state.status === "awaiting_scan";
226
+ const qr = useQRRefresh({
227
+ enabled: hasQR && isActive,
228
+ expirySeconds: Number.isFinite(qrExpirySeconds) ? Math.max(1, Math.floor(qrExpirySeconds)) : 60,
229
+ error,
230
+ errorLabel: labels.connectError,
231
+ onRefresh: onRefreshQR
232
+ });
233
+ const actionError = error || qr.actionError;
234
+ async function connect() {
235
+ if (pending.current) return;
236
+ pending.current = true;
237
+ setIsConnecting(true);
238
+ qr.setActionError(null);
239
+ try {
240
+ await onConnect();
241
+ } catch {
242
+ qr.setActionError(labels.connectError);
243
+ } finally{
244
+ pending.current = false;
245
+ setIsConnecting(false);
246
+ }
247
+ }
248
+ if (state.status === "checking") {
249
+ return /*#__PURE__*/ jsxs("div", {
250
+ className: `flex items-center justify-center gap-3 py-10 text-muted text-sm ${className}`,
251
+ role: "status",
252
+ children: [
253
+ /*#__PURE__*/ jsx(Spinner, {
254
+ size: "sm"
255
+ }),
256
+ labels.checking
257
+ ]
258
+ });
259
+ }
260
+ return /*#__PURE__*/ jsx("div", {
261
+ className: `${state.status === "connected" ? "space-y-4" : "mx-auto w-full max-w-sm space-y-6 py-6 text-center"} ${className}`,
262
+ children: /*#__PURE__*/ jsx(AnimatePresence, {
263
+ mode: "wait",
264
+ children: state.status === "connected" ? /*#__PURE__*/ jsx(motion.div, {
265
+ animate: {
266
+ opacity: 1,
267
+ y: 0
268
+ },
269
+ className: "space-y-3",
270
+ exit: {
271
+ opacity: 0,
272
+ y: -10
273
+ },
274
+ initial: {
275
+ opacity: 0,
276
+ y: 10
277
+ },
278
+ children: state.content
279
+ }, "connected") : state.status === "awaiting_scan" ? /*#__PURE__*/ jsx(motion.div, {
280
+ animate: {
281
+ opacity: 1,
282
+ y: 0
283
+ },
284
+ className: "space-y-4",
285
+ exit: {
286
+ opacity: 0,
287
+ y: -10
288
+ },
289
+ initial: {
290
+ opacity: 0,
291
+ y: 10
292
+ },
293
+ children: /*#__PURE__*/ jsx(QRPanel, {
294
+ error: actionError,
295
+ isRefreshing: qr.isRefreshing,
296
+ labels: labels,
297
+ onRefresh: qr.refresh,
298
+ qrCode: state.qrCode,
299
+ qrFormat: state.qrFormat,
300
+ timeRemaining: qr.timeRemaining
301
+ })
302
+ }, "qr") : /*#__PURE__*/ jsx(motion.div, {
303
+ animate: {
304
+ opacity: 1,
305
+ y: 0
306
+ },
307
+ className: "space-y-4",
308
+ exit: {
309
+ opacity: 0,
310
+ y: -10
311
+ },
312
+ initial: {
313
+ opacity: 0,
314
+ y: 10
315
+ },
316
+ children: /*#__PURE__*/ jsx(DisconnectedPanel, {
317
+ error: actionError,
318
+ generating: state.status === "generating",
319
+ labels: labels,
320
+ onConnect: connect,
321
+ pending: isConnecting
322
+ })
323
+ }, "initial")
324
+ })
325
+ });
326
+ }
327
+
328
+ export { ConnectionPanel };