@turinhub/atomix-common-ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/AuthPanel-CTKx618F.cjs +2 -0
  2. package/dist/AuthPanel-CTKx618F.cjs.map +1 -0
  3. package/dist/{AuthPanel-D2HFX8eN.js → AuthPanel-Cn_WwmjX.js} +259 -212
  4. package/dist/AuthPanel-Cn_WwmjX.js.map +1 -0
  5. package/dist/PDFSidebar-4DtXqqzN.cjs +2 -0
  6. package/dist/PDFSidebar-4DtXqqzN.cjs.map +1 -0
  7. package/dist/PDFSidebar-ClnrF4Br.js +239 -0
  8. package/dist/PDFSidebar-ClnrF4Br.js.map +1 -0
  9. package/dist/auth.cjs +1 -1
  10. package/dist/auth.js +1 -1
  11. package/dist/components/AuthLoginPanel.d.ts.map +1 -1
  12. package/dist/components/AuthRegisterPanel.d.ts.map +1 -1
  13. package/dist/components/AuthVisualCarousel.d.ts +2 -0
  14. package/dist/components/AuthVisualCarousel.d.ts.map +1 -1
  15. package/dist/components/DataTable.d.ts.map +1 -1
  16. package/dist/components/ImageReader.d.ts.map +1 -1
  17. package/dist/components/MarkdownReader.d.ts.map +1 -1
  18. package/dist/components/PDFReader.d.ts.map +1 -1
  19. package/dist/components/PDFSidebar.d.ts.map +1 -1
  20. package/dist/components/SimplePDFReader.d.ts.map +1 -1
  21. package/dist/components/TableHeader.d.ts.map +1 -1
  22. package/dist/components/TablePagination.d.ts +2 -1
  23. package/dist/components/TablePagination.d.ts.map +1 -1
  24. package/dist/components/VideoReader.d.ts.map +1 -1
  25. package/dist/components/ui/switch.d.ts +5 -0
  26. package/dist/components/ui/switch.d.ts.map +1 -0
  27. package/dist/data-table.cjs.map +1 -1
  28. package/dist/data-table.js.map +1 -1
  29. package/dist/file-upload.cjs +1 -1
  30. package/dist/file-upload.cjs.map +1 -1
  31. package/dist/file-upload.js +36 -36
  32. package/dist/file-upload.js.map +1 -1
  33. package/dist/image-reader.cjs +1 -1
  34. package/dist/image-reader.cjs.map +1 -1
  35. package/dist/image-reader.js +1 -0
  36. package/dist/image-reader.js.map +1 -1
  37. package/dist/index.cjs +1 -1
  38. package/dist/index.js +1 -1
  39. package/dist/markdown-reader.cjs +1 -1
  40. package/dist/markdown-reader.cjs.map +1 -1
  41. package/dist/markdown-reader.js +28 -24
  42. package/dist/markdown-reader.js.map +1 -1
  43. package/dist/pdf-reader.cjs +1 -1
  44. package/dist/pdf-reader.cjs.map +1 -1
  45. package/dist/pdf-reader.js +169 -120
  46. package/dist/pdf-reader.js.map +1 -1
  47. package/dist/pdf-sidebar.cjs +1 -1
  48. package/dist/pdf-sidebar.js +1 -1
  49. package/dist/simple-pdf-reader.cjs +1 -1
  50. package/dist/simple-pdf-reader.cjs.map +1 -1
  51. package/dist/simple-pdf-reader.js +137 -104
  52. package/dist/simple-pdf-reader.js.map +1 -1
  53. package/dist/table-header.cjs +1 -1
  54. package/dist/table-header.cjs.map +1 -1
  55. package/dist/table-header.js +42 -34
  56. package/dist/table-header.js.map +1 -1
  57. package/dist/table-pagination.cjs +1 -1
  58. package/dist/table-pagination.cjs.map +1 -1
  59. package/dist/table-pagination.js +49 -43
  60. package/dist/table-pagination.js.map +1 -1
  61. package/dist/types/component-types.d.ts +1 -0
  62. package/dist/types/component-types.d.ts.map +1 -1
  63. package/dist/video-reader.cjs.map +1 -1
  64. package/dist/video-reader.js.map +1 -1
  65. package/package.json +2 -1
  66. package/dist/AuthPanel-C_2JBE7t.cjs +0 -2
  67. package/dist/AuthPanel-C_2JBE7t.cjs.map +0 -1
  68. package/dist/AuthPanel-D2HFX8eN.js.map +0 -1
  69. package/dist/PDFSidebar-BBtucLK6.js +0 -232
  70. package/dist/PDFSidebar-BBtucLK6.js.map +0 -1
  71. package/dist/PDFSidebar-Di0D-yPS.cjs +0 -2
  72. package/dist/PDFSidebar-Di0D-yPS.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"PDFReader.d.ts","sourceRoot":"","sources":["../../src/components/PDFReader.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PDFReader.d.ts","sourceRoot":"","sources":["../../src/components/PDFReader.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PDFSidebar.d.ts","sourceRoot":"","sources":["../../src/components/PDFSidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnD,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IACrD,MAAM,CAAC,aAAa,EAAE;QACpB,aAAa,EAAE,wBAAwB,CAAC;QACxC,QAAQ,EAAE,WAAW,CAAC;QACtB,MAAM,EAAE,iBAAiB,CAAC;KAC3B,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsBD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe;IACf,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc;IACd,UAAU,EAAE;QACV,IAAI,EAAE,aAAa,CAAC;QACpB,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,WAAW,EAAE,oBAAoB,CAAC;QAClC,WAAW,EAAE,oBAAoB,CAAC;QAClC,UAAU,EAAE,mBAAmB,CAAC;QAChC,QAAQ,EAAE,iBAAiB,CAAC;KAC7B,CAAC;CACH;AAuED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CAAC,EACzB,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,GACX,EAAE,eAAe,2CAsSjB"}
1
+ {"version":3,"file":"PDFSidebar.d.ts","sourceRoot":"","sources":["../../src/components/PDFSidebar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnD,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IAC3C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAC;IACrD,MAAM,CAAC,aAAa,EAAE;QACpB,aAAa,EAAE,wBAAwB,CAAC;QACxC,QAAQ,EAAE,WAAW,CAAC;QACtB,MAAM,EAAE,iBAAiB,CAAC;KAC3B,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsBD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,eAAe;IACf,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,WAAW;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa;IACb,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,cAAc;IACd,UAAU,EAAE;QACV,IAAI,EAAE,aAAa,CAAC;QACpB,QAAQ,EAAE,iBAAiB,CAAC;QAC5B,WAAW,EAAE,oBAAoB,CAAC;QAClC,WAAW,EAAE,oBAAoB,CAAC;QAClC,UAAU,EAAE,mBAAmB,CAAC;QAChC,QAAQ,EAAE,iBAAiB,CAAC;KAC7B,CAAC;CACH;AAyED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,UAAU,CAAC,EACzB,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,GACX,EAAE,eAAe,2CAsSjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"SimplePDFReader.d.ts","sourceRoot":"","sources":["../../src/components/SimplePDFReader.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IAEnC,GAAG,EAAE,MAAM,CAAC;IAGZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAGtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,UAAU,EAAE,2BAA2B,CAAC;IAGxC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAChD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAGrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,EAC9B,GAAG,EACH,WAAe,EACf,YAAkB,EAClB,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,QAAc,EACd,QAAc,EACd,WAAW,EAAE,cAAc,EAC3B,YAAY,EACZ,WAAkB,EAClB,cAAqB,EACrB,aAAoB,EACpB,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAsB,EACtB,SAAkB,GACnB,EAAE,oBAAoB,2CAibtB"}
1
+ {"version":3,"file":"SimplePDFReader.d.ts","sourceRoot":"","sources":["../../src/components/SimplePDFReader.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,cAAc,EACd,iBAAiB,EAClB,MAAM,0BAA0B,CAAC;AAElC;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,aAAa,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IACjE,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IAEnC,GAAG,EAAE,MAAM,CAAC;IAGZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAGtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,UAAU,EAAE,2BAA2B,CAAC;IAGxC,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAChD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAGrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,eAAe,CAAC,EAC9B,GAAG,EACH,WAAe,EACf,YAAkB,EAClB,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,QAAc,EACd,QAAc,EACd,WAAW,EAAE,cAAc,EAC3B,YAAY,EACZ,WAAkB,EAClB,cAAqB,EACrB,aAAoB,EACpB,SAAS,EACT,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,aAAa,EACb,WAAW,EACX,WAAsB,EACtB,SAAkB,GACnB,EAAE,oBAAoB,2CA8ctB"}
@@ -1 +1 @@
1
- {"version":3,"file":"TableHeader.d.ts","sourceRoot":"","sources":["../../src/components/TableHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,iBAA2B,EAC3B,WAAgB,EAChB,cAAc,EACd,QAAQ,EACR,UAAiB,EACjB,MAAM,EACN,WAAW,EACX,aAAa,EACb,OAAe,EACf,UAAU,GACX,EAAE,gBAAgB,2CA8DlB"}
1
+ {"version":3,"file":"TableHeader.d.ts","sourceRoot":"","sources":["../../src/components/TableHeader.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAS,MAAM,OAAO,CAAC;AAEzC,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhF;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAGlB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,iBAA2B,EAC3B,WAAgB,EAChB,cAAc,EACd,QAAQ,EACR,UAAiB,EACjB,MAAM,EACN,WAAW,EACX,aAAa,EACb,OAAe,EACf,UAAU,GACX,EAAE,gBAAgB,2CAgFlB"}
@@ -1,10 +1,11 @@
1
- import { ButtonComponent, SelectComponent, SelectTriggerComponent, SelectContentComponent, SelectItemComponent, SelectValueComponent } from '../types/component-types';
1
+ import { ButtonComponent, SelectComponent, SelectGroupComponent, SelectTriggerComponent, SelectContentComponent, SelectItemComponent, SelectValueComponent } from '../types/component-types';
2
2
  /**
3
3
  * UI 组件适配器接口
4
4
  */
5
5
  export interface PaginationUIComponents {
6
6
  Button: ButtonComponent;
7
7
  Select: SelectComponent;
8
+ SelectGroup?: SelectGroupComponent;
8
9
  SelectTrigger: SelectTriggerComponent;
9
10
  SelectContent: SelectContentComponent;
10
11
  SelectItem: SelectItemComponent;
@@ -1 +1 @@
1
- {"version":3,"file":"TablePagination.d.ts","sourceRoot":"","sources":["../../src/components/TablePagination.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,aAAa,EAAE,sBAAsB,CAAC;IACtC,aAAa,EAAE,sBAAsB,CAAC;IACtC,UAAU,EAAE,mBAAmB,CAAC;IAChC,WAAW,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,eAA8B,EAC9B,oBAA2B,EAC3B,cAAqB,EACrB,SAAgB,EAChB,YAAoB,EACpB,UAAU,GACX,EAAE,oBAAoB,kDA2MtB"}
1
+ {"version":3,"file":"TablePagination.d.ts","sourceRoot":"","sources":["../../src/components/TablePagination.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,eAAe,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,aAAa,EAAE,sBAAsB,CAAC;IACtC,aAAa,EAAE,sBAAsB,CAAC;IACtC,UAAU,EAAE,mBAAmB,CAAC;IAChC,WAAW,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,QAAQ,EACR,KAAK,EACL,YAAY,EACZ,gBAAgB,EAChB,eAA8B,EAC9B,oBAA2B,EAC3B,cAAqB,EACrB,SAAgB,EAChB,YAAoB,EACpB,UAAU,GACX,EAAE,oBAAoB,kDAsNtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"VideoReader.d.ts","sourceRoot":"","sources":["../../src/components/VideoReader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EAEd,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAIlC,eAAO,MAAM,0BAA0B,sDAO7B,CAAC;AAEX,eAAO,MAAM,0BAA0B,qFAM7B,CAAC;AAEX,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC/D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBACf,SAAQ,IAAI,CACV,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,KAAK,CAC9D;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAOD,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,UAAU,EACV,MAAM,EACN,OAAe,EACf,KAAK,EACL,SAAS,EACT,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,WAAyB,EACzB,SAAoB,EACpB,eAA6B,EAC7B,WAAkB,EAClB,gBAAuB,EACvB,sBAA8B,EAC9B,mBAAgD,EAChD,kBAA+C,EAC/C,QAAe,EACf,OAAoB,EACpB,WAAkB,EAClB,YAAY,EACZ,OAAO,EACP,GAAG,UAAU,EACd,EAAE,gBAAgB,2CAmKlB"}
1
+ {"version":3,"file":"VideoReader.d.ts","sourceRoot":"","sources":["../../src/components/VideoReader.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EAEd,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAIlC,eAAO,MAAM,0BAA0B,sDAO7B,CAAC;AAEX,eAAO,MAAM,0BAA0B,qFAM7B,CAAC;AAEX,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,WAAW,CAAC,EAAE,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC5C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,UAAU,CACX;IACC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAC5C,mBAAmB,CAAC,gBAAgB,CAAC,EACrC,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,KAAK,CAC9D;IACC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAOD,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,UAAU,EACV,MAAM,EACN,OAAe,EACf,KAAK,EACL,SAAS,EACT,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,WAAyB,EACzB,SAAoB,EACpB,eAA6B,EAC7B,WAAkB,EAClB,gBAAuB,EACvB,sBAA8B,EAC9B,mBAAgD,EAChD,kBAA+C,EAC/C,QAAe,EACf,OAAoB,EACpB,WAAkB,EAClB,YAAY,EACZ,OAAO,EACP,GAAG,UAAU,EACd,EAAE,gBAAgB,2CAqKlB"}
@@ -0,0 +1,5 @@
1
+ import * as SwitchPrimitives from '@radix-ui/react-switch';
2
+ import * as React from 'react';
3
+ declare const Switch: React.ForwardRefExoticComponent<Omit<SwitchPrimitives.SwitchProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
4
+ export { Switch };
5
+ //# sourceMappingURL=switch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.d.ts","sourceRoot":"","sources":["../../../src/components/ui/switch.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,gBAAgB,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,QAAA,MAAM,MAAM,8JAkBV,CAAC;AAGH,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.cjs","sources":["../src/components/DataTable.tsx"],"sourcesContent":["import { MoreVertical } from 'lucide-react';\nimport { ReactNode } from 'react';\nimport type {\n HTMLAttributes,\n ButtonHTMLAttributes,\n MouseEvent,\n} from 'react';\n\nimport type {\n UIComponent,\n ButtonComponent,\n CardComponent,\n TableComponent,\n TableRowComponent,\n TableCellComponent,\n} from '../types/component-types';\n\nimport type { TableHeaderProps } from './TableHeader';\nimport type { TablePaginationProps } from './TablePagination';\n\ntype ColumnKey<T> = Extract<keyof T, string>;\n\ntype ActionMenuItem<T> = {\n label: ReactNode;\n icon?: ReactNode;\n onClick: (record: T, index: number) => void;\n className?: string;\n separator?: never;\n};\n\ntype ActionSeparatorItem = {\n separator: true;\n className?: string;\n label?: never;\n icon?: never;\n onClick?: never;\n};\n\ntype ActionItem<T> = ActionMenuItem<T> | ActionSeparatorItem;\n\nexport interface Column<T = unknown> {\n key: ColumnKey<T>;\n title: ReactNode;\n render?: (value: T[ColumnKey<T>], record: T, index: number) => ReactNode;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * UI 组件适配器接口\n * 业务项目应该传入自己项目中的 shadcn/ui 组件\n */\nexport interface UIComponents {\n Card: CardComponent;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Table: TableComponent;\n TableBody: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableCell: TableCellComponent;\n TableHead: TableCellComponent;\n TableHeader: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableRow: TableRowComponent;\n Button: ButtonComponent;\n DropdownMenu: UIComponent<HTMLAttributes<HTMLDivElement>>;\n DropdownMenuTrigger: ButtonComponent;\n DropdownMenuContent: UIComponent<\n HTMLAttributes<HTMLDivElement> & { align?: 'start' | 'end' | 'center' }\n >;\n DropdownMenuItem: UIComponent<\n ButtonHTMLAttributes<HTMLDivElement> & {\n onClick?: (e: MouseEvent) => void;\n }\n >;\n DropdownMenuSeparator: UIComponent;\n Skeleton: UIComponent<HTMLAttributes<HTMLDivElement>>;\n TableHeaderComponent: React.ComponentType<TableHeaderProps>;\n TablePaginationComponent: React.ComponentType<TablePaginationProps>;\n}\n\nexport interface DataTableProps<T = unknown> {\n // 数据相关\n data: T[];\n loading?: boolean;\n columns: Column<T>[];\n rowKey: keyof T | ((record: T) => string);\n\n // 空状态\n emptyText?: string;\n searchActiveEmptyText?: string;\n\n // 头部配置\n header?: TableHeaderProps;\n\n // 分页配置\n pagination?: TablePaginationProps & {\n show?: boolean;\n };\n\n // 表格行样式\n rowClassName?: (record: T, index: number) => string;\n onRow?: (\n record: T,\n index: number\n ) => {\n onClick?: () => void;\n onDoubleClick?: () => void;\n };\n\n // 操作列\n actions?: {\n title?: string;\n mode?: 'expanded' | 'collapsed';\n render?: (record: T, index: number) => ReactNode;\n items?: ActionItem<T>[];\n };\n\n // UI 组件注入(可选)\n components?: UIComponents;\n\n // 自定义渲染函数(更灵活)\n renderCard?: (content: ReactNode) => ReactNode;\n renderTable?: (header: ReactNode, body: ReactNode) => ReactNode;\n renderActions?: (record: T, index: number) => ReactNode;\n}\n\n/**\n * 默认的 DataTable 实现\n * 需要通过 components prop 注入 UI 组件\n */\nexport function DataTable<T extends Record<string, any>>({\n data,\n loading = false,\n columns,\n rowKey,\n emptyText = '暂无数据',\n searchActiveEmptyText = '未找到匹配的记录',\n header,\n pagination,\n rowClassName,\n onRow,\n actions,\n components,\n renderCard,\n renderTable,\n renderActions,\n}: DataTableProps<T>) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n <br />\n <code className=\"text-sm\">\n {'import { Card, Table, Button, ... } from \"@/components/ui\"'}\n </code>\n </div>\n );\n }\n\n const {\n Card,\n CardContent,\n CardFooter,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Button,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n Skeleton,\n TableHeaderComponent,\n TablePaginationComponent,\n } = components;\n\n // 获取行的唯一标识\n const getRowKey = (record: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n const keyVal = record[rowKey];\n return keyVal !== undefined && keyVal !== null\n ? String(keyVal)\n : `row-${index}`;\n };\n\n // 检查是否有搜索活动\n const isSearchActive = Boolean(\n header?.searchValue && header.searchValue.trim().length > 0\n );\n const hasActions = Boolean(actions?.render || actions?.items?.length);\n const actionMode: 'expanded' | 'collapsed' =\n actions?.mode ?? (actions?.items?.length ? 'collapsed' : 'expanded');\n const isSeparatorItem = (item: ActionItem<T>): item is ActionSeparatorItem =>\n item.separator === true;\n\n // 渲染操作列\n const defaultRenderActions = (record: T, index: number) => {\n if (!actions || !hasActions) return null;\n\n // 折叠模式:使用 DropdownMenu\n if (\n actionMode === 'collapsed' &&\n actions.items &&\n actions.items.length > 0\n ) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-8 w-8 p-0\"\n aria-label=\"打开行操作菜单\"\n onClick={(event) => event.stopPropagation()}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {actions.items.map((item, itemIndex) =>\n isSeparatorItem(item) ? (\n <DropdownMenuSeparator key={`separator-${itemIndex}`} />\n ) : (\n <DropdownMenuItem\n key={`action-${itemIndex}`}\n onClick={(event) => {\n event.stopPropagation();\n item.onClick(record, index);\n }}\n className={item.className}\n >\n {item.icon && (\n <span className=\"mr-2 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n // 展开模式:使用自定义 render\n return actions.render ? actions.render(record, index) : null;\n };\n\n // 渲染表头\n const renderTableHeader = () => {\n return (\n <TableHeader>\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={`font-semibold text-foreground ${\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : 'text-left'\n }`}\n style={{ width: column.width }}\n >\n {column.title}\n </TableHead>\n ))}\n {hasActions && (\n <TableHead className=\"text-right font-semibold text-foreground\">\n {actions?.title || '操作'}\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n );\n };\n\n // 渲染表体\n const renderTableBody = () => {\n // Loading 状态\n if (loading) {\n return (\n <TableBody>\n {Array.from({ length: 5 }).map((_, index) => (\n <TableRow key={index}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n style={{ width: column.width }}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n {hasActions && (\n <TableCell>\n <Skeleton className=\"ml-auto h-4 w-8\" />\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n );\n }\n\n // 空数据状态\n if (data.length === 0) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"py-8 text-center text-muted-foreground\"\n >\n {isSearchActive ? searchActiveEmptyText : emptyText}\n </TableCell>\n </TableRow>\n </TableBody>\n );\n }\n\n // 数据行\n return (\n <TableBody>\n {data.map((record, index) => {\n const key = getRowKey(record, index);\n const rowProps = onRow?.(record, index);\n const className = rowClassName?.(record, index);\n\n return (\n <TableRow\n key={key}\n className={`${className || ''} hover:bg-muted/50`}\n {...rowProps}\n >\n {columns.map((column) => {\n const value = record[column.key as keyof T];\n const content = column.render\n ? column.render(value as T[ColumnKey<T>], record, index)\n : value;\n\n return (\n <TableCell\n key={String(column.key)}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n {content}\n </TableCell>\n );\n })}\n {hasActions && (\n <TableCell\n className=\"text-right\"\n onClick={(event) => event.stopPropagation()}\n >\n {renderActions\n ? renderActions(record, index)\n : defaultRenderActions(record, index)}\n </TableCell>\n )}\n </TableRow>\n );\n })}\n </TableBody>\n );\n };\n\n // 默认的卡片渲染\n const defaultRenderCard = (content: ReactNode) => (\n <Card>\n {header && (\n <div className=\"p-6 pb-0\">\n <TableHeaderComponent {...header} />\n </div>\n )}\n <CardContent className=\"p-0\">{content}</CardContent>\n {pagination?.show !== false && pagination && (\n <CardFooter className=\"border-t py-4\">\n <TablePaginationComponent\n currentPage={pagination.currentPage}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPageChange={pagination.onPageChange}\n onPageSizeChange={pagination.onPageSizeChange}\n pageSizeOptions={pagination.pageSizeOptions}\n showPageSizeSelector={pagination.showPageSizeSelector}\n showJumpToPage={pagination.showJumpToPage}\n showTotal={pagination.showTotal}\n searchActive={isSearchActive}\n />\n </CardFooter>\n )}\n </Card>\n );\n\n // 默认的表格渲染\n const defaultRenderTable = (tableHeader: ReactNode, tableBody: ReactNode) => (\n <Table>\n {tableHeader}\n {tableBody}\n </Table>\n );\n\n return renderCard\n ? renderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n )\n : defaultRenderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n );\n}\n"],"names":["DataTable","data","loading","columns","rowKey","emptyText","searchActiveEmptyText","header","pagination","rowClassName","onRow","actions","components","renderCard","renderTable","renderActions","jsxs","jsx","Card","CardContent","CardFooter","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Skeleton","TableHeaderComponent","TablePaginationComponent","getRowKey","record","index","keyVal","isSearchActive","hasActions","_a","actionMode","_b","isSeparatorItem","item","defaultRenderActions","event","MoreVertical","itemIndex","renderTableHeader","column","renderTableBody","_","key","rowProps","className","value","content","defaultRenderCard","defaultRenderTable","tableHeader","tableBody"],"mappings":"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"}
1
+ {"version":3,"file":"data-table.cjs","sources":["../src/components/DataTable.tsx"],"sourcesContent":["import { MoreVertical } from 'lucide-react';\nimport { ReactNode } from 'react';\nimport type { HTMLAttributes, ButtonHTMLAttributes, MouseEvent } from 'react';\n\nimport type {\n UIComponent,\n ButtonComponent,\n CardComponent,\n TableComponent,\n TableRowComponent,\n TableCellComponent,\n} from '../types/component-types';\n\nimport type { TableHeaderProps } from './TableHeader';\nimport type { TablePaginationProps } from './TablePagination';\n\ntype ColumnKey<T> = Extract<keyof T, string>;\n\ntype ActionMenuItem<T> = {\n label: ReactNode;\n icon?: ReactNode;\n onClick: (record: T, index: number) => void;\n className?: string;\n separator?: never;\n};\n\ntype ActionSeparatorItem = {\n separator: true;\n className?: string;\n label?: never;\n icon?: never;\n onClick?: never;\n};\n\ntype ActionItem<T> = ActionMenuItem<T> | ActionSeparatorItem;\n\nexport interface Column<T = unknown> {\n key: ColumnKey<T>;\n title: ReactNode;\n render?: (value: T[ColumnKey<T>], record: T, index: number) => ReactNode;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * UI 组件适配器接口\n * 业务项目应该传入自己项目中的 shadcn/ui 组件\n */\nexport interface UIComponents {\n Card: CardComponent;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Table: TableComponent;\n TableBody: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableCell: TableCellComponent;\n TableHead: TableCellComponent;\n TableHeader: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableRow: TableRowComponent;\n Button: ButtonComponent;\n DropdownMenu: UIComponent<HTMLAttributes<HTMLDivElement>>;\n DropdownMenuTrigger: ButtonComponent;\n DropdownMenuContent: UIComponent<\n HTMLAttributes<HTMLDivElement> & { align?: 'start' | 'end' | 'center' }\n >;\n DropdownMenuItem: UIComponent<\n ButtonHTMLAttributes<HTMLDivElement> & {\n onClick?: (e: MouseEvent) => void;\n }\n >;\n DropdownMenuSeparator: UIComponent;\n Skeleton: UIComponent<HTMLAttributes<HTMLDivElement>>;\n TableHeaderComponent: React.ComponentType<TableHeaderProps>;\n TablePaginationComponent: React.ComponentType<TablePaginationProps>;\n}\n\nexport interface DataTableProps<T = unknown> {\n // 数据相关\n data: T[];\n loading?: boolean;\n columns: Column<T>[];\n rowKey: keyof T | ((record: T) => string);\n\n // 空状态\n emptyText?: string;\n searchActiveEmptyText?: string;\n\n // 头部配置\n header?: TableHeaderProps;\n\n // 分页配置\n pagination?: TablePaginationProps & {\n show?: boolean;\n };\n\n // 表格行样式\n rowClassName?: (record: T, index: number) => string;\n onRow?: (\n record: T,\n index: number\n ) => {\n onClick?: () => void;\n onDoubleClick?: () => void;\n };\n\n // 操作列\n actions?: {\n title?: string;\n mode?: 'expanded' | 'collapsed';\n render?: (record: T, index: number) => ReactNode;\n items?: ActionItem<T>[];\n };\n\n // UI 组件注入(可选)\n components?: UIComponents;\n\n // 自定义渲染函数(更灵活)\n renderCard?: (content: ReactNode) => ReactNode;\n renderTable?: (header: ReactNode, body: ReactNode) => ReactNode;\n renderActions?: (record: T, index: number) => ReactNode;\n}\n\n/**\n * 默认的 DataTable 实现\n * 需要通过 components prop 注入 UI 组件\n */\nexport function DataTable<T extends Record<string, any>>({\n data,\n loading = false,\n columns,\n rowKey,\n emptyText = '暂无数据',\n searchActiveEmptyText = '未找到匹配的记录',\n header,\n pagination,\n rowClassName,\n onRow,\n actions,\n components,\n renderCard,\n renderTable,\n renderActions,\n}: DataTableProps<T>) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n <br />\n <code className=\"text-sm\">\n {'import { Card, Table, Button, ... } from \"@/components/ui\"'}\n </code>\n </div>\n );\n }\n\n const {\n Card,\n CardContent,\n CardFooter,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Button,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n Skeleton,\n TableHeaderComponent,\n TablePaginationComponent,\n } = components;\n\n // 获取行的唯一标识\n const getRowKey = (record: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n const keyVal = record[rowKey];\n return keyVal !== undefined && keyVal !== null\n ? String(keyVal)\n : `row-${index}`;\n };\n\n // 检查是否有搜索活动\n const isSearchActive = Boolean(\n header?.searchValue && header.searchValue.trim().length > 0\n );\n const hasActions = Boolean(actions?.render || actions?.items?.length);\n const actionMode: 'expanded' | 'collapsed' =\n actions?.mode ?? (actions?.items?.length ? 'collapsed' : 'expanded');\n const isSeparatorItem = (item: ActionItem<T>): item is ActionSeparatorItem =>\n item.separator === true;\n\n // 渲染操作列\n const defaultRenderActions = (record: T, index: number) => {\n if (!actions || !hasActions) return null;\n\n // 折叠模式:使用 DropdownMenu\n if (\n actionMode === 'collapsed' &&\n actions.items &&\n actions.items.length > 0\n ) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-8 w-8 p-0\"\n aria-label=\"打开行操作菜单\"\n onClick={(event) => event.stopPropagation()}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {actions.items.map((item, itemIndex) =>\n isSeparatorItem(item) ? (\n <DropdownMenuSeparator key={`separator-${itemIndex}`} />\n ) : (\n <DropdownMenuItem\n key={`action-${itemIndex}`}\n onClick={(event) => {\n event.stopPropagation();\n item.onClick(record, index);\n }}\n className={item.className}\n >\n {item.icon && (\n <span className=\"mr-2 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n // 展开模式:使用自定义 render\n return actions.render ? actions.render(record, index) : null;\n };\n\n // 渲染表头\n const renderTableHeader = () => {\n return (\n <TableHeader>\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={`font-semibold text-foreground ${\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : 'text-left'\n }`}\n style={{ width: column.width }}\n >\n {column.title}\n </TableHead>\n ))}\n {hasActions && (\n <TableHead className=\"text-right font-semibold text-foreground\">\n {actions?.title || '操作'}\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n );\n };\n\n // 渲染表体\n const renderTableBody = () => {\n // Loading 状态\n if (loading) {\n return (\n <TableBody>\n {Array.from({ length: 5 }).map((_, index) => (\n <TableRow key={index}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n style={{ width: column.width }}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n {hasActions && (\n <TableCell>\n <Skeleton className=\"ml-auto h-4 w-8\" />\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n );\n }\n\n // 空数据状态\n if (data.length === 0) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"py-8 text-center text-muted-foreground\"\n >\n {isSearchActive ? searchActiveEmptyText : emptyText}\n </TableCell>\n </TableRow>\n </TableBody>\n );\n }\n\n // 数据行\n return (\n <TableBody>\n {data.map((record, index) => {\n const key = getRowKey(record, index);\n const rowProps = onRow?.(record, index);\n const className = rowClassName?.(record, index);\n\n return (\n <TableRow\n key={key}\n className={`${className || ''} hover:bg-muted/50`}\n {...rowProps}\n >\n {columns.map((column) => {\n const value = record[column.key as keyof T];\n const content = column.render\n ? column.render(value as T[ColumnKey<T>], record, index)\n : value;\n\n return (\n <TableCell\n key={String(column.key)}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n {content}\n </TableCell>\n );\n })}\n {hasActions && (\n <TableCell\n className=\"text-right\"\n onClick={(event) => event.stopPropagation()}\n >\n {renderActions\n ? renderActions(record, index)\n : defaultRenderActions(record, index)}\n </TableCell>\n )}\n </TableRow>\n );\n })}\n </TableBody>\n );\n };\n\n // 默认的卡片渲染\n const defaultRenderCard = (content: ReactNode) => (\n <Card>\n {header && (\n <div className=\"p-6 pb-0\">\n <TableHeaderComponent {...header} />\n </div>\n )}\n <CardContent className=\"p-0\">{content}</CardContent>\n {pagination?.show !== false && pagination && (\n <CardFooter className=\"border-t py-4\">\n <TablePaginationComponent\n currentPage={pagination.currentPage}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPageChange={pagination.onPageChange}\n onPageSizeChange={pagination.onPageSizeChange}\n pageSizeOptions={pagination.pageSizeOptions}\n showPageSizeSelector={pagination.showPageSizeSelector}\n showJumpToPage={pagination.showJumpToPage}\n showTotal={pagination.showTotal}\n searchActive={isSearchActive}\n />\n </CardFooter>\n )}\n </Card>\n );\n\n // 默认的表格渲染\n const defaultRenderTable = (tableHeader: ReactNode, tableBody: ReactNode) => (\n <Table>\n {tableHeader}\n {tableBody}\n </Table>\n );\n\n return renderCard\n ? renderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n )\n : defaultRenderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n );\n}\n"],"names":["DataTable","data","loading","columns","rowKey","emptyText","searchActiveEmptyText","header","pagination","rowClassName","onRow","actions","components","renderCard","renderTable","renderActions","jsxs","jsx","Card","CardContent","CardFooter","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Skeleton","TableHeaderComponent","TablePaginationComponent","getRowKey","record","index","keyVal","isSearchActive","hasActions","_a","actionMode","_b","isSeparatorItem","item","defaultRenderActions","event","MoreVertical","itemIndex","renderTableHeader","column","renderTableBody","_","key","rowProps","className","value","content","defaultRenderCard","defaultRenderTable","tableHeader","tableBody"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-table.js","sources":["../src/components/DataTable.tsx"],"sourcesContent":["import { MoreVertical } from 'lucide-react';\nimport { ReactNode } from 'react';\nimport type {\n HTMLAttributes,\n ButtonHTMLAttributes,\n MouseEvent,\n} from 'react';\n\nimport type {\n UIComponent,\n ButtonComponent,\n CardComponent,\n TableComponent,\n TableRowComponent,\n TableCellComponent,\n} from '../types/component-types';\n\nimport type { TableHeaderProps } from './TableHeader';\nimport type { TablePaginationProps } from './TablePagination';\n\ntype ColumnKey<T> = Extract<keyof T, string>;\n\ntype ActionMenuItem<T> = {\n label: ReactNode;\n icon?: ReactNode;\n onClick: (record: T, index: number) => void;\n className?: string;\n separator?: never;\n};\n\ntype ActionSeparatorItem = {\n separator: true;\n className?: string;\n label?: never;\n icon?: never;\n onClick?: never;\n};\n\ntype ActionItem<T> = ActionMenuItem<T> | ActionSeparatorItem;\n\nexport interface Column<T = unknown> {\n key: ColumnKey<T>;\n title: ReactNode;\n render?: (value: T[ColumnKey<T>], record: T, index: number) => ReactNode;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * UI 组件适配器接口\n * 业务项目应该传入自己项目中的 shadcn/ui 组件\n */\nexport interface UIComponents {\n Card: CardComponent;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Table: TableComponent;\n TableBody: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableCell: TableCellComponent;\n TableHead: TableCellComponent;\n TableHeader: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableRow: TableRowComponent;\n Button: ButtonComponent;\n DropdownMenu: UIComponent<HTMLAttributes<HTMLDivElement>>;\n DropdownMenuTrigger: ButtonComponent;\n DropdownMenuContent: UIComponent<\n HTMLAttributes<HTMLDivElement> & { align?: 'start' | 'end' | 'center' }\n >;\n DropdownMenuItem: UIComponent<\n ButtonHTMLAttributes<HTMLDivElement> & {\n onClick?: (e: MouseEvent) => void;\n }\n >;\n DropdownMenuSeparator: UIComponent;\n Skeleton: UIComponent<HTMLAttributes<HTMLDivElement>>;\n TableHeaderComponent: React.ComponentType<TableHeaderProps>;\n TablePaginationComponent: React.ComponentType<TablePaginationProps>;\n}\n\nexport interface DataTableProps<T = unknown> {\n // 数据相关\n data: T[];\n loading?: boolean;\n columns: Column<T>[];\n rowKey: keyof T | ((record: T) => string);\n\n // 空状态\n emptyText?: string;\n searchActiveEmptyText?: string;\n\n // 头部配置\n header?: TableHeaderProps;\n\n // 分页配置\n pagination?: TablePaginationProps & {\n show?: boolean;\n };\n\n // 表格行样式\n rowClassName?: (record: T, index: number) => string;\n onRow?: (\n record: T,\n index: number\n ) => {\n onClick?: () => void;\n onDoubleClick?: () => void;\n };\n\n // 操作列\n actions?: {\n title?: string;\n mode?: 'expanded' | 'collapsed';\n render?: (record: T, index: number) => ReactNode;\n items?: ActionItem<T>[];\n };\n\n // UI 组件注入(可选)\n components?: UIComponents;\n\n // 自定义渲染函数(更灵活)\n renderCard?: (content: ReactNode) => ReactNode;\n renderTable?: (header: ReactNode, body: ReactNode) => ReactNode;\n renderActions?: (record: T, index: number) => ReactNode;\n}\n\n/**\n * 默认的 DataTable 实现\n * 需要通过 components prop 注入 UI 组件\n */\nexport function DataTable<T extends Record<string, any>>({\n data,\n loading = false,\n columns,\n rowKey,\n emptyText = '暂无数据',\n searchActiveEmptyText = '未找到匹配的记录',\n header,\n pagination,\n rowClassName,\n onRow,\n actions,\n components,\n renderCard,\n renderTable,\n renderActions,\n}: DataTableProps<T>) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n <br />\n <code className=\"text-sm\">\n {'import { Card, Table, Button, ... } from \"@/components/ui\"'}\n </code>\n </div>\n );\n }\n\n const {\n Card,\n CardContent,\n CardFooter,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Button,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n Skeleton,\n TableHeaderComponent,\n TablePaginationComponent,\n } = components;\n\n // 获取行的唯一标识\n const getRowKey = (record: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n const keyVal = record[rowKey];\n return keyVal !== undefined && keyVal !== null\n ? String(keyVal)\n : `row-${index}`;\n };\n\n // 检查是否有搜索活动\n const isSearchActive = Boolean(\n header?.searchValue && header.searchValue.trim().length > 0\n );\n const hasActions = Boolean(actions?.render || actions?.items?.length);\n const actionMode: 'expanded' | 'collapsed' =\n actions?.mode ?? (actions?.items?.length ? 'collapsed' : 'expanded');\n const isSeparatorItem = (item: ActionItem<T>): item is ActionSeparatorItem =>\n item.separator === true;\n\n // 渲染操作列\n const defaultRenderActions = (record: T, index: number) => {\n if (!actions || !hasActions) return null;\n\n // 折叠模式:使用 DropdownMenu\n if (\n actionMode === 'collapsed' &&\n actions.items &&\n actions.items.length > 0\n ) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-8 w-8 p-0\"\n aria-label=\"打开行操作菜单\"\n onClick={(event) => event.stopPropagation()}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {actions.items.map((item, itemIndex) =>\n isSeparatorItem(item) ? (\n <DropdownMenuSeparator key={`separator-${itemIndex}`} />\n ) : (\n <DropdownMenuItem\n key={`action-${itemIndex}`}\n onClick={(event) => {\n event.stopPropagation();\n item.onClick(record, index);\n }}\n className={item.className}\n >\n {item.icon && (\n <span className=\"mr-2 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n // 展开模式:使用自定义 render\n return actions.render ? actions.render(record, index) : null;\n };\n\n // 渲染表头\n const renderTableHeader = () => {\n return (\n <TableHeader>\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={`font-semibold text-foreground ${\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : 'text-left'\n }`}\n style={{ width: column.width }}\n >\n {column.title}\n </TableHead>\n ))}\n {hasActions && (\n <TableHead className=\"text-right font-semibold text-foreground\">\n {actions?.title || '操作'}\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n );\n };\n\n // 渲染表体\n const renderTableBody = () => {\n // Loading 状态\n if (loading) {\n return (\n <TableBody>\n {Array.from({ length: 5 }).map((_, index) => (\n <TableRow key={index}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n style={{ width: column.width }}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n {hasActions && (\n <TableCell>\n <Skeleton className=\"ml-auto h-4 w-8\" />\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n );\n }\n\n // 空数据状态\n if (data.length === 0) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"py-8 text-center text-muted-foreground\"\n >\n {isSearchActive ? searchActiveEmptyText : emptyText}\n </TableCell>\n </TableRow>\n </TableBody>\n );\n }\n\n // 数据行\n return (\n <TableBody>\n {data.map((record, index) => {\n const key = getRowKey(record, index);\n const rowProps = onRow?.(record, index);\n const className = rowClassName?.(record, index);\n\n return (\n <TableRow\n key={key}\n className={`${className || ''} hover:bg-muted/50`}\n {...rowProps}\n >\n {columns.map((column) => {\n const value = record[column.key as keyof T];\n const content = column.render\n ? column.render(value as T[ColumnKey<T>], record, index)\n : value;\n\n return (\n <TableCell\n key={String(column.key)}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n {content}\n </TableCell>\n );\n })}\n {hasActions && (\n <TableCell\n className=\"text-right\"\n onClick={(event) => event.stopPropagation()}\n >\n {renderActions\n ? renderActions(record, index)\n : defaultRenderActions(record, index)}\n </TableCell>\n )}\n </TableRow>\n );\n })}\n </TableBody>\n );\n };\n\n // 默认的卡片渲染\n const defaultRenderCard = (content: ReactNode) => (\n <Card>\n {header && (\n <div className=\"p-6 pb-0\">\n <TableHeaderComponent {...header} />\n </div>\n )}\n <CardContent className=\"p-0\">{content}</CardContent>\n {pagination?.show !== false && pagination && (\n <CardFooter className=\"border-t py-4\">\n <TablePaginationComponent\n currentPage={pagination.currentPage}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPageChange={pagination.onPageChange}\n onPageSizeChange={pagination.onPageSizeChange}\n pageSizeOptions={pagination.pageSizeOptions}\n showPageSizeSelector={pagination.showPageSizeSelector}\n showJumpToPage={pagination.showJumpToPage}\n showTotal={pagination.showTotal}\n searchActive={isSearchActive}\n />\n </CardFooter>\n )}\n </Card>\n );\n\n // 默认的表格渲染\n const defaultRenderTable = (tableHeader: ReactNode, tableBody: ReactNode) => (\n <Table>\n {tableHeader}\n {tableBody}\n </Table>\n );\n\n return renderCard\n ? renderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n )\n : defaultRenderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n );\n}\n"],"names":["DataTable","data","loading","columns","rowKey","emptyText","searchActiveEmptyText","header","pagination","rowClassName","onRow","actions","components","renderCard","renderTable","renderActions","jsxs","jsx","Card","CardContent","CardFooter","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Skeleton","TableHeaderComponent","TablePaginationComponent","getRowKey","record","index","keyVal","isSearchActive","hasActions","_a","actionMode","_b","isSeparatorItem","item","defaultRenderActions","event","MoreVertical","itemIndex","renderTableHeader","column","renderTableBody","_","key","rowProps","className","value","content","defaultRenderCard","defaultRenderTable","tableHeader","tableBody"],"mappings":"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"}
1
+ {"version":3,"file":"data-table.js","sources":["../src/components/DataTable.tsx"],"sourcesContent":["import { MoreVertical } from 'lucide-react';\nimport { ReactNode } from 'react';\nimport type { HTMLAttributes, ButtonHTMLAttributes, MouseEvent } from 'react';\n\nimport type {\n UIComponent,\n ButtonComponent,\n CardComponent,\n TableComponent,\n TableRowComponent,\n TableCellComponent,\n} from '../types/component-types';\n\nimport type { TableHeaderProps } from './TableHeader';\nimport type { TablePaginationProps } from './TablePagination';\n\ntype ColumnKey<T> = Extract<keyof T, string>;\n\ntype ActionMenuItem<T> = {\n label: ReactNode;\n icon?: ReactNode;\n onClick: (record: T, index: number) => void;\n className?: string;\n separator?: never;\n};\n\ntype ActionSeparatorItem = {\n separator: true;\n className?: string;\n label?: never;\n icon?: never;\n onClick?: never;\n};\n\ntype ActionItem<T> = ActionMenuItem<T> | ActionSeparatorItem;\n\nexport interface Column<T = unknown> {\n key: ColumnKey<T>;\n title: ReactNode;\n render?: (value: T[ColumnKey<T>], record: T, index: number) => ReactNode;\n width?: string;\n align?: 'left' | 'center' | 'right';\n}\n\n/**\n * UI 组件适配器接口\n * 业务项目应该传入自己项目中的 shadcn/ui 组件\n */\nexport interface UIComponents {\n Card: CardComponent;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Table: TableComponent;\n TableBody: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableCell: TableCellComponent;\n TableHead: TableCellComponent;\n TableHeader: UIComponent<HTMLAttributes<HTMLTableSectionElement>>;\n TableRow: TableRowComponent;\n Button: ButtonComponent;\n DropdownMenu: UIComponent<HTMLAttributes<HTMLDivElement>>;\n DropdownMenuTrigger: ButtonComponent;\n DropdownMenuContent: UIComponent<\n HTMLAttributes<HTMLDivElement> & { align?: 'start' | 'end' | 'center' }\n >;\n DropdownMenuItem: UIComponent<\n ButtonHTMLAttributes<HTMLDivElement> & {\n onClick?: (e: MouseEvent) => void;\n }\n >;\n DropdownMenuSeparator: UIComponent;\n Skeleton: UIComponent<HTMLAttributes<HTMLDivElement>>;\n TableHeaderComponent: React.ComponentType<TableHeaderProps>;\n TablePaginationComponent: React.ComponentType<TablePaginationProps>;\n}\n\nexport interface DataTableProps<T = unknown> {\n // 数据相关\n data: T[];\n loading?: boolean;\n columns: Column<T>[];\n rowKey: keyof T | ((record: T) => string);\n\n // 空状态\n emptyText?: string;\n searchActiveEmptyText?: string;\n\n // 头部配置\n header?: TableHeaderProps;\n\n // 分页配置\n pagination?: TablePaginationProps & {\n show?: boolean;\n };\n\n // 表格行样式\n rowClassName?: (record: T, index: number) => string;\n onRow?: (\n record: T,\n index: number\n ) => {\n onClick?: () => void;\n onDoubleClick?: () => void;\n };\n\n // 操作列\n actions?: {\n title?: string;\n mode?: 'expanded' | 'collapsed';\n render?: (record: T, index: number) => ReactNode;\n items?: ActionItem<T>[];\n };\n\n // UI 组件注入(可选)\n components?: UIComponents;\n\n // 自定义渲染函数(更灵活)\n renderCard?: (content: ReactNode) => ReactNode;\n renderTable?: (header: ReactNode, body: ReactNode) => ReactNode;\n renderActions?: (record: T, index: number) => ReactNode;\n}\n\n/**\n * 默认的 DataTable 实现\n * 需要通过 components prop 注入 UI 组件\n */\nexport function DataTable<T extends Record<string, any>>({\n data,\n loading = false,\n columns,\n rowKey,\n emptyText = '暂无数据',\n searchActiveEmptyText = '未找到匹配的记录',\n header,\n pagination,\n rowClassName,\n onRow,\n actions,\n components,\n renderCard,\n renderTable,\n renderActions,\n}: DataTableProps<T>) {\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n <br />\n <code className=\"text-sm\">\n {'import { Card, Table, Button, ... } from \"@/components/ui\"'}\n </code>\n </div>\n );\n }\n\n const {\n Card,\n CardContent,\n CardFooter,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Button,\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n Skeleton,\n TableHeaderComponent,\n TablePaginationComponent,\n } = components;\n\n // 获取行的唯一标识\n const getRowKey = (record: T, index: number): string => {\n if (typeof rowKey === 'function') {\n return rowKey(record);\n }\n const keyVal = record[rowKey];\n return keyVal !== undefined && keyVal !== null\n ? String(keyVal)\n : `row-${index}`;\n };\n\n // 检查是否有搜索活动\n const isSearchActive = Boolean(\n header?.searchValue && header.searchValue.trim().length > 0\n );\n const hasActions = Boolean(actions?.render || actions?.items?.length);\n const actionMode: 'expanded' | 'collapsed' =\n actions?.mode ?? (actions?.items?.length ? 'collapsed' : 'expanded');\n const isSeparatorItem = (item: ActionItem<T>): item is ActionSeparatorItem =>\n item.separator === true;\n\n // 渲染操作列\n const defaultRenderActions = (record: T, index: number) => {\n if (!actions || !hasActions) return null;\n\n // 折叠模式:使用 DropdownMenu\n if (\n actionMode === 'collapsed' &&\n actions.items &&\n actions.items.length > 0\n ) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n className=\"h-8 w-8 p-0\"\n aria-label=\"打开行操作菜单\"\n onClick={(event) => event.stopPropagation()}\n >\n <MoreVertical className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {actions.items.map((item, itemIndex) =>\n isSeparatorItem(item) ? (\n <DropdownMenuSeparator key={`separator-${itemIndex}`} />\n ) : (\n <DropdownMenuItem\n key={`action-${itemIndex}`}\n onClick={(event) => {\n event.stopPropagation();\n item.onClick(record, index);\n }}\n className={item.className}\n >\n {item.icon && (\n <span className=\"mr-2 h-4 w-4\">{item.icon}</span>\n )}\n {item.label}\n </DropdownMenuItem>\n )\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n\n // 展开模式:使用自定义 render\n return actions.render ? actions.render(record, index) : null;\n };\n\n // 渲染表头\n const renderTableHeader = () => {\n return (\n <TableHeader>\n <TableRow className=\"bg-muted/50 hover:bg-muted/50\">\n {columns.map((column) => (\n <TableHead\n key={String(column.key)}\n className={`font-semibold text-foreground ${\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : 'text-left'\n }`}\n style={{ width: column.width }}\n >\n {column.title}\n </TableHead>\n ))}\n {hasActions && (\n <TableHead className=\"text-right font-semibold text-foreground\">\n {actions?.title || '操作'}\n </TableHead>\n )}\n </TableRow>\n </TableHeader>\n );\n };\n\n // 渲染表体\n const renderTableBody = () => {\n // Loading 状态\n if (loading) {\n return (\n <TableBody>\n {Array.from({ length: 5 }).map((_, index) => (\n <TableRow key={index}>\n {columns.map((column) => (\n <TableCell\n key={String(column.key)}\n style={{ width: column.width }}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n {hasActions && (\n <TableCell>\n <Skeleton className=\"ml-auto h-4 w-8\" />\n </TableCell>\n )}\n </TableRow>\n ))}\n </TableBody>\n );\n }\n\n // 空数据状态\n if (data.length === 0) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={columns.length + (hasActions ? 1 : 0)}\n className=\"py-8 text-center text-muted-foreground\"\n >\n {isSearchActive ? searchActiveEmptyText : emptyText}\n </TableCell>\n </TableRow>\n </TableBody>\n );\n }\n\n // 数据行\n return (\n <TableBody>\n {data.map((record, index) => {\n const key = getRowKey(record, index);\n const rowProps = onRow?.(record, index);\n const className = rowClassName?.(record, index);\n\n return (\n <TableRow\n key={key}\n className={`${className || ''} hover:bg-muted/50`}\n {...rowProps}\n >\n {columns.map((column) => {\n const value = record[column.key as keyof T];\n const content = column.render\n ? column.render(value as T[ColumnKey<T>], record, index)\n : value;\n\n return (\n <TableCell\n key={String(column.key)}\n className={\n column.align === 'center'\n ? 'text-center'\n : column.align === 'right'\n ? 'text-right'\n : ''\n }\n >\n {content}\n </TableCell>\n );\n })}\n {hasActions && (\n <TableCell\n className=\"text-right\"\n onClick={(event) => event.stopPropagation()}\n >\n {renderActions\n ? renderActions(record, index)\n : defaultRenderActions(record, index)}\n </TableCell>\n )}\n </TableRow>\n );\n })}\n </TableBody>\n );\n };\n\n // 默认的卡片渲染\n const defaultRenderCard = (content: ReactNode) => (\n <Card>\n {header && (\n <div className=\"p-6 pb-0\">\n <TableHeaderComponent {...header} />\n </div>\n )}\n <CardContent className=\"p-0\">{content}</CardContent>\n {pagination?.show !== false && pagination && (\n <CardFooter className=\"border-t py-4\">\n <TablePaginationComponent\n currentPage={pagination.currentPage}\n pageSize={pagination.pageSize}\n total={pagination.total}\n onPageChange={pagination.onPageChange}\n onPageSizeChange={pagination.onPageSizeChange}\n pageSizeOptions={pagination.pageSizeOptions}\n showPageSizeSelector={pagination.showPageSizeSelector}\n showJumpToPage={pagination.showJumpToPage}\n showTotal={pagination.showTotal}\n searchActive={isSearchActive}\n />\n </CardFooter>\n )}\n </Card>\n );\n\n // 默认的表格渲染\n const defaultRenderTable = (tableHeader: ReactNode, tableBody: ReactNode) => (\n <Table>\n {tableHeader}\n {tableBody}\n </Table>\n );\n\n return renderCard\n ? renderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n )\n : defaultRenderCard(\n renderTable\n ? renderTable(renderTableHeader(), renderTableBody())\n : defaultRenderTable(renderTableHeader(), renderTableBody())\n );\n}\n"],"names":["DataTable","data","loading","columns","rowKey","emptyText","searchActiveEmptyText","header","pagination","rowClassName","onRow","actions","components","renderCard","renderTable","renderActions","jsxs","jsx","Card","CardContent","CardFooter","Table","TableBody","TableCell","TableHead","TableHeader","TableRow","Button","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","Skeleton","TableHeaderComponent","TablePaginationComponent","getRowKey","record","index","keyVal","isSearchActive","hasActions","_a","actionMode","_b","isSeparatorItem","item","defaultRenderActions","event","MoreVertical","itemIndex","renderTableHeader","column","renderTableBody","_","key","rowProps","className","value","content","defaultRenderCard","defaultRenderTable","tableHeader","tableBody"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./jsx-runtime-BB_1_6y_.cjs"),h=require("lucide-react"),v=require("react"),q=require("./utils-IjLH3w2e.cjs"),js=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/1024/1024).toFixed(1)} MB`:`${(t/1024/1024/1024).toFixed(1)} GB`,J=t=>`${t.name}-${t.size}-${t.lastModified}-${Math.random().toString(36).slice(2)}`,fs=t=>{const x=t.lastIndexOf(".");return x>-1?t.slice(x).toLowerCase():""},hs=(t,x)=>{if(!x)return!0;const d=t.type.toLowerCase(),E=fs(t.name);return x.split(",").map(u=>u.trim().toLowerCase()).filter(Boolean).some(u=>u.startsWith(".")?E===u:u.endsWith("/*")?d.startsWith(u.slice(0,-1)):d===u)},gs=(t,x)=>t instanceof Error&&t.message?t.message:typeof t=="string"&&t?t:x;function Es({components:t,title:x="文件上传",description:d="选择文件后开始上传,支持 Tale SDK 的直接上传和预签名上传流程。",helperText:E,accept:u,multiple:N=!1,maxFiles:Q,maxSize:b,disabled:o=!1,autoUpload:Y=!1,showUploadButton:Z,showResetButton:w=!0,selectLabel:_="选择文件",uploadLabel:T="开始上传",retryLabel:U="重试",resetLabel:K="清空",emptyLabel:ss="尚未选择文件",dropzoneLabel:es="拖拽文件到这里,或点击选择",dropzoneDescription:O="上传前会先完成文件校验,上传逻辑由业务侧注入。",uploadingText:ts="上传中",successText:rs="上传完成",errorText:P="上传失败",className:ns,dropzoneClassName:as,listClassName:is,formatFileSize:W=js,validateFile:k,onFilesChange:R,onUpload:m,onUploadComplete:$,onUploadError:C}){const[c,D]=v.useState([]),[os,M]=v.useState(!1),f=v.useRef(null),I=Z??!!m,y=N?Q:1,A=c.some(s=>s.status==="ready"),g=c.some(s=>s.status==="uploading");if(v.useEffect(()=>{R==null||R(c)},[c,R]),!t)return e.jsxRuntimeExports.jsx("div",{className:"p-4 text-center text-destructive",children:"错误:请通过 components prop 注入 UI 组件"});const{Card:xs,CardHeader:L,CardTitle:S,CardDescription:B,CardContent:us,CardFooter:X,Button:p}=t,j=s=>{D(r=>s(r))},z=(s,r)=>b&&s.size>b?`文件不能超过 ${W(b)}`:hs(s,u)?k==null?void 0:k(s,r):"文件类型不符合要求",cs=(s,r)=>{const i=N?[...r]:[],a=y===void 0?s.length:Math.max(y-i.length,0);return s.slice(0,a).forEach(n=>{const l=z(n,i);i.push({id:J(n),file:n,name:n.name,size:n.size,type:n.type,status:l?"error":"ready",progress:0,error:l})}),y!==void 0&&s.length>a&&s.slice(a).forEach(n=>{i.push({id:J(n),file:n,name:n.name,size:n.size,type:n.type,status:"error",progress:0,error:`最多只能选择 ${y} 个文件`})}),i},F=async s=>{if(!m||s.status==="uploading")return;j(i=>i.map(a=>a.id===s.id?{...a,status:"uploading",progress:a.progress||5}:a));const r=i=>{j(a=>a.map(n=>n.id===s.id?{...n,progress:Math.max(0,Math.min(100,Math.round(i)))}:n))};try{const i=await m(s,{setProgress:r}),a={...s,status:"success",progress:100,error:void 0,result:i};j(n=>n.map(l=>l.id===s.id?a:l)),$==null||$(a)}catch(i){const a={...s,status:"error",progress:0,error:gs(i,P)};j(n=>n.map(l=>l.id===s.id?a:l)),C==null||C(a,i)}},G=async()=>{const s=c.filter(r=>r.status==="ready");for(const r of s)await F(r)},H=s=>{if(!s||o)return;const r=Array.from(s);j(i=>{const a=cs(r,i);return Y&&m&&a.filter(n=>n.status==="ready").forEach(n=>{window.setTimeout(()=>F(n),0)}),a}),f.current&&(f.current.value="")},ds=s=>{s.preventDefault(),M(!1),H(s.dataTransfer.files)},ls=s=>{j(r=>r.filter(i=>i.id!==s))},ms=s=>{const r=z(s.file,c.filter(i=>i.id!==s.id));if(r){j(i=>i.map(a=>a.id===s.id?{...a,error:r}:a));return}F({...s,status:"ready",error:void 0,progress:0})},ps=s=>s.status==="uploading"?e.jsxRuntimeExports.jsxs("span",{className:"inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-300",children:[e.jsxRuntimeExports.jsx(h.Loader2,{className:"h-3.5 w-3.5 animate-spin"}),ts]}):s.status==="success"?e.jsxRuntimeExports.jsxs("span",{className:"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-300",children:[e.jsxRuntimeExports.jsx(h.CheckCircle2,{className:"h-3.5 w-3.5"}),rs]}):s.status==="error"?e.jsxRuntimeExports.jsxs("span",{className:"inline-flex items-center gap-1 text-xs font-medium text-destructive",children:[e.jsxRuntimeExports.jsx(h.XCircle,{className:"h-3.5 w-3.5"}),P]}):e.jsxRuntimeExports.jsx("span",{className:"text-xs text-muted-foreground",children:"待上传"}),V=e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[x&&S&&e.jsxRuntimeExports.jsx(S,{children:x}),x&&!S&&e.jsxRuntimeExports.jsx("div",{className:"text-lg font-semibold leading-none tracking-tight",children:x}),d&&B&&e.jsxRuntimeExports.jsx(B,{children:d}),d&&!B&&e.jsxRuntimeExports.jsx("div",{className:"text-sm text-muted-foreground",children:d})]});return e.jsxRuntimeExports.jsxs(xs,{className:q.cn("overflow-hidden",ns),children:[L&&(x||d)?e.jsxRuntimeExports.jsx(L,{children:V}):(x||d)&&e.jsxRuntimeExports.jsx("div",{className:"space-y-1.5 p-6",children:V}),e.jsxRuntimeExports.jsxs(us,{className:"space-y-4",children:[e.jsxRuntimeExports.jsx("input",{ref:f,type:"file",accept:u,multiple:N,className:"sr-only",onChange:s=>H(s.target.files),disabled:o}),e.jsxRuntimeExports.jsxs("div",{role:"button",tabIndex:o?-1:0,"aria-disabled":o,className:q.cn("flex min-h-40 cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20 px-6 py-8 text-center transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",os&&"border-primary bg-primary/5",o&&"cursor-not-allowed opacity-60",as),onClick:()=>{var s;o||(s=f.current)==null||s.click()},onKeyDown:s=>{var r;!o&&(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),(r=f.current)==null||r.click())},onDragOver:s=>{s.preventDefault(),o||M(!0)},onDragLeave:()=>M(!1),onDrop:ds,children:[e.jsxRuntimeExports.jsx("div",{className:"mb-3 rounded-full bg-primary/10 p-3 text-primary",children:e.jsxRuntimeExports.jsx(h.UploadCloud,{className:"h-6 w-6"})}),e.jsxRuntimeExports.jsx("div",{className:"text-sm font-medium",children:es}),O&&e.jsxRuntimeExports.jsx("div",{className:"mt-1 max-w-md text-sm text-muted-foreground",children:O}),e.jsxRuntimeExports.jsx(p,{type:"button",size:"sm",variant:"secondary",className:"mt-4",disabled:o,onClick:s=>{var r;s.stopPropagation(),(r=f.current)==null||r.click()},children:_})]}),E&&e.jsxRuntimeExports.jsx("div",{className:"text-sm text-muted-foreground",children:E}),e.jsxRuntimeExports.jsx("div",{className:q.cn("space-y-3",is),children:c.length===0?e.jsxRuntimeExports.jsx("div",{className:"rounded-md border border-dashed px-4 py-3 text-sm text-muted-foreground",children:ss}):c.map(s=>e.jsxRuntimeExports.jsx("div",{className:"rounded-lg border bg-background px-4 py-3",children:e.jsxRuntimeExports.jsxs("div",{className:"flex items-start gap-3",children:[e.jsxRuntimeExports.jsx("div",{className:"mt-0.5 rounded-md bg-muted p-2 text-muted-foreground",children:e.jsxRuntimeExports.jsx(h.FileText,{className:"h-4 w-4"})}),e.jsxRuntimeExports.jsxs("div",{className:"min-w-0 flex-1 space-y-2",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[e.jsxRuntimeExports.jsxs("div",{className:"min-w-0",children:[e.jsxRuntimeExports.jsx("div",{className:"truncate text-sm font-medium",children:s.name}),e.jsxRuntimeExports.jsxs("div",{className:"text-xs text-muted-foreground",children:[W(s.size),s.type?` · ${s.type}`:""]})]}),ps(s)]}),s.status==="uploading"&&e.jsxRuntimeExports.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-muted","aria-label":`${s.name} 上传进度`,role:"progressbar","aria-valuenow":s.progress,"aria-valuemin":0,"aria-valuemax":100,children:e.jsxRuntimeExports.jsx("div",{className:"h-full rounded-full bg-primary transition-all",style:{width:`${s.progress}%`}})}),s.error&&e.jsxRuntimeExports.jsx("div",{className:"text-xs text-destructive",children:s.error})]}),e.jsxRuntimeExports.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[s.status==="error"&&m&&e.jsxRuntimeExports.jsx(p,{type:"button",variant:"ghost",size:"sm",disabled:o||g,onClick:()=>ms(s),children:U}),e.jsxRuntimeExports.jsx(p,{type:"button",variant:"ghost",size:"icon","aria-label":`移除 ${s.name}`,disabled:o||s.status==="uploading",onClick:()=>ls(s.id),children:e.jsxRuntimeExports.jsx(h.X,{className:"h-4 w-4"})})]})]})},s.id))})]}),(I||w)&&(X?e.jsxRuntimeExports.jsxs(X,{className:"justify-end gap-2",children:[w&&e.jsxRuntimeExports.jsx(p,{type:"button",variant:"outline",disabled:o||g||c.length===0,onClick:()=>D([]),children:K}),I&&e.jsxRuntimeExports.jsx(p,{type:"button",disabled:o||g||!A||!m,onClick:G,children:T})]}):e.jsxRuntimeExports.jsxs("div",{className:"flex justify-end gap-2 p-6 pt-0",children:[w&&e.jsxRuntimeExports.jsx(p,{type:"button",variant:"outline",disabled:o||g||c.length===0,onClick:()=>D([]),children:K}),I&&e.jsxRuntimeExports.jsx(p,{type:"button",disabled:o||g||!A||!m,onClick:G,children:T})]}))]})}exports.FileUpload=Es;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./jsx-runtime-BB_1_6y_.cjs"),h=require("lucide-react"),v=require("react"),q=require("./utils-IjLH3w2e.cjs"),js=t=>t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:t<1024*1024*1024?`${(t/1024/1024).toFixed(1)} MB`:`${(t/1024/1024/1024).toFixed(1)} GB`,J=t=>`${t.name}-${t.size}-${t.lastModified}-${Math.random().toString(36).slice(2)}`,fs=t=>{const x=t.lastIndexOf(".");return x>-1?t.slice(x).toLowerCase():""},hs=(t,x)=>{if(!x)return!0;const d=t.type.toLowerCase(),E=fs(t.name);return x.split(",").map(u=>u.trim().toLowerCase()).filter(Boolean).some(u=>u.startsWith(".")?E===u:u.endsWith("/*")?d.startsWith(u.slice(0,-1)):d===u)},gs=(t,x)=>t instanceof Error&&t.message?t.message:typeof t=="string"&&t?t:x;function Es({components:t,title:x="文件上传",description:d="选择文件后开始上传,支持 Tale SDK 的直接上传和预签名上传流程。",helperText:E,accept:u,multiple:N=!1,maxFiles:Q,maxSize:b,disabled:o=!1,autoUpload:Y=!1,showUploadButton:Z,showResetButton:w=!0,selectLabel:_="选择文件",uploadLabel:T="开始上传",retryLabel:U="重试",resetLabel:K="清空",emptyLabel:ss="尚未选择文件",dropzoneLabel:es="拖拽文件到这里,或点击选择",dropzoneDescription:O="上传前会先完成文件校验,上传逻辑由业务侧注入。",uploadingText:ts="上传中",successText:rs="上传完成",errorText:P="上传失败",className:ns,dropzoneClassName:is,listClassName:as,formatFileSize:W=js,validateFile:k,onFilesChange:R,onUpload:m,onUploadComplete:$,onUploadError:C}){const[c,D]=v.useState([]),[os,M]=v.useState(!1),f=v.useRef(null),I=Z??!!m,y=N?Q:1,A=c.some(s=>s.status==="ready"),g=c.some(s=>s.status==="uploading");if(v.useEffect(()=>{R==null||R(c)},[c,R]),!t)return e.jsxRuntimeExports.jsx("div",{className:"p-4 text-center text-destructive",children:"错误:请通过 components prop 注入 UI 组件"});const{Card:xs,CardHeader:L,CardTitle:S,CardDescription:B,CardContent:us,CardFooter:X,Button:p}=t,j=s=>{D(r=>s(r))},z=(s,r)=>b&&s.size>b?`文件不能超过 ${W(b)}`:hs(s,u)?k==null?void 0:k(s,r):"文件类型不符合要求",cs=(s,r)=>{const a=N?[...r]:[],i=y===void 0?s.length:Math.max(y-a.length,0);return s.slice(0,i).forEach(n=>{const l=z(n,a);a.push({id:J(n),file:n,name:n.name,size:n.size,type:n.type,status:l?"error":"ready",progress:0,error:l})}),y!==void 0&&s.length>i&&s.slice(i).forEach(n=>{a.push({id:J(n),file:n,name:n.name,size:n.size,type:n.type,status:"error",progress:0,error:`最多只能选择 ${y} 个文件`})}),a},F=async s=>{if(!m||s.status==="uploading")return;j(a=>a.map(i=>i.id===s.id?{...i,status:"uploading",progress:i.progress||5}:i));const r=a=>{j(i=>i.map(n=>n.id===s.id?{...n,progress:Math.max(0,Math.min(100,Math.round(a)))}:n))};try{const a=await m(s,{setProgress:r}),i={...s,status:"success",progress:100,error:void 0,result:a};j(n=>n.map(l=>l.id===s.id?i:l)),$==null||$(i)}catch(a){const i={...s,status:"error",progress:0,error:gs(a,P)};j(n=>n.map(l=>l.id===s.id?i:l)),C==null||C(i,a)}},G=async()=>{const s=c.filter(r=>r.status==="ready");for(const r of s)await F(r)},H=s=>{if(!s||o)return;const r=Array.from(s);j(a=>{const i=cs(r,a);return Y&&m&&i.filter(n=>n.status==="ready").forEach(n=>{window.setTimeout(()=>F(n),0)}),i}),f.current&&(f.current.value="")},ds=s=>{s.preventDefault(),M(!1),H(s.dataTransfer.files)},ls=s=>{j(r=>r.filter(a=>a.id!==s))},ms=s=>{const r=z(s.file,c.filter(a=>a.id!==s.id));if(r){j(a=>a.map(i=>i.id===s.id?{...i,error:r}:i));return}F({...s,status:"ready",error:void 0,progress:0})},ps=s=>s.status==="uploading"?e.jsxRuntimeExports.jsxs("span",{className:"inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-300",children:[e.jsxRuntimeExports.jsx(h.Loader2,{className:"h-3.5 w-3.5 animate-spin"}),ts]}):s.status==="success"?e.jsxRuntimeExports.jsxs("span",{className:"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-300",children:[e.jsxRuntimeExports.jsx(h.CheckCircle2,{className:"h-3.5 w-3.5"}),rs]}):s.status==="error"?e.jsxRuntimeExports.jsxs("span",{className:"inline-flex items-center gap-1 text-xs font-medium text-destructive",children:[e.jsxRuntimeExports.jsx(h.XCircle,{className:"h-3.5 w-3.5"}),P]}):e.jsxRuntimeExports.jsx("span",{className:"text-xs text-muted-foreground",children:"待上传"}),V=e.jsxRuntimeExports.jsxs(e.jsxRuntimeExports.Fragment,{children:[x&&S&&e.jsxRuntimeExports.jsx(S,{children:x}),x&&!S&&e.jsxRuntimeExports.jsx("div",{className:"text-lg font-semibold leading-none tracking-tight",children:x}),d&&B&&e.jsxRuntimeExports.jsx(B,{children:d}),d&&!B&&e.jsxRuntimeExports.jsx("div",{className:"text-sm text-muted-foreground",children:d})]});return e.jsxRuntimeExports.jsxs(xs,{className:q.cn("overflow-hidden",ns),children:[L&&(x||d)?e.jsxRuntimeExports.jsx(L,{children:V}):(x||d)&&e.jsxRuntimeExports.jsx("div",{className:"space-y-1.5 p-6",children:V}),e.jsxRuntimeExports.jsxs(us,{className:"space-y-4",children:[e.jsxRuntimeExports.jsx("input",{ref:f,type:"file",accept:u,multiple:N,className:"sr-only",onChange:s=>H(s.target.files),disabled:o}),e.jsxRuntimeExports.jsxs("div",{role:"button",tabIndex:o?-1:0,"aria-disabled":o,className:q.cn("flex min-h-40 cursor-pointer touch-manipulation flex-col items-center justify-center rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20 px-6 py-8 text-center transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background",os&&"border-primary bg-primary/10 shadow-inner",o&&"cursor-not-allowed opacity-60",is),onClick:()=>{var s;o||(s=f.current)==null||s.click()},onKeyDown:s=>{var r;!o&&(s.key==="Enter"||s.key===" ")&&(s.preventDefault(),(r=f.current)==null||r.click())},onDragOver:s=>{s.preventDefault(),o||M(!0)},onDragLeave:()=>M(!1),onDrop:ds,children:[e.jsxRuntimeExports.jsx("div",{className:"mb-3 rounded-full bg-primary/10 p-3 text-primary",children:e.jsxRuntimeExports.jsx(h.UploadCloud,{className:"h-6 w-6"})}),e.jsxRuntimeExports.jsx("div",{className:"text-sm font-medium",children:es}),O&&e.jsxRuntimeExports.jsx("div",{className:"mt-1 max-w-md text-sm text-muted-foreground",children:O}),e.jsxRuntimeExports.jsx(p,{type:"button",size:"sm",variant:"secondary",className:"mt-4",disabled:o,onClick:s=>{var r;s.stopPropagation(),(r=f.current)==null||r.click()},children:_})]}),E&&e.jsxRuntimeExports.jsx("div",{className:"text-sm text-muted-foreground",children:E}),e.jsxRuntimeExports.jsx("div",{className:q.cn("space-y-3",as),children:c.length===0?e.jsxRuntimeExports.jsx("div",{className:"rounded-md border border-dashed bg-muted/20 px-4 py-3 text-sm text-muted-foreground",children:ss}):c.map(s=>e.jsxRuntimeExports.jsx("div",{className:"rounded-lg border bg-background px-4 py-3 shadow-sm",children:e.jsxRuntimeExports.jsxs("div",{className:"flex min-w-0 items-start gap-3",children:[e.jsxRuntimeExports.jsx("div",{className:"mt-0.5 rounded-md bg-muted p-2 text-muted-foreground",children:e.jsxRuntimeExports.jsx(h.FileText,{className:"h-4 w-4"})}),e.jsxRuntimeExports.jsxs("div",{className:"min-w-0 flex-1 space-y-2",children:[e.jsxRuntimeExports.jsxs("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[e.jsxRuntimeExports.jsxs("div",{className:"min-w-0",children:[e.jsxRuntimeExports.jsx("div",{className:"truncate text-sm font-medium",children:s.name}),e.jsxRuntimeExports.jsxs("div",{className:"text-xs text-muted-foreground",children:[W(s.size),s.type?` · ${s.type}`:""]})]}),ps(s)]}),s.status==="uploading"&&e.jsxRuntimeExports.jsx("div",{className:"h-2 overflow-hidden rounded-full bg-muted","aria-label":`${s.name} 上传进度`,role:"progressbar","aria-valuenow":s.progress,"aria-valuemin":0,"aria-valuemax":100,children:e.jsxRuntimeExports.jsx("div",{className:"h-full rounded-full bg-primary transition-all",style:{width:`${s.progress}%`}})}),s.error&&e.jsxRuntimeExports.jsx("div",{className:"break-words text-xs text-destructive",children:s.error})]}),e.jsxRuntimeExports.jsxs("div",{className:"flex shrink-0 items-center gap-1",children:[s.status==="error"&&m&&e.jsxRuntimeExports.jsx(p,{type:"button",variant:"ghost",size:"sm",disabled:o||g,onClick:()=>ms(s),children:U}),e.jsxRuntimeExports.jsx(p,{type:"button",variant:"ghost",size:"icon","aria-label":`移除 ${s.name}`,disabled:o||s.status==="uploading",onClick:()=>ls(s.id),children:e.jsxRuntimeExports.jsx(h.X,{className:"h-4 w-4"})})]})]})},s.id))})]}),(I||w)&&(X?e.jsxRuntimeExports.jsxs(X,{className:"justify-end gap-2",children:[w&&e.jsxRuntimeExports.jsx(p,{type:"button",variant:"outline",disabled:o||g||c.length===0,onClick:()=>D([]),children:K}),I&&e.jsxRuntimeExports.jsx(p,{type:"button",disabled:o||g||!A||!m,onClick:G,children:T})]}):e.jsxRuntimeExports.jsxs("div",{className:"flex justify-end gap-2 p-6 pt-0",children:[w&&e.jsxRuntimeExports.jsx(p,{type:"button",variant:"outline",disabled:o||g||c.length===0,onClick:()=>D([]),children:K}),I&&e.jsxRuntimeExports.jsx(p,{type:"button",disabled:o||g||!A||!m,onClick:G,children:T})]}))]})}exports.FileUpload=Es;
2
2
  //# sourceMappingURL=file-upload.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload.cjs","sources":["../src/components/FileUpload.tsx"],"sourcesContent":["import {\n CheckCircle2,\n FileText,\n Loader2,\n UploadCloud,\n X,\n XCircle,\n} from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { DragEvent, HTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n ButtonComponent,\n CardComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport type FileUploadStatus = 'ready' | 'uploading' | 'success' | 'error';\n\nexport interface FileUploadItem<TResult = unknown> {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n status: FileUploadStatus;\n progress: number;\n error?: string;\n result?: TResult;\n}\n\nexport interface FileUploadHelpers {\n setProgress: (progress: number) => void;\n}\n\nexport interface FileUploadUIComponents {\n Card: CardComponent;\n CardHeader?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardTitle?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardDescription?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Button: ButtonComponent;\n}\n\nexport interface FileUploadProps<TResult = unknown> {\n components?: FileUploadUIComponents;\n title?: ReactNode;\n description?: ReactNode;\n helperText?: ReactNode;\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n autoUpload?: boolean;\n showUploadButton?: boolean;\n showResetButton?: boolean;\n selectLabel?: string;\n uploadLabel?: string;\n retryLabel?: string;\n resetLabel?: string;\n emptyLabel?: ReactNode;\n dropzoneLabel?: ReactNode;\n dropzoneDescription?: ReactNode;\n uploadingText?: string;\n successText?: string;\n errorText?: string;\n className?: string;\n dropzoneClassName?: string;\n listClassName?: string;\n formatFileSize?: (size: number) => string;\n validateFile?: (\n file: File,\n currentItems: FileUploadItem<TResult>[]\n ) => string | undefined;\n onFilesChange?: (items: FileUploadItem<TResult>[]) => void;\n onUpload?: (\n item: FileUploadItem<TResult>,\n helpers: FileUploadHelpers\n ) => Promise<TResult> | TResult;\n onUploadComplete?: (item: FileUploadItem<TResult>) => void;\n onUploadError?: (item: FileUploadItem<TResult>, error: unknown) => void;\n}\n\nconst defaultFormatFileSize = (size: number) => {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n if (size < 1024 * 1024 * 1024) {\n return `${(size / 1024 / 1024).toFixed(1)} MB`;\n }\n return `${(size / 1024 / 1024 / 1024).toFixed(1)} GB`;\n};\n\nconst createFileId = (file: File) =>\n `${file.name}-${file.size}-${file.lastModified}-${Math.random()\n .toString(36)\n .slice(2)}`;\n\nconst getFileExtension = (fileName: string) => {\n const index = fileName.lastIndexOf('.');\n return index > -1 ? fileName.slice(index).toLowerCase() : '';\n};\n\nconst matchesAccept = (file: File, accept?: string) => {\n if (!accept) return true;\n\n const fileType = file.type.toLowerCase();\n const fileExtension = getFileExtension(file.name);\n\n return accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n .some((rule) => {\n if (rule.startsWith('.')) {\n return fileExtension === rule;\n }\n if (rule.endsWith('/*')) {\n return fileType.startsWith(rule.slice(0, -1));\n }\n return fileType === rule;\n });\n};\n\nconst getErrorMessage = (error: unknown, fallback: string) => {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n if (typeof error === 'string' && error) {\n return error;\n }\n return fallback;\n};\n\nexport function FileUpload<TResult = unknown>({\n components,\n title = '文件上传',\n description = '选择文件后开始上传,支持 Tale SDK 的直接上传和预签名上传流程。',\n helperText,\n accept,\n multiple = false,\n maxFiles,\n maxSize,\n disabled = false,\n autoUpload = false,\n showUploadButton,\n showResetButton = true,\n selectLabel = '选择文件',\n uploadLabel = '开始上传',\n retryLabel = '重试',\n resetLabel = '清空',\n emptyLabel = '尚未选择文件',\n dropzoneLabel = '拖拽文件到这里,或点击选择',\n dropzoneDescription = '上传前会先完成文件校验,上传逻辑由业务侧注入。',\n uploadingText = '上传中',\n successText = '上传完成',\n errorText = '上传失败',\n className,\n dropzoneClassName,\n listClassName,\n formatFileSize = defaultFormatFileSize,\n validateFile,\n onFilesChange,\n onUpload,\n onUploadComplete,\n onUploadError,\n}: FileUploadProps<TResult>) {\n const [items, setItems] = useState<FileUploadItem<TResult>[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const shouldShowUploadButton = showUploadButton ?? Boolean(onUpload);\n const resolvedMaxFiles = multiple ? maxFiles : 1;\n const hasUploadableItems = items.some((item) => item.status === 'ready');\n const isUploading = items.some((item) => item.status === 'uploading');\n\n useEffect(() => {\n onFilesChange?.(items);\n }, [items, onFilesChange]);\n\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n Button,\n } = components;\n\n const updateItems = (\n updater: (\n currentItems: FileUploadItem<TResult>[]\n ) => FileUploadItem<TResult>[]\n ) => {\n setItems((currentItems) => updater(currentItems));\n };\n\n const getValidationError = (\n file: File,\n currentItems: FileUploadItem<TResult>[]\n ) => {\n if (maxSize && file.size > maxSize) {\n return `文件不能超过 ${formatFileSize(maxSize)}`;\n }\n if (!matchesAccept(file, accept)) {\n return '文件类型不符合要求';\n }\n return validateFile?.(file, currentItems);\n };\n\n const createItemsFromFiles = (\n files: File[],\n currentItems: FileUploadItem<TResult>[]\n ) => {\n const nextItems = multiple ? [...currentItems] : [];\n const remainingSlots =\n resolvedMaxFiles === undefined\n ? files.length\n : Math.max(resolvedMaxFiles - nextItems.length, 0);\n\n files.slice(0, remainingSlots).forEach((file) => {\n const error = getValidationError(file, nextItems);\n nextItems.push({\n id: createFileId(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: error ? 'error' : 'ready',\n progress: 0,\n error,\n });\n });\n\n if (resolvedMaxFiles !== undefined && files.length > remainingSlots) {\n files.slice(remainingSlots).forEach((file) => {\n nextItems.push({\n id: createFileId(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: 'error',\n progress: 0,\n error: `最多只能选择 ${resolvedMaxFiles} 个文件`,\n });\n });\n }\n\n return nextItems;\n };\n\n const uploadItem = async (targetItem: FileUploadItem<TResult>) => {\n if (!onUpload || targetItem.status === 'uploading') return;\n\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id\n ? { ...item, status: 'uploading', progress: item.progress || 5 }\n : item\n )\n );\n\n const setProgress = (progress: number) => {\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id\n ? {\n ...item,\n progress: Math.max(0, Math.min(100, Math.round(progress))),\n }\n : item\n )\n );\n };\n\n try {\n const result = await onUpload(targetItem, { setProgress });\n const completedItem = {\n ...targetItem,\n status: 'success' as const,\n progress: 100,\n error: undefined,\n result,\n };\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id ? completedItem : item\n )\n );\n onUploadComplete?.(completedItem);\n } catch (error) {\n const failedItem = {\n ...targetItem,\n status: 'error' as const,\n progress: 0,\n error: getErrorMessage(error, errorText),\n };\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id ? failedItem : item\n )\n );\n onUploadError?.(failedItem, error);\n }\n };\n\n const uploadReadyItems = async () => {\n const readyItems = items.filter((item) => item.status === 'ready');\n for (const item of readyItems) {\n await uploadItem(item);\n }\n };\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || disabled) return;\n const files = Array.from(fileList);\n updateItems((currentItems) => {\n const nextItems = createItemsFromFiles(files, currentItems);\n if (autoUpload && onUpload) {\n nextItems\n .filter((item) => item.status === 'ready')\n .forEach((item) => {\n window.setTimeout(() => uploadItem(item), 0);\n });\n }\n return nextItems;\n });\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragging(false);\n handleFiles(event.dataTransfer.files);\n };\n\n const handleRemove = (id: string) => {\n updateItems((currentItems) =>\n currentItems.filter((item) => item.id !== id)\n );\n };\n\n const handleRetry = (item: FileUploadItem<TResult>) => {\n const error = getValidationError(\n item.file,\n items.filter((currentItem) => currentItem.id !== item.id)\n );\n if (error) {\n updateItems((currentItems) =>\n currentItems.map((currentItem) =>\n currentItem.id === item.id ? { ...currentItem, error } : currentItem\n )\n );\n return;\n }\n uploadItem({ ...item, status: 'ready', error: undefined, progress: 0 });\n };\n\n const renderStatus = (item: FileUploadItem<TResult>) => {\n if (item.status === 'uploading') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-300\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n {uploadingText}\n </span>\n );\n }\n if (item.status === 'success') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-300\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {successText}\n </span>\n );\n }\n if (item.status === 'error') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-destructive\">\n <XCircle className=\"h-3.5 w-3.5\" />\n {errorText}\n </span>\n );\n }\n return <span className=\"text-xs text-muted-foreground\">待上传</span>;\n };\n\n const header = (\n <>\n {title && CardTitle && <CardTitle>{title}</CardTitle>}\n {title && !CardTitle && (\n <div className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </div>\n )}\n {description && CardDescription && (\n <CardDescription>{description}</CardDescription>\n )}\n {description && !CardDescription && (\n <div className=\"text-sm text-muted-foreground\">{description}</div>\n )}\n </>\n );\n\n return (\n <Card className={cn('overflow-hidden', className)}>\n {CardHeader && (title || description) ? (\n <CardHeader>{header}</CardHeader>\n ) : (\n (title || description) && (\n <div className=\"space-y-1.5 p-6\">{header}</div>\n )\n )}\n <CardContent className=\"space-y-4\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"sr-only\"\n onChange={(event) => handleFiles(event.target.files)}\n disabled={disabled}\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n className={cn(\n 'flex min-h-40 cursor-pointer flex-col items-center justify-center rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20 px-6 py-8 text-center transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n isDragging && 'border-primary bg-primary/5',\n disabled && 'cursor-not-allowed opacity-60',\n dropzoneClassName\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.click();\n }\n }}\n onKeyDown={(event) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragOver={(event) => {\n event.preventDefault();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <div className=\"mb-3 rounded-full bg-primary/10 p-3 text-primary\">\n <UploadCloud className=\"h-6 w-6\" />\n </div>\n <div className=\"text-sm font-medium\">{dropzoneLabel}</div>\n {dropzoneDescription && (\n <div className=\"mt-1 max-w-md text-sm text-muted-foreground\">\n {dropzoneDescription}\n </div>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n className=\"mt-4\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n inputRef.current?.click();\n }}\n >\n {selectLabel}\n </Button>\n </div>\n\n {helperText && (\n <div className=\"text-sm text-muted-foreground\">{helperText}</div>\n )}\n\n <div className={cn('space-y-3', listClassName)}>\n {items.length === 0 ? (\n <div className=\"rounded-md border border-dashed px-4 py-3 text-sm text-muted-foreground\">\n {emptyLabel}\n </div>\n ) : (\n items.map((item) => (\n <div\n key={item.id}\n className=\"rounded-lg border bg-background px-4 py-3\"\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"mt-0.5 rounded-md bg-muted p-2 text-muted-foreground\">\n <FileText className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {item.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatFileSize(item.size)}\n {item.type ? ` · ${item.type}` : ''}\n </div>\n </div>\n {renderStatus(item)}\n </div>\n {item.status === 'uploading' && (\n <div\n className=\"h-2 overflow-hidden rounded-full bg-muted\"\n aria-label={`${item.name} 上传进度`}\n role=\"progressbar\"\n aria-valuenow={item.progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${item.progress}%` }}\n />\n </div>\n )}\n {item.error && (\n <div className=\"text-xs text-destructive\">\n {item.error}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {item.status === 'error' && onUpload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={disabled || isUploading}\n onClick={() => handleRetry(item)}\n >\n {retryLabel}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`移除 ${item.name}`}\n disabled={disabled || item.status === 'uploading'}\n onClick={() => handleRemove(item.id)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </CardContent>\n {(shouldShowUploadButton || showResetButton) &&\n (CardFooter ? (\n <CardFooter className=\"justify-end gap-2\">\n {showResetButton && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || isUploading || items.length === 0}\n onClick={() => setItems([])}\n >\n {resetLabel}\n </Button>\n )}\n {shouldShowUploadButton && (\n <Button\n type=\"button\"\n disabled={\n disabled || isUploading || !hasUploadableItems || !onUpload\n }\n onClick={uploadReadyItems}\n >\n {uploadLabel}\n </Button>\n )}\n </CardFooter>\n ) : (\n <div className=\"flex justify-end gap-2 p-6 pt-0\">\n {showResetButton && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || isUploading || items.length === 0}\n onClick={() => setItems([])}\n >\n {resetLabel}\n </Button>\n )}\n {shouldShowUploadButton && (\n <Button\n type=\"button\"\n disabled={\n disabled || isUploading || !hasUploadableItems || !onUpload\n }\n onClick={uploadReadyItems}\n >\n {uploadLabel}\n </Button>\n )}\n </div>\n ))}\n </Card>\n );\n}\n"],"names":["defaultFormatFileSize","size","createFileId","file","getFileExtension","fileName","index","matchesAccept","accept","fileType","fileExtension","item","rule","getErrorMessage","error","fallback","FileUpload","components","title","description","helperText","multiple","maxFiles","maxSize","disabled","autoUpload","showUploadButton","showResetButton","selectLabel","uploadLabel","retryLabel","resetLabel","emptyLabel","dropzoneLabel","dropzoneDescription","uploadingText","successText","errorText","className","dropzoneClassName","listClassName","formatFileSize","validateFile","onFilesChange","onUpload","onUploadComplete","onUploadError","items","setItems","useState","isDragging","setIsDragging","inputRef","useRef","shouldShowUploadButton","resolvedMaxFiles","hasUploadableItems","isUploading","useEffect","jsx","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Button","updateItems","updater","currentItems","getValidationError","createItemsFromFiles","files","nextItems","remainingSlots","uploadItem","targetItem","setProgress","progress","result","completedItem","failedItem","uploadReadyItems","readyItems","handleFiles","fileList","handleDrop","event","handleRemove","id","handleRetry","currentItem","renderStatus","jsxs","Loader2","CheckCircle2","XCircle","header","Fragment","cn","_a","UploadCloud","FileText","X"],"mappings":"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"}
1
+ {"version":3,"file":"file-upload.cjs","sources":["../src/components/FileUpload.tsx"],"sourcesContent":["import {\n CheckCircle2,\n FileText,\n Loader2,\n UploadCloud,\n X,\n XCircle,\n} from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport type { DragEvent, HTMLAttributes, ReactNode } from 'react';\n\nimport { cn } from '../lib/utils';\nimport type {\n ButtonComponent,\n CardComponent,\n UIComponent,\n} from '../types/component-types';\n\nexport type FileUploadStatus = 'ready' | 'uploading' | 'success' | 'error';\n\nexport interface FileUploadItem<TResult = unknown> {\n id: string;\n file: File;\n name: string;\n size: number;\n type: string;\n status: FileUploadStatus;\n progress: number;\n error?: string;\n result?: TResult;\n}\n\nexport interface FileUploadHelpers {\n setProgress: (progress: number) => void;\n}\n\nexport interface FileUploadUIComponents {\n Card: CardComponent;\n CardHeader?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardTitle?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardDescription?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardContent: UIComponent<HTMLAttributes<HTMLDivElement>>;\n CardFooter?: UIComponent<HTMLAttributes<HTMLDivElement>>;\n Button: ButtonComponent;\n}\n\nexport interface FileUploadProps<TResult = unknown> {\n components?: FileUploadUIComponents;\n title?: ReactNode;\n description?: ReactNode;\n helperText?: ReactNode;\n accept?: string;\n multiple?: boolean;\n maxFiles?: number;\n maxSize?: number;\n disabled?: boolean;\n autoUpload?: boolean;\n showUploadButton?: boolean;\n showResetButton?: boolean;\n selectLabel?: string;\n uploadLabel?: string;\n retryLabel?: string;\n resetLabel?: string;\n emptyLabel?: ReactNode;\n dropzoneLabel?: ReactNode;\n dropzoneDescription?: ReactNode;\n uploadingText?: string;\n successText?: string;\n errorText?: string;\n className?: string;\n dropzoneClassName?: string;\n listClassName?: string;\n formatFileSize?: (size: number) => string;\n validateFile?: (\n file: File,\n currentItems: FileUploadItem<TResult>[]\n ) => string | undefined;\n onFilesChange?: (items: FileUploadItem<TResult>[]) => void;\n onUpload?: (\n item: FileUploadItem<TResult>,\n helpers: FileUploadHelpers\n ) => Promise<TResult> | TResult;\n onUploadComplete?: (item: FileUploadItem<TResult>) => void;\n onUploadError?: (item: FileUploadItem<TResult>, error: unknown) => void;\n}\n\nconst defaultFormatFileSize = (size: number) => {\n if (size < 1024) return `${size} B`;\n if (size < 1024 * 1024) return `${(size / 1024).toFixed(1)} KB`;\n if (size < 1024 * 1024 * 1024) {\n return `${(size / 1024 / 1024).toFixed(1)} MB`;\n }\n return `${(size / 1024 / 1024 / 1024).toFixed(1)} GB`;\n};\n\nconst createFileId = (file: File) =>\n `${file.name}-${file.size}-${file.lastModified}-${Math.random()\n .toString(36)\n .slice(2)}`;\n\nconst getFileExtension = (fileName: string) => {\n const index = fileName.lastIndexOf('.');\n return index > -1 ? fileName.slice(index).toLowerCase() : '';\n};\n\nconst matchesAccept = (file: File, accept?: string) => {\n if (!accept) return true;\n\n const fileType = file.type.toLowerCase();\n const fileExtension = getFileExtension(file.name);\n\n return accept\n .split(',')\n .map((item) => item.trim().toLowerCase())\n .filter(Boolean)\n .some((rule) => {\n if (rule.startsWith('.')) {\n return fileExtension === rule;\n }\n if (rule.endsWith('/*')) {\n return fileType.startsWith(rule.slice(0, -1));\n }\n return fileType === rule;\n });\n};\n\nconst getErrorMessage = (error: unknown, fallback: string) => {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n if (typeof error === 'string' && error) {\n return error;\n }\n return fallback;\n};\n\nexport function FileUpload<TResult = unknown>({\n components,\n title = '文件上传',\n description = '选择文件后开始上传,支持 Tale SDK 的直接上传和预签名上传流程。',\n helperText,\n accept,\n multiple = false,\n maxFiles,\n maxSize,\n disabled = false,\n autoUpload = false,\n showUploadButton,\n showResetButton = true,\n selectLabel = '选择文件',\n uploadLabel = '开始上传',\n retryLabel = '重试',\n resetLabel = '清空',\n emptyLabel = '尚未选择文件',\n dropzoneLabel = '拖拽文件到这里,或点击选择',\n dropzoneDescription = '上传前会先完成文件校验,上传逻辑由业务侧注入。',\n uploadingText = '上传中',\n successText = '上传完成',\n errorText = '上传失败',\n className,\n dropzoneClassName,\n listClassName,\n formatFileSize = defaultFormatFileSize,\n validateFile,\n onFilesChange,\n onUpload,\n onUploadComplete,\n onUploadError,\n}: FileUploadProps<TResult>) {\n const [items, setItems] = useState<FileUploadItem<TResult>[]>([]);\n const [isDragging, setIsDragging] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const shouldShowUploadButton = showUploadButton ?? Boolean(onUpload);\n const resolvedMaxFiles = multiple ? maxFiles : 1;\n const hasUploadableItems = items.some((item) => item.status === 'ready');\n const isUploading = items.some((item) => item.status === 'uploading');\n\n useEffect(() => {\n onFilesChange?.(items);\n }, [items, onFilesChange]);\n\n if (!components) {\n return (\n <div className=\"p-4 text-center text-destructive\">\n 错误:请通过 components prop 注入 UI 组件\n </div>\n );\n }\n\n const {\n Card,\n CardHeader,\n CardTitle,\n CardDescription,\n CardContent,\n CardFooter,\n Button,\n } = components;\n\n const updateItems = (\n updater: (\n currentItems: FileUploadItem<TResult>[]\n ) => FileUploadItem<TResult>[]\n ) => {\n setItems((currentItems) => updater(currentItems));\n };\n\n const getValidationError = (\n file: File,\n currentItems: FileUploadItem<TResult>[]\n ) => {\n if (maxSize && file.size > maxSize) {\n return `文件不能超过 ${formatFileSize(maxSize)}`;\n }\n if (!matchesAccept(file, accept)) {\n return '文件类型不符合要求';\n }\n return validateFile?.(file, currentItems);\n };\n\n const createItemsFromFiles = (\n files: File[],\n currentItems: FileUploadItem<TResult>[]\n ) => {\n const nextItems = multiple ? [...currentItems] : [];\n const remainingSlots =\n resolvedMaxFiles === undefined\n ? files.length\n : Math.max(resolvedMaxFiles - nextItems.length, 0);\n\n files.slice(0, remainingSlots).forEach((file) => {\n const error = getValidationError(file, nextItems);\n nextItems.push({\n id: createFileId(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: error ? 'error' : 'ready',\n progress: 0,\n error,\n });\n });\n\n if (resolvedMaxFiles !== undefined && files.length > remainingSlots) {\n files.slice(remainingSlots).forEach((file) => {\n nextItems.push({\n id: createFileId(file),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: 'error',\n progress: 0,\n error: `最多只能选择 ${resolvedMaxFiles} 个文件`,\n });\n });\n }\n\n return nextItems;\n };\n\n const uploadItem = async (targetItem: FileUploadItem<TResult>) => {\n if (!onUpload || targetItem.status === 'uploading') return;\n\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id\n ? { ...item, status: 'uploading', progress: item.progress || 5 }\n : item\n )\n );\n\n const setProgress = (progress: number) => {\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id\n ? {\n ...item,\n progress: Math.max(0, Math.min(100, Math.round(progress))),\n }\n : item\n )\n );\n };\n\n try {\n const result = await onUpload(targetItem, { setProgress });\n const completedItem = {\n ...targetItem,\n status: 'success' as const,\n progress: 100,\n error: undefined,\n result,\n };\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id ? completedItem : item\n )\n );\n onUploadComplete?.(completedItem);\n } catch (error) {\n const failedItem = {\n ...targetItem,\n status: 'error' as const,\n progress: 0,\n error: getErrorMessage(error, errorText),\n };\n updateItems((currentItems) =>\n currentItems.map((item) =>\n item.id === targetItem.id ? failedItem : item\n )\n );\n onUploadError?.(failedItem, error);\n }\n };\n\n const uploadReadyItems = async () => {\n const readyItems = items.filter((item) => item.status === 'ready');\n for (const item of readyItems) {\n await uploadItem(item);\n }\n };\n\n const handleFiles = (fileList: FileList | null) => {\n if (!fileList || disabled) return;\n const files = Array.from(fileList);\n updateItems((currentItems) => {\n const nextItems = createItemsFromFiles(files, currentItems);\n if (autoUpload && onUpload) {\n nextItems\n .filter((item) => item.status === 'ready')\n .forEach((item) => {\n window.setTimeout(() => uploadItem(item), 0);\n });\n }\n return nextItems;\n });\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragging(false);\n handleFiles(event.dataTransfer.files);\n };\n\n const handleRemove = (id: string) => {\n updateItems((currentItems) =>\n currentItems.filter((item) => item.id !== id)\n );\n };\n\n const handleRetry = (item: FileUploadItem<TResult>) => {\n const error = getValidationError(\n item.file,\n items.filter((currentItem) => currentItem.id !== item.id)\n );\n if (error) {\n updateItems((currentItems) =>\n currentItems.map((currentItem) =>\n currentItem.id === item.id ? { ...currentItem, error } : currentItem\n )\n );\n return;\n }\n uploadItem({ ...item, status: 'ready', error: undefined, progress: 0 });\n };\n\n const renderStatus = (item: FileUploadItem<TResult>) => {\n if (item.status === 'uploading') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-blue-600 dark:text-blue-300\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n {uploadingText}\n </span>\n );\n }\n if (item.status === 'success') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-300\">\n <CheckCircle2 className=\"h-3.5 w-3.5\" />\n {successText}\n </span>\n );\n }\n if (item.status === 'error') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-destructive\">\n <XCircle className=\"h-3.5 w-3.5\" />\n {errorText}\n </span>\n );\n }\n return <span className=\"text-xs text-muted-foreground\">待上传</span>;\n };\n\n const header = (\n <>\n {title && CardTitle && <CardTitle>{title}</CardTitle>}\n {title && !CardTitle && (\n <div className=\"text-lg font-semibold leading-none tracking-tight\">\n {title}\n </div>\n )}\n {description && CardDescription && (\n <CardDescription>{description}</CardDescription>\n )}\n {description && !CardDescription && (\n <div className=\"text-sm text-muted-foreground\">{description}</div>\n )}\n </>\n );\n\n return (\n <Card className={cn('overflow-hidden', className)}>\n {CardHeader && (title || description) ? (\n <CardHeader>{header}</CardHeader>\n ) : (\n (title || description) && (\n <div className=\"space-y-1.5 p-6\">{header}</div>\n )\n )}\n <CardContent className=\"space-y-4\">\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"sr-only\"\n onChange={(event) => handleFiles(event.target.files)}\n disabled={disabled}\n />\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-disabled={disabled}\n className={cn(\n 'flex min-h-40 cursor-pointer touch-manipulation flex-col items-center justify-center rounded-lg border border-dashed border-muted-foreground/30 bg-muted/20 px-6 py-8 text-center transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n isDragging && 'border-primary bg-primary/10 shadow-inner',\n disabled && 'cursor-not-allowed opacity-60',\n dropzoneClassName\n )}\n onClick={() => {\n if (!disabled) {\n inputRef.current?.click();\n }\n }}\n onKeyDown={(event) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n inputRef.current?.click();\n }\n }}\n onDragOver={(event) => {\n event.preventDefault();\n if (!disabled) {\n setIsDragging(true);\n }\n }}\n onDragLeave={() => setIsDragging(false)}\n onDrop={handleDrop}\n >\n <div className=\"mb-3 rounded-full bg-primary/10 p-3 text-primary\">\n <UploadCloud className=\"h-6 w-6\" />\n </div>\n <div className=\"text-sm font-medium\">{dropzoneLabel}</div>\n {dropzoneDescription && (\n <div className=\"mt-1 max-w-md text-sm text-muted-foreground\">\n {dropzoneDescription}\n </div>\n )}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n className=\"mt-4\"\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n inputRef.current?.click();\n }}\n >\n {selectLabel}\n </Button>\n </div>\n\n {helperText && (\n <div className=\"text-sm text-muted-foreground\">{helperText}</div>\n )}\n\n <div className={cn('space-y-3', listClassName)}>\n {items.length === 0 ? (\n <div className=\"rounded-md border border-dashed bg-muted/20 px-4 py-3 text-sm text-muted-foreground\">\n {emptyLabel}\n </div>\n ) : (\n items.map((item) => (\n <div\n key={item.id}\n className=\"rounded-lg border bg-background px-4 py-3 shadow-sm\"\n >\n <div className=\"flex min-w-0 items-start gap-3\">\n <div className=\"mt-0.5 rounded-md bg-muted p-2 text-muted-foreground\">\n <FileText className=\"h-4 w-4\" />\n </div>\n <div className=\"min-w-0 flex-1 space-y-2\">\n <div className=\"flex flex-wrap items-start justify-between gap-2\">\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm font-medium\">\n {item.name}\n </div>\n <div className=\"text-xs text-muted-foreground\">\n {formatFileSize(item.size)}\n {item.type ? ` · ${item.type}` : ''}\n </div>\n </div>\n {renderStatus(item)}\n </div>\n {item.status === 'uploading' && (\n <div\n className=\"h-2 overflow-hidden rounded-full bg-muted\"\n aria-label={`${item.name} 上传进度`}\n role=\"progressbar\"\n aria-valuenow={item.progress}\n aria-valuemin={0}\n aria-valuemax={100}\n >\n <div\n className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${item.progress}%` }}\n />\n </div>\n )}\n {item.error && (\n <div className=\"break-words text-xs text-destructive\">\n {item.error}\n </div>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n {item.status === 'error' && onUpload && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n disabled={disabled || isUploading}\n onClick={() => handleRetry(item)}\n >\n {retryLabel}\n </Button>\n )}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={`移除 ${item.name}`}\n disabled={disabled || item.status === 'uploading'}\n onClick={() => handleRemove(item.id)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n </div>\n ))\n )}\n </div>\n </CardContent>\n {(shouldShowUploadButton || showResetButton) &&\n (CardFooter ? (\n <CardFooter className=\"justify-end gap-2\">\n {showResetButton && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || isUploading || items.length === 0}\n onClick={() => setItems([])}\n >\n {resetLabel}\n </Button>\n )}\n {shouldShowUploadButton && (\n <Button\n type=\"button\"\n disabled={\n disabled || isUploading || !hasUploadableItems || !onUpload\n }\n onClick={uploadReadyItems}\n >\n {uploadLabel}\n </Button>\n )}\n </CardFooter>\n ) : (\n <div className=\"flex justify-end gap-2 p-6 pt-0\">\n {showResetButton && (\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={disabled || isUploading || items.length === 0}\n onClick={() => setItems([])}\n >\n {resetLabel}\n </Button>\n )}\n {shouldShowUploadButton && (\n <Button\n type=\"button\"\n disabled={\n disabled || isUploading || !hasUploadableItems || !onUpload\n }\n onClick={uploadReadyItems}\n >\n {uploadLabel}\n </Button>\n )}\n </div>\n ))}\n </Card>\n );\n}\n"],"names":["defaultFormatFileSize","size","createFileId","file","getFileExtension","fileName","index","matchesAccept","accept","fileType","fileExtension","item","rule","getErrorMessage","error","fallback","FileUpload","components","title","description","helperText","multiple","maxFiles","maxSize","disabled","autoUpload","showUploadButton","showResetButton","selectLabel","uploadLabel","retryLabel","resetLabel","emptyLabel","dropzoneLabel","dropzoneDescription","uploadingText","successText","errorText","className","dropzoneClassName","listClassName","formatFileSize","validateFile","onFilesChange","onUpload","onUploadComplete","onUploadError","items","setItems","useState","isDragging","setIsDragging","inputRef","useRef","shouldShowUploadButton","resolvedMaxFiles","hasUploadableItems","isUploading","useEffect","jsx","Card","CardHeader","CardTitle","CardDescription","CardContent","CardFooter","Button","updateItems","updater","currentItems","getValidationError","createItemsFromFiles","files","nextItems","remainingSlots","uploadItem","targetItem","setProgress","progress","result","completedItem","failedItem","uploadReadyItems","readyItems","handleFiles","fileList","handleDrop","event","handleRemove","id","handleRetry","currentItem","renderStatus","jsxs","Loader2","CheckCircle2","XCircle","header","Fragment","cn","_a","UploadCloud","FileText","X"],"mappings":"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"}