dishui 0.0.64 → 0.0.65

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 (177) hide show
  1. package/dist/components/Badge/index.js +12 -9
  2. package/dist/components/Badge/index.js.map +1 -1
  3. package/dist/components/Button/index.js +43 -40
  4. package/dist/components/Button/index.js.map +1 -1
  5. package/dist/components/Card/index.d.ts +11 -0
  6. package/dist/components/Card/index.js +62 -37
  7. package/dist/components/Card/index.js.map +1 -1
  8. package/dist/components/Chart/Chart.js.map +1 -1
  9. package/dist/components/Checkbox/index.js +32 -30
  10. package/dist/components/Checkbox/index.js.map +1 -1
  11. package/dist/components/Demo/index.js.map +1 -1
  12. package/dist/components/EmptyState/index.d.ts +4 -1
  13. package/dist/components/EmptyState/index.js +3 -3
  14. package/dist/components/EmptyState/index.js.map +1 -1
  15. package/dist/components/FileUploader/DropZone.js.map +1 -1
  16. package/dist/components/FileUploader/FileItem.js.map +1 -1
  17. package/dist/components/FileUploader/FileUploader.js.map +1 -1
  18. package/dist/components/FileUploader/UploadQueue.js.map +1 -1
  19. package/dist/components/Input/index.js +30 -30
  20. package/dist/components/Input/index.js.map +1 -1
  21. package/dist/components/Label/index.js +41 -40
  22. package/dist/components/Label/index.js.map +1 -1
  23. package/dist/components/List/index.js +47 -32
  24. package/dist/components/List/index.js.map +1 -1
  25. package/dist/components/Markdown/Markdown.js +61 -57
  26. package/dist/components/Markdown/Markdown.js.map +1 -1
  27. package/dist/components/Markdown/markdownComponents.js +49 -49
  28. package/dist/components/Markdown/markdownComponents.js.map +1 -1
  29. package/dist/components/Modal/index.d.ts +7 -3
  30. package/dist/components/Modal/index.js +77 -65
  31. package/dist/components/Modal/index.js.map +1 -1
  32. package/dist/components/Page/index.d.ts +58 -0
  33. package/dist/components/Page/index.js +74 -0
  34. package/dist/components/Page/index.js.map +1 -0
  35. package/dist/components/PageHeader/index.js.map +1 -1
  36. package/dist/components/Select/index.js +0 -3
  37. package/dist/components/Select/index.js.map +1 -1
  38. package/dist/components/SidebarToggleButton/index.js.map +1 -1
  39. package/dist/components/StatCard/index.d.ts +3 -1
  40. package/dist/components/StatCard/index.js +39 -11
  41. package/dist/components/StatCard/index.js.map +1 -1
  42. package/dist/components/Table/index.js +103 -85
  43. package/dist/components/Table/index.js.map +1 -1
  44. package/dist/components/Tabs/index.d.ts +19 -5
  45. package/dist/components/Tabs/index.js +32 -13
  46. package/dist/components/Tabs/index.js.map +1 -1
  47. package/dist/components/Tree/Tree.js.map +1 -1
  48. package/dist/components/pro/ArticleContextMenu/index.js.map +1 -1
  49. package/dist/components/pro/ArticleControl/ArticleControl2.js.map +1 -1
  50. package/dist/components/pro/CodeEditor/editors/CodeEditor.js +141 -134
  51. package/dist/components/pro/CodeEditor/editors/CodeEditor.js.map +1 -1
  52. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js +81 -78
  53. package/dist/components/pro/CodeEditor/editors/MarkdownEditor.js.map +1 -1
  54. package/dist/components/pro/CodeEditor/panels/FootnotePanel.js.map +1 -1
  55. package/dist/components/pro/CodeEditor/panels/HistoryPanel.js.map +1 -1
  56. package/dist/components/pro/CodeEditor/panels/OutlinePanel.js.map +1 -1
  57. package/dist/components/pro/CodeEditor/panels/TableOfContentsPanel.js.map +1 -1
  58. package/dist/components/pro/CodeEditor/panels/VariablePanel.js.map +1 -1
  59. package/dist/components/pro/CodeEditor/themes.js +59 -59
  60. package/dist/components/pro/CodeEditor/themes.js.map +1 -1
  61. package/dist/components/pro/DataTable/DataTable.js +49 -48
  62. package/dist/components/pro/DataTable/DataTable.js.map +1 -1
  63. package/dist/components/pro/DataTable/Filters.js +42 -42
  64. package/dist/components/pro/DataTable/Filters.js.map +1 -1
  65. package/dist/components/pro/DataTable/PivotPanel.js.map +1 -1
  66. package/dist/components/pro/DataTable/PivotView.js +35 -32
  67. package/dist/components/pro/DataTable/PivotView.js.map +1 -1
  68. package/dist/components/pro/DataTable/components/BulkActions.js.map +1 -1
  69. package/dist/components/pro/DataTable/components/ColumnSelector.js.map +1 -1
  70. package/dist/components/pro/DataTable/components/FilterBar.js.map +1 -1
  71. package/dist/components/pro/DataTable/components/TableBody.js.map +1 -1
  72. package/dist/components/pro/DataTable/components/TableHeader.js.map +1 -1
  73. package/dist/components/pro/DataTable/components/TablePagination.js.map +1 -1
  74. package/dist/components/pro/DataTable/components/TableToolbar.js.map +1 -1
  75. package/dist/components/pro/DataTable/pivotExtension.js.map +1 -1
  76. package/dist/components/pro/DataTable/rowDetailExtension.js.map +1 -1
  77. package/dist/components/pro/DataTable/tanstack-table.js +37 -37
  78. package/dist/components/pro/DataTable/tanstack-table.js.map +1 -1
  79. package/dist/components/pro/FileExplorer/Breadcrumb.js +53 -53
  80. package/dist/components/pro/FileExplorer/Breadcrumb.js.map +1 -1
  81. package/dist/components/pro/FileExplorer/CreateDialog.js.map +1 -1
  82. package/dist/components/pro/FileExplorer/FileExplorer.js.map +1 -1
  83. package/dist/components/pro/FileExplorer/FileIcon.js +22 -22
  84. package/dist/components/pro/FileExplorer/FileIcon.js.map +1 -1
  85. package/dist/components/pro/FileExplorer/GridView.js.map +1 -1
  86. package/dist/components/pro/FileExplorer/ListView.js.map +1 -1
  87. package/dist/components/pro/FileExplorer/Toolbar.js.map +1 -1
  88. package/dist/components/pro/Flow/Flow.js +496 -494
  89. package/dist/components/pro/Flow/Flow.js.map +1 -1
  90. package/dist/components/pro/Flow/FlowCanvas.js +916 -917
  91. package/dist/components/pro/Flow/FlowCanvas.js.map +1 -1
  92. package/dist/components/pro/Flow/context/FlowUIContext.js.map +1 -1
  93. package/dist/components/pro/Flow/edges/EdgeRenderer.js +59 -59
  94. package/dist/components/pro/Flow/edges/EdgeRenderer.js.map +1 -1
  95. package/dist/components/pro/Flow/hooks/useClipboard.js.map +1 -1
  96. package/dist/components/pro/Flow/hooks/useDeleteSelection.js.map +1 -1
  97. package/dist/components/pro/Flow/hooks/useEdgeMutations.js.map +1 -1
  98. package/dist/components/pro/Flow/hooks/useLayoutActions.js +9 -11
  99. package/dist/components/pro/Flow/hooks/useLayoutActions.js.map +1 -1
  100. package/dist/components/pro/Flow/hooks/useLineMutations.js.map +1 -1
  101. package/dist/components/pro/Flow/hooks/useMindMap.js.map +1 -1
  102. package/dist/components/pro/Flow/hooks/useNodeMutations.js.map +1 -1
  103. package/dist/components/pro/Flow/lines/FreehandTool.js +9 -9
  104. package/dist/components/pro/Flow/lines/FreehandTool.js.map +1 -1
  105. package/dist/components/pro/Flow/lines/LineRenderer.js +5 -5
  106. package/dist/components/pro/Flow/lines/LineRenderer.js.map +1 -1
  107. package/dist/components/pro/Flow/nodes/DataNodeView.js +113 -93
  108. package/dist/components/pro/Flow/nodes/DataNodeView.js.map +1 -1
  109. package/dist/components/pro/Flow/nodes/MediaContent.js.map +1 -1
  110. package/dist/components/pro/Flow/nodes/MediaOverlay.js.map +1 -1
  111. package/dist/components/pro/Flow/nodes/Model3DView.js +1 -1
  112. package/dist/components/pro/Flow/nodes/Model3DView.js.map +1 -1
  113. package/dist/components/pro/Flow/nodes/NodeRenderer.js +118 -118
  114. package/dist/components/pro/Flow/nodes/NodeRenderer.js.map +1 -1
  115. package/dist/components/pro/Flow/nodes/dataUtils.js.map +1 -1
  116. package/dist/components/pro/Flow/nodes/shapes.js +1 -3
  117. package/dist/components/pro/Flow/nodes/shapes.js.map +1 -1
  118. package/dist/components/pro/Flow/panels/AIPanel.js.map +1 -1
  119. package/dist/components/pro/Flow/panels/Breadcrumb.js.map +1 -1
  120. package/dist/components/pro/Flow/panels/ContextMenu.js.map +1 -1
  121. package/dist/components/pro/Flow/panels/DataInspectorSection.js.map +1 -1
  122. package/dist/components/pro/Flow/panels/ExpandableTextarea.js.map +1 -1
  123. package/dist/components/pro/Flow/panels/FlowPanelGroup.js.map +1 -1
  124. package/dist/components/pro/Flow/panels/FlowToolbar.js +97 -97
  125. package/dist/components/pro/Flow/panels/FlowToolbar.js.map +1 -1
  126. package/dist/components/pro/Flow/panels/InspectorPanel.js +57 -57
  127. package/dist/components/pro/Flow/panels/InspectorPanel.js.map +1 -1
  128. package/dist/components/pro/Flow/panels/OutlinePanel.js +26 -22
  129. package/dist/components/pro/Flow/panels/OutlinePanel.js.map +1 -1
  130. package/dist/components/pro/Flow/panels/PresentationMode.js +18 -16
  131. package/dist/components/pro/Flow/panels/PresentationMode.js.map +1 -1
  132. package/dist/components/pro/Flow/panels/ProjectTitle.js.map +1 -1
  133. package/dist/components/pro/Flow/panels/ShapePalette.js +109 -104
  134. package/dist/components/pro/Flow/panels/ShapePalette.js.map +1 -1
  135. package/dist/components/pro/Flow/panels/toolbarIcons.js.map +1 -1
  136. package/dist/components/pro/RichTextEditor/AIRewrite.js.map +1 -1
  137. package/dist/components/pro/RichTextEditor/BlockHandle.js.map +1 -1
  138. package/dist/components/pro/RichTextEditor/BubbleToolbar.js.map +1 -1
  139. package/dist/components/pro/RichTextEditor/CommentDialog.js.map +1 -1
  140. package/dist/components/pro/RichTextEditor/CommentPanel.js.map +1 -1
  141. package/dist/components/pro/RichTextEditor/CommentPopover.js.map +1 -1
  142. package/dist/components/pro/RichTextEditor/ContextMenu.js.map +1 -1
  143. package/dist/components/pro/RichTextEditor/RichTextEditor.js.map +1 -1
  144. package/dist/components/pro/RichTextEditor/SlashMenu.js.map +1 -1
  145. package/dist/components/pro/RichTextEditor/Toolbar/ColorPicker.js.map +1 -1
  146. package/dist/components/pro/RichTextEditor/Toolbar/FloatingDialogMenu.js.map +1 -1
  147. package/dist/components/pro/RichTextEditor/Toolbar/MarkdownTemplates.js.map +1 -1
  148. package/dist/components/pro/RichTextEditor/Toolbar/SelectDropdown.js.map +1 -1
  149. package/dist/components/pro/RichTextEditor/Toolbar/TableOpsMenu.js.map +1 -1
  150. package/dist/components/pro/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
  151. package/dist/components/pro/RichTextEditor/extensions/CodeBlockView.js.map +1 -1
  152. package/dist/components/pro/RichTextEditor/extensions/FloatingDialog.js.map +1 -1
  153. package/dist/components/pro/RichTextEditor/extensions/MarkdownBlock.js.map +1 -1
  154. package/dist/contexts/AppContext.js.map +1 -1
  155. package/dist/dishui.css +1 -1
  156. package/dist/hooks/useTableColumns.js +7 -8
  157. package/dist/hooks/useTableColumns.js.map +1 -1
  158. package/dist/index.d.ts +2 -0
  159. package/dist/index.js +227 -221
  160. package/dist/layouts/MainLayout.js +22 -22
  161. package/dist/layouts/MainLayout.js.map +1 -1
  162. package/dist/layouts/Navbar.js.map +1 -1
  163. package/dist/layouts/Sidebar.js +94 -73
  164. package/dist/layouts/Sidebar.js.map +1 -1
  165. package/dist/layouts/headbar/Headbar.js.map +1 -1
  166. package/dist/layouts/headbar/HeadbarLangSwitcher.js.map +1 -1
  167. package/dist/layouts/headbar/HeadbarSearch.js.map +1 -1
  168. package/dist/layouts/headbar/HeadbarThemeSwitcher.js +11 -11
  169. package/dist/layouts/headbar/HeadbarThemeSwitcher.js.map +1 -1
  170. package/dist/layouts/headbar/HeadbarTitle.js.map +1 -1
  171. package/dist/utils/i18n.js +10 -10
  172. package/dist/utils/i18n.js.map +1 -1
  173. package/dist/utils/menu.js.map +1 -1
  174. package/dist/utils/routerBuilder.js +17 -15
  175. package/dist/utils/routerBuilder.js.map +1 -1
  176. package/dist/utils/themes.js.map +1 -1
  177. package/package.json +7 -7
