sa2kit 1.6.5 → 1.6.7

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 (39) hide show
  1. package/dist/auth/index.d.mts +11 -1
  2. package/dist/auth/index.d.ts +11 -1
  3. package/dist/auth/index.js +9 -0
  4. package/dist/auth/index.js.map +1 -1
  5. package/dist/auth/index.mjs +9 -1
  6. package/dist/auth/index.mjs.map +1 -1
  7. package/dist/calendar/index.d.mts +497 -611
  8. package/dist/calendar/index.d.ts +497 -611
  9. package/dist/calendar/index.js +4104 -4088
  10. package/dist/calendar/index.js.map +1 -1
  11. package/dist/calendar/index.mjs +4092 -4075
  12. package/dist/calendar/index.mjs.map +1 -1
  13. package/dist/calendar/routes/index.js +21 -21
  14. package/dist/calendar/routes/index.mjs +1 -1
  15. package/dist/calendar/server.d.mts +3 -8
  16. package/dist/calendar/server.d.ts +3 -8
  17. package/dist/calendar/server.js +14 -14
  18. package/dist/calendar/server.js.map +1 -1
  19. package/dist/calendar/server.mjs +3 -3
  20. package/dist/calendar/server.mjs.map +1 -1
  21. package/dist/{chunk-OCIJT5VO.mjs → chunk-6WXOA4BE.mjs} +3 -7
  22. package/dist/chunk-6WXOA4BE.mjs.map +1 -0
  23. package/dist/{chunk-FJU3NA6B.js → chunk-AXP7KROR.js} +3 -7
  24. package/dist/chunk-AXP7KROR.js.map +1 -0
  25. package/dist/{chunk-NRYHBGU6.js → chunk-IEA55H3G.js} +5 -5
  26. package/dist/chunk-IEA55H3G.js.map +1 -0
  27. package/dist/{chunk-KFDEOLDH.mjs → chunk-R2F4BXUU.mjs} +5 -5
  28. package/dist/chunk-R2F4BXUU.mjs.map +1 -0
  29. package/dist/index.d.mts +197 -99
  30. package/dist/index.d.ts +197 -99
  31. package/dist/index.js +929 -445
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +857 -382
  34. package/dist/index.mjs.map +1 -1
  35. package/package.json +1 -1
  36. package/dist/chunk-FJU3NA6B.js.map +0 -1
  37. package/dist/chunk-KFDEOLDH.mjs.map +0 -1
  38. package/dist/chunk-NRYHBGU6.js.map +0 -1
  39. package/dist/chunk-OCIJT5VO.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,14 +1,14 @@
1
- export { SearchBox } from './chunk-KFDEOLDH.mjs';
1
+ export { SearchBox } from './chunk-R2F4BXUU.mjs';
2
2
  import { cn } from './chunk-3BGPZN4X.mjs';
3
3
  export { arrayUtils, cn, debugUtils, errorUtils, fileUtils, formatTime, japaneseUtils, stringUtils, validators } from './chunk-3BGPZN4X.mjs';
4
4
  export { useAsyncStorage, useElectronStorage, useLocalStorage, useStorage, useTaroStorage } from './chunk-T5OZHYVM.mjs';
5
5
  import './chunk-OLHGZXN3.mjs';
6
6
  export { ConsoleLoggerAdapter, LogLevel, Logger, createLogger, logger } from './chunk-KQGP6BTS.mjs';
7
7
  import './chunk-BJTO5JO5.mjs';
8
- import * as React3 from 'react';
9
- import React3__default, { useState, useRef, useCallback, useEffect } from 'react';
8
+ import * as React37 from 'react';
9
+ import React37__default, { useState, useRef, useCallback, useEffect } from 'react';
10
10
  import { createWorker } from 'tesseract.js';
11
- import { X, ChevronRight, Check, Circle, ChevronDown, ChevronUp, Upload, Loader2, FileText, Eraser, Download, MessageSquare, Send, Bot, User, Meh, Frown, Smile } from 'lucide-react';
11
+ import { X, ChevronRight, Check, Circle, ChevronDown, ChevronUp, Upload, Loader2, FileText, Eraser, Download, MessageSquare, Send, Bot, User, RotateCcw, Save, AlertCircle, GripVertical, Meh, Frown, Smile } from 'lucide-react';
12
12
  import { Slot } from '@radix-ui/react-slot';
13
13
  import { cva } from 'class-variance-authority';
14
14
  import * as LabelPrimitive from '@radix-ui/react-label';
@@ -23,7 +23,9 @@ import * as SelectPrimitive from '@radix-ui/react-select';
23
23
  import * as SeparatorPrimitive from '@radix-ui/react-separator';
24
24
  import * as TooltipPrimitive from '@radix-ui/react-tooltip';
25
25
  import * as AvatarPrimitive from '@radix-ui/react-avatar';
26
- import ReactDOM, { createPortal } from 'react-dom';
26
+ import { useRouter } from 'next/navigation';
27
+ import Link from 'next/link';
28
+ import { createPortal } from 'react-dom';
27
29
 
