@iclips/ui 1.4.12 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/MIGRATION-v2.md +214 -0
- package/README.md +106 -0
- package/dist/alert-theme.css +94 -0
- package/dist/assets/illustrations/announcements.png.cjs +2 -0
- package/dist/assets/illustrations/announcements.png.cjs.map +1 -0
- package/dist/assets/illustrations/announcements.png.js +5 -0
- package/dist/assets/illustrations/announcements.png.js.map +1 -0
- package/dist/assets/illustrations/checklist-approved.png.cjs +2 -0
- package/dist/assets/illustrations/checklist-approved.png.cjs.map +1 -0
- package/dist/assets/illustrations/checklist-approved.png.js +5 -0
- package/dist/assets/illustrations/checklist-approved.png.js.map +1 -0
- package/dist/assets/illustrations/client-profile.png.cjs +2 -0
- package/dist/assets/illustrations/client-profile.png.cjs.map +1 -0
- package/dist/assets/illustrations/client-profile.png.js +5 -0
- package/dist/assets/illustrations/client-profile.png.js.map +1 -0
- package/dist/assets/illustrations/contract-agreement.png.cjs +2 -0
- package/dist/assets/illustrations/contract-agreement.png.cjs.map +1 -0
- package/dist/assets/illustrations/contract-agreement.png.js +5 -0
- package/dist/assets/illustrations/contract-agreement.png.js.map +1 -0
- package/dist/assets/illustrations/create-record.png.cjs +2 -0
- package/dist/assets/illustrations/create-record.png.cjs.map +1 -0
- package/dist/assets/illustrations/create-record.png.js +5 -0
- package/dist/assets/illustrations/create-record.png.js.map +1 -0
- package/dist/assets/illustrations/cta-action.png.cjs +2 -0
- package/dist/assets/illustrations/cta-action.png.cjs.map +1 -0
- package/dist/assets/illustrations/cta-action.png.js +5 -0
- package/dist/assets/illustrations/cta-action.png.js.map +1 -0
- package/dist/assets/illustrations/draft-document.png.cjs +2 -0
- package/dist/assets/illustrations/draft-document.png.cjs.map +1 -0
- package/dist/assets/illustrations/draft-document.png.js +5 -0
- package/dist/assets/illustrations/draft-document.png.js.map +1 -0
- package/dist/assets/illustrations/edit-company.png.cjs +2 -0
- package/dist/assets/illustrations/edit-company.png.cjs.map +1 -0
- package/dist/assets/illustrations/edit-company.png.js +5 -0
- package/dist/assets/illustrations/edit-company.png.js.map +1 -0
- package/dist/assets/illustrations/edit-document.png.cjs +2 -0
- package/dist/assets/illustrations/edit-document.png.cjs.map +1 -0
- package/dist/assets/illustrations/edit-document.png.js +5 -0
- package/dist/assets/illustrations/edit-document.png.js.map +1 -0
- package/dist/assets/illustrations/empty-no-results.png.cjs +2 -0
- package/dist/assets/illustrations/empty-no-results.png.cjs.map +1 -0
- package/dist/assets/illustrations/empty-no-results.png.js +5 -0
- package/dist/assets/illustrations/empty-no-results.png.js.map +1 -0
- package/dist/assets/illustrations/empty-not-found.png.cjs +2 -0
- package/dist/assets/illustrations/empty-not-found.png.cjs.map +1 -0
- package/dist/assets/illustrations/empty-not-found.png.js +5 -0
- package/dist/assets/illustrations/empty-not-found.png.js.map +1 -0
- package/dist/assets/illustrations/empty-task-approved.png.cjs +2 -0
- package/dist/assets/illustrations/empty-task-approved.png.cjs.map +1 -0
- package/dist/assets/illustrations/empty-task-approved.png.js +5 -0
- package/dist/assets/illustrations/empty-task-approved.png.js.map +1 -0
- package/dist/assets/illustrations/empty-workflow-status.png.cjs +2 -0
- package/dist/assets/illustrations/empty-workflow-status.png.cjs.map +1 -0
- package/dist/assets/illustrations/empty-workflow-status.png.js +5 -0
- package/dist/assets/illustrations/empty-workflow-status.png.js.map +1 -0
- package/dist/assets/illustrations/integrations.png.cjs +2 -0
- package/dist/assets/illustrations/integrations.png.cjs.map +1 -0
- package/dist/assets/illustrations/integrations.png.js +5 -0
- package/dist/assets/illustrations/integrations.png.js.map +1 -0
- package/dist/assets/illustrations/onboarding-tips.png.cjs +2 -0
- package/dist/assets/illustrations/onboarding-tips.png.cjs.map +1 -0
- package/dist/assets/illustrations/onboarding-tips.png.js +5 -0
- package/dist/assets/illustrations/onboarding-tips.png.js.map +1 -0
- package/dist/assets/illustrations/scheduled-tasks.png.cjs +2 -0
- package/dist/assets/illustrations/scheduled-tasks.png.cjs.map +1 -0
- package/dist/assets/illustrations/scheduled-tasks.png.js +5 -0
- package/dist/assets/illustrations/scheduled-tasks.png.js.map +1 -0
- package/dist/assets/illustrations/search-documents.png.cjs +2 -0
- package/dist/assets/illustrations/search-documents.png.cjs.map +1 -0
- package/dist/assets/illustrations/search-documents.png.js +5 -0
- package/dist/assets/illustrations/search-documents.png.js.map +1 -0
- package/dist/assets/illustrations/success-checkmark.png.cjs +2 -0
- package/dist/assets/illustrations/success-checkmark.png.cjs.map +1 -0
- package/dist/assets/illustrations/success-checkmark.png.js +5 -0
- package/dist/assets/illustrations/success-checkmark.png.js.map +1 -0
- package/dist/components/ui/brand-colors.cjs +2 -0
- package/dist/components/ui/brand-colors.cjs.map +1 -0
- package/dist/components/ui/brand-colors.js +8 -0
- package/dist/components/ui/brand-colors.js.map +1 -0
- package/dist/components/ui/charts/chart.cjs +8 -0
- package/dist/components/ui/charts/chart.cjs.map +1 -0
- package/dist/components/ui/charts/chart.js +214 -0
- package/dist/components/ui/charts/chart.js.map +1 -0
- package/dist/components/ui/charts/donut-chart.cjs +2 -0
- package/dist/components/ui/charts/donut-chart.cjs.map +1 -0
- package/dist/components/ui/charts/donut-chart.js +285 -0
- package/dist/components/ui/charts/donut-chart.js.map +1 -0
- package/dist/components/ui/charts/kpi-card.cjs +2 -0
- package/dist/components/ui/charts/kpi-card.cjs.map +1 -0
- package/dist/components/ui/charts/kpi-card.js +71 -0
- package/dist/components/ui/charts/kpi-card.js.map +1 -0
- package/dist/components/ui/data/advanced-data-table.cjs +2 -0
- package/dist/components/ui/data/advanced-data-table.cjs.map +1 -0
- package/dist/components/ui/data/advanced-data-table.js +69 -0
- package/dist/components/ui/data/advanced-data-table.js.map +1 -0
- package/dist/components/ui/data/comment-system.cjs +2 -0
- package/dist/components/ui/data/comment-system.cjs.map +1 -0
- package/dist/components/ui/data/comment-system.js +492 -0
- package/dist/components/ui/data/comment-system.js.map +1 -0
- package/dist/components/ui/data/data-table-empty-state.cjs +2 -0
- package/dist/components/ui/data/data-table-empty-state.cjs.map +1 -0
- package/dist/components/ui/data/data-table-empty-state.js +40 -0
- package/dist/components/ui/data/data-table-empty-state.js.map +1 -0
- package/dist/components/ui/data/data-table-toolbar.cjs +2 -0
- package/dist/components/ui/data/data-table-toolbar.cjs.map +1 -0
- package/dist/components/ui/data/data-table-toolbar.js +85 -0
- package/dist/components/ui/data/data-table-toolbar.js.map +1 -0
- package/dist/components/ui/data/data-table.cjs +2 -0
- package/dist/components/ui/data/data-table.cjs.map +1 -0
- package/dist/components/ui/data/data-table.js +181 -0
- package/dist/components/ui/data/data-table.js.map +1 -0
- package/dist/components/ui/data/document-editor.cjs +2 -0
- package/dist/components/ui/data/document-editor.cjs.map +1 -0
- package/dist/components/ui/data/document-editor.js +158 -0
- package/dist/components/ui/data/document-editor.js.map +1 -0
- package/dist/components/ui/data/editorial-calendar.cjs +2 -0
- package/dist/components/ui/data/editorial-calendar.cjs.map +1 -0
- package/dist/components/ui/data/editorial-calendar.js +840 -0
- package/dist/components/ui/data/editorial-calendar.js.map +1 -0
- package/dist/components/ui/data/filter-bar.cjs +2 -0
- package/dist/components/ui/data/filter-bar.cjs.map +1 -0
- package/dist/components/ui/data/filter-bar.js +60 -0
- package/dist/components/ui/data/filter-bar.js.map +1 -0
- package/dist/components/ui/data/filter-builder.cjs +2 -0
- package/dist/components/ui/data/filter-builder.cjs.map +1 -0
- package/dist/components/ui/data/filter-builder.js +378 -0
- package/dist/components/ui/data/filter-builder.js.map +1 -0
- package/dist/components/ui/data/filter-chip.cjs +2 -0
- package/dist/components/ui/data/filter-chip.cjs.map +1 -0
- package/dist/components/ui/data/filter-chip.js +39 -0
- package/dist/components/ui/data/filter-chip.js.map +1 -0
- package/dist/components/ui/data/mention-list.cjs +2 -0
- package/dist/components/ui/data/mention-list.cjs.map +1 -0
- package/dist/components/ui/data/mention-list.js +46 -0
- package/dist/components/ui/data/mention-list.js.map +1 -0
- package/dist/components/ui/data/table-pagination.cjs +2 -0
- package/dist/components/ui/data/table-pagination.cjs.map +1 -0
- package/dist/components/ui/data/table-pagination.js +176 -0
- package/dist/components/ui/data/table-pagination.js.map +1 -0
- package/dist/components/ui/data/table-types.cjs +2 -0
- package/dist/components/ui/data/table-types.cjs.map +1 -0
- package/dist/components/ui/data/table-types.js +14 -0
- package/dist/components/ui/data/table-types.js.map +1 -0
- package/dist/components/ui/data/table.cjs +2 -0
- package/dist/components/ui/data/table.cjs.map +1 -0
- package/dist/components/ui/data/table.js +130 -0
- package/dist/components/ui/data/table.js.map +1 -0
- package/dist/components/ui/feedback/alert.cjs +2 -0
- package/dist/components/ui/feedback/alert.cjs.map +1 -0
- package/dist/components/ui/feedback/alert.js +67 -0
- package/dist/components/ui/feedback/alert.js.map +1 -0
- package/dist/components/ui/feedback/empty-state.cjs +2 -0
- package/dist/components/ui/feedback/empty-state.cjs.map +1 -0
- package/dist/components/ui/feedback/empty-state.js +78 -0
- package/dist/components/ui/feedback/empty-state.js.map +1 -0
- package/dist/components/ui/feedback/illustrations.cjs +2 -0
- package/dist/components/ui/feedback/illustrations.cjs.map +1 -0
- package/dist/components/ui/feedback/illustrations.js +157 -0
- package/dist/components/ui/feedback/illustrations.js.map +1 -0
- package/dist/components/ui/feedback/toast.cjs +2 -0
- package/dist/components/ui/feedback/toast.cjs.map +1 -0
- package/dist/components/ui/feedback/toast.js +38 -0
- package/dist/components/ui/feedback/toast.js.map +1 -0
- package/dist/components/ui/forms/calendar.cjs +2 -0
- package/dist/components/ui/forms/calendar.cjs.map +1 -0
- package/dist/components/ui/forms/calendar.js +65 -0
- package/dist/components/ui/forms/calendar.js.map +1 -0
- package/dist/components/ui/forms/checkbox.cjs +2 -0
- package/dist/components/ui/forms/checkbox.cjs.map +1 -0
- package/dist/components/ui/forms/checkbox.js +31 -0
- package/dist/components/ui/forms/checkbox.js.map +1 -0
- package/dist/components/ui/forms/color-picker.cjs +2 -0
- package/dist/components/ui/forms/color-picker.cjs.map +1 -0
- package/dist/components/ui/forms/color-picker.js +151 -0
- package/dist/components/ui/forms/color-picker.js.map +1 -0
- package/dist/components/ui/forms/combobox.cjs +2 -0
- package/dist/components/ui/forms/combobox.cjs.map +1 -0
- package/dist/components/ui/forms/combobox.js +208 -0
- package/dist/components/ui/forms/combobox.js.map +1 -0
- package/dist/components/ui/forms/currency-input.cjs +2 -0
- package/dist/components/ui/forms/currency-input.cjs.map +1 -0
- package/dist/components/ui/forms/currency-input.js +81 -0
- package/dist/components/ui/forms/currency-input.js.map +1 -0
- package/dist/components/ui/forms/date-picker.cjs +2 -0
- package/dist/components/ui/forms/date-picker.cjs.map +1 -0
- package/dist/components/ui/forms/date-picker.js +197 -0
- package/dist/components/ui/forms/date-picker.js.map +1 -0
- package/dist/components/ui/forms/date-range-picker.cjs +2 -0
- package/dist/components/ui/forms/date-range-picker.cjs.map +1 -0
- package/dist/components/ui/forms/date-range-picker.js +303 -0
- package/dist/components/ui/forms/date-range-picker.js.map +1 -0
- package/dist/components/ui/forms/editable-badge.cjs +2 -0
- package/dist/components/ui/forms/editable-badge.cjs.map +1 -0
- package/dist/components/ui/forms/editable-badge.js +137 -0
- package/dist/components/ui/forms/editable-badge.js.map +1 -0
- package/dist/components/ui/forms/file-attachment-list.cjs +2 -0
- package/dist/components/ui/forms/file-attachment-list.cjs.map +1 -0
- package/dist/components/ui/forms/file-attachment-list.js +235 -0
- package/dist/components/ui/forms/file-attachment-list.js.map +1 -0
- package/dist/components/ui/forms/file-upload-zone.cjs +3 -0
- package/dist/components/ui/forms/file-upload-zone.cjs.map +1 -0
- package/dist/components/ui/forms/file-upload-zone.js +142 -0
- package/dist/components/ui/forms/file-upload-zone.js.map +1 -0
- package/dist/components/ui/forms/form.cjs +2 -0
- package/dist/components/ui/forms/form.cjs.map +1 -0
- package/dist/components/ui/forms/form.js +109 -0
- package/dist/components/ui/forms/form.js.map +1 -0
- package/dist/components/ui/forms/input-group.cjs +2 -0
- package/dist/components/ui/forms/input-group.cjs.map +1 -0
- package/dist/components/ui/forms/input-group.js +131 -0
- package/dist/components/ui/forms/input-group.js.map +1 -0
- package/dist/components/ui/forms/input-otp.cjs +2 -0
- package/dist/components/ui/forms/input-otp.cjs.map +1 -0
- package/dist/components/ui/forms/input-otp.js +63 -0
- package/dist/components/ui/forms/input-otp.js.map +1 -0
- package/dist/components/ui/forms/input-validation.cjs +2 -0
- package/dist/components/ui/forms/input-validation.cjs.map +1 -0
- package/dist/components/ui/forms/input-validation.js +55 -0
- package/dist/components/ui/forms/input-validation.js.map +1 -0
- package/dist/components/ui/forms/input.cjs +2 -0
- package/dist/components/ui/forms/input.cjs.map +1 -0
- package/dist/components/ui/forms/input.js +26 -0
- package/dist/components/ui/forms/input.js.map +1 -0
- package/dist/components/ui/forms/month-range-picker.cjs +2 -0
- package/dist/components/ui/forms/month-range-picker.cjs.map +1 -0
- package/dist/components/ui/forms/month-range-picker.js +261 -0
- package/dist/components/ui/forms/month-range-picker.js.map +1 -0
- package/dist/components/ui/forms/multi-select.cjs +2 -0
- package/dist/components/ui/forms/multi-select.cjs.map +1 -0
- package/dist/components/ui/forms/multi-select.js +251 -0
- package/dist/components/ui/forms/multi-select.js.map +1 -0
- package/dist/components/ui/forms/number-input.cjs +2 -0
- package/dist/components/ui/forms/number-input.cjs.map +1 -0
- package/dist/components/ui/forms/number-input.js +220 -0
- package/dist/components/ui/forms/number-input.js.map +1 -0
- package/dist/components/ui/forms/password-input.cjs +2 -0
- package/dist/components/ui/forms/password-input.cjs.map +1 -0
- package/dist/components/ui/forms/password-input.js +43 -0
- package/dist/components/ui/forms/password-input.js.map +1 -0
- package/dist/components/ui/forms/radio-group.cjs +2 -0
- package/dist/components/ui/forms/radio-group.cjs.map +1 -0
- package/dist/components/ui/forms/radio-group.js +41 -0
- package/dist/components/ui/forms/radio-group.js.map +1 -0
- package/dist/components/ui/forms/select.cjs +2 -0
- package/dist/components/ui/forms/select.cjs.map +1 -0
- package/dist/components/ui/forms/select.js +140 -0
- package/dist/components/ui/forms/select.js.map +1 -0
- package/dist/components/ui/forms/slider.cjs +2 -0
- package/dist/components/ui/forms/slider.cjs.map +1 -0
- package/dist/components/ui/forms/slider.js +62 -0
- package/dist/components/ui/forms/slider.js.map +1 -0
- package/dist/components/ui/forms/social-button.cjs +2 -0
- package/dist/components/ui/forms/social-button.cjs.map +1 -0
- package/dist/components/ui/forms/social-button.js +86 -0
- package/dist/components/ui/forms/social-button.js.map +1 -0
- package/dist/components/ui/forms/switch.cjs +2 -0
- package/dist/components/ui/forms/switch.cjs.map +1 -0
- package/dist/components/ui/forms/switch.js +31 -0
- package/dist/components/ui/forms/switch.js.map +1 -0
- package/dist/components/ui/forms/textarea.cjs +2 -0
- package/dist/components/ui/forms/textarea.cjs.map +1 -0
- package/dist/components/ui/forms/textarea.js +22 -0
- package/dist/components/ui/forms/textarea.js.map +1 -0
- package/dist/components/ui/forms/time-picker.cjs +2 -0
- package/dist/components/ui/forms/time-picker.cjs.map +1 -0
- package/dist/components/ui/forms/time-picker.js +195 -0
- package/dist/components/ui/forms/time-picker.js.map +1 -0
- package/dist/components/ui/forms/toggle-group.cjs +2 -0
- package/dist/components/ui/forms/toggle-group.cjs.map +1 -0
- package/dist/components/ui/forms/toggle-group.js +53 -0
- package/dist/components/ui/forms/toggle-group.js.map +1 -0
- package/dist/components/ui/forms/toggle.cjs +2 -0
- package/dist/components/ui/forms/toggle.cjs.map +1 -0
- package/dist/components/ui/forms/toggle.js +40 -0
- package/dist/components/ui/forms/toggle.js.map +1 -0
- package/dist/components/ui/layout/accordion.cjs +2 -0
- package/dist/components/ui/layout/accordion.cjs.map +1 -0
- package/dist/components/ui/layout/accordion.js +53 -0
- package/dist/components/ui/layout/accordion.js.map +1 -0
- package/dist/components/ui/layout/auth-layout.cjs +2 -0
- package/dist/components/ui/layout/auth-layout.cjs.map +1 -0
- package/dist/components/ui/layout/auth-layout.js +74 -0
- package/dist/components/ui/layout/auth-layout.js.map +1 -0
- package/dist/components/ui/layout/card.cjs +2 -0
- package/dist/components/ui/layout/card.cjs.map +1 -0
- package/dist/components/ui/layout/card.js +104 -0
- package/dist/components/ui/layout/card.js.map +1 -0
- package/dist/components/ui/layout/carousel.cjs +2 -0
- package/dist/components/ui/layout/carousel.cjs.map +1 -0
- package/dist/components/ui/layout/carousel.js +189 -0
- package/dist/components/ui/layout/carousel.js.map +1 -0
- package/dist/components/ui/layout/collapsible.cjs +2 -0
- package/dist/components/ui/layout/collapsible.cjs.map +1 -0
- package/dist/components/ui/layout/collapsible.js +30 -0
- package/dist/components/ui/layout/collapsible.js.map +1 -0
- package/dist/components/ui/layout/page-header.cjs +2 -0
- package/dist/components/ui/layout/page-header.cjs.map +1 -0
- package/dist/components/ui/layout/page-header.js +81 -0
- package/dist/components/ui/layout/page-header.js.map +1 -0
- package/dist/components/ui/layout/resizable.cjs +2 -0
- package/dist/components/ui/layout/resizable.cjs.map +1 -0
- package/dist/components/ui/layout/resizable.js +45 -0
- package/dist/components/ui/layout/resizable.js.map +1 -0
- package/dist/components/ui/layout/scroll-area.cjs +2 -0
- package/dist/components/ui/layout/scroll-area.cjs.map +1 -0
- package/dist/components/ui/layout/scroll-area.js +56 -0
- package/dist/components/ui/layout/scroll-area.js.map +1 -0
- package/dist/components/ui/navigation/breadcrumb.cjs +2 -0
- package/dist/components/ui/navigation/breadcrumb.cjs.map +1 -0
- package/dist/components/ui/navigation/breadcrumb.js +94 -0
- package/dist/components/ui/navigation/breadcrumb.js.map +1 -0
- package/dist/components/ui/navigation/navigation-menu.cjs +2 -0
- package/dist/components/ui/navigation/navigation-menu.cjs.map +1 -0
- package/dist/components/ui/navigation/navigation-menu.js +144 -0
- package/dist/components/ui/navigation/navigation-menu.js.map +1 -0
- package/dist/components/ui/navigation/pagination.cjs +2 -0
- package/dist/components/ui/navigation/pagination.cjs.map +1 -0
- package/dist/components/ui/navigation/pagination.js +106 -0
- package/dist/components/ui/navigation/pagination.js.map +1 -0
- package/dist/components/ui/navigation/sidebar.cjs +2 -0
- package/dist/components/ui/navigation/sidebar.cjs.map +1 -0
- package/dist/components/ui/navigation/sidebar.js +579 -0
- package/dist/components/ui/navigation/sidebar.js.map +1 -0
- package/dist/components/ui/navigation/tabs.cjs +2 -0
- package/dist/components/ui/navigation/tabs.cjs.map +1 -0
- package/dist/components/ui/navigation/tabs.js +58 -0
- package/dist/components/ui/navigation/tabs.js.map +1 -0
- package/dist/components/ui/navigation/underline-tabs.cjs +2 -0
- package/dist/components/ui/navigation/underline-tabs.cjs.map +1 -0
- package/dist/components/ui/navigation/underline-tabs.js +109 -0
- package/dist/components/ui/navigation/underline-tabs.js.map +1 -0
- package/dist/components/ui/overlays/alert-dialog.cjs +2 -0
- package/dist/components/ui/overlays/alert-dialog.cjs.map +1 -0
- package/dist/components/ui/overlays/alert-dialog.js +135 -0
- package/dist/components/ui/overlays/alert-dialog.js.map +1 -0
- package/dist/components/ui/overlays/command.cjs +2 -0
- package/dist/components/ui/overlays/command.cjs.map +1 -0
- package/dist/components/ui/overlays/command.js +143 -0
- package/dist/components/ui/overlays/command.js.map +1 -0
- package/dist/components/ui/overlays/context-menu.cjs +2 -0
- package/dist/components/ui/overlays/context-menu.cjs.map +1 -0
- package/dist/components/ui/overlays/context-menu.js +197 -0
- package/dist/components/ui/overlays/context-menu.js.map +1 -0
- package/dist/components/ui/overlays/dialog.cjs +2 -0
- package/dist/components/ui/overlays/dialog.cjs.map +1 -0
- package/dist/components/ui/overlays/dialog.js +112 -0
- package/dist/components/ui/overlays/dialog.js.map +1 -0
- package/dist/components/ui/overlays/drawer.cjs +2 -0
- package/dist/components/ui/overlays/drawer.cjs.map +1 -0
- package/dist/components/ui/overlays/drawer.js +109 -0
- package/dist/components/ui/overlays/drawer.js.map +1 -0
- package/dist/components/ui/overlays/dropdown-menu.cjs +2 -0
- package/dist/components/ui/overlays/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/overlays/dropdown-menu.js +198 -0
- package/dist/components/ui/overlays/dropdown-menu.js.map +1 -0
- package/dist/components/ui/overlays/hover-card.cjs +2 -0
- package/dist/components/ui/overlays/hover-card.cjs.map +1 -0
- package/dist/components/ui/overlays/hover-card.js +40 -0
- package/dist/components/ui/overlays/hover-card.js.map +1 -0
- package/dist/components/ui/overlays/menubar.cjs +2 -0
- package/dist/components/ui/overlays/menubar.cjs.map +1 -0
- package/dist/components/ui/overlays/menubar.js +213 -0
- package/dist/components/ui/overlays/menubar.js.map +1 -0
- package/dist/components/ui/overlays/popover.cjs +2 -0
- package/dist/components/ui/overlays/popover.cjs.map +1 -0
- package/dist/components/ui/overlays/popover.js +36 -0
- package/dist/components/ui/overlays/popover.js.map +1 -0
- package/dist/components/ui/overlays/sheet.cjs +2 -0
- package/dist/components/ui/overlays/sheet.cjs.map +1 -0
- package/dist/components/ui/overlays/sheet.js +109 -0
- package/dist/components/ui/overlays/sheet.js.map +1 -0
- package/dist/components/ui/overlays/side-panel.cjs +16 -0
- package/dist/components/ui/overlays/side-panel.cjs.map +1 -0
- package/dist/components/ui/overlays/side-panel.js +117 -0
- package/dist/components/ui/overlays/side-panel.js.map +1 -0
- package/dist/components/ui/overlays/tooltip.cjs +2 -0
- package/dist/components/ui/overlays/tooltip.cjs.map +1 -0
- package/dist/components/ui/overlays/tooltip.js +50 -0
- package/dist/components/ui/overlays/tooltip.js.map +1 -0
- package/dist/components/ui/primitives/aspect-ratio.cjs +2 -0
- package/dist/components/ui/primitives/aspect-ratio.cjs.map +1 -0
- package/dist/components/ui/primitives/aspect-ratio.js +10 -0
- package/dist/components/ui/primitives/aspect-ratio.js.map +1 -0
- package/dist/components/ui/primitives/avatar.cjs +2 -0
- package/dist/components/ui/primitives/avatar.cjs.map +1 -0
- package/dist/components/ui/primitives/avatar.js +63 -0
- package/dist/components/ui/primitives/avatar.js.map +1 -0
- package/dist/components/ui/primitives/badge.cjs +2 -0
- package/dist/components/ui/primitives/badge.cjs.map +1 -0
- package/dist/components/ui/primitives/badge.js +50 -0
- package/dist/components/ui/primitives/badge.js.map +1 -0
- package/dist/components/ui/primitives/brand-logo.cjs +2 -0
- package/dist/components/ui/primitives/brand-logo.cjs.map +1 -0
- package/dist/components/ui/primitives/brand-logo.js +74 -0
- package/dist/components/ui/primitives/brand-logo.js.map +1 -0
- package/dist/components/ui/primitives/brand-logo.negative-paths.cjs +2 -0
- package/dist/components/ui/primitives/brand-logo.negative-paths.cjs.map +1 -0
- package/dist/components/ui/primitives/brand-logo.negative-paths.js +15 -0
- package/dist/components/ui/primitives/brand-logo.negative-paths.js.map +1 -0
- package/dist/components/ui/primitives/brand-logo.positive-paths.cjs +2 -0
- package/dist/components/ui/primitives/brand-logo.positive-paths.cjs.map +1 -0
- package/dist/components/ui/primitives/brand-logo.positive-paths.js +15 -0
- package/dist/components/ui/primitives/brand-logo.positive-paths.js.map +1 -0
- package/dist/components/ui/primitives/brand-logo.symbol-paths.cjs +2 -0
- package/dist/components/ui/primitives/brand-logo.symbol-paths.cjs.map +1 -0
- package/dist/components/ui/primitives/brand-logo.symbol-paths.js +8 -0
- package/dist/components/ui/primitives/brand-logo.symbol-paths.js.map +1 -0
- package/dist/components/ui/primitives/button.cjs +2 -0
- package/dist/components/ui/primitives/button.cjs.map +1 -0
- package/dist/components/ui/primitives/button.js +52 -0
- package/dist/components/ui/primitives/button.js.map +1 -0
- package/dist/components/ui/primitives/label.cjs +2 -0
- package/dist/components/ui/primitives/label.cjs.map +1 -0
- package/dist/components/ui/primitives/label.js +22 -0
- package/dist/components/ui/primitives/label.js.map +1 -0
- package/dist/components/ui/primitives/progress.cjs +2 -0
- package/dist/components/ui/primitives/progress.cjs.map +1 -0
- package/dist/components/ui/primitives/progress.js +30 -0
- package/dist/components/ui/primitives/progress.js.map +1 -0
- package/dist/components/ui/primitives/separator.cjs +2 -0
- package/dist/components/ui/primitives/separator.cjs.map +1 -0
- package/dist/components/ui/primitives/separator.js +26 -0
- package/dist/components/ui/primitives/separator.js.map +1 -0
- package/dist/components/ui/primitives/skeleton.cjs +2 -0
- package/dist/components/ui/primitives/skeleton.cjs.map +1 -0
- package/dist/components/ui/primitives/skeleton.js +31 -0
- package/dist/components/ui/primitives/skeleton.js.map +1 -0
- package/dist/components/ui/utils.cjs +2 -0
- package/dist/components/ui/utils.cjs.map +1 -0
- package/dist/components/ui/utils.js +20 -0
- package/dist/components/ui/utils.js.map +1 -0
- package/dist/editor.cjs +2 -0
- package/dist/editor.cjs.map +1 -0
- package/dist/editor.d.cts +114 -0
- package/dist/editor.d.ts +114 -0
- package/dist/editor.js +12 -0
- package/dist/editor.js.map +1 -0
- package/dist/hooks/use-data-table-filters.cjs +2 -0
- package/dist/hooks/use-data-table-filters.cjs.map +1 -0
- package/dist/hooks/use-data-table-filters.js +118 -0
- package/dist/hooks/use-data-table-filters.js.map +1 -0
- package/dist/hooks/use-data-table.cjs +2 -0
- package/dist/hooks/use-data-table.cjs.map +1 -0
- package/dist/hooks/use-data-table.js +84 -0
- package/dist/hooks/use-data-table.js.map +1 -0
- package/dist/hooks/use-mobile.cjs +2 -0
- package/dist/hooks/use-mobile.cjs.map +1 -0
- package/dist/hooks/use-mobile.js +17 -0
- package/dist/hooks/use-mobile.js.map +1 -0
- package/dist/hooks/use-table-pagination.cjs +2 -0
- package/dist/hooks/use-table-pagination.cjs.map +1 -0
- package/dist/hooks/use-table-pagination.js +44 -0
- package/dist/hooks/use-table-pagination.js.map +1 -0
- package/dist/index.cjs +1 -242
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.cts +2918 -0
- package/dist/index.d.ts +2918 -149
- package/dist/index.js +375 -63146
- package/dist/index.js.map +1 -1
- package/dist/preset.css +352 -0
- package/dist/toast-theme.css +100 -0
- package/dist/tokens.css +471 -0
- package/package.json +144 -45
- package/scripts/codemod-v2-renames.mjs +101 -0
- package/scripts/codemod-v2-toast.mjs +84 -0
- package/dist/components/figma/ImageWithFallback.d.ts +0 -3
- package/dist/components/figma/ImageWithFallback.d.ts.map +0 -1
- package/dist/components/print-templates/ContractTemplate.d.ts +0 -89
- package/dist/components/print-templates/ContractTemplate.d.ts.map +0 -1
- package/dist/components/print-templates/ProposalTemplate.d.ts +0 -41
- package/dist/components/print-templates/ProposalTemplate.d.ts.map +0 -1
- package/dist/components/print-templates/index.d.ts +0 -22
- package/dist/components/print-templates/index.d.ts.map +0 -1
- package/dist/components/print-templates/shared/PrintFooter.d.ts +0 -21
- package/dist/components/print-templates/shared/PrintFooter.d.ts.map +0 -1
- package/dist/components/print-templates/shared/PrintHeader.d.ts +0 -38
- package/dist/components/print-templates/shared/PrintHeader.d.ts.map +0 -1
- package/dist/components/print-templates/shared/PrintInfoGrid.d.ts +0 -22
- package/dist/components/print-templates/shared/PrintInfoGrid.d.ts.map +0 -1
- package/dist/components/print-templates/shared/PrintSection.d.ts +0 -29
- package/dist/components/print-templates/shared/PrintSection.d.ts.map +0 -1
- package/dist/components/print-templates/shared/PrintSignature.d.ts +0 -27
- package/dist/components/print-templates/shared/PrintSignature.d.ts.map +0 -1
- package/dist/components/print-templates/shared/PrintTable.d.ts +0 -44
- package/dist/components/print-templates/shared/PrintTable.d.ts.map +0 -1
- package/dist/components/timeline-demo.d.ts +0 -3
- package/dist/components/timeline-demo.d.ts.map +0 -1
- package/dist/components/ui/accordion.d.ts +0 -8
- package/dist/components/ui/accordion.d.ts.map +0 -1
- package/dist/components/ui/advanced-data-table.d.ts +0 -100
- package/dist/components/ui/advanced-data-table.d.ts.map +0 -1
- package/dist/components/ui/alert-dialog.d.ts +0 -15
- package/dist/components/ui/alert-dialog.d.ts.map +0 -1
- package/dist/components/ui/alert-toast.d.ts +0 -11
- package/dist/components/ui/alert-toast.d.ts.map +0 -1
- package/dist/components/ui/alert.d.ts +0 -10
- package/dist/components/ui/alert.d.ts.map +0 -1
- package/dist/components/ui/app-layout-primary-nav.d.ts +0 -30
- package/dist/components/ui/app-layout-primary-nav.d.ts.map +0 -1
- package/dist/components/ui/app-layout-secondary-nav.d.ts +0 -34
- package/dist/components/ui/app-layout-secondary-nav.d.ts.map +0 -1
- package/dist/components/ui/app-layout-user-menu.d.ts +0 -28
- package/dist/components/ui/app-layout-user-menu.d.ts.map +0 -1
- package/dist/components/ui/aspect-ratio.d.ts +0 -4
- package/dist/components/ui/aspect-ratio.d.ts.map +0 -1
- package/dist/components/ui/auth-layout.d.ts +0 -28
- package/dist/components/ui/auth-layout.d.ts.map +0 -1
- package/dist/components/ui/avatar.d.ts +0 -21
- package/dist/components/ui/avatar.d.ts.map +0 -1
- package/dist/components/ui/badge.d.ts +0 -18
- package/dist/components/ui/badge.d.ts.map +0 -1
- package/dist/components/ui/brand-logo.d.ts +0 -7
- package/dist/components/ui/brand-logo.d.ts.map +0 -1
- package/dist/components/ui/breadcrumb.d.ts +0 -12
- package/dist/components/ui/breadcrumb.d.ts.map +0 -1
- package/dist/components/ui/button.d.ts +0 -15
- package/dist/components/ui/button.d.ts.map +0 -1
- package/dist/components/ui/calendar.d.ts +0 -31
- package/dist/components/ui/calendar.d.ts.map +0 -1
- package/dist/components/ui/card.d.ts +0 -10
- package/dist/components/ui/card.d.ts.map +0 -1
- package/dist/components/ui/carousel.d.ts +0 -20
- package/dist/components/ui/carousel.d.ts.map +0 -1
- package/dist/components/ui/chart.d.ts +0 -45
- package/dist/components/ui/chart.d.ts.map +0 -1
- package/dist/components/ui/checkbox.d.ts +0 -5
- package/dist/components/ui/checkbox.d.ts.map +0 -1
- package/dist/components/ui/collapsible.d.ts +0 -6
- package/dist/components/ui/collapsible.d.ts.map +0 -1
- package/dist/components/ui/color-picker.d.ts +0 -13
- package/dist/components/ui/color-picker.d.ts.map +0 -1
- package/dist/components/ui/combobox.d.ts +0 -118
- package/dist/components/ui/combobox.d.ts.map +0 -1
- package/dist/components/ui/command.d.ts +0 -17
- package/dist/components/ui/command.d.ts.map +0 -1
- package/dist/components/ui/comment-system.d.ts +0 -43
- package/dist/components/ui/comment-system.d.ts.map +0 -1
- package/dist/components/ui/context-menu.d.ts +0 -26
- package/dist/components/ui/context-menu.d.ts.map +0 -1
- package/dist/components/ui/contract-print.d.ts +0 -82
- package/dist/components/ui/contract-print.d.ts.map +0 -1
- package/dist/components/ui/currency-input.d.ts +0 -11
- package/dist/components/ui/currency-input.d.ts.map +0 -1
- package/dist/components/ui/data-table.d.ts +0 -30
- package/dist/components/ui/data-table.d.ts.map +0 -1
- package/dist/components/ui/date-picker.d.ts +0 -111
- package/dist/components/ui/date-picker.d.ts.map +0 -1
- package/dist/components/ui/date-range-picker.d.ts +0 -128
- package/dist/components/ui/date-range-picker.d.ts.map +0 -1
- package/dist/components/ui/dialog.d.ts +0 -14
- package/dist/components/ui/dialog.d.ts.map +0 -1
- package/dist/components/ui/document-editor.d.ts +0 -14
- package/dist/components/ui/document-editor.d.ts.map +0 -1
- package/dist/components/ui/donut-chart.d.ts +0 -32
- package/dist/components/ui/donut-chart.d.ts.map +0 -1
- package/dist/components/ui/drawer.d.ts +0 -14
- package/dist/components/ui/drawer.d.ts.map +0 -1
- package/dist/components/ui/dropdown-menu.d.ts +0 -26
- package/dist/components/ui/dropdown-menu.d.ts.map +0 -1
- package/dist/components/ui/editable-badge.d.ts +0 -98
- package/dist/components/ui/editable-badge.d.ts.map +0 -1
- package/dist/components/ui/editorial-calendar.d.ts +0 -22
- package/dist/components/ui/editorial-calendar.d.ts.map +0 -1
- package/dist/components/ui/empty-state.d.ts +0 -59
- package/dist/components/ui/empty-state.d.ts.map +0 -1
- package/dist/components/ui/filter-bar.d.ts +0 -16
- package/dist/components/ui/filter-bar.d.ts.map +0 -1
- package/dist/components/ui/filter-builder.d.ts +0 -39
- package/dist/components/ui/filter-builder.d.ts.map +0 -1
- package/dist/components/ui/filter-chip.d.ts +0 -8
- package/dist/components/ui/filter-chip.d.ts.map +0 -1
- package/dist/components/ui/form.d.ts +0 -25
- package/dist/components/ui/form.d.ts.map +0 -1
- package/dist/components/ui/gantt-chart.d.ts +0 -28
- package/dist/components/ui/gantt-chart.d.ts.map +0 -1
- package/dist/components/ui/hover-card.d.ts +0 -7
- package/dist/components/ui/hover-card.d.ts.map +0 -1
- package/dist/components/ui/illustrations.d.ts +0 -76
- package/dist/components/ui/illustrations.d.ts.map +0 -1
- package/dist/components/ui/index.d.ts +0 -91
- package/dist/components/ui/index.d.ts.map +0 -1
- package/dist/components/ui/input-group.d.ts +0 -19
- package/dist/components/ui/input-group.d.ts.map +0 -1
- package/dist/components/ui/input-otp.d.ts +0 -12
- package/dist/components/ui/input-otp.d.ts.map +0 -1
- package/dist/components/ui/input-validation.d.ts +0 -35
- package/dist/components/ui/input-validation.d.ts.map +0 -1
- package/dist/components/ui/input.d.ts +0 -4
- package/dist/components/ui/input.d.ts.map +0 -1
- package/dist/components/ui/kanban-card.d.ts +0 -59
- package/dist/components/ui/kanban-card.d.ts.map +0 -1
- package/dist/components/ui/kanban-generic-card.d.ts +0 -43
- package/dist/components/ui/kanban-generic-card.d.ts.map +0 -1
- package/dist/components/ui/kpi-card.d.ts +0 -45
- package/dist/components/ui/kpi-card.d.ts.map +0 -1
- package/dist/components/ui/label.d.ts +0 -5
- package/dist/components/ui/label.d.ts.map +0 -1
- package/dist/components/ui/lista-anexos-arquivo.d.ts +0 -47
- package/dist/components/ui/lista-anexos-arquivo.d.ts.map +0 -1
- package/dist/components/ui/mention-list.d.ts +0 -7
- package/dist/components/ui/mention-list.d.ts.map +0 -1
- package/dist/components/ui/menubar.d.ts +0 -27
- package/dist/components/ui/menubar.d.ts.map +0 -1
- package/dist/components/ui/month-range-picker.d.ts +0 -71
- package/dist/components/ui/month-range-picker.d.ts.map +0 -1
- package/dist/components/ui/multi-select.d.ts +0 -98
- package/dist/components/ui/multi-select.d.ts.map +0 -1
- package/dist/components/ui/navigation-menu.d.ts +0 -15
- package/dist/components/ui/navigation-menu.d.ts.map +0 -1
- package/dist/components/ui/number-input.d.ts +0 -83
- package/dist/components/ui/number-input.d.ts.map +0 -1
- package/dist/components/ui/page-header.d.ts +0 -32
- package/dist/components/ui/page-header.d.ts.map +0 -1
- package/dist/components/ui/pagination.d.ts +0 -14
- package/dist/components/ui/pagination.d.ts.map +0 -1
- package/dist/components/ui/password-input.d.ts +0 -7
- package/dist/components/ui/password-input.d.ts.map +0 -1
- package/dist/components/ui/popover.d.ts +0 -8
- package/dist/components/ui/popover.d.ts.map +0 -1
- package/dist/components/ui/progress-timeline.d.ts +0 -42
- package/dist/components/ui/progress-timeline.d.ts.map +0 -1
- package/dist/components/ui/progress.d.ts +0 -7
- package/dist/components/ui/progress.d.ts.map +0 -1
- package/dist/components/ui/radio-group.d.ts +0 -6
- package/dist/components/ui/radio-group.d.ts.map +0 -1
- package/dist/components/ui/resizable.d.ts +0 -9
- package/dist/components/ui/resizable.d.ts.map +0 -1
- package/dist/components/ui/saved-filters.d.ts +0 -16
- package/dist/components/ui/saved-filters.d.ts.map +0 -1
- package/dist/components/ui/scroll-area.d.ts +0 -8
- package/dist/components/ui/scroll-area.d.ts.map +0 -1
- package/dist/components/ui/select.d.ts +0 -16
- package/dist/components/ui/select.d.ts.map +0 -1
- package/dist/components/ui/separator.d.ts +0 -5
- package/dist/components/ui/separator.d.ts.map +0 -1
- package/dist/components/ui/sheet.d.ts +0 -14
- package/dist/components/ui/sheet.d.ts.map +0 -1
- package/dist/components/ui/side-panel.d.ts +0 -40
- package/dist/components/ui/side-panel.d.ts.map +0 -1
- package/dist/components/ui/sidebar.d.ts +0 -70
- package/dist/components/ui/sidebar.d.ts.map +0 -1
- package/dist/components/ui/skeleton.d.ts +0 -8
- package/dist/components/ui/skeleton.d.ts.map +0 -1
- package/dist/components/ui/slider.d.ts +0 -5
- package/dist/components/ui/slider.d.ts.map +0 -1
- package/dist/components/ui/social-button.d.ts +0 -13
- package/dist/components/ui/social-button.d.ts.map +0 -1
- package/dist/components/ui/switch.d.ts +0 -5
- package/dist/components/ui/switch.d.ts.map +0 -1
- package/dist/components/ui/table-pagination.d.ts +0 -131
- package/dist/components/ui/table-pagination.d.ts.map +0 -1
- package/dist/components/ui/table-types.d.ts +0 -320
- package/dist/components/ui/table-types.d.ts.map +0 -1
- package/dist/components/ui/table.d.ts +0 -34
- package/dist/components/ui/table.d.ts.map +0 -1
- package/dist/components/ui/tabs.d.ts +0 -8
- package/dist/components/ui/tabs.d.ts.map +0 -1
- package/dist/components/ui/task-edit-dialog.d.ts +0 -15
- package/dist/components/ui/task-edit-dialog.d.ts.map +0 -1
- package/dist/components/ui/textarea.d.ts +0 -4
- package/dist/components/ui/textarea.d.ts.map +0 -1
- package/dist/components/ui/time-picker.d.ts +0 -85
- package/dist/components/ui/time-picker.d.ts.map +0 -1
- package/dist/components/ui/timeline.d.ts +0 -63
- package/dist/components/ui/timeline.d.ts.map +0 -1
- package/dist/components/ui/toast.d.ts +0 -5
- package/dist/components/ui/toast.d.ts.map +0 -1
- package/dist/components/ui/toggle-group.d.ts +0 -8
- package/dist/components/ui/toggle-group.d.ts.map +0 -1
- package/dist/components/ui/toggle.d.ts +0 -10
- package/dist/components/ui/toggle.d.ts.map +0 -1
- package/dist/components/ui/tooltip.d.ts +0 -8
- package/dist/components/ui/tooltip.d.ts.map +0 -1
- package/dist/components/ui/underline-tabs.d.ts +0 -29
- package/dist/components/ui/underline-tabs.d.ts.map +0 -1
- package/dist/components/ui/use-mobile.d.ts +0 -2
- package/dist/components/ui/use-mobile.d.ts.map +0 -1
- package/dist/components/ui/use-print-contract.d.ts +0 -37
- package/dist/components/ui/use-print-contract.d.ts.map +0 -1
- package/dist/components/ui/utils.d.ts +0 -3
- package/dist/components/ui/utils.d.ts.map +0 -1
- package/dist/components/ui/zona-upload-arquivo.d.ts +0 -34
- package/dist/components/ui/zona-upload-arquivo.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-attachment-list.cjs","sources":["../../../../src/components/ui/forms/file-attachment-list.tsx"],"sourcesContent":["import { AlertCircle, Download, Eye, Paperclip, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Badge } from '../primitives/badge';\nimport { Button } from '../primitives/button';\nimport { Progress } from '../primitives/progress';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../overlays/tooltip';\nimport { cn } from '../utils';\n\n/**\n * Interface para um anexo de arquivo\n */\nexport interface FileAttachment {\n id?: string;\n nomeOriginal: string;\n chave?: string;\n tamanhoBytes?: number;\n dataUpload?: string;\n status?: 'completed' | 'uploading' | 'failed' | 'retrying';\n progress?: number;\n erro?: string;\n}\n\n/**\n * Props do componente FileAttachmentList\n */\nexport interface FileAttachmentListProps {\n /** Lista de anexos a serem exibidos */\n attachments: FileAttachment[];\n\n /** Callback quando usuário clica em download */\n onDownload?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Callback quando usuário clica em remover */\n onRemove?: (attachment: FileAttachment) => void;\n\n /** Callback quando usuário clica em visualizar */\n onView?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Mostrar botão de download */\n showDownload?: boolean;\n\n /** Mostrar botão de remover */\n showRemove?: boolean;\n\n /** Mostrar botão de visualizar */\n showView?: boolean;\n\n /** Comprimento máximo do nome do arquivo antes de truncar */\n maxFilenameLength?: number;\n\n /** Variante de exibição */\n variant?: 'compact' | 'detailed';\n\n /** Mensagem quando lista está vazia */\n emptyMessage?: string;\n\n /** Estado de loading geral */\n isLoading?: boolean;\n\n /** Classe CSS adicional */\n className?: string;\n}\n\n/**\n * Formata o tamanho do arquivo em formato legível\n */\nfunction formatarTamanhoArquivo(bytes?: number): string {\n if (!bytes) return '';\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Formata a data em formato brasileiro\n */\nfunction formatarData(stringData?: string): string {\n if (!stringData) return '';\n\n try {\n const data = new Date(stringData);\n if (isNaN(data.getTime())) return stringData;\n return data.toLocaleDateString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return stringData;\n }\n}\n\n/**\n * Trunca o nome do arquivo mantendo a extensão\n */\nfunction truncarNomeArquivo(nomeArquivo: string, comprimentoMaximo: number): string {\n if (nomeArquivo.length <= comprimentoMaximo) return nomeArquivo;\n\n const ultimoIndicePonto = nomeArquivo.lastIndexOf('.');\n if (ultimoIndicePonto === -1) {\n return nomeArquivo.substring(0, comprimentoMaximo - 3) + '...';\n }\n\n const extensao = nomeArquivo.substring(ultimoIndicePonto);\n const nome = nomeArquivo.substring(0, ultimoIndicePonto);\n const nomeTruncado = nome.substring(0, comprimentoMaximo - extensao.length - 3) + '...';\n\n return nomeTruncado + extensao;\n}\n\n/**\n * Componente para exibir lista de anexos com ações (download, view, remove)\n */\nexport function FileAttachmentList({\n attachments,\n onDownload,\n onRemove,\n onView,\n showDownload = true,\n showRemove = false,\n showView = false,\n maxFilenameLength = 40,\n variant = 'compact',\n emptyMessage = 'Nenhum anexo',\n isLoading = false,\n className,\n}: FileAttachmentListProps) {\n const [estadosCarregamento, setEstadosCarregamento] = useState<Record<string, 'download' | 'view' | null>>({});\n\n const gerenciarAcao = async (\n anexo: FileAttachment,\n acao: 'download' | 'view',\n callback?: (attachment: FileAttachment) => void | Promise<void>,\n ) => {\n if (!callback) return;\n\n const chave = anexo.chave || anexo.nomeOriginal;\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: acao }));\n\n try {\n await callback(anexo);\n } finally {\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: null }));\n }\n };\n\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3].map(i => (\n <div key={i} className=\"flex items-center gap-2 p-3 border rounded bg-muted/30 animate-pulse\">\n <div className=\"h-4 w-4 bg-muted-foreground/20 rounded\" />\n <div className=\"h-4 flex-1 bg-muted-foreground/20 rounded\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (attachments.length === 0) {\n return (\n <div className={cn('text-center py-6 text-sm text-muted-foreground border rounded-lg bg-muted/20', className)}>\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {attachments.map((anexo, indice) => {\n const chave = anexo.chave || anexo.id || `${anexo.nomeOriginal}-${indice}`;\n const estadoCarregamentoAtual = estadosCarregamento[anexo.chave || anexo.nomeOriginal];\n const estaBaixando = estadoCarregamentoAtual === 'download';\n const estaVisualizando = estadoCarregamentoAtual === 'view';\n\n // Badge de status\n const badgeStatus = (() => {\n switch (anexo.status) {\n case 'completed':\n return (\n <Badge variant=\"outline\" className=\"bg-success/10 text-success-emphasis border-success/20 hover:bg-success/10\">\n ✓ Enviado\n </Badge>\n );\n case 'uploading':\n return (\n <Badge variant=\"outline\" className=\"bg-info/10 text-info-emphasis border-info/20 hover:bg-info/10\">\n Enviando...\n </Badge>\n );\n case 'failed':\n return (\n <Badge variant=\"outline\" className=\"bg-destructive/10 text-destructive-emphasis border-destructive/20 hover:bg-destructive/10\">\n ✗ Erro\n </Badge>\n );\n case 'retrying':\n return (\n <Badge variant=\"outline\" className=\"bg-warning/10 text-warning-emphasis border-warning/20 hover:bg-warning/10\">\n Tentando...\n </Badge>\n );\n default:\n return null;\n }\n })();\n\n if (variant === 'detailed') {\n return (\n <div\n key={chave}\n className={cn(\n 'p-4 border rounded-lg bg-card transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\n <Paperclip className=\"h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-sm font-medium truncate\">\n {anexo.nomeOriginal}\n </p>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <div className=\"flex items-center gap-2 mt-1 text-xs text-muted-foreground\">\n {anexo.tamanhoBytes && (\n <span>{formatarTamanhoArquivo(anexo.tamanhoBytes)}</span>\n )}\n {anexo.tamanhoBytes && anexo.dataUpload && (\n <span>•</span>\n )}\n {anexo.dataUpload && (\n <span>{formatarData(anexo.dataUpload)}</span>\n )}\n </div>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <Progress value={anexo.progress} className=\"h-1 mt-2\" />\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <div className=\"flex items-center gap-1 mt-2 text-xs text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>{anexo.erro}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {badgeStatus}\n\n {anexo.status === 'completed' && (\n <>\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Variante: compact\n return (\n <div\n key={chave}\n className={cn(\n 'flex items-center justify-between gap-2 p-3 border rounded-lg bg-muted/30 transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <Paperclip className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-sm truncate\">\n {truncarNomeArquivo(anexo.nomeOriginal, maxFilenameLength)}\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs break-all\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0\">\n {anexo.progress}%\n </span>\n )}\n\n {badgeStatus}\n </div>\n\n {anexo.status === 'completed' && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <AlertCircle className=\"h-4 w-4 text-destructive flex-shrink-0\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.erro}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["formatarTamanhoArquivo","bytes","formatarData","stringData","data","truncarNomeArquivo","nomeArquivo","comprimentoMaximo","ultimoIndicePonto","extensao","FileAttachmentList","attachments","onDownload","onRemove","onView","showDownload","showRemove","showView","maxFilenameLength","variant","emptyMessage","isLoading","className","estadosCarregamento","setEstadosCarregamento","useState","gerenciarAcao","anexo","acao","callback","chave","anterior","cn","jsxs","jsx","i","indice","estadoCarregamentoAtual","estaBaixando","estaVisualizando","badgeStatus","Badge","Paperclip","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Progress","AlertCircle","Fragment","Button","Eye","Download","Trash2"],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { jsx as e, jsxs as t, Fragment as I } from "react/jsx-runtime";
|
|
2
|
+
import { Paperclip as $, AlertCircle as y, Eye as z, Download as T, Trash2 as E } from "lucide-react";
|
|
3
|
+
import { useState as L } from "react";
|
|
4
|
+
import { Badge as v } from "../primitives/badge.js";
|
|
5
|
+
import { Button as u } from "../primitives/button.js";
|
|
6
|
+
import { Progress as A } from "../primitives/progress.js";
|
|
7
|
+
import { TooltipProvider as a, Tooltip as l, TooltipTrigger as n, TooltipContent as d } from "../overlays/tooltip.js";
|
|
8
|
+
import { cn as f } from "../utils.js";
|
|
9
|
+
function G(i) {
|
|
10
|
+
return i ? i < 1024 ? `${i} B` : i < 1024 * 1024 ? `${(i / 1024).toFixed(1)} KB` : i < 1024 * 1024 * 1024 ? `${(i / (1024 * 1024)).toFixed(1)} MB` : `${(i / (1024 * 1024 * 1024)).toFixed(1)} GB` : "";
|
|
11
|
+
}
|
|
12
|
+
function K(i) {
|
|
13
|
+
if (!i) return "";
|
|
14
|
+
try {
|
|
15
|
+
const s = new Date(i);
|
|
16
|
+
return isNaN(s.getTime()) ? i : s.toLocaleDateString("pt-BR", {
|
|
17
|
+
day: "2-digit",
|
|
18
|
+
month: "2-digit",
|
|
19
|
+
year: "numeric",
|
|
20
|
+
hour: "2-digit",
|
|
21
|
+
minute: "2-digit"
|
|
22
|
+
});
|
|
23
|
+
} catch {
|
|
24
|
+
return i;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function R(i, s) {
|
|
28
|
+
if (i.length <= s) return i;
|
|
29
|
+
const c = i.lastIndexOf(".");
|
|
30
|
+
if (c === -1)
|
|
31
|
+
return i.substring(0, s - 3) + "...";
|
|
32
|
+
const h = i.substring(c);
|
|
33
|
+
return i.substring(0, c).substring(0, s - h.length - 3) + "..." + h;
|
|
34
|
+
}
|
|
35
|
+
function _({
|
|
36
|
+
attachments: i,
|
|
37
|
+
onDownload: s,
|
|
38
|
+
onRemove: c,
|
|
39
|
+
onView: h,
|
|
40
|
+
showDownload: N = !0,
|
|
41
|
+
showRemove: b = !1,
|
|
42
|
+
showView: x = !1,
|
|
43
|
+
maxFilenameLength: F = 40,
|
|
44
|
+
variant: j = "compact",
|
|
45
|
+
emptyMessage: P = "Nenhum anexo",
|
|
46
|
+
isLoading: S = !1,
|
|
47
|
+
className: w
|
|
48
|
+
}) {
|
|
49
|
+
const [U, B] = L({}), p = async (r, C, o) => {
|
|
50
|
+
if (!o) return;
|
|
51
|
+
const g = r.chave || r.nomeOriginal;
|
|
52
|
+
B((m) => ({ ...m, [g]: C }));
|
|
53
|
+
try {
|
|
54
|
+
await o(r);
|
|
55
|
+
} finally {
|
|
56
|
+
B((m) => ({ ...m, [g]: null }));
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
return S ? /* @__PURE__ */ e("div", { className: f("space-y-2", w), children: [1, 2, 3].map((r) => /* @__PURE__ */ t("div", { className: "flex items-center gap-2 p-3 border rounded bg-muted/30 animate-pulse", children: [
|
|
60
|
+
/* @__PURE__ */ e("div", { className: "h-4 w-4 bg-muted-foreground/20 rounded" }),
|
|
61
|
+
/* @__PURE__ */ e("div", { className: "h-4 flex-1 bg-muted-foreground/20 rounded" })
|
|
62
|
+
] }, r)) }) : i.length === 0 ? /* @__PURE__ */ e("div", { className: f("text-center py-6 text-sm text-muted-foreground border rounded-lg bg-muted/20", w), children: P }) : /* @__PURE__ */ e("div", { className: f("space-y-2", w), children: i.map((r, C) => {
|
|
63
|
+
const o = r.chave || r.id || `${r.nomeOriginal}-${C}`, g = U[r.chave || r.nomeOriginal], m = g === "download", O = g === "view", k = (() => {
|
|
64
|
+
switch (r.status) {
|
|
65
|
+
case "completed":
|
|
66
|
+
return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-success/10 text-success-emphasis border-success/20 hover:bg-success/10", children: "✓ Enviado" });
|
|
67
|
+
case "uploading":
|
|
68
|
+
return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-info/10 text-info-emphasis border-info/20 hover:bg-info/10", children: "Enviando..." });
|
|
69
|
+
case "failed":
|
|
70
|
+
return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-destructive/10 text-destructive-emphasis border-destructive/20 hover:bg-destructive/10", children: "✗ Erro" });
|
|
71
|
+
case "retrying":
|
|
72
|
+
return /* @__PURE__ */ e(v, { variant: "outline", className: "bg-warning/10 text-warning-emphasis border-warning/20 hover:bg-warning/10", children: "Tentando..." });
|
|
73
|
+
default:
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
})();
|
|
77
|
+
return j === "detailed" ? /* @__PURE__ */ e(
|
|
78
|
+
"div",
|
|
79
|
+
{
|
|
80
|
+
className: f(
|
|
81
|
+
"p-4 border rounded-lg bg-card transition-colors",
|
|
82
|
+
r.status === "failed" && "border-destructive/30 bg-destructive/5"
|
|
83
|
+
),
|
|
84
|
+
children: /* @__PURE__ */ t("div", { className: "flex items-start justify-between gap-3", children: [
|
|
85
|
+
/* @__PURE__ */ t("div", { className: "flex items-start gap-3 flex-1 min-w-0", children: [
|
|
86
|
+
/* @__PURE__ */ e($, { className: "h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0" }),
|
|
87
|
+
/* @__PURE__ */ t("div", { className: "flex-1 min-w-0", children: [
|
|
88
|
+
/* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
89
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e("p", { className: "text-sm font-medium truncate", children: r.nomeOriginal }) }),
|
|
90
|
+
/* @__PURE__ */ e(d, { children: /* @__PURE__ */ e("p", { className: "text-xs", children: r.nomeOriginal }) })
|
|
91
|
+
] }) }),
|
|
92
|
+
/* @__PURE__ */ t("div", { className: "flex items-center gap-2 mt-1 text-xs text-muted-foreground", children: [
|
|
93
|
+
r.tamanhoBytes && /* @__PURE__ */ e("span", { children: G(r.tamanhoBytes) }),
|
|
94
|
+
r.tamanhoBytes && r.dataUpload && /* @__PURE__ */ e("span", { children: "•" }),
|
|
95
|
+
r.dataUpload && /* @__PURE__ */ e("span", { children: K(r.dataUpload) })
|
|
96
|
+
] }),
|
|
97
|
+
r.status === "uploading" && typeof r.progress == "number" && /* @__PURE__ */ e(A, { value: r.progress, className: "h-1 mt-2" }),
|
|
98
|
+
r.status === "failed" && r.erro && /* @__PURE__ */ t("div", { className: "flex items-center gap-1 mt-2 text-xs text-destructive", children: [
|
|
99
|
+
/* @__PURE__ */ e(y, { className: "h-3 w-3" }),
|
|
100
|
+
/* @__PURE__ */ e("span", { children: r.erro })
|
|
101
|
+
] })
|
|
102
|
+
] })
|
|
103
|
+
] }),
|
|
104
|
+
/* @__PURE__ */ t("div", { className: "flex items-center gap-2 flex-shrink-0", children: [
|
|
105
|
+
k,
|
|
106
|
+
r.status === "completed" && /* @__PURE__ */ t(I, { children: [
|
|
107
|
+
x && h && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
108
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
|
|
109
|
+
u,
|
|
110
|
+
{
|
|
111
|
+
variant: "ghost",
|
|
112
|
+
size: "icon",
|
|
113
|
+
className: "h-8 w-8",
|
|
114
|
+
onClick: () => p(r, "view", h),
|
|
115
|
+
disabled: O,
|
|
116
|
+
"aria-label": `Visualizar ${r.nomeOriginal}`,
|
|
117
|
+
children: /* @__PURE__ */ e(z, { className: "h-4 w-4" })
|
|
118
|
+
}
|
|
119
|
+
) }),
|
|
120
|
+
/* @__PURE__ */ e(d, { children: "Visualizar" })
|
|
121
|
+
] }) }),
|
|
122
|
+
N && s && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
123
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
|
|
124
|
+
u,
|
|
125
|
+
{
|
|
126
|
+
variant: "ghost",
|
|
127
|
+
size: "icon",
|
|
128
|
+
className: "h-8 w-8",
|
|
129
|
+
onClick: () => p(r, "download", s),
|
|
130
|
+
disabled: m,
|
|
131
|
+
"aria-label": `Baixar ${r.nomeOriginal}`,
|
|
132
|
+
children: /* @__PURE__ */ e(T, { className: "h-4 w-4" })
|
|
133
|
+
}
|
|
134
|
+
) }),
|
|
135
|
+
/* @__PURE__ */ e(d, { children: "Baixar" })
|
|
136
|
+
] }) }),
|
|
137
|
+
b && c && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
138
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
|
|
139
|
+
u,
|
|
140
|
+
{
|
|
141
|
+
variant: "ghost",
|
|
142
|
+
size: "icon",
|
|
143
|
+
className: "h-8 w-8 text-destructive hover:text-destructive",
|
|
144
|
+
onClick: () => c(r),
|
|
145
|
+
"aria-label": `Remover ${r.nomeOriginal}`,
|
|
146
|
+
children: /* @__PURE__ */ e(E, { className: "h-4 w-4" })
|
|
147
|
+
}
|
|
148
|
+
) }),
|
|
149
|
+
/* @__PURE__ */ e(d, { children: "Remover" })
|
|
150
|
+
] }) })
|
|
151
|
+
] })
|
|
152
|
+
] })
|
|
153
|
+
] })
|
|
154
|
+
},
|
|
155
|
+
o
|
|
156
|
+
) : /* @__PURE__ */ t(
|
|
157
|
+
"div",
|
|
158
|
+
{
|
|
159
|
+
className: f(
|
|
160
|
+
"flex items-center justify-between gap-2 p-3 border rounded-lg bg-muted/30 transition-colors",
|
|
161
|
+
r.status === "failed" && "border-destructive/30 bg-destructive/5"
|
|
162
|
+
),
|
|
163
|
+
children: [
|
|
164
|
+
/* @__PURE__ */ t("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
165
|
+
/* @__PURE__ */ e($, { className: "h-4 w-4 text-muted-foreground flex-shrink-0" }),
|
|
166
|
+
/* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
167
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e("span", { className: "text-sm truncate", children: R(r.nomeOriginal, F) }) }),
|
|
168
|
+
/* @__PURE__ */ e(d, { children: /* @__PURE__ */ e("p", { className: "max-w-xs break-all", children: r.nomeOriginal }) })
|
|
169
|
+
] }) }),
|
|
170
|
+
r.status === "uploading" && typeof r.progress == "number" && /* @__PURE__ */ t("span", { className: "text-xs text-muted-foreground flex-shrink-0", children: [
|
|
171
|
+
r.progress,
|
|
172
|
+
"%"
|
|
173
|
+
] }),
|
|
174
|
+
k
|
|
175
|
+
] }),
|
|
176
|
+
r.status === "completed" && /* @__PURE__ */ t("div", { className: "flex items-center gap-1 flex-shrink-0", children: [
|
|
177
|
+
x && h && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
178
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
|
|
179
|
+
u,
|
|
180
|
+
{
|
|
181
|
+
variant: "ghost",
|
|
182
|
+
size: "icon",
|
|
183
|
+
className: "h-8 w-8",
|
|
184
|
+
onClick: () => p(r, "view", h),
|
|
185
|
+
disabled: O,
|
|
186
|
+
"aria-label": `Visualizar ${r.nomeOriginal}`,
|
|
187
|
+
children: /* @__PURE__ */ e(z, { className: "h-4 w-4" })
|
|
188
|
+
}
|
|
189
|
+
) }),
|
|
190
|
+
/* @__PURE__ */ e(d, { children: "Visualizar" })
|
|
191
|
+
] }) }),
|
|
192
|
+
N && s && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
193
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
|
|
194
|
+
u,
|
|
195
|
+
{
|
|
196
|
+
variant: "ghost",
|
|
197
|
+
size: "icon",
|
|
198
|
+
className: "h-8 w-8",
|
|
199
|
+
onClick: () => p(r, "download", s),
|
|
200
|
+
disabled: m,
|
|
201
|
+
"aria-label": `Baixar ${r.nomeOriginal}`,
|
|
202
|
+
children: /* @__PURE__ */ e(T, { className: "h-4 w-4" })
|
|
203
|
+
}
|
|
204
|
+
) }),
|
|
205
|
+
/* @__PURE__ */ e(d, { children: "Baixar" })
|
|
206
|
+
] }) }),
|
|
207
|
+
b && c && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
208
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(
|
|
209
|
+
u,
|
|
210
|
+
{
|
|
211
|
+
variant: "ghost",
|
|
212
|
+
size: "icon",
|
|
213
|
+
className: "h-8 w-8 text-destructive hover:text-destructive",
|
|
214
|
+
onClick: () => c(r),
|
|
215
|
+
"aria-label": `Remover ${r.nomeOriginal}`,
|
|
216
|
+
children: /* @__PURE__ */ e(E, { className: "h-4 w-4" })
|
|
217
|
+
}
|
|
218
|
+
) }),
|
|
219
|
+
/* @__PURE__ */ e(d, { children: "Remover" })
|
|
220
|
+
] }) })
|
|
221
|
+
] }),
|
|
222
|
+
r.status === "failed" && r.erro && /* @__PURE__ */ e(a, { children: /* @__PURE__ */ t(l, { children: [
|
|
223
|
+
/* @__PURE__ */ e(n, { asChild: !0, children: /* @__PURE__ */ e(y, { className: "h-4 w-4 text-destructive flex-shrink-0" }) }),
|
|
224
|
+
/* @__PURE__ */ e(d, { children: /* @__PURE__ */ e("p", { className: "text-xs", children: r.erro }) })
|
|
225
|
+
] }) })
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
o
|
|
229
|
+
);
|
|
230
|
+
}) });
|
|
231
|
+
}
|
|
232
|
+
export {
|
|
233
|
+
_ as FileAttachmentList
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=file-attachment-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-attachment-list.js","sources":["../../../../src/components/ui/forms/file-attachment-list.tsx"],"sourcesContent":["import { AlertCircle, Download, Eye, Paperclip, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Badge } from '../primitives/badge';\nimport { Button } from '../primitives/button';\nimport { Progress } from '../primitives/progress';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../overlays/tooltip';\nimport { cn } from '../utils';\n\n/**\n * Interface para um anexo de arquivo\n */\nexport interface FileAttachment {\n id?: string;\n nomeOriginal: string;\n chave?: string;\n tamanhoBytes?: number;\n dataUpload?: string;\n status?: 'completed' | 'uploading' | 'failed' | 'retrying';\n progress?: number;\n erro?: string;\n}\n\n/**\n * Props do componente FileAttachmentList\n */\nexport interface FileAttachmentListProps {\n /** Lista de anexos a serem exibidos */\n attachments: FileAttachment[];\n\n /** Callback quando usuário clica em download */\n onDownload?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Callback quando usuário clica em remover */\n onRemove?: (attachment: FileAttachment) => void;\n\n /** Callback quando usuário clica em visualizar */\n onView?: (attachment: FileAttachment) => void | Promise<void>;\n\n /** Mostrar botão de download */\n showDownload?: boolean;\n\n /** Mostrar botão de remover */\n showRemove?: boolean;\n\n /** Mostrar botão de visualizar */\n showView?: boolean;\n\n /** Comprimento máximo do nome do arquivo antes de truncar */\n maxFilenameLength?: number;\n\n /** Variante de exibição */\n variant?: 'compact' | 'detailed';\n\n /** Mensagem quando lista está vazia */\n emptyMessage?: string;\n\n /** Estado de loading geral */\n isLoading?: boolean;\n\n /** Classe CSS adicional */\n className?: string;\n}\n\n/**\n * Formata o tamanho do arquivo em formato legível\n */\nfunction formatarTamanhoArquivo(bytes?: number): string {\n if (!bytes) return '';\n\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Formata a data em formato brasileiro\n */\nfunction formatarData(stringData?: string): string {\n if (!stringData) return '';\n\n try {\n const data = new Date(stringData);\n if (isNaN(data.getTime())) return stringData;\n return data.toLocaleDateString('pt-BR', {\n day: '2-digit',\n month: '2-digit',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n } catch {\n return stringData;\n }\n}\n\n/**\n * Trunca o nome do arquivo mantendo a extensão\n */\nfunction truncarNomeArquivo(nomeArquivo: string, comprimentoMaximo: number): string {\n if (nomeArquivo.length <= comprimentoMaximo) return nomeArquivo;\n\n const ultimoIndicePonto = nomeArquivo.lastIndexOf('.');\n if (ultimoIndicePonto === -1) {\n return nomeArquivo.substring(0, comprimentoMaximo - 3) + '...';\n }\n\n const extensao = nomeArquivo.substring(ultimoIndicePonto);\n const nome = nomeArquivo.substring(0, ultimoIndicePonto);\n const nomeTruncado = nome.substring(0, comprimentoMaximo - extensao.length - 3) + '...';\n\n return nomeTruncado + extensao;\n}\n\n/**\n * Componente para exibir lista de anexos com ações (download, view, remove)\n */\nexport function FileAttachmentList({\n attachments,\n onDownload,\n onRemove,\n onView,\n showDownload = true,\n showRemove = false,\n showView = false,\n maxFilenameLength = 40,\n variant = 'compact',\n emptyMessage = 'Nenhum anexo',\n isLoading = false,\n className,\n}: FileAttachmentListProps) {\n const [estadosCarregamento, setEstadosCarregamento] = useState<Record<string, 'download' | 'view' | null>>({});\n\n const gerenciarAcao = async (\n anexo: FileAttachment,\n acao: 'download' | 'view',\n callback?: (attachment: FileAttachment) => void | Promise<void>,\n ) => {\n if (!callback) return;\n\n const chave = anexo.chave || anexo.nomeOriginal;\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: acao }));\n\n try {\n await callback(anexo);\n } finally {\n setEstadosCarregamento(anterior => ({ ...anterior, [chave]: null }));\n }\n };\n\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3].map(i => (\n <div key={i} className=\"flex items-center gap-2 p-3 border rounded bg-muted/30 animate-pulse\">\n <div className=\"h-4 w-4 bg-muted-foreground/20 rounded\" />\n <div className=\"h-4 flex-1 bg-muted-foreground/20 rounded\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (attachments.length === 0) {\n return (\n <div className={cn('text-center py-6 text-sm text-muted-foreground border rounded-lg bg-muted/20', className)}>\n {emptyMessage}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {attachments.map((anexo, indice) => {\n const chave = anexo.chave || anexo.id || `${anexo.nomeOriginal}-${indice}`;\n const estadoCarregamentoAtual = estadosCarregamento[anexo.chave || anexo.nomeOriginal];\n const estaBaixando = estadoCarregamentoAtual === 'download';\n const estaVisualizando = estadoCarregamentoAtual === 'view';\n\n // Badge de status\n const badgeStatus = (() => {\n switch (anexo.status) {\n case 'completed':\n return (\n <Badge variant=\"outline\" className=\"bg-success/10 text-success-emphasis border-success/20 hover:bg-success/10\">\n ✓ Enviado\n </Badge>\n );\n case 'uploading':\n return (\n <Badge variant=\"outline\" className=\"bg-info/10 text-info-emphasis border-info/20 hover:bg-info/10\">\n Enviando...\n </Badge>\n );\n case 'failed':\n return (\n <Badge variant=\"outline\" className=\"bg-destructive/10 text-destructive-emphasis border-destructive/20 hover:bg-destructive/10\">\n ✗ Erro\n </Badge>\n );\n case 'retrying':\n return (\n <Badge variant=\"outline\" className=\"bg-warning/10 text-warning-emphasis border-warning/20 hover:bg-warning/10\">\n Tentando...\n </Badge>\n );\n default:\n return null;\n }\n })();\n\n if (variant === 'detailed') {\n return (\n <div\n key={chave}\n className={cn(\n 'p-4 border rounded-lg bg-card transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex items-start gap-3 flex-1 min-w-0\">\n <Paperclip className=\"h-5 w-5 text-muted-foreground mt-0.5 flex-shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <p className=\"text-sm font-medium truncate\">\n {anexo.nomeOriginal}\n </p>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n <div className=\"flex items-center gap-2 mt-1 text-xs text-muted-foreground\">\n {anexo.tamanhoBytes && (\n <span>{formatarTamanhoArquivo(anexo.tamanhoBytes)}</span>\n )}\n {anexo.tamanhoBytes && anexo.dataUpload && (\n <span>•</span>\n )}\n {anexo.dataUpload && (\n <span>{formatarData(anexo.dataUpload)}</span>\n )}\n </div>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <Progress value={anexo.progress} className=\"h-1 mt-2\" />\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <div className=\"flex items-center gap-1 mt-2 text-xs text-destructive\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>{anexo.erro}</span>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex items-center gap-2 flex-shrink-0\">\n {badgeStatus}\n\n {anexo.status === 'completed' && (\n <>\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n }\n\n // Variante: compact\n return (\n <div\n key={chave}\n className={cn(\n 'flex items-center justify-between gap-2 p-3 border rounded-lg bg-muted/30 transition-colors',\n anexo.status === 'failed' && 'border-destructive/30 bg-destructive/5',\n )}\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <Paperclip className=\"h-4 w-4 text-muted-foreground flex-shrink-0\" />\n\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"text-sm truncate\">\n {truncarNomeArquivo(anexo.nomeOriginal, maxFilenameLength)}\n </span>\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"max-w-xs break-all\">{anexo.nomeOriginal}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n\n {anexo.status === 'uploading' && typeof anexo.progress === 'number' && (\n <span className=\"text-xs text-muted-foreground flex-shrink-0\">\n {anexo.progress}%\n </span>\n )}\n\n {badgeStatus}\n </div>\n\n {anexo.status === 'completed' && (\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {showView && onView && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'view', onView)}\n disabled={estaVisualizando}\n aria-label={`Visualizar ${anexo.nomeOriginal}`}\n >\n <Eye className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Visualizar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showDownload && onDownload && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8\"\n onClick={() => gerenciarAcao(anexo, 'download', onDownload)}\n disabled={estaBaixando}\n aria-label={`Baixar ${anexo.nomeOriginal}`}\n >\n <Download className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Baixar</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {showRemove && onRemove && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 text-destructive hover:text-destructive\"\n onClick={() => onRemove(anexo)}\n aria-label={`Remover ${anexo.nomeOriginal}`}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>Remover</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n\n {anexo.status === 'failed' && anexo.erro && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <AlertCircle className=\"h-4 w-4 text-destructive flex-shrink-0\" />\n </TooltipTrigger>\n <TooltipContent>\n <p className=\"text-xs\">{anexo.erro}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n"],"names":["formatarTamanhoArquivo","bytes","formatarData","stringData","data","truncarNomeArquivo","nomeArquivo","comprimentoMaximo","ultimoIndicePonto","extensao","FileAttachmentList","attachments","onDownload","onRemove","onView","showDownload","showRemove","showView","maxFilenameLength","variant","emptyMessage","isLoading","className","estadosCarregamento","setEstadosCarregamento","useState","gerenciarAcao","anexo","acao","callback","chave","anterior","cn","jsxs","jsx","i","indice","estadoCarregamentoAtual","estaBaixando","estaVisualizando","badgeStatus","Badge","Paperclip","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","Progress","AlertCircle","Fragment","Button","Eye","Download","Trash2"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),w=require("lucide-react"),o=require("react"),g=require("../utils.cjs");function R(n,s){const u=s*1024*1024;return n.size>u?`Arquivo muito grande. Máximo: ${s}MB`:null}function W(n,s){if(!s)return null;const u=s.split(",").map(r=>r.trim().toLowerCase()),c=n.name.toLowerCase(),i=n.type.toLowerCase();return u.some(r=>{if(r.includes("*")){const[j]=r.split("/");return i.startsWith(j+"/")}return r.startsWith(".")?c.endsWith(r):i===r})?null:"Tipo de arquivo não suportado"}function M({onFilesSelected:n,accept:s,multiple:u=!0,maxFiles:c=10,maxSizeMB:i=50,disabled:a=!1,isUploading:r=!1,title:j="Clique para fazer upload de arquivos",description:b,icon:k,className:T,onError:m}){const[l,q]=o.useState(!1),p=o.useRef(null),y=o.useCallback(e=>{m==null||m(e)},[m]),h=o.useCallback(e=>{if(!e||e.length===0)return;const v=Array.from(e);if(v.length>c){y(`Máximo de ${c} arquivo(s) permitido(s)`);return}const f=[],x=[];for(const d of v){const A=R(d,i);if(A){x.push(`${d.name}: ${A}`);continue}const N=W(d,s);if(N){x.push(`${d.name}: ${N}`);continue}f.push(d)}x.length>0&&y(x.join(`
|
|
2
|
+
`)),f.length>0&&n(f),p.current&&(p.current.value="")},[c,i,s,n,y]),$=o.useCallback(()=>{var e;a||r||(e=p.current)==null||e.click()},[a,r]),D=o.useCallback(e=>{h(e.target.files)},[h]),P=o.useCallback(e=>{e.preventDefault(),e.stopPropagation(),!a&&!r&&q(!0)},[a,r]),V=o.useCallback(e=>{e.preventDefault(),e.stopPropagation(),q(!1)},[]),L=o.useCallback(e=>{e.preventDefault(),e.stopPropagation(),q(!1),!(a||r)&&h(e.dataTransfer.files)},[a,r,h]),C=b||(()=>{const e=[];if(s){const v=s.split(",").map(f=>f.trim().replace(".","").toUpperCase()).join(", ");e.push(v)}return i&&e.push(`máx ${i}MB cada`),e.join(" • ")})();return t.jsxs("div",{className:g.cn("relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer","hover:border-primary/50 hover:bg-muted/30",l&&"border-primary bg-primary/5 scale-[1.02]",(a||r)&&"opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent",r&&"animate-pulse",T),onClick:$,onDragOver:P,onDragLeave:V,onDrop:L,children:[t.jsx("input",{ref:p,type:"file",multiple:u,accept:s,className:"hidden",onChange:D,disabled:a||r}),t.jsxs("div",{className:"flex flex-col items-center gap-3",children:[k||t.jsx("div",{className:g.cn("transition-transform",l&&"scale-110"),children:r?t.jsx("div",{className:"h-12 w-12 mx-auto",children:t.jsxs("svg",{className:"animate-spin h-12 w-12 text-primary",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",children:[t.jsx("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4"}),t.jsx("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"})]})}):t.jsx(w.Upload,{className:g.cn("h-12 w-12 mx-auto text-muted-foreground transition-colors",l&&"text-primary")})}),t.jsxs("div",{className:"space-y-1",children:[t.jsx("p",{className:g.cn("font-medium transition-colors",l&&"text-primary",r&&"text-muted-foreground"),children:r?"Enviando arquivos...":l?"Solte os arquivos aqui":j}),C&&t.jsx("p",{className:"text-xs text-muted-foreground",children:C}),!a&&!r&&u&&c>1&&t.jsxs("p",{className:"text-xs text-muted-foreground",children:["Você pode selecionar até ",c," arquivo(s)"]})]}),a&&t.jsxs("div",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[t.jsx(w.AlertCircle,{className:"h-3 w-3"}),t.jsx("span",{children:"Upload desabilitado"})]})]})]})}exports.FileUploadZone=M;
|
|
3
|
+
//# sourceMappingURL=file-upload-zone.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-upload-zone.cjs","sources":["../../../../src/components/ui/forms/file-upload-zone.tsx"],"sourcesContent":["import { AlertCircle, Upload } from 'lucide-react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport { cn } from '../utils';\n\n/**\n * Props do componente FileUploadZone\n */\nexport interface FileUploadZoneProps {\n /** Callback quando arquivos são selecionados */\n onFilesSelected: (files: File[]) => void;\n\n /** Tipos de arquivo aceitos (ex: \".pdf,.doc,.docx\" ou \"image/*\") */\n accept?: string;\n\n /** Permitir múltiplos arquivos */\n multiple?: boolean;\n\n /** Número máximo de arquivos */\n maxFiles?: number;\n\n /** Tamanho máximo em MB */\n maxSizeMB?: number;\n\n /** Desabilitar upload */\n disabled?: boolean;\n\n /** Estado de loading/upload em andamento */\n isUploading?: boolean;\n\n /** Título da zona de upload */\n title?: string;\n\n /** Descrição da zona de upload */\n description?: string;\n\n /** Ícone customizado */\n icon?: React.ReactNode;\n\n /** Classe CSS adicional */\n className?: string;\n\n /** Callback quando houver erro de validação */\n onError?: (error: string) => void;\n}\n\n/**\n * Valida o tamanho do arquivo\n */\nfunction validarTamanhoArquivo(arquivo: File, tamanhoMaximoMB: number): string | null {\n const bytesMaximos = tamanhoMaximoMB * 1024 * 1024;\n if (arquivo.size > bytesMaximos) {\n return `Arquivo muito grande. Máximo: ${tamanhoMaximoMB}MB`;\n }\n return null;\n}\n\n/**\n * Valida o tipo do arquivo\n */\nfunction validarTipoArquivo(arquivo: File, tiposAceitos?: string): string | null {\n if (!tiposAceitos) return null;\n\n const tiposAceitosArray = tiposAceitos.split(',').map(t => t.trim().toLowerCase());\n const nomeArquivo = arquivo.name.toLowerCase();\n const tipoArquivo = arquivo.type.toLowerCase();\n\n const eValido = tiposAceitosArray.some(tipo => {\n // Wildcard (ex: image/*)\n if (tipo.includes('*')) {\n const [categoria] = tipo.split('/');\n return tipoArquivo.startsWith(categoria + '/');\n }\n\n // Extensão (ex: .pdf)\n if (tipo.startsWith('.')) {\n return nomeArquivo.endsWith(tipo);\n }\n\n // MIME type exato\n return tipoArquivo === tipo;\n });\n\n if (!eValido) {\n return 'Tipo de arquivo não suportado';\n }\n\n return null;\n}\n\n/**\n * Componente de zona de upload com drag-and-drop\n */\nexport function FileUploadZone({\n onFilesSelected,\n accept,\n multiple = true,\n maxFiles = 10,\n maxSizeMB = 50,\n disabled = false,\n isUploading = false,\n title = 'Clique para fazer upload de arquivos',\n description,\n icon,\n className,\n onError,\n}: FileUploadZoneProps) {\n const [estaArrastando, setEstaArrastando] = useState(false);\n const refInput = useRef<HTMLInputElement>(null);\n\n const gerenciarErro = useCallback((erro: string) => {\n onError?.(erro);\n }, [onError]);\n\n const validarEProcessarArquivos = useCallback((arquivos: FileList | null) => {\n if (!arquivos || arquivos.length === 0) return;\n\n const arrayArquivos = Array.from(arquivos);\n\n // Validar número de arquivos\n if (arrayArquivos.length > maxFiles) {\n gerenciarErro(`Máximo de ${maxFiles} arquivo(s) permitido(s)`);\n return;\n }\n\n // Validar cada arquivo\n const arquivosValidos: File[] = [];\n const erros: string[] = [];\n\n for (const arquivo of arrayArquivos) {\n // Validar tamanho\n const erroTamanho = validarTamanhoArquivo(arquivo, maxSizeMB);\n if (erroTamanho) {\n erros.push(`${arquivo.name}: ${erroTamanho}`);\n continue;\n }\n\n // Validar tipo\n const erroTipo = validarTipoArquivo(arquivo, accept);\n if (erroTipo) {\n erros.push(`${arquivo.name}: ${erroTipo}`);\n continue;\n }\n\n arquivosValidos.push(arquivo);\n }\n\n // Mostrar erros\n if (erros.length > 0) {\n gerenciarErro(erros.join('\\n'));\n }\n\n // Processar arquivos válidos\n if (arquivosValidos.length > 0) {\n onFilesSelected(arquivosValidos);\n }\n\n // Limpar input\n if (refInput.current) {\n refInput.current.value = '';\n }\n }, [maxFiles, maxSizeMB, accept, onFilesSelected, gerenciarErro]);\n\n const gerenciarClique = useCallback(() => {\n if (disabled || isUploading) return;\n refInput.current?.click();\n }, [disabled, isUploading]);\n\n const gerenciarMudancaArquivo = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n validarEProcessarArquivos(e.target.files);\n }, [validarEProcessarArquivos]);\n\n const gerenciarArrastarSobre = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled && !isUploading) {\n setEstaArrastando(true);\n }\n }, [disabled, isUploading]);\n\n const gerenciarArrastarSair = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n }, []);\n\n const gerenciarSoltar = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n\n if (disabled || isUploading) return;\n\n validarEProcessarArquivos(e.dataTransfer.files);\n }, [disabled, isUploading, validarEProcessarArquivos]);\n\n const descricaoPadrao = description || (() => {\n const partes: string[] = [];\n\n if (accept) {\n const tipos = accept.split(',').map(t => t.trim().replace('.', '').toUpperCase()).join(', ');\n partes.push(tipos);\n }\n\n if (maxSizeMB) {\n partes.push(`máx ${maxSizeMB}MB cada`);\n }\n\n return partes.join(' • ');\n })();\n\n return (\n <div\n className={cn(\n 'relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer',\n 'hover:border-primary/50 hover:bg-muted/30',\n estaArrastando && 'border-primary bg-primary/5 scale-[1.02]',\n (disabled || isUploading) && 'opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent',\n isUploading && 'animate-pulse',\n className,\n )}\n onClick={gerenciarClique}\n onDragOver={gerenciarArrastarSobre}\n onDragLeave={gerenciarArrastarSair}\n onDrop={gerenciarSoltar}\n >\n <input\n ref={refInput}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n className=\"hidden\"\n onChange={gerenciarMudancaArquivo}\n disabled={disabled || isUploading}\n />\n\n <div className=\"flex flex-col items-center gap-3\">\n {icon || (\n <div className={cn(\n 'transition-transform',\n estaArrastando && 'scale-110',\n )}>\n {isUploading ? (\n <div className=\"h-12 w-12 mx-auto\">\n <svg className=\"animate-spin h-12 w-12 text-primary\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n ) : (\n <Upload className={cn(\n 'h-12 w-12 mx-auto text-muted-foreground transition-colors',\n estaArrastando && 'text-primary',\n )} />\n )}\n </div>\n )}\n\n <div className=\"space-y-1\">\n <p className={cn(\n 'font-medium transition-colors',\n estaArrastando && 'text-primary',\n isUploading && 'text-muted-foreground',\n )}>\n {isUploading ? 'Enviando arquivos...' : estaArrastando ? 'Solte os arquivos aqui' : title}\n </p>\n\n {descricaoPadrao && (\n <p className=\"text-xs text-muted-foreground\">\n {descricaoPadrao}\n </p>\n )}\n\n {!disabled && !isUploading && multiple && maxFiles > 1 && (\n <p className=\"text-xs text-muted-foreground\">\n Você pode selecionar até {maxFiles} arquivo(s)\n </p>\n )}\n </div>\n\n {disabled && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>Upload desabilitado</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["validarTamanhoArquivo","arquivo","tamanhoMaximoMB","bytesMaximos","validarTipoArquivo","tiposAceitos","tiposAceitosArray","t","nomeArquivo","tipoArquivo","tipo","categoria","FileUploadZone","onFilesSelected","accept","multiple","maxFiles","maxSizeMB","disabled","isUploading","title","description","icon","className","onError","estaArrastando","setEstaArrastando","useState","refInput","useRef","gerenciarErro","useCallback","erro","validarEProcessarArquivos","arquivos","arrayArquivos","arquivosValidos","erros","erroTamanho","erroTipo","gerenciarClique","_a","gerenciarMudancaArquivo","gerenciarArrastarSobre","gerenciarArrastarSair","gerenciarSoltar","descricaoPadrao","partes","tipos","jsxs","cn","jsx","Upload","AlertCircle"],"mappings":"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"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { jsxs as l, jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { Upload as W, AlertCircle as M } from "lucide-react";
|
|
3
|
+
import { useState as z, useRef as H, useCallback as c } from "react";
|
|
4
|
+
import { cn as y } from "../utils.js";
|
|
5
|
+
function I(n, t) {
|
|
6
|
+
const u = t * 1024 * 1024;
|
|
7
|
+
return n.size > u ? `Arquivo muito grande. Máximo: ${t}MB` : null;
|
|
8
|
+
}
|
|
9
|
+
function O(n, t) {
|
|
10
|
+
if (!t) return null;
|
|
11
|
+
const u = t.split(",").map((e) => e.trim().toLowerCase()), s = n.name.toLowerCase(), i = n.type.toLowerCase();
|
|
12
|
+
return u.some((e) => {
|
|
13
|
+
if (e.includes("*")) {
|
|
14
|
+
const [q] = e.split("/");
|
|
15
|
+
return i.startsWith(q + "/");
|
|
16
|
+
}
|
|
17
|
+
return e.startsWith(".") ? s.endsWith(e) : i === e;
|
|
18
|
+
}) ? null : "Tipo de arquivo não suportado";
|
|
19
|
+
}
|
|
20
|
+
function J({
|
|
21
|
+
onFilesSelected: n,
|
|
22
|
+
accept: t,
|
|
23
|
+
multiple: u = !0,
|
|
24
|
+
maxFiles: s = 10,
|
|
25
|
+
maxSizeMB: i = 50,
|
|
26
|
+
disabled: o = !1,
|
|
27
|
+
isUploading: e = !1,
|
|
28
|
+
title: q = "Clique para fazer upload de arquivos",
|
|
29
|
+
description: D,
|
|
30
|
+
icon: T,
|
|
31
|
+
className: j,
|
|
32
|
+
onError: d
|
|
33
|
+
}) {
|
|
34
|
+
const [f, A] = z(!1), h = H(null), N = c((r) => {
|
|
35
|
+
d == null || d(r);
|
|
36
|
+
}, [d]), v = c((r) => {
|
|
37
|
+
if (!r || r.length === 0) return;
|
|
38
|
+
const x = Array.from(r);
|
|
39
|
+
if (x.length > s) {
|
|
40
|
+
N(`Máximo de ${s} arquivo(s) permitido(s)`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const m = [], g = [];
|
|
44
|
+
for (const p of x) {
|
|
45
|
+
const C = I(p, i);
|
|
46
|
+
if (C) {
|
|
47
|
+
g.push(`${p.name}: ${C}`);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
const $ = O(p, t);
|
|
51
|
+
if ($) {
|
|
52
|
+
g.push(`${p.name}: ${$}`);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
m.push(p);
|
|
56
|
+
}
|
|
57
|
+
g.length > 0 && N(g.join(`
|
|
58
|
+
`)), m.length > 0 && n(m), h.current && (h.current.value = "");
|
|
59
|
+
}, [s, i, t, n, N]), k = c(() => {
|
|
60
|
+
var r;
|
|
61
|
+
o || e || (r = h.current) == null || r.click();
|
|
62
|
+
}, [o, e]), P = c((r) => {
|
|
63
|
+
v(r.target.files);
|
|
64
|
+
}, [v]), V = c((r) => {
|
|
65
|
+
r.preventDefault(), r.stopPropagation(), !o && !e && A(!0);
|
|
66
|
+
}, [o, e]), b = c((r) => {
|
|
67
|
+
r.preventDefault(), r.stopPropagation(), A(!1);
|
|
68
|
+
}, []), L = c((r) => {
|
|
69
|
+
r.preventDefault(), r.stopPropagation(), A(!1), !(o || e) && v(r.dataTransfer.files);
|
|
70
|
+
}, [o, e, v]), w = D || (() => {
|
|
71
|
+
const r = [];
|
|
72
|
+
if (t) {
|
|
73
|
+
const x = t.split(",").map((m) => m.trim().replace(".", "").toUpperCase()).join(", ");
|
|
74
|
+
r.push(x);
|
|
75
|
+
}
|
|
76
|
+
return i && r.push(`máx ${i}MB cada`), r.join(" • ");
|
|
77
|
+
})();
|
|
78
|
+
return /* @__PURE__ */ l(
|
|
79
|
+
"div",
|
|
80
|
+
{
|
|
81
|
+
className: y(
|
|
82
|
+
"relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer",
|
|
83
|
+
"hover:border-primary/50 hover:bg-muted/30",
|
|
84
|
+
f && "border-primary bg-primary/5 scale-[1.02]",
|
|
85
|
+
(o || e) && "opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent",
|
|
86
|
+
e && "animate-pulse",
|
|
87
|
+
j
|
|
88
|
+
),
|
|
89
|
+
onClick: k,
|
|
90
|
+
onDragOver: V,
|
|
91
|
+
onDragLeave: b,
|
|
92
|
+
onDrop: L,
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ a(
|
|
95
|
+
"input",
|
|
96
|
+
{
|
|
97
|
+
ref: h,
|
|
98
|
+
type: "file",
|
|
99
|
+
multiple: u,
|
|
100
|
+
accept: t,
|
|
101
|
+
className: "hidden",
|
|
102
|
+
onChange: P,
|
|
103
|
+
disabled: o || e
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
/* @__PURE__ */ l("div", { className: "flex flex-col items-center gap-3", children: [
|
|
107
|
+
T || /* @__PURE__ */ a("div", { className: y(
|
|
108
|
+
"transition-transform",
|
|
109
|
+
f && "scale-110"
|
|
110
|
+
), children: e ? /* @__PURE__ */ a("div", { className: "h-12 w-12 mx-auto", children: /* @__PURE__ */ l("svg", { className: "animate-spin h-12 w-12 text-primary", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24", children: [
|
|
111
|
+
/* @__PURE__ */ a("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }),
|
|
112
|
+
/* @__PURE__ */ a("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })
|
|
113
|
+
] }) }) : /* @__PURE__ */ a(W, { className: y(
|
|
114
|
+
"h-12 w-12 mx-auto text-muted-foreground transition-colors",
|
|
115
|
+
f && "text-primary"
|
|
116
|
+
) }) }),
|
|
117
|
+
/* @__PURE__ */ l("div", { className: "space-y-1", children: [
|
|
118
|
+
/* @__PURE__ */ a("p", { className: y(
|
|
119
|
+
"font-medium transition-colors",
|
|
120
|
+
f && "text-primary",
|
|
121
|
+
e && "text-muted-foreground"
|
|
122
|
+
), children: e ? "Enviando arquivos..." : f ? "Solte os arquivos aqui" : q }),
|
|
123
|
+
w && /* @__PURE__ */ a("p", { className: "text-xs text-muted-foreground", children: w }),
|
|
124
|
+
!o && !e && u && s > 1 && /* @__PURE__ */ l("p", { className: "text-xs text-muted-foreground", children: [
|
|
125
|
+
"Você pode selecionar até ",
|
|
126
|
+
s,
|
|
127
|
+
" arquivo(s)"
|
|
128
|
+
] })
|
|
129
|
+
] }),
|
|
130
|
+
o && /* @__PURE__ */ l("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
|
|
131
|
+
/* @__PURE__ */ a(M, { className: "h-3 w-3" }),
|
|
132
|
+
/* @__PURE__ */ a("span", { children: "Upload desabilitado" })
|
|
133
|
+
] })
|
|
134
|
+
] })
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
export {
|
|
140
|
+
J as FileUploadZone
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=file-upload-zone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-upload-zone.js","sources":["../../../../src/components/ui/forms/file-upload-zone.tsx"],"sourcesContent":["import { AlertCircle, Upload } from 'lucide-react';\nimport { useCallback, useRef, useState } from 'react';\n\nimport { cn } from '../utils';\n\n/**\n * Props do componente FileUploadZone\n */\nexport interface FileUploadZoneProps {\n /** Callback quando arquivos são selecionados */\n onFilesSelected: (files: File[]) => void;\n\n /** Tipos de arquivo aceitos (ex: \".pdf,.doc,.docx\" ou \"image/*\") */\n accept?: string;\n\n /** Permitir múltiplos arquivos */\n multiple?: boolean;\n\n /** Número máximo de arquivos */\n maxFiles?: number;\n\n /** Tamanho máximo em MB */\n maxSizeMB?: number;\n\n /** Desabilitar upload */\n disabled?: boolean;\n\n /** Estado de loading/upload em andamento */\n isUploading?: boolean;\n\n /** Título da zona de upload */\n title?: string;\n\n /** Descrição da zona de upload */\n description?: string;\n\n /** Ícone customizado */\n icon?: React.ReactNode;\n\n /** Classe CSS adicional */\n className?: string;\n\n /** Callback quando houver erro de validação */\n onError?: (error: string) => void;\n}\n\n/**\n * Valida o tamanho do arquivo\n */\nfunction validarTamanhoArquivo(arquivo: File, tamanhoMaximoMB: number): string | null {\n const bytesMaximos = tamanhoMaximoMB * 1024 * 1024;\n if (arquivo.size > bytesMaximos) {\n return `Arquivo muito grande. Máximo: ${tamanhoMaximoMB}MB`;\n }\n return null;\n}\n\n/**\n * Valida o tipo do arquivo\n */\nfunction validarTipoArquivo(arquivo: File, tiposAceitos?: string): string | null {\n if (!tiposAceitos) return null;\n\n const tiposAceitosArray = tiposAceitos.split(',').map(t => t.trim().toLowerCase());\n const nomeArquivo = arquivo.name.toLowerCase();\n const tipoArquivo = arquivo.type.toLowerCase();\n\n const eValido = tiposAceitosArray.some(tipo => {\n // Wildcard (ex: image/*)\n if (tipo.includes('*')) {\n const [categoria] = tipo.split('/');\n return tipoArquivo.startsWith(categoria + '/');\n }\n\n // Extensão (ex: .pdf)\n if (tipo.startsWith('.')) {\n return nomeArquivo.endsWith(tipo);\n }\n\n // MIME type exato\n return tipoArquivo === tipo;\n });\n\n if (!eValido) {\n return 'Tipo de arquivo não suportado';\n }\n\n return null;\n}\n\n/**\n * Componente de zona de upload com drag-and-drop\n */\nexport function FileUploadZone({\n onFilesSelected,\n accept,\n multiple = true,\n maxFiles = 10,\n maxSizeMB = 50,\n disabled = false,\n isUploading = false,\n title = 'Clique para fazer upload de arquivos',\n description,\n icon,\n className,\n onError,\n}: FileUploadZoneProps) {\n const [estaArrastando, setEstaArrastando] = useState(false);\n const refInput = useRef<HTMLInputElement>(null);\n\n const gerenciarErro = useCallback((erro: string) => {\n onError?.(erro);\n }, [onError]);\n\n const validarEProcessarArquivos = useCallback((arquivos: FileList | null) => {\n if (!arquivos || arquivos.length === 0) return;\n\n const arrayArquivos = Array.from(arquivos);\n\n // Validar número de arquivos\n if (arrayArquivos.length > maxFiles) {\n gerenciarErro(`Máximo de ${maxFiles} arquivo(s) permitido(s)`);\n return;\n }\n\n // Validar cada arquivo\n const arquivosValidos: File[] = [];\n const erros: string[] = [];\n\n for (const arquivo of arrayArquivos) {\n // Validar tamanho\n const erroTamanho = validarTamanhoArquivo(arquivo, maxSizeMB);\n if (erroTamanho) {\n erros.push(`${arquivo.name}: ${erroTamanho}`);\n continue;\n }\n\n // Validar tipo\n const erroTipo = validarTipoArquivo(arquivo, accept);\n if (erroTipo) {\n erros.push(`${arquivo.name}: ${erroTipo}`);\n continue;\n }\n\n arquivosValidos.push(arquivo);\n }\n\n // Mostrar erros\n if (erros.length > 0) {\n gerenciarErro(erros.join('\\n'));\n }\n\n // Processar arquivos válidos\n if (arquivosValidos.length > 0) {\n onFilesSelected(arquivosValidos);\n }\n\n // Limpar input\n if (refInput.current) {\n refInput.current.value = '';\n }\n }, [maxFiles, maxSizeMB, accept, onFilesSelected, gerenciarErro]);\n\n const gerenciarClique = useCallback(() => {\n if (disabled || isUploading) return;\n refInput.current?.click();\n }, [disabled, isUploading]);\n\n const gerenciarMudancaArquivo = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n validarEProcessarArquivos(e.target.files);\n }, [validarEProcessarArquivos]);\n\n const gerenciarArrastarSobre = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled && !isUploading) {\n setEstaArrastando(true);\n }\n }, [disabled, isUploading]);\n\n const gerenciarArrastarSair = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n }, []);\n\n const gerenciarSoltar = useCallback((e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setEstaArrastando(false);\n\n if (disabled || isUploading) return;\n\n validarEProcessarArquivos(e.dataTransfer.files);\n }, [disabled, isUploading, validarEProcessarArquivos]);\n\n const descricaoPadrao = description || (() => {\n const partes: string[] = [];\n\n if (accept) {\n const tipos = accept.split(',').map(t => t.trim().replace('.', '').toUpperCase()).join(', ');\n partes.push(tipos);\n }\n\n if (maxSizeMB) {\n partes.push(`máx ${maxSizeMB}MB cada`);\n }\n\n return partes.join(' • ');\n })();\n\n return (\n <div\n className={cn(\n 'relative border-2 border-dashed rounded-lg p-8 text-center transition-all cursor-pointer',\n 'hover:border-primary/50 hover:bg-muted/30',\n estaArrastando && 'border-primary bg-primary/5 scale-[1.02]',\n (disabled || isUploading) && 'opacity-50 cursor-not-allowed hover:border-dashed hover:bg-transparent',\n isUploading && 'animate-pulse',\n className,\n )}\n onClick={gerenciarClique}\n onDragOver={gerenciarArrastarSobre}\n onDragLeave={gerenciarArrastarSair}\n onDrop={gerenciarSoltar}\n >\n <input\n ref={refInput}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n className=\"hidden\"\n onChange={gerenciarMudancaArquivo}\n disabled={disabled || isUploading}\n />\n\n <div className=\"flex flex-col items-center gap-3\">\n {icon || (\n <div className={cn(\n 'transition-transform',\n estaArrastando && 'scale-110',\n )}>\n {isUploading ? (\n <div className=\"h-12 w-12 mx-auto\">\n <svg className=\"animate-spin h-12 w-12 text-primary\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n </div>\n ) : (\n <Upload className={cn(\n 'h-12 w-12 mx-auto text-muted-foreground transition-colors',\n estaArrastando && 'text-primary',\n )} />\n )}\n </div>\n )}\n\n <div className=\"space-y-1\">\n <p className={cn(\n 'font-medium transition-colors',\n estaArrastando && 'text-primary',\n isUploading && 'text-muted-foreground',\n )}>\n {isUploading ? 'Enviando arquivos...' : estaArrastando ? 'Solte os arquivos aqui' : title}\n </p>\n\n {descricaoPadrao && (\n <p className=\"text-xs text-muted-foreground\">\n {descricaoPadrao}\n </p>\n )}\n\n {!disabled && !isUploading && multiple && maxFiles > 1 && (\n <p className=\"text-xs text-muted-foreground\">\n Você pode selecionar até {maxFiles} arquivo(s)\n </p>\n )}\n </div>\n\n {disabled && (\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <AlertCircle className=\"h-3 w-3\" />\n <span>Upload desabilitado</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["validarTamanhoArquivo","arquivo","tamanhoMaximoMB","bytesMaximos","validarTipoArquivo","tiposAceitos","tiposAceitosArray","t","nomeArquivo","tipoArquivo","tipo","categoria","FileUploadZone","onFilesSelected","accept","multiple","maxFiles","maxSizeMB","disabled","isUploading","title","description","icon","className","onError","estaArrastando","setEstaArrastando","useState","refInput","useRef","gerenciarErro","useCallback","erro","validarEProcessarArquivos","arquivos","arrayArquivos","arquivosValidos","erros","erroTamanho","erroTipo","gerenciarClique","_a","gerenciarMudancaArquivo","e","gerenciarArrastarSobre","gerenciarArrastarSair","gerenciarSoltar","descricaoPadrao","partes","tipos","jsxs","cn","jsx","Upload","AlertCircle"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("react/jsx-runtime"),b=require("react"),I=require("@radix-ui/react-slot"),c=require("react-hook-form"),d=require("../utils.cjs"),j=require("../primitives/label.cjs");function C(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(o,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return o.default=e,Object.freeze(o)}const s=C(b),y=c.FormProvider,l=s.createContext({}),v=({...e})=>m.jsx(l.Provider,{value:{name:e.name},children:m.jsx(c.Controller,{...e})}),i=()=>{const e=s.useContext(l),o=s.useContext(u),{getFieldState:t}=c.useFormContext(),r=c.useFormState({name:e.name}),a=t(e.name,r);if(!e)throw new Error("useFormField should be used within <FormField>");const{id:n}=o;return{id:n,name:e.name,formItemId:`${n}-form-item`,formDescriptionId:`${n}-form-item-description`,formMessageId:`${n}-form-item-message`,...a}},u=s.createContext({}),f=s.forwardRef(({className:e,...o},t)=>{const r=s.useId();return m.jsx(u.Provider,{value:{id:r},children:m.jsx("div",{ref:t,"data-slot":"form-item",className:d.cn("grid gap-2",e),...o})})});f.displayName="FormItem";const F=s.forwardRef(({className:e,...o},t)=>{const{error:r,formItemId:a}=i();return m.jsx(j.Label,{ref:t,"data-slot":"form-label","data-error":!!r,className:d.cn("data-[error=true]:text-destructive",e),htmlFor:a,...o})});F.displayName="FormLabel";const x=s.forwardRef(({...e},o)=>{const{error:t,formItemId:r,formDescriptionId:a,formMessageId:n}=i();return m.jsx(I.Slot,{ref:o,"data-slot":"form-control",id:r,"aria-describedby":t?`${a} ${n}`:`${a}`,"aria-invalid":!!t,...e})});x.displayName="FormControl";const g=s.forwardRef(({className:e,...o},t)=>{const{formDescriptionId:r}=i();return m.jsx("p",{ref:t,"data-slot":"form-description",id:r,className:d.cn("text-muted-foreground text-sm",e),...o})});g.displayName="FormDescription";const p=s.forwardRef(({className:e,...o},t)=>{const{error:r,formMessageId:a}=i(),n=r?String((r==null?void 0:r.message)??""):o.children;return n?m.jsx("p",{ref:t,"data-slot":"form-message",id:a,className:d.cn("text-destructive text-sm",e),...o,children:n}):null});p.displayName="FormMessage";exports.Form=y;exports.FormControl=x;exports.FormDescription=g;exports.FormField=v;exports.FormItem=f;exports.FormLabel=F;exports.FormMessage=p;exports.useFormField=i;
|
|
2
|
+
//# sourceMappingURL=form.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.cjs","sources":["../../../../src/components/ui/forms/form.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport {\n Controller,\n FormProvider,\n useFormContext,\n useFormState,\n type ControllerProps,\n type FieldPath,\n type FieldValues,\n} from \"react-hook-form\";\n\nimport { cn } from \"../utils\";\nimport { Label } from \"../primitives/label\";\n\nconst Form = FormProvider;\n\ntype FormFieldContextValue<\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n> = {\n name: TName;\n};\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n {} as FormFieldContextValue,\n);\n\nconst FormField = <\n TFieldValues extends FieldValues = FieldValues,\n TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n>({\n ...props\n}: ControllerProps<TFieldValues, TName>) => {\n return (\n <FormFieldContext.Provider value={{ name: props.name }}>\n <Controller {...props} />\n </FormFieldContext.Provider>\n );\n};\n\nconst useFormField = () => {\n const fieldContext = React.useContext(FormFieldContext);\n const itemContext = React.useContext(FormItemContext);\n const { getFieldState } = useFormContext();\n const formState = useFormState({ name: fieldContext.name });\n const fieldState = getFieldState(fieldContext.name, formState);\n\n if (!fieldContext) {\n throw new Error(\"useFormField should be used within <FormField>\");\n }\n\n const { id } = itemContext;\n\n return {\n id,\n name: fieldContext.name,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n ...fieldState,\n };\n};\n\ntype FormItemContextValue = {\n id: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n {} as FormItemContextValue,\n);\n\nconst FormItem = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n const id = React.useId();\n\n return (\n <FormItemContext.Provider value={{ id }}>\n <div\n ref={ref}\n data-slot=\"form-item\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n </FormItemContext.Provider>\n );\n});\nFormItem.displayName = \"FormItem\";\n\nconst FormLabel = React.forwardRef<\n React.ElementRef<typeof Label>,\n React.ComponentPropsWithoutRef<typeof Label>\n>(({ className, ...props }, ref) => {\n const { error, formItemId } = useFormField();\n\n return (\n <Label\n ref={ref}\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-destructive\", className)}\n htmlFor={formItemId}\n {...props}\n />\n );\n});\nFormLabel.displayName = \"FormLabel\";\n\nconst FormControl = React.forwardRef<\n React.ElementRef<typeof Slot>,\n React.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n const { error, formItemId, formDescriptionId, formMessageId } =\n useFormField();\n\n return (\n <Slot\n ref={ref}\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={\n !error\n ? `${formDescriptionId}`\n : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n {...props}\n />\n );\n});\nFormControl.displayName = \"FormControl\";\n\nconst FormDescription = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<\"p\">\n>(({ className, ...props }, ref) => {\n const { formDescriptionId } = useFormField();\n\n return (\n <p\n ref={ref}\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n );\n});\nFormDescription.displayName = \"FormDescription\";\n\nconst FormMessage = React.forwardRef<\n HTMLParagraphElement,\n React.ComponentProps<\"p\">\n>(({ className, ...props }, ref) => {\n const { error, formMessageId } = useFormField();\n const body = error ? String(error?.message ?? \"\") : props.children;\n\n if (!body) {\n return null;\n }\n\n return (\n <p\n ref={ref}\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(\"text-destructive text-sm\", className)}\n {...props}\n >\n {body}\n </p>\n );\n});\nFormMessage.displayName = \"FormMessage\";\n\nexport {\n useFormField,\n Form,\n FormItem,\n FormLabel,\n FormControl,\n FormDescription,\n FormMessage,\n FormField,\n};\n"],"names":["Form","FormProvider","FormFieldContext","React","FormField","props","jsx","Controller","useFormField","fieldContext","itemContext","FormItemContext","getFieldState","useFormContext","formState","useFormState","fieldState","id","FormItem","className","ref","cn","FormLabel","error","formItemId","Label","FormControl","formDescriptionId","formMessageId","Slot","FormDescription","FormMessage","body"],"mappings":"6iBAiBMA,EAAOC,EAAAA,aASPC,EAAmBC,EAAM,cAC7B,CAAA,CACF,EAEMC,EAAY,CAGhB,CACA,GAAGC,CACL,IAEIC,EAAAA,IAACJ,EAAiB,SAAjB,CAA0B,MAAO,CAAE,KAAMG,EAAM,IAAA,EAC9C,SAAAC,EAAAA,IAACC,EAAAA,WAAA,CAAY,GAAGF,EAAO,EACzB,EAIEG,EAAe,IAAM,CACzB,MAAMC,EAAeN,EAAM,WAAWD,CAAgB,EAChDQ,EAAcP,EAAM,WAAWQ,CAAe,EAC9C,CAAE,cAAAC,CAAA,EAAkBC,iBAAA,EACpBC,EAAYC,EAAAA,aAAa,CAAE,KAAMN,EAAa,KAAM,EACpDO,EAAaJ,EAAcH,EAAa,KAAMK,CAAS,EAE7D,GAAI,CAACL,EACH,MAAM,IAAI,MAAM,gDAAgD,EAGlE,KAAM,CAAE,GAAAQ,GAAOP,EAEf,MAAO,CACL,GAAAO,EACA,KAAMR,EAAa,KACnB,WAAY,GAAGQ,CAAE,aACjB,kBAAmB,GAAGA,CAAE,yBACxB,cAAe,GAAGA,CAAE,qBACpB,GAAGD,CAAA,CAEP,EAMML,EAAkBR,EAAM,cAC5B,CAAA,CACF,EAEMe,EAAWf,EAAM,WAGrB,CAAC,CAAE,UAAAgB,EAAW,GAAGd,CAAA,EAASe,IAAQ,CAClC,MAAMH,EAAKd,EAAM,MAAA,EAEjB,aACGQ,EAAgB,SAAhB,CAAyB,MAAO,CAAE,GAAAM,GACjC,SAAAX,EAAAA,IAAC,MAAA,CACC,IAAAc,EACA,YAAU,YACV,UAAWC,EAAAA,GAAG,aAAcF,CAAS,EACpC,GAAGd,CAAA,CAAA,EAER,CAEJ,CAAC,EACDa,EAAS,YAAc,WAEvB,MAAMI,EAAYnB,EAAM,WAGtB,CAAC,CAAE,UAAAgB,EAAW,GAAGd,CAAA,EAASe,IAAQ,CAClC,KAAM,CAAE,MAAAG,EAAO,WAAAC,CAAA,EAAehB,EAAA,EAE9B,OACEF,EAAAA,IAACmB,EAAAA,MAAA,CACC,IAAAL,EACA,YAAU,aACV,aAAY,CAAC,CAACG,EACd,UAAWF,EAAAA,GAAG,qCAAsCF,CAAS,EAC7D,QAASK,EACR,GAAGnB,CAAA,CAAA,CAGV,CAAC,EACDiB,EAAU,YAAc,YAExB,MAAMI,EAAcvB,EAAM,WAGxB,CAAC,CAAE,GAAGE,CAAA,EAASe,IAAQ,CACvB,KAAM,CAAE,MAAAG,EAAO,WAAAC,EAAY,kBAAAG,EAAmB,cAAAC,CAAA,EAC5CpB,EAAA,EAEF,OACEF,EAAAA,IAACuB,EAAAA,KAAA,CACC,IAAAT,EACA,YAAU,eACV,GAAII,EACJ,mBACGD,EAEG,GAAGI,CAAiB,IAAIC,CAAa,GADrC,GAAGD,CAAiB,GAG1B,eAAc,CAAC,CAACJ,EACf,GAAGlB,CAAA,CAAA,CAGV,CAAC,EACDqB,EAAY,YAAc,cAE1B,MAAMI,EAAkB3B,EAAM,WAG5B,CAAC,CAAE,UAAAgB,EAAW,GAAGd,CAAA,EAASe,IAAQ,CAClC,KAAM,CAAE,kBAAAO,CAAA,EAAsBnB,EAAA,EAE9B,OACEF,EAAAA,IAAC,IAAA,CACC,IAAAc,EACA,YAAU,mBACV,GAAIO,EACJ,UAAWN,EAAAA,GAAG,gCAAiCF,CAAS,EACvD,GAAGd,CAAA,CAAA,CAGV,CAAC,EACDyB,EAAgB,YAAc,kBAE9B,MAAMC,EAAc5B,EAAM,WAGxB,CAAC,CAAE,UAAAgB,EAAW,GAAGd,CAAA,EAASe,IAAQ,CAClC,KAAM,CAAE,MAAAG,EAAO,cAAAK,CAAA,EAAkBpB,EAAA,EAC3BwB,EAAOT,EAAQ,QAAOA,GAAA,YAAAA,EAAO,UAAW,EAAE,EAAIlB,EAAM,SAE1D,OAAK2B,EAKH1B,EAAAA,IAAC,IAAA,CACC,IAAAc,EACA,YAAU,eACV,GAAIQ,EACJ,UAAWP,EAAAA,GAAG,2BAA4BF,CAAS,EAClD,GAAGd,EAEH,SAAA2B,CAAA,CAAA,EAXI,IAcX,CAAC,EACDD,EAAY,YAAc"}
|