@@ -1,7 +1,7 @@
1
1
  import "react";
2
2
  import { jsx as e, jsxs as n } from "react/jsx-runtime";
3
- var x = ({ icon: t, title: a, description: s, action: r, className: m = "" }) => /* @__PURE__ */ n("div", {
4
- className: `flex flex-col items-center justify-center rounded-xl border border-dashed border-base-300 bg-base-200/50 py-16 text-center ${m}`.trim(),
3
+ var o = ({ icon: t, title: a, description: s, action: r, fill: l = !0, className: m = "" }) => /* @__PURE__ */ n("div", {
4
+ className: `flex flex-col items-center justify-center rounded-xl border border-dashed border-base-300 bg-base-200/50 py-16 text-center ${l ? "h-full w-full" : ""} ${m}`.trim(),
5
5
  children: [
6
6
  t && /* @__PURE__ */ e("span", {
7
7
  className: "mb-3 flex size-12 items-center justify-center rounded-full bg-base-content/5 text-base-content/40 [&>svg]:h-6 [&>svg]:w-6",
@@ -22,7 +22,7 @@ var x = ({ icon: t, title: a, description: s, action: r, className: m = "" }) =>
22
22
  ]
23
23
  });
24
24
  export {
25
- x as default
25
+ o as default
26
26
  };
27
27
 
28
28
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React from 'react';\n\nexport type EmptyStateProps = {\n /** 主图标(通常为 lucide 图标) */\n icon?: React.ReactNode;\n /** 主标题 */\n title: React.ReactNode;\n /** 补充说明 */\n description?: React.ReactNode;\n /** 底部操作(按钮等) */\n action?: React.ReactNode;\n className?: string;\n};\n\n/**\n * 空状态:虚线边框卡片 + 图标 + 标题 + 说明,统一列表为空时的展示。\n */\nconst EmptyState = ({\n icon,\n title,\n description,\n action,\n className = '',\n}: EmptyStateProps) => {\n return (\n <div\n className={`flex flex-col items-center justify-center rounded-xl border border-dashed border-base-300 bg-base-200/50 py-16 text-center ${className}`.trim()}\n >\n {icon && (\n <span className=\"mb-3 flex size-12 items-center justify-center rounded-full bg-base-content/5 text-base-content/40 [&>svg]:h-6 [&>svg]:w-6\">\n {icon}\n </span>\n )}\n <p className=\"text-sm font-medium text-base-content/80\">{title}</p>\n {description && (\n <p className=\"mt-1 max-w-sm text-xs text-base-content/50\">{description}</p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n );\n};\n\nexport default EmptyState;\n"],"mappings":";;AAiBA,IAAM,IAAA,CAAc,EAChB,MAAA,GACA,OAAA,GACA,aAAA,GACA,QAAA,GACA,WAAA,IAAY,GAAA,MAGR,gBAAA,EAAC,OAAD;AAAA,EACI,WAAW,8HAA8H,CAAA,GAAY,KAAK;AAAA,YAD9J;AAAA,IAGK,KACG,gBAAA,EAAC,QAAD;AAAA,MAAM,WAAU;AAAA,gBACX;AAAA,IACC,CAAA;AAAA,IAEV,gBAAA,EAAC,KAAD;AAAA,MAAG,WAAU;AAAA,gBAA4C;AAAA,IAAS,CAAA;AAAA,IACjE,KACG,gBAAA,EAAC,KAAD;AAAA,MAAG,WAAU;AAAA,gBAA8C;AAAA,IAAe,CAAA;AAAA,IAE7E,KAAU,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAQ;AAAA,IAAY,CAAA;AAAA,EAC7C"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/EmptyState/index.tsx"],"sourcesContent":["import React from 'react';\n\nexport type EmptyStateProps = {\n /** 主图标(通常为 lucide 图标) */\n icon?: React.ReactNode;\n /** 主标题 */\n title: React.ReactNode;\n /** 补充说明 */\n description?: React.ReactNode;\n /** 底部操作(按钮等) */\n action?: React.ReactNode;\n /** 是否默认填满所在区域(宽高 100%,内容居中);默认 true */\n fill?: boolean;\n className?: string;\n};\n\n/**\n * 空状态:虚线边框卡片 + 图标 + 标题 + 说明,统一列表为空时的展示。\n * 默认填满所在区域(fill),在固定高度的容器内自动垂直居中。\n */\nconst EmptyState = ({\n icon,\n title,\n description,\n action,\n fill = true,\n className = '',\n}: EmptyStateProps) => {\n return (\n <div\n className={`flex flex-col items-center justify-center rounded-xl border border-dashed border-base-300 bg-base-200/50 py-16 text-center ${fill ? 'h-full w-full' : ''} ${className}`.trim()}\n >\n {icon && (\n <span className=\"mb-3 flex size-12 items-center justify-center rounded-full bg-base-content/5 text-base-content/40 [&>svg]:h-6 [&>svg]:w-6\">\n {icon}\n </span>\n )}\n <p className=\"text-sm font-medium text-base-content/80\">{title}</p>\n {description && (\n <p className=\"mt-1 max-w-sm text-xs text-base-content/50\">{description}</p>\n )}\n {action && <div className=\"mt-4\">{action}</div>}\n </div>\n );\n};\n\nexport default EmptyState;\n"],"mappings":";;AAoBA,IAAM,IAAA,CAAc,EAChB,MAAA,GACA,OAAA,GACA,aAAA,GACA,QAAA,GACA,MAAA,IAAO,IACP,WAAA,IAAY,GAAA,MAGR,gBAAA,EAAC,OAAD;AAAA,EACI,WAAW,8HAA8H,IAAO,kBAAkB,EAAA,IAAM,CAAA,GAAY,KAAK;AAAA,EAD7L,UAAA;AAAA,IAGK,KACG,gBAAA,EAAC,QAAD;AAAA,MAAM,WAAU;AAAA,MACX,UAAA;AAAA,IACC,CAAA;AAAA,IAEV,gBAAA,EAAC,KAAD;AAAA,MAAG,WAAU;AAAA,MAA4C,UAAA;AAAA,IAAS,CAAA;AAAA,IACjE,KACG,gBAAA,EAAC,KAAD;AAAA,MAAG,WAAU;AAAA,MAA8C,UAAA;AAAA,IAAe,CAAA;AAAA,IAE7E,KAAU,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAQ,UAAA;AAAA,IAAY,CAAA;AAAA,EAC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone.js","names":[],"sources":["../../../src/components/FileUploader/DropZone.tsx"],"sourcesContent":["import React, { useRef, useState, useCallback } from 'react';\nimport { DropZoneProps } from './types';\nimport Button from '../Button';\n\nconst defaultLabels = {\n dropzoneTitle: 'Drop files here',\n dropzoneHint: 'or click to browse',\n browseButton: 'Browse Files',\n fileTooLarge: 'File too large',\n fileTypeNotAllowed: 'File type not allowed',\n maxFilesReached: 'Maximum number of files reached',\n};\n\nconst UploadIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-10 w-10 opacity-40\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n);\n\n/** Validate a single file against accept list and max size */\nfunction validateFile(\n file: File,\n accept?: string[],\n maxFileSize?: number,\n): string | null {\n // Check file type\n if (accept && accept.length > 0) {\n const allowed = accept.some(pattern => {\n if (pattern.startsWith('.')) {\n // Extension match\n return file.name.toLowerCase().endsWith(pattern.toLowerCase());\n }\n if (pattern.endsWith('/*')) {\n // MIME prefix match (e.g. image/*)\n const prefix = pattern.replace('/*', '/');\n return file.type.startsWith(prefix);\n }\n // Exact MIME match\n return file.type === pattern;\n });\n if (!allowed) return 'fileTypeNotAllowed';\n }\n\n // Check file size\n if (maxFileSize && file.size > maxFileSize) {\n return 'fileTooLarge';\n }\n\n return null;\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({\n accept,\n maxFileSize,\n maxFiles,\n multiple = true,\n currentFileCount = 0,\n labels: userLabels,\n className = '',\n disabled = false,\n onFilesAdded,\n onValidationError,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n\n const processFiles = useCallback((rawFiles: File[]) => {\n const valid: File[] = [];\n for (const file of rawFiles) {\n // Check max files limit\n if (maxFiles && (currentFileCount + valid.length) >= maxFiles) {\n onValidationError?.(file, labels.maxFilesReached!);\n break;\n }\n const error = validateFile(file, accept, maxFileSize);\n if (error) {\n onValidationError?.(file, labels[error as keyof typeof labels] || error);\n } else {\n valid.push(file);\n }\n }\n if (valid.length > 0) {\n onFilesAdded(multiple ? valid : [valid[0]]);\n }\n }, [accept, maxFileSize, maxFiles, multiple, currentFileCount, labels, onFilesAdded, onValidationError]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) setIsDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n if (disabled) return;\n const files = Array.from(e.dataTransfer.files);\n processFiles(files);\n }, [disabled, processFiles]);\n\n const handleClick = useCallback(() => {\n if (!disabled) inputRef.current?.click();\n }, [disabled]);\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n processFiles(files);\n // Reset input so same file can be re-selected\n if (inputRef.current) inputRef.current.value = '';\n }, [processFiles]);\n\n const acceptStr = accept?.join(',');\n\n return (\n <div\n className={`\n relative flex flex-col items-center justify-center\n min-h-[200px] p-6 sm:p-8\n border-2 border-dashed rounded-xl\n transition-colors duration-200 cursor-pointer\n ${isDragOver\n ? 'border-primary bg-primary/5'\n : 'border-base-300 hover:border-primary/50 bg-base-100'\n }\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n ${className}\n `}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(); }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n accept={acceptStr}\n multiple={multiple}\n onChange={handleInputChange}\n disabled={disabled}\n />\n\n <UploadIcon />\n\n <p className=\"mt-3 text-base font-semibold text-base-content\">\n {labels.dropzoneTitle}\n </p>\n <p className=\"mt-1 text-sm opacity-60\">\n {labels.dropzoneHint}\n </p>\n\n <Button\n variant=\"primary\"\n size=\"sm\"\n outline\n className=\"mt-4\"\n disabled={disabled}\n onClick={() => { /* click propagation handled by parent div */ }}\n >\n {labels.browseButton}\n </Button>\n\n {accept && accept.length > 0 && (\n <p className=\"mt-3 text-xs opacity-50\">\n {accept.join(', ')}\n </p>\n )}\n {maxFileSize && (\n <p className=\"text-xs opacity-50\">\n Max: {formatFileSize(maxFileSize)}\n </p>\n )}\n </div>\n );\n};\n\n/** Format bytes to human-readable string */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"DropZone.js","names":[],"sources":["../../../src/components/FileUploader/DropZone.tsx"],"sourcesContent":["import React, { useRef, useState, useCallback } from 'react';\nimport { DropZoneProps } from './types';\nimport Button from '../Button';\n\nconst defaultLabels = {\n dropzoneTitle: 'Drop files here',\n dropzoneHint: 'or click to browse',\n browseButton: 'Browse Files',\n fileTooLarge: 'File too large',\n fileTypeNotAllowed: 'File type not allowed',\n maxFilesReached: 'Maximum number of files reached',\n};\n\nconst UploadIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-10 w-10 opacity-40\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\" />\n </svg>\n);\n\n/** Validate a single file against accept list and max size */\nfunction validateFile(\n file: File,\n accept?: string[],\n maxFileSize?: number,\n): string | null {\n // Check file type\n if (accept && accept.length > 0) {\n const allowed = accept.some(pattern => {\n if (pattern.startsWith('.')) {\n // Extension match\n return file.name.toLowerCase().endsWith(pattern.toLowerCase());\n }\n if (pattern.endsWith('/*')) {\n // MIME prefix match (e.g. image/*)\n const prefix = pattern.replace('/*', '/');\n return file.type.startsWith(prefix);\n }\n // Exact MIME match\n return file.type === pattern;\n });\n if (!allowed) return 'fileTypeNotAllowed';\n }\n\n // Check file size\n if (maxFileSize && file.size > maxFileSize) {\n return 'fileTooLarge';\n }\n\n return null;\n}\n\nexport const DropZone: React.FC<DropZoneProps> = ({\n accept,\n maxFileSize,\n maxFiles,\n multiple = true,\n currentFileCount = 0,\n labels: userLabels,\n className = '',\n disabled = false,\n onFilesAdded,\n onValidationError,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n\n const processFiles = useCallback((rawFiles: File[]) => {\n const valid: File[] = [];\n for (const file of rawFiles) {\n // Check max files limit\n if (maxFiles && (currentFileCount + valid.length) >= maxFiles) {\n onValidationError?.(file, labels.maxFilesReached!);\n break;\n }\n const error = validateFile(file, accept, maxFileSize);\n if (error) {\n onValidationError?.(file, labels[error as keyof typeof labels] || error);\n } else {\n valid.push(file);\n }\n }\n if (valid.length > 0) {\n onFilesAdded(multiple ? valid : [valid[0]]);\n }\n }, [accept, maxFileSize, maxFiles, multiple, currentFileCount, labels, onFilesAdded, onValidationError]);\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled) setIsDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n }, []);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n if (disabled) return;\n const files = Array.from(e.dataTransfer.files);\n processFiles(files);\n }, [disabled, processFiles]);\n\n const handleClick = useCallback(() => {\n if (!disabled) inputRef.current?.click();\n }, [disabled]);\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n processFiles(files);\n // Reset input so same file can be re-selected\n if (inputRef.current) inputRef.current.value = '';\n }, [processFiles]);\n\n const acceptStr = accept?.join(',');\n\n return (\n <div\n className={`\n relative flex flex-col items-center justify-center\n min-h-[200px] p-6 sm:p-8\n border-2 border-dashed rounded-xl\n transition-colors duration-200 cursor-pointer\n ${isDragOver\n ? 'border-primary bg-primary/5'\n : 'border-base-300 hover:border-primary/50 bg-base-100'\n }\n ${disabled ? 'opacity-50 cursor-not-allowed' : ''}\n ${className}\n `}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') handleClick(); }}\n >\n <input\n ref={inputRef}\n type=\"file\"\n className=\"hidden\"\n accept={acceptStr}\n multiple={multiple}\n onChange={handleInputChange}\n disabled={disabled}\n />\n\n <UploadIcon />\n\n <p className=\"mt-3 text-base font-semibold text-base-content\">\n {labels.dropzoneTitle}\n </p>\n <p className=\"mt-1 text-sm opacity-60\">\n {labels.dropzoneHint}\n </p>\n\n <Button\n variant=\"primary\"\n size=\"sm\"\n outline\n className=\"mt-4\"\n disabled={disabled}\n onClick={() => { /* click propagation handled by parent div */ }}\n >\n {labels.browseButton}\n </Button>\n\n {accept && accept.length > 0 && (\n <p className=\"mt-3 text-xs opacity-50\">\n {accept.join(', ')}\n </p>\n )}\n {maxFileSize && (\n <p className=\"text-xs opacity-50\">\n Max: {formatFileSize(maxFileSize)}\n </p>\n )}\n </div>\n );\n};\n\n/** Format bytes to human-readable string */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileItem.js","names":[],"sources":["../../../src/components/FileUploader/FileItem.tsx"],"sourcesContent":["import React from 'react';\nimport { FileItemProps, UploadStatus } from './types';\nimport Badge from '../Badge';\nimport Button from '../Button';\nimport { formatFileSize } from './DropZone';\n\nconst defaultLabels = {\n removeFile: 'Remove',\n retryFile: 'Retry',\n uploading: 'Uploading',\n uploaded: 'Uploaded',\n failed: 'Failed',\n pending: 'Pending',\n};\n\n// --- Icons ---\n\nconst FileIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 opacity-60 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n);\n\nconst RemoveIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\nconst RetryIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n);\n\n// --- Status Badge ---\n\nfunction statusBadge(status: UploadStatus, labels: typeof defaultLabels) {\n switch (status) {\n case 'pending':\n return <Badge variant=\"ghost\" size=\"xs\">{labels.pending}</Badge>;\n case 'uploading':\n return <Badge variant=\"info\" size=\"xs\">{labels.uploading}</Badge>;\n case 'success':\n return <Badge variant=\"success\" size=\"xs\"><CheckIcon /> {labels.uploaded}</Badge>;\n case 'error':\n return <Badge variant=\"error\" size=\"xs\">{labels.failed}</Badge>;\n }\n}\n\n// --- Component ---\n\nexport const FileItem: React.FC<FileItemProps> = ({\n item,\n labels: userLabels,\n onRemove,\n onRetry,\n onCancel,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n return (\n <div className=\"flex items-center gap-3 px-3 py-2 rounded-lg bg-base-200/50 hover:bg-base-200 transition-colors min-h-[52px]\">\n {/* File icon */}\n <FileIcon />\n\n {/* File info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium truncate\">{item.file.name}</span>\n {statusBadge(item.status, labels)}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs opacity-50\">{formatFileSize(item.file.size)}</span>\n {item.error && (\n <span className=\"text-xs text-error truncate\">{item.error}</span>\n )}\n </div>\n\n {/* Progress bar */}\n {item.status === 'uploading' && (\n <div className=\"mt-1\">\n <progress\n className=\"progress progress-primary w-full h-1.5\"\n value={item.progress}\n max={100}\n />\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {item.status === 'error' && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRetry(item.id)}\n className=\"text-info\"\n >\n <RetryIcon />\n </Button>\n )}\n {item.status === 'uploading' && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onCancel(item.id)}\n className=\"text-warning\"\n >\n <RemoveIcon />\n </Button>\n )}\n {(item.status === 'pending' || item.status === 'success' || item.status === 'error') && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRemove(item.id)}\n className=\"text-error\"\n >\n <RemoveIcon />\n </Button>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileItem.js","names":[],"sources":["../../../src/components/FileUploader/FileItem.tsx"],"sourcesContent":["import React from 'react';\nimport { FileItemProps, UploadStatus } from './types';\nimport Badge from '../Badge';\nimport Button from '../Button';\nimport { formatFileSize } from './DropZone';\n\nconst defaultLabels = {\n removeFile: 'Remove',\n retryFile: 'Retry',\n uploading: 'Uploading',\n uploaded: 'Uploaded',\n failed: 'Failed',\n pending: 'Pending',\n};\n\n// --- Icons ---\n\nconst FileIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 opacity-60 flex-shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" />\n </svg>\n);\n\nconst RemoveIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n);\n\nconst RetryIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n);\n\n// --- Status Badge ---\n\nfunction statusBadge(status: UploadStatus, labels: typeof defaultLabels) {\n switch (status) {\n case 'pending':\n return <Badge variant=\"ghost\" size=\"xs\">{labels.pending}</Badge>;\n case 'uploading':\n return <Badge variant=\"info\" size=\"xs\">{labels.uploading}</Badge>;\n case 'success':\n return <Badge variant=\"success\" size=\"xs\"><CheckIcon /> {labels.uploaded}</Badge>;\n case 'error':\n return <Badge variant=\"error\" size=\"xs\">{labels.failed}</Badge>;\n }\n}\n\n// --- Component ---\n\nexport const FileItem: React.FC<FileItemProps> = ({\n item,\n labels: userLabels,\n onRemove,\n onRetry,\n onCancel,\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n return (\n <div className=\"flex items-center gap-3 px-3 py-2 rounded-lg bg-base-200/50 hover:bg-base-200 transition-colors min-h-[52px]\">\n {/* File icon */}\n <FileIcon />\n\n {/* File info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium truncate\">{item.file.name}</span>\n {statusBadge(item.status, labels)}\n </div>\n <div className=\"flex items-center gap-2 mt-0.5\">\n <span className=\"text-xs opacity-50\">{formatFileSize(item.file.size)}</span>\n {item.error && (\n <span className=\"text-xs text-error truncate\">{item.error}</span>\n )}\n </div>\n\n {/* Progress bar */}\n {item.status === 'uploading' && (\n <div className=\"mt-1\">\n <progress\n className=\"progress progress-primary w-full h-1.5\"\n value={item.progress}\n max={100}\n />\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {item.status === 'error' && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRetry(item.id)}\n className=\"text-info\"\n >\n <RetryIcon />\n </Button>\n )}\n {item.status === 'uploading' && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onCancel(item.id)}\n className=\"text-warning\"\n >\n <RemoveIcon />\n </Button>\n )}\n {(item.status === 'pending' || item.status === 'success' || item.status === 'error') && (\n <Button\n variant=\"ghost\"\n size=\"xs\"\n circle\n onClick={() => onRemove(item.id)}\n className=\"text-error\"\n >\n <RemoveIcon />\n </Button>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FileUploader.js","names":[],"sources":["../../../src/components/FileUploader/FileUploader.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef } from 'react';\nimport { FileUploaderProps, FileItemState, UploadResult } from './types';\nimport { DropZone } from './DropZone';\nimport { UploadQueue } from './UploadQueue';\n\nlet fileIdCounter = 0;\nfunction nextFileId(): string {\n return `file-${Date.now()}-${++fileIdCounter}`;\n}\n\nexport const FileUploader: React.FC<FileUploaderProps> = ({\n adapter,\n accept,\n maxFileSize,\n maxFiles,\n multiple = true,\n autoUpload = false,\n className = '',\n labels,\n onUploadComplete,\n onError,\n onFilesChange,\n}) => {\n const [items, setItems] = useState<FileItemState[]>([]);\n const itemsRef = useRef<FileItemState[]>([]);\n\n // Keep ref in sync for use in async callbacks\n const updateItems = useCallback((updater: (prev: FileItemState[]) => FileItemState[]) => {\n setItems(prev => {\n const next = updater(prev);\n itemsRef.current = next;\n onFilesChange?.(next);\n return next;\n });\n }, [onFilesChange]);\n\n // Upload a single file item\n const uploadFile = useCallback(async (item: FileItemState) => {\n const abortController = new AbortController();\n\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'uploading' as const, progress: 0, error: undefined, abortController }\n : i\n )\n );\n\n try {\n const result = await adapter.upload(\n item.file,\n (percent) => {\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id ? { ...i, progress: Math.min(percent, 100) } : i\n )\n );\n },\n abortController.signal,\n );\n\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'success' as const, progress: 100, result, abortController: undefined }\n : i\n )\n );\n\n return result;\n } catch (err: any) {\n if (err?.name === 'AbortError') {\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'pending' as const, progress: 0, abortController: undefined }\n : i\n )\n );\n return null;\n }\n\n const errorMsg = err?.message || 'Upload failed';\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'error' as const, error: errorMsg, abortController: undefined }\n : i\n )\n );\n onError?.(item.file, err instanceof Error ? err : new Error(errorMsg));\n return null;\n }\n }, [adapter, updateItems, onError]);\n\n // Add files from drop zone\n const handleFilesAdded = useCallback((files: File[]) => {\n const newItems: FileItemState[] = files.map(file => ({\n id: nextFileId(),\n file,\n status: 'pending' as const,\n progress: 0,\n }));\n\n updateItems(prev => [...prev, ...newItems]);\n\n if (autoUpload) {\n // Start uploading each new file\n newItems.forEach(item => {\n uploadFile(item).then(result => {\n if (result) {\n // Check if all items are done after this upload\n const current = itemsRef.current;\n const allDone = current.every(i => i.status === 'success' || i.status === 'error');\n if (allDone) {\n const results = current\n .filter(i => i.status === 'success' && i.result)\n .map(i => i.result!);\n if (results.length > 0) {\n onUploadComplete?.(results);\n }\n }\n }\n });\n });\n }\n }, [autoUpload, uploadFile, updateItems, onUploadComplete]);\n\n // Upload all pending\n const handleUploadAll = useCallback(() => {\n const pending = itemsRef.current.filter(i => i.status === 'pending');\n const uploads = pending.map(item => uploadFile(item));\n\n Promise.allSettled(uploads).then(() => {\n const current = itemsRef.current;\n const results = current\n .filter(i => i.status === 'success' && i.result)\n .map(i => i.result!);\n if (results.length > 0) {\n onUploadComplete?.(results);\n }\n });\n }, [uploadFile, onUploadComplete]);\n\n // Cancel all uploading\n const handleCancelAll = useCallback(() => {\n items.forEach(item => {\n if (item.status === 'uploading' && item.abortController) {\n item.abortController.abort();\n }\n });\n }, [items]);\n\n // Clear completed\n const handleClearCompleted = useCallback(() => {\n updateItems(prev => prev.filter(i => i.status !== 'success'));\n }, [updateItems]);\n\n // Remove single file\n const handleRemove = useCallback((id: string) => {\n updateItems(prev => prev.filter(i => i.id !== id));\n }, [updateItems]);\n\n // Retry single file\n const handleRetry = useCallback((id: string) => {\n const item = itemsRef.current.find(i => i.id === id);\n if (item) uploadFile(item);\n }, [uploadFile]);\n\n // Cancel single upload\n const handleCancel = useCallback((id: string) => {\n const item = itemsRef.current.find(i => i.id === id);\n if (item?.abortController) {\n item.abortController.abort();\n }\n }, []);\n\n const handleValidationError = useCallback((file: File, error: string) => {\n onError?.(file, new Error(error));\n }, [onError]);\n\n return (\n <div className={`w-full ${className}`}>\n <DropZone\n accept={accept}\n maxFileSize={maxFileSize}\n maxFiles={maxFiles}\n multiple={multiple}\n currentFileCount={items.length}\n labels={labels}\n onFilesAdded={handleFilesAdded}\n onValidationError={handleValidationError}\n />\n <UploadQueue\n items={items}\n labels={labels}\n onRemove={handleRemove}\n onRetry={handleRetry}\n onCancel={handleCancel}\n onUploadAll={handleUploadAll}\n onCancelAll={handleCancelAll}\n onClearCompleted={handleClearCompleted}\n />\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileUploader.js","names":[],"sources":["../../../src/components/FileUploader/FileUploader.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef } from 'react';\nimport { FileUploaderProps, FileItemState, UploadResult } from './types';\nimport { DropZone } from './DropZone';\nimport { UploadQueue } from './UploadQueue';\n\nlet fileIdCounter = 0;\nfunction nextFileId(): string {\n return `file-${Date.now()}-${++fileIdCounter}`;\n}\n\nexport const FileUploader: React.FC<FileUploaderProps> = ({\n adapter,\n accept,\n maxFileSize,\n maxFiles,\n multiple = true,\n autoUpload = false,\n className = '',\n labels,\n onUploadComplete,\n onError,\n onFilesChange,\n}) => {\n const [items, setItems] = useState<FileItemState[]>([]);\n const itemsRef = useRef<FileItemState[]>([]);\n\n // Keep ref in sync for use in async callbacks\n const updateItems = useCallback((updater: (prev: FileItemState[]) => FileItemState[]) => {\n setItems(prev => {\n const next = updater(prev);\n itemsRef.current = next;\n onFilesChange?.(next);\n return next;\n });\n }, [onFilesChange]);\n\n // Upload a single file item\n const uploadFile = useCallback(async (item: FileItemState) => {\n const abortController = new AbortController();\n\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'uploading' as const, progress: 0, error: undefined, abortController }\n : i\n )\n );\n\n try {\n const result = await adapter.upload(\n item.file,\n (percent) => {\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id ? { ...i, progress: Math.min(percent, 100) } : i\n )\n );\n },\n abortController.signal,\n );\n\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'success' as const, progress: 100, result, abortController: undefined }\n : i\n )\n );\n\n return result;\n } catch (err: any) {\n if (err?.name === 'AbortError') {\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'pending' as const, progress: 0, abortController: undefined }\n : i\n )\n );\n return null;\n }\n\n const errorMsg = err?.message || 'Upload failed';\n updateItems(prev =>\n prev.map(i =>\n i.id === item.id\n ? { ...i, status: 'error' as const, error: errorMsg, abortController: undefined }\n : i\n )\n );\n onError?.(item.file, err instanceof Error ? err : new Error(errorMsg));\n return null;\n }\n }, [adapter, updateItems, onError]);\n\n // Add files from drop zone\n const handleFilesAdded = useCallback((files: File[]) => {\n const newItems: FileItemState[] = files.map(file => ({\n id: nextFileId(),\n file,\n status: 'pending' as const,\n progress: 0,\n }));\n\n updateItems(prev => [...prev, ...newItems]);\n\n if (autoUpload) {\n // Start uploading each new file\n newItems.forEach(item => {\n uploadFile(item).then(result => {\n if (result) {\n // Check if all items are done after this upload\n const current = itemsRef.current;\n const allDone = current.every(i => i.status === 'success' || i.status === 'error');\n if (allDone) {\n const results = current\n .filter(i => i.status === 'success' && i.result)\n .map(i => i.result!);\n if (results.length > 0) {\n onUploadComplete?.(results);\n }\n }\n }\n });\n });\n }\n }, [autoUpload, uploadFile, updateItems, onUploadComplete]);\n\n // Upload all pending\n const handleUploadAll = useCallback(() => {\n const pending = itemsRef.current.filter(i => i.status === 'pending');\n const uploads = pending.map(item => uploadFile(item));\n\n Promise.allSettled(uploads).then(() => {\n const current = itemsRef.current;\n const results = current\n .filter(i => i.status === 'success' && i.result)\n .map(i => i.result!);\n if (results.length > 0) {\n onUploadComplete?.(results);\n }\n });\n }, [uploadFile, onUploadComplete]);\n\n // Cancel all uploading\n const handleCancelAll = useCallback(() => {\n items.forEach(item => {\n if (item.status === 'uploading' && item.abortController) {\n item.abortController.abort();\n }\n });\n }, [items]);\n\n // Clear completed\n const handleClearCompleted = useCallback(() => {\n updateItems(prev => prev.filter(i => i.status !== 'success'));\n }, [updateItems]);\n\n // Remove single file\n const handleRemove = useCallback((id: string) => {\n updateItems(prev => prev.filter(i => i.id !== id));\n }, [updateItems]);\n\n // Retry single file\n const handleRetry = useCallback((id: string) => {\n const item = itemsRef.current.find(i => i.id === id);\n if (item) uploadFile(item);\n }, [uploadFile]);\n\n // Cancel single upload\n const handleCancel = useCallback((id: string) => {\n const item = itemsRef.current.find(i => i.id === id);\n if (item?.abortController) {\n item.abortController.abort();\n }\n }, []);\n\n const handleValidationError = useCallback((file: File, error: string) => {\n onError?.(file, new Error(error));\n }, [onError]);\n\n return (\n <div className={`w-full ${className}`}>\n <DropZone\n accept={accept}\n maxFileSize={maxFileSize}\n maxFiles={maxFiles}\n multiple={multiple}\n currentFileCount={items.length}\n labels={labels}\n onFilesAdded={handleFilesAdded}\n onValidationError={handleValidationError}\n />\n <UploadQueue\n items={items}\n labels={labels}\n onRemove={handleRemove}\n onRetry={handleRetry}\n onCancel={handleCancel}\n onUploadAll={handleUploadAll}\n onCancelAll={handleCancelAll}\n onClearCompleted={handleClearCompleted}\n />\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UploadQueue.js","names":[],"sources":["../../../src/components/FileUploader/UploadQueue.tsx"],"sourcesContent":["import React from 'react';\nimport { UploadQueueProps } from './types';\nimport { FileItem } from './FileItem';\nimport Button from '../Button';\n\nconst defaultLabels = {\n uploadAll: 'Upload All',\n cancelAll: 'Cancel All',\n clearCompleted: 'Clear Completed',\n fileCount: 'files',\n};\n\nexport const UploadQueue: React.FC<UploadQueueProps> = ({\n items,\n labels: userLabels,\n onRemove,\n onRetry,\n onCancel,\n onUploadAll,\n onCancelAll,\n onClearCompleted,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n const hasPending = items.some(i => i.status === 'pending');\n const hasUploading = items.some(i => i.status === 'uploading');\n const hasCompleted = items.some(i => i.status === 'success');\n\n if (items.length === 0) return null;\n\n return (\n <div className={`mt-4 ${className}`}>\n {/* Batch actions bar */}\n <div className=\"flex items-center justify-between mb-2 px-1\">\n <span className=\"text-sm opacity-60\">\n {items.length} {labels.fileCount}\n </span>\n <div className=\"flex gap-1\">\n {hasPending && (\n <Button variant=\"primary\" size=\"xs\" onClick={onUploadAll}>\n {labels.uploadAll}\n </Button>\n )}\n {hasUploading && (\n <Button variant=\"warning\" size=\"xs\" outline onClick={onCancelAll}>\n {labels.cancelAll}\n </Button>\n )}\n {hasCompleted && (\n <Button variant=\"ghost\" size=\"xs\" onClick={onClearCompleted}>\n {labels.clearCompleted}\n </Button>\n )}\n </div>\n </div>\n\n {/* File list */}\n <div className=\"flex flex-col gap-1.5 max-h-[360px] overflow-y-auto pr-1\">\n {items.map(item => (\n <FileItem\n key={item.id}\n item={item}\n labels={labels}\n onRemove={onRemove}\n onRetry={onRetry}\n onCancel={onCancel}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;AAKA,IAAM,IAAgB;AAAA,EAClB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AACf,GAEa,IAAA,CAA2C,EACpD,OAAA,GACA,QAAQ,GACR,UAAA,GACA,SAAA,GACA,UAAA,GACA,aAAA,GACA,aAAA,GACA,kBAAA,GACA,WAAA,IAAY,GAAA,MACV;AACF,QAAM,IAAS;AAAA,IAAE,GAAG;AAAA,IAAe,GAAG;AAAA,EAAW,GAE3C,IAAa,EAAM,KAAA,CAAK,MAAK,EAAE,WAAW,SAAS,GACnD,IAAe,EAAM,KAAA,CAAK,MAAK,EAAE,WAAW,WAAW,GACvD,IAAe,EAAM,KAAA,CAAK,MAAK,EAAE,WAAW,SAAS;AAE3D,SAAI,EAAM,WAAW,IAAU,OAG3B,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAW,QAAQ,CAAA;AAAA,cAAxB,CAEI,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBAAf,CACI,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,kBAAhB;AAAA,UACK,EAAM;AAAA,UAAO;AAAA,UAAE,EAAO;AAAA,QACrB;AAAA,UACN,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,kBAAf;AAAA,UACK,KACG,gBAAA,EAAC,GAAD;AAAA,YAAQ,SAAQ;AAAA,YAAU,MAAK;AAAA,YAAK,SAAS;AAAA,sBACxC,EAAO;AAAA,UACJ,CAAA;AAAA,UAEX,KACG,gBAAA,EAAC,GAAD;AAAA,YAAQ,SAAQ;AAAA,YAAU,MAAK;AAAA,YAAK,SAAA;AAAA,YAAQ,SAAS;AAAA,sBAChD,EAAO;AAAA,UACJ,CAAA;AAAA,UAEX,KACG,gBAAA,EAAC,GAAD;AAAA,YAAQ,SAAQ;AAAA,YAAQ,MAAK;AAAA,YAAK,SAAS;AAAA,sBACtC,EAAO;AAAA,UACJ,CAAA;AAAA,QAEX;AAAA,QACJ;AAAA,QAGL,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,gBACV,EAAM,IAAA,CAAI,MACP,gBAAA,EAAC,GAAD;AAAA,QAEU,MAAA;AAAA,QACE,QAAA;AAAA,QACE,UAAA;AAAA,QACD,SAAA;AAAA,QACC,UAAA;AAAA,MACb,GANQ,EAAK,EAMb,CACJ;AAAA,IACA,CAAA,CACJ;AAAA;AAEb"}
1
+ {"version":3,"file":"UploadQueue.js","names":[],"sources":["../../../src/components/FileUploader/UploadQueue.tsx"],"sourcesContent":["import React from 'react';\nimport { UploadQueueProps } from './types';\nimport { FileItem } from './FileItem';\nimport Button from '../Button';\n\nconst defaultLabels = {\n uploadAll: 'Upload All',\n cancelAll: 'Cancel All',\n clearCompleted: 'Clear Completed',\n fileCount: 'files',\n};\n\nexport const UploadQueue: React.FC<UploadQueueProps> = ({\n items,\n labels: userLabels,\n onRemove,\n onRetry,\n onCancel,\n onUploadAll,\n onCancelAll,\n onClearCompleted,\n className = '',\n}) => {\n const labels = { ...defaultLabels, ...userLabels };\n\n const hasPending = items.some(i => i.status === 'pending');\n const hasUploading = items.some(i => i.status === 'uploading');\n const hasCompleted = items.some(i => i.status === 'success');\n\n if (items.length === 0) return null;\n\n return (\n <div className={`mt-4 ${className}`}>\n {/* Batch actions bar */}\n <div className=\"flex items-center justify-between mb-2 px-1\">\n <span className=\"text-sm opacity-60\">\n {items.length} {labels.fileCount}\n </span>\n <div className=\"flex gap-1\">\n {hasPending && (\n <Button variant=\"primary\" size=\"xs\" onClick={onUploadAll}>\n {labels.uploadAll}\n </Button>\n )}\n {hasUploading && (\n <Button variant=\"warning\" size=\"xs\" outline onClick={onCancelAll}>\n {labels.cancelAll}\n </Button>\n )}\n {hasCompleted && (\n <Button variant=\"ghost\" size=\"xs\" onClick={onClearCompleted}>\n {labels.clearCompleted}\n </Button>\n )}\n </div>\n </div>\n\n {/* File list */}\n <div className=\"flex flex-col gap-1.5 max-h-[360px] overflow-y-auto pr-1\">\n {items.map(item => (\n <FileItem\n key={item.id}\n item={item}\n labels={labels}\n onRemove={onRemove}\n onRetry={onRetry}\n onCancel={onCancel}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;AAKA,IAAM,IAAgB;AAAA,EAClB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AACf,GAEa,IAAA,CAA2C,EACpD,OAAA,GACA,QAAQ,GACR,UAAA,GACA,SAAA,GACA,UAAA,GACA,aAAA,GACA,aAAA,GACA,kBAAA,GACA,WAAA,IAAY,GAAA,MACV;AACF,QAAM,IAAS;AAAA,IAAE,GAAG;AAAA,IAAe,GAAG;AAAA,EAAW,GAE3C,IAAa,EAAM,KAAA,CAAK,MAAK,EAAE,WAAW,SAAS,GACnD,IAAe,EAAM,KAAA,CAAK,MAAK,EAAE,WAAW,WAAW,GACvD,IAAe,EAAM,KAAA,CAAK,MAAK,EAAE,WAAW,SAAS;AAE3D,SAAI,EAAM,WAAW,IAAU,OAG3B,gBAAA,EAAC,OAAD;AAAA,IAAK,WAAW,QAAQ,CAAA;AAAA,IAAxB,UAAA,CAEI,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MAAf,UAAA,CACI,gBAAA,EAAC,QAAD;AAAA,QAAM,WAAU;AAAA,QAAhB,UAAA;AAAA,UACK,EAAM;AAAA,UAAO;AAAA,UAAE,EAAO;AAAA,QACrB;AAAA,MACN,CAAA,GAAA,gBAAA,EAAC,OAAD;AAAA,QAAK,WAAU;AAAA,QAAf,UAAA;AAAA,UACK,KACG,gBAAA,EAAC,GAAD;AAAA,YAAQ,SAAQ;AAAA,YAAU,MAAK;AAAA,YAAK,SAAS;AAAA,YACxC,UAAA,EAAO;AAAA,UACJ,CAAA;AAAA,UAEX,KACG,gBAAA,EAAC,GAAD;AAAA,YAAQ,SAAQ;AAAA,YAAU,MAAK;AAAA,YAAK,SAAA;AAAA,YAAQ,SAAS;AAAA,YAChD,UAAA,EAAO;AAAA,UACJ,CAAA;AAAA,UAEX,KACG,gBAAA,EAAC,GAAD;AAAA,YAAQ,SAAQ;AAAA,YAAQ,MAAK;AAAA,YAAK,SAAS;AAAA,YACtC,UAAA,EAAO;AAAA,UACJ,CAAA;AAAA,QAEX;AAAA,MACJ,CAAA,CAAA;AAAA,IAGL,CAAA,GAAA,gBAAA,EAAC,OAAD;AAAA,MAAK,WAAU;AAAA,MACV,UAAA,EAAM,IAAA,CAAI,MACP,gBAAA,EAAC,GAAD;AAAA,QAEU,MAAA;AAAA,QACE,QAAA;AAAA,QACE,UAAA;AAAA,QACD,SAAA;AAAA,QACC,UAAA;AAAA,MACb,GANQ,EAAK,EAMb,CACJ;AAAA,IACA,CAAA,CACJ;AAAA;AAEb"}
@@ -1,31 +1,31 @@
1
1
  import { useRef as Y, useState as f } from "react";
2
2
  import { jsx as s, jsxs as t } from "react/jsx-runtime";
3
- var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B, size: L = "sm", disabled: b = !1, required: N = !1, label: h, labelPosition: J = "inline", leftSection: p, rightSection: u, pattern: v, className: $ = "", validator: e = !1, validatorHint: r, validationRules: T = [] }) => {
4
- const [g, K] = f(!1), [W, P] = f(""), [o, O] = f(null), [l, j] = f(!1), [F, Q] = f([]), c = Y(null), M = n === "password" && g ? "text" : n, C = (i) => {
5
- const a = i.target.value;
6
- if (n === "password" && a.length > (d || "").length) {
7
- const m = a.slice((d || "").length);
3
+ var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B, size: L = "sm", disabled: N = !1, required: $ = !1, label: h, labelPosition: J = "inline", leftSection: p, rightSection: u, pattern: v, className: M = "", validator: e = !1, validatorHint: r, validationRules: T = [] }) => {
4
+ const [g, K] = f(!1), [W, P] = f(""), [a, O] = f(null), [o, j] = f(!1), [F, Q] = f([]), c = Y(null), b = n === "password" && g ? "text" : n, C = (i) => {
5
+ const l = i.target.value;
6
+ if (n === "password" && l.length > (d || "").length) {
7
+ const m = l.slice((d || "").length);
8
8
  P(m), setTimeout(() => {
9
9
  P("");
10
10
  }, 1e3);
11
11
  }
12
- e && c.current && U(a), A && A(i);
12
+ e && c.current && U(l), A && A(i);
13
13
  }, U = (i) => {
14
14
  if (!c.current) return;
15
- const a = c.current.checkValidity(), m = [];
15
+ const l = c.current.checkValidity(), m = [];
16
16
  T.length > 0 && T.forEach((G) => {
17
17
  G.pattern.test(i) || m.push(G.message);
18
- }), Q(m), O(a && m.length === 0);
18
+ }), Q(m), O(l && m.length === 0);
19
19
  }, D = () => {
20
20
  K(!g);
21
21
  }, y = () => {
22
- e && !o && j(!0);
22
+ e && !a && j(!0);
23
23
  }, k = () => {
24
24
  j(!1);
25
25
  };
26
26
  let w = "";
27
- e && o !== null && (w = o ? "input-success" : "input-error");
28
- const V = "input border border-base-content/30 bg-base-100 hover:border-base-content/50 focus:border-primary", I = B && !w ? `input-${B}` : "", z = L ? `input-${L}` : "", E = e ? "validator" : "", X = n === "password" && /* @__PURE__ */ s("span", {
27
+ e && a !== null && (w = a ? "input-success" : "input-error");
28
+ const V = "input", I = B && !w ? `input-${B}` : "", z = L ? `input-${L}` : "", E = e ? "validator" : "", X = n === "password" && /* @__PURE__ */ s("span", {
29
29
  className: "cursor-pointer opacity-70 hover:opacity-100",
30
30
  onClick: D,
31
31
  children: g ? /* @__PURE__ */ t("svg", {
@@ -58,14 +58,14 @@ var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B,
58
58
  className: "validation-tooltip",
59
59
  children: F.length > 0 ? /* @__PURE__ */ s("ul", {
60
60
  className: "text-xs list-disc pl-4 py-1",
61
- children: F.map((i, a) => /* @__PURE__ */ s("li", { children: i }, a))
61
+ children: F.map((i, l) => /* @__PURE__ */ s("li", { children: i }, l))
62
62
  }) : r ? /* @__PURE__ */ s("p", {
63
63
  className: "text-xs py-1",
64
64
  children: r
65
65
  }) : null
66
66
  });
67
67
  return h || p || u || n === "password" ? h && J === "top" ? /* @__PURE__ */ t("div", {
68
- className: `relative w-full ${$}`,
68
+ className: `relative w-full ${M}`,
69
69
  onMouseEnter: y,
70
70
  onMouseLeave: k,
71
71
  children: [
@@ -79,12 +79,12 @@ var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B,
79
79
  p && /* @__PURE__ */ s("span", { children: p }),
80
80
  /* @__PURE__ */ s("input", {
81
81
  ref: c,
82
- type: M,
82
+ type: b,
83
83
  placeholder: x,
84
84
  value: d,
85
85
  onChange: C,
86
- disabled: b,
87
- required: N,
86
+ disabled: N,
87
+ required: $,
88
88
  className: "grow",
89
89
  pattern: v
90
90
  }),
@@ -120,17 +120,17 @@ var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B,
120
120
  }) : u ? /* @__PURE__ */ s("span", { children: u }) : null
121
121
  ]
122
122
  }),
123
- e && r && !l && /* @__PURE__ */ s("p", {
123
+ e && r && !o && /* @__PURE__ */ s("p", {
124
124
  className: "validator-hint text-xs mt-1 opacity-70",
125
125
  children: r
126
126
  }),
127
- l && e && !o && /* @__PURE__ */ s("div", {
127
+ o && e && !a && /* @__PURE__ */ s("div", {
128
128
  className: "absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1",
129
129
  children: R
130
130
  })
131
131
  ]
132
132
  }) : /* @__PURE__ */ t("div", {
133
- className: `relative w-full ${$}`,
133
+ className: `relative w-full ${M}`,
134
134
  onMouseEnter: y,
135
135
  onMouseLeave: k,
136
136
  children: [
@@ -141,12 +141,12 @@ var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B,
141
141
  h && /* @__PURE__ */ s("span", { children: h }),
142
142
  /* @__PURE__ */ s("input", {
143
143
  ref: c,
144
- type: M,
144
+ type: b,
145
145
  placeholder: x,
146
146
  value: d,
147
147
  onChange: C,
148
- disabled: b,
149
- required: N,
148
+ disabled: N,
149
+ required: $,
150
150
  className: "grow",
151
151
  pattern: v
152
152
  }),
@@ -157,36 +157,36 @@ var S = ({ placeholder: x, value: d, onChange: A, type: n = "text", variant: B,
157
157
  n === "password" ? /* @__PURE__ */ s("span", { children: X }) : u ? /* @__PURE__ */ s("span", { children: u }) : null
158
158
  ]
159
159
  }),
160
- e && r && !l && /* @__PURE__ */ s("p", {
160
+ e && r && !o && /* @__PURE__ */ s("p", {
161
161
  className: "validator-hint text-xs mt-1 opacity-70",
162
162
  children: r
163
163
  }),
164
- l && e && !o && /* @__PURE__ */ s("div", {
164
+ o && e && !a && /* @__PURE__ */ s("div", {
165
165
  className: "absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1",
166
166
  children: R
167
167
  })
168
168
  ]
169
169
  }) : /* @__PURE__ */ t("div", {
170
- className: `relative w-full ${$}`,
170
+ className: `relative w-full ${M}`,
171
171
  onMouseEnter: y,
172
172
  onMouseLeave: k,
173
173
  children: [
174
174
  /* @__PURE__ */ s("input", {
175
175
  ref: c,
176
- type: M,
176
+ type: b,
177
177
  placeholder: x,
178
178
  value: d,
179
179
  onChange: C,
180
- disabled: b,
181
- required: N,
180
+ disabled: N,
181
+ required: $,
182
182
  className: `${V} ${I} ${z} ${E} ${w} w-full`,
183
183
  pattern: v
184
184
  }),
185
- e && r && !l && /* @__PURE__ */ s("p", {
185
+ e && r && !o && /* @__PURE__ */ s("p", {
186
186
  className: "validator-hint text-xs mt-1 opacity-70",
187
187
  children: r
188
188
  }),
189
- l && e && !o && /* @__PURE__ */ s("div", {
189
+ o && e && !a && /* @__PURE__ */ s("div", {
190
190
  className: "absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1",
191
191
  children: R
192
192
  })
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Input/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\n\nexport type InputProps = {\n placeholder?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n type?: string;\n variant?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'ghost';\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n disabled?: boolean;\n required?: boolean;\n label?: string;\n labelPosition?: 'inline' | 'top';\n leftSection?: React.ReactNode;\n rightSection?: React.ReactNode;\n pattern?: string;\n className?: string;\n validator?: boolean;\n validatorHint?: string;\n validationRules?: {\n pattern: RegExp;\n message: string;\n }[];\n};\n\nconst Input = ({\n placeholder,\n value,\n onChange,\n type = 'text',\n variant,\n size = 'sm',\n disabled = false,\n required = false,\n label,\n labelPosition = 'inline',\n leftSection,\n rightSection,\n pattern,\n className = '',\n validator = false,\n validatorHint,\n validationRules = [],\n}: InputProps) => {\n // 密码显示/隐藏状态\n const [showPassword, setShowPassword] = useState(false);\n // 追踪最近输入的字符\n const [recentInput, setRecentInput] = useState('');\n // 表单验证状态\n const [isValid, setIsValid] = useState<boolean | null>(null);\n // 显示验证提示\n const [showValidationHint, setShowValidationHint] = useState(false);\n // 验证失败的规则消息\n const [failedRules, setFailedRules] = useState<string[]>([]);\n \n // 输入框引用,用于焦点和验证\n const inputRef = useRef<HTMLInputElement>(null);\n \n // 确定实际使用的输入类型\n const actualType = type === 'password' && showPassword ? 'text' : type;\n \n // 处理输入变化,包括密码字符延迟遮罩和验证\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n \n // 处理密码输入的特殊效果\n if (type === 'password' && newValue.length > (value || '').length) {\n // 获取新输入的字符\n const newChar = newValue.slice((value || '').length);\n setRecentInput(newChar);\n \n // 设置定时器延迟清除最近输入的字符\n setTimeout(() => {\n setRecentInput('');\n }, 1000); // 1秒后隐藏\n }\n \n // 验证输入\n if (validator && inputRef.current) {\n validateInput(newValue);\n }\n \n // 调用原始的onChange处理函数\n if (onChange) {\n onChange(e);\n }\n };\n \n // 验证输入值\n const validateInput = (inputValue: string) => {\n if (!inputRef.current) return;\n \n // 使用HTML5自带的验证\n const isNativeValid = inputRef.current.checkValidity();\n \n // 检查自定义验证规则\n const failedMessages: string[] = [];\n \n if (validationRules.length > 0) {\n validationRules.forEach(rule => {\n if (!rule.pattern.test(inputValue)) {\n failedMessages.push(rule.message);\n }\n });\n }\n \n setFailedRules(failedMessages);\n setIsValid(isNativeValid && failedMessages.length === 0);\n };\n \n // 切换密码显示/隐藏\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n \n // 鼠标悬停事件处理\n const handleMouseEnter = () => {\n if (validator && !isValid) {\n setShowValidationHint(true);\n }\n };\n \n const handleMouseLeave = () => {\n setShowValidationHint(false);\n };\n \n // 验证状态相关的类名\n let validationStateClass = '';\n if (validator && isValid !== null) {\n validationStateClass = isValid ? 'input-success' : 'input-error';\n }\n \n const baseClass = 'input border border-base-content/30 bg-base-100 hover:border-base-content/50 focus:border-primary';\n const variantClass = variant && !validationStateClass ? `input-${variant}` : '';\n const sizeClass = size ? `input-${size}` : '';\n const validatorClass = validator ? 'validator' : '';\n \n\n // 密码可见性切换按钮\n const passwordToggle = type === 'password' && (\n <span \n className=\"cursor-pointer opacity-70 hover:opacity-100\"\n onClick={togglePasswordVisibility}\n >\n {showPassword ? (\n // 眼睛关闭图标\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\" />\n <path d=\"M1 1l22 22\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n </svg>\n ) : (\n // 眼睛打开图标\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </span>\n );\n \n // 构建验证提示悬浮框\n const validationTooltip = (\n <div className=\"validation-tooltip\">\n {failedRules.length > 0 ? (\n <ul className=\"text-xs list-disc pl-4 py-1\">\n {failedRules.map((rule, index) => (\n <li key={index}>{rule}</li>\n ))}\n </ul>\n ) : validatorHint ? (\n <p className=\"text-xs py-1\">{validatorHint}</p>\n ) : null}\n </div>\n );\n\n // 如果有label,则使用label作为容器\n if (label || leftSection || rightSection || type === 'password') {\n // labelPosition === 'top': label above the input field\n if (label && labelPosition === 'top') {\n return (\n <div className={`relative w-full ${className}`} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <span className=\"text-sm font-medium mb-1 block\">{label}</span>\n <label className={`${baseClass} ${variantClass} ${sizeClass} ${validatorClass} ${validationStateClass} w-full flex items-center gap-2`}>\n {leftSection && <span>{leftSection}</span>}\n <input\n ref={inputRef}\n type={actualType}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n className=\"grow\"\n pattern={pattern}\n />\n {type === 'password' ? (\n <span className=\"cursor-pointer opacity-70 hover:opacity-100\" onClick={togglePasswordVisibility}>\n {showPassword ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\" />\n <path d=\"M1 1l22 22\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </span>\n ) : rightSection ? (\n <span>{rightSection}</span>\n ) : null}\n </label>\n {validator && validatorHint && !showValidationHint && (\n <p className=\"validator-hint text-xs mt-1 opacity-70\">{validatorHint}</p>\n )}\n {showValidationHint && validator && !isValid && (\n <div className=\"absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1\">\n {validationTooltip}\n </div>\n )}\n </div>\n );\n }\n\n // Default: inline label\n return (\n <div className={`relative w-full ${className}`} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <label className={`${baseClass} ${variantClass} ${sizeClass} ${validatorClass} ${validationStateClass} w-full flex items-center gap-2`}>\n {leftSection && <span>{leftSection}</span>}\n {label && <span>{label}</span>}\n <input\n ref={inputRef}\n type={actualType}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n className=\"grow\"\n pattern={pattern}\n />\n {/* 显示最近输入的字符,仅针对密码字段 */}\n {type === 'password' && recentInput && (\n <span className=\"password-recent absolute right-10 font-mono\">\n {recentInput}\n </span>\n )}\n {/* 加入密码切换按钮或其他右侧元素 */}\n {type === 'password' ? (\n <span>{passwordToggle}</span>\n ) : rightSection ? (\n <span>{rightSection}</span>\n ) : null}\n </label>\n {validator && validatorHint && !showValidationHint && (\n <p className=\"validator-hint text-xs mt-1 opacity-70\">{validatorHint}</p>\n )}\n {showValidationHint && validator && !isValid && (\n <div className=\"absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1\">\n {validationTooltip}\n </div>\n )}\n </div>\n );\n }\n\n // 如果没有label,则直接返回input\n return (\n <div className={`relative w-full ${className}`} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <input\n ref={inputRef}\n type={actualType}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n className={`${baseClass} ${variantClass} ${sizeClass} ${validatorClass} ${validationStateClass} w-full`}\n pattern={pattern}\n />\n {validator && validatorHint && !showValidationHint && (\n <p className=\"validator-hint text-xs mt-1 opacity-70\">{validatorHint}</p>\n )}\n {showValidationHint && validator && !isValid && (\n <div className=\"absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1\">\n {validationTooltip}\n </div>\n )}\n </div>\n );\n};\n\nexport default Input; "],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/Input/index.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\n\nexport type InputProps = {\n placeholder?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n type?: string;\n variant?: 'neutral' | 'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error' | 'ghost';\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n disabled?: boolean;\n required?: boolean;\n label?: string;\n labelPosition?: 'inline' | 'top';\n leftSection?: React.ReactNode;\n rightSection?: React.ReactNode;\n pattern?: string;\n className?: string;\n validator?: boolean;\n validatorHint?: string;\n validationRules?: {\n pattern: RegExp;\n message: string;\n }[];\n};\n\nconst Input = ({\n placeholder,\n value,\n onChange,\n type = 'text',\n variant,\n size = 'sm',\n disabled = false,\n required = false,\n label,\n labelPosition = 'inline',\n leftSection,\n rightSection,\n pattern,\n className = '',\n validator = false,\n validatorHint,\n validationRules = [],\n}: InputProps) => {\n // 密码显示/隐藏状态\n const [showPassword, setShowPassword] = useState(false);\n // 追踪最近输入的字符\n const [recentInput, setRecentInput] = useState('');\n // 表单验证状态\n const [isValid, setIsValid] = useState<boolean | null>(null);\n // 显示验证提示\n const [showValidationHint, setShowValidationHint] = useState(false);\n // 验证失败的规则消息\n const [failedRules, setFailedRules] = useState<string[]>([]);\n \n // 输入框引用,用于焦点和验证\n const inputRef = useRef<HTMLInputElement>(null);\n \n // 确定实际使用的输入类型\n const actualType = type === 'password' && showPassword ? 'text' : type;\n \n // 处理输入变化,包括密码字符延迟遮罩和验证\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n \n // 处理密码输入的特殊效果\n if (type === 'password' && newValue.length > (value || '').length) {\n // 获取新输入的字符\n const newChar = newValue.slice((value || '').length);\n setRecentInput(newChar);\n \n // 设置定时器延迟清除最近输入的字符\n setTimeout(() => {\n setRecentInput('');\n }, 1000); // 1秒后隐藏\n }\n \n // 验证输入\n if (validator && inputRef.current) {\n validateInput(newValue);\n }\n \n // 调用原始的onChange处理函数\n if (onChange) {\n onChange(e);\n }\n };\n \n // 验证输入值\n const validateInput = (inputValue: string) => {\n if (!inputRef.current) return;\n \n // 使用HTML5自带的验证\n const isNativeValid = inputRef.current.checkValidity();\n \n // 检查自定义验证规则\n const failedMessages: string[] = [];\n \n if (validationRules.length > 0) {\n validationRules.forEach(rule => {\n if (!rule.pattern.test(inputValue)) {\n failedMessages.push(rule.message);\n }\n });\n }\n \n setFailedRules(failedMessages);\n setIsValid(isNativeValid && failedMessages.length === 0);\n };\n \n // 切换密码显示/隐藏\n const togglePasswordVisibility = () => {\n setShowPassword(!showPassword);\n };\n \n // 鼠标悬停事件处理\n const handleMouseEnter = () => {\n if (validator && !isValid) {\n setShowValidationHint(true);\n }\n };\n \n const handleMouseLeave = () => {\n setShowValidationHint(false);\n };\n \n // 验证状态相关的类名\n let validationStateClass = '';\n if (validator && isValid !== null) {\n validationStateClass = isValid ? 'input-success' : 'input-error';\n }\n \n const baseClass = 'input';\n const variantClass = variant && !validationStateClass ? `input-${variant}` : '';\n const sizeClass = size ? `input-${size}` : '';\n const validatorClass = validator ? 'validator' : '';\n \n\n // 密码可见性切换按钮\n const passwordToggle = type === 'password' && (\n <span \n className=\"cursor-pointer opacity-70 hover:opacity-100\"\n onClick={togglePasswordVisibility}\n >\n {showPassword ? (\n // 眼睛关闭图标\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\" />\n <path d=\"M1 1l22 22\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n </svg>\n ) : (\n // 眼睛打开图标\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </span>\n );\n \n // 构建验证提示悬浮框\n const validationTooltip = (\n <div className=\"validation-tooltip\">\n {failedRules.length > 0 ? (\n <ul className=\"text-xs list-disc pl-4 py-1\">\n {failedRules.map((rule, index) => (\n <li key={index}>{rule}</li>\n ))}\n </ul>\n ) : validatorHint ? (\n <p className=\"text-xs py-1\">{validatorHint}</p>\n ) : null}\n </div>\n );\n\n // 如果有label,则使用label作为容器\n if (label || leftSection || rightSection || type === 'password') {\n // labelPosition === 'top': label above the input field\n if (label && labelPosition === 'top') {\n return (\n <div className={`relative w-full ${className}`} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <span className=\"text-sm font-medium mb-1 block\">{label}</span>\n <label className={`${baseClass} ${variantClass} ${sizeClass} ${validatorClass} ${validationStateClass} w-full flex items-center gap-2`}>\n {leftSection && <span>{leftSection}</span>}\n <input\n ref={inputRef}\n type={actualType}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n className=\"grow\"\n pattern={pattern}\n />\n {type === 'password' ? (\n <span className=\"cursor-pointer opacity-70 hover:opacity-100\" onClick={togglePasswordVisibility}>\n {showPassword ? (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94\" />\n <path d=\"M14.12 14.12a3 3 0 1 1-4.24-4.24\" />\n <path d=\"M1 1l22 22\" />\n <path d=\"M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19\" />\n </svg>\n ) : (\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n )}\n </span>\n ) : rightSection ? (\n <span>{rightSection}</span>\n ) : null}\n </label>\n {validator && validatorHint && !showValidationHint && (\n <p className=\"validator-hint text-xs mt-1 opacity-70\">{validatorHint}</p>\n )}\n {showValidationHint && validator && !isValid && (\n <div className=\"absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1\">\n {validationTooltip}\n </div>\n )}\n </div>\n );\n }\n\n // Default: inline label\n return (\n <div className={`relative w-full ${className}`} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <label className={`${baseClass} ${variantClass} ${sizeClass} ${validatorClass} ${validationStateClass} w-full flex items-center gap-2`}>\n {leftSection && <span>{leftSection}</span>}\n {label && <span>{label}</span>}\n <input\n ref={inputRef}\n type={actualType}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n className=\"grow\"\n pattern={pattern}\n />\n {/* 显示最近输入的字符,仅针对密码字段 */}\n {type === 'password' && recentInput && (\n <span className=\"password-recent absolute right-10 font-mono\">\n {recentInput}\n </span>\n )}\n {/* 加入密码切换按钮或其他右侧元素 */}\n {type === 'password' ? (\n <span>{passwordToggle}</span>\n ) : rightSection ? (\n <span>{rightSection}</span>\n ) : null}\n </label>\n {validator && validatorHint && !showValidationHint && (\n <p className=\"validator-hint text-xs mt-1 opacity-70\">{validatorHint}</p>\n )}\n {showValidationHint && validator && !isValid && (\n <div className=\"absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1\">\n {validationTooltip}\n </div>\n )}\n </div>\n );\n }\n\n // 如果没有label,则直接返回input\n return (\n <div className={`relative w-full ${className}`} onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>\n <input\n ref={inputRef}\n type={actualType}\n placeholder={placeholder}\n value={value}\n onChange={handleInputChange}\n disabled={disabled}\n required={required}\n className={`${baseClass} ${variantClass} ${sizeClass} ${validatorClass} ${validationStateClass} w-full`}\n pattern={pattern}\n />\n {validator && validatorHint && !showValidationHint && (\n <p className=\"validator-hint text-xs mt-1 opacity-70\">{validatorHint}</p>\n )}\n {showValidationHint && validator && !isValid && (\n <div className=\"absolute z-10 mt-1 bg-base-200 border border-error rounded shadow-lg text-error px-3 py-1\">\n {validationTooltip}\n </div>\n )}\n </div>\n );\n};\n\nexport default Input; "],"mappings":"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"}
@@ -1,63 +1,64 @@
1
- import { useEffect as P, useRef as Q, useState as S } from "react";
2
- import { jsx as U } from "react/jsx-runtime";
3
- var Z = ({ children: k, variant: o = "neutral", size: g = "sm", outline: C = !1, dash: w = !1, soft: D = !1, bold: E = !1, italic: M = !1, underline: N = !1, ellipsis: c = !1, maxWidth: d, stateTimeout: n, styleConfig: u = {}, state: s, onStateChange: r, onClick: i, onDoubleClick: f, onMouseEnter: b, onMouseLeave: m, onDragStart: p, onDragEnd: x, draggable: R = !1, className: $ = "", style: j = {} }) => {
4
- const [L, v] = S("default"), a = s !== void 0 ? s : L, t = Q(null), l = (e) => {
5
- s === void 0 && v(e), r && r(e), y(e);
6
- }, y = (e = a) => {
7
- t.current && (clearTimeout(t.current), t.current = null), n && e !== "default" && s === void 0 && (t.current = setTimeout(() => {
8
- v("default"), r && r("default");
9
- }, n));
1
+ import { useEffect as Q, useRef as S, useState as U } from "react";
2
+ import { jsx as V } from "react/jsx-runtime";
3
+ var _ = ({ children: $, variant: s = "neutral", size: w = "sm", outline: r = !1, dash: f = !1, soft: i = !1, bold: D = !1, italic: E = !1, underline: M = !1, ellipsis: u = !1, maxWidth: m, stateTimeout: c, styleConfig: b = {}, state: a, onStateChange: n, onClick: x, onDoubleClick: p, onMouseEnter: g, onMouseLeave: h, onDragStart: k, onDragEnd: v, draggable: R = !1, className: j = "", style: z = {} }) => {
4
+ const [L, y] = U("default"), o = a !== void 0 ? a : L, t = S(null), l = (e) => {
5
+ a === void 0 && y(e), n && n(e), C(e);
6
+ }, C = (e = o) => {
7
+ t.current && (clearTimeout(t.current), t.current = null), c && e !== "default" && a === void 0 && (t.current = setTimeout(() => {
8
+ y("default"), n && n("default");
9
+ }, c));
10
10
  };
11
- P(() => (y(), () => {
11
+ Q(() => (C(), () => {
12
12
  t.current && clearTimeout(t.current);
13
13
  }), [
14
- a,
15
- n,
16
- s
14
+ o,
15
+ c,
16
+ a
17
17
  ]);
18
- const T = "label dark:text-white", z = o ? `text-${o}` : "", h = {
18
+ const N = {
19
19
  xs: "text-xs",
20
20
  sm: "text-sm",
21
21
  md: "text-base",
22
22
  lg: "text-lg",
23
23
  xl: "text-xl"
24
- }, B = [
24
+ }, T = N[w] || N.md, d = r || f || i, B = [
25
+ d ? "badge" : "label dark:text-white",
26
+ !d && s ? `text-${s}` : "",
25
27
  T,
26
- z,
27
- h[g] || h.md,
28
- C ? "border border-current px-2 py-1 rounded" : "",
29
- w ? "border border-dashed border-current px-2 py-1 rounded" : "",
30
- D ? "bg-opacity-10 bg-current px-2 py-1 rounded" : "",
31
- E ? "font-bold" : "",
32
- M ? "italic" : "",
33
- N ? "underline" : "",
34
- c ? "truncate" : "",
35
- $
28
+ r ? "badge-outline" : "",
29
+ f ? "badge-dash" : "",
30
+ i ? "badge-soft" : "",
31
+ d && s && s !== "neutral" ? `badge-${s}` : "",
32
+ D ? "font-bold" : "",
33
+ E ? "italic" : "",
34
+ M ? "underline" : "",
35
+ u ? "truncate" : "",
36
+ j
36
37
  ].filter(Boolean).join(" "), I = (e) => {
37
- l("clicked"), i && i(e);
38
+ l("clicked"), x && x(e);
38
39
  }, O = (e) => {
39
- l("doubleClicked"), f && f(e);
40
+ l("doubleClicked"), p && p(e);
40
41
  }, q = (e) => {
41
- l("hover"), b && b(e);
42
+ l("hover"), g && g(e);
42
43
  }, A = (e) => {
43
- l("default"), m && m(e);
44
+ l("default"), h && h(e);
44
45
  }, F = (e) => {
45
- l("dragging"), p && p(e);
46
+ l("dragging"), k && k(e);
46
47
  }, G = (e) => {
47
- l("default"), x && x(e);
48
- }, H = u[a]?.style || {}, J = u[a]?.className || "", K = {
49
- ...j,
48
+ l("default"), v && v(e);
49
+ }, H = b[o]?.style || {}, J = b[o]?.className || "", K = {
50
+ ...z,
50
51
  ...H,
51
- ...d ? { maxWidth: d } : {},
52
- ...c ? {
52
+ ...m ? { maxWidth: m } : {},
53
+ ...u ? {
53
54
  display: "inline-block",
54
55
  overflow: "hidden",
55
56
  textOverflow: "ellipsis",
56
57
  whiteSpace: "nowrap"
57
58
  } : {}
58
- };
59
- return /* @__PURE__ */ U("span", {
60
- className: `${B} ${J}`.trim(),
59
+ }, P = `${B} ${J}`.trim();
60
+ return /* @__PURE__ */ V("span", {
61
+ className: P,
61
62
  style: K,
62
63
  onClick: I,
63
64
  onDoubleClick: O,
@@ -66,11 +67,11 @@ var Z = ({ children: k, variant: o = "neutral", size: g = "sm", outline: C = !1,
66
67
  onDragStart: F,
67
68
  onDragEnd: G,
68
69
  draggable: R,
69
- children: k
70
+ children: $
70
71
  });
71
72
  };
72
73
  export {
73
- Z as default
74
+ _ as default
74
75
  };
75
76
 
76
77
  //# sourceMappingURL=index.js.map