sa2kit 3.4.0 → 3.7.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 (157) hide show
  1. package/dist/business/index.d.mts +2 -7
  2. package/dist/business/index.d.ts +2 -7
  3. package/dist/business/index.js +1761 -8045
  4. package/dist/business/index.js.map +1 -1
  5. package/dist/business/index.mjs +1169 -7452
  6. package/dist/business/index.mjs.map +1 -1
  7. package/dist/business/portfolio/index.d.mts +1 -2
  8. package/dist/business/portfolio/index.d.ts +1 -2
  9. package/dist/{chunk-KVYHCGRY.js → chunk-7Z3XR2Y4.js} +552 -263
  10. package/dist/chunk-7Z3XR2Y4.js.map +1 -0
  11. package/dist/chunk-XPY45Y75.js +1143 -0
  12. package/dist/chunk-XPY45Y75.js.map +1 -0
  13. package/dist/{chunk-YIRPPMCN.mjs → chunk-XSTMLLJV.mjs} +474 -198
  14. package/dist/chunk-XSTMLLJV.mjs.map +1 -0
  15. package/dist/chunk-ZJLS5JU5.mjs +1090 -0
  16. package/dist/chunk-ZJLS5JU5.mjs.map +1 -0
  17. package/dist/common/aiApi/client/index.d.mts +71 -0
  18. package/dist/common/aiApi/client/index.d.ts +71 -0
  19. package/dist/common/aiApi/client/index.js +165 -0
  20. package/dist/common/aiApi/client/index.js.map +1 -0
  21. package/dist/common/aiApi/client/index.mjs +151 -0
  22. package/dist/common/aiApi/client/index.mjs.map +1 -0
  23. package/dist/common/aiApi/index.d.mts +184 -0
  24. package/dist/common/aiApi/index.d.ts +184 -0
  25. package/dist/common/aiApi/index.js +217 -0
  26. package/dist/common/aiApi/index.mjs +4 -0
  27. package/dist/common/aiApi/server/index.d.mts +3 -0
  28. package/dist/common/aiApi/server/index.d.ts +3 -0
  29. package/dist/common/aiApi/server/index.js +217 -0
  30. package/dist/common/aiApi/server/index.mjs +4 -0
  31. package/dist/common/components/index.js +176 -177
  32. package/dist/common/components/index.mjs +1 -2
  33. package/dist/common/index.js +2 -3
  34. package/dist/common/index.mjs +1 -2
  35. package/dist/{index-BSmd4ikf.d.ts → index-B4wDXFL0.d.mts} +39 -2
  36. package/dist/{index-r2-zE3iC.d.mts → index-B4wDXFL0.d.ts} +39 -2
  37. package/dist/{index-DLLPTprx.d.mts → index-B9vXYzok.d.mts} +48 -13
  38. package/dist/{index-VFDbZxVM.d.ts → index-BZ0MhRau.d.ts} +48 -13
  39. package/dist/index.d.mts +703 -181
  40. package/dist/index.d.ts +703 -181
  41. package/dist/index.js +2921 -7257
  42. package/dist/index.js.map +1 -1
  43. package/dist/index.mjs +2161 -6538
  44. package/dist/index.mjs.map +1 -1
  45. package/dist/types-CiqMQ-uu.d.mts +166 -0
  46. package/dist/types-CiqMQ-uu.d.ts +166 -0
  47. package/package.json +15 -60
  48. package/dist/CollisionBalls-DgKtscU2.d.mts +0 -41
  49. package/dist/CollisionBalls-DgKtscU2.d.ts +0 -41
  50. package/dist/business/calendar/index.d.mts +0 -6
  51. package/dist/business/calendar/index.d.ts +0 -6
  52. package/dist/business/calendar/index.js +0 -7433
  53. package/dist/business/calendar/index.js.map +0 -1
  54. package/dist/business/calendar/index.mjs +0 -7257
  55. package/dist/business/calendar/index.mjs.map +0 -1
  56. package/dist/business/calendar/routes/index.d.mts +0 -191
  57. package/dist/business/calendar/routes/index.d.ts +0 -191
  58. package/dist/business/calendar/routes/index.js +0 -844
  59. package/dist/business/calendar/routes/index.js.map +0 -1
  60. package/dist/business/calendar/routes/index.mjs +0 -826
  61. package/dist/business/calendar/routes/index.mjs.map +0 -1
  62. package/dist/chunk-3R6JHA6D.js +0 -120
  63. package/dist/chunk-3R6JHA6D.js.map +0 -1
  64. package/dist/chunk-4PJM4752.js +0 -4
  65. package/dist/chunk-4PJM4752.js.map +0 -1
  66. package/dist/chunk-7PMT4L4I.js +0 -324
  67. package/dist/chunk-7PMT4L4I.js.map +0 -1
  68. package/dist/chunk-FY2X3LYR.mjs +0 -3
  69. package/dist/chunk-FY2X3LYR.mjs.map +0 -1
  70. package/dist/chunk-GS4SAW25.mjs +0 -116
  71. package/dist/chunk-GS4SAW25.mjs.map +0 -1
  72. package/dist/chunk-HL4H2HF6.js +0 -279
  73. package/dist/chunk-HL4H2HF6.js.map +0 -1
  74. package/dist/chunk-IJIQUMAK.mjs +0 -272
  75. package/dist/chunk-IJIQUMAK.mjs.map +0 -1
  76. package/dist/chunk-KVYHCGRY.js.map +0 -1
  77. package/dist/chunk-MMDSZIXD.mjs +0 -286
  78. package/dist/chunk-MMDSZIXD.mjs.map +0 -1
  79. package/dist/chunk-N2O3OX5Y.mjs +0 -243
  80. package/dist/chunk-N2O3OX5Y.mjs.map +0 -1
  81. package/dist/chunk-RRQ2X26Z.js +0 -106
  82. package/dist/chunk-RRQ2X26Z.js.map +0 -1
  83. package/dist/chunk-RVNQI6BI.js +0 -249
  84. package/dist/chunk-RVNQI6BI.js.map +0 -1
  85. package/dist/chunk-UJUWDF7M.mjs +0 -336
  86. package/dist/chunk-UJUWDF7M.mjs.map +0 -1
  87. package/dist/chunk-VCKXK6V5.js +0 -345
  88. package/dist/chunk-VCKXK6V5.js.map +0 -1
  89. package/dist/chunk-VIEXDTNF.mjs +0 -100
  90. package/dist/chunk-VIEXDTNF.mjs.map +0 -1
  91. package/dist/chunk-YIRPPMCN.mjs.map +0 -1
  92. package/dist/common/ai/llm/core/index.d.mts +0 -70
  93. package/dist/common/ai/llm/core/index.d.ts +0 -70
  94. package/dist/common/ai/llm/core/index.js +0 -54
  95. package/dist/common/ai/llm/core/index.mjs +0 -5
  96. package/dist/common/ai/llm/electron/index.d.mts +0 -6
  97. package/dist/common/ai/llm/electron/index.d.ts +0 -6
  98. package/dist/common/ai/llm/electron/index.js +0 -67
  99. package/dist/common/ai/llm/electron/index.mjs +0 -10
  100. package/dist/common/ai/llm/index.d.mts +0 -3
  101. package/dist/common/ai/llm/index.d.ts +0 -3
  102. package/dist/common/ai/llm/index.js +0 -54
  103. package/dist/common/ai/llm/index.js.map +0 -1
  104. package/dist/common/ai/llm/index.mjs +0 -5
  105. package/dist/common/ai/llm/index.mjs.map +0 -1
  106. package/dist/common/ai/llm/miniapp/index.d.mts +0 -6
  107. package/dist/common/ai/llm/miniapp/index.d.ts +0 -6
  108. package/dist/common/ai/llm/miniapp/index.js +0 -59
  109. package/dist/common/ai/llm/miniapp/index.js.map +0 -1
  110. package/dist/common/ai/llm/miniapp/index.mjs +0 -6
  111. package/dist/common/ai/llm/miniapp/index.mjs.map +0 -1
  112. package/dist/common/ai/llm/rn/index.d.mts +0 -6
  113. package/dist/common/ai/llm/rn/index.d.ts +0 -6
  114. package/dist/common/ai/llm/rn/index.js +0 -59
  115. package/dist/common/ai/llm/rn/index.js.map +0 -1
  116. package/dist/common/ai/llm/rn/index.mjs +0 -6
  117. package/dist/common/ai/llm/rn/index.mjs.map +0 -1
  118. package/dist/common/ai/llm/ui/electron/index.d.mts +0 -5
  119. package/dist/common/ai/llm/ui/electron/index.d.ts +0 -5
  120. package/dist/common/ai/llm/ui/electron/index.js +0 -22
  121. package/dist/common/ai/llm/ui/electron/index.js.map +0 -1
  122. package/dist/common/ai/llm/ui/electron/index.mjs +0 -9
  123. package/dist/common/ai/llm/ui/electron/index.mjs.map +0 -1
  124. package/dist/common/ai/llm/ui/miniapp/index.d.mts +0 -9
  125. package/dist/common/ai/llm/ui/miniapp/index.d.ts +0 -9
  126. package/dist/common/ai/llm/ui/miniapp/index.js +0 -14
  127. package/dist/common/ai/llm/ui/miniapp/index.js.map +0 -1
  128. package/dist/common/ai/llm/ui/miniapp/index.mjs +0 -5
  129. package/dist/common/ai/llm/ui/miniapp/index.mjs.map +0 -1
  130. package/dist/common/ai/llm/ui/rn/index.d.mts +0 -9
  131. package/dist/common/ai/llm/ui/rn/index.d.ts +0 -9
  132. package/dist/common/ai/llm/ui/rn/index.js +0 -14
  133. package/dist/common/ai/llm/ui/rn/index.js.map +0 -1
  134. package/dist/common/ai/llm/ui/rn/index.mjs +0 -5
  135. package/dist/common/ai/llm/ui/rn/index.mjs.map +0 -1
  136. package/dist/common/ai/llm/ui/web/index.d.mts +0 -15
  137. package/dist/common/ai/llm/ui/web/index.d.ts +0 -15
  138. package/dist/common/ai/llm/ui/web/index.js +0 -21
  139. package/dist/common/ai/llm/ui/web/index.js.map +0 -1
  140. package/dist/common/ai/llm/ui/web/index.mjs +0 -8
  141. package/dist/common/ai/llm/ui/web/index.mjs.map +0 -1
  142. package/dist/common/ai/llm/web/index.d.mts +0 -6
  143. package/dist/common/ai/llm/web/index.d.ts +0 -6
  144. package/dist/common/ai/llm/web/index.js +0 -66
  145. package/dist/common/ai/llm/web/index.js.map +0 -1
  146. package/dist/common/ai/llm/web/index.mjs +0 -9
  147. package/dist/common/ai/llm/web/index.mjs.map +0 -1
  148. package/dist/index-BMgdH5dL.d.mts +0 -1716
  149. package/dist/index-IXMAeTtN.d.ts +0 -1716
  150. package/dist/types-B2rs_jq1.d.mts +0 -38
  151. package/dist/types-DgACCUpT.d.ts +0 -122
  152. package/dist/types-DwS2Eg0q.d.ts +0 -38
  153. package/dist/types-LU_BGSzk.d.mts +0 -122
  154. /package/dist/common/{ai/llm/core → aiApi}/index.js.map +0 -0
  155. /package/dist/common/{ai/llm/core → aiApi}/index.mjs.map +0 -0
  156. /package/dist/common/{ai/llm/electron → aiApi/server}/index.js.map +0 -0
  157. /package/dist/common/{ai/llm/electron → aiApi/server}/index.mjs.map +0 -0
