@techzyapp/ui-library 1.0.31 → 1.0.32
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.
- package/dist/{AdminRoot-BYkmCGNx.js → AdminRoot-B9A4Hoz0.js} +5 -5
- package/dist/{AdminRoot-BYkmCGNx.js.map → AdminRoot-B9A4Hoz0.js.map} +1 -1
- package/dist/{AdminRoot-BbkfFQEn.cjs → AdminRoot-BVUEWczU.cjs} +2 -2
- package/dist/{AdminRoot-BbkfFQEn.cjs.map → AdminRoot-BVUEWczU.cjs.map} +1 -1
- package/dist/{Alert-BLqAcEoT.js → Alert-B7w9xD2p.js} +3 -3
- package/dist/{Alert-BLqAcEoT.js.map → Alert-B7w9xD2p.js.map} +1 -1
- package/dist/{Alert-BM5WOI_u.cjs → Alert-B9l1VhIr.cjs} +2 -2
- package/dist/{Alert-BM5WOI_u.cjs.map → Alert-B9l1VhIr.cjs.map} +1 -1
- package/dist/{Breadcrumbs-Di4-Acfb.cjs → Breadcrumbs-B1JMwCjO.cjs} +2 -2
- package/dist/{Breadcrumbs-Di4-Acfb.cjs.map → Breadcrumbs-B1JMwCjO.cjs.map} +1 -1
- package/dist/{Breadcrumbs-CzHGbN2c.js → Breadcrumbs-Cl1CgKkk.js} +3 -3
- package/dist/{Breadcrumbs-CzHGbN2c.js.map → Breadcrumbs-Cl1CgKkk.js.map} +1 -1
- package/dist/{Button-9Qcdkw-y.js → Button-BJ5Xd10u.js} +2 -2
- package/dist/{Button-9Qcdkw-y.js.map → Button-BJ5Xd10u.js.map} +1 -1
- package/dist/{Button-BQhiJq8e.cjs → Button-BZq1mIUH.cjs} +2 -2
- package/dist/{Button-BQhiJq8e.cjs.map → Button-BZq1mIUH.cjs.map} +1 -1
- package/dist/{Calendar-dXhLgOUH.cjs → Calendar-r-dDXWEp.cjs} +2 -2
- package/dist/{Calendar-dXhLgOUH.cjs.map → Calendar-r-dDXWEp.cjs.map} +1 -1
- package/dist/{Calendar-BB-C0qXO.js → Calendar-rRPnaU9M.js} +3 -3
- package/dist/{Calendar-BB-C0qXO.js.map → Calendar-rRPnaU9M.js.map} +1 -1
- package/dist/{Card-BERQfyhJ.js → Card-Cr3D2bzJ.js} +2 -2
- package/dist/{Card-BERQfyhJ.js.map → Card-Cr3D2bzJ.js.map} +1 -1
- package/dist/{Card-DULpoOfj.cjs → Card-KsczbH5c.cjs} +2 -2
- package/dist/{Card-DULpoOfj.cjs.map → Card-KsczbH5c.cjs.map} +1 -1
- package/dist/{Chip-BuydTI6V.cjs → Chip-BZ3I4Lbe.cjs} +2 -2
- package/dist/{Chip-BuydTI6V.cjs.map → Chip-BZ3I4Lbe.cjs.map} +1 -1
- package/dist/{Chip-DZ5Fz7jx.js → Chip-DEp1zWh1.js} +2 -2
- package/dist/{Chip-DZ5Fz7jx.js.map → Chip-DEp1zWh1.js.map} +1 -1
- package/dist/{CodeBlock-BySsTAtY.js → CodeBlock-CMHqvoBJ.js} +3 -3
- package/dist/{CodeBlock-BySsTAtY.js.map → CodeBlock-CMHqvoBJ.js.map} +1 -1
- package/dist/{CodeBlock-BPraYPoS.cjs → CodeBlock-DIkyeG4S.cjs} +2 -2
- package/dist/{CodeBlock-BPraYPoS.cjs.map → CodeBlock-DIkyeG4S.cjs.map} +1 -1
- package/dist/{ColorPicker-DJow7m2v.js → ColorPicker-5SMyU5oh.js} +3 -3
- package/dist/{ColorPicker-DJow7m2v.js.map → ColorPicker-5SMyU5oh.js.map} +1 -1
- package/dist/{ColorPicker-BTBTQD39.cjs → ColorPicker-B1riGs1z.cjs} +2 -2
- package/dist/{ColorPicker-BTBTQD39.cjs.map → ColorPicker-B1riGs1z.cjs.map} +1 -1
- package/dist/{ColorPickerPanel-D6agWM6y.js → ColorPickerPanel-4Y6oXL7v.js} +2 -2
- package/dist/{ColorPickerPanel-D6agWM6y.js.map → ColorPickerPanel-4Y6oXL7v.js.map} +1 -1
- package/dist/{ColorPickerPanel-DXIYwUoE.cjs → ColorPickerPanel-CzBlh0zw.cjs} +2 -2
- package/dist/{ColorPickerPanel-DXIYwUoE.cjs.map → ColorPickerPanel-CzBlh0zw.cjs.map} +1 -1
- package/dist/{ColorRamp-B45Rtwgw.cjs → ColorRamp-D_h-hp7n.cjs} +2 -2
- package/dist/{ColorRamp-B45Rtwgw.cjs.map → ColorRamp-D_h-hp7n.cjs.map} +1 -1
- package/dist/{ColorRamp-Bhj28c_6.js → ColorRamp-Qc8ZtPDh.js} +2 -2
- package/dist/{ColorRamp-Bhj28c_6.js.map → ColorRamp-Qc8ZtPDh.js.map} +1 -1
- package/dist/ConfigProvider-CzAQf_d_.cjs +2 -0
- package/dist/ConfigProvider-CzAQf_d_.cjs.map +1 -0
- package/dist/ConfigProvider-D2svpXFu.js +347 -0
- package/dist/ConfigProvider-D2svpXFu.js.map +1 -0
- package/dist/{CopyButton-CBk85MQ7.js → CopyButton-BNcW9-KU.js} +3 -3
- package/dist/{CopyButton-CBk85MQ7.js.map → CopyButton-BNcW9-KU.js.map} +1 -1
- package/dist/{CopyButton-Bfte6TJF.cjs → CopyButton-DUtx2-Gi.cjs} +2 -2
- package/dist/{CopyButton-Bfte6TJF.cjs.map → CopyButton-DUtx2-Gi.cjs.map} +1 -1
- package/dist/{DatePicker-eAzDnO2Y.js → DatePicker-D2PyGdec.js} +4 -4
- package/dist/{DatePicker-eAzDnO2Y.js.map → DatePicker-D2PyGdec.js.map} +1 -1
- package/dist/{DatePicker-DBiU4Mb6.cjs → DatePicker-D_PqDvKt.cjs} +2 -2
- package/dist/{DatePicker-DBiU4Mb6.cjs.map → DatePicker-D_PqDvKt.cjs.map} +1 -1
- package/dist/{DateTimePicker-CvaD8IkF.cjs → DateTimePicker-C3Kq5hKE.cjs} +2 -2
- package/dist/{DateTimePicker-CvaD8IkF.cjs.map → DateTimePicker-C3Kq5hKE.cjs.map} +1 -1
- package/dist/{DateTimePicker-M2UBjFVc.js → DateTimePicker-DdXFzqO_.js} +7 -7
- package/dist/{DateTimePicker-M2UBjFVc.js.map → DateTimePicker-DdXFzqO_.js.map} +1 -1
- package/dist/{DescriptionList-DQHNOTWl.cjs → DescriptionList-C7AOcw_2.cjs} +2 -2
- package/dist/{DescriptionList-DQHNOTWl.cjs.map → DescriptionList-C7AOcw_2.cjs.map} +1 -1
- package/dist/{DescriptionList-BhsmdtS1.js → DescriptionList-DxRgKNEJ.js} +4 -4
- package/dist/{DescriptionList-BhsmdtS1.js.map → DescriptionList-DxRgKNEJ.js.map} +1 -1
- package/dist/{Dropdown-BbaU1WDC.cjs → Dropdown-CMqWq6J_.cjs} +2 -2
- package/dist/{Dropdown-BbaU1WDC.cjs.map → Dropdown-CMqWq6J_.cjs.map} +1 -1
- package/dist/{Dropdown-BlmbYp1X.js → Dropdown-zlv96RLy.js} +2 -2
- package/dist/{Dropdown-BlmbYp1X.js.map → Dropdown-zlv96RLy.js.map} +1 -1
- package/dist/{EmptyState-2pA3XlOX.js → EmptyState-CvpKSYY4.js} +2 -2
- package/dist/{EmptyState-2pA3XlOX.js.map → EmptyState-CvpKSYY4.js.map} +1 -1
- package/dist/{EmptyState-ByBpy2vN.cjs → EmptyState-ECc6e_En.cjs} +2 -2
- package/dist/{EmptyState-ByBpy2vN.cjs.map → EmptyState-ECc6e_En.cjs.map} +1 -1
- package/dist/{ErrorBoundary-B-37hGZW.js → ErrorBoundary-CJx5E9wJ.js} +5 -5
- package/dist/{ErrorBoundary-B-37hGZW.js.map → ErrorBoundary-CJx5E9wJ.js.map} +1 -1
- package/dist/{ErrorBoundary-gRGxeuM1.cjs → ErrorBoundary-DbKRtdgS.cjs} +2 -2
- package/dist/{ErrorBoundary-gRGxeuM1.cjs.map → ErrorBoundary-DbKRtdgS.cjs.map} +1 -1
- package/dist/{FileCard-BYNJVmp0.cjs → FileCard-Bjqsgi7S.cjs} +2 -2
- package/dist/{FileCard-BYNJVmp0.cjs.map → FileCard-Bjqsgi7S.cjs.map} +1 -1
- package/dist/{FileCard-BNfUAgsF.js → FileCard-D4t0-ms2.js} +3 -3
- package/dist/{FileCard-BNfUAgsF.js.map → FileCard-D4t0-ms2.js.map} +1 -1
- package/dist/{FileUploader-DdICa5UC.cjs → FileUploader-DWM8WrY6.cjs} +2 -2
- package/dist/{FileUploader-DdICa5UC.cjs.map → FileUploader-DWM8WrY6.cjs.map} +1 -1
- package/dist/{FileUploader-TOWwDOSS.js → FileUploader-DdcvZoUb.js} +5 -5
- package/dist/{FileUploader-TOWwDOSS.js.map → FileUploader-DdcvZoUb.js.map} +1 -1
- package/dist/{Flag-DDR6OANA.js → Flag-BLEBMdb-.js} +2 -2
- package/dist/{Flag-DDR6OANA.js.map → Flag-BLEBMdb-.js.map} +1 -1
- package/dist/{Flag-DXPQ2t8z.cjs → Flag-D5rqScYG.cjs} +2 -2
- package/dist/{Flag-DXPQ2t8z.cjs.map → Flag-D5rqScYG.cjs.map} +1 -1
- package/dist/{FullscreenToggle-BKo1lDSE.cjs → FullscreenToggle-CZoc5pYg.cjs} +2 -2
- package/dist/{FullscreenToggle-BKo1lDSE.cjs.map → FullscreenToggle-CZoc5pYg.cjs.map} +1 -1
- package/dist/{FullscreenToggle-DmH1541W.js → FullscreenToggle-DZnKK1Lj.js} +3 -3
- package/dist/{FullscreenToggle-DmH1541W.js.map → FullscreenToggle-DZnKK1Lj.js.map} +1 -1
- package/dist/{IconButton-CL_6iMQh.js → IconButton-CqFgam3J.js} +2 -2
- package/dist/{IconButton-CL_6iMQh.js.map → IconButton-CqFgam3J.js.map} +1 -1
- package/dist/{IconButton-CvIXSFsr.cjs → IconButton-V8tjArlt.cjs} +2 -2
- package/dist/{IconButton-CvIXSFsr.cjs.map → IconButton-V8tjArlt.cjs.map} +1 -1
- package/dist/List-CXHlAI5w.js +38 -0
- package/dist/List-CXHlAI5w.js.map +1 -0
- package/dist/List-DOsh6w-d.cjs +2 -0
- package/dist/List-DOsh6w-d.cjs.map +1 -0
- package/dist/ListItem-CUeIBhOF.cjs +2 -0
- package/dist/ListItem-CUeIBhOF.cjs.map +1 -0
- package/dist/ListItem-ehFB7TUW.js +77 -0
- package/dist/ListItem-ehFB7TUW.js.map +1 -0
- package/dist/{Loader-Czzb450N.js → Loader-Bsz0BkGr.js} +2 -2
- package/dist/{Loader-Czzb450N.js.map → Loader-Bsz0BkGr.js.map} +1 -1
- package/dist/{Loader-CI1j71X8.cjs → Loader-CqRaCdzF.cjs} +2 -2
- package/dist/{Loader-CI1j71X8.cjs.map → Loader-CqRaCdzF.cjs.map} +1 -1
- package/dist/LocationPicker-BRGNcTd_.cjs +2 -0
- package/dist/LocationPicker-BRGNcTd_.cjs.map +1 -0
- package/dist/LocationPicker-DtMDpPFZ.js +781 -0
- package/dist/LocationPicker-DtMDpPFZ.js.map +1 -0
- package/dist/{Modal-DPObz0b-.cjs → Modal-CcrqM4kn.cjs} +2 -2
- package/dist/{Modal-DPObz0b-.cjs.map → Modal-CcrqM4kn.cjs.map} +1 -1
- package/dist/{Modal-DMJMw6kT.js → Modal-DCee1a9m.js} +3 -3
- package/dist/{Modal-DMJMw6kT.js.map → Modal-DCee1a9m.js.map} +1 -1
- package/dist/{MultiSelect-IDAJ5a5K.cjs → MultiSelect-BJ-qMpA5.cjs} +2 -2
- package/dist/{MultiSelect-IDAJ5a5K.cjs.map → MultiSelect-BJ-qMpA5.cjs.map} +1 -1
- package/dist/{MultiSelect-BTR6w5Ot.js → MultiSelect-JQ6iKHyI.js} +4 -4
- package/dist/{MultiSelect-BTR6w5Ot.js.map → MultiSelect-JQ6iKHyI.js.map} +1 -1
- package/dist/{NumberField-DlaW-g3Z.js → NumberField-Bf-vDNLy.js} +3 -3
- package/dist/{NumberField-DlaW-g3Z.js.map → NumberField-Bf-vDNLy.js.map} +1 -1
- package/dist/{NumberField-Cg0XEDgW.cjs → NumberField-mZjwZB8E.cjs} +2 -2
- package/dist/{NumberField-Cg0XEDgW.cjs.map → NumberField-mZjwZB8E.cjs.map} +1 -1
- package/dist/{OtpField-vxQuo-uR.js → OtpField-DaAIBp6C.js} +2 -2
- package/dist/{OtpField-vxQuo-uR.js.map → OtpField-DaAIBp6C.js.map} +1 -1
- package/dist/{OtpField-DsedK1nQ.cjs → OtpField-TdjMkgQi.cjs} +2 -2
- package/dist/{OtpField-DsedK1nQ.cjs.map → OtpField-TdjMkgQi.cjs.map} +1 -1
- package/dist/{PageLayout-BPbjTYS3.cjs → PageLayout-BoHvt2cT.cjs} +2 -2
- package/dist/{PageLayout-BPbjTYS3.cjs.map → PageLayout-BoHvt2cT.cjs.map} +1 -1
- package/dist/{PageLayout-Rk6KSxmn.js → PageLayout-Bwv8Oohb.js} +2 -2
- package/dist/{PageLayout-Rk6KSxmn.js.map → PageLayout-Bwv8Oohb.js.map} +1 -1
- package/dist/{PageNotFound-CBNhKZ9Y.js → PageNotFound-CMt8vnky.js} +5 -5
- package/dist/{PageNotFound-CBNhKZ9Y.js.map → PageNotFound-CMt8vnky.js.map} +1 -1
- package/dist/{PageNotFound-PUQ1o9R4.cjs → PageNotFound-DDm6nwQh.cjs} +2 -2
- package/dist/{PageNotFound-PUQ1o9R4.cjs.map → PageNotFound-DDm6nwQh.cjs.map} +1 -1
- package/dist/{Pagination-CNdkfXp2.js → Pagination-C0xr3D-g.js} +2 -2
- package/dist/{Pagination-CNdkfXp2.js.map → Pagination-C0xr3D-g.js.map} +1 -1
- package/dist/{Pagination-DNGKNQy0.cjs → Pagination-DzkTjEZL.cjs} +2 -2
- package/dist/{Pagination-DNGKNQy0.cjs.map → Pagination-DzkTjEZL.cjs.map} +1 -1
- package/dist/{PaletteField-BSIF5jI6.cjs → PaletteField-CQV2dll0.cjs} +2 -2
- package/dist/{PaletteField-BSIF5jI6.cjs.map → PaletteField-CQV2dll0.cjs.map} +1 -1
- package/dist/{PaletteField-Bp5Fgygh.js → PaletteField-CQv6MBKe.js} +3 -3
- package/dist/{PaletteField-Bp5Fgygh.js.map → PaletteField-CQv6MBKe.js.map} +1 -1
- package/dist/{PhoneField-BdmvslXQ.js → PhoneField-Bqj5-33G.js} +4 -4
- package/dist/{PhoneField-BdmvslXQ.js.map → PhoneField-Bqj5-33G.js.map} +1 -1
- package/dist/{PhoneField-BMhZeZkW.cjs → PhoneField-Dzdm5hfY.cjs} +2 -2
- package/dist/{PhoneField-BMhZeZkW.cjs.map → PhoneField-Dzdm5hfY.cjs.map} +1 -1
- package/dist/{Popconfirm-Cyaeybtj.js → Popconfirm-CYkwGTh-.js} +3 -3
- package/dist/{Popconfirm-Cyaeybtj.js.map → Popconfirm-CYkwGTh-.js.map} +1 -1
- package/dist/{Popconfirm-IhlIINtZ.cjs → Popconfirm-DS6tCxV0.cjs} +2 -2
- package/dist/{Popconfirm-IhlIINtZ.cjs.map → Popconfirm-DS6tCxV0.cjs.map} +1 -1
- package/dist/{Progress-T7PLrJ0Y.js → Progress-DZUtn3Sh.js} +2 -2
- package/dist/{Progress-T7PLrJ0Y.js.map → Progress-DZUtn3Sh.js.map} +1 -1
- package/dist/{Progress-CAY1p06_.cjs → Progress-lf9vIKIk.cjs} +2 -2
- package/dist/{Progress-CAY1p06_.cjs.map → Progress-lf9vIKIk.cjs.map} +1 -1
- package/dist/{QueryError-Dtspj9l4.js → QueryError-Dl8yzdxw.js} +2 -2
- package/dist/{QueryError-Dtspj9l4.js.map → QueryError-Dl8yzdxw.js.map} +1 -1
- package/dist/{QueryError-DP22IUnp.cjs → QueryError-RF7Mh5zg.cjs} +2 -2
- package/dist/{QueryError-DP22IUnp.cjs.map → QueryError-RF7Mh5zg.cjs.map} +1 -1
- package/dist/{RemoveDialog-D12B4x80.cjs → RemoveDialog-Csfhv9ve.cjs} +2 -2
- package/dist/{RemoveDialog-D12B4x80.cjs.map → RemoveDialog-Csfhv9ve.cjs.map} +1 -1
- package/dist/{RemoveDialog-DdGsqaWV.js → RemoveDialog-DaWh4xmW.js} +5 -5
- package/dist/{RemoveDialog-DdGsqaWV.js.map → RemoveDialog-DaWh4xmW.js.map} +1 -1
- package/dist/{RichTextEditor-DL4y5xVv.js → RichTextEditor-BLEDQq2H.js} +9 -9
- package/dist/{RichTextEditor-DL4y5xVv.js.map → RichTextEditor-BLEDQq2H.js.map} +1 -1
- package/dist/RichTextEditor-Eo8uLXlI.cjs +2 -0
- package/dist/{RichTextEditor-BVXY25sz.cjs.map → RichTextEditor-Eo8uLXlI.cjs.map} +1 -1
- package/dist/RootLayout-BvyeNM9_.cjs +2 -0
- package/dist/{RootLayout-DDuzPlJe.cjs.map → RootLayout-BvyeNM9_.cjs.map} +1 -1
- package/dist/{RootLayout-BK3t6Mm0.js → RootLayout-D-ZlsTXF.js} +23 -23
- package/dist/{RootLayout-BK3t6Mm0.js.map → RootLayout-D-ZlsTXF.js.map} +1 -1
- package/dist/{Select-tVI_qer3.js → Select-C0UBQXhg.js} +3 -3
- package/dist/{Select-tVI_qer3.js.map → Select-C0UBQXhg.js.map} +1 -1
- package/dist/{Select-DlFDOZtn.cjs → Select-CH3mF6y1.cjs} +2 -2
- package/dist/{Select-DlFDOZtn.cjs.map → Select-CH3mF6y1.cjs.map} +1 -1
- package/dist/{Sidebar-CjrD3nNp.js → Sidebar--rOPtrqa.js} +33 -32
- package/dist/{Sidebar-CjrD3nNp.js.map → Sidebar--rOPtrqa.js.map} +1 -1
- package/dist/Sidebar-6wu2fuPT.cjs +2 -0
- package/dist/{Sidebar-gB-X4VLX.cjs.map → Sidebar-6wu2fuPT.cjs.map} +1 -1
- package/dist/{SpeedDial-xQr4JH0x.js → SpeedDial-BIodC6td.js} +2 -2
- package/dist/{SpeedDial-xQr4JH0x.js.map → SpeedDial-BIodC6td.js.map} +1 -1
- package/dist/{SpeedDial-BIOkkLKO.cjs → SpeedDial-BtxXH6Ij.cjs} +2 -2
- package/dist/{SpeedDial-BIOkkLKO.cjs.map → SpeedDial-BtxXH6Ij.cjs.map} +1 -1
- package/dist/{Stepper-CBdhvPoz.cjs → Stepper-B38I8PBS.cjs} +2 -2
- package/dist/{Stepper-CBdhvPoz.cjs.map → Stepper-B38I8PBS.cjs.map} +1 -1
- package/dist/{Stepper-CkYcIc15.js → Stepper-CPBPTxbP.js} +13 -13
- package/dist/{Stepper-CkYcIc15.js.map → Stepper-CPBPTxbP.js.map} +1 -1
- package/dist/Table-1RVWzyS6.cjs +2 -0
- package/dist/{Table-Cwxqo7Br.cjs.map → Table-1RVWzyS6.cjs.map} +1 -1
- package/dist/{Table-CwQKfXGn.js → Table-BV-dr36o.js} +45 -45
- package/dist/{Table-CwQKfXGn.js.map → Table-BV-dr36o.js.map} +1 -1
- package/dist/{Tabs-651xbRe4.cjs → Tabs-DIs8iFA-.cjs} +2 -2
- package/dist/{Tabs-651xbRe4.cjs.map → Tabs-DIs8iFA-.cjs.map} +1 -1
- package/dist/{Tabs-Bztnezt9.js → Tabs-RjyUkLTB.js} +10 -10
- package/dist/{Tabs-Bztnezt9.js.map → Tabs-RjyUkLTB.js.map} +1 -1
- package/dist/{TagsField-CdymON69.js → TagsField-B3MtFiFs.js} +4 -4
- package/dist/{TagsField-CdymON69.js.map → TagsField-B3MtFiFs.js.map} +1 -1
- package/dist/{TagsField-B7ZARHzD.cjs → TagsField-CJ10-kFr.cjs} +2 -2
- package/dist/{TagsField-B7ZARHzD.cjs.map → TagsField-CJ10-kFr.cjs.map} +1 -1
- package/dist/{TextField-DkaYK1DI.js → TextField-CInaL0FR.js} +3 -3
- package/dist/{TextField-DkaYK1DI.js.map → TextField-CInaL0FR.js.map} +1 -1
- package/dist/{TextField-B22NRQ91.cjs → TextField-D_hzd5Gf.cjs} +2 -2
- package/dist/{TextField-B22NRQ91.cjs.map → TextField-D_hzd5Gf.cjs.map} +1 -1
- package/dist/ThemeToggle-CWfuK0tZ.js +28 -0
- package/dist/{ThemeToggle-DqzUvcK5.js.map → ThemeToggle-CWfuK0tZ.js.map} +1 -1
- package/dist/{ThemeToggle-D5dWHQFb.cjs → ThemeToggle-DkhhlH_r.cjs} +2 -2
- package/dist/{ThemeToggle-D5dWHQFb.cjs.map → ThemeToggle-DkhhlH_r.cjs.map} +1 -1
- package/dist/{TimeColumns-BEoHh961.js → TimeColumns-fD6dosYP.js} +2 -2
- package/dist/{TimeColumns-BEoHh961.js.map → TimeColumns-fD6dosYP.js.map} +1 -1
- package/dist/{TimeColumns-o2xhvSGE.cjs → TimeColumns-t3Pn01v5.cjs} +2 -2
- package/dist/{TimeColumns-o2xhvSGE.cjs.map → TimeColumns-t3Pn01v5.cjs.map} +1 -1
- package/dist/{TimePicker-CACmHwNn.cjs → TimePicker-DOwQF7sX.cjs} +2 -2
- package/dist/{TimePicker-CACmHwNn.cjs.map → TimePicker-DOwQF7sX.cjs.map} +1 -1
- package/dist/{TimePicker-DCryZCmh.js → TimePicker-DypTHDW0.js} +5 -5
- package/dist/{TimePicker-DCryZCmh.js.map → TimePicker-DypTHDW0.js.map} +1 -1
- package/dist/{Toaster-DwVLab3k.js → Toaster-BwNAKDMc.js} +2 -2
- package/dist/{Toaster-DwVLab3k.js.map → Toaster-BwNAKDMc.js.map} +1 -1
- package/dist/{Toaster-BwREV06e.cjs → Toaster-DdUOwi7L.cjs} +2 -2
- package/dist/{Toaster-BwREV06e.cjs.map → Toaster-DdUOwi7L.cjs.map} +1 -1
- package/dist/{TranslatedFields-B0LMXgiu.js → TranslatedFields-C_-qPixE.js} +13 -13
- package/dist/{TranslatedFields-B0LMXgiu.js.map → TranslatedFields-C_-qPixE.js.map} +1 -1
- package/dist/{TranslatedFields-sio1Qfy7.cjs → TranslatedFields-D9FQlxiQ.cjs} +2 -2
- package/dist/{TranslatedFields-sio1Qfy7.cjs.map → TranslatedFields-D9FQlxiQ.cjs.map} +1 -1
- package/dist/{UserCard-Dzc4zmPj.cjs → UserCard-C-q2s2Cw.cjs} +2 -2
- package/dist/{UserCard-Dzc4zmPj.cjs.map → UserCard-C-q2s2Cw.cjs.map} +1 -1
- package/dist/{UserCard-B5FVcJaK.js → UserCard-CwWv0HXD.js} +3 -3
- package/dist/{UserCard-B5FVcJaK.js.map → UserCard-CwWv0HXD.js.map} +1 -1
- package/dist/components/Alert/index.cjs +1 -1
- package/dist/components/Alert/index.js +1 -1
- package/dist/components/Breadcrumbs/index.cjs +1 -1
- package/dist/components/Breadcrumbs/index.js +1 -1
- package/dist/components/Button/index.cjs +1 -1
- package/dist/components/Button/index.js +1 -1
- package/dist/components/Card/index.cjs +1 -1
- package/dist/components/Card/index.js +1 -1
- package/dist/components/Chip/index.cjs +1 -1
- package/dist/components/Chip/index.js +1 -1
- package/dist/components/CodeBlock/index.cjs +1 -1
- package/dist/components/CodeBlock/index.js +1 -1
- package/dist/components/ColorPicker/index.cjs +1 -1
- package/dist/components/ColorPicker/index.js +1 -1
- package/dist/components/ColorRamp/index.cjs +1 -1
- package/dist/components/ColorRamp/index.js +1 -1
- package/dist/components/CopyButton/index.cjs +1 -1
- package/dist/components/CopyButton/index.js +1 -1
- package/dist/components/DatePicker/index.cjs +1 -1
- package/dist/components/DatePicker/index.js +1 -1
- package/dist/components/DateTimePicker/index.cjs +1 -1
- package/dist/components/DateTimePicker/index.js +1 -1
- package/dist/components/DescriptionList/index.cjs +1 -1
- package/dist/components/DescriptionList/index.js +1 -1
- package/dist/components/Dropdown/index.cjs +1 -1
- package/dist/components/Dropdown/index.js +1 -1
- package/dist/components/EmptyState/index.cjs +1 -1
- package/dist/components/EmptyState/index.js +1 -1
- package/dist/components/ErrorState/index.cjs +1 -1
- package/dist/components/ErrorState/index.js +2 -2
- package/dist/components/FileCard/index.cjs +1 -1
- package/dist/components/FileCard/index.js +1 -1
- package/dist/components/FileUploader/index.cjs +1 -1
- package/dist/components/FileUploader/index.js +1 -1
- package/dist/components/Flag/index.cjs +1 -1
- package/dist/components/Flag/index.js +1 -1
- package/dist/components/FullscreenToggle/index.cjs +1 -1
- package/dist/components/FullscreenToggle/index.js +1 -1
- package/dist/components/IconButton/index.cjs +1 -1
- package/dist/components/IconButton/index.js +1 -1
- package/dist/components/List/index.cjs +1 -1
- package/dist/components/List/index.js +5 -4
- package/dist/components/List/index.js.map +1 -1
- package/dist/components/Loader/index.cjs +1 -1
- package/dist/components/Loader/index.js +1 -1
- package/dist/components/LocationPicker/LocationPicker.d.cts +87 -0
- package/dist/components/LocationPicker/LocationPicker.d.ts +87 -0
- package/dist/components/LocationPicker/PlaceSearch.d.cts +20 -0
- package/dist/components/LocationPicker/PlaceSearch.d.ts +20 -0
- package/dist/components/LocationPicker/googleMaps.d.cts +89 -0
- package/dist/components/LocationPicker/googleMaps.d.ts +89 -0
- package/dist/components/LocationPicker/index.cjs +2 -0
- package/dist/components/LocationPicker/index.cjs.map +1 -0
- package/dist/components/LocationPicker/index.d.cts +2 -0
- package/dist/components/LocationPicker/index.d.ts +2 -0
- package/dist/components/LocationPicker/index.js +7 -0
- package/dist/components/LocationPicker/index.js.map +1 -0
- package/dist/components/Modal/index.cjs +1 -1
- package/dist/components/Modal/index.js +1 -1
- package/dist/components/MultiSelect/index.cjs +1 -1
- package/dist/components/MultiSelect/index.js +1 -1
- package/dist/components/NumberField/index.cjs +1 -1
- package/dist/components/NumberField/index.js +1 -1
- package/dist/components/OtpField/index.cjs +1 -1
- package/dist/components/OtpField/index.js +1 -1
- package/dist/components/PageLayout/index.cjs +1 -1
- package/dist/components/PageLayout/index.js +1 -1
- package/dist/components/PageNotFound/index.cjs +1 -1
- package/dist/components/PageNotFound/index.js +1 -1
- package/dist/components/Pagination/index.cjs +1 -1
- package/dist/components/Pagination/index.js +1 -1
- package/dist/components/PaletteField/index.cjs +1 -1
- package/dist/components/PaletteField/index.js +1 -1
- package/dist/components/PhoneField/index.cjs +1 -1
- package/dist/components/PhoneField/index.js +1 -1
- package/dist/components/Popconfirm/index.cjs +1 -1
- package/dist/components/Popconfirm/index.js +1 -1
- package/dist/components/Progress/index.cjs +1 -1
- package/dist/components/Progress/index.js +1 -1
- package/dist/components/RemoveDialog/index.cjs +1 -1
- package/dist/components/RemoveDialog/index.js +1 -1
- package/dist/components/RichTextEditor/index.cjs +1 -1
- package/dist/components/RichTextEditor/index.js +1 -1
- package/dist/components/RootLayout/index.cjs +1 -1
- package/dist/components/RootLayout/index.js +1 -1
- package/dist/components/Select/index.cjs +1 -1
- package/dist/components/Select/index.js +1 -1
- package/dist/components/Sidebar/index.cjs +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/SpeedDial/index.cjs +1 -1
- package/dist/components/SpeedDial/index.js +1 -1
- package/dist/components/Stepper/index.cjs +1 -1
- package/dist/components/Stepper/index.js +1 -1
- package/dist/components/Table/index.cjs +1 -1
- package/dist/components/Table/index.js +1 -1
- package/dist/components/Tabs/index.cjs +1 -1
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/TagsField/index.cjs +1 -1
- package/dist/components/TagsField/index.js +1 -1
- package/dist/components/TextField/index.cjs +1 -1
- package/dist/components/TextField/index.js +1 -1
- package/dist/components/ThemeToggle/index.cjs +1 -1
- package/dist/components/ThemeToggle/index.js +1 -1
- package/dist/components/TimePicker/index.cjs +1 -1
- package/dist/components/TimePicker/index.js +1 -1
- package/dist/components/Toast/index.cjs +1 -1
- package/dist/components/Toast/index.js +1 -1
- package/dist/components/TranslatedFields/index.cjs +1 -1
- package/dist/components/TranslatedFields/index.js +1 -1
- package/dist/components/UserCard/index.cjs +1 -1
- package/dist/components/UserCard/index.js +1 -1
- package/dist/components/index.d.cts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/entries/app.cjs +1 -1
- package/dist/entries/app.js +1 -1
- package/dist/entries/components.cjs +1 -1
- package/dist/entries/components.js +136 -132
- package/dist/entries/components.js.map +1 -1
- package/dist/entries/i18n.cjs +1 -1
- package/dist/entries/i18n.js +2 -2
- package/dist/entries/theme.cjs +1 -1
- package/dist/entries/theme.d.cts +2 -2
- package/dist/entries/theme.d.ts +2 -2
- package/dist/entries/theme.js +15 -13
- package/dist/i18n/messages.d.cts +42 -0
- package/dist/i18n/messages.d.ts +42 -0
- package/dist/index.cjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +238 -232
- package/dist/index.js.map +1 -1
- package/dist/{messages-DswDgGe2.js → messages-BOJsnD0O.js} +180 -33
- package/dist/messages-BOJsnD0O.js.map +1 -0
- package/dist/{messages-DS38X5W2.cjs → messages-ejfYfHwL.cjs} +9 -9
- package/dist/messages-ejfYfHwL.cjs.map +1 -0
- package/dist/theme/ConfigProvider.d.cts +22 -0
- package/dist/theme/ConfigProvider.d.ts +22 -0
- package/dist/theme/index.d.cts +2 -2
- package/dist/theme/index.d.ts +2 -2
- package/dist/useOptionMenu-8hjCTNL4.cjs +2 -0
- package/dist/{useOptionMenu-BYeSUee6.cjs.map → useOptionMenu-8hjCTNL4.cjs.map} +1 -1
- package/dist/{useOptionMenu-DtTvY9EC.js → useOptionMenu-C1wOZ9NT.js} +9 -8
- package/dist/{useOptionMenu-DtTvY9EC.js.map → useOptionMenu-C1wOZ9NT.js.map} +1 -1
- package/package.json +1 -1
- package/dist/ConfigProvider-Ct0Pe3Ku.js +0 -335
- package/dist/ConfigProvider-Ct0Pe3Ku.js.map +0 -1
- package/dist/ConfigProvider-CtpfSy1i.cjs +0 -2
- package/dist/ConfigProvider-CtpfSy1i.cjs.map +0 -1
- package/dist/List-BLPB3-B8.js +0 -107
- package/dist/List-BLPB3-B8.js.map +0 -1
- package/dist/List-ah2PNWeY.cjs +0 -2
- package/dist/List-ah2PNWeY.cjs.map +0 -1
- package/dist/RichTextEditor-BVXY25sz.cjs +0 -2
- package/dist/RootLayout-DDuzPlJe.cjs +0 -2
- package/dist/Sidebar-gB-X4VLX.cjs +0 -2
- package/dist/Table-Cwxqo7Br.cjs +0 -2
- package/dist/ThemeToggle-DqzUvcK5.js +0 -28
- package/dist/messages-DS38X5W2.cjs.map +0 -1
- package/dist/messages-DswDgGe2.js.map +0 -1
- package/dist/useOptionMenu-BYeSUee6.cjs +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileCard-BYNJVmp0.cjs","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","Typography","IconButton","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileCard-Bjqsgi7S.cjs","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","Typography","IconButton","Icon"],"mappings":"2kBAmBMA,MAAiB,IAAI,CACzB,MACA,MACA,OACA,OACA,MACA,MACA,OACA,MACA,MACA,MACF,CAAC,EAGKC,EAAuC,CAC3C,IAAK,eACL,IAAK,eACL,KAAM,eACN,IAAK,eACL,IAAK,eACL,GAAI,eACJ,IAAK,eACL,IAAK,eACL,KAAM,eACN,KAAM,eACN,IAAK,eACL,IAAK,SACL,IAAK,SACL,KAAM,SACN,IAAK,cACL,IAAK,cACL,KAAM,cACN,IAAK,cACL,IAAK,aACP,EAGA,SAASC,EAAYC,EAAcC,EAAuB,CACxD,MAAMC,EAAMF,EAAK,YAAY,GAAG,EAChC,OAAIE,EAAM,GAAKF,EAAK,OAASE,GAAO,EAAUF,EAAK,MAAME,EAAM,CAAC,EAAE,YAAA,EAC9DD,GAAQA,EAAK,SAAS,GAAG,EAAUA,EAAK,MAAMA,EAAK,QAAQ,GAAG,EAAI,CAAC,EAAE,YAAA,EAClE,EACT,CAGA,SAASE,GAAUH,EAA6C,CAC9D,MAAME,EAAMF,EAAK,YAAY,GAAG,EAChC,OAAOE,EAAM,GAAKF,EAAK,OAASE,GAAO,EACnC,CAAE,KAAMF,EAAK,MAAM,EAAGE,CAAG,EAAG,IAAKF,EAAK,MAAME,CAAG,GAC/C,CAAE,KAAMF,EAAM,IAAK,EAAA,CACzB,CAGA,SAASI,EAAYC,EAAuB,CAC1C,GAAI,CAAC,OAAO,SAASA,CAAK,GAAKA,EAAQ,EAAG,MAAO,GACjD,GAAIA,EAAQ,KAAM,MAAO,GAAGA,CAAK,KACjC,MAAMC,EAAQ,CAAC,KAAM,KAAM,KAAM,IAAI,EACrC,IAAIC,EAAQF,EAAQ,KAChBG,EAAI,EACR,KAAOD,GAAS,MAAQC,EAAIF,EAAM,OAAS,GACzCC,GAAS,KACTC,GAAK,EAEP,MAAO,GAAGD,EAAQ,GAAKA,EAAM,QAAQ,CAAC,EAAI,KAAK,MAAMA,CAAK,CAAC,IAAID,EAAME,CAAC,CAAC,EACzE,CA2CO,MAAMC,GAAWC,EAAAA,WAA0C,SAChE,CACE,KAAAV,EACA,IAAAW,EACA,KAAAV,EACA,MAAAW,EACA,SAAAC,EACA,UAAAC,EAAY,GACZ,KAAAC,EACA,MAAAC,EAAQ,SACR,KAAAC,EAAO,KACP,aAAAC,EAAe,GACf,WAAAC,EACA,UAAAC,EACA,MAAAC,EACA,GAAGC,CACL,EACAC,EACA,CACA,MAAMC,EAAIC,EAAAA,KAAA,EACJC,EAAM3B,EAAYC,EAAMC,CAAI,EAC5B0B,EAAUf,KAAUX,GAAA,YAAAA,EAAM,WAAW,YAAaJ,EAAW,IAAI6B,CAAG,GACpE,CAAE,KAAAE,EAAM,IAAKC,CAAA,EAAY1B,GAAUH,CAAI,EAGvC,CAAC8B,EAAaC,CAAc,EAAIC,EAAAA,SAAwB,IAAI,EAClEC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACnB,GAAaD,GAAY,MAAQ,CAACF,GAAO,OAAO,MAAU,IAAa,OAC5E,IAAIuB,EAAY,GAChB,aAAMvB,EAAK,CAAE,OAAQ,MAAA,CAAQ,EAC1B,KAAMwB,GAAQ,CACb,MAAMC,EAAMD,EAAI,QAAQ,IAAI,gBAAgB,EACxC,CAACD,GAAaE,GAAKL,EAAe,OAAOK,CAAG,CAAC,CACnD,CAAC,EACA,MAAM,IAAM,CAAC,CAAC,EACV,IAAM,CACXF,EAAY,EACd,CACF,EAAG,CAACpB,EAAWD,EAAUF,CAAG,CAAC,EAE7B,MAAM0B,EACJxB,GAAY,KACR,OAAOA,GAAa,SAClBT,EAAYS,CAAQ,EACpBA,EACFiB,GAAe,KACb1B,EAAY0B,CAAW,EACvB,GAEFQ,EAAc,CAACZ,EAAMA,EAAI,YAAA,EAAgB,GAAIW,CAAQ,EAAE,OAAO,OAAO,EAAE,KAAK,KAAK,EACjFE,EAAWxB,IAASuB,GAAe,MAEnCE,EAAiB,IAAM,CAC3B,GAAIrB,SAAmBA,EAAA,EACvB,GAAI,CAACR,EAAK,OACV,MAAM8B,EAAI,SAAS,cAAc,GAAG,EACpCA,EAAE,KAAO9B,EACT8B,EAAE,SAAWzC,EACbyC,EAAE,IAAM,WACRA,EAAE,MAAA,CACJ,EAEA,OACEC,EAAAA,KAAC,MAAA,CACC,IAAAnB,EACA,UAAWoB,EAAAA,KAAKC,EAAO,SAAUA,EAAO3B,CAAI,EAAGG,CAAS,EACxD,MAAO,CAAE,eAAgB,kBAAkBJ,CAAK,QAAS,GAAGK,CAAA,EAC3D,GAAGC,EAEJ,SAAA,CAAAuB,EAAAA,IAACC,EAAAA,OAAA,CACC,UAAWF,EAAO,OAClB,IAAKjB,EAAUhB,EAAM,OACrB,KAAMgB,EAAU,OAAa7B,EAAW4B,CAAG,GAAK,WAChD,KAAA1B,EACA,MAAM,SACN,KAAAiB,EACA,MAAAD,CAAA,CAAA,EAEF0B,EAAAA,KAAC,MAAA,CAAI,UAAWE,EAAO,KACrB,SAAA,CAAAF,OAAC,OAAA,CAAK,UAAWE,EAAO,KAAM,MAAO5C,EACnC,SAAA,CAAA6C,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,SAAW,SAAAhB,EAAK,EACvCC,GAAWgB,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,QAAU,SAAAf,CAAA,CAAQ,CAAA,EACxD,EACCU,GAAY,MACXM,MAACE,EAAAA,WAAA,CAAW,GAAG,OAAO,QAAQ,YAAY,MAAM,QAAQ,UAAS,GAAC,UAAWH,EAAO,KACjF,SAAAL,CAAA,CACH,CAAA,EAEJ,EACCrB,IAAiBP,GAAOQ,IACvB0B,EAAAA,IAACG,EAAAA,WAAA,CACC,QAAQ,SACR,KAAM/B,IAAS,KAAO,KAAO,KAC7B,UAAW2B,EAAO,SAClB,aAAYpB,EAAE,oBAAqB,CAAE,KAAAxB,EAAM,EAC3C,QAASwC,EAET,SAAAK,EAAAA,IAACI,EAAAA,KAAA,CAAK,KAAK,aAAA,CAAc,CAAA,CAAA,CAC3B,CAAA,CAAA,CAIR,CAAC"}
|
|
@@ -2,10 +2,10 @@ import { jsxs as m, jsx as c } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef as S, useState as A, useEffect as O } from "react";
|
|
3
3
|
import { clsx as y } from "clsx";
|
|
4
4
|
import { A as L } from "./Avatar-MwWIcj8z.js";
|
|
5
|
-
import { I as $ } from "./IconButton-
|
|
5
|
+
import { I as $ } from "./IconButton-CqFgam3J.js";
|
|
6
6
|
import { I as V } from "./Icon-CGQ5yGSZ.js";
|
|
7
7
|
import { T as G } from "./Typography-CJv5AnRP.js";
|
|
8
|
-
import { a as H } from "./ConfigProvider-
|
|
8
|
+
import { a as H } from "./ConfigProvider-D2svpXFu.js";
|
|
9
9
|
const K = "_fileCard_kpeb5_3", R = "_avatar_kpeb5_24", U = "_body_kpeb5_29", W = "_name_kpeb5_38", X = "_nameBase_kpeb5_45", z = "_nameExt_kpeb5_51", J = "_type_kpeb5_57", P = "_download_kpeb5_61", Q = "_sm_kpeb5_66", Y = "_md_kpeb5_77", Z = "_lg_kpeb5_81", o = {
|
|
10
10
|
fileCard: K,
|
|
11
11
|
avatar: R,
|
|
@@ -146,4 +146,4 @@ const ue = S(function({
|
|
|
146
146
|
export {
|
|
147
147
|
ue as F
|
|
148
148
|
};
|
|
149
|
-
//# sourceMappingURL=FileCard-
|
|
149
|
+
//# sourceMappingURL=FileCard-D4t0-ms2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileCard-BNfUAgsF.js","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","Typography","IconButton","Icon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FileCard-D4t0-ms2.js","sources":["../src/components/FileCard/FileCard.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\nimport { clsx } from 'clsx'\nimport { useT, type ThemeColor } from '../../theme'\nimport { Avatar, type AvatarSize } from '../Avatar'\nimport { IconButton } from '../IconButton'\nimport { Icon } from '../Icon'\nimport { Typography } from '../Typography'\nimport type { IconName } from '../../icons/names'\nimport styles from './FileCard.module.css'\n\nexport type FileCardSize = AvatarSize\n\nconst IMAGE_EXTS = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'webp',\n 'svg',\n 'gif',\n 'avif',\n 'bmp',\n 'ico',\n 'heic',\n])\n\n// a leading icon per file family (non-image); everything else gets the generic document icon\nconst FILE_ICONS: Record<string, IconName> = {\n pdf: 'DocumentText',\n doc: 'DocumentText',\n docx: 'DocumentText',\n txt: 'DocumentText',\n rtf: 'DocumentText',\n md: 'DocumentText',\n csv: 'DocumentText',\n xls: 'DocumentText',\n xlsx: 'DocumentText',\n json: 'DocumentCode',\n xml: 'DocumentCode',\n zip: 'Folder',\n rar: 'Folder',\n '7z': 'Folder',\n mp4: 'VideoSquare',\n mov: 'VideoSquare',\n webm: 'VideoSquare',\n mp3: 'MusicSquare',\n wav: 'MusicSquare',\n}\n\n/** The lowercased extension from a file name, else the subtype from a MIME `type` (`image/png` → `png`). */\nfunction extensionOf(name: string, type?: string): string {\n const dot = name.lastIndexOf('.')\n if (dot > 0 && name.length - dot <= 7) return name.slice(dot + 1).toLowerCase()\n if (type && type.includes('/')) return type.slice(type.indexOf('/') + 1).toLowerCase()\n return ''\n}\n\n/** Split `report.pdf` into `{ base: 'report', ext: '.pdf' }` so the base can ellipsize and the type stays. */\nfunction splitName(name: string): { base: string; ext: string } {\n const dot = name.lastIndexOf('.')\n return dot > 0 && name.length - dot <= 7\n ? { base: name.slice(0, dot), ext: name.slice(dot) }\n : { base: name, ext: '' }\n}\n\n/** Human-readable byte size — `2411724` → `\"2.3 MB\"`. */\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return ''\n if (bytes < 1024) return `${bytes} B`\n const units = ['KB', 'MB', 'GB', 'TB']\n let value = bytes / 1024\n let i = 0\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024\n i += 1\n }\n return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`\n}\n\nexport interface FileCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title' | 'color'> {\n /** File name — shown middle-truncated (`test-file-na….pdf`) so the extension always stays visible. */\n name: string\n /** File URL — the download target and, for an image, the thumbnail `src`. */\n src?: string\n /** File type — an extension (`'pdf'`) or MIME (`'image/png'`). Derived from `name` when omitted. */\n type?: string\n /** Force image vs. file rendering. Inferred from `type` / `name` / `src` when omitted. */\n image?: boolean\n /** File size — a **bytes** number (auto-formatted to `\"2.3 MB\"`) or a preformatted string. Shown after the type. */\n fileSize?: number | string\n /**\n * When no `fileSize` is given, fetch it from `src` via a `HEAD` request (reads `Content-Length`). Off\n * by default — it's a network call and needs CORS to expose the header; prefer passing `fileSize` from\n * the backend. Fails silently (no size shown) when unavailable.\n */\n fetchSize?: boolean\n /** Meta line under the name — overrides the derived `TYPE · size`. */\n meta?: ReactNode\n /** Theme token tinting the avatar / file-icon box. Defaults to `accent`. */\n color?: ThemeColor\n /** Size — scales the avatar, text and padding. Defaults to `md`. */\n size?: FileCardSize\n /** Show the download control (only when there's a `src` or `onDownload`). Defaults to `true`. */\n downloadable?: boolean\n /** Custom download handler — replaces the default (a download of `src`). */\n onDownload?: () => void\n}\n\n/**\n * A compact, read-only **file card** for displaying a file that already exists (e.g. from the backend) —\n * an image or a document (`pdf` / `docx` / `csv` / `svg` / …). Shows a leading **`Avatar`** (the image\n * thumbnail via `src`, or a type-based file icon in a tinted square), the **name** middle-truncated so\n * the extension is never lost, the **type** underneath, and a **download** control. Simple to drop in —\n * pass `name` (+ `src` for the thumbnail/download). Not to be confused with `FileUploader` (which\n * *collects* files to upload); this only *displays* one. Token-only styling.\n *\n * @example\n * <FileCard name=\"annual-report.pdf\" src=\"/files/annual-report.pdf\" />\n * <FileCard name=\"avatar.png\" src={url} meta=\"240 KB\" />\n */\nexport const FileCard = forwardRef<HTMLDivElement, FileCardProps>(function FileCard(\n {\n name,\n src,\n type,\n image,\n fileSize,\n fetchSize = false,\n meta,\n color = 'accent',\n size = 'md',\n downloadable = true,\n onDownload,\n className,\n style,\n ...props\n },\n ref,\n) {\n const t = useT()\n const ext = extensionOf(name, type)\n const isImage = image ?? (type?.startsWith('image/') || IMAGE_EXTS.has(ext))\n const { base, ext: nameExt } = splitName(name)\n\n // optional auto size via a HEAD request (only when opted in and no explicit fileSize)\n const [fetchedSize, setFetchedSize] = useState<number | null>(null)\n useEffect(() => {\n if (!fetchSize || fileSize != null || !src || typeof fetch === 'undefined') return\n let cancelled = false\n fetch(src, { method: 'HEAD' })\n .then((res) => {\n const len = res.headers.get('content-length')\n if (!cancelled && len) setFetchedSize(Number(len))\n })\n .catch(() => {})\n return () => {\n cancelled = true\n }\n }, [fetchSize, fileSize, src])\n\n const sizeText =\n fileSize != null\n ? typeof fileSize === 'number'\n ? formatBytes(fileSize)\n : fileSize\n : fetchedSize != null\n ? formatBytes(fetchedSize)\n : ''\n // \"TYPE · 2.3 MB\" (either part optional) — overridden wholesale by `meta`\n const derivedMeta = [ext ? ext.toUpperCase() : '', sizeText].filter(Boolean).join(' · ')\n const metaLine = meta ?? (derivedMeta || null)\n\n const handleDownload = () => {\n if (onDownload) return onDownload()\n if (!src) return\n const a = document.createElement('a')\n a.href = src\n a.download = name\n a.rel = 'noopener'\n a.click()\n }\n\n return (\n <div\n ref={ref}\n className={clsx(styles.fileCard, styles[size], className)}\n style={{ '--tz-btn-rgb': `var(--tz-color-${color}-rgb)`, ...style } as CSSProperties}\n {...props}\n >\n <Avatar\n className={styles.avatar}\n src={isImage ? src : undefined}\n icon={isImage ? undefined : (FILE_ICONS[ext] ?? 'Document')}\n name={name}\n shape=\"square\"\n size={size}\n color={color}\n />\n <div className={styles.body}>\n <span className={styles.name} title={name}>\n <span className={styles.nameBase}>{base}</span>\n {nameExt && <span className={styles.nameExt}>{nameExt}</span>}\n </span>\n {metaLine != null && (\n <Typography as=\"span\" variant=\"bodySmall\" color=\"muted\" uppercase className={styles.type}>\n {metaLine}\n </Typography>\n )}\n </div>\n {downloadable && (src || onDownload) && (\n <IconButton\n variant=\"filled\"\n size={size === 'lg' ? 'md' : 'sm'}\n className={styles.download}\n aria-label={t('fileCard.download', { name })}\n onClick={handleDownload}\n >\n <Icon name=\"ImportArrow\" />\n </IconButton>\n )}\n </div>\n )\n})\n"],"names":["IMAGE_EXTS","FILE_ICONS","extensionOf","name","type","dot","splitName","formatBytes","bytes","units","value","i","FileCard","forwardRef","src","image","fileSize","fetchSize","meta","color","size","downloadable","onDownload","className","style","props","ref","t","useT","ext","isImage","base","nameExt","fetchedSize","setFetchedSize","useState","useEffect","cancelled","res","len","sizeText","derivedMeta","metaLine","handleDownload","a","jsxs","clsx","styles","jsx","Avatar","Typography","IconButton","Icon"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const t=require("react/jsx-runtime"),d=require("react"),L=require("clsx"),V=require("@dnd-kit/core"),ae=require("@dnd-kit/sortable"),Et=require("@dnd-kit/utilities"),kt=require("@formkit/auto-animate/react"),Rt=require("react-dropzone"),zt=require("./formContext-bTWrqdEV.cjs"),Ve=require("./toastStore-B4Tk2Xk7.cjs"),M=require("./Icon-BUP5_kRs.cjs"),Ft=require("./Skeleton-DK0lAjS9.cjs"),ie=require("./Typography-B6ASPrzT.cjs"),Dt=require("react-image-crop"),Ge=require("./Button-BQhiJq8e.cjs"),Ye=require("./Modal-DPObz0b-.cjs"),Ct=require("./TextField-B22NRQ91.cjs"),ce=require("./ConfigProvider-CtpfSy1i.cjs"),Ie=require("./TextField.module-DsNCo8vN.cjs"),Mt="_cropSection_1j2zs_4",Pt="_cropHead_1j2zs_10",qt="_cropStage_1j2zs_16",Lt="_crop_1j2zs_4",Bt="_cropImg_1j2zs_30",$t="_altFields_1j2zs_35",Q={cropSection:Mt,cropHead:Pt,cropStage:qt,crop:Lt,cropImg:Bt,altFields:$t};function Ot({mode:n,name:o,imageUrl:l,mimeType:p,editLocales:S,initialDraft:w,onClose:N,onSave:P}){const h=ce.useT(),z=d.useRef(null),[_,B]=d.useState(),[i,$]=d.useState(null),[O,G]=d.useState(null),[Y,A]=d.useState(w),[W,X]=d.useState(null),[E,T]=d.useState(!1),Z=(c,y)=>{B(y);const g=z.current;if(g&&g.width>0&&c.width>=1&&c.height>=1){const k=g.naturalWidth/g.width,q=g.naturalHeight/g.height;$({x:Math.round(c.x*k),y:Math.round(c.y*q),width:Math.round(c.width*k),height:Math.round(c.height*q)})}else $(null)},U=async()=>{const c=z.current;if(!c||!i||i.width<1||i.height<1)return;const y=document.createElement("canvas");y.width=i.width,y.height=i.height;const g=y.getContext("2d");if(!g)return;g.imageSmoothingEnabled=!1,g.drawImage(c,i.x,i.y,i.width,i.height,0,0,i.width,i.height);const k=await new Promise(q=>y.toBlob(q,p,1));if(!k)throw new Error("canvas.toBlob returned null");return new File([k],o,{type:p,lastModified:Date.now()})},J=async()=>{if(n==="altText"){P({draft:Y});return}T(!0);try{const c=i&&i.width>=1&&i.height>=1?await U():void 0;P({croppedFile:c})}catch{X(h("fileUploader.cropError")),T(!1)}};return t.jsx(Ye.Modal,{open:!0,onClose:N,size:n==="crop"?"lg":"sm",icon:n==="crop"?"Crop":"Text",title:h(n==="crop"?"fileUploader.cropTitle":"fileUploader.altTitle"),description:o,footer:t.jsxs(t.Fragment,{children:[t.jsx(Ge.Button,{variant:"text",color:"accent",size:"sm",onClick:N,disabled:E,children:h("common.cancel")}),t.jsx(Ge.Button,{size:"sm",onClick:J,loading:E,children:h("common.save")})]}),children:n==="crop"?t.jsxs("div",{className:Q.cropSection,children:[t.jsxs("div",{className:Q.cropHead,children:[t.jsx(ie.Typography,{variant:"bodySmall",color:"muted",children:h("fileUploader.cropHint")}),t.jsx(ie.Typography,{variant:"bodySmall",color:i?"text":"muted",children:i?`${i.width} × ${i.height} px`:O?`${O.w} × ${O.h} px`:""})]}),t.jsx("div",{className:Q.cropStage,children:t.jsx(Dt,{crop:_,onChange:Z,className:Q.crop,children:t.jsx("img",{ref:z,src:l??void 0,alt:"",className:Q.cropImg,onLoad:c=>G({w:c.currentTarget.naturalWidth,h:c.currentTarget.naturalHeight})})})}),W&&t.jsx(ie.Typography,{variant:"bodySmall",color:"error",children:W})]}):t.jsx("div",{className:Q.altFields,children:S.map(c=>t.jsx(Ct.TextField,{label:c.label??(c.code||h("fileUploader.altTitle")),placeholder:h("fileUploader.altPlaceholder"),value:Y[c.code]??"",onChange:y=>A(g=>({...g,[c.code]:y.target.value}))},c.code))})})}const At="_backdrop_uqdv2_5",Wt="_media_uqdv2_9",Ht="_mediaSvg_uqdv2_19",Kt="_close_uqdv2_27",re={backdrop:At,media:Wt,mediaSvg:Ht,close:Kt};function Vt({url:n,isVideo:o,isSvg:l,name:p,onClose:S}){const w=ce.useT();return t.jsxs(Ye.Overlay,{open:!0,onClose:S,dim:.85,className:re.backdrop,role:"dialog","aria-modal":"true","aria-label":w("fileUploader.preview",{name:p}),children:[t.jsx("button",{type:"button",className:re.close,"aria-label":w("fileUploader.closePreview"),onClick:S,autoFocus:!0,children:t.jsx(M.Icon,{name:"Close",size:"lg"})}),o?t.jsx("video",{src:n,className:re.media,controls:!0,playsInline:!0}):t.jsx("img",{src:n,alt:p,className:L.clsx(re.media,l&&re.mediaSvg)})]})}const Gt="_root_m8xag_4",Yt="_fullWidth_m8xag_9",Jt="_disabled_m8xag_14",Qt="_dropzone_m8xag_17",Xt="_dropText_m8xag_41",Zt="_dropping_m8xag_56",eo="_error_m8xag_61",to="_dropIcon_m8xag_65",oo="_prompt_m8xag_77",no="_accent_m8xag_82",so="_hint_m8xag_87",ro="_list_m8xag_93",ao="_populated_m8xag_103",lo="_tile_m8xag_121",io="_grabbable_m8xag_130",co="_entering_m8xag_139",uo="_dragging_m8xag_142",fo="_tileError_m8xag_148",po="_tileImg_m8xag_153",go="_tileImgPending_m8xag_161",mo="_tileSkeleton_m8xag_164",ho="_tileFallback_m8xag_169",xo="_tilePlay_m8xag_179",_o="_tileTop_m8xag_198",bo="_tileBottom_m8xag_208",yo="_tileRemove_m8xag_218",vo="_tileAction_m8xag_219",jo="_tileActionEnd_m8xag_254",So="_tileText_m8xag_257",To="_name_m8xag_264",Uo="_nameBase_m8xag_271",Io="_nameExt_m8xag_277",wo="_tileMeta_m8xag_281",No="_metaError_m8xag_285",r={root:Gt,fullWidth:Yt,disabled:Jt,dropzone:Qt,dropText:Xt,dropping:Zt,error:eo,dropIcon:to,prompt:oo,accent:no,hint:so,list:ro,populated:ao,tile:lo,grabbable:io,entering:co,dragging:uo,tileError:fo,tileImg:po,tileImgPending:go,tileSkeleton:mo,tileFallback:ho,tilePlay:xo,tileTop:_o,tileBottom:bo,tileRemove:yo,tileAction:vo,tileActionEnd:jo,tileText:So,name:To,nameBase:Uo,nameExt:Io,tileMeta:wo,metaError:No},Je=()=>typeof URL<"u"&&typeof URL.createObjectURL=="function",Eo=300,ko=(n,o,l,p)=>{let S=[{},{}],w=Eo;if(o==="add")w=0;else if(o==="remove")S=[{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(-8px)"}];else if(l&&p){const N=l.left-p.left,P=l.top-p.top;S=[{transform:`translate(${N}px, ${P}px)`},{transform:"translate(0, 0)"}]}return new KeyframeEffect(n,S,{duration:w,easing:"ease-out"})},le=n=>{if(n<1024)return`${n} B`;const o=["KB","MB","GB","TB"];let l=n/1024,p=0;for(;l>=1024&&p<o.length-1;)l/=1024,p+=1;return`${l.toFixed(l<10?1:0)} ${o[p]}`},Ro=n=>{if(typeof n=="number")return n;const o=/^\s*([\d.]+)\s*(b|kb|mb|gb|tb)?\s*$/i.exec(n);if(!o)return;const l={b:1,kb:1024,mb:1024**2,gb:1024**3,tb:1024**4};return parseFloat(o[1])*(l[(o[2]||"b").toLowerCase()]??1)},Qe=n=>`f:${n.name}:${n.size}:${n.lastModified}`,zo=n=>n.file?Qe(n.file):`s:${n.source??""}`,me=n=>n.file?n.file.name:n.source?/^(data|blob):/i.test(n.source)?"File":n.source.split(/[?#]/)[0].split("/").pop()||"File":"File",we=n=>{if(n.file)return n.file.type.startsWith("image/");const o=n.source;return o?/^data:image\//i.test(o)?!0:/^data:/i.test(o)?!1:/\.(png|jpe?g|gif|webp|avif|svg|bmp|ico|heic|heif)(?:[?#]|$)/i.test(o)||!/\.[a-z0-9]{1,8}(?:[?#]|$)/i.test(o):!1},Ne=n=>{if(n.file)return n.file.type.startsWith("video/");const o=n.source;return o?/^data:video\//i.test(o)||/\.(mp4|webm|ogg|ogv|mov|m4v|avi|mkv)(?:[?#]|$)/i.test(o):!1},Fo=n=>{if(typeof document>"u")return;const o=document.createElement("a");if(o.style.display="none",n.file){if(!Je())return;const l=URL.createObjectURL(n.file);o.href=l,o.download=n.file.name,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(l),1e3)}else n.source&&(o.href=n.source,o.download=me(n),o.target="_blank",o.rel="noopener",document.body.appendChild(o),o.click(),o.remove())},Do=n=>{const o=n.lastIndexOf(".");return o>0&&n.length-o<=7?{base:n.slice(0,o),ext:n.slice(o)}:{base:n,ext:""}};function Co({id:n,item:o,preview:l,sortable:p,entering:S,disabled:w,error:N,onRemove:P,onCrop:h,onAltText:z,onDownload:_,onView:B,onPreviewError:i}){const{attributes:$,listeners:O,setNodeRef:G,transform:Y,transition:A,isDragging:W}=ae.useSortable({id:n,disabled:!p}),X={transform:Et.CSS.Transform.toString(Y),transition:A},E=ce.useT(),T=me(o),{base:Z,ext:U}=Do(T),[J,c]=d.useState(()=>!l||l.startsWith("blob:")),y=d.useRef(l);y.current!==l&&(y.current=l,c(!l||l.startsWith("blob:")));const g=d.useRef(null);d.useEffect(()=>{const m=g.current;m!=null&&m.complete&&m.naturalWidth>0&&c(!0)},[l]);const k=()=>{c(!0),i==null||i()},q=o.file?le(o.file.size):E("fileUploader.uploaded"),he=Ne(o),de=_?t.jsx("button",{type:"button",className:r.tileAction,"aria-label":E("fileUploader.download",{name:T}),onClick:_,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"DocumentDownload",size:"sm"})}):null;return t.jsxs("div",{ref:G,style:X,className:L.clsx(r.tile,p&&r.grabbable,S&&r.entering,W&&r.dragging,N&&r.tileError),...$,...O,children:[l&&!J&&t.jsx(Ft.Skeleton,{variant:"rect",width:"100%",height:"100%",className:r.tileSkeleton}),l?he?t.jsxs(t.Fragment,{children:[t.jsx("video",{src:l,className:r.tileImg,muted:!0,playsInline:!0,preload:"metadata",draggable:!1,onLoadedData:()=>c(!0),onError:k}),t.jsx("span",{className:r.tilePlay,"aria-hidden":"true",children:t.jsx(M.Icon,{name:"Play",size:"lg"})})]}):t.jsx("img",{ref:g,src:l,alt:"",className:L.clsx(r.tileImg,!J&&r.tileImgPending),draggable:!1,onLoad:()=>c(!0),onError:k}):t.jsx("span",{className:r.tileFallback,"aria-hidden":"true",children:t.jsx(M.Icon,{name:"Document",size:"lg"})}),t.jsxs("div",{className:r.tileTop,children:[t.jsxs("span",{className:r.tileText,children:[t.jsxs("span",{className:r.name,title:T,children:[t.jsx("span",{className:r.nameBase,children:Z}),U&&t.jsx("span",{className:r.nameExt,children:U})]}),t.jsx("span",{className:L.clsx(r.tileMeta,N&&r.metaError),children:N??q})]}),!w&&t.jsx("button",{type:"button",className:r.tileRemove,"aria-label":E("fileUploader.remove",{name:T}),onClick:P,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Close",size:"sm"})})]}),(h||z||_||B)&&t.jsxs("div",{className:r.tileBottom,children:[h&&t.jsx("button",{type:"button",className:r.tileAction,"aria-label":E("fileUploader.crop",{name:T}),onClick:h,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Crop",size:"sm"})}),z&&t.jsx("button",{type:"button",className:r.tileAction,"aria-label":E("fileUploader.editAlt",{name:T}),onClick:z,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Text",size:"sm"})}),de,B&&t.jsx("button",{type:"button",className:L.clsx(r.tileAction,r.tileActionEnd),"aria-label":E("fileUploader.preview",{name:T}),onClick:B,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Eye",size:"sm"})})]})]})}const Mo=d.forwardRef(function({multiple:o=!1,allowDrop:l=!0,allowReorder:p=!0,allowDownload:S=!0,allowPreview:w=!0,allowAltText:N=!0,altTextLocales:P,localizedAltText:h=!0,allowDuplicates:z=!1,disabled:_=!1,accept:B,maxFiles:i,maxFileSize:$,itemInsertLocation:O="end",value:G,defaultValue:Y,onChange:A,label:W,error:X,helperText:E,required:T=!1,fullWidth:Z=!0,name:U,id:J,onBlur:c,className:y,style:g,...k},q){var We;const he=d.useId(),de=J??he,m=`${de}-helper`,F=$!=null?Ro($):void 0,[ue,xe]=d.useState(null);d.useEffect(()=>{if(!ue)return;const e=window.setTimeout(()=>xe(null),4e3);return()=>window.clearTimeout(e)},[ue]);const ee=zt.useFormContext(),Ee=!!(ee&&U),D=ee&&U?ee.field(U):void 0,ke=o?[]:null,Re=G!==void 0?G:Ee?ee.values[U]??ke:void 0,ze=Re!==void 0,[Xe,Ze]=d.useState(Y??ke),te=ze?Re:Xe,x=te==null?[]:Array.isArray(te)?te:[te],_e=X??(D==null?void 0:D.error)??!1,et=E??(D==null?void 0:D.helperText),be=ue??et,tt=!!ue||_e,fe=p&&o&&!_,Fe=d.useRef(new WeakMap),De=d.useRef(0),ot=(e,s)=>{if(e.file){let a=Fe.current.get(e.file);return a||(De.current+=1,a=`f${De.current}`,Fe.current.set(e.file,a)),a}return e.source?`s:${e.source}`:`i:${s}`},I=x.map((e,s)=>ot(e,s)),Ce=d.useRef(new Set),nt=new Set(I.filter(e=>!Ce.current.has(e)));d.useEffect(()=>{Ce.current=new Set(I)});const[st,Me]=d.useState(()=>new Set),rt=e=>Me(s=>s.has(e)?s:new Set(s).add(e)),[at,lt]=d.useState(()=>new Set),it=e=>lt(s=>s.has(e)?s:new Set(s).add(e)),pe=d.useRef(new Map),ge=e=>{if(e.file){const s=e.file.type;if(!s.startsWith("image/")&&!s.startsWith("video/")||!Je()||at.has(e.file))return null;let a=pe.current.get(e.file);return a||(a=URL.createObjectURL(e.file),pe.current.set(e.file,a)),a}return e.source&&!st.has(e.source)?e.source:null},[C,Pe]=d.useState(null);d.useEffect(()=>{const e=pe.current,s=new Set(x.map(u=>u.file).filter(Boolean)),a=new Set(x.filter(u=>!u.file&&u.source).map(u=>u.source));for(const[u,f]of e)!s.has(u)&&f!==(C==null?void 0:C.url)&&(URL.revokeObjectURL(f),e.delete(u));Me(u=>{if(u.size===0)return u;const f=new Set([...u].filter(v=>a.has(v)));return f.size===u.size?u:f})},[te,C]),d.useEffect(()=>{const e=pe.current;return()=>{for(const s of e.values())URL.revokeObjectURL(s);e.clear()}},[]);const ct=e=>e.map((s,a)=>s.sortIndex===a?s:{...s,sortIndex:a}),oe=e=>{const s=ct(e),a=o?s:s[0]??null;ze||Ze(a),Ee&&ee.setValue(U,a),A==null||A(a)},ye=()=>D==null?void 0:D.onBlur({}),b=ce.useT(),dt=ce.useLocales(),qe=P??dt,ut=h&&qe.length>0?qe:[{code:""}],[ne,ve]=d.useState(null),[Le,Be]=d.useState("altText"),je=ne!=null?I.indexOf(ne):-1,R=je!==-1?x[je]:null,ft=e=>{Be("crop"),ve(I[e]??null)},pt=e=>{Be("altText"),ve(I[e]??null)},Se=()=>ve(null),gt=e=>{const s=ge(e);if(!s)return;const a=e.file?e.file.type==="image/svg+xml":/^data:image\/svg/i.test(e.source??"")||/\.svg(?:[?#]|$)/i.test(e.source??"");Pe({url:s,isVideo:Ne(e),isSvg:a,name:me(e)})},mt=R?h?R.altText&&typeof R.altText=="object"?{...R.altText}:{}:{"":typeof R.altText=="string"?R.altText:""}:{},ht=({draft:e,croppedFile:s})=>{if(je===-1)return Se();oe(x.map((a,u)=>{if(I[u]!==ne)return a;const f={...a};if(e!==void 0)if(h){const v=Object.fromEntries(Object.entries(e).map(([H,j])=>[H,j.trim()]).filter(([,H])=>H!==""));f.altText=Object.keys(v).length>0?v:void 0}else f.altText=(e[""]??"").trim()||void 0;return s&&(f.file=s,f.source=""),f})),Se()},xt=(e,s=[])=>{const a=s.filter(j=>j.errors.some(K=>K.code==="file-invalid-type")),u=s.filter(j=>j.errors.some(K=>K.code==="file-too-large"));a.length>0&&Ve.toast.error(a.length===1?b("fileUploader.wrongTypeOne",{name:a[0].file.name}):b("fileUploader.wrongTypeMany",{count:a.length})),u.length>0&&F!=null&&Ve.toast.error(u.length===1?b("fileUploader.tooLargeOne",{name:u[0].file.name,size:le(F)}):b("fileUploader.tooLargeMany",{count:u.length,size:le(F)}));const f=[];let v=e;if(o&&!z){const j=new Set(x.map(zo)),K=[];for(const He of v){const Ke=Qe(He);j.has(Ke)||(j.add(Ke),K.push(He))}K.length<v.length&&f.push(b("fileUploader.duplicate")),v=K}if(o&&i!=null){const j=Math.max(0,i-x.length);v.length>j&&(v=v.slice(0,j),f.push(i===1?b("fileUploader.hintUpToOne",{count:i}):b("fileUploader.hintUpToMany",{count:i})))}if(xe(f.length>0?f.join(" · "):null),v.length===0)return;const H=v.map(j=>({file:j,source:"",sortIndex:0}));if(!o){oe([H[0]]);return}oe(O==="start"?[...H,...x]:[...x,...H])},_t=e=>{xe(null),oe(x.filter((s,a)=>a!==e)),ye()},[bt,Te]=kt.useAutoAnimate(ko),$e=()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>Te(!0)):Te(!0)},yt=()=>Te(!1),vt=()=>$e(),jt=e=>{const{active:s,over:a}=e;if(a&&s.id!==a.id){const u=I.indexOf(String(s.id)),f=I.indexOf(String(a.id));u!==-1&&f!==-1&&oe(ae.arrayMove(x,u,f))}$e()},St=V.useSensors(V.useSensor(V.PointerSensor,{activationConstraint:{distance:5}}),V.useSensor(V.KeyboardSensor,{coordinateGetter:ae.sortableKeyboardCoordinates})),se=d.useRef(!1),{getRootProps:Tt,getInputProps:Ut,isDragActive:It}=Rt.useDropzone({multiple:o,accept:B,maxSize:F,disabled:_,noKeyboard:!1,noDrag:!l,onFileDialogOpen:()=>{se.current=!0},onFileDialogCancel:()=>{se.current=!1,ye()},onDrop:(e,s)=>{se.current=!1,xt(e,s)}}),Oe=o||x.length===0,Ue=[];o&&i!=null&&Ue.push(i===1?b("fileUploader.hintUpToOne",{count:i}):b("fileUploader.hintUpToMany",{count:i})),F!=null&&Ue.push(b("fileUploader.hintMax",{size:le(F)}));const Ae=Ue.join(" · "),wt=l?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:r.accent,children:b("fileUploader.choose")})," ",b("fileUploader.dropSuffix")]}):t.jsx("span",{className:r.accent,children:b("fileUploader.choose")}),Nt=e=>{if(c==null||c(e),!e.currentTarget.contains(e.relatedTarget)&&ne==null){if(se.current){se.current=!1;return}ye()}};return t.jsxs("div",{ref:q,id:de,className:L.clsx(r.root,Z&&r.fullWidth,_e&&r.error,_&&r.disabled,y),style:g,"aria-invalid":_e||void 0,"aria-describedby":be!=null?m:void 0,onBlur:Nt,...k,...U?{name:U,tabIndex:-1}:{},children:[W!=null&&t.jsxs("label",{className:Ie.fieldStyles.label,children:[t.jsx(ie.Typography,{as:"span",variant:"bodySmall",color:"muted",children:W}),T&&t.jsx("span",{className:Ie.fieldStyles.required,"aria-hidden":"true",children:"*"})]}),Oe&&t.jsxs("div",{...Tt({className:L.clsx(r.dropzone,It&&r.dropping)}),children:[t.jsx("input",{...Ut()}),t.jsx("span",{className:r.dropIcon,"aria-hidden":"true",children:t.jsx(M.Icon,{name:"DocumentUpload",size:"lg"})}),t.jsxs("span",{className:r.dropText,children:[t.jsx("span",{className:r.prompt,children:wt}),Ae&&t.jsx("span",{className:r.hint,children:Ae})]})]}),t.jsx(V.DndContext,{sensors:St,collisionDetection:V.closestCenter,onDragStart:fe?yt:void 0,onDragEnd:fe?jt:void 0,onDragCancel:fe?vt:void 0,children:t.jsx(ae.SortableContext,{items:I,strategy:ae.rectSortingStrategy,children:t.jsx("div",{ref:bt,className:L.clsx(r.list,Oe&&x.length>0&&r.populated),children:x.map((e,s)=>t.jsx(Co,{id:I[s],item:e,preview:ge(e),sortable:fe&&x.length>1,entering:nt.has(I[s]),disabled:_,error:e.file&&F!=null&&e.file.size>F?b("fileUploader.exceedsLimit",{size:le(F)}):void 0,onRemove:()=>_t(s),onCrop:N&&!_&&we(e)?()=>ft(s):void 0,onAltText:N&&!_&&we(e)?()=>pt(s):void 0,onDownload:S&&!_?()=>Fo(e):void 0,onView:w&&!_&&ge(e)!=null&&(we(e)||Ne(e))?()=>gt(e):void 0,onPreviewError:e.file?()=>it(e.file):e.source?()=>rt(e.source):void 0},I[s]))})})}),be!=null&&t.jsx(ie.Typography,{as:"span",id:m,variant:"bodySmall",color:tt?"error":"muted",className:Ie.fieldStyles.helper,role:"status","aria-live":"polite",children:be}),R&&t.jsx(Ot,{mode:Le,name:me(R),imageUrl:ge(R),mimeType:((We=R.file)==null?void 0:We.type)||"image/png",editLocales:ut,initialDraft:mt,onClose:Se,onSave:ht},`${ne}:${Le}`),C&&t.jsx(Vt,{url:C.url,isVideo:C.isVideo,isSvg:C.isSvg,name:C.name,onClose:()=>Pe(null)})]})});exports.FileUploader=Mo;
|
|
2
|
-
//# sourceMappingURL=FileUploader-
|
|
1
|
+
"use strict";const t=require("react/jsx-runtime"),d=require("react"),L=require("clsx"),V=require("@dnd-kit/core"),ae=require("@dnd-kit/sortable"),Et=require("@dnd-kit/utilities"),kt=require("@formkit/auto-animate/react"),Rt=require("react-dropzone"),zt=require("./formContext-bTWrqdEV.cjs"),Ve=require("./toastStore-B4Tk2Xk7.cjs"),M=require("./Icon-BUP5_kRs.cjs"),Ft=require("./Skeleton-DK0lAjS9.cjs"),ie=require("./Typography-B6ASPrzT.cjs"),Dt=require("react-image-crop"),Ge=require("./Button-BZq1mIUH.cjs"),Ye=require("./Modal-CcrqM4kn.cjs"),Ct=require("./TextField-D_hzd5Gf.cjs"),ce=require("./ConfigProvider-CzAQf_d_.cjs"),Ie=require("./TextField.module-DsNCo8vN.cjs"),Mt="_cropSection_1j2zs_4",Pt="_cropHead_1j2zs_10",qt="_cropStage_1j2zs_16",Lt="_crop_1j2zs_4",Bt="_cropImg_1j2zs_30",$t="_altFields_1j2zs_35",Q={cropSection:Mt,cropHead:Pt,cropStage:qt,crop:Lt,cropImg:Bt,altFields:$t};function Ot({mode:n,name:o,imageUrl:l,mimeType:p,editLocales:S,initialDraft:w,onClose:N,onSave:P}){const h=ce.useT(),z=d.useRef(null),[_,B]=d.useState(),[i,$]=d.useState(null),[O,G]=d.useState(null),[Y,A]=d.useState(w),[W,X]=d.useState(null),[E,T]=d.useState(!1),Z=(c,y)=>{B(y);const g=z.current;if(g&&g.width>0&&c.width>=1&&c.height>=1){const k=g.naturalWidth/g.width,q=g.naturalHeight/g.height;$({x:Math.round(c.x*k),y:Math.round(c.y*q),width:Math.round(c.width*k),height:Math.round(c.height*q)})}else $(null)},U=async()=>{const c=z.current;if(!c||!i||i.width<1||i.height<1)return;const y=document.createElement("canvas");y.width=i.width,y.height=i.height;const g=y.getContext("2d");if(!g)return;g.imageSmoothingEnabled=!1,g.drawImage(c,i.x,i.y,i.width,i.height,0,0,i.width,i.height);const k=await new Promise(q=>y.toBlob(q,p,1));if(!k)throw new Error("canvas.toBlob returned null");return new File([k],o,{type:p,lastModified:Date.now()})},J=async()=>{if(n==="altText"){P({draft:Y});return}T(!0);try{const c=i&&i.width>=1&&i.height>=1?await U():void 0;P({croppedFile:c})}catch{X(h("fileUploader.cropError")),T(!1)}};return t.jsx(Ye.Modal,{open:!0,onClose:N,size:n==="crop"?"lg":"sm",icon:n==="crop"?"Crop":"Text",title:h(n==="crop"?"fileUploader.cropTitle":"fileUploader.altTitle"),description:o,footer:t.jsxs(t.Fragment,{children:[t.jsx(Ge.Button,{variant:"text",color:"accent",size:"sm",onClick:N,disabled:E,children:h("common.cancel")}),t.jsx(Ge.Button,{size:"sm",onClick:J,loading:E,children:h("common.save")})]}),children:n==="crop"?t.jsxs("div",{className:Q.cropSection,children:[t.jsxs("div",{className:Q.cropHead,children:[t.jsx(ie.Typography,{variant:"bodySmall",color:"muted",children:h("fileUploader.cropHint")}),t.jsx(ie.Typography,{variant:"bodySmall",color:i?"text":"muted",children:i?`${i.width} × ${i.height} px`:O?`${O.w} × ${O.h} px`:""})]}),t.jsx("div",{className:Q.cropStage,children:t.jsx(Dt,{crop:_,onChange:Z,className:Q.crop,children:t.jsx("img",{ref:z,src:l??void 0,alt:"",className:Q.cropImg,onLoad:c=>G({w:c.currentTarget.naturalWidth,h:c.currentTarget.naturalHeight})})})}),W&&t.jsx(ie.Typography,{variant:"bodySmall",color:"error",children:W})]}):t.jsx("div",{className:Q.altFields,children:S.map(c=>t.jsx(Ct.TextField,{label:c.label??(c.code||h("fileUploader.altTitle")),placeholder:h("fileUploader.altPlaceholder"),value:Y[c.code]??"",onChange:y=>A(g=>({...g,[c.code]:y.target.value}))},c.code))})})}const At="_backdrop_uqdv2_5",Wt="_media_uqdv2_9",Ht="_mediaSvg_uqdv2_19",Kt="_close_uqdv2_27",re={backdrop:At,media:Wt,mediaSvg:Ht,close:Kt};function Vt({url:n,isVideo:o,isSvg:l,name:p,onClose:S}){const w=ce.useT();return t.jsxs(Ye.Overlay,{open:!0,onClose:S,dim:.85,className:re.backdrop,role:"dialog","aria-modal":"true","aria-label":w("fileUploader.preview",{name:p}),children:[t.jsx("button",{type:"button",className:re.close,"aria-label":w("fileUploader.closePreview"),onClick:S,autoFocus:!0,children:t.jsx(M.Icon,{name:"Close",size:"lg"})}),o?t.jsx("video",{src:n,className:re.media,controls:!0,playsInline:!0}):t.jsx("img",{src:n,alt:p,className:L.clsx(re.media,l&&re.mediaSvg)})]})}const Gt="_root_m8xag_4",Yt="_fullWidth_m8xag_9",Jt="_disabled_m8xag_14",Qt="_dropzone_m8xag_17",Xt="_dropText_m8xag_41",Zt="_dropping_m8xag_56",eo="_error_m8xag_61",to="_dropIcon_m8xag_65",oo="_prompt_m8xag_77",no="_accent_m8xag_82",so="_hint_m8xag_87",ro="_list_m8xag_93",ao="_populated_m8xag_103",lo="_tile_m8xag_121",io="_grabbable_m8xag_130",co="_entering_m8xag_139",uo="_dragging_m8xag_142",fo="_tileError_m8xag_148",po="_tileImg_m8xag_153",go="_tileImgPending_m8xag_161",mo="_tileSkeleton_m8xag_164",ho="_tileFallback_m8xag_169",xo="_tilePlay_m8xag_179",_o="_tileTop_m8xag_198",bo="_tileBottom_m8xag_208",yo="_tileRemove_m8xag_218",vo="_tileAction_m8xag_219",jo="_tileActionEnd_m8xag_254",So="_tileText_m8xag_257",To="_name_m8xag_264",Uo="_nameBase_m8xag_271",Io="_nameExt_m8xag_277",wo="_tileMeta_m8xag_281",No="_metaError_m8xag_285",r={root:Gt,fullWidth:Yt,disabled:Jt,dropzone:Qt,dropText:Xt,dropping:Zt,error:eo,dropIcon:to,prompt:oo,accent:no,hint:so,list:ro,populated:ao,tile:lo,grabbable:io,entering:co,dragging:uo,tileError:fo,tileImg:po,tileImgPending:go,tileSkeleton:mo,tileFallback:ho,tilePlay:xo,tileTop:_o,tileBottom:bo,tileRemove:yo,tileAction:vo,tileActionEnd:jo,tileText:So,name:To,nameBase:Uo,nameExt:Io,tileMeta:wo,metaError:No},Je=()=>typeof URL<"u"&&typeof URL.createObjectURL=="function",Eo=300,ko=(n,o,l,p)=>{let S=[{},{}],w=Eo;if(o==="add")w=0;else if(o==="remove")S=[{opacity:1,transform:"translateY(0)"},{opacity:0,transform:"translateY(-8px)"}];else if(l&&p){const N=l.left-p.left,P=l.top-p.top;S=[{transform:`translate(${N}px, ${P}px)`},{transform:"translate(0, 0)"}]}return new KeyframeEffect(n,S,{duration:w,easing:"ease-out"})},le=n=>{if(n<1024)return`${n} B`;const o=["KB","MB","GB","TB"];let l=n/1024,p=0;for(;l>=1024&&p<o.length-1;)l/=1024,p+=1;return`${l.toFixed(l<10?1:0)} ${o[p]}`},Ro=n=>{if(typeof n=="number")return n;const o=/^\s*([\d.]+)\s*(b|kb|mb|gb|tb)?\s*$/i.exec(n);if(!o)return;const l={b:1,kb:1024,mb:1024**2,gb:1024**3,tb:1024**4};return parseFloat(o[1])*(l[(o[2]||"b").toLowerCase()]??1)},Qe=n=>`f:${n.name}:${n.size}:${n.lastModified}`,zo=n=>n.file?Qe(n.file):`s:${n.source??""}`,me=n=>n.file?n.file.name:n.source?/^(data|blob):/i.test(n.source)?"File":n.source.split(/[?#]/)[0].split("/").pop()||"File":"File",we=n=>{if(n.file)return n.file.type.startsWith("image/");const o=n.source;return o?/^data:image\//i.test(o)?!0:/^data:/i.test(o)?!1:/\.(png|jpe?g|gif|webp|avif|svg|bmp|ico|heic|heif)(?:[?#]|$)/i.test(o)||!/\.[a-z0-9]{1,8}(?:[?#]|$)/i.test(o):!1},Ne=n=>{if(n.file)return n.file.type.startsWith("video/");const o=n.source;return o?/^data:video\//i.test(o)||/\.(mp4|webm|ogg|ogv|mov|m4v|avi|mkv)(?:[?#]|$)/i.test(o):!1},Fo=n=>{if(typeof document>"u")return;const o=document.createElement("a");if(o.style.display="none",n.file){if(!Je())return;const l=URL.createObjectURL(n.file);o.href=l,o.download=n.file.name,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(l),1e3)}else n.source&&(o.href=n.source,o.download=me(n),o.target="_blank",o.rel="noopener",document.body.appendChild(o),o.click(),o.remove())},Do=n=>{const o=n.lastIndexOf(".");return o>0&&n.length-o<=7?{base:n.slice(0,o),ext:n.slice(o)}:{base:n,ext:""}};function Co({id:n,item:o,preview:l,sortable:p,entering:S,disabled:w,error:N,onRemove:P,onCrop:h,onAltText:z,onDownload:_,onView:B,onPreviewError:i}){const{attributes:$,listeners:O,setNodeRef:G,transform:Y,transition:A,isDragging:W}=ae.useSortable({id:n,disabled:!p}),X={transform:Et.CSS.Transform.toString(Y),transition:A},E=ce.useT(),T=me(o),{base:Z,ext:U}=Do(T),[J,c]=d.useState(()=>!l||l.startsWith("blob:")),y=d.useRef(l);y.current!==l&&(y.current=l,c(!l||l.startsWith("blob:")));const g=d.useRef(null);d.useEffect(()=>{const m=g.current;m!=null&&m.complete&&m.naturalWidth>0&&c(!0)},[l]);const k=()=>{c(!0),i==null||i()},q=o.file?le(o.file.size):E("fileUploader.uploaded"),he=Ne(o),de=_?t.jsx("button",{type:"button",className:r.tileAction,"aria-label":E("fileUploader.download",{name:T}),onClick:_,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"DocumentDownload",size:"sm"})}):null;return t.jsxs("div",{ref:G,style:X,className:L.clsx(r.tile,p&&r.grabbable,S&&r.entering,W&&r.dragging,N&&r.tileError),...$,...O,children:[l&&!J&&t.jsx(Ft.Skeleton,{variant:"rect",width:"100%",height:"100%",className:r.tileSkeleton}),l?he?t.jsxs(t.Fragment,{children:[t.jsx("video",{src:l,className:r.tileImg,muted:!0,playsInline:!0,preload:"metadata",draggable:!1,onLoadedData:()=>c(!0),onError:k}),t.jsx("span",{className:r.tilePlay,"aria-hidden":"true",children:t.jsx(M.Icon,{name:"Play",size:"lg"})})]}):t.jsx("img",{ref:g,src:l,alt:"",className:L.clsx(r.tileImg,!J&&r.tileImgPending),draggable:!1,onLoad:()=>c(!0),onError:k}):t.jsx("span",{className:r.tileFallback,"aria-hidden":"true",children:t.jsx(M.Icon,{name:"Document",size:"lg"})}),t.jsxs("div",{className:r.tileTop,children:[t.jsxs("span",{className:r.tileText,children:[t.jsxs("span",{className:r.name,title:T,children:[t.jsx("span",{className:r.nameBase,children:Z}),U&&t.jsx("span",{className:r.nameExt,children:U})]}),t.jsx("span",{className:L.clsx(r.tileMeta,N&&r.metaError),children:N??q})]}),!w&&t.jsx("button",{type:"button",className:r.tileRemove,"aria-label":E("fileUploader.remove",{name:T}),onClick:P,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Close",size:"sm"})})]}),(h||z||_||B)&&t.jsxs("div",{className:r.tileBottom,children:[h&&t.jsx("button",{type:"button",className:r.tileAction,"aria-label":E("fileUploader.crop",{name:T}),onClick:h,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Crop",size:"sm"})}),z&&t.jsx("button",{type:"button",className:r.tileAction,"aria-label":E("fileUploader.editAlt",{name:T}),onClick:z,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Text",size:"sm"})}),de,B&&t.jsx("button",{type:"button",className:L.clsx(r.tileAction,r.tileActionEnd),"aria-label":E("fileUploader.preview",{name:T}),onClick:B,onPointerDown:m=>m.stopPropagation(),children:t.jsx(M.Icon,{name:"Eye",size:"sm"})})]})]})}const Mo=d.forwardRef(function({multiple:o=!1,allowDrop:l=!0,allowReorder:p=!0,allowDownload:S=!0,allowPreview:w=!0,allowAltText:N=!0,altTextLocales:P,localizedAltText:h=!0,allowDuplicates:z=!1,disabled:_=!1,accept:B,maxFiles:i,maxFileSize:$,itemInsertLocation:O="end",value:G,defaultValue:Y,onChange:A,label:W,error:X,helperText:E,required:T=!1,fullWidth:Z=!0,name:U,id:J,onBlur:c,className:y,style:g,...k},q){var We;const he=d.useId(),de=J??he,m=`${de}-helper`,F=$!=null?Ro($):void 0,[ue,xe]=d.useState(null);d.useEffect(()=>{if(!ue)return;const e=window.setTimeout(()=>xe(null),4e3);return()=>window.clearTimeout(e)},[ue]);const ee=zt.useFormContext(),Ee=!!(ee&&U),D=ee&&U?ee.field(U):void 0,ke=o?[]:null,Re=G!==void 0?G:Ee?ee.values[U]??ke:void 0,ze=Re!==void 0,[Xe,Ze]=d.useState(Y??ke),te=ze?Re:Xe,x=te==null?[]:Array.isArray(te)?te:[te],_e=X??(D==null?void 0:D.error)??!1,et=E??(D==null?void 0:D.helperText),be=ue??et,tt=!!ue||_e,fe=p&&o&&!_,Fe=d.useRef(new WeakMap),De=d.useRef(0),ot=(e,s)=>{if(e.file){let a=Fe.current.get(e.file);return a||(De.current+=1,a=`f${De.current}`,Fe.current.set(e.file,a)),a}return e.source?`s:${e.source}`:`i:${s}`},I=x.map((e,s)=>ot(e,s)),Ce=d.useRef(new Set),nt=new Set(I.filter(e=>!Ce.current.has(e)));d.useEffect(()=>{Ce.current=new Set(I)});const[st,Me]=d.useState(()=>new Set),rt=e=>Me(s=>s.has(e)?s:new Set(s).add(e)),[at,lt]=d.useState(()=>new Set),it=e=>lt(s=>s.has(e)?s:new Set(s).add(e)),pe=d.useRef(new Map),ge=e=>{if(e.file){const s=e.file.type;if(!s.startsWith("image/")&&!s.startsWith("video/")||!Je()||at.has(e.file))return null;let a=pe.current.get(e.file);return a||(a=URL.createObjectURL(e.file),pe.current.set(e.file,a)),a}return e.source&&!st.has(e.source)?e.source:null},[C,Pe]=d.useState(null);d.useEffect(()=>{const e=pe.current,s=new Set(x.map(u=>u.file).filter(Boolean)),a=new Set(x.filter(u=>!u.file&&u.source).map(u=>u.source));for(const[u,f]of e)!s.has(u)&&f!==(C==null?void 0:C.url)&&(URL.revokeObjectURL(f),e.delete(u));Me(u=>{if(u.size===0)return u;const f=new Set([...u].filter(v=>a.has(v)));return f.size===u.size?u:f})},[te,C]),d.useEffect(()=>{const e=pe.current;return()=>{for(const s of e.values())URL.revokeObjectURL(s);e.clear()}},[]);const ct=e=>e.map((s,a)=>s.sortIndex===a?s:{...s,sortIndex:a}),oe=e=>{const s=ct(e),a=o?s:s[0]??null;ze||Ze(a),Ee&&ee.setValue(U,a),A==null||A(a)},ye=()=>D==null?void 0:D.onBlur({}),b=ce.useT(),dt=ce.useLocales(),qe=P??dt,ut=h&&qe.length>0?qe:[{code:""}],[ne,ve]=d.useState(null),[Le,Be]=d.useState("altText"),je=ne!=null?I.indexOf(ne):-1,R=je!==-1?x[je]:null,ft=e=>{Be("crop"),ve(I[e]??null)},pt=e=>{Be("altText"),ve(I[e]??null)},Se=()=>ve(null),gt=e=>{const s=ge(e);if(!s)return;const a=e.file?e.file.type==="image/svg+xml":/^data:image\/svg/i.test(e.source??"")||/\.svg(?:[?#]|$)/i.test(e.source??"");Pe({url:s,isVideo:Ne(e),isSvg:a,name:me(e)})},mt=R?h?R.altText&&typeof R.altText=="object"?{...R.altText}:{}:{"":typeof R.altText=="string"?R.altText:""}:{},ht=({draft:e,croppedFile:s})=>{if(je===-1)return Se();oe(x.map((a,u)=>{if(I[u]!==ne)return a;const f={...a};if(e!==void 0)if(h){const v=Object.fromEntries(Object.entries(e).map(([H,j])=>[H,j.trim()]).filter(([,H])=>H!==""));f.altText=Object.keys(v).length>0?v:void 0}else f.altText=(e[""]??"").trim()||void 0;return s&&(f.file=s,f.source=""),f})),Se()},xt=(e,s=[])=>{const a=s.filter(j=>j.errors.some(K=>K.code==="file-invalid-type")),u=s.filter(j=>j.errors.some(K=>K.code==="file-too-large"));a.length>0&&Ve.toast.error(a.length===1?b("fileUploader.wrongTypeOne",{name:a[0].file.name}):b("fileUploader.wrongTypeMany",{count:a.length})),u.length>0&&F!=null&&Ve.toast.error(u.length===1?b("fileUploader.tooLargeOne",{name:u[0].file.name,size:le(F)}):b("fileUploader.tooLargeMany",{count:u.length,size:le(F)}));const f=[];let v=e;if(o&&!z){const j=new Set(x.map(zo)),K=[];for(const He of v){const Ke=Qe(He);j.has(Ke)||(j.add(Ke),K.push(He))}K.length<v.length&&f.push(b("fileUploader.duplicate")),v=K}if(o&&i!=null){const j=Math.max(0,i-x.length);v.length>j&&(v=v.slice(0,j),f.push(i===1?b("fileUploader.hintUpToOne",{count:i}):b("fileUploader.hintUpToMany",{count:i})))}if(xe(f.length>0?f.join(" · "):null),v.length===0)return;const H=v.map(j=>({file:j,source:"",sortIndex:0}));if(!o){oe([H[0]]);return}oe(O==="start"?[...H,...x]:[...x,...H])},_t=e=>{xe(null),oe(x.filter((s,a)=>a!==e)),ye()},[bt,Te]=kt.useAutoAnimate(ko),$e=()=>{typeof requestAnimationFrame=="function"?requestAnimationFrame(()=>Te(!0)):Te(!0)},yt=()=>Te(!1),vt=()=>$e(),jt=e=>{const{active:s,over:a}=e;if(a&&s.id!==a.id){const u=I.indexOf(String(s.id)),f=I.indexOf(String(a.id));u!==-1&&f!==-1&&oe(ae.arrayMove(x,u,f))}$e()},St=V.useSensors(V.useSensor(V.PointerSensor,{activationConstraint:{distance:5}}),V.useSensor(V.KeyboardSensor,{coordinateGetter:ae.sortableKeyboardCoordinates})),se=d.useRef(!1),{getRootProps:Tt,getInputProps:Ut,isDragActive:It}=Rt.useDropzone({multiple:o,accept:B,maxSize:F,disabled:_,noKeyboard:!1,noDrag:!l,onFileDialogOpen:()=>{se.current=!0},onFileDialogCancel:()=>{se.current=!1,ye()},onDrop:(e,s)=>{se.current=!1,xt(e,s)}}),Oe=o||x.length===0,Ue=[];o&&i!=null&&Ue.push(i===1?b("fileUploader.hintUpToOne",{count:i}):b("fileUploader.hintUpToMany",{count:i})),F!=null&&Ue.push(b("fileUploader.hintMax",{size:le(F)}));const Ae=Ue.join(" · "),wt=l?t.jsxs(t.Fragment,{children:[t.jsx("span",{className:r.accent,children:b("fileUploader.choose")})," ",b("fileUploader.dropSuffix")]}):t.jsx("span",{className:r.accent,children:b("fileUploader.choose")}),Nt=e=>{if(c==null||c(e),!e.currentTarget.contains(e.relatedTarget)&&ne==null){if(se.current){se.current=!1;return}ye()}};return t.jsxs("div",{ref:q,id:de,className:L.clsx(r.root,Z&&r.fullWidth,_e&&r.error,_&&r.disabled,y),style:g,"aria-invalid":_e||void 0,"aria-describedby":be!=null?m:void 0,onBlur:Nt,...k,...U?{name:U,tabIndex:-1}:{},children:[W!=null&&t.jsxs("label",{className:Ie.fieldStyles.label,children:[t.jsx(ie.Typography,{as:"span",variant:"bodySmall",color:"muted",children:W}),T&&t.jsx("span",{className:Ie.fieldStyles.required,"aria-hidden":"true",children:"*"})]}),Oe&&t.jsxs("div",{...Tt({className:L.clsx(r.dropzone,It&&r.dropping)}),children:[t.jsx("input",{...Ut()}),t.jsx("span",{className:r.dropIcon,"aria-hidden":"true",children:t.jsx(M.Icon,{name:"DocumentUpload",size:"lg"})}),t.jsxs("span",{className:r.dropText,children:[t.jsx("span",{className:r.prompt,children:wt}),Ae&&t.jsx("span",{className:r.hint,children:Ae})]})]}),t.jsx(V.DndContext,{sensors:St,collisionDetection:V.closestCenter,onDragStart:fe?yt:void 0,onDragEnd:fe?jt:void 0,onDragCancel:fe?vt:void 0,children:t.jsx(ae.SortableContext,{items:I,strategy:ae.rectSortingStrategy,children:t.jsx("div",{ref:bt,className:L.clsx(r.list,Oe&&x.length>0&&r.populated),children:x.map((e,s)=>t.jsx(Co,{id:I[s],item:e,preview:ge(e),sortable:fe&&x.length>1,entering:nt.has(I[s]),disabled:_,error:e.file&&F!=null&&e.file.size>F?b("fileUploader.exceedsLimit",{size:le(F)}):void 0,onRemove:()=>_t(s),onCrop:N&&!_&&we(e)?()=>ft(s):void 0,onAltText:N&&!_&&we(e)?()=>pt(s):void 0,onDownload:S&&!_?()=>Fo(e):void 0,onView:w&&!_&&ge(e)!=null&&(we(e)||Ne(e))?()=>gt(e):void 0,onPreviewError:e.file?()=>it(e.file):e.source?()=>rt(e.source):void 0},I[s]))})})}),be!=null&&t.jsx(ie.Typography,{as:"span",id:m,variant:"bodySmall",color:tt?"error":"muted",className:Ie.fieldStyles.helper,role:"status","aria-live":"polite",children:be}),R&&t.jsx(Ot,{mode:Le,name:me(R),imageUrl:ge(R),mimeType:((We=R.file)==null?void 0:We.type)||"image/png",editLocales:ut,initialDraft:mt,onClose:Se,onSave:ht},`${ne}:${Le}`),C&&t.jsx(Vt,{url:C.url,isVideo:C.isVideo,isSvg:C.isSvg,name:C.name,onClose:()=>Pe(null)})]})});exports.FileUploader=Mo;
|
|
2
|
+
//# sourceMappingURL=FileUploader-DWM8WrY6.cjs.map
|