28
30
  var useOCR = (options = {}) => {
29
31
  const [state, setState] = useState({
@@ -152,43 +154,43 @@ var OCRScanner = ({
152
154
  handleFileChange(mockEvent);
153
155
  }
154
156
  };
155
- return /* @__PURE__ */ React3__default.createElement(
157
+ return /* @__PURE__ */ React37__default.createElement(
156
158
  "div",
157
159
  {
158
160
  className: `p-6 border-2 border-dashed rounded-xl transition-all ${isProcessing ? "border-blue-400 bg-blue-50/10" : "border-gray-200 hover:border-blue-400"} ${className}`,
159
161
  onDragOver: handleDragOver,
160
162
  onDrop: handleDrop
161
163
  },
162
- !imagePreview ? /* @__PURE__ */ React3__default.createElement(
164
+ !imagePreview ? /* @__PURE__ */ React37__default.createElement(
163
165
  "div",
164
166
  {
165
167
  className: "flex flex-col items-center justify-center cursor-pointer space-y-4",
166
168
  onClick: () => fileInputRef.current?.click()
167
169
  },
168
- /* @__PURE__ */ React3__default.createElement("div", { className: "p-4 bg-blue-50 rounded-full text-blue-500" }, /* @__PURE__ */ React3__default.createElement(Upload, { size: 32 })),
169
- /* @__PURE__ */ React3__default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React3__default.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u70B9\u51FB\u6216\u62D6\u62FD\u56FE\u7247\u8FDB\u884C OCR \u8BC6\u522B"), /* @__PURE__ */ React3__default.createElement("p", { className: "text-sm text-gray-500" }, "\u652F\u6301 JPG, PNG, WebP"))
170
- ) : /* @__PURE__ */ React3__default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React3__default.createElement("div", { className: "relative group rounded-lg overflow-hidden border border-gray-200" }, /* @__PURE__ */ React3__default.createElement(
170
+ /* @__PURE__ */ React37__default.createElement("div", { className: "p-4 bg-blue-50 rounded-full text-blue-500" }, /* @__PURE__ */ React37__default.createElement(Upload, { size: 32 })),
171
+ /* @__PURE__ */ React37__default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u70B9\u51FB\u6216\u62D6\u62FD\u56FE\u7247\u8FDB\u884C OCR \u8BC6\u522B"), /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm text-gray-500" }, "\u652F\u6301 JPG, PNG, WebP"))
172
+ ) : /* @__PURE__ */ React37__default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React37__default.createElement("div", { className: "relative group rounded-lg overflow-hidden border border-gray-200" }, /* @__PURE__ */ React37__default.createElement(
171
173
  "img",
172
174
  {
173
175
  src: imagePreview,
174
176
  alt: "Preview",
175
177
  className: `max-h-64 mx-auto object-contain transition-opacity ${isProcessing ? "opacity-50" : "opacity-100"}`
176
178
  }
177
- ), !isProcessing && /* @__PURE__ */ React3__default.createElement(
179
+ ), !isProcessing && /* @__PURE__ */ React37__default.createElement(
178
180
  "button",
179
181
  {
180
182
  onClick: reset,
181
183
  className: "absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm"
182
184
  },
183
- /* @__PURE__ */ React3__default.createElement(X, { size: 18 })
184
- ), isProcessing && /* @__PURE__ */ React3__default.createElement("div", { className: "absolute inset-0 flex flex-col items-center justify-center bg-black/5" }, /* @__PURE__ */ React3__default.createElement(Loader2, { className: "animate-spin text-blue-500 mb-2", size: 32 }), /* @__PURE__ */ React3__default.createElement("div", { className: "w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React3__default.createElement(
185
+ /* @__PURE__ */ React37__default.createElement(X, { size: 18 })
186
+ ), isProcessing && /* @__PURE__ */ React37__default.createElement("div", { className: "absolute inset-0 flex flex-col items-center justify-center bg-black/5" }, /* @__PURE__ */ React37__default.createElement(Loader2, { className: "animate-spin text-blue-500 mb-2", size: 32 }), /* @__PURE__ */ React37__default.createElement("div", { className: "w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React37__default.createElement(
185
187
  "div",
186
188
  {
187
189
  className: "bg-blue-500 h-full transition-all duration-300",
188
190
  style: { width: `${progress * 100}%` }
189
191
  }
190
- )), /* @__PURE__ */ React3__default.createElement("p", { className: "text-xs font-medium text-blue-600 mt-2" }, status === "initializing" ? "\u6B63\u5728\u52A0\u8F7D\u5F15\u64CE..." : `\u8BC6\u522B\u4E2D ${Math.round(progress * 100)}%`))), result && !isProcessing && /* @__PURE__ */ React3__default.createElement("div", { className: "bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2" }, /* @__PURE__ */ React3__default.createElement("div", { className: "flex items-center gap-2 mb-2 text-gray-600 font-medium" }, /* @__PURE__ */ React3__default.createElement(FileText, { size: 18 }), /* @__PURE__ */ React3__default.createElement("span", null, "\u8BC6\u522B\u7ED3\u679C (\u7F6E\u4FE1\u5EA6: ", Math.round(result.confidence), "%)")), /* @__PURE__ */ React3__default.createElement("pre", { className: "text-sm text-gray-800 whitespace-pre-wrap font-sans" }, result.text)), error && /* @__PURE__ */ React3__default.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u8BC6\u522B\u5931\u8D25: ", error.message)),
191
- /* @__PURE__ */ React3__default.createElement(
192
+ )), /* @__PURE__ */ React37__default.createElement("p", { className: "text-xs font-medium text-blue-600 mt-2" }, status === "initializing" ? "\u6B63\u5728\u52A0\u8F7D\u5F15\u64CE..." : `\u8BC6\u522B\u4E2D ${Math.round(progress * 100)}%`))), result && !isProcessing && /* @__PURE__ */ React37__default.createElement("div", { className: "bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center gap-2 mb-2 text-gray-600 font-medium" }, /* @__PURE__ */ React37__default.createElement(FileText, { size: 18 }), /* @__PURE__ */ React37__default.createElement("span", null, "\u8BC6\u522B\u7ED3\u679C (\u7F6E\u4FE1\u5EA6: ", Math.round(result.confidence), "%)")), /* @__PURE__ */ React37__default.createElement("pre", { className: "text-sm text-gray-800 whitespace-pre-wrap font-sans" }, result.text)), error && /* @__PURE__ */ React37__default.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u8BC6\u522B\u5931\u8D25: ", error.message)),
193
+ /* @__PURE__ */ React37__default.createElement(
192
194
  "input",
193
195
  {
194
196
  type: "file",
@@ -336,37 +338,37 @@ var BackgroundRemover = ({
336
338
  a.download = "removed_background.png";
337
339
  a.click();
338
340
  };
339
- return /* @__PURE__ */ React3__default.createElement("div", { className: `p-6 border-2 border-dashed rounded-xl transition-all ${isProcessing ? "border-purple-400 bg-purple-50/10" : "border-gray-200 hover:border-purple-400"} ${className}` }, !imagePreview ? /* @__PURE__ */ React3__default.createElement(
341
+ return /* @__PURE__ */ React37__default.createElement("div", { className: `p-6 border-2 border-dashed rounded-xl transition-all ${isProcessing ? "border-purple-400 bg-purple-50/10" : "border-gray-200 hover:border-purple-400"} ${className}` }, !imagePreview ? /* @__PURE__ */ React37__default.createElement(
340
342
  "div",
341
343
  {
342
344
  className: "flex flex-col items-center justify-center cursor-pointer space-y-4",
343
345
  onClick: () => fileInputRef.current?.click()
344
346
  },
345
- /* @__PURE__ */ React3__default.createElement("div", { className: "p-4 bg-purple-50 rounded-full text-purple-500" }, /* @__PURE__ */ React3__default.createElement(Eraser, { size: 32 })),
346
- /* @__PURE__ */ React3__default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React3__default.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u4E0A\u4F20\u56FE\u7247\u79FB\u9664\u80CC\u666F"), /* @__PURE__ */ React3__default.createElement("p", { className: "text-sm text-gray-500" }, "\u5EFA\u8BAE\u4F7F\u7528\u4E3B\u4F53\u660E\u786E\u7684\u56FE\u7247"))
347
- ) : /* @__PURE__ */ React3__default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React3__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React3__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React3__default.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u539F\u56FE"), /* @__PURE__ */ React3__default.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50" }, /* @__PURE__ */ React3__default.createElement("img", { src: imagePreview, alt: "Original", className: "max-h-64 mx-auto object-contain" }))), /* @__PURE__ */ React3__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React3__default.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u5904\u7406\u7ED3\u679C"), /* @__PURE__ */ React3__default.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]" }, resultUrl ? /* @__PURE__ */ React3__default.createElement("img", { src: resultUrl, alt: "Result", className: "max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500" }) : /* @__PURE__ */ React3__default.createElement("div", { className: "h-64 flex flex-col items-center justify-center text-gray-400" }, isProcessing ? /* @__PURE__ */ React3__default.createElement(React3__default.Fragment, null, /* @__PURE__ */ React3__default.createElement(Loader2, { className: "animate-spin text-purple-500 mb-2", size: 32 }), /* @__PURE__ */ React3__default.createElement("div", { className: "w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React3__default.createElement(
347
+ /* @__PURE__ */ React37__default.createElement("div", { className: "p-4 bg-purple-50 rounded-full text-purple-500" }, /* @__PURE__ */ React37__default.createElement(Eraser, { size: 32 })),
348
+ /* @__PURE__ */ React37__default.createElement("div", { className: "text-center" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-lg font-medium text-gray-700" }, "\u4E0A\u4F20\u56FE\u7247\u79FB\u9664\u80CC\u666F"), /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm text-gray-500" }, "\u5EFA\u8BAE\u4F7F\u7528\u4E3B\u4F53\u660E\u786E\u7684\u56FE\u7247"))
349
+ ) : /* @__PURE__ */ React37__default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React37__default.createElement("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4" }, /* @__PURE__ */ React37__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u539F\u56FE"), /* @__PURE__ */ React37__default.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50" }, /* @__PURE__ */ React37__default.createElement("img", { src: imagePreview, alt: "Original", className: "max-h-64 mx-auto object-contain" }))), /* @__PURE__ */ React37__default.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-xs font-medium text-gray-500 uppercase tracking-wider" }, "\u5904\u7406\u7ED3\u679C"), /* @__PURE__ */ React37__default.createElement("div", { className: "relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]" }, resultUrl ? /* @__PURE__ */ React37__default.createElement("img", { src: resultUrl, alt: "Result", className: "max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500" }) : /* @__PURE__ */ React37__default.createElement("div", { className: "h-64 flex flex-col items-center justify-center text-gray-400" }, isProcessing ? /* @__PURE__ */ React37__default.createElement(React37__default.Fragment, null, /* @__PURE__ */ React37__default.createElement(Loader2, { className: "animate-spin text-purple-500 mb-2", size: 32 }), /* @__PURE__ */ React37__default.createElement("div", { className: "w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden" }, /* @__PURE__ */ React37__default.createElement(
348
350
  "div",
349
351
  {
350
352
  className: "bg-purple-500 h-full transition-all duration-300",
351
353
  style: { width: `${progress * 100}%` }
352
354
  }
353
- )), /* @__PURE__ */ React3__default.createElement("p", { className: "text-[10px] mt-2 font-mono uppercase" }, status.replace(/-/g, " "))) : /* @__PURE__ */ React3__default.createElement("span", { className: "text-sm italic" }, "\u7B49\u5F85\u5904\u7406..."))))), /* @__PURE__ */ React3__default.createElement("div", { className: "flex justify-between items-center pt-2" }, !isProcessing && /* @__PURE__ */ React3__default.createElement(
355
+ )), /* @__PURE__ */ React37__default.createElement("p", { className: "text-[10px] mt-2 font-mono uppercase" }, status.replace(/-/g, " "))) : /* @__PURE__ */ React37__default.createElement("span", { className: "text-sm italic" }, "\u7B49\u5F85\u5904\u7406..."))))), /* @__PURE__ */ React37__default.createElement("div", { className: "flex justify-between items-center pt-2" }, !isProcessing && /* @__PURE__ */ React37__default.createElement(
354
356
  "button",
355
357
  {
356
358
  onClick: reset,
357
359
  className: "flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors"
358
360
  },
359
- /* @__PURE__ */ React3__default.createElement(X, { size: 16 }),
361
+ /* @__PURE__ */ React37__default.createElement(X, { size: 16 }),
360
362
  "\u91CD\u65B0\u5F00\u59CB"
361
- ), resultUrl && !isProcessing && /* @__PURE__ */ React3__default.createElement(
363
+ ), resultUrl && !isProcessing && /* @__PURE__ */ React37__default.createElement(
362
364
  "button",
363
365
  {
364
366
  onClick: downloadResult,
365
367
  className: "flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all"
366
368
  },
367
- /* @__PURE__ */ React3__default.createElement(Download, { size: 16 }),
369
+ /* @__PURE__ */ React37__default.createElement(Download, { size: 16 }),
368
370
  "\u4E0B\u8F7D PNG"
369
- )), error && /* @__PURE__ */ React3__default.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5904\u7406\u5931\u8D25: ", error.message)), /* @__PURE__ */ React3__default.createElement(
371
+ )), error && /* @__PURE__ */ React37__default.createElement("div", { className: "p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5904\u7406\u5931\u8D25: ", error.message)), /* @__PURE__ */ React37__default.createElement(
370
372
  "input",
371
373
  {
372
374
  type: "file",
@@ -485,11 +487,11 @@ var SentimentAnalyzer = ({
485
487
  if (!result) return null;
486
488
  switch (result.sentiment) {
487
489
  case "positive":
488
- return /* @__PURE__ */ React3__default.createElement(Smile, { className: "text-green-500", size: 24 });
490
+ return /* @__PURE__ */ React37__default.createElement(Smile, { className: "text-green-500", size: 24 });
489
491
  case "negative":
490
- return /* @__PURE__ */ React3__default.createElement(Frown, { className: "text-red-500", size: 24 });
492
+ return /* @__PURE__ */ React37__default.createElement(Frown, { className: "text-red-500", size: 24 });
491
493
  default:
492
- return /* @__PURE__ */ React3__default.createElement(Meh, { className: "text-yellow-500", size: 24 });
494
+ return /* @__PURE__ */ React37__default.createElement(Meh, { className: "text-yellow-500", size: 24 });
493
495
  }
494
496
  };
495
497
  const getSentimentColor = () => {
@@ -503,7 +505,7 @@ var SentimentAnalyzer = ({
503
505
  return "bg-yellow-50 border-yellow-200 text-yellow-700";
504
506
  }
505
507
  };
506
- return /* @__PURE__ */ React3__default.createElement("div", { className: `p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm ${className}` }, /* @__PURE__ */ React3__default.createElement("div", { className: "flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium" }, /* @__PURE__ */ React3__default.createElement(MessageSquare, { size: 20 }), /* @__PURE__ */ React3__default.createElement("span", null, "\u6587\u672C\u60C5\u611F\u5206\u6790")), /* @__PURE__ */ React3__default.createElement("div", { className: "relative" }, /* @__PURE__ */ React3__default.createElement(
508
+ return /* @__PURE__ */ React37__default.createElement("div", { className: `p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm ${className}` }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium" }, /* @__PURE__ */ React37__default.createElement(MessageSquare, { size: 20 }), /* @__PURE__ */ React37__default.createElement("span", null, "\u6587\u672C\u60C5\u611F\u5206\u6790")), /* @__PURE__ */ React37__default.createElement("div", { className: "relative" }, /* @__PURE__ */ React37__default.createElement(
507
509
  "textarea",
508
510
  {
509
511
  value: text,
@@ -512,15 +514,15 @@ var SentimentAnalyzer = ({
512
514
  className: "w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200",
513
515
  disabled: isProcessing
514
516
  }
515
- ), /* @__PURE__ */ React3__default.createElement(
517
+ ), /* @__PURE__ */ React37__default.createElement(
516
518
  "button",
517
519
  {
518
520
  onClick: handleAnalyze,
519
521
  disabled: !text.trim() || isProcessing,
520
522
  className: "absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm"
521
523
  },
522
- isProcessing ? /* @__PURE__ */ React3__default.createElement(Loader2, { className: "animate-spin", size: 18 }) : /* @__PURE__ */ React3__default.createElement(Send, { size: 18 })
523
- )), isProcessing && /* @__PURE__ */ React3__default.createElement("div", { className: "mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse" }, /* @__PURE__ */ React3__default.createElement(Loader2, { size: 14, className: "animate-spin" }), /* @__PURE__ */ React3__default.createElement("span", null, "\u6B63\u5728\u5206\u6790 (\u9996\u6B21\u8FD0\u884C\u5C06\u52A0\u8F7D\u6A21\u578B\u8D44\u6E90)...")), result && !isProcessing && /* @__PURE__ */ React3__default.createElement("div", { className: `mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2 ${getSentimentColor()}` }, /* @__PURE__ */ React3__default.createElement("div", { className: "p-2 bg-white rounded-full shadow-sm" }, getSentimentIcon()), /* @__PURE__ */ React3__default.createElement("div", null, /* @__PURE__ */ React3__default.createElement("p", { className: "font-bold text-lg capitalize" }, result.sentiment), /* @__PURE__ */ React3__default.createElement("p", { className: "text-sm opacity-80" }, "\u7F6E\u4FE1\u5EA6: ", (result.score * 100).toFixed(1), "% (", result.label, ")"))), error && /* @__PURE__ */ React3__default.createElement("div", { className: "mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5206\u6790\u5931\u8D25: ", error.message));
524
+ isProcessing ? /* @__PURE__ */ React37__default.createElement(Loader2, { className: "animate-spin", size: 18 }) : /* @__PURE__ */ React37__default.createElement(Send, { size: 18 })
525
+ )), isProcessing && /* @__PURE__ */ React37__default.createElement("div", { className: "mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse" }, /* @__PURE__ */ React37__default.createElement(Loader2, { size: 14, className: "animate-spin" }), /* @__PURE__ */ React37__default.createElement("span", null, "\u6B63\u5728\u5206\u6790 (\u9996\u6B21\u8FD0\u884C\u5C06\u52A0\u8F7D\u6A21\u578B\u8D44\u6E90)...")), result && !isProcessing && /* @__PURE__ */ React37__default.createElement("div", { className: `mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2 ${getSentimentColor()}` }, /* @__PURE__ */ React37__default.createElement("div", { className: "p-2 bg-white rounded-full shadow-sm" }, getSentimentIcon()), /* @__PURE__ */ React37__default.createElement("div", null, /* @__PURE__ */ React37__default.createElement("p", { className: "font-bold text-lg capitalize" }, result.sentiment), /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm opacity-80" }, "\u7F6E\u4FE1\u5EA6: ", (result.score * 100).toFixed(1), "% (", result.label, ")"))), error && /* @__PURE__ */ React37__default.createElement("div", { className: "mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100" }, "\u5206\u6790\u5931\u8D25: ", error.message));
524
526
  };
525
527
  var useTextGeneration = (options = {}) => {
526
528
  const [state, setState] = useState({
@@ -660,7 +662,7 @@ AI\u56DE\u5E94\uFF1A\u201C`;
660
662
  setChatHistory((prev) => [...prev, { role: "assistant", content: "\uFF08\u672C\u5730\u6A21\u578B\u601D\u8003\u8FC7\u5EA6\uFF0C\u6682\u65F6\u4F11\u606F\u4E2D...\uFF09" }]);
661
663
  }
662
664
  };
663
- return /* @__PURE__ */ React3__default.createElement("div", { className: `flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden ${className}` }, /* @__PURE__ */ React3__default.createElement("div", { ref: scrollRef, className: "flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50" }, chatHistory.length === 0 && /* @__PURE__ */ React3__default.createElement("div", { className: "h-full flex flex-col items-center justify-center text-gray-400 space-y-2" }, /* @__PURE__ */ React3__default.createElement(Bot, { size: 48, className: "opacity-20" }), /* @__PURE__ */ React3__default.createElement("p", { className: "text-sm italic text-center px-8 text-gray-400 font-sans" }, "\u4F60\u597D\uFF01\u6211\u662F 100% \u672C\u5730\u8FD0\u884C\u7684 AI\u3002", /* @__PURE__ */ React3__default.createElement("br", null), "\u4F60\u53EF\u4EE5\u548C\u6211\u804A\u804A\u5929\uFF0C\u6211\u4F1A\u5C1D\u8BD5\u7406\u89E3\u4F60\u7684\u610F\u601D\u3002")), chatHistory.map((msg, i) => /* @__PURE__ */ React3__default.createElement("div", { key: i, className: `flex ${msg.role === "user" ? "justify-end" : "justify-start"} animate-in fade-in slide-in-from-bottom-2` }, /* @__PURE__ */ React3__default.createElement("div", { className: `flex gap-3 max-w-[85%] ${msg.role === "user" ? "flex-row-reverse" : ""}` }, /* @__PURE__ */ React3__default.createElement("div", { className: `p-2 rounded-lg h-fit ${msg.role === "user" ? "bg-blue-100 text-blue-600" : "bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400"}` }, msg.role === "user" ? /* @__PURE__ */ React3__default.createElement(User, { size: 18 }) : /* @__PURE__ */ React3__default.createElement(Bot, { size: 18 })), /* @__PURE__ */ React3__default.createElement("div", { className: `p-3 rounded-2xl shadow-sm text-sm ${msg.role === "user" ? "bg-blue-600 text-white rounded-tr-none" : "bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed"}` }, msg.content)))), isGenerating && /* @__PURE__ */ React3__default.createElement("div", { className: "flex justify-start" }, /* @__PURE__ */ React3__default.createElement("div", { className: "flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600" }, /* @__PURE__ */ React3__default.createElement(Loader2, { className: "animate-spin text-blue-500", size: 16 }), /* @__PURE__ */ React3__default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React3__default.createElement("span", { className: "text-xs text-gray-500 font-medium" }, "\u601D\u8003\u4E2D..."), /* @__PURE__ */ React3__default.createElement("span", { className: "text-[10px] text-blue-400 font-mono tracking-tighter" }, genStatus))))), /* @__PURE__ */ React3__default.createElement("div", { className: "p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700" }, /* @__PURE__ */ React3__default.createElement("div", { className: "relative flex items-center gap-2" }, /* @__PURE__ */ React3__default.createElement(
665
+ return /* @__PURE__ */ React37__default.createElement("div", { className: `flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden ${className}` }, /* @__PURE__ */ React37__default.createElement("div", { ref: scrollRef, className: "flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50" }, chatHistory.length === 0 && /* @__PURE__ */ React37__default.createElement("div", { className: "h-full flex flex-col items-center justify-center text-gray-400 space-y-2" }, /* @__PURE__ */ React37__default.createElement(Bot, { size: 48, className: "opacity-20" }), /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm italic text-center px-8 text-gray-400 font-sans" }, "\u4F60\u597D\uFF01\u6211\u662F 100% \u672C\u5730\u8FD0\u884C\u7684 AI\u3002", /* @__PURE__ */ React37__default.createElement("br", null), "\u4F60\u53EF\u4EE5\u548C\u6211\u804A\u804A\u5929\uFF0C\u6211\u4F1A\u5C1D\u8BD5\u7406\u89E3\u4F60\u7684\u610F\u601D\u3002")), chatHistory.map((msg, i) => /* @__PURE__ */ React37__default.createElement("div", { key: i, className: `flex ${msg.role === "user" ? "justify-end" : "justify-start"} animate-in fade-in slide-in-from-bottom-2` }, /* @__PURE__ */ React37__default.createElement("div", { className: `flex gap-3 max-w-[85%] ${msg.role === "user" ? "flex-row-reverse" : ""}` }, /* @__PURE__ */ React37__default.createElement("div", { className: `p-2 rounded-lg h-fit ${msg.role === "user" ? "bg-blue-100 text-blue-600" : "bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400"}` }, msg.role === "user" ? /* @__PURE__ */ React37__default.createElement(User, { size: 18 }) : /* @__PURE__ */ React37__default.createElement(Bot, { size: 18 })), /* @__PURE__ */ React37__default.createElement("div", { className: `p-3 rounded-2xl shadow-sm text-sm ${msg.role === "user" ? "bg-blue-600 text-white rounded-tr-none" : "bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed"}` }, msg.content)))), isGenerating && /* @__PURE__ */ React37__default.createElement("div", { className: "flex justify-start" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600" }, /* @__PURE__ */ React37__default.createElement(Loader2, { className: "animate-spin text-blue-500", size: 16 }), /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-col" }, /* @__PURE__ */ React37__default.createElement("span", { className: "text-xs text-gray-500 font-medium" }, "\u601D\u8003\u4E2D..."), /* @__PURE__ */ React37__default.createElement("span", { className: "text-[10px] text-blue-400 font-mono tracking-tighter" }, genStatus))))), /* @__PURE__ */ React37__default.createElement("div", { className: "p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700" }, /* @__PURE__ */ React37__default.createElement("div", { className: "relative flex items-center gap-2" }, /* @__PURE__ */ React37__default.createElement(
664
666
  "input",
665
667
  {
666
668
  type: "text",
@@ -671,14 +673,14 @@ AI\u56DE\u5E94\uFF1A\u201C`;
671
673
  className: "flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800",
672
674
  disabled: isGenerating
673
675
  }
674
- ), /* @__PURE__ */ React3__default.createElement(
676
+ ), /* @__PURE__ */ React37__default.createElement(
675
677
  "button",
676
678
  {
677
679
  onClick: handleSend,
678
680
  disabled: !input.trim() || isGenerating,
679
681
  className: "absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center"
680
682
  },
681
- /* @__PURE__ */ React3__default.createElement(Send, { size: 18 })
683
+ /* @__PURE__ */ React37__default.createElement(Send, { size: 18 })
682
684
  ))));
683
685
  };
684
686
  var buttonVariants = cva(
@@ -706,10 +708,10 @@ var buttonVariants = cva(
706
708
  }
707
709
  }
708
710
  );
709
- var Button = React3.forwardRef(
711
+ var Button = React37.forwardRef(
710
712
  ({ className, variant, size, asChild = false, ...props }, ref) => {
711
713
  const Comp = asChild ? Slot : "button";
712
- return /* @__PURE__ */ React3.createElement(
714
+ return /* @__PURE__ */ React37.createElement(
713
715
  Comp,
714
716
  {
715
717
  className: cn(buttonVariants({ variant, size, className })),
@@ -720,7 +722,7 @@ var Button = React3.forwardRef(
720
722
  }
721
723
  );
722
724
  Button.displayName = "Button";
723
- var Card = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
725
+ var Card = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
724
726
  "div",
725
727
  {
726
728
  ref,
@@ -732,7 +734,7 @@ var Card = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ R
732
734
  }
733
735
  ));
734
736
  Card.displayName = "Card";
735
- var CardHeader = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
737
+ var CardHeader = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
736
738
  "div",
737
739
  {
738
740
  ref,
@@ -741,7 +743,7 @@ var CardHeader = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE_
741
743
  }
742
744
  ));
743
745
  CardHeader.displayName = "CardHeader";
744
- var CardTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
746
+ var CardTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
745
747
  "div",
746
748
  {
747
749
  ref,
@@ -750,7 +752,7 @@ var CardTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__
750
752
  }
751
753
  ));
752
754
  CardTitle.displayName = "CardTitle";
753
- var CardDescription = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
755
+ var CardDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
754
756
  "div",
755
757
  {
756
758
  ref,
@@ -759,9 +761,9 @@ var CardDescription = React3.forwardRef(({ className, ...props }, ref) => /* @__
759
761
  }
760
762
  ));
761
763
  CardDescription.displayName = "CardDescription";
762
- var CardContent = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement("div", { ref, className: cn("p-6 pt-0", className), ...props }));
764
+ var CardContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement("div", { ref, className: cn("p-6 pt-0", className), ...props }));
763
765
  CardContent.displayName = "CardContent";
764
- var CardFooter = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
766
+ var CardFooter = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
765
767
  "div",
766
768
  {
767
769
  ref,
@@ -787,11 +789,11 @@ var badgeVariants = cva(
787
789
  }
788
790
  );
789
791
  function Badge({ className, variant, ...props }) {
790
- return /* @__PURE__ */ React3.createElement("div", { className: cn(badgeVariants({ variant }), className), ...props });
792
+ return /* @__PURE__ */ React37.createElement("div", { className: cn(badgeVariants({ variant }), className), ...props });
791
793
  }
792
- var Input = React3.forwardRef(
794
+ var Input = React37.forwardRef(
793
795
  ({ className, type, ...props }, ref) => {
794
- return /* @__PURE__ */ React3.createElement(
796
+ return /* @__PURE__ */ React37.createElement(
795
797
  "input",
796
798
  {
797
799
  type,
@@ -809,7 +811,7 @@ Input.displayName = "Input";
809
811
  var labelVariants = cva(
810
812
  "text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
811
813
  );
812
- var Label = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
814
+ var Label = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
813
815
  LabelPrimitive.Root,
814
816
  {
815
817
  ref,
@@ -819,7 +821,7 @@ var Label = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
819
821
  ));
820
822
  Label.displayName = LabelPrimitive.Root.displayName;
821
823
  var Tabs = TabsPrimitive.Root;
822
- var TabsList = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
824
+ var TabsList = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
823
825
  TabsPrimitive.List,
824
826
  {
825
827
  ref,
@@ -831,7 +833,7 @@ var TabsList = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__
831
833
  }
832
834
  ));
833
835
  TabsList.displayName = TabsPrimitive.List.displayName;
834
- var TabsTrigger = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
836
+ var TabsTrigger = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
835
837
  TabsPrimitive.Trigger,
836
838
  {
837
839
  ref,
@@ -843,7 +845,7 @@ var TabsTrigger = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE
843
845
  }
844
846
  ));
845
847
  TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
846
- var TabsContent = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
848
+ var TabsContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
847
849
  TabsPrimitive.Content,
848
850
  {
849
851
  ref,
@@ -859,7 +861,7 @@ var Dialog = DialogPrimitive.Root;
859
861
  var DialogTrigger = DialogPrimitive.Trigger;
860
862
  var DialogPortal = DialogPrimitive.Portal;
861
863
  var DialogClose = DialogPrimitive.Close;
862
- var DialogOverlay = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
864
+ var DialogOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
863
865
  DialogPrimitive.Overlay,
864
866
  {
865
867
  ref,
@@ -871,7 +873,7 @@ var DialogOverlay = React3.forwardRef(({ className, ...props }, ref) => /* @__PU
871
873
  }
872
874
  ));
873
875
  DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
874
- var DialogContent = React3.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(DialogPortal, null, /* @__PURE__ */ React3.createElement(DialogOverlay, null), /* @__PURE__ */ React3.createElement(
876
+ var DialogContent = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(DialogPortal, null, /* @__PURE__ */ React37.createElement(DialogOverlay, null), /* @__PURE__ */ React37.createElement(
875
877
  DialogPrimitive.Content,
876
878
  {
877
879
  ref,
@@ -882,13 +884,13 @@ var DialogContent = React3.forwardRef(({ className, children, ...props }, ref) =
882
884
  ...props
883
885
  },
884
886
  children,
885
- /* @__PURE__ */ React3.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground" }, /* @__PURE__ */ React3.createElement(X, { className: "h-4 w-4" }), /* @__PURE__ */ React3.createElement("span", { className: "sr-only" }, "Close"))
887
+ /* @__PURE__ */ React37.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground" }, /* @__PURE__ */ React37.createElement(X, { className: "h-4 w-4" }), /* @__PURE__ */ React37.createElement("span", { className: "sr-only" }, "Close"))
886
888
  )));
887
889
  DialogContent.displayName = DialogPrimitive.Content.displayName;
888
890
  var DialogHeader = ({
889
891
  className,
890
892
  ...props
891
- }) => /* @__PURE__ */ React3.createElement(
893
+ }) => /* @__PURE__ */ React37.createElement(
892
894
  "div",
893
895
  {
894
896
  className: cn(
@@ -902,7 +904,7 @@ DialogHeader.displayName = "DialogHeader";
902
904
  var DialogFooter = ({
903
905
  className,
904
906
  ...props
905
- }) => /* @__PURE__ */ React3.createElement(
907
+ }) => /* @__PURE__ */ React37.createElement(
906
908
  "div",
907
909
  {
908
910
  className: cn(
@@ -913,7 +915,7 @@ var DialogFooter = ({
913
915
  }
914
916
  );
915
917
  DialogFooter.displayName = "DialogFooter";
916
- var DialogTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
918
+ var DialogTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
917
919
  DialogPrimitive.Title,
918
920
  {
919
921
  ref,
@@ -925,7 +927,7 @@ var DialogTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE
925
927
  }
926
928
  ));
927
929
  DialogTitle.displayName = DialogPrimitive.Title.displayName;
928
- var DialogDescription = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
930
+ var DialogDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
929
931
  DialogPrimitive.Description,
930
932
  {
931
933
  ref,
@@ -937,7 +939,7 @@ DialogDescription.displayName = DialogPrimitive.Description.displayName;
937
939
  var AlertDialog = AlertDialogPrimitive.Root;
938
940
  var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
939
941
  var AlertDialogPortal = AlertDialogPrimitive.Portal;
940
- var AlertDialogOverlay = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
942
+ var AlertDialogOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
941
943
  AlertDialogPrimitive.Overlay,
942
944
  {
943
945
  className: cn(
@@ -949,7 +951,7 @@ var AlertDialogOverlay = React3.forwardRef(({ className, ...props }, ref) => /*
949
951
  }
950
952
  ));
951
953
  AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;
952
- var AlertDialogContent = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(AlertDialogPortal, null, /* @__PURE__ */ React3.createElement(AlertDialogOverlay, null), /* @__PURE__ */ React3.createElement(
954
+ var AlertDialogContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(AlertDialogPortal, null, /* @__PURE__ */ React37.createElement(AlertDialogOverlay, null), /* @__PURE__ */ React37.createElement(
953
955
  AlertDialogPrimitive.Content,
954
956
  {
955
957
  ref,
@@ -964,7 +966,7 @@ AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;
964
966
  var AlertDialogHeader = ({
965
967
  className,
966
968
  ...props
967
- }) => /* @__PURE__ */ React3.createElement(
969
+ }) => /* @__PURE__ */ React37.createElement(
968
970
  "div",
969
971
  {
970
972
  className: cn(
@@ -978,7 +980,7 @@ AlertDialogHeader.displayName = "AlertDialogHeader";
978
980
  var AlertDialogFooter = ({
979
981
  className,
980
982
  ...props
981
- }) => /* @__PURE__ */ React3.createElement(
983
+ }) => /* @__PURE__ */ React37.createElement(
982
984
  "div",
983
985
  {
984
986
  className: cn(
@@ -989,7 +991,7 @@ var AlertDialogFooter = ({
989
991
  }
990
992
  );
991
993
  AlertDialogFooter.displayName = "AlertDialogFooter";
992
- var AlertDialogTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
994
+ var AlertDialogTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
993
995
  AlertDialogPrimitive.Title,
994
996
  {
995
997
  ref,
@@ -998,7 +1000,7 @@ var AlertDialogTitle = React3.forwardRef(({ className, ...props }, ref) => /* @_
998
1000
  }
999
1001
  ));
1000
1002
  AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;
1001
- var AlertDialogDescription = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1003
+ var AlertDialogDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1002
1004
  AlertDialogPrimitive.Description,
1003
1005
  {
1004
1006
  ref,
@@ -1007,7 +1009,7 @@ var AlertDialogDescription = React3.forwardRef(({ className, ...props }, ref) =>
1007
1009
  }
1008
1010
  ));
1009
1011
  AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName;
1010
- var AlertDialogAction = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1012
+ var AlertDialogAction = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1011
1013
  AlertDialogPrimitive.Action,
1012
1014
  {
1013
1015
  ref,
@@ -1016,7 +1018,7 @@ var AlertDialogAction = React3.forwardRef(({ className, ...props }, ref) => /* @
1016
1018
  }
1017
1019
  ));
1018
1020
  AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;
1019
- var AlertDialogCancel = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1021
+ var AlertDialogCancel = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1020
1022
  AlertDialogPrimitive.Cancel,
1021
1023
  {
1022
1024
  ref,
@@ -1035,7 +1037,7 @@ var DropdownMenuGroup = DropdownMenuPrimitive.Group;
1035
1037
  var DropdownMenuPortal = DropdownMenuPrimitive.Portal;
1036
1038
  var DropdownMenuSub = DropdownMenuPrimitive.Sub;
1037
1039
  var DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
1038
- var DropdownMenuSubTrigger = React3.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1040
+ var DropdownMenuSubTrigger = React37.forwardRef(({ className, inset, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1039
1041
  DropdownMenuPrimitive.SubTrigger,
1040
1042
  {
1041
1043
  ref,
@@ -1047,10 +1049,10 @@ var DropdownMenuSubTrigger = React3.forwardRef(({ className, inset, children, ..
1047
1049
  ...props
1048
1050
  },
1049
1051
  children,
1050
- /* @__PURE__ */ React3.createElement(ChevronRight, { className: "ml-auto" })
1052
+ /* @__PURE__ */ React37.createElement(ChevronRight, { className: "ml-auto" })
1051
1053
  ));
1052
1054
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
1053
- var DropdownMenuSubContent = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1055
+ var DropdownMenuSubContent = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1054
1056
  DropdownMenuPrimitive.SubContent,
1055
1057
  {
1056
1058
  ref,
@@ -1062,7 +1064,7 @@ var DropdownMenuSubContent = React3.forwardRef(({ className, ...props }, ref) =>
1062
1064
  }
1063
1065
  ));
1064
1066
  DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
1065
- var DropdownMenuContent = React3.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React3.createElement(DropdownMenuPrimitive.Portal, null, /* @__PURE__ */ React3.createElement(
1067
+ var DropdownMenuContent = React37.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React37.createElement(DropdownMenuPrimitive.Portal, null, /* @__PURE__ */ React37.createElement(
1066
1068
  DropdownMenuPrimitive.Content,
1067
1069
  {
1068
1070
  ref,
@@ -1076,7 +1078,7 @@ var DropdownMenuContent = React3.forwardRef(({ className, sideOffset = 4, ...pro
1076
1078
  }
1077
1079
  )));
1078
1080
  DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
1079
- var DropdownMenuItem = React3.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1081
+ var DropdownMenuItem = React37.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1080
1082
  DropdownMenuPrimitive.Item,
1081
1083
  {
1082
1084
  ref,
@@ -1089,7 +1091,7 @@ var DropdownMenuItem = React3.forwardRef(({ className, inset, ...props }, ref) =
1089
1091
  }
1090
1092
  ));
1091
1093
  DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
1092
- var DropdownMenuCheckboxItem = React3.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1094
+ var DropdownMenuCheckboxItem = React37.forwardRef(({ className, children, checked, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1093
1095
  DropdownMenuPrimitive.CheckboxItem,
1094
1096
  {
1095
1097
  ref,
@@ -1100,11 +1102,11 @@ var DropdownMenuCheckboxItem = React3.forwardRef(({ className, children, checked
1100
1102
  checked,
1101
1103
  ...props
1102
1104
  },
1103
- /* @__PURE__ */ React3.createElement("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React3.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React3.createElement(Check, { className: "h-4 w-4" }))),
1105
+ /* @__PURE__ */ React37.createElement("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React37.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React37.createElement(Check, { className: "h-4 w-4" }))),
1104
1106
  children
1105
1107
  ));
1106
1108
  DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;
1107
- var DropdownMenuRadioItem = React3.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1109
+ var DropdownMenuRadioItem = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1108
1110
  DropdownMenuPrimitive.RadioItem,
1109
1111
  {
1110
1112
  ref,
@@ -1114,11 +1116,11 @@ var DropdownMenuRadioItem = React3.forwardRef(({ className, children, ...props }
1114
1116
  ),
1115
1117
  ...props
1116
1118
  },
1117
- /* @__PURE__ */ React3.createElement("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React3.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React3.createElement(Circle, { className: "h-2 w-2 fill-current" }))),
1119
+ /* @__PURE__ */ React37.createElement("span", { className: "absolute left-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React37.createElement(DropdownMenuPrimitive.ItemIndicator, null, /* @__PURE__ */ React37.createElement(Circle, { className: "h-2 w-2 fill-current" }))),
1118
1120
  children
1119
1121
  ));
1120
1122
  DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
1121
- var DropdownMenuLabel = React3.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1123
+ var DropdownMenuLabel = React37.forwardRef(({ className, inset, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1122
1124
  DropdownMenuPrimitive.Label,
1123
1125
  {
1124
1126
  ref,
@@ -1131,7 +1133,7 @@ var DropdownMenuLabel = React3.forwardRef(({ className, inset, ...props }, ref)
1131
1133
  }
1132
1134
  ));
1133
1135
  DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
1134
- var DropdownMenuSeparator = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1136
+ var DropdownMenuSeparator = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1135
1137
  DropdownMenuPrimitive.Separator,
1136
1138
  {
1137
1139
  ref,
@@ -1144,7 +1146,7 @@ var DropdownMenuShortcut = ({
1144
1146
  className,
1145
1147
  ...props
1146
1148
  }) => {
1147
- return /* @__PURE__ */ React3.createElement(
1149
+ return /* @__PURE__ */ React37.createElement(
1148
1150
  "span",
1149
1151
  {
1150
1152
  className: cn("ml-auto text-xs tracking-widest opacity-60", className),
@@ -1156,7 +1158,7 @@ DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
1156
1158
  var Popover = PopoverPrimitive.Root;
1157
1159
  var PopoverTrigger = PopoverPrimitive.Trigger;
1158
1160
  var PopoverAnchor = PopoverPrimitive.Anchor;
1159
- var PopoverContent = React3.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React3.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React3.createElement(
1161
+ var PopoverContent = React37.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React37.createElement(PopoverPrimitive.Portal, null, /* @__PURE__ */ React37.createElement(
1160
1162
  PopoverPrimitive.Content,
1161
1163
  {
1162
1164
  ref,
@@ -1170,7 +1172,7 @@ var PopoverContent = React3.forwardRef(({ className, align = "center", sideOffse
1170
1172
  }
1171
1173
  )));
1172
1174
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
1173
- var Progress = React3.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1175
+ var Progress = React37.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1174
1176
  ProgressPrimitive.Root,
1175
1177
  {
1176
1178
  ref,
@@ -1180,7 +1182,7 @@ var Progress = React3.forwardRef(({ className, value, ...props }, ref) => /* @__
1180
1182
  ),
1181
1183
  ...props
1182
1184
  },
1183
- /* @__PURE__ */ React3.createElement(
1185
+ /* @__PURE__ */ React37.createElement(
1184
1186
  ProgressPrimitive.Indicator,
1185
1187
  {
1186
1188
  className: "h-full w-full flex-1 bg-primary transition-all",
@@ -1189,19 +1191,19 @@ var Progress = React3.forwardRef(({ className, value, ...props }, ref) => /* @__
1189
1191
  )
1190
1192
  ));
1191
1193
  Progress.displayName = ProgressPrimitive.Root.displayName;
1192
- var ScrollArea = React3.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1194
+ var ScrollArea = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1193
1195
  ScrollAreaPrimitive.Root,
1194
1196
  {
1195
1197
  ref,
1196
1198
  className: cn("relative overflow-hidden", className),
1197
1199
  ...props
1198
1200
  },
1199
- /* @__PURE__ */ React3.createElement(ScrollAreaPrimitive.Viewport, { className: "h-full w-full rounded-[inherit]" }, children),
1200
- /* @__PURE__ */ React3.createElement(ScrollBar, null),
1201
- /* @__PURE__ */ React3.createElement(ScrollAreaPrimitive.Corner, null)
1201
+ /* @__PURE__ */ React37.createElement(ScrollAreaPrimitive.Viewport, { className: "h-full w-full rounded-[inherit]" }, children),
1202
+ /* @__PURE__ */ React37.createElement(ScrollBar, null),
1203
+ /* @__PURE__ */ React37.createElement(ScrollAreaPrimitive.Corner, null)
1202
1204
  ));
1203
1205
  ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
1204
- var ScrollBar = React3.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ React3.createElement(
1206
+ var ScrollBar = React37.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ React37.createElement(
1205
1207
  ScrollAreaPrimitive.ScrollAreaScrollbar,
1206
1208
  {
1207
1209
  ref,
@@ -1214,13 +1216,13 @@ var ScrollBar = React3.forwardRef(({ className, orientation = "vertical", ...pro
1214
1216
  ),
1215
1217
  ...props
1216
1218
  },
1217
- /* @__PURE__ */ React3.createElement(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
1219
+ /* @__PURE__ */ React37.createElement(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border" })
1218
1220
  ));
1219
1221
  ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
1220
1222
  var Select = SelectPrimitive.Root;
1221
1223
  var SelectGroup = SelectPrimitive.Group;
1222
1224
  var SelectValue = SelectPrimitive.Value;
1223
- var SelectTrigger = React3.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1225
+ var SelectTrigger = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1224
1226
  SelectPrimitive.Trigger,
1225
1227
  {
1226
1228
  ref,
@@ -1231,10 +1233,10 @@ var SelectTrigger = React3.forwardRef(({ className, children, ...props }, ref) =
1231
1233
  ...props
1232
1234
  },
1233
1235
  children,
1234
- /* @__PURE__ */ React3.createElement(SelectPrimitive.Icon, { asChild: true }, /* @__PURE__ */ React3.createElement(ChevronDown, { className: "h-4 w-4 opacity-50" }))
1236
+ /* @__PURE__ */ React37.createElement(SelectPrimitive.Icon, { asChild: true }, /* @__PURE__ */ React37.createElement(ChevronDown, { className: "h-4 w-4 opacity-50" }))
1235
1237
  ));
1236
1238
  SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
1237
- var SelectScrollUpButton = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1239
+ var SelectScrollUpButton = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1238
1240
  SelectPrimitive.ScrollUpButton,
1239
1241
  {
1240
1242
  ref,
@@ -1244,10 +1246,10 @@ var SelectScrollUpButton = React3.forwardRef(({ className, ...props }, ref) => /
1244
1246
  ),
1245
1247
  ...props
1246
1248
  },
1247
- /* @__PURE__ */ React3.createElement(ChevronUp, { className: "h-4 w-4" })
1249
+ /* @__PURE__ */ React37.createElement(ChevronUp, { className: "h-4 w-4" })
1248
1250
  ));
1249
1251
  SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
1250
- var SelectScrollDownButton = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1252
+ var SelectScrollDownButton = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1251
1253
  SelectPrimitive.ScrollDownButton,
1252
1254
  {
1253
1255
  ref,
@@ -1257,10 +1259,10 @@ var SelectScrollDownButton = React3.forwardRef(({ className, ...props }, ref) =>
1257
1259
  ),
1258
1260
  ...props
1259
1261
  },
1260
- /* @__PURE__ */ React3.createElement(ChevronDown, { className: "h-4 w-4" })
1262
+ /* @__PURE__ */ React37.createElement(ChevronDown, { className: "h-4 w-4" })
1261
1263
  ));
1262
1264
  SelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;
1263
- var SelectContent = React3.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ React3.createElement(SelectPrimitive.Portal, null, /* @__PURE__ */ React3.createElement(
1265
+ var SelectContent = React37.forwardRef(({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ React37.createElement(SelectPrimitive.Portal, null, /* @__PURE__ */ React37.createElement(
1264
1266
  SelectPrimitive.Content,
1265
1267
  {
1266
1268
  ref,
@@ -1272,8 +1274,8 @@ var SelectContent = React3.forwardRef(({ className, children, position = "popper
1272
1274
  position,
1273
1275
  ...props
1274
1276
  },
1275
- /* @__PURE__ */ React3.createElement(SelectScrollUpButton, null),
1276
- /* @__PURE__ */ React3.createElement(
1277
+ /* @__PURE__ */ React37.createElement(SelectScrollUpButton, null),
1278
+ /* @__PURE__ */ React37.createElement(
1277
1279
  SelectPrimitive.Viewport,
1278
1280
  {
1279
1281
  className: cn(
@@ -1283,10 +1285,10 @@ var SelectContent = React3.forwardRef(({ className, children, position = "popper
1283
1285
  },
1284
1286
  children
1285
1287
  ),
1286
- /* @__PURE__ */ React3.createElement(SelectScrollDownButton, null)
1288
+ /* @__PURE__ */ React37.createElement(SelectScrollDownButton, null)
1287
1289
  )));
1288
1290
  SelectContent.displayName = SelectPrimitive.Content.displayName;
1289
- var SelectLabel = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1291
+ var SelectLabel = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1290
1292
  SelectPrimitive.Label,
1291
1293
  {
1292
1294
  ref,
@@ -1295,7 +1297,7 @@ var SelectLabel = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE
1295
1297
  }
1296
1298
  ));
1297
1299
  SelectLabel.displayName = SelectPrimitive.Label.displayName;
1298
- var SelectItem = React3.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1300
+ var SelectItem = React37.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1299
1301
  SelectPrimitive.Item,
1300
1302
  {
1301
1303
  ref,
@@ -1305,11 +1307,11 @@ var SelectItem = React3.forwardRef(({ className, children, ...props }, ref) => /
1305
1307
  ),
1306
1308
  ...props
1307
1309
  },
1308
- /* @__PURE__ */ React3.createElement("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React3.createElement(SelectPrimitive.ItemIndicator, null, /* @__PURE__ */ React3.createElement(Check, { className: "h-4 w-4" }))),
1309
- /* @__PURE__ */ React3.createElement(SelectPrimitive.ItemText, null, children)
1310
+ /* @__PURE__ */ React37.createElement("span", { className: "absolute right-2 flex h-3.5 w-3.5 items-center justify-center" }, /* @__PURE__ */ React37.createElement(SelectPrimitive.ItemIndicator, null, /* @__PURE__ */ React37.createElement(Check, { className: "h-4 w-4" }))),
1311
+ /* @__PURE__ */ React37.createElement(SelectPrimitive.ItemText, null, children)
1310
1312
  ));
1311
1313
  SelectItem.displayName = SelectPrimitive.Item.displayName;
1312
- var SelectSeparator = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1314
+ var SelectSeparator = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1313
1315
  SelectPrimitive.Separator,
1314
1316
  {
1315
1317
  ref,
@@ -1318,8 +1320,8 @@ var SelectSeparator = React3.forwardRef(({ className, ...props }, ref) => /* @__
1318
1320
  }
1319
1321
  ));
1320
1322
  SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
1321
- var Separator3 = React3.forwardRef(
1322
- ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1323
+ var Separator3 = React37.forwardRef(
1324
+ ({ className, orientation = "horizontal", decorative = true, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1323
1325
  SeparatorPrimitive.Root,
1324
1326
  {
1325
1327
  ref,
@@ -1339,7 +1341,7 @@ var Sheet = DialogPrimitive.Root;
1339
1341
  var SheetTrigger = DialogPrimitive.Trigger;
1340
1342
  var SheetClose = DialogPrimitive.Close;
1341
1343
  var SheetPortal = DialogPrimitive.Portal;
1342
- var SheetOverlay = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1344
+ var SheetOverlay = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1343
1345
  DialogPrimitive.Overlay,
1344
1346
  {
1345
1347
  className: cn(
@@ -1367,21 +1369,21 @@ var sheetVariants = cva(
1367
1369
  }
1368
1370
  }
1369
1371
  );
1370
- var SheetContent = React3.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ React3.createElement(SheetPortal, null, /* @__PURE__ */ React3.createElement(SheetOverlay, null), /* @__PURE__ */ React3.createElement(
1372
+ var SheetContent = React37.forwardRef(({ side = "right", className, children, ...props }, ref) => /* @__PURE__ */ React37.createElement(SheetPortal, null, /* @__PURE__ */ React37.createElement(SheetOverlay, null), /* @__PURE__ */ React37.createElement(
1371
1373
  DialogPrimitive.Content,
1372
1374
  {
1373
1375
  ref,
1374
1376
  className: cn(sheetVariants({ side }), className),
1375
1377
  ...props
1376
1378
  },
1377
- /* @__PURE__ */ React3.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary" }, /* @__PURE__ */ React3.createElement(X, { className: "h-4 w-4" }), /* @__PURE__ */ React3.createElement("span", { className: "sr-only" }, "Close")),
1379
+ /* @__PURE__ */ React37.createElement(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary" }, /* @__PURE__ */ React37.createElement(X, { className: "h-4 w-4" }), /* @__PURE__ */ React37.createElement("span", { className: "sr-only" }, "Close")),
1378
1380
  children
1379
1381
  )));
1380
1382
  SheetContent.displayName = DialogPrimitive.Content.displayName;
1381
1383
  var SheetHeader = ({
1382
1384
  className,
1383
1385
  ...props
1384
- }) => /* @__PURE__ */ React3.createElement(
1386
+ }) => /* @__PURE__ */ React37.createElement(
1385
1387
  "div",
1386
1388
  {
1387
1389
  className: cn(
@@ -1395,7 +1397,7 @@ SheetHeader.displayName = "SheetHeader";
1395
1397
  var SheetFooter = ({
1396
1398
  className,
1397
1399
  ...props
1398
- }) => /* @__PURE__ */ React3.createElement(
1400
+ }) => /* @__PURE__ */ React37.createElement(
1399
1401
  "div",
1400
1402
  {
1401
1403
  className: cn(
@@ -1406,7 +1408,7 @@ var SheetFooter = ({
1406
1408
  }
1407
1409
  );
1408
1410
  SheetFooter.displayName = "SheetFooter";
1409
- var SheetTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1411
+ var SheetTitle = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1410
1412
  DialogPrimitive.Title,
1411
1413
  {
1412
1414
  ref,
@@ -1415,7 +1417,7 @@ var SheetTitle = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE_
1415
1417
  }
1416
1418
  ));
1417
1419
  SheetTitle.displayName = DialogPrimitive.Title.displayName;
1418
- var SheetDescription = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1420
+ var SheetDescription = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1419
1421
  DialogPrimitive.Description,
1420
1422
  {
1421
1423
  ref,
@@ -1424,8 +1426,8 @@ var SheetDescription = React3.forwardRef(({ className, ...props }, ref) => /* @_
1424
1426
  }
1425
1427
  ));
1426
1428
  SheetDescription.displayName = DialogPrimitive.Description.displayName;
1427
- var Textarea = React3.forwardRef(({ className, ...props }, ref) => {
1428
- return /* @__PURE__ */ React3.createElement(
1429
+ var Textarea = React37.forwardRef(({ className, ...props }, ref) => {
1430
+ return /* @__PURE__ */ React37.createElement(
1429
1431
  "textarea",
1430
1432
  {
1431
1433
  className: cn(
@@ -1441,7 +1443,7 @@ Textarea.displayName = "Textarea";
1441
1443
  var TooltipProvider = TooltipPrimitive.Provider;
1442
1444
  var Tooltip = TooltipPrimitive.Root;
1443
1445
  var TooltipTrigger = TooltipPrimitive.Trigger;
1444
- var TooltipContent = React3.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React3.createElement(TooltipPrimitive.Portal, null, /* @__PURE__ */ React3.createElement(
1446
+ var TooltipContent = React37.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ React37.createElement(TooltipPrimitive.Portal, null, /* @__PURE__ */ React37.createElement(
1445
1447
  TooltipPrimitive.Content,
1446
1448
  {
1447
1449
  ref,
@@ -1454,7 +1456,7 @@ var TooltipContent = React3.forwardRef(({ className, sideOffset = 4, ...props },
1454
1456
  }
1455
1457
  )));
1456
1458
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
1457
- var Avatar = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1459
+ var Avatar = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1458
1460
  AvatarPrimitive.Root,
1459
1461
  {
1460
1462
  ref,
@@ -1466,7 +1468,7 @@ var Avatar = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
1466
1468
  }
1467
1469
  ));
1468
1470
  Avatar.displayName = AvatarPrimitive.Root.displayName;
1469
- var AvatarImage = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1471
+ var AvatarImage = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1470
1472
  AvatarPrimitive.Image,
1471
1473
  {
1472
1474
  ref,
@@ -1475,7 +1477,7 @@ var AvatarImage = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE
1475
1477
  }
1476
1478
  ));
1477
1479
  AvatarImage.displayName = AvatarPrimitive.Image.displayName;
1478
- var AvatarFallback = React3.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React3.createElement(
1480
+ var AvatarFallback = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React37.createElement(
1479
1481
  AvatarPrimitive.Fallback,
1480
1482
  {
1481
1483
  ref,
@@ -1487,6 +1489,50 @@ var AvatarFallback = React3.forwardRef(({ className, ...props }, ref) => /* @__P
1487
1489
  }
1488
1490
  ));
1489
1491
  AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
1492
+ function buildGridColsClasses(columns) {
1493
+ return [
1494
+ "grid-cols-1",
1495
+ // 默认单列
1496
+ columns.sm ? `sm:grid-cols-${columns.sm}` : "",
1497
+ columns.md ? `md:grid-cols-${columns.md}` : "md:grid-cols-2",
1498
+ columns.lg ? `lg:grid-cols-${columns.lg}` : "lg:grid-cols-3",
1499
+ columns.xl ? `xl:grid-cols-${columns.xl}` : ""
1500
+ ].filter(Boolean).join(" ");
1501
+ }
1502
+ function getGapClassName(gap) {
1503
+ const gapClasses = {
1504
+ sm: "gap-3",
1505
+ md: "gap-6",
1506
+ lg: "gap-8",
1507
+ xl: "gap-10"
1508
+ };
1509
+ return gapClasses[gap];
1510
+ }
1511
+ function Grid({
1512
+ items,
1513
+ renderItem,
1514
+ columns = { md: 2, lg: 3 },
1515
+ gap = "md",
1516
+ className = "",
1517
+ style
1518
+ }) {
1519
+ const gridColsClasses = buildGridColsClasses(columns);
1520
+ const gapClass = getGapClassName(gap);
1521
+ return /* @__PURE__ */ React37__default.createElement(
1522
+ "div",
1523
+ {
1524
+ className: `grid ${gridColsClasses} ${gapClass} ${className}`.trim(),
1525
+ style
1526
+ },
1527
+ items.map((item, index) => /* @__PURE__ */ React37__default.createElement("div", { key: item.id }, renderItem(item, index)))
1528
+ );
1529
+ }
1530
+ var Timeline = ({ items = [] }) => {
1531
+ if (!items || items.length === 0) {
1532
+ return null;
1533
+ }
1534
+ return /* @__PURE__ */ React37__default.createElement("div", { className: "relative" }, /* @__PURE__ */ React37__default.createElement("div", { className: "absolute left-4 top-0 bottom-0 w-0.5 bg-gray-200" }), items.map((item, index) => /* @__PURE__ */ React37__default.createElement("div", { key: index, className: "relative pl-12 pb-8" }, /* @__PURE__ */ React37__default.createElement("div", { className: "absolute left-0 w-8 h-8 rounded-full bg-blue-500 border-4 border-white shadow-md flex items-center justify-center" }, /* @__PURE__ */ React37__default.createElement("div", { className: "w-2 h-2 rounded-full bg-white" })), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg p-4 shadow-md" }, /* @__PURE__ */ React37__default.createElement("div", { className: "text-sm text-gray-500 mb-2" }, item.date), /* @__PURE__ */ React37__default.createElement("h4", { className: "text-lg font-semibold mb-2" }, item.title), /* @__PURE__ */ React37__default.createElement("p", { className: "text-gray-600" }, item.description)))));
1535
+ };
1490
1536
  var CollisionBalls = ({
1491
1537
  collisionBallsConfig: {
1492
1538
  balls,
@@ -1748,7 +1794,7 @@ var CollisionBalls = ({
1748
1794
  y: (event.clientY - rect.top) * scaleY
1749
1795
  };
1750
1796
  };
1751
- return /* @__PURE__ */ React3__default.createElement("div", { style: { width: "100%", height: "100%", position: "relative", backgroundColor: "#f9fafb", borderRadius: "0.5rem" } }, /* @__PURE__ */ React3__default.createElement("div", { ref: containerRef, style: { width: "100%", height: "100%", position: "absolute", top: 0, left: 0 } }, /* @__PURE__ */ React3__default.createElement(
1797
+ return /* @__PURE__ */ React37__default.createElement("div", { style: { width: "100%", height: "100%", position: "relative", backgroundColor: "#f9fafb", borderRadius: "0.5rem" } }, /* @__PURE__ */ React37__default.createElement("div", { ref: containerRef, style: { width: "100%", height: "100%", position: "absolute", top: 0, left: 0 } }, /* @__PURE__ */ React37__default.createElement(
1752
1798
  "canvas",
1753
1799
  {
1754
1800
  ref: canvasRef,
@@ -1763,14 +1809,14 @@ var CollisionBalls = ({
1763
1809
  onMouseUp: handleMouseUp,
1764
1810
  onMouseLeave: handleMouseUp
1765
1811
  }
1766
- )), /* @__PURE__ */ React3__default.createElement("div", { className: "absolute bottom-4 right-4 flex gap-2" }, /* @__PURE__ */ React3__default.createElement(
1812
+ )), /* @__PURE__ */ React37__default.createElement("div", { className: "absolute bottom-4 right-4 flex gap-2" }, /* @__PURE__ */ React37__default.createElement(
1767
1813
  "button",
1768
1814
  {
1769
1815
  onClick: shake,
1770
1816
  className: `px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors ${isShaking ? "animate-pulse" : ""}`
1771
1817
  },
1772
1818
  "\u6447\u4E00\u6447"
1773
- ), /* @__PURE__ */ React3__default.createElement(
1819
+ ), /* @__PURE__ */ React37__default.createElement(
1774
1820
  "button",
1775
1821
  {
1776
1822
  onClick: slowdown,
@@ -1779,135 +1825,294 @@ var CollisionBalls = ({
1779
1825
  "\u51CF\u901F"
1780
1826
  )));
1781
1827
  };
1782
- var CollisionBalls_default = CollisionBalls;
1783
- var Timeline = ({ items = [] }) => {
1784
- if (!items || items.length === 0) {
1785
- return null;
1786
- }
1787
- return /* @__PURE__ */ React3__default.createElement("div", { className: "relative" }, /* @__PURE__ */ React3__default.createElement("div", { className: "absolute left-4 top-0 bottom-0 w-0.5 bg-gray-200" }), items.map((item, index) => /* @__PURE__ */ React3__default.createElement("div", { key: index, className: "relative pl-12 pb-8" }, /* @__PURE__ */ React3__default.createElement("div", { className: "absolute left-0 w-8 h-8 rounded-full bg-blue-500 border-4 border-white shadow-md flex items-center justify-center" }, /* @__PURE__ */ React3__default.createElement("div", { className: "w-2 h-2 rounded-full bg-white" })), /* @__PURE__ */ React3__default.createElement("div", { className: "bg-white rounded-lg p-4 shadow-md" }, /* @__PURE__ */ React3__default.createElement("div", { className: "text-sm text-gray-500 mb-2" }, item.date), /* @__PURE__ */ React3__default.createElement("h4", { className: "text-lg font-semibold mb-2" }, item.title), /* @__PURE__ */ React3__default.createElement("p", { className: "text-gray-600" }, item.description)))));
1788
- };
1789
- var Timeline_default = Timeline;
1790
- var Modal = ({
1791
- isOpen,
1792
- onClose,
1793
- title,
1794
- width = 400,
1795
- height = "auto",
1796
- maskClosable = true,
1797
- showCloseButton = true,
1828
+ function GenericOrderManager({
1829
+ operations,
1830
+ renderItem,
1798
1831
  className = "",
1799
- contentClassName = "",
1800
- zIndex = 1e3,
1801
- children
1802
- }) => {
1803
- const modalRef = useRef(null);
1804
- const [mounted, setMounted] = useState(false);
1832
+ title = "\u987A\u5E8F\u7BA1\u7406",
1833
+ description = "\u62D6\u62FD\u6216\u4F7F\u7528\u6309\u94AE\u8C03\u6574\u663E\u793A\u987A\u5E8F",
1834
+ onOrderChanged,
1835
+ emptyMessage = "\u6682\u65E0\u6570\u636E",
1836
+ loadingMessage = "\u52A0\u8F7D\u6570\u636E..."
1837
+ }) {
1838
+ const [items, setItems] = useState([]);
1839
+ const [originalOrder, setOriginalOrder] = useState([]);
1840
+ const [loading, setLoading] = useState(true);
1841
+ const [saving, setSaving] = useState(false);
1842
+ const [error, setError] = useState(null);
1843
+ const [hasChanges, setHasChanges] = useState(false);
1844
+ const [draggedItem, setDraggedItem] = useState(null);
1845
+ const loadItems = useCallback(async () => {
1846
+ try {
1847
+ setLoading(true);
1848
+ setError(null);
1849
+ const data = await operations.loadItems();
1850
+ setItems(data);
1851
+ setOriginalOrder([...data]);
1852
+ setHasChanges(false);
1853
+ } catch (err) {
1854
+ console.error("\u274C [\u901A\u7528\u6392\u5E8F] \u52A0\u8F7D\u6570\u636E\u9519\u8BEF:", err);
1855
+ setError(err instanceof Error ? err.message : "\u52A0\u8F7D\u6570\u636E\u5931\u8D25");
1856
+ } finally {
1857
+ setLoading(false);
1858
+ }
1859
+ }, [operations]);
1805
1860
  useEffect(() => {
1806
- setMounted(true);
1807
- return () => {
1808
- setMounted(false);
1809
- };
1810
- }, []);
1861
+ loadItems();
1862
+ }, [loadItems]);
1811
1863
  useEffect(() => {
1812
- const handleEscKey = (event) => {
1813
- if (event.key === "Escape" && isOpen) {
1814
- onClose();
1864
+ const hasOrderChanged = items.some(
1865
+ (item, index) => originalOrder[index]?.id !== item.id
1866
+ );
1867
+ setHasChanges(hasOrderChanged);
1868
+ }, [items, originalOrder]);
1869
+ const handleMoveUp = async (itemId) => {
1870
+ try {
1871
+ setError(null);
1872
+ const currentIndex = items.findIndex((item) => item.id === itemId);
1873
+ if (currentIndex === -1) {
1874
+ setError("\u9879\u76EE\u4E0D\u5B58\u5728");
1875
+ return;
1815
1876
  }
1816
- };
1817
- if (isOpen && typeof document !== "undefined" && document.body) {
1818
- document.body.style.overflow = "hidden";
1819
- document.addEventListener("keydown", handleEscKey);
1877
+ if (currentIndex === 0) {
1878
+ setError("\u9879\u76EE\u5DF2\u7ECF\u5728\u6700\u524D\u9762\uFF0C\u65E0\u6CD5\u4E0A\u79FB");
1879
+ return;
1880
+ }
1881
+ await operations.moveItemUp(itemId);
1882
+ await loadItems();
1883
+ onOrderChanged?.();
1884
+ } catch (err) {
1885
+ console.error("\u274C [\u901A\u7528\u6392\u5E8F] \u4E0A\u79FB\u9879\u76EE\u9519\u8BEF:", err);
1886
+ setError(err instanceof Error ? err.message : "\u4E0A\u79FB\u5931\u8D25");
1820
1887
  }
1821
- return () => {
1822
- try {
1823
- if (typeof document !== "undefined" && document.body) {
1824
- document.body.style.overflow = "";
1825
- document.removeEventListener("keydown", handleEscKey);
1826
- }
1827
- } catch (error) {
1828
- console.warn("\u6E05\u7406Modal\u4E8B\u4EF6\u76D1\u542C\u5668\u65F6\u51FA\u9519:", error);
1888
+ };
1889
+ const handleMoveDown = async (itemId) => {
1890
+ try {
1891
+ setError(null);
1892
+ const currentIndex = items.findIndex((item) => item.id === itemId);
1893
+ if (currentIndex === -1) {
1894
+ setError("\u9879\u76EE\u4E0D\u5B58\u5728");
1895
+ return;
1829
1896
  }
1830
- };
1831
- }, [isOpen, onClose]);
1832
- const handleMaskClick = (e) => {
1833
- if (maskClosable && e.target === e.currentTarget) {
1834
- onClose();
1897
+ if (currentIndex === items.length - 1) {
1898
+ setError("\u9879\u76EE\u5DF2\u7ECF\u5728\u6700\u540E\u9762\uFF0C\u65E0\u6CD5\u4E0B\u79FB");
1899
+ return;
1900
+ }
1901
+ await operations.moveItemDown(itemId);
1902
+ await loadItems();
1903
+ onOrderChanged?.();
1904
+ } catch (err) {
1905
+ console.error("\u274C [\u901A\u7528\u6392\u5E8F] \u4E0B\u79FB\u9879\u76EE\u9519\u8BEF:", err);
1906
+ setError(err instanceof Error ? err.message : "\u4E0B\u79FB\u5931\u8D25");
1835
1907
  }
1836
1908
  };
1837
- const modalStyle = {
1838
- width: typeof width === "number" ? `${width}px` : width,
1839
- height: typeof height === "number" ? `${height}px` : height,
1840
- zIndex
1909
+ const handleDragStart = (e, index) => {
1910
+ setDraggedItem(index);
1911
+ e.dataTransfer.effectAllowed = "move";
1841
1912
  };
1842
- if (!mounted || !isOpen) return null;
1843
- if (typeof document === "undefined" || !document.body) {
1844
- return null;
1845
- }
1846
- try {
1847
- return ReactDOM.createPortal(
1848
- /* @__PURE__ */ React3__default.createElement(
1849
- "div",
1850
- {
1851
- className: "fixed inset-0 bg-black/50 flex items-center justify-center z-[1000] animate-fade-in",
1852
- onClick: handleMaskClick
1853
- },
1854
- /* @__PURE__ */ React3__default.createElement(
1855
- "div",
1856
- {
1857
- className: cn(
1858
- "bg-white rounded-lg shadow-[0_4px_20px_rgba(0,0,0,0.15)] max-w-[90vw] max-h-[90vh] overflow-hidden flex flex-col animate-slide-up",
1859
- className
1860
- ),
1861
- style: modalStyle,
1862
- ref: modalRef
1863
- },
1864
- (title || showCloseButton) && /* @__PURE__ */ React3__default.createElement("div", { className: "flex justify-between items-center px-5 py-4 border-b border-gray-100" }, title && /* @__PURE__ */ React3__default.createElement("div", { className: "text-lg font-semibold text-gray-800 m-0" }, title), showCloseButton && /* @__PURE__ */ React3__default.createElement(
1865
- "button",
1866
- {
1867
- className: "bg-transparent border-none text-2xl leading-none text-gray-400 cursor-pointer p-0 m-0 w-6 h-6 flex items-center justify-center transition-colors hover:text-gray-800",
1868
- onClick: onClose
1869
- },
1870
- "\xD7"
1871
- )),
1872
- /* @__PURE__ */ React3__default.createElement("div", { className: cn("p-5 overflow-y-auto", contentClassName) }, children)
1873
- )
1874
- ),
1875
- document.body
1876
- );
1877
- } catch (error) {
1878
- console.error("Portal\u521B\u5EFA\u5931\u8D25:", error);
1879
- return null;
1913
+ const handleDragOver = (e, _index) => {
1914
+ e.preventDefault();
1915
+ e.dataTransfer.dropEffect = "move";
1916
+ };
1917
+ const handleDrop = async (e, dropIndex) => {
1918
+ e.preventDefault();
1919
+ if (draggedItem === null || draggedItem === dropIndex) {
1920
+ setDraggedItem(null);
1921
+ return;
1922
+ }
1923
+ try {
1924
+ setError(null);
1925
+ const newItems = [...items];
1926
+ const draggedItemData = newItems[draggedItem];
1927
+ if (!draggedItemData) return;
1928
+ newItems.splice(draggedItem, 1);
1929
+ newItems.splice(dropIndex, 0, draggedItemData);
1930
+ const itemOrders = newItems.map((item, index) => ({
1931
+ id: item.id,
1932
+ order: index
1933
+ }));
1934
+ await operations.updateItemOrder(itemOrders);
1935
+ await loadItems();
1936
+ onOrderChanged?.();
1937
+ } catch (err) {
1938
+ console.error("\u274C [\u901A\u7528\u6392\u5E8F] \u62D6\u62FD\u6392\u5E8F\u9519\u8BEF:", err);
1939
+ setError(err instanceof Error ? err.message : "\u6392\u5E8F\u5931\u8D25");
1940
+ } finally {
1941
+ setDraggedItem(null);
1942
+ }
1943
+ };
1944
+ const handleSaveOrder = async () => {
1945
+ try {
1946
+ setSaving(true);
1947
+ setError(null);
1948
+ const itemOrders = items.map((item, index) => ({
1949
+ id: item.id,
1950
+ order: index
1951
+ }));
1952
+ await operations.updateItemOrder(itemOrders);
1953
+ setOriginalOrder([...items]);
1954
+ setHasChanges(false);
1955
+ onOrderChanged?.();
1956
+ } catch (err) {
1957
+ console.error("\u274C [\u901A\u7528\u6392\u5E8F] \u4FDD\u5B58\u987A\u5E8F\u9519\u8BEF:", err);
1958
+ setError(err instanceof Error ? err.message : "\u4FDD\u5B58\u5931\u8D25");
1959
+ await loadItems();
1960
+ } finally {
1961
+ setSaving(false);
1962
+ }
1963
+ };
1964
+ const handleResetOrder = () => {
1965
+ setItems([...originalOrder]);
1966
+ };
1967
+ if (loading) {
1968
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn("flex flex-col items-center justify-center p-12 text-gray-500", className) }, /* @__PURE__ */ React37__default.createElement("div", { className: "w-6 h-6 border-2 border-gray-200 border-t-blue-500 rounded-full animate-spin mb-2" }), /* @__PURE__ */ React37__default.createElement("span", null, loadingMessage));
1880
1969
  }
1881
- };
1882
- var Modal_default = Modal;
1883
- var Avatar2 = ({
1884
- src,
1885
- alt,
1886
- size = 80,
1887
- borderColor,
1888
- className = ""
1889
- }) => {
1890
- return /* @__PURE__ */ React3__default.createElement(
1970
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn("bg-white rounded-xl p-6 shadow-md border-2 border-gray-100", className) }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center justify-between mb-4 pb-3 border-b border-gray-100 sm:flex-row flex-col sm:items-center items-start gap-4" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "m-0 text-gray-900 text-lg font-semibold" }, title), /* @__PURE__ */ React37__default.createElement("div", { className: "flex gap-3 w-full sm:w-auto" }, hasChanges && /* @__PURE__ */ React37__default.createElement(React37__default.Fragment, null, /* @__PURE__ */ React37__default.createElement(
1971
+ "button",
1972
+ {
1973
+ onClick: handleResetOrder,
1974
+ className: "flex items-center gap-2 bg-amber-500 hover:bg-amber-600 text-white px-4 py-2 rounded-lg font-medium transition-colors",
1975
+ title: "\u91CD\u7F6E\u4E3A\u539F\u59CB\u987A\u5E8F"
1976
+ },
1977
+ /* @__PURE__ */ React37__default.createElement(RotateCcw, { size: 16 }),
1978
+ "\u91CD\u7F6E"
1979
+ ), /* @__PURE__ */ React37__default.createElement(
1980
+ "button",
1981
+ {
1982
+ onClick: handleSaveOrder,
1983
+ disabled: saving,
1984
+ className: "flex items-center gap-2 bg-blue-500 hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed text-white px-4 py-2 rounded-lg font-medium transition-colors",
1985
+ title: "\u4FDD\u5B58\u65B0\u987A\u5E8F"
1986
+ },
1987
+ /* @__PURE__ */ React37__default.createElement(Save, { size: 16 }),
1988
+ saving ? "\u4FDD\u5B58\u4E2D..." : "\u4FDD\u5B58\u987A\u5E8F"
1989
+ )))), error && /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center gap-2 bg-red-50 text-red-600 p-3 rounded-lg mb-4 border border-red-200" }, /* @__PURE__ */ React37__default.createElement(AlertCircle, { size: 16 }), /* @__PURE__ */ React37__default.createElement("span", null, error)), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-slate-50 border border-slate-200 rounded-lg p-4 mb-6" }, /* @__PURE__ */ React37__default.createElement("p", { className: "m-0 mb-2 color-slate-500 text-sm" }, description), /* @__PURE__ */ React37__default.createElement("ul", { className: "m-0 pl-6 color-slate-500 text-sm list-disc" }, /* @__PURE__ */ React37__default.createElement("li", { className: "mb-1" }, "\u4F7F\u7528\u62D6\u62FD\uFF1A\u70B9\u51FB\u5E76\u62D6\u52A8 ", /* @__PURE__ */ React37__default.createElement(GripVertical, { size: 14, className: "inline-block align-middle text-gray-500" }), " \u56FE\u6807"), /* @__PURE__ */ React37__default.createElement("li", { className: "mb-1" }, "\u4F7F\u7528\u6309\u94AE\uFF1A\u70B9\u51FB ", /* @__PURE__ */ React37__default.createElement(ChevronUp, { size: 14, className: "inline-block align-middle text-gray-500" }), " \u6216 ", /* @__PURE__ */ React37__default.createElement(ChevronDown, { size: 14, className: "inline-block align-middle text-gray-500" }), " \u6309\u94AE"), /* @__PURE__ */ React37__default.createElement("li", null, '\u5B8C\u6210\u8C03\u6574\u540E\uFF0C\u70B9\u51FB"\u4FDD\u5B58\u987A\u5E8F"\u6309\u94AE\u4FDD\u5B58\u66F4\u6539'))), /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-col gap-3" }, items.map((item, index) => /* @__PURE__ */ React37__default.createElement(
1891
1990
  "div",
1892
1991
  {
1893
- className: cn("rounded-full overflow-hidden border-[3px] border-transparent", className),
1894
- style: {
1895
- width: `${size}px`,
1896
- height: `${size}px`,
1897
- borderColor: borderColor || "transparent"
1898
- }
1992
+ key: item.id,
1993
+ className: cn(
1994
+ "flex items-center gap-3 p-4 bg-gray-50 border-2 border-gray-200 rounded-lg transition-all hover:border-gray-300 hover:shadow-sm",
1995
+ draggedItem === index && "opacity-50 rotate-2 border-blue-500"
1996
+ ),
1997
+ draggable: true,
1998
+ onDragStart: (e) => handleDragStart(e, index),
1999
+ onDragOver: (e) => handleDragOver(e),
2000
+ onDrop: (e) => handleDrop(e, index)
1899
2001
  },
1900
- /* @__PURE__ */ React3__default.createElement("img", { src, alt, className: "w-full h-full object-cover" })
2002
+ /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center cursor-grab active:cursor-grabbing text-gray-400 p-1 rounded hover:text-gray-500 hover:bg-gray-100 transition-colors" }, /* @__PURE__ */ React37__default.createElement(GripVertical, { size: 20 })),
2003
+ /* @__PURE__ */ React37__default.createElement("div", { className: "flex-1 min-w-0" }, renderItem(item, index, index === 0, index === items.length - 1)),
2004
+ /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center mx-3" }, /* @__PURE__ */ React37__default.createElement("span", { className: "flex items-center justify-center w-8 h-8 bg-blue-500 text-white text-sm font-semibold rounded-full sm:w-8 sm:h-8 w-7 h-7 sm:text-sm text-xs" }, "#", index + 1)),
2005
+ /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-col gap-1 sm:flex-col flex-row" }, /* @__PURE__ */ React37__default.createElement(
2006
+ "button",
2007
+ {
2008
+ onClick: () => handleMoveUp(item.id),
2009
+ disabled: index === 0,
2010
+ className: "flex items-center justify-center w-8 h-8 p-0 border border-gray-300 bg-white text-gray-500 rounded cursor-pointer transition-all hover:bg-gray-100 hover:border-gray-400 hover:text-gray-700 disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-gray-50 sm:w-8 sm:h-8 w-7 h-7",
2011
+ title: "\u4E0A\u79FB"
2012
+ },
2013
+ /* @__PURE__ */ React37__default.createElement(ChevronUp, { size: 18 })
2014
+ ), /* @__PURE__ */ React37__default.createElement(
2015
+ "button",
2016
+ {
2017
+ onClick: () => handleMoveDown(item.id),
2018
+ disabled: index === items.length - 1,
2019
+ className: "flex items-center justify-center w-8 h-8 p-0 border border-gray-300 bg-white text-gray-500 rounded cursor-pointer transition-all hover:bg-gray-100 hover:border-gray-400 hover:text-gray-700 disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-gray-50 sm:w-8 sm:h-8 w-7 h-7",
2020
+ title: "\u4E0B\u79FB"
2021
+ },
2022
+ /* @__PURE__ */ React37__default.createElement(ChevronDown, { size: 18 })
2023
+ ))
2024
+ ))), items.length === 0 && /* @__PURE__ */ React37__default.createElement("div", { className: "text-center p-12 text-gray-400 italic" }, /* @__PURE__ */ React37__default.createElement("p", { className: "m-0" }, emptyMessage)));
2025
+ }
2026
+ var BackButton = ({ href, className = "" }) => {
2027
+ const router = useRouter();
2028
+ const handleClick = () => {
2029
+ if (href) {
2030
+ router.push(href);
2031
+ } else {
2032
+ router.back();
2033
+ }
2034
+ };
2035
+ return /* @__PURE__ */ React37__default.createElement(
2036
+ "button",
2037
+ {
2038
+ onClick: handleClick,
2039
+ className: cn(
2040
+ "inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors",
2041
+ className
2042
+ )
2043
+ },
2044
+ /* @__PURE__ */ React37__default.createElement(
2045
+ "svg",
2046
+ {
2047
+ className: "w-5 h-5 mr-2",
2048
+ fill: "none",
2049
+ stroke: "currentColor",
2050
+ viewBox: "0 0 24 24"
2051
+ },
2052
+ /* @__PURE__ */ React37__default.createElement(
2053
+ "path",
2054
+ {
2055
+ strokeLinecap: "round",
2056
+ strokeLinejoin: "round",
2057
+ strokeWidth: 2,
2058
+ d: "M10 19l-7-7m0 0l7-7m-7 7h18"
2059
+ }
2060
+ )
2061
+ ),
2062
+ "\u8FD4\u56DE"
1901
2063
  );
1902
2064
  };
1903
-
1904
- // src/components/popover/ProfileModal.tsx
2065
+ function getColorValue(bgClass) {
2066
+ const colorMap = {
2067
+ "bg-blue-500": "#3b82f6",
2068
+ "bg-green-500": "#10b981",
2069
+ "bg-red-500": "#ef4444",
2070
+ "bg-purple-500": "#8b5cf6",
2071
+ "bg-slate-500": "#64748b",
2072
+ "bg-emerald-500": "#10b981",
2073
+ "bg-orange-500": "#f97316"
2074
+ };
2075
+ return colorMap[bgClass] || "#3b82f6";
2076
+ }
2077
+ function FilterButtonGroup({
2078
+ label,
2079
+ value,
2080
+ options,
2081
+ onChange,
2082
+ className
2083
+ }) {
2084
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn("space-y-4", className) }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-lg font-semibold text-gray-800" }, label), /* @__PURE__ */ React37__default.createElement("div", { className: "flex gap-3" }, options.map((option) => {
2085
+ const isActive = value === option.value;
2086
+ return /* @__PURE__ */ React37__default.createElement(
2087
+ "button",
2088
+ {
2089
+ key: option.value,
2090
+ onClick: () => onChange(option.value),
2091
+ style: isActive ? { backgroundColor: getColorValue(option.activeColor.bg) } : void 0,
2092
+ className: cn(
2093
+ "flex-1 h-12 rounded-lg font-medium text-sm transition-all duration-200 ease-out focus:outline-none focus:ring-2 focus:ring-opacity-50 border",
2094
+ isActive ? "text-white border-transparent shadow-md focus:ring-white" : "bg-white text-gray-700 border-gray-200 shadow-sm hover:bg-gray-50 hover:border-gray-300 hover:shadow focus:ring-blue-300"
2095
+ )
2096
+ },
2097
+ /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center justify-center space-x-2" }, /* @__PURE__ */ React37__default.createElement("span", { className: "text-lg" }, option.icon), /* @__PURE__ */ React37__default.createElement("span", null, option.label), option.showCount && option.count !== void 0 && /* @__PURE__ */ React37__default.createElement("span", { className: cn(
2098
+ "text-xs font-semibold px-2 py-0.5 rounded-full min-w-[1.25rem] text-center",
2099
+ isActive ? "bg-white/20 text-white" : "bg-gray-100 text-gray-600"
2100
+ ) }, option.count))
2101
+ );
2102
+ })));
2103
+ }
2104
+ function SearchResultHint({ searchQuery, resultCount, className }) {
2105
+ if (!searchQuery) return null;
2106
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn("mb-6 p-4 bg-blue-50 border border-blue-200 rounded-lg", className) }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm text-blue-700" }, '\u641C\u7D22 "', /* @__PURE__ */ React37__default.createElement("span", { className: "font-medium" }, searchQuery), '" \u627E\u5230 ', resultCount, " \u4E2A\u7ED3\u679C"));
2107
+ }
1905
2108
  var themeStyles = {
1906
2109
  light: "",
1907
- dark: "bg-[#222] text-[#eee]",
1908
- blue: "bg-[#f0f8ff]"
2110
+ dark: "bg-[#222] text-[#eee] border-[#444]",
2111
+ blue: "bg-[#f0f8ff] border-[#1890ff]/20"
1909
2112
  };
1910
2113
  var ProfileModal = ({
2114
+ isOpen,
2115
+ onClose,
1911
2116
  data,
1912
2117
  showAvatar = true,
1913
2118
  showContacts = true,
@@ -1918,16 +2123,19 @@ var ProfileModal = ({
1918
2123
  onSocialLinkClick,
1919
2124
  onContactClick,
1920
2125
  themeName = "light",
1921
- ...modalProps
2126
+ className
1922
2127
  }) => {
1923
2128
  const renderSocialLinks = () => {
1924
2129
  if (!data.socialLinks || data.socialLinks.length === 0) return null;
1925
- return /* @__PURE__ */ React3__default.createElement("div", { className: "flex gap-3 mt-2" }, data.socialLinks.map((link, index) => /* @__PURE__ */ React3__default.createElement(
2130
+ return /* @__PURE__ */ React37__default.createElement("div", { className: "flex gap-3 mt-2" }, data.socialLinks.map((link, index) => /* @__PURE__ */ React37__default.createElement(
1926
2131
  "a",
1927
2132
  {
1928
2133
  key: index,
1929
2134
  href: link.url,
1930
- className: "w-8 h-8 flex items-center justify-center bg-gray-100 rounded-full text-gray-800 no-underline transition-all hover:bg-gray-200 hover:-translate-y-0.5",
2135
+ className: cn(
2136
+ "w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5",
2137
+ themeName === "dark" ? "bg-gray-800 text-gray-200 hover:bg-gray-700" : "bg-gray-100 text-gray-800 hover:bg-gray-200"
2138
+ ),
1931
2139
  title: link.type,
1932
2140
  target: "_blank",
1933
2141
  rel: "noopener noreferrer",
@@ -1938,84 +2146,72 @@ var ProfileModal = ({
1938
2146
  }
1939
2147
  }
1940
2148
  },
1941
- link.icon ? /* @__PURE__ */ React3__default.createElement("span", { className: "text-base" }, link.icon) : /* @__PURE__ */ React3__default.createElement("span", { className: "text-[10px] font-semibold" }, link.type)
2149
+ link.icon ? /* @__PURE__ */ React37__default.createElement("span", { className: "text-base" }, link.icon) : /* @__PURE__ */ React37__default.createElement("span", { className: "text-[10px] font-semibold" }, link.type)
1942
2150
  )));
1943
2151
  };
1944
2152
  const renderContacts = () => {
1945
2153
  if (!data.contacts || Object.keys(data.contacts).length === 0) return null;
1946
- return /* @__PURE__ */ React3__default.createElement("div", { className: "mt-4 border-t border-gray-100 pt-4" }, Object.entries(data.contacts).map(([type, value], index) => /* @__PURE__ */ React3__default.createElement(
2154
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn(
2155
+ "mt-4 border-t pt-4",
2156
+ themeName === "dark" ? "border-gray-800" : "border-gray-100"
2157
+ ) }, Object.entries(data.contacts).map(([type, value], index) => /* @__PURE__ */ React37__default.createElement(
1947
2158
  "div",
1948
2159
  {
1949
2160
  key: index,
1950
- className: "flex mb-2 cursor-pointer py-1.5 hover:bg-gray-50 transition-colors",
2161
+ className: cn(
2162
+ "flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors",
2163
+ themeName === "dark" ? "hover:bg-gray-800" : "hover:bg-gray-50"
2164
+ ),
1951
2165
  onClick: () => onContactClick && onContactClick(type, value)
1952
2166
  },
1953
- /* @__PURE__ */ React3__default.createElement("span", { className: "font-medium text-gray-500 w-[70px] shrink-0" }, type, ":"),
1954
- /* @__PURE__ */ React3__default.createElement("span", { className: "text-gray-800" }, value)
2167
+ /* @__PURE__ */ React37__default.createElement("span", { className: cn(
2168
+ "font-medium w-[70px] shrink-0",
2169
+ themeName === "dark" ? "text-gray-400" : "text-gray-500"
2170
+ ) }, type, ":"),
2171
+ /* @__PURE__ */ React37__default.createElement("span", { className: themeName === "dark" ? "text-gray-200" : "text-gray-800" }, value)
1955
2172
  )));
1956
2173
  };
1957
- return /* @__PURE__ */ React3__default.createElement(
1958
- Modal_default,
2174
+ return /* @__PURE__ */ React37__default.createElement(Dialog, { open: isOpen, onOpenChange: (open) => !open && onClose() }, /* @__PURE__ */ React37__default.createElement(DialogContent, { className: cn(
2175
+ "sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl",
2176
+ themeStyles[themeName] || "",
2177
+ className
2178
+ ) }, /* @__PURE__ */ React37__default.createElement("div", { className: "p-6" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex gap-5 mb-5" }, showAvatar && /* @__PURE__ */ React37__default.createElement(
2179
+ "div",
1959
2180
  {
1960
- ...modalProps,
1961
- title: "",
1962
- className: cn("w-[500px]", themeStyles[themeName] || "")
2181
+ className: "shrink-0",
2182
+ onClick: onAvatarClick,
2183
+ style: { cursor: onAvatarClick ? "pointer" : "default" }
1963
2184
  },
1964
- /* @__PURE__ */ React3__default.createElement("div", { className: "flex gap-5 mb-5" }, showAvatar && data.avatar && /* @__PURE__ */ React3__default.createElement(
1965
- "div",
1966
- {
1967
- className: "shrink-0",
1968
- onClick: onAvatarClick,
1969
- style: { cursor: onAvatarClick ? "pointer" : "default" }
1970
- },
1971
- /* @__PURE__ */ React3__default.createElement(
1972
- Avatar2,
1973
- {
1974
- src: data.avatar,
1975
- alt: data.name,
1976
- size: avatarSize
1977
- }
1978
- )
1979
- ), /* @__PURE__ */ React3__default.createElement("div", { className: "flex-1 min-w-0" }, /* @__PURE__ */ React3__default.createElement("h2", { className: "text-2xl font-semibold m-0 mb-1 text-gray-800" }, data.name), data.title && /* @__PURE__ */ React3__default.createElement("div", { className: "text-sm text-gray-500 mb-2" }, data.title), showSocial && renderSocialLinks())),
1980
- showBio && data.bio && /* @__PURE__ */ React3__default.createElement("div", { className: "mb-5 leading-relaxed text-gray-600" }, /* @__PURE__ */ React3__default.createElement("p", null, data.bio)),
1981
- showContacts && renderContacts(),
1982
- data.customContent && /* @__PURE__ */ React3__default.createElement("div", { className: "mt-5" }, data.customContent)
1983
- );
2185
+ /* @__PURE__ */ React37__default.createElement(Avatar, { className: "border-2 border-primary/10 shadow-sm", style: { width: avatarSize, height: avatarSize } }, data.avatar && /* @__PURE__ */ React37__default.createElement(AvatarImage, { src: data.avatar, alt: data.name, className: "object-cover" }), /* @__PURE__ */ React37__default.createElement(AvatarFallback, { className: "text-xl" }, data.name.substring(0, 2).toUpperCase()))
2186
+ ), /* @__PURE__ */ React37__default.createElement("div", { className: "flex-1 min-w-0 flex flex-col justify-center" }, /* @__PURE__ */ React37__default.createElement("h2", { className: cn(
2187
+ "text-2xl font-bold m-0 mb-1",
2188
+ themeName === "dark" ? "text-white" : "text-gray-900"
2189
+ ) }, data.name), data.title && /* @__PURE__ */ React37__default.createElement("div", { className: cn(
2190
+ "text-sm mb-2",
2191
+ themeName === "dark" ? "text-gray-400" : "text-gray-500"
2192
+ ) }, data.title), showSocial && renderSocialLinks())), showBio && data.bio && /* @__PURE__ */ React37__default.createElement("div", { className: cn(
2193
+ "mb-5 leading-relaxed text-sm",
2194
+ themeName === "dark" ? "text-gray-300" : "text-gray-600"
2195
+ ) }, /* @__PURE__ */ React37__default.createElement("p", null, data.bio)), showContacts && renderContacts(), data.customContent && /* @__PURE__ */ React37__default.createElement("div", { className: "mt-5" }, data.customContent))));
1984
2196
  };
1985
2197
  var ProfileModal_default = ProfileModal;
1986
-
1987
- // src/components/popover/internal/Badge.tsx
1988
- var badgeTypeStyles = {
1989
- default: "bg-gray-100 text-gray-600",
1990
- primary: "bg-blue-50 text-blue-600",
1991
- success: "bg-green-50 text-green-600",
1992
- warning: "bg-yellow-50 text-yellow-600",
1993
- danger: "bg-red-50 text-red-600",
1994
- info: "bg-blue-50 text-blue-600"
1995
- };
1996
- var Badge2 = ({
1997
- label,
1998
- type = "default",
1999
- icon,
2000
- className = ""
2001
- }) => {
2002
- return /* @__PURE__ */ React.createElement("span", { className: cn(
2003
- "inline-flex items-center px-2 py-1 rounded text-xs font-medium",
2004
- badgeTypeStyles[type] || badgeTypeStyles.default,
2005
- className
2006
- ) }, icon && /* @__PURE__ */ React.createElement("span", { className: "mr-1 flex items-center" }, icon), /* @__PURE__ */ React.createElement("span", null, label));
2007
- };
2008
-
2009
- // src/components/popover/internal/BadgeList.tsx
2010
2198
  var BadgeList = ({
2011
2199
  badges,
2012
2200
  className = ""
2013
2201
  }) => {
2014
2202
  if (!badges || badges.length === 0) return null;
2015
- return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-wrap gap-2 mt-4", className) }, badges.map((badge, index) => /* @__PURE__ */ React.createElement(Badge2, { key: index, ...badge })));
2203
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn("flex flex-wrap gap-2 mt-4", className) }, badges.map((badge, index) => /* @__PURE__ */ React37__default.createElement(
2204
+ Badge,
2205
+ {
2206
+ key: index,
2207
+ variant: badge.type === "default" ? "default" : badge.type
2208
+ },
2209
+ badge.icon && /* @__PURE__ */ React37__default.createElement("span", { className: "mr-1" }, badge.icon),
2210
+ badge.label
2211
+ )));
2016
2212
  };
2017
2213
 
2018
- // src/components/popover/internal/Stat.tsx
2214
+ // src/features/profile/internal/Stat.tsx
2019
2215
  var Stat = ({
2020
2216
  label,
2021
2217
  value,
@@ -2025,7 +2221,7 @@ var Stat = ({
2025
2221
  return /* @__PURE__ */ React.createElement("div", { className: cn("flex flex-col items-center flex-1 text-center", className) }, icon && /* @__PURE__ */ React.createElement("span", { className: "mb-2 text-2xl text-gray-400" }, icon), /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { className: "text-lg font-semibold text-gray-800" }, value), /* @__PURE__ */ React.createElement("div", { className: "text-xs text-gray-400 mt-1" }, label)));
2026
2222
  };
2027
2223
 
2028
- // src/components/popover/internal/StatList.tsx
2224
+ // src/features/profile/internal/StatList.tsx
2029
2225
  var StatList = ({
2030
2226
  stats,
2031
2227
  className = ""
@@ -2034,7 +2230,7 @@ var StatList = ({
2034
2230
  return /* @__PURE__ */ React.createElement("div", { className: cn("flex justify-between mt-4 pt-4 border-t border-gray-100", className) }, stats.map((stat, index) => /* @__PURE__ */ React.createElement(Stat, { key: index, ...stat })));
2035
2231
  };
2036
2232
 
2037
- // src/components/popover/ProfileButton.tsx
2233
+ // src/features/profile/ProfileButton.tsx
2038
2234
  var exampleProfileData = {
2039
2235
  name: "\u5F20\u4E09",
2040
2236
  avatar: "https://randomuser.me/api/portraits/men/32.jpg",
@@ -2061,12 +2257,14 @@ var exampleProfileData = {
2061
2257
  { label: "\u7C89\u4E1D", value: 1024 },
2062
2258
  { label: "\u8BC4\u5206", value: "4.9" }
2063
2259
  ],
2064
- customContent: /* @__PURE__ */ React3__default.createElement("div", { style: { marginTop: 20, borderTop: "1px solid #eee", paddingTop: 15 } }, /* @__PURE__ */ React3__default.createElement("h3", { style: { fontSize: 16, marginBottom: 10 } }, "\u4E13\u4E1A\u6280\u80FD"), /* @__PURE__ */ React3__default.createElement("p", { style: { margin: 0, lineHeight: 1.6 } }, "\u7CBE\u901AReact\u3001Vue\u3001Angular\u7B49\u524D\u7AEF\u6846\u67B6\uFF0C\u719F\u6089TypeScript\u3001JavaScript\u3001CSS3\u3001HTML5\u7B49\u524D\u7AEF\u6280\u672F\u3002 \u6709\u4E30\u5BCC\u7684\u5927\u578B\u9879\u76EE\u5F00\u53D1\u7ECF\u9A8C\uFF0C\u80FD\u72EC\u7ACB\u8D1F\u8D23\u524D\u7AEF\u67B6\u6784\u8BBE\u8BA1\u3002"))
2260
+ customContent: /* @__PURE__ */ React37__default.createElement("div", { className: "mt-5 border-t border-gray-100 pt-4" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-sm font-semibold mb-2" }, "\u4E13\u4E1A\u6280\u80FD"), /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm text-gray-600 leading-relaxed" }, "\u7CBE\u901AReact\u3001Vue\u3001Angular\u7B49\u524D\u7AEF\u6846\u67B6\uFF0C\u719F\u6089TypeScript\u3001JavaScript\u3001CSS3\u3001HTML5\u7B49\u524D\u7AEF\u6280\u672F\u3002 \u6709\u4E30\u5BCC\u7684\u5927\u578B\u9879\u76EE\u5F00\u53D1\u7ECF\u9A8C\uFF0C\u80FD\u72EC\u7ACB\u8D1F\u8D23\u524D\u7AEF\u67B6\u6784\u8BBE\u8BA1\u3002"))
2065
2261
  };
2066
2262
  var ProfileButton = ({
2067
2263
  data = exampleProfileData,
2068
2264
  buttonText = "\u67E5\u770B\u4E2A\u4EBA\u4FE1\u606F",
2069
- buttonClassName = "",
2265
+ variant = "default",
2266
+ size = "default",
2267
+ className = "",
2070
2268
  modalTheme = "light"
2071
2269
  }) => {
2072
2270
  const [isModalOpen, setIsModalOpen] = useState(false);
@@ -2079,7 +2277,16 @@ var ProfileButton = ({
2079
2277
  window.open(`tel:${value}`);
2080
2278
  }
2081
2279
  };
2082
- return /* @__PURE__ */ React3__default.createElement(React3__default.Fragment, null, /* @__PURE__ */ React3__default.createElement("button", { onClick: openModal, className: buttonClassName }, buttonText), /* @__PURE__ */ React3__default.createElement(
2280
+ return /* @__PURE__ */ React37__default.createElement(React37__default.Fragment, null, /* @__PURE__ */ React37__default.createElement(
2281
+ Button,
2282
+ {
2283
+ variant,
2284
+ size,
2285
+ onClick: openModal,
2286
+ className
2287
+ },
2288
+ buttonText
2289
+ ), /* @__PURE__ */ React37__default.createElement(
2083
2290
  ProfileModal_default,
2084
2291
  {
2085
2292
  isOpen: isModalOpen,
@@ -2090,11 +2297,10 @@ var ProfileButton = ({
2090
2297
  onSocialLinkClick: (url) => window.open(url, "_blank")
2091
2298
  },
2092
2299
  data.customContent,
2093
- data.badges && /* @__PURE__ */ React3__default.createElement(BadgeList, { badges: data.badges }),
2094
- data.stats && /* @__PURE__ */ React3__default.createElement(StatList, { stats: data.stats })
2300
+ data.badges && /* @__PURE__ */ React37__default.createElement(BadgeList, { badges: data.badges }),
2301
+ data.stats && /* @__PURE__ */ React37__default.createElement(StatList, { stats: data.stats })
2095
2302
  ));
2096
2303
  };
2097
- var ProfileButton_default = ProfileButton;
2098
2304
  var AutoOpenModal = ({
2099
2305
  data,
2100
2306
  delay = 500,
@@ -2122,7 +2328,7 @@ var AutoOpenModal = ({
2122
2328
  window.open(`tel:${value}`);
2123
2329
  }
2124
2330
  };
2125
- return /* @__PURE__ */ React3__default.createElement(
2331
+ return /* @__PURE__ */ React37__default.createElement(
2126
2332
  ProfileModal_default,
2127
2333
  {
2128
2334
  isOpen: isModalOpen,
@@ -2132,11 +2338,299 @@ var AutoOpenModal = ({
2132
2338
  onContactClick: handleContactClick,
2133
2339
  onSocialLinkClick: (url) => window.open(url, "_blank")
2134
2340
  },
2135
- data.badges && /* @__PURE__ */ React3__default.createElement(BadgeList, { badges: data.badges }),
2136
- data.stats && /* @__PURE__ */ React3__default.createElement(StatList, { stats: data.stats })
2341
+ data.badges && /* @__PURE__ */ React37__default.createElement(BadgeList, { badges: data.badges }),
2342
+ data.stats && /* @__PURE__ */ React37__default.createElement(StatList, { stats: data.stats })
2137
2343
  );
2138
2344
  };
2139
- var AutoOpenModal_default = AutoOpenModal;
2345
+ var sizeMap = {
2346
+ small: "h-8 w-8",
2347
+ medium: "h-12 w-12",
2348
+ large: "h-16 w-16"
2349
+ };
2350
+ var moodColors = {
2351
+ online: "bg-green-500",
2352
+ offline: "bg-gray-500",
2353
+ away: "bg-yellow-500"
2354
+ };
2355
+ var EnhancedAvatar = ({
2356
+ src,
2357
+ name,
2358
+ size = "medium",
2359
+ mood = "online",
2360
+ statusText,
2361
+ onClick,
2362
+ className
2363
+ }) => {
2364
+ const sizeClass = typeof size === "string" ? sizeMap[size] : "";
2365
+ const customSizeStyle = typeof size === "number" ? { width: size, height: size } : {};
2366
+ return /* @__PURE__ */ React37__default.createElement("div", { className: cn("relative inline-block", className), onClick }, /* @__PURE__ */ React37__default.createElement(Avatar, { className: cn(sizeClass, onClick && "cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all"), style: customSizeStyle }, src && /* @__PURE__ */ React37__default.createElement(AvatarImage, { src, alt: name || "Avatar", className: "object-cover" }), /* @__PURE__ */ React37__default.createElement(AvatarFallback, { className: "bg-primary/10 text-primary-foreground" }, name ? name.substring(0, 2).toUpperCase() : "??")), mood && /* @__PURE__ */ React37__default.createElement(
2367
+ "div",
2368
+ {
2369
+ className: cn(
2370
+ "absolute bottom-0 right-0 rounded-full border-2 border-white",
2371
+ moodColors[mood],
2372
+ typeof size === "number" ? size > 60 ? "h-4 w-4" : "h-3 w-3" : size === "large" ? "h-4 w-4" : "h-3 w-3"
2373
+ )
2374
+ }
2375
+ ), statusText && /* @__PURE__ */ React37__default.createElement("div", { className: "absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap" }, /* @__PURE__ */ React37__default.createElement("span", { className: "text-xs text-muted-foreground" }, statusText)));
2376
+ };
2377
+ var About = ({
2378
+ timelineConfig,
2379
+ collisionBallsConfig
2380
+ }) => {
2381
+ return /* @__PURE__ */ React37__default.createElement("section", { id: "about", className: "py-16 bg-white" }, /* @__PURE__ */ React37__default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React37__default.createElement("h2", { className: "text-3xl font-bold text-center mb-12" }, "\u5173\u4E8E\u6211"), /* @__PURE__ */ React37__default.createElement("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-12" }, /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u4E2A\u4EBA\u7ECF\u5386"), /* @__PURE__ */ React37__default.createElement(Timeline, { items: timelineConfig.items })), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-2xl font-semibold mb-6" }, "\u6280\u80FD\u5C55\u793A"), /* @__PURE__ */ React37__default.createElement("div", { style: { height: "400px", position: "relative" } }, /* @__PURE__ */ React37__default.createElement(CollisionBalls, { collisionBallsConfig }))))));
2382
+ };
2383
+ var About_default = About;
2384
+ var Contact = () => {
2385
+ const [formData, setFormData] = useState({
2386
+ name: "",
2387
+ email: "",
2388
+ message: ""
2389
+ });
2390
+ const [isSubmitting, setIsSubmitting] = useState(false);
2391
+ const [submitStatus, setSubmitStatus] = useState("idle");
2392
+ const handleChange = (e) => {
2393
+ const { name, value } = e.target;
2394
+ setFormData((prev) => ({
2395
+ ...prev,
2396
+ [name]: value
2397
+ }));
2398
+ };
2399
+ const handleSubmit = async (e) => {
2400
+ e.preventDefault();
2401
+ setIsSubmitting(true);
2402
+ setSubmitStatus("idle");
2403
+ try {
2404
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
2405
+ setSubmitStatus("success");
2406
+ setFormData({ name: "", email: "", message: "" });
2407
+ } catch (error) {
2408
+ setSubmitStatus("error");
2409
+ } finally {
2410
+ setIsSubmitting(false);
2411
+ }
2412
+ };
2413
+ return /* @__PURE__ */ React37__default.createElement("section", { id: "contact", className: "py-16 bg-gray-50" }, /* @__PURE__ */ React37__default.createElement("div", { className: "max-w-4xl mx-auto px-4 sm:px-6 lg:px-8" }, /* @__PURE__ */ React37__default.createElement("div", { className: "text-center mb-12" }, /* @__PURE__ */ React37__default.createElement("h2", { className: "text-3xl font-bold text-gray-900 sm:text-4xl" }, "\u8054\u7CFB\u6211"), /* @__PURE__ */ React37__default.createElement("p", { className: "mt-4 text-lg text-gray-600" }, "\u6709\u4EFB\u4F55\u95EE\u9898\u6216\u5EFA\u8BAE\uFF1F\u8BF7\u968F\u65F6\u8054\u7CFB\u6211")), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg shadow-xl p-6 sm:p-8" }, /* @__PURE__ */ React37__default.createElement("form", { onSubmit: handleSubmit, className: "space-y-6" }, /* @__PURE__ */ React37__default.createElement("div", null, /* @__PURE__ */ React37__default.createElement("label", { htmlFor: "name", className: "block text-sm font-medium text-gray-700" }, "\u59D3\u540D"), /* @__PURE__ */ React37__default.createElement(
2414
+ "input",
2415
+ {
2416
+ type: "text",
2417
+ name: "name",
2418
+ id: "name",
2419
+ value: formData.name,
2420
+ onChange: handleChange,
2421
+ required: true,
2422
+ className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
2423
+ placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u59D3\u540D"
2424
+ }
2425
+ )), /* @__PURE__ */ React37__default.createElement("div", null, /* @__PURE__ */ React37__default.createElement("label", { htmlFor: "email", className: "block text-sm font-medium text-gray-700" }, "\u90AE\u7BB1"), /* @__PURE__ */ React37__default.createElement(
2426
+ "input",
2427
+ {
2428
+ type: "email",
2429
+ name: "email",
2430
+ id: "email",
2431
+ value: formData.email,
2432
+ onChange: handleChange,
2433
+ required: true,
2434
+ className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
2435
+ placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u90AE\u7BB1"
2436
+ }
2437
+ )), /* @__PURE__ */ React37__default.createElement("div", null, /* @__PURE__ */ React37__default.createElement("label", { htmlFor: "message", className: "block text-sm font-medium text-gray-700" }, "\u6D88\u606F"), /* @__PURE__ */ React37__default.createElement(
2438
+ "textarea",
2439
+ {
2440
+ name: "message",
2441
+ id: "message",
2442
+ rows: 4,
2443
+ value: formData.message,
2444
+ onChange: handleChange,
2445
+ required: true,
2446
+ className: "mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm",
2447
+ placeholder: "\u8BF7\u8F93\u5165\u60A8\u7684\u6D88\u606F"
2448
+ }
2449
+ )), /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center justify-end" }, /* @__PURE__ */ React37__default.createElement(
2450
+ "button",
2451
+ {
2452
+ type: "submit",
2453
+ disabled: isSubmitting,
2454
+ className: `inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white
2455
+ ${isSubmitting ? "bg-blue-400 cursor-not-allowed" : "bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"}`
2456
+ },
2457
+ isSubmitting ? "\u53D1\u9001\u4E2D..." : "\u53D1\u9001\u6D88\u606F"
2458
+ )), submitStatus === "success" && /* @__PURE__ */ React37__default.createElement("div", { className: "rounded-md bg-green-50 p-4" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React37__default.createElement("svg", { className: "h-5 w-5 text-green-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React37__default.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z", clipRule: "evenodd" }))), /* @__PURE__ */ React37__default.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm font-medium text-green-800" }, "\u6D88\u606F\u5DF2\u6210\u529F\u53D1\u9001\uFF01")))), submitStatus === "error" && /* @__PURE__ */ React37__default.createElement("div", { className: "rounded-md bg-red-50 p-4" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex-shrink-0" }, /* @__PURE__ */ React37__default.createElement("svg", { className: "h-5 w-5 text-red-400", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React37__default.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" }))), /* @__PURE__ */ React37__default.createElement("div", { className: "ml-3" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm font-medium text-red-800" }, "\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5")))))), /* @__PURE__ */ React37__default.createElement("div", { className: "mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3" }, /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React37__default.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React37__default.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React37__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" }))), /* @__PURE__ */ React37__default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u90AE\u7BB1"), /* @__PURE__ */ React37__default.createElement("p", { className: "mt-2 text-gray-600" }, "your.email@example.com")), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React37__default.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React37__default.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React37__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" }))), /* @__PURE__ */ React37__default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u7535\u8BDD"), /* @__PURE__ */ React37__default.createElement("p", { className: "mt-2 text-gray-600" }, "+86 123 4567 8900")), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-white rounded-lg shadow-lg p-6 text-center" }, /* @__PURE__ */ React37__default.createElement("div", { className: "text-blue-600 mb-4" }, /* @__PURE__ */ React37__default.createElement("svg", { className: "h-8 w-8 mx-auto", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24" }, /* @__PURE__ */ React37__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" }), /* @__PURE__ */ React37__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "2", d: "M15 11a3 3 0 11-6 0 3 3 0 016 0z" }))), /* @__PURE__ */ React37__default.createElement("h3", { className: "text-lg font-medium text-gray-900" }, "\u5730\u5740"), /* @__PURE__ */ React37__default.createElement("p", { className: "mt-2 text-gray-600" }, "\u4E2D\u56FD\uFF0C\u5317\u4EAC")))));
2459
+ };
2460
+ var Contact_default = Contact;
2461
+ var Home = ({ homeConfig, className }) => {
2462
+ const { title, subtitle, buttons, imageSrc } = homeConfig;
2463
+ const [displayText, setDisplayText] = useState("");
2464
+ const [currentIndex, setCurrentIndex] = useState(0);
2465
+ useEffect(() => {
2466
+ if (currentIndex < title.length) {
2467
+ const timer = setTimeout(() => {
2468
+ setDisplayText((prev) => prev + title[currentIndex]);
2469
+ setCurrentIndex((prev) => prev + 1);
2470
+ }, 150);
2471
+ return () => clearTimeout(timer);
2472
+ }
2473
+ return () => {
2474
+ setDisplayText("");
2475
+ setCurrentIndex(0);
2476
+ };
2477
+ }, [currentIndex, title]);
2478
+ return /* @__PURE__ */ React37__default.createElement(
2479
+ "section",
2480
+ {
2481
+ id: "home",
2482
+ className: cn("min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50", className)
2483
+ },
2484
+ /* @__PURE__ */ React37__default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-col md:flex-row items-center gap-12" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex-1 text-center md:text-left" }, /* @__PURE__ */ React37__default.createElement("h1", { className: "text-4xl md:text-6xl font-bold mb-6 text-gray-900" }, /* @__PURE__ */ React37__default.createElement("span", { className: "inline-block" }, displayText), /* @__PURE__ */ React37__default.createElement("span", { className: "animate-pulse ml-1 text-blue-500" }, "|")), /* @__PURE__ */ React37__default.createElement("p", { className: "text-xl md:text-2xl text-gray-600 mb-8" }, subtitle), /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-wrap gap-4 justify-center md:justify-start" }, buttons.map((button) => /* @__PURE__ */ React37__default.createElement(
2485
+ "a",
2486
+ {
2487
+ key: button.link,
2488
+ href: button.link,
2489
+ className: "px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium"
2490
+ },
2491
+ button.text
2492
+ )))), /* @__PURE__ */ React37__default.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React37__default.createElement("div", { className: "relative group" }, /* @__PURE__ */ React37__default.createElement("div", { className: "absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200" }), /* @__PURE__ */ React37__default.createElement(
2493
+ "img",
2494
+ {
2495
+ src: imageSrc,
2496
+ alt: "Profile",
2497
+ className: "relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white"
2498
+ }
2499
+ )))))
2500
+ );
2501
+ };
2502
+ var Home_default = Home;
2503
+ var ExperimentCard = ({
2504
+ href,
2505
+ title,
2506
+ description,
2507
+ tags,
2508
+ category,
2509
+ isCompleted,
2510
+ updatedAt,
2511
+ createdAt,
2512
+ className
2513
+ }) => {
2514
+ const formatDate = (dateString) => {
2515
+ if (!dateString) return "";
2516
+ try {
2517
+ const date = new Date(dateString);
2518
+ return date.toLocaleDateString("zh-CN", {
2519
+ year: "numeric",
2520
+ month: "2-digit",
2521
+ day: "2-digit"
2522
+ });
2523
+ } catch (e) {
2524
+ return dateString;
2525
+ }
2526
+ };
2527
+ return /* @__PURE__ */ React37__default.createElement(Link, { href, className: cn("block group", className) }, /* @__PURE__ */ React37__default.createElement("div", { className: "w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200" }, /* @__PURE__ */ React37__default.createElement("div", { className: "p-6" }, /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-start justify-between mb-4" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight" }, title), /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-col gap-2 flex-shrink-0" }, /* @__PURE__ */ React37__default.createElement("span", { className: cn(
2528
+ "px-3 py-1.5 text-xs font-medium rounded-full shadow-sm",
2529
+ category === "utility" ? "bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200" : "bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200"
2530
+ ) }, category === "utility" ? "\u{1F527} \u5B9E\u7528\u5DE5\u5177" : "\u{1F3AE} \u4F11\u95F2\u5A31\u4E50"), /* @__PURE__ */ React37__default.createElement("span", { className: cn(
2531
+ "px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border",
2532
+ isCompleted ? "bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200" : "bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200"
2533
+ ) }, isCompleted ? "\u2705 \u5DF2\u5B8C\u6210" : "\u{1F6A7} \u8FDB\u884C\u4E2D"))), /* @__PURE__ */ React37__default.createElement("p", { className: "text-gray-600 mb-4" }, description), updatedAt && /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center gap-1 mb-3 text-xs text-gray-500" }, /* @__PURE__ */ React37__default.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor" }, /* @__PURE__ */ React37__default.createElement("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" })), /* @__PURE__ */ React37__default.createElement("span", null, "\u66F4\u65B0\u4E8E: ", formatDate(updatedAt)), createdAt && createdAt !== updatedAt && /* @__PURE__ */ React37__default.createElement("span", { className: "ml-2 text-gray-400" }, "\u521B\u5EFA\u4E8E: ", formatDate(createdAt))), /* @__PURE__ */ React37__default.createElement("div", { className: "flex flex-wrap gap-2" }, tags.map((tag) => /* @__PURE__ */ React37__default.createElement(
2534
+ "span",
2535
+ {
2536
+ key: tag,
2537
+ className: "px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200"
2538
+ },
2539
+ "#",
2540
+ tag
2541
+ ))))));
2542
+ };
2543
+ var ProjectCarousel = ({ projects, className }) => {
2544
+ const [currentIndex, setCurrentIndex] = useState(0);
2545
+ const nextSlide = () => {
2546
+ setCurrentIndex(
2547
+ (prevIndex) => prevIndex === projects.length - 1 ? 0 : prevIndex + 1
2548
+ );
2549
+ };
2550
+ const prevSlide = () => {
2551
+ setCurrentIndex(
2552
+ (prevIndex) => prevIndex === 0 ? projects.length - 1 : prevIndex - 1
2553
+ );
2554
+ };
2555
+ return /* @__PURE__ */ React37__default.createElement("section", { id: "projects", className: cn("py-16 bg-gray-50", className) }, /* @__PURE__ */ React37__default.createElement("div", { className: "container mx-auto px-4" }, /* @__PURE__ */ React37__default.createElement("h2", { className: "text-3xl font-bold text-center mb-12 text-gray-900" }, "\u9879\u76EE\u5C55\u793A"), /* @__PURE__ */ React37__default.createElement("div", { className: "relative max-w-4xl mx-auto" }, /* @__PURE__ */ React37__default.createElement("div", { className: "relative h-[400px] overflow-hidden rounded-lg shadow-xl" }, projects.map((project, index) => /* @__PURE__ */ React37__default.createElement(
2556
+ "div",
2557
+ {
2558
+ key: project.id,
2559
+ className: cn(
2560
+ "absolute w-full h-full transition-all duration-500 transform",
2561
+ index === currentIndex ? "translate-x-0 opacity-100" : index < currentIndex ? "-translate-x-full opacity-0" : "translate-x-full opacity-0"
2562
+ )
2563
+ },
2564
+ /* @__PURE__ */ React37__default.createElement(
2565
+ ExperimentCard,
2566
+ {
2567
+ href: project.link || "#",
2568
+ title: project.title,
2569
+ description: project.description,
2570
+ tags: project.tags,
2571
+ category: "utility"
2572
+ }
2573
+ )
2574
+ ))), /* @__PURE__ */ React37__default.createElement(
2575
+ "button",
2576
+ {
2577
+ onClick: prevSlide,
2578
+ className: "absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-10"
2579
+ },
2580
+ /* @__PURE__ */ React37__default.createElement(
2581
+ "svg",
2582
+ {
2583
+ className: "w-6 h-6 text-gray-600",
2584
+ fill: "none",
2585
+ stroke: "currentColor",
2586
+ viewBox: "0 0 24 24"
2587
+ },
2588
+ /* @__PURE__ */ React37__default.createElement(
2589
+ "path",
2590
+ {
2591
+ strokeLinecap: "round",
2592
+ strokeLinejoin: "round",
2593
+ strokeWidth: 2,
2594
+ d: "M15 19l-7-7 7-7"
2595
+ }
2596
+ )
2597
+ )
2598
+ ), /* @__PURE__ */ React37__default.createElement(
2599
+ "button",
2600
+ {
2601
+ onClick: nextSlide,
2602
+ className: "absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-10"
2603
+ },
2604
+ /* @__PURE__ */ React37__default.createElement(
2605
+ "svg",
2606
+ {
2607
+ className: "w-6 h-6 text-gray-600",
2608
+ fill: "none",
2609
+ stroke: "currentColor",
2610
+ viewBox: "0 0 24 24"
2611
+ },
2612
+ /* @__PURE__ */ React37__default.createElement(
2613
+ "path",
2614
+ {
2615
+ strokeLinecap: "round",
2616
+ strokeLinejoin: "round",
2617
+ strokeWidth: 2,
2618
+ d: "M9 5l7 7-7 7"
2619
+ }
2620
+ )
2621
+ )
2622
+ ), /* @__PURE__ */ React37__default.createElement("div", { className: "absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-10" }, projects.map((_, index) => /* @__PURE__ */ React37__default.createElement(
2623
+ "button",
2624
+ {
2625
+ key: index,
2626
+ onClick: () => setCurrentIndex(index),
2627
+ className: cn(
2628
+ "w-2 h-2 rounded-full transition-all duration-300",
2629
+ index === currentIndex ? "bg-blue-500 w-4" : "bg-gray-300"
2630
+ )
2631
+ }
2632
+ ))))));
2633
+ };
2140
2634
  var NavigationItemComponent = ({
2141
2635
  item,
2142
2636
  direction,
@@ -2158,7 +2652,7 @@ var NavigationItemComponent = ({
2158
2652
  const stateClasses = isActive ? "bg-blue-500 text-white shadow-lg" : item.isExternal ? "text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200" : "text-gray-700 hover:bg-blue-50 hover:text-blue-600";
2159
2653
  return `${baseClasses} ${directionClasses} ${stateClasses}`;
2160
2654
  };
2161
- return /* @__PURE__ */ React3__default.createElement(
2655
+ return /* @__PURE__ */ React37__default.createElement(
2162
2656
  "a",
2163
2657
  {
2164
2658
  href: item.href,
@@ -2167,9 +2661,9 @@ var NavigationItemComponent = ({
2167
2661
  rel: item.isExternal ? "noopener noreferrer" : void 0,
2168
2662
  className: getItemClasses()
2169
2663
  },
2170
- item.icon && /* @__PURE__ */ React3__default.createElement("span", { className: "flex-shrink-0" }, item.icon),
2171
- /* @__PURE__ */ React3__default.createElement("span", { className: `font-medium ${direction === "vertical" ? "text-sm" : "text-xs"}` }, item.label),
2172
- item.isExternal && /* @__PURE__ */ React3__default.createElement(
2664
+ item.icon && /* @__PURE__ */ React37__default.createElement("span", { className: "flex-shrink-0" }, item.icon),
2665
+ /* @__PURE__ */ React37__default.createElement("span", { className: `font-medium ${direction === "vertical" ? "text-sm" : "text-xs"}` }, item.label),
2666
+ item.isExternal && /* @__PURE__ */ React37__default.createElement(
2173
2667
  "svg",
2174
2668
  {
2175
2669
  className: "w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity",
@@ -2177,7 +2671,7 @@ var NavigationItemComponent = ({
2177
2671
  stroke: "currentColor",
2178
2672
  viewBox: "0 0 24 24"
2179
2673
  },
2180
- /* @__PURE__ */ React3__default.createElement(
2674
+ /* @__PURE__ */ React37__default.createElement(
2181
2675
  "path",
2182
2676
  {
2183
2677
  strokeLinecap: "round",
@@ -2187,12 +2681,12 @@ var NavigationItemComponent = ({
2187
2681
  }
2188
2682
  )
2189
2683
  ),
2190
- direction === "vertical" && isActive && /* @__PURE__ */ React3__default.createElement("div", { className: "absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full" })
2684
+ direction === "vertical" && isActive && /* @__PURE__ */ React37__default.createElement("div", { className: "absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full" })
2191
2685
  );
2192
2686
  };
2193
2687
  var NavigationItem_default = NavigationItemComponent;
2194
2688
 
2195
- // src/components/navigation/Navigation.tsx
2689
+ // src/features/navigation/Navigation.tsx
2196
2690
  var Navigation = ({
2197
2691
  config,
2198
2692
  isOpen,
@@ -2247,14 +2741,14 @@ var Navigation = ({
2247
2741
  onItemClick?.(item);
2248
2742
  };
2249
2743
  if (!isOpen) return null;
2250
- return /* @__PURE__ */ React3__default.createElement("nav", { className: `${getContainerClasses()} ${className}` }, /* @__PURE__ */ React3__default.createElement("div", { className: getContentClasses() }, logo && /* @__PURE__ */ React3__default.createElement("div", { className: "flex items-center justify-center mb-4" }, /* @__PURE__ */ React3__default.createElement(
2744
+ return /* @__PURE__ */ React37__default.createElement("nav", { className: `${getContainerClasses()} ${className}` }, /* @__PURE__ */ React37__default.createElement("div", { className: getContentClasses() }, logo && /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center justify-center mb-4" }, /* @__PURE__ */ React37__default.createElement(
2251
2745
  "img",
2252
2746
  {
2253
2747
  src: logo.src,
2254
2748
  alt: logo.alt || "Logo",
2255
2749
  className: "h-8 w-auto"
2256
2750
  }
2257
- )), direction === "vertical" && /* @__PURE__ */ React3__default.createElement("div", { className: "h-12 flex-shrink-0" }), /* @__PURE__ */ React3__default.createElement("div", { className: getItemsListClasses() }, items.map((item) => /* @__PURE__ */ React3__default.createElement(
2751
+ )), direction === "vertical" && /* @__PURE__ */ React37__default.createElement("div", { className: "h-12 flex-shrink-0" }), /* @__PURE__ */ React37__default.createElement("div", { className: getItemsListClasses() }, items.map((item) => /* @__PURE__ */ React37__default.createElement(
2258
2752
  NavigationItem_default,
2259
2753
  {
2260
2754
  key: item.id,
@@ -2263,14 +2757,14 @@ var Navigation = ({
2263
2757
  isActive: activeItemId === item.id,
2264
2758
  onClick: handleItemClick
2265
2759
  }
2266
- ))), avatar && direction === "vertical" && /* @__PURE__ */ React3__default.createElement("div", { className: "flex items-center justify-center mt-auto pt-4" }, /* @__PURE__ */ React3__default.createElement(
2760
+ ))), avatar && direction === "vertical" && /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center justify-center mt-auto pt-4" }, /* @__PURE__ */ React37__default.createElement(
2267
2761
  "img",
2268
2762
  {
2269
2763
  src: avatar.src,
2270
2764
  alt: avatar.alt || "Avatar",
2271
2765
  className: "w-10 h-10 rounded-full border-2 border-gray-200"
2272
2766
  }
2273
- )), avatar && direction === "horizontal" && /* @__PURE__ */ React3__default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React3__default.createElement(
2767
+ )), avatar && direction === "horizontal" && /* @__PURE__ */ React37__default.createElement("div", { className: "flex items-center" }, /* @__PURE__ */ React37__default.createElement(
2274
2768
  "img",
2275
2769
  {
2276
2770
  src: avatar.src,
@@ -2299,7 +2793,7 @@ var NavigationToggle = ({
2299
2793
  return "top-4 left-4";
2300
2794
  }
2301
2795
  };
2302
- return /* @__PURE__ */ React3__default.createElement(
2796
+ return /* @__PURE__ */ React37__default.createElement(
2303
2797
  "button",
2304
2798
  {
2305
2799
  onClick,
@@ -2315,7 +2809,7 @@ var NavigationToggle = ({
2315
2809
  `,
2316
2810
  "aria-label": isOpen ? "\u5173\u95ED\u5BFC\u822A\u680F" : "\u6253\u5F00\u5BFC\u822A\u680F"
2317
2811
  },
2318
- /* @__PURE__ */ React3__default.createElement("div", { className: "w-5 h-5 flex flex-col justify-center items-center" }, /* @__PURE__ */ React3__default.createElement(
2812
+ /* @__PURE__ */ React37__default.createElement("div", { className: "w-5 h-5 flex flex-col justify-center items-center" }, /* @__PURE__ */ React37__default.createElement(
2319
2813
  "span",
2320
2814
  {
2321
2815
  className: `
@@ -2324,7 +2818,7 @@ var NavigationToggle = ({
2324
2818
  ${isOpen ? "rotate-45 translate-y-0.5" : ""}
2325
2819
  `
2326
2820
  }
2327
- ), /* @__PURE__ */ React3__default.createElement(
2821
+ ), /* @__PURE__ */ React37__default.createElement(
2328
2822
  "span",
2329
2823
  {
2330
2824
  className: `
@@ -2333,7 +2827,7 @@ var NavigationToggle = ({
2333
2827
  ${isOpen ? "opacity-0 scale-0" : "opacity-100 scale-100"}
2334
2828
  `
2335
2829
  }
2336
- ), /* @__PURE__ */ React3__default.createElement(
2830
+ ), /* @__PURE__ */ React37__default.createElement(
2337
2831
  "span",
2338
2832
  {
2339
2833
  className: `
@@ -2482,7 +2976,7 @@ var FloatingMenu = ({
2482
2976
  }, [mounted]);
2483
2977
  if (!mounted) return null;
2484
2978
  return createPortal(
2485
- /* @__PURE__ */ React3__default.createElement(
2979
+ /* @__PURE__ */ React37__default.createElement(
2486
2980
  "div",
2487
2981
  {
2488
2982
  ref: containerRef,
@@ -2493,7 +2987,7 @@ var FloatingMenu = ({
2493
2987
  zIndex
2494
2988
  }
2495
2989
  },
2496
- /* @__PURE__ */ React3__default.createElement(
2990
+ /* @__PURE__ */ React37__default.createElement(
2497
2991
  "div",
2498
2992
  {
2499
2993
  className: `
@@ -2511,7 +3005,7 @@ var FloatingMenu = ({
2511
3005
  },
2512
3006
  trigger
2513
3007
  ),
2514
- isMenuOpen && /* @__PURE__ */ React3__default.createElement(
3008
+ isMenuOpen && /* @__PURE__ */ React37__default.createElement(
2515
3009
  "div",
2516
3010
  {
2517
3011
  className: `
@@ -2540,77 +3034,58 @@ var FloatingMenu = ({
2540
3034
  );
2541
3035
  };
2542
3036
  var FloatingMenu_default = FloatingMenu;
2543
- function buildGridColsClasses(columns) {
2544
- return [
2545
- "grid-cols-1",
2546
- // 默认单列
2547
- columns.sm ? `sm:grid-cols-${columns.sm}` : "",
2548
- columns.md ? `md:grid-cols-${columns.md}` : "md:grid-cols-2",
2549
- columns.lg ? `lg:grid-cols-${columns.lg}` : "lg:grid-cols-3",
2550
- columns.xl ? `xl:grid-cols-${columns.xl}` : ""
2551
- ].filter(Boolean).join(" ");
2552
- }
2553
- function getGapClassName(gap) {
2554
- const gapClasses = {
2555
- sm: "gap-3",
2556
- md: "gap-6",
2557
- lg: "gap-8",
2558
- xl: "gap-10"
2559
- };
2560
- return gapClasses[gap];
2561
- }
2562
- function Grid({
2563
- items,
2564
- renderItem,
2565
- columns = { md: 2, lg: 3 },
2566
- gap = "md",
2567
- className = "",
2568
- style
2569
- }) {
2570
- const gridColsClasses = buildGridColsClasses(columns);
2571
- const gapClass = getGapClassName(gap);
2572
- return /* @__PURE__ */ React3__default.createElement(
2573
- "div",
2574
- {
2575
- className: `grid ${gridColsClasses} ${gapClass} ${className}`.trim(),
2576
- style
2577
- },
2578
- items.map((item, index) => /* @__PURE__ */ React3__default.createElement("div", { key: item.id }, renderItem(item, index)))
2579
- );
2580
- }
2581
- var Avatar3 = ({
2582
- src,
2583
- size = "medium",
2584
- mood = "online",
2585
- statusText,
2586
- onClick
2587
- }) => {
2588
- const sizeClasses = {
2589
- small: "w-8 h-8",
2590
- medium: "w-12 h-12",
2591
- large: "w-16 h-16"
2592
- };
2593
- const moodColors = {
2594
- online: "bg-green-500",
2595
- offline: "bg-gray-500",
2596
- away: "bg-yellow-500"
3037
+ var FloatingMenuExample = () => {
3038
+ const [windowWidth, setWindowWidth] = useState(0);
3039
+ useEffect(() => {
3040
+ setWindowWidth(window.innerWidth);
3041
+ const handleResize = () => setWindowWidth(window.innerWidth);
3042
+ window.addEventListener("resize", handleResize);
3043
+ return () => window.removeEventListener("resize", handleResize);
3044
+ }, []);
3045
+ const menuItems = [
3046
+ { id: 1, label: "\u9996\u9875", icon: "\u{1F3E0}" },
3047
+ { id: 2, label: "\u8BBE\u7F6E", icon: "\u2699\uFE0F" },
3048
+ { id: 3, label: "\u6D88\u606F", icon: "\u{1F4E9}" },
3049
+ { id: 4, label: "\u5E2E\u52A9", icon: "\u2753" },
3050
+ { id: 5, label: "\u9000\u51FA", icon: "\u{1F6AA}" }
3051
+ ];
3052
+ const handleMenuItemClick = (id) => {
3053
+ console.log(`\u70B9\u51FB\u4E86\u83DC\u5355\u9879: ${id}`);
2597
3054
  };
2598
- return /* @__PURE__ */ React3__default.createElement("div", { className: "relative inline-block", onClick }, /* @__PURE__ */ React3__default.createElement(
2599
- "img",
3055
+ return /* @__PURE__ */ React37__default.createElement("div", { className: "w-full h-screen bg-gray-100 relative p-8" }, /* @__PURE__ */ React37__default.createElement("div", { className: "max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12" }, /* @__PURE__ */ React37__default.createElement("h1", { className: "text-3xl font-bold mb-4 text-gray-900" }, "\u60AC\u6D6E\u83DC\u5355\u793A\u4F8B"), /* @__PURE__ */ React37__default.createElement("p", { className: "text-gray-600 leading-relaxed mb-6" }, "\u8FD9\u662F\u4E00\u4E2A\u53EF\u62D6\u62FD\u7684\u60AC\u6D6E\u83DC\u5355\u7EC4\u4EF6\u793A\u4F8B\u3002\u4F60\u53EF\u4EE5\u5C1D\u8BD5\u62D6\u52A8\u4E0B\u65B9\u7684 ", /* @__PURE__ */ React37__default.createElement("span", { className: "font-bold text-blue-600" }, "\u84DD\u8272\u6309\u94AE"), " \u5230\u5904\u79FB\u52A8\u3002"), /* @__PURE__ */ React37__default.createElement("div", { className: "bg-blue-50 border-l-4 border-blue-500 p-4 mb-6" }, /* @__PURE__ */ React37__default.createElement("p", { className: "text-sm text-blue-700" }, /* @__PURE__ */ React37__default.createElement("strong", null, "\u667A\u80FD\u5B9A\u4F4D\uFF1A"), " \u83DC\u5355\u4F1A\u6839\u636E\u6309\u94AE\u5728\u5C4F\u5E55\u4E0A\u7684\u4F4D\u7F6E\u81EA\u52A8\u8C03\u6574\u5F39\u51FA\u65B9\u5411\uFF08\u5411\u5DE6\u6216\u5411\u53F3\uFF09\u3002"))), /* @__PURE__ */ React37__default.createElement(
3056
+ FloatingMenu_default,
2600
3057
  {
2601
- src: src || "/images/avatar.jpg",
2602
- alt: "User Avatar",
2603
- className: `${sizeClasses[size]} rounded-full object-cover border-2 border-white shadow-md cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all duration-200`
3058
+ trigger: /* @__PURE__ */ React37__default.createElement("div", { className: "w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer" }, /* @__PURE__ */ React37__default.createElement("span", { className: "text-xl" }, "\u2795")),
3059
+ menu: /* @__PURE__ */ React37__default.createElement("div", { className: "w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden" }, /* @__PURE__ */ React37__default.createElement("div", { className: "px-4 py-3 border-b border-gray-100" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-sm font-bold text-gray-900" }, "\u5FEB\u6377\u83DC\u5355")), /* @__PURE__ */ React37__default.createElement("ul", { className: "py-1" }, menuItems.map((item) => /* @__PURE__ */ React37__default.createElement(
3060
+ "li",
3061
+ {
3062
+ key: item.id,
3063
+ className: "flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm",
3064
+ onClick: () => handleMenuItemClick(item.id)
3065
+ },
3066
+ /* @__PURE__ */ React37__default.createElement("span", { className: "text-lg" }, item.icon),
3067
+ /* @__PURE__ */ React37__default.createElement("span", { className: "font-medium" }, item.label)
3068
+ )))),
3069
+ initialPosition: { x: 100, y: 100 }
2604
3070
  }
2605
- ), /* @__PURE__ */ React3__default.createElement(
2606
- "div",
3071
+ ), windowWidth > 0 && /* @__PURE__ */ React37__default.createElement(
3072
+ FloatingMenu_default,
2607
3073
  {
2608
- className: `absolute bottom-0 right-0 w-3 h-3 rounded-full border-2 border-white ${moodColors[mood]}`
3074
+ trigger: /* @__PURE__ */ React37__default.createElement("div", { className: "w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer" }, /* @__PURE__ */ React37__default.createElement("span", { className: "text-xl" }, "\u{1F50D}")),
3075
+ menu: /* @__PURE__ */ React37__default.createElement("div", { className: "w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4" }, /* @__PURE__ */ React37__default.createElement("h3", { className: "text-sm font-bold text-gray-900 mb-3" }, "\u5FEB\u901F\u641C\u7D22"), /* @__PURE__ */ React37__default.createElement("div", { className: "space-y-3" }, /* @__PURE__ */ React37__default.createElement(
3076
+ "input",
3077
+ {
3078
+ type: "text",
3079
+ placeholder: "\u8F93\u5165\u5173\u952E\u5B57...",
3080
+ className: "w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none"
3081
+ }
3082
+ ), /* @__PURE__ */ React37__default.createElement("button", { className: "w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors" }, "\u641C\u7D22"))),
3083
+ initialPosition: { x: windowWidth - 100, y: 100 }
2609
3084
  }
2610
- ), statusText && /* @__PURE__ */ React3__default.createElement("div", { className: "absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap" }, /* @__PURE__ */ React3__default.createElement("span", { className: "text-xs text-gray-600" }, statusText)));
3085
+ ));
2611
3086
  };
2612
- var Avatar_default = Avatar3;
3087
+ var FloatingMenuExample_default = FloatingMenuExample;
2613
3088
 
2614
- export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AutoOpenModal_default as AutoOpenModal, Avatar_default as Avatar, AvatarFallback, AvatarImage, BackgroundRemover, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CollisionBalls_default as CollisionBalls, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, FloatingMenu_default as FloatingMenu, Grid, Input, Label, Navigation_default as Navigation, NavigationItem_default as NavigationItem, NavigationToggle_default as NavigationToggle, OCRScanner, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProfileButton_default as ProfileButton, ProfileModal_default as ProfileModal, Progress, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SentimentAnalyzer, Separator3 as Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, SmartAssistant, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Timeline_default as Timeline, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buildGridColsClasses, buttonVariants, getGapClassName, useBackgroundRemoval, useOCR, useSentimentAnalysis, useTextGeneration };
3089
+ export { About_default as About, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AutoOpenModal, Avatar, AvatarFallback, AvatarImage, BackButton, BackgroundRemover, Badge, Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CollisionBalls, Contact_default as Contact, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EnhancedAvatar, ExperimentCard, FilterButtonGroup, FloatingMenu_default as FloatingMenu, FloatingMenuExample_default as FloatingMenuExample, GenericOrderManager, Grid, Home_default as Home, Input, Label, Navigation_default as Navigation, NavigationItem_default as NavigationItem, NavigationToggle_default as NavigationToggle, OCRScanner, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, ProfileButton, ProfileModal, Progress, ProjectCarousel, ScrollArea, ScrollBar, SearchResultHint, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SentimentAnalyzer, Separator3 as Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, SmartAssistant, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, Timeline, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, badgeVariants, buttonVariants, useBackgroundRemoval, useOCR, useSentimentAnalysis, useTextGeneration };
2615
3090
  //# sourceMappingURL=index.mjs.map
2616
3091
  //# sourceMappingURL=index.mjs.map