@@ -1,286 +0,0 @@
1
- import { cn } from './chunk-FUA6ZGMI.mjs';
2
- import * as React4 from 'react';
3
- import { cva } from 'class-variance-authority';
4
- import { X } from 'lucide-react';
5
- import { createPortal } from 'react-dom';
6
-
7
- var buttonVariants = cva(
8
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
9
- {
10
- variants: {
11
- variant: {
12
- default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
13
- destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
14
- outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
15
- secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
16
- ghost: "hover:bg-accent hover:text-accent-foreground",
17
- link: "text-primary underline-offset-4 hover:underline"
18
- },
19
- size: {
20
- default: "h-9 px-4 py-2",
21
- sm: "h-8 rounded-md px-3 text-xs",
22
- lg: "h-10 rounded-md px-8",
23
- icon: "h-9 w-9"
24
- }
25
- },
26
- defaultVariants: {
27
- variant: "default",
28
- size: "default"
29
- }
30
- }
31
- );
32
- var Button = React4.forwardRef(
33
- ({ className, variant = "default", size = "default", asChild = false, children, ...props }, ref) => {
34
- if (asChild && React4.isValidElement(children)) {
35
- const childProps = children.props;
36
- return React4.cloneElement(children, {
37
- ...props,
38
- className: cn(buttonVariants({ variant, size, className }), childProps.className)
39
- });
40
- }
41
- return /* @__PURE__ */ React4.createElement(
42
- "button",
43
- {
44
- className: cn(buttonVariants({ variant, size, className })),
45
- ref,
46
- ...props
47
- },
48
- children
49
- );
50
- }
51
- );
52
- Button.displayName = "Button";
53
- var Input = React4.forwardRef(
54
- ({ className, type, ...props }, ref) => {
55
- return /* @__PURE__ */ React4.createElement(
56
- "input",
57
- {
58
- type,
59
- className: cn(
60
- "flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
61
- className
62
- ),
63
- ref,
64
- ...props
65
- }
66
- );
67
- }
68
- );
69
- Input.displayName = "Input";
70
- function useControllableState({
71
- value,
72
- defaultValue,
73
- onChange
74
- }) {
75
- const [internal, setInternal] = React4.useState(defaultValue);
76
- const isControlled = value !== void 0;
77
- const state = isControlled ? value : internal;
78
- const setState = React4.useCallback(
79
- (next) => {
80
- if (!isControlled) setInternal(next);
81
- onChange?.(next);
82
- },
83
- [isControlled, onChange]
84
- );
85
- return [state, setState];
86
- }
87
- function Portal({
88
- children,
89
- container
90
- }) {
91
- const [mounted, setMounted] = React4.useState(false);
92
- React4.useEffect(() => {
93
- setMounted(true);
94
- }, []);
95
- if (!mounted) return null;
96
- return createPortal(children, container ?? document.body);
97
- }
98
- function useOnClickOutside(refs, handler, enabled) {
99
- React4.useEffect(() => {
100
- if (!enabled) return;
101
- const listener = (event) => {
102
- const target = event.target;
103
- const clickedInside = refs.some((ref) => {
104
- const el = ref.current;
105
- return el && el.contains(target);
106
- });
107
- if (!clickedInside) {
108
- handler(event);
109
- }
110
- };
111
- document.addEventListener("mousedown", listener);
112
- document.addEventListener("touchstart", listener);
113
- return () => {
114
- document.removeEventListener("mousedown", listener);
115
- document.removeEventListener("touchstart", listener);
116
- };
117
- }, [refs, handler, enabled]);
118
- }
119
- function mergeRefs(...refs) {
120
- return (value) => {
121
- refs.forEach((ref) => {
122
- if (!ref) return;
123
- if (typeof ref === "function") {
124
- ref(value);
125
- } else {
126
- ref.current = value;
127
- }
128
- });
129
- };
130
- }
131
-
132
- // src/common/components/Dialog.tsx
133
- var DialogContext = React4.createContext(null);
134
- var Dialog = ({ open, defaultOpen = false, onOpenChange, children }) => {
135
- const [isOpen, setIsOpen] = useControllableState({
136
- value: open,
137
- defaultValue: defaultOpen,
138
- onChange: onOpenChange
139
- });
140
- const triggerRef = React4.useRef(null);
141
- const contentRef = React4.useRef(null);
142
- return /* @__PURE__ */ React4.createElement(DialogContext.Provider, { value: { open: isOpen, setOpen: setIsOpen, triggerRef, contentRef } }, children);
143
- };
144
- var DialogTrigger = React4.forwardRef(
145
- ({ children, onClick, ...props }, ref) => {
146
- const ctx = React4.useContext(DialogContext);
147
- if (!ctx) return null;
148
- const mergedRef = mergeRefs(ctx.triggerRef, ref);
149
- const handleClick = (e) => {
150
- ctx.setOpen(true);
151
- onClick?.(e);
152
- };
153
- return /* @__PURE__ */ React4.createElement("button", { ref: mergedRef, type: "button", onClick: handleClick, ...props }, children);
154
- }
155
- );
156
- DialogTrigger.displayName = "DialogTrigger";
157
- var DialogPortal = ({ children }) => {
158
- const ctx = React4.useContext(DialogContext);
159
- if (!ctx?.open) return null;
160
- return /* @__PURE__ */ React4.createElement(Portal, null, children);
161
- };
162
- var DialogClose = React4.forwardRef(({ onClick, ...props }, ref) => {
163
- const ctx = React4.useContext(DialogContext);
164
- return /* @__PURE__ */ React4.createElement(
165
- "button",
166
- {
167
- ref,
168
- type: "button",
169
- onClick: (e) => {
170
- ctx?.setOpen(false);
171
- onClick?.(e);
172
- },
173
- ...props
174
- }
175
- );
176
- });
177
- DialogClose.displayName = "DialogClose";
178
- var DialogOverlay = React4.forwardRef(({ className, ...props }, ref) => {
179
- const ctx = React4.useContext(DialogContext);
180
- if (!ctx?.open) return null;
181
- return /* @__PURE__ */ React4.createElement(
182
- "div",
183
- {
184
- ref,
185
- className: cn("fixed inset-0 z-[9999] bg-black/80", className),
186
- ...props
187
- }
188
- );
189
- });
190
- DialogOverlay.displayName = "DialogOverlay";
191
- var DialogContent = React4.forwardRef(
192
- ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, overlayClassName, ...props }, ref) => {
193
- const ctx = React4.useContext(DialogContext);
194
- const open = !!ctx?.open;
195
- useOnClickOutside(
196
- [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],
197
- (evt) => {
198
- onPointerDownOutside?.(evt);
199
- if (!evt.defaultPrevented) {
200
- ctx?.setOpen(false);
201
- }
202
- },
203
- open
204
- );
205
- React4.useEffect(() => {
206
- if (!open) return;
207
- const onKey = (e) => {
208
- if (e.key !== "Escape") return;
209
- onEscapeKeyDown?.(e);
210
- if (!e.defaultPrevented) {
211
- ctx?.setOpen(false);
212
- }
213
- };
214
- document.addEventListener("keydown", onKey);
215
- return () => document.removeEventListener("keydown", onKey);
216
- }, [ctx, onEscapeKeyDown, open]);
217
- if (!ctx || !open) return null;
218
- return /* @__PURE__ */ React4.createElement(DialogPortal, null, /* @__PURE__ */ React4.createElement(DialogOverlay, { className: overlayClassName }), /* @__PURE__ */ React4.createElement(
219
- "div",
220
- {
221
- ref: mergeRefs(ctx.contentRef, ref),
222
- className: cn(
223
- "fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg",
224
- className
225
- ),
226
- ...props
227
- },
228
- children,
229
- showCloseButton ? /* @__PURE__ */ React4.createElement(DialogClose, { className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100" }, /* @__PURE__ */ React4.createElement(X, { className: "h-4 w-4" }), /* @__PURE__ */ React4.createElement("span", { className: "sr-only" }, "Close")) : null
230
- ));
231
- }
232
- );
233
- DialogContent.displayName = "DialogContent";
234
- var DialogHeader = ({
235
- className,
236
- ...props
237
- }) => /* @__PURE__ */ React4.createElement(
238
- "div",
239
- {
240
- className: cn(
241
- "flex flex-col space-y-1.5 text-center sm:text-left",
242
- className
243
- ),
244
- ...props
245
- }
246
- );
247
- DialogHeader.displayName = "DialogHeader";
248
- var DialogFooter = ({
249
- className,
250
- ...props
251
- }) => /* @__PURE__ */ React4.createElement(
252
- "div",
253
- {
254
- className: cn(
255
- "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
256
- className
257
- ),
258
- ...props
259
- }
260
- );
261
- DialogFooter.displayName = "DialogFooter";
262
- var DialogTitle = React4.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React4.createElement(
263
- "h2",
264
- {
265
- ref,
266
- className: cn(
267
- "text-lg font-semibold leading-none tracking-tight",
268
- className
269
- ),
270
- ...props
271
- }
272
- ));
273
- DialogTitle.displayName = "DialogTitle";
274
- var DialogDescription = React4.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React4.createElement(
275
- "p",
276
- {
277
- ref,
278
- className: cn("text-sm text-muted-foreground", className),
279
- ...props
280
- }
281
- ));
282
- DialogDescription.displayName = "DialogDescription";
283
-
284
- export { Button, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Input, Portal, buttonVariants, mergeRefs, useControllableState, useOnClickOutside };
285
- //# sourceMappingURL=chunk-MMDSZIXD.mjs.map
286
- //# sourceMappingURL=chunk-MMDSZIXD.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/components/Button.tsx","../src/common/components/Input.tsx","../src/common/components/internal/ui-core.tsx","../src/common/components/Dialog.tsx"],"names":["React","React2","React3"],"mappings":"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","file":"chunk-MMDSZIXD.mjs","sourcesContent":["import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, children, ...props }, ref) => {\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { className?: string }\n return React.cloneElement(children, {\n ...(props as object),\n className: cn(buttonVariants({ variant, size, className }), childProps.className),\n })\n }\n\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}) {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const state = isControlled ? (value as T) : internal;\n\n const setState = React.useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [state, setState] as const;\n}\n\nexport function Portal({\n children,\n container,\n}: {\n children: React.ReactNode;\n container?: Element | null;\n}) {\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n return createPortal(children, container ?? document.body);\n}\n\nexport function useOnClickOutside(\n refs: Array<React.RefObject<HTMLElement | null>>,\n handler: (event: MouseEvent | TouchEvent) => void,\n enabled: boolean\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n const clickedInside = refs.some((ref) => {\n const el = ref.current;\n return el && el.contains(target);\n });\n if (!clickedInside) {\n handler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [refs, handler, enabled]);\n}\n\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | undefined>\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(value);\n } else {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\ninterface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, defaultOpen = false, onOpenChange, children }: DialogProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DialogContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\ninterface TriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, TriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(true)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nDialogTrigger.displayName = \"DialogTrigger\"\n\nconst DialogPortal = ({ children }: { children: React.ReactNode }) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return <Portal>{children}</Portal>\n}\n\nconst DialogClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n ctx?.setOpen(false)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nDialogClose.displayName = \"DialogClose\"\n\nconst DialogOverlay = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return (\n <div\n ref={ref}\n className={cn(\"fixed inset-0 z-[9999] bg-black/80\", className)}\n {...(props as any)}\n />\n )\n})\nDialogOverlay.displayName = \"DialogOverlay\"\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n onPointerDownOutside?: (event: PointerEvent) => void\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n showCloseButton?: boolean\n overlayClassName?: string\n}\n\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, overlayClassName, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n const open = !!ctx?.open\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n (evt) => {\n onPointerDownOutside?.(evt as PointerEvent)\n if (!(evt as Event).defaultPrevented) {\n ctx?.setOpen(false)\n }\n },\n open\n )\n\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return\n onEscapeKeyDown?.(e)\n if (!e.defaultPrevented) {\n ctx?.setOpen(false)\n }\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [ctx, onEscapeKeyDown, open])\n\n if (!ctx || !open) return null\n\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName} />\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n >\n {children}\n {showCloseButton ? (\n <DialogClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n ) : null}\n </div>\n </DialogPortal>\n )\n }\n)\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...(props as any)}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n"]}
@@ -1,243 +0,0 @@
1
- import { useAiChat } from './chunk-GS4SAW25.mjs';
2
- import { __require } from './chunk-MAI35PU6.mjs';
3
- import React, { useState, useMemo, useEffect } from 'react';
4
-
5
- var ReactNative = __require("react-native");
6
- var {
7
- Modal,
8
- View,
9
- Text,
10
- TextInput,
11
- Pressable,
12
- ScrollView,
13
- SafeAreaView,
14
- KeyboardAvoidingView,
15
- Platform,
16
- StyleSheet
17
- } = ReactNative;
18
- var styles = StyleSheet.create({
19
- overlay: {
20
- flex: 1,
21
- backgroundColor: "rgba(15, 23, 42, 0.45)",
22
- justifyContent: "center",
23
- padding: 16
24
- },
25
- container: {
26
- backgroundColor: "#ffffff",
27
- borderRadius: 16,
28
- maxHeight: "90%",
29
- overflow: "hidden"
30
- },
31
- header: {
32
- paddingHorizontal: 16,
33
- paddingVertical: 12,
34
- borderBottomWidth: 1,
35
- borderBottomColor: "#e2e8f0",
36
- flexDirection: "row",
37
- justifyContent: "space-between",
38
- alignItems: "center"
39
- },
40
- title: {
41
- fontSize: 16,
42
- fontWeight: "600",
43
- color: "#0f172a"
44
- },
45
- closeText: {
46
- fontSize: 12,
47
- color: "#64748b"
48
- },
49
- list: {
50
- paddingHorizontal: 16,
51
- paddingVertical: 12
52
- },
53
- placeholder: {
54
- alignItems: "center",
55
- paddingVertical: 24
56
- },
57
- placeholderText: {
58
- fontSize: 12,
59
- color: "#94a3b8"
60
- },
61
- bubbleUser: {
62
- alignSelf: "flex-end",
63
- backgroundColor: "#0f172a",
64
- borderRadius: 16,
65
- paddingHorizontal: 12,
66
- paddingVertical: 8,
67
- marginBottom: 8
68
- },
69
- bubbleAssistant: {
70
- alignSelf: "flex-start",
71
- backgroundColor: "#ffffff",
72
- borderWidth: 1,
73
- borderColor: "#e2e8f0",
74
- borderRadius: 16,
75
- paddingHorizontal: 12,
76
- paddingVertical: 8,
77
- marginBottom: 8
78
- },
79
- bubbleTextUser: {
80
- color: "#ffffff",
81
- fontSize: 12
82
- },
83
- bubbleText: {
84
- color: "#1f2937",
85
- fontSize: 12
86
- },
87
- loadingText: {
88
- color: "#64748b",
89
- fontSize: 12
90
- },
91
- inputContainer: {
92
- padding: 12,
93
- borderTopWidth: 1,
94
- borderTopColor: "#e2e8f0"
95
- },
96
- textInput: {
97
- minHeight: 96,
98
- borderWidth: 1,
99
- borderColor: "#e2e8f0",
100
- borderRadius: 12,
101
- padding: 10,
102
- textAlignVertical: "top",
103
- fontSize: 12,
104
- color: "#0f172a"
105
- },
106
- helperRow: {
107
- flexDirection: "row",
108
- alignItems: "center",
109
- justifyContent: "space-between",
110
- marginTop: 8
111
- },
112
- helperText: {
113
- flex: 1,
114
- fontSize: 10,
115
- color: "#94a3b8",
116
- paddingRight: 8
117
- },
118
- sendButton: {
119
- backgroundColor: "#0f172a",
120
- paddingHorizontal: 14,
121
- paddingVertical: 8,
122
- borderRadius: 12
123
- },
124
- sendButtonDisabled: {
125
- backgroundColor: "#94a3b8"
126
- },
127
- sendButtonText: {
128
- color: "#ffffff",
129
- fontSize: 12,
130
- fontWeight: "600"
131
- },
132
- error: {
133
- marginTop: 8,
134
- borderWidth: 1,
135
- borderColor: "#fecdd3",
136
- backgroundColor: "#fff1f2",
137
- padding: 8,
138
- borderRadius: 8
139
- },
140
- errorText: {
141
- color: "#e11d48",
142
- fontSize: 10
143
- }
144
- });
145
- var AiChatDialog = ({
146
- open,
147
- onOpenChange,
148
- client,
149
- title = "AI \u5BF9\u8BDD",
150
- placeholder = "\u8F93\u5165\u4F60\u60F3\u54A8\u8BE2\u7684\u95EE\u9898...",
151
- systemPrompt,
152
- template,
153
- templateVariables,
154
- initialMessages,
155
- requestOptions,
156
- onResponse,
157
- onError
158
- }) => {
159
- const { messages, sendMessage, isLoading, error } = useAiChat({
160
- client,
161
- systemPrompt,
162
- template,
163
- initialMessages
164
- });
165
- const [input, setInput] = useState("");
166
- const helperText = useMemo(() => {
167
- return template ? "\u6A21\u677F\u5DF2\u542F\u7528\uFF0C\u652F\u6301 {{input}} \u53D8\u91CF\u3002" : "\u76F4\u63A5\u8F93\u5165\u5373\u53EF\u5F00\u59CB\u5BF9\u8BDD\u3002";
168
- }, [template]);
169
- useEffect(() => {
170
- if (!open) {
171
- setInput("");
172
- }
173
- }, [open]);
174
- const handleSend = async () => {
175
- const content = input.trim();
176
- if (!content || isLoading) return;
177
- setInput("");
178
- try {
179
- const response = await sendMessage(content, {
180
- ...requestOptions,
181
- template,
182
- variables: templateVariables
183
- });
184
- onResponse?.(response);
185
- } catch (err) {
186
- const nextError = err instanceof Error ? err : new Error(String(err));
187
- onError?.(nextError);
188
- }
189
- };
190
- return /* @__PURE__ */ React.createElement(
191
- Modal,
192
- {
193
- visible: open,
194
- transparent: true,
195
- animationType: "fade",
196
- onRequestClose: () => onOpenChange?.(false)
197
- },
198
- /* @__PURE__ */ React.createElement(SafeAreaView, { style: styles.overlay }, /* @__PURE__ */ React.createElement(
199
- KeyboardAvoidingView,
200
- {
201
- behavior: Platform.OS === "ios" ? "padding" : void 0,
202
- style: styles.container
203
- },
204
- /* @__PURE__ */ React.createElement(View, { style: styles.header }, /* @__PURE__ */ React.createElement(Text, { style: styles.title }, title), /* @__PURE__ */ React.createElement(Pressable, { onPress: () => onOpenChange?.(false) }, /* @__PURE__ */ React.createElement(Text, { style: styles.closeText }, "\u5173\u95ED"))),
205
- /* @__PURE__ */ React.createElement(ScrollView, { contentContainerStyle: styles.list }, messages.length === 0 && /* @__PURE__ */ React.createElement(View, { style: styles.placeholder }, /* @__PURE__ */ React.createElement(Text, { style: styles.placeholderText }, "\u6682\u65E0\u5BF9\u8BDD\u5185\u5BB9"), /* @__PURE__ */ React.createElement(Text, { style: styles.placeholderText }, "\u8F93\u5165\u6D88\u606F\u5F00\u59CB\u4F53\u9A8C AI \u5BF9\u8BDD\u3002")), messages.map((message, index) => {
206
- const isUser = message.role === "user";
207
- return /* @__PURE__ */ React.createElement(
208
- View,
209
- {
210
- key: `${message.role}-${index}`,
211
- style: isUser ? styles.bubbleUser : styles.bubbleAssistant
212
- },
213
- /* @__PURE__ */ React.createElement(Text, { style: isUser ? styles.bubbleTextUser : styles.bubbleText }, message.content)
214
- );
215
- }), isLoading && /* @__PURE__ */ React.createElement(View, { style: styles.bubbleAssistant }, /* @__PURE__ */ React.createElement(Text, { style: styles.loadingText }, "AI \u6B63\u5728\u601D\u8003..."))),
216
- /* @__PURE__ */ React.createElement(View, { style: styles.inputContainer }, /* @__PURE__ */ React.createElement(
217
- TextInput,
218
- {
219
- value: input,
220
- onChangeText: setInput,
221
- placeholder,
222
- multiline: true,
223
- style: styles.textInput
224
- }
225
- ), /* @__PURE__ */ React.createElement(View, { style: styles.helperRow }, /* @__PURE__ */ React.createElement(Text, { style: styles.helperText }, helperText), /* @__PURE__ */ React.createElement(
226
- Pressable,
227
- {
228
- onPress: handleSend,
229
- disabled: !input.trim() || isLoading,
230
- style: [
231
- styles.sendButton,
232
- (!input.trim() || isLoading) && styles.sendButtonDisabled
233
- ]
234
- },
235
- /* @__PURE__ */ React.createElement(Text, { style: styles.sendButtonText }, isLoading ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001")
236
- )), error && /* @__PURE__ */ React.createElement(View, { style: styles.error }, /* @__PURE__ */ React.createElement(Text, { style: styles.errorText }, error.message || "\u5BF9\u8BDD\u51FA\u9519\uFF0C\u8BF7\u91CD\u8BD5\u3002")))
237
- ))
238
- );
239
- };
240
-
241
- export { AiChatDialog };
242
- //# sourceMappingURL=chunk-N2O3OX5Y.mjs.map
243
- //# sourceMappingURL=chunk-N2O3OX5Y.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/common/ai/llm/ui/rn/components/AiChatDialog.tsx"],"names":[],"mappings":"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","file":"chunk-N2O3OX5Y.mjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useAiChat } from '../../../hooks/useAiChat';\nimport type { AiChatDialogProps } from '../../types';\n\n// @ts-ignore - react-native will be provided at runtime in RN environment\nconst ReactNative = require('react-native') as any;\nconst {\n Modal,\n View,\n Text,\n TextInput,\n Pressable,\n ScrollView,\n SafeAreaView,\n KeyboardAvoidingView,\n Platform,\n StyleSheet,\n} = ReactNative;\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(15, 23, 42, 0.45)',\n justifyContent: 'center',\n padding: 16,\n },\n container: {\n backgroundColor: '#ffffff',\n borderRadius: 16,\n maxHeight: '90%',\n overflow: 'hidden',\n },\n header: {\n paddingHorizontal: 16,\n paddingVertical: 12,\n borderBottomWidth: 1,\n borderBottomColor: '#e2e8f0',\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n },\n title: {\n fontSize: 16,\n fontWeight: '600',\n color: '#0f172a',\n },\n closeText: {\n fontSize: 12,\n color: '#64748b',\n },\n list: {\n paddingHorizontal: 16,\n paddingVertical: 12,\n },\n placeholder: {\n alignItems: 'center',\n paddingVertical: 24,\n },\n placeholderText: {\n fontSize: 12,\n color: '#94a3b8',\n },\n bubbleUser: {\n alignSelf: 'flex-end',\n backgroundColor: '#0f172a',\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 8,\n marginBottom: 8,\n },\n bubbleAssistant: {\n alignSelf: 'flex-start',\n backgroundColor: '#ffffff',\n borderWidth: 1,\n borderColor: '#e2e8f0',\n borderRadius: 16,\n paddingHorizontal: 12,\n paddingVertical: 8,\n marginBottom: 8,\n },\n bubbleTextUser: {\n color: '#ffffff',\n fontSize: 12,\n },\n bubbleText: {\n color: '#1f2937',\n fontSize: 12,\n },\n loadingText: {\n color: '#64748b',\n fontSize: 12,\n },\n inputContainer: {\n padding: 12,\n borderTopWidth: 1,\n borderTopColor: '#e2e8f0',\n },\n textInput: {\n minHeight: 96,\n borderWidth: 1,\n borderColor: '#e2e8f0',\n borderRadius: 12,\n padding: 10,\n textAlignVertical: 'top',\n fontSize: 12,\n color: '#0f172a',\n },\n helperRow: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 8,\n },\n helperText: {\n flex: 1,\n fontSize: 10,\n color: '#94a3b8',\n paddingRight: 8,\n },\n sendButton: {\n backgroundColor: '#0f172a',\n paddingHorizontal: 14,\n paddingVertical: 8,\n borderRadius: 12,\n },\n sendButtonDisabled: {\n backgroundColor: '#94a3b8',\n },\n sendButtonText: {\n color: '#ffffff',\n fontSize: 12,\n fontWeight: '600',\n },\n error: {\n marginTop: 8,\n borderWidth: 1,\n borderColor: '#fecdd3',\n backgroundColor: '#fff1f2',\n padding: 8,\n borderRadius: 8,\n },\n errorText: {\n color: '#e11d48',\n fontSize: 10,\n },\n});\n\nexport const AiChatDialog: React.FC<AiChatDialogProps> = ({\n open,\n onOpenChange,\n client,\n title = 'AI 对话',\n placeholder = '输入你想咨询的问题...',\n systemPrompt,\n template,\n templateVariables,\n initialMessages,\n requestOptions,\n onResponse,\n onError,\n}) => {\n const { messages, sendMessage, isLoading, error } = useAiChat({\n client,\n systemPrompt,\n template,\n initialMessages,\n });\n const [input, setInput] = useState('');\n\n const helperText = useMemo(() => {\n return template ? '模板已启用,支持 {{input}} 变量。' : '直接输入即可开始对话。';\n }, [template]);\n\n useEffect(() => {\n if (!open) {\n setInput('');\n }\n }, [open]);\n\n const handleSend = async () => {\n const content = input.trim();\n if (!content || isLoading) return;\n setInput('');\n try {\n const response = await sendMessage(content, {\n ...requestOptions,\n template,\n variables: templateVariables,\n });\n onResponse?.(response);\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n onError?.(nextError);\n }\n };\n\n return (\n <Modal\n visible={open}\n transparent\n animationType=\"fade\"\n onRequestClose={() => onOpenChange?.(false)}\n >\n <SafeAreaView style={styles.overlay}>\n <KeyboardAvoidingView\n behavior={Platform.OS === 'ios' ? 'padding' : undefined}\n style={styles.container}\n >\n <View style={styles.header}>\n <Text style={styles.title}>{title}</Text>\n <Pressable onPress={() => onOpenChange?.(false)}>\n <Text style={styles.closeText}>关闭</Text>\n </Pressable>\n </View>\n\n <ScrollView contentContainerStyle={styles.list}>\n {messages.length === 0 && (\n <View style={styles.placeholder}>\n <Text style={styles.placeholderText}>暂无对话内容</Text>\n <Text style={styles.placeholderText}>输入消息开始体验 AI 对话。</Text>\n </View>\n )}\n {messages.map((message, index) => {\n const isUser = message.role === 'user';\n return (\n <View\n key={`${message.role}-${index}`}\n style={isUser ? styles.bubbleUser : styles.bubbleAssistant}\n >\n <Text style={isUser ? styles.bubbleTextUser : styles.bubbleText}>\n {message.content}\n </Text>\n </View>\n );\n })}\n {isLoading && (\n <View style={styles.bubbleAssistant}>\n <Text style={styles.loadingText}>AI 正在思考...</Text>\n </View>\n )}\n </ScrollView>\n\n <View style={styles.inputContainer}>\n <TextInput\n value={input}\n onChangeText={setInput}\n placeholder={placeholder}\n multiline\n style={styles.textInput}\n />\n <View style={styles.helperRow}>\n <Text style={styles.helperText}>{helperText}</Text>\n <Pressable\n onPress={handleSend}\n disabled={!input.trim() || isLoading}\n style={[\n styles.sendButton,\n (!input.trim() || isLoading) && styles.sendButtonDisabled,\n ]}\n >\n <Text style={styles.sendButtonText}>{isLoading ? '发送中...' : '发送'}</Text>\n </Pressable>\n </View>\n {error && (\n <View style={styles.error}>\n <Text style={styles.errorText}>{error.message || '对话出错,请重试。'}</Text>\n </View>\n )}\n </View>\n </KeyboardAvoidingView>\n </SafeAreaView>\n </Modal>\n );\n};\n"]}