indas-ui 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1014) hide show
  1. package/dist/cjs/components/auth/ProtectedRoute.js +48 -0
  2. package/dist/cjs/components/auth/UnauthorizedPage.js +19 -0
  3. package/dist/cjs/components/auth/index.js +9 -0
  4. package/dist/cjs/components/chat/ai-messages.js +271 -0
  5. package/dist/cjs/components/chat/chat-prompt-navigator.js +110 -0
  6. package/dist/cjs/components/chat/chat.js +1032 -0
  7. package/dist/cjs/components/chat/index.js +19 -0
  8. package/dist/cjs/components/chat/multimodal-input.js +119 -0
  9. package/dist/cjs/components/dashboard/DrillDownModal.js +36 -0
  10. package/dist/cjs/components/dashboard/FilterBar.js +434 -0
  11. package/dist/cjs/components/dashboard/Tooltip.js +86 -0
  12. package/dist/cjs/components/dashboard/charts/Area.js +127 -0
  13. package/dist/cjs/components/dashboard/charts/Bar.js +111 -0
  14. package/dist/cjs/components/dashboard/charts/BoxPlot.js +118 -0
  15. package/dist/cjs/components/dashboard/charts/Bubble.js +102 -0
  16. package/dist/cjs/components/dashboard/charts/DashboardCard.js +12 -0
  17. package/dist/cjs/components/dashboard/charts/Donut.js +130 -0
  18. package/dist/cjs/components/dashboard/charts/FlowMap.js +238 -0
  19. package/dist/cjs/components/dashboard/charts/Funnel.js +38 -0
  20. package/dist/cjs/components/dashboard/charts/Gantt.js +271 -0
  21. package/dist/cjs/components/dashboard/charts/Gauge.js +143 -0
  22. package/dist/cjs/components/dashboard/charts/GeoMap.js +164 -0
  23. package/dist/cjs/components/dashboard/charts/Heatmap.js +116 -0
  24. package/dist/cjs/components/dashboard/charts/Line.js +75 -0
  25. package/dist/cjs/components/dashboard/charts/Pareto.js +110 -0
  26. package/dist/cjs/components/dashboard/charts/Radar.js +94 -0
  27. package/dist/cjs/components/dashboard/charts/Sankey.js +92 -0
  28. package/dist/cjs/components/dashboard/charts/Scatter.js +128 -0
  29. package/dist/cjs/components/dashboard/charts/Sparkline.js +134 -0
  30. package/dist/cjs/components/dashboard/charts/Treemap.js +104 -0
  31. package/dist/cjs/components/dashboard/charts/index.js +45 -0
  32. package/dist/cjs/components/dashboard/charts/india-map.js +464 -0
  33. package/dist/cjs/components/dashboard/charts/theme.js +132 -0
  34. package/dist/cjs/components/dashboard/config.js +118 -0
  35. package/dist/cjs/components/dashboard/index.js +39 -0
  36. package/dist/cjs/components/dashboard/kpi/KpiBeforeAfter.js +16 -0
  37. package/dist/cjs/components/dashboard/kpi/KpiBreakdown.js +42 -0
  38. package/dist/cjs/components/dashboard/kpi/KpiComparison.js +41 -0
  39. package/dist/cjs/components/dashboard/kpi/KpiQuickStats.js +41 -0
  40. package/dist/cjs/components/dashboard/kpi/KpiRating.js +38 -0
  41. package/dist/cjs/components/dashboard/kpi/KpiScroll.js +83 -0
  42. package/dist/cjs/components/dashboard/kpi/KpiTrend.js +37 -0
  43. package/dist/cjs/components/dashboard/kpi/index.js +22 -0
  44. package/dist/cjs/components/dashboard/kpi/kpi-shell.js +113 -0
  45. package/dist/cjs/components/dashboard/time-range.js +126 -0
  46. package/dist/cjs/components/datagrid/DataGrid.js +1613 -0
  47. package/dist/cjs/components/datagrid/cells/BooleanCell.js +42 -0
  48. package/dist/cjs/components/datagrid/cells/CellRenderer.js +142 -0
  49. package/dist/cjs/components/datagrid/cells/EditableCell.js +217 -0
  50. package/dist/cjs/components/datagrid/cells/SelectionCell.js +60 -0
  51. package/dist/cjs/components/datagrid/cells/index.js +6 -0
  52. package/dist/cjs/components/datagrid/columns/ActionsColumn.js +485 -0
  53. package/dist/cjs/components/datagrid/columns/ColumnContextMenu.js +341 -0
  54. package/dist/cjs/components/datagrid/columns/DraggableColumnHeader.js +150 -0
  55. package/dist/cjs/components/datagrid/controls/AutoResizeButton.js +10 -0
  56. package/dist/cjs/components/datagrid/controls/PaginationControls.js +38 -0
  57. package/dist/cjs/components/datagrid/controls/SummaryControls.js +30 -0
  58. package/dist/cjs/components/datagrid/controls/menu/ActionsMenu.js +16 -0
  59. package/dist/cjs/components/datagrid/controls/menu/column/ColumnChooserModal.js +25 -0
  60. package/dist/cjs/components/datagrid/controls/menu/column/ColumnSection.js +10 -0
  61. package/dist/cjs/components/datagrid/controls/menu/export/ExportSection.js +19 -0
  62. package/dist/cjs/components/datagrid/controls/menu/export/export.js +227 -0
  63. package/dist/cjs/components/datagrid/controls/menu/filter/AdvancedFilterModal.js +405 -0
  64. package/dist/cjs/components/datagrid/controls/menu/filter/FilterSection.js +9 -0
  65. package/dist/cjs/components/datagrid/controls/menu/grouping/GroupingSection.js +23 -0
  66. package/dist/cjs/components/datagrid/controls/menu/grouping/index.js +6 -0
  67. package/dist/cjs/components/datagrid/controls/menu/import/ImportSection.js +75 -0
  68. package/dist/cjs/components/datagrid/controls/menu/import/import.js +232 -0
  69. package/dist/cjs/components/datagrid/controls/menu/index.js +24 -0
  70. package/dist/cjs/components/datagrid/controls/menu/view/CardView.js +176 -0
  71. package/dist/cjs/components/datagrid/controls/menu/view/ChartView.js +401 -0
  72. package/dist/cjs/components/datagrid/controls/menu/view/ViewSection.js +12 -0
  73. package/dist/cjs/components/datagrid/hooks/useCellRangeSelection.js +127 -0
  74. package/dist/cjs/components/datagrid/hooks/useClipboard.js +154 -0
  75. package/dist/cjs/components/datagrid/hooks/useDataGridState.js +115 -0
  76. package/dist/cjs/components/datagrid/hooks/useKeyboardNavigation.js +120 -0
  77. package/dist/cjs/components/datagrid/index.js +90 -0
  78. package/dist/cjs/components/datagrid/rows/DraggableRow.js +34 -0
  79. package/dist/cjs/components/datagrid/rows/ExpandableRow.js +184 -0
  80. package/dist/cjs/components/datagrid/rows/FilterRow.js +188 -0
  81. package/dist/cjs/components/datagrid/rows/SelectColumn.js +34 -0
  82. package/dist/cjs/components/datagrid/rows/SummaryRow.js +34 -0
  83. package/dist/cjs/components/datagrid/rows/summary.js +67 -0
  84. package/dist/cjs/components/datagrid/search/InlineSearchCell.js +99 -0
  85. package/dist/cjs/components/datagrid/search/SearchHighlighter.js +133 -0
  86. package/dist/cjs/components/datagrid/search/SearchNavigator.js +185 -0
  87. package/dist/cjs/components/datagrid/search/SearchNewModal.js +238 -0
  88. package/dist/cjs/components/datagrid/search/advancedSearch.js +112 -0
  89. package/dist/cjs/components/datagrid/utils/grid-helpers.js +102 -0
  90. package/dist/cjs/components/datagrid/utils/grid-types.js +3 -0
  91. package/dist/cjs/components/draft/AutoSaveIndicator.js +70 -0
  92. package/dist/cjs/components/draft/DraftModal.js +220 -0
  93. package/dist/cjs/components/forms/date-picker/CalendarView.js +82 -0
  94. package/dist/cjs/components/forms/date-picker/DatePicker.js +748 -0
  95. package/dist/cjs/components/forms/date-picker/DateTimePicker.js +174 -0
  96. package/dist/cjs/components/forms/date-picker/index.js +21 -0
  97. package/dist/cjs/components/forms/date-picker/shared-utils.js +24 -0
  98. package/dist/cjs/components/forms/dropdown/Dropdown.js +427 -0
  99. package/dist/cjs/components/forms/dropdown/MultiSelect.js +136 -0
  100. package/dist/cjs/components/forms/dropdown/SingleSelect.js +254 -0
  101. package/dist/cjs/components/forms/dropdown/hooks/useDropdownCreate.js +88 -0
  102. package/dist/cjs/components/forms/dropdown/hooks/useDropdownFiltering.js +87 -0
  103. package/dist/cjs/components/forms/dropdown/hooks/useDropdownState.js +63 -0
  104. package/dist/cjs/components/forms/dropdown/index.js +6 -0
  105. package/dist/cjs/components/forms/dropdown/types.js +3 -0
  106. package/dist/cjs/components/forms/file-attachment/EmailPreview.js +419 -0
  107. package/dist/cjs/components/forms/file-attachment/FileAttachment.js +966 -0
  108. package/dist/cjs/components/forms/file-attachment/index.js +6 -0
  109. package/dist/cjs/components/forms/index.js +16 -0
  110. package/dist/cjs/components/forms/quantity-input-popup.js +135 -0
  111. package/dist/cjs/components/forms/remark-input/RemarkInput.js +263 -0
  112. package/dist/cjs/components/forms/remark-input/index.js +8 -0
  113. package/dist/cjs/components/forms/unified-currency-dropdown.js +202 -0
  114. package/dist/cjs/components/index.js +41 -0
  115. package/dist/cjs/components/layout/SidebarContextMenu.js +179 -0
  116. package/dist/cjs/components/layout/app-shell.js +81 -0
  117. package/dist/cjs/components/layout/bottom-nav.js +262 -0
  118. package/dist/cjs/components/layout/floating-action-button.js +77 -0
  119. package/dist/cjs/components/layout/footer.js +60 -0
  120. package/dist/cjs/components/layout/index.js +18 -0
  121. package/dist/cjs/components/layout/mobile-menu-sheet.js +195 -0
  122. package/dist/cjs/components/layout/side-panel.js +118 -0
  123. package/dist/cjs/components/layout/sidebar.js +581 -0
  124. package/dist/cjs/components/layout/top-header.js +270 -0
  125. package/dist/cjs/components/layout/userprofile-dropdown.js +100 -0
  126. package/dist/cjs/components/master/editable-cells/EditableCell.js +106 -0
  127. package/dist/cjs/components/master/editable-cells/index.js +17 -0
  128. package/dist/cjs/components/master/index.js +9 -0
  129. package/dist/cjs/components/messaging/conversation-list.js +109 -0
  130. package/dist/cjs/components/messaging/create-conversation-modal.js +112 -0
  131. package/dist/cjs/components/messaging/message-bubble.js +69 -0
  132. package/dist/cjs/components/messaging/message-input.js +154 -0
  133. package/dist/cjs/components/messaging/message-thread.js +124 -0
  134. package/dist/cjs/components/messaging/messaging-panel-content.js +69 -0
  135. package/dist/cjs/components/messaging/thread-panel.js +50 -0
  136. package/dist/cjs/components/modals/3DModal.js +35 -0
  137. package/dist/cjs/components/modals/ImageModal.js +587 -0
  138. package/dist/cjs/components/modals/Modal.js +311 -0
  139. package/dist/cjs/components/modals/StandardModal.js +28 -0
  140. package/dist/cjs/components/modals/api-config-modal.js +120 -0
  141. package/dist/cjs/components/modals/global-api-config-modal.js +127 -0
  142. package/dist/cjs/components/modals/index.js +17 -0
  143. package/dist/cjs/components/modals/logout-modal.js +45 -0
  144. package/dist/cjs/components/modals/modal-alert.js +295 -0
  145. package/dist/cjs/components/modals/password-reset-modal.js +112 -0
  146. package/dist/cjs/components/modals/session-expiry-warning.js +18 -0
  147. package/dist/cjs/components/providers/api-provider.js +19 -0
  148. package/dist/cjs/components/providers/query-provider.js +29 -0
  149. package/dist/cjs/components/providers/session-provider.js +119 -0
  150. package/dist/cjs/components/theme/ThemeCustomizer.js +184 -0
  151. package/dist/cjs/components/ui/buttons/button.js +264 -0
  152. package/dist/cjs/components/ui/card.js +58 -0
  153. package/dist/cjs/components/ui/chart.js +160 -0
  154. package/dist/cjs/components/ui/display/boolean-badge.js +29 -0
  155. package/dist/cjs/components/ui/display/card.js +20 -0
  156. package/dist/cjs/components/ui/display/collapsible.js +44 -0
  157. package/dist/cjs/components/ui/display/separator.js +44 -0
  158. package/dist/cjs/components/ui/display/stats-card.js +29 -0
  159. package/dist/cjs/components/ui/display/text.js +94 -0
  160. package/dist/cjs/components/ui/feedback/alert.js +61 -0
  161. package/dist/cjs/components/ui/feedback/badge.js +93 -0
  162. package/dist/cjs/components/ui/feedback/progress.js +44 -0
  163. package/dist/cjs/components/ui/feedback/reminder-button.js +111 -0
  164. package/dist/cjs/components/ui/feedback/skeleton-table.js +20 -0
  165. package/dist/cjs/components/ui/feedback/skeleton.js +53 -0
  166. package/dist/cjs/components/ui/feedback/tooltip.js +54 -0
  167. package/dist/cjs/components/ui/form-toggle.js +47 -0
  168. package/dist/cjs/components/ui/forms/checkbox.js +24 -0
  169. package/dist/cjs/components/ui/forms/input.js +111 -0
  170. package/dist/cjs/components/ui/forms/label.js +10 -0
  171. package/dist/cjs/components/ui/forms/switch.js +58 -0
  172. package/dist/cjs/components/ui/forms/textarea.js +49 -0
  173. package/dist/cjs/components/ui/index.js +157 -0
  174. package/dist/cjs/components/ui/navigation/dropdown-menu.js +84 -0
  175. package/dist/cjs/components/ui/navigation/header-steps.js +51 -0
  176. package/dist/cjs/components/ui/navigation/tabs.js +97 -0
  177. package/dist/cjs/components/ui/overlays/loading.js +169 -0
  178. package/dist/cjs/components/ui/select.js +72 -0
  179. package/dist/cjs/config/api.js +65 -0
  180. package/dist/cjs/contexts/AppConfigContext.js +37 -0
  181. package/dist/cjs/contexts/CurrencyContext.js +336 -0
  182. package/dist/cjs/contexts/DeviceContext.js +106 -0
  183. package/dist/cjs/contexts/EmailContext.js +727 -0
  184. package/dist/cjs/contexts/GlobalAlertContext.js +232 -0
  185. package/dist/cjs/contexts/ImpactAnalysisContext.js +60 -0
  186. package/dist/cjs/contexts/LanguageContext.js +104 -0
  187. package/dist/cjs/contexts/MessagingContext.js +726 -0
  188. package/dist/cjs/contexts/ModuleAuthContext.js +316 -0
  189. package/dist/cjs/contexts/NavigationContext.js +182 -0
  190. package/dist/cjs/contexts/NetworkStatusContext.js +95 -0
  191. package/dist/cjs/contexts/NotificationContext.js +169 -0
  192. package/dist/cjs/contexts/PageTitleContext.js +28 -0
  193. package/dist/cjs/contexts/SearchPreferencesContext.js +42 -0
  194. package/dist/cjs/contexts/SessionAdapterContext.js +24 -0
  195. package/dist/cjs/contexts/SidebarPreferencesContext.js +116 -0
  196. package/dist/cjs/contexts/ThemeContext.js +193 -0
  197. package/dist/cjs/hooks/index.js +50 -0
  198. package/dist/cjs/hooks/useApproval.js +250 -0
  199. package/dist/cjs/hooks/useBacchaSearch.js +257 -0
  200. package/dist/cjs/hooks/useBusinessAudit.js +54 -0
  201. package/dist/cjs/hooks/useColumnFreezing.js +204 -0
  202. package/dist/cjs/hooks/useColumnMetadata.js +48 -0
  203. package/dist/cjs/hooks/useConditionalFormatting.js +197 -0
  204. package/dist/cjs/hooks/useDebounce.js +49 -0
  205. package/dist/cjs/hooks/useDraft.js +181 -0
  206. package/dist/cjs/hooks/useFormValidation.js +68 -0
  207. package/dist/cjs/hooks/useGridSettings.js +85 -0
  208. package/dist/cjs/hooks/useGridTheme.js +204 -0
  209. package/dist/cjs/hooks/useId.js +21 -0
  210. package/dist/cjs/hooks/useIntelligentColumnSizing.js +315 -0
  211. package/dist/cjs/hooks/useKeyboardNavigation.js +192 -0
  212. package/dist/cjs/hooks/useNotifications.js +63 -0
  213. package/dist/cjs/hooks/usePrevious.js +20 -0
  214. package/dist/cjs/hooks/useRowSelection.js +150 -0
  215. package/dist/cjs/hooks/useSignalR.js +53 -0
  216. package/dist/cjs/hooks/useTheme.js +268 -0
  217. package/dist/cjs/hooks/useTranslation.js +20 -0
  218. package/dist/cjs/hooks/useUnsavedChanges.js +88 -0
  219. package/dist/cjs/index.js +21 -0
  220. package/dist/cjs/lib/api/activity/audit/audit.js +51 -0
  221. package/dist/cjs/lib/api/activity/audit/index.js +29 -0
  222. package/dist/cjs/lib/api/activity/audit/send.js +434 -0
  223. package/dist/cjs/lib/api/activity/email/client.js +467 -0
  224. package/dist/cjs/lib/api/activity/email/index.js +31 -0
  225. package/dist/cjs/lib/api/activity/email/password-reset.js +58 -0
  226. package/dist/cjs/lib/api/activity/email/templates.js +537 -0
  227. package/dist/cjs/lib/api/activity/email/types.js +24 -0
  228. package/dist/cjs/lib/api/activity/index.js +48 -0
  229. package/dist/cjs/lib/api/activity/messaging/messaging.js +254 -0
  230. package/dist/cjs/lib/api/activity/notifications/index.js +43 -0
  231. package/dist/cjs/lib/api/activity/notifications/notifications.js +224 -0
  232. package/dist/cjs/lib/api/activity/notifications/reminders.js +30 -0
  233. package/dist/cjs/lib/api/activity/notifications/send.js +267 -0
  234. package/dist/cjs/lib/api/activity/notifications/types.js +66 -0
  235. package/dist/cjs/lib/api/activity/notify-and-log.js +63 -0
  236. package/dist/cjs/lib/api/activity/remarks/index.js +6 -0
  237. package/dist/cjs/lib/api/activity/remarks/remarks.js +186 -0
  238. package/dist/cjs/lib/api/activity/storage.js +83 -0
  239. package/dist/cjs/lib/api/ai/chat.js +227 -0
  240. package/dist/cjs/lib/api/ai/types.js +6 -0
  241. package/dist/cjs/lib/api/approval/approvals.js +210 -0
  242. package/dist/cjs/lib/api/approval/index.js +13 -0
  243. package/dist/cjs/lib/api/auth/auth.js +154 -0
  244. package/dist/cjs/lib/api/auth/index.js +11 -0
  245. package/dist/cjs/lib/api/auth/password-reset-otp.js +192 -0
  246. package/dist/cjs/lib/api/auth/two-factor-auth.js +94 -0
  247. package/dist/cjs/lib/api/auth/two-factor.js +186 -0
  248. package/dist/cjs/lib/api/core/auth-helpers.js +141 -0
  249. package/dist/cjs/lib/api/core/client.js +305 -0
  250. package/dist/cjs/lib/api/core/config.js +248 -0
  251. package/dist/cjs/lib/api/core/index.js +43 -0
  252. package/dist/cjs/lib/api/core/session-validator.js +98 -0
  253. package/dist/cjs/lib/api/core/types.js +4 -0
  254. package/dist/cjs/lib/api/core/utils.js +70 -0
  255. package/dist/cjs/lib/api/dashboard/costing.js +15 -0
  256. package/dist/cjs/lib/api/dashboard/management.js +11 -0
  257. package/dist/cjs/lib/api/dashboard/sales.js +11 -0
  258. package/dist/cjs/lib/api/draft/drafts.js +279 -0
  259. package/dist/cjs/lib/api/draft/index.js +13 -0
  260. package/dist/cjs/lib/api/enquiry/enquiry.js +624 -0
  261. package/dist/cjs/lib/api/enquiry/index.js +20 -0
  262. package/dist/cjs/lib/api/enquiry/rate-enquiry.js +78 -0
  263. package/dist/cjs/lib/api/estimation/categories.js +113 -0
  264. package/dist/cjs/lib/api/estimation/category-defaults.js +47 -0
  265. package/dist/cjs/lib/api/estimation/company-config.js +26 -0
  266. package/dist/cjs/lib/api/estimation/content.js +210 -0
  267. package/dist/cjs/lib/api/estimation/freight.js +25 -0
  268. package/dist/cjs/lib/api/estimation/grid-costing-drafts.js +30 -0
  269. package/dist/cjs/lib/api/estimation/grid-costing.js +176 -0
  270. package/dist/cjs/lib/api/estimation/index.js +58 -0
  271. package/dist/cjs/lib/api/estimation/legacy-costing.js +51 -0
  272. package/dist/cjs/lib/api/estimation/machines.js +74 -0
  273. package/dist/cjs/lib/api/estimation/planning.js +403 -0
  274. package/dist/cjs/lib/api/estimation/qualities.js +245 -0
  275. package/dist/cjs/lib/api/estimation/quotation-load.js +52 -0
  276. package/dist/cjs/lib/api/estimation/quotation-save.js +109 -0
  277. package/dist/cjs/lib/api/estimation/quote-check.js +34 -0
  278. package/dist/cjs/lib/api/estimation/quotepanel.js +496 -0
  279. package/dist/cjs/lib/api/estimation/shipper-planning.js +220 -0
  280. package/dist/cjs/lib/api/estimation/wastage.js +47 -0
  281. package/dist/cjs/lib/api/index.js +33 -0
  282. package/dist/cjs/lib/api/integration/proxy.js +40 -0
  283. package/dist/cjs/lib/api/master/category.js +215 -0
  284. package/dist/cjs/lib/api/master/company.js +389 -0
  285. package/dist/cjs/lib/api/master/hsn.js +61 -0
  286. package/dist/cjs/lib/api/master/index.js +47 -0
  287. package/dist/cjs/lib/api/master/item.js +142 -0
  288. package/dist/cjs/lib/api/master/ledger.js +398 -0
  289. package/dist/cjs/lib/api/master/logistics.js +119 -0
  290. package/dist/cjs/lib/api/master/machine.js +579 -0
  291. package/dist/cjs/lib/api/master/material-group.js +103 -0
  292. package/dist/cjs/lib/api/master/other.js +63 -0
  293. package/dist/cjs/lib/api/master/process-types.js +5 -0
  294. package/dist/cjs/lib/api/master/process.js +131 -0
  295. package/dist/cjs/lib/api/master/production-units.js +22 -0
  296. package/dist/cjs/lib/api/master/rate.js +203 -0
  297. package/dist/cjs/lib/api/master/tool.js +88 -0
  298. package/dist/cjs/lib/api/master/user.js +154 -0
  299. package/dist/cjs/lib/api/settings/erp-parameters.js +69 -0
  300. package/dist/cjs/lib/api/utility/index.js +11 -0
  301. package/dist/cjs/lib/api/utility/menu.js +136 -0
  302. package/dist/cjs/lib/auth.js +10 -0
  303. package/dist/cjs/lib/pwa.js +59 -0
  304. package/dist/cjs/lib/react-query-config.js +134 -0
  305. package/dist/cjs/lib/security/audit-logger.js +177 -0
  306. package/dist/cjs/lib/security/rate-limiter.js +122 -0
  307. package/dist/cjs/lib/server-url.js +76 -0
  308. package/dist/cjs/lib/svg-utils.js +213 -0
  309. package/dist/cjs/lib/theme/types.js +235 -0
  310. package/dist/cjs/lib/theme/utils.js +363 -0
  311. package/dist/cjs/lib/types/index.js +3 -0
  312. package/dist/cjs/lib/utils/attachment-loader.js +82 -0
  313. package/dist/cjs/lib/utils/client-lead-utils.js +61 -0
  314. package/dist/cjs/lib/utils/device-detection.js +110 -0
  315. package/dist/cjs/lib/utils/logout-cleanup.js +312 -0
  316. package/dist/cjs/lib/utils/planning-prefs.js +31 -0
  317. package/dist/cjs/lib/utils.js +70 -0
  318. package/dist/cjs/lib/vision/dieline-extractor.js +321 -0
  319. package/dist/cjs/lib/vision/reference-grid.js +245 -0
  320. package/dist/cjs/locales/de.json +79 -0
  321. package/dist/cjs/locales/en.json +2217 -0
  322. package/dist/cjs/locales/es.json +79 -0
  323. package/dist/cjs/locales/fr.json +78 -0
  324. package/dist/cjs/locales/hi.json +1599 -0
  325. package/dist/cjs/package.json +1 -0
  326. package/dist/cjs/providers.js +43 -0
  327. package/dist/cjs/services/GlobalLoadingService.js +220 -0
  328. package/{src → dist/cjs}/styles/grid-themes.css +345 -345
  329. package/{src → dist/cjs}/styles/sidebar-scrollbar.css +45 -45
  330. package/{src → dist/cjs}/styles/tokens.css +712 -711
  331. package/dist/cjs/types/approval.js +22 -0
  332. package/dist/cjs/types/audit.js +50 -0
  333. package/dist/cjs/types/draft.js +22 -0
  334. package/dist/cjs/types/master.js +4 -0
  335. package/dist/cjs/types/shipper-planning.js +7 -0
  336. package/dist/components/auth/ProtectedRoute.d.ts +6 -0
  337. package/dist/components/auth/ProtectedRoute.js +45 -0
  338. package/dist/components/auth/UnauthorizedPage.d.ts +6 -0
  339. package/dist/components/auth/UnauthorizedPage.js +15 -0
  340. package/dist/components/auth/index.d.ts +2 -0
  341. package/dist/components/auth/index.js +3 -0
  342. package/dist/components/chat/ai-messages.d.ts +32 -0
  343. package/dist/components/chat/ai-messages.js +265 -0
  344. package/dist/components/chat/chat-prompt-navigator.d.ts +9 -0
  345. package/dist/components/chat/chat-prompt-navigator.js +107 -0
  346. package/dist/components/chat/chat.d.ts +46 -0
  347. package/dist/components/chat/chat.js +1029 -0
  348. package/dist/components/chat/index.d.ts +5 -0
  349. package/dist/components/chat/index.js +13 -0
  350. package/dist/components/chat/multimodal-input.d.ts +12 -0
  351. package/dist/components/chat/multimodal-input.js +116 -0
  352. package/dist/components/dashboard/DrillDownModal.d.ts +15 -0
  353. package/dist/components/dashboard/DrillDownModal.js +33 -0
  354. package/dist/components/dashboard/FilterBar.d.ts +108 -0
  355. package/dist/components/dashboard/FilterBar.js +428 -0
  356. package/dist/components/dashboard/Tooltip.d.ts +24 -0
  357. package/dist/components/dashboard/Tooltip.js +50 -0
  358. package/dist/components/dashboard/charts/Area.d.ts +28 -0
  359. package/dist/components/dashboard/charts/Area.js +121 -0
  360. package/dist/components/dashboard/charts/Bar.d.ts +27 -0
  361. package/dist/components/dashboard/charts/Bar.js +105 -0
  362. package/dist/components/dashboard/charts/BoxPlot.d.ts +23 -0
  363. package/dist/components/dashboard/charts/BoxPlot.js +112 -0
  364. package/dist/components/dashboard/charts/Bubble.d.ts +36 -0
  365. package/dist/components/dashboard/charts/Bubble.js +96 -0
  366. package/dist/components/dashboard/charts/DashboardCard.d.ts +12 -0
  367. package/dist/components/dashboard/charts/DashboardCard.js +9 -0
  368. package/dist/components/dashboard/charts/Donut.d.ts +23 -0
  369. package/dist/components/dashboard/charts/Donut.js +124 -0
  370. package/dist/components/dashboard/charts/FlowMap.d.ts +38 -0
  371. package/dist/components/dashboard/charts/FlowMap.js +199 -0
  372. package/dist/components/dashboard/charts/Funnel.d.ts +30 -0
  373. package/dist/components/dashboard/charts/Funnel.js +35 -0
  374. package/dist/components/dashboard/charts/Gantt.d.ts +26 -0
  375. package/dist/components/dashboard/charts/Gantt.js +265 -0
  376. package/dist/components/dashboard/charts/Gauge.d.ts +25 -0
  377. package/dist/components/dashboard/charts/Gauge.js +137 -0
  378. package/dist/components/dashboard/charts/GeoMap.d.ts +38 -0
  379. package/dist/components/dashboard/charts/GeoMap.js +125 -0
  380. package/dist/components/dashboard/charts/Heatmap.d.ts +31 -0
  381. package/dist/components/dashboard/charts/Heatmap.js +110 -0
  382. package/dist/components/dashboard/charts/Line.d.ts +33 -0
  383. package/dist/components/dashboard/charts/Line.js +69 -0
  384. package/dist/components/dashboard/charts/Pareto.d.ts +21 -0
  385. package/dist/components/dashboard/charts/Pareto.js +104 -0
  386. package/dist/components/dashboard/charts/Radar.d.ts +32 -0
  387. package/dist/components/dashboard/charts/Radar.js +88 -0
  388. package/dist/components/dashboard/charts/Sankey.d.ts +43 -0
  389. package/dist/components/dashboard/charts/Sankey.js +86 -0
  390. package/dist/components/dashboard/charts/Scatter.d.ts +38 -0
  391. package/dist/components/dashboard/charts/Scatter.js +122 -0
  392. package/dist/components/dashboard/charts/Sparkline.d.ts +37 -0
  393. package/dist/components/dashboard/charts/Sparkline.js +128 -0
  394. package/dist/components/dashboard/charts/Treemap.d.ts +30 -0
  395. package/dist/components/dashboard/charts/Treemap.js +98 -0
  396. package/dist/components/dashboard/charts/index.d.ts +38 -0
  397. package/dist/components/dashboard/charts/index.js +23 -0
  398. package/dist/components/dashboard/charts/india-map.d.ts +22 -0
  399. package/dist/components/dashboard/charts/india-map.js +461 -0
  400. package/dist/components/dashboard/charts/theme.d.ts +107 -0
  401. package/dist/components/dashboard/charts/theme.js +124 -0
  402. package/dist/components/dashboard/config.d.ts +96 -0
  403. package/dist/components/dashboard/config.js +113 -0
  404. package/dist/components/dashboard/index.d.ts +10 -0
  405. package/dist/components/dashboard/index.js +13 -0
  406. package/dist/components/dashboard/kpi/KpiBeforeAfter.d.ts +31 -0
  407. package/dist/components/dashboard/kpi/KpiBeforeAfter.js +13 -0
  408. package/dist/components/dashboard/kpi/KpiBreakdown.d.ts +31 -0
  409. package/dist/components/dashboard/kpi/KpiBreakdown.js +39 -0
  410. package/dist/components/dashboard/kpi/KpiComparison.d.ts +36 -0
  411. package/dist/components/dashboard/kpi/KpiComparison.js +38 -0
  412. package/dist/components/dashboard/kpi/KpiQuickStats.d.ts +30 -0
  413. package/dist/components/dashboard/kpi/KpiQuickStats.js +38 -0
  414. package/dist/components/dashboard/kpi/KpiRating.d.ts +46 -0
  415. package/dist/components/dashboard/kpi/KpiRating.js +35 -0
  416. package/dist/components/dashboard/kpi/KpiScroll.d.ts +63 -0
  417. package/dist/components/dashboard/kpi/KpiScroll.js +80 -0
  418. package/dist/components/dashboard/kpi/KpiTrend.d.ts +28 -0
  419. package/dist/components/dashboard/kpi/KpiTrend.js +34 -0
  420. package/dist/components/dashboard/kpi/index.d.ts +16 -0
  421. package/dist/components/dashboard/kpi/index.js +10 -0
  422. package/dist/components/dashboard/kpi/kpi-shell.d.ts +44 -0
  423. package/dist/components/dashboard/kpi/kpi-shell.js +108 -0
  424. package/dist/components/dashboard/time-range.d.ts +12 -0
  425. package/dist/components/dashboard/time-range.js +118 -0
  426. package/dist/components/datagrid/DataGrid.d.ts +126 -0
  427. package/dist/components/datagrid/DataGrid.js +1577 -0
  428. package/dist/components/datagrid/cells/BooleanCell.d.ts +15 -0
  429. package/dist/components/datagrid/cells/BooleanCell.js +39 -0
  430. package/dist/components/datagrid/cells/CellRenderer.d.ts +25 -0
  431. package/dist/components/datagrid/cells/CellRenderer.js +139 -0
  432. package/dist/components/datagrid/cells/EditableCell.d.ts +35 -0
  433. package/dist/components/datagrid/cells/EditableCell.js +179 -0
  434. package/dist/components/datagrid/cells/SelectionCell.d.ts +11 -0
  435. package/dist/components/datagrid/cells/SelectionCell.js +58 -0
  436. package/dist/components/datagrid/cells/index.d.ts +1 -0
  437. package/dist/components/datagrid/cells/index.js +2 -0
  438. package/dist/components/datagrid/columns/ActionsColumn.d.ts +174 -0
  439. package/dist/components/datagrid/columns/ActionsColumn.js +448 -0
  440. package/dist/components/datagrid/columns/ColumnContextMenu.d.ts +16 -0
  441. package/dist/components/datagrid/columns/ColumnContextMenu.js +338 -0
  442. package/dist/components/datagrid/columns/DraggableColumnHeader.d.ts +19 -0
  443. package/dist/components/datagrid/columns/DraggableColumnHeader.js +147 -0
  444. package/dist/components/datagrid/controls/AutoResizeButton.d.ts +8 -0
  445. package/dist/components/datagrid/controls/AutoResizeButton.js +7 -0
  446. package/dist/components/datagrid/controls/PaginationControls.d.ts +13 -0
  447. package/dist/components/datagrid/controls/PaginationControls.js +34 -0
  448. package/dist/components/datagrid/controls/SummaryControls.d.ts +10 -0
  449. package/dist/components/datagrid/controls/SummaryControls.js +27 -0
  450. package/dist/components/datagrid/controls/menu/ActionsMenu.d.ts +31 -0
  451. package/dist/components/datagrid/controls/menu/ActionsMenu.js +13 -0
  452. package/dist/components/datagrid/controls/menu/column/ColumnChooserModal.d.ts +13 -0
  453. package/dist/components/datagrid/controls/menu/column/ColumnChooserModal.js +22 -0
  454. package/dist/components/datagrid/controls/menu/column/ColumnSection.d.ts +9 -0
  455. package/dist/components/datagrid/controls/menu/column/ColumnSection.js +7 -0
  456. package/dist/components/datagrid/controls/menu/export/ExportSection.d.ts +7 -0
  457. package/dist/components/datagrid/controls/menu/export/ExportSection.js +16 -0
  458. package/dist/components/datagrid/controls/menu/export/export.d.ts +21 -0
  459. package/dist/components/datagrid/controls/menu/export/export.js +187 -0
  460. package/dist/components/datagrid/controls/menu/filter/AdvancedFilterModal.d.ts +29 -0
  461. package/dist/components/datagrid/controls/menu/filter/AdvancedFilterModal.js +369 -0
  462. package/dist/components/datagrid/controls/menu/filter/FilterSection.d.ts +12 -0
  463. package/dist/components/datagrid/controls/menu/filter/FilterSection.js +6 -0
  464. package/dist/components/datagrid/controls/menu/grouping/GroupingSection.d.ts +10 -0
  465. package/dist/components/datagrid/controls/menu/grouping/GroupingSection.js +20 -0
  466. package/dist/components/datagrid/controls/menu/grouping/index.d.ts +1 -0
  467. package/dist/components/datagrid/controls/menu/grouping/index.js +2 -0
  468. package/dist/components/datagrid/controls/menu/import/ImportSection.d.ts +6 -0
  469. package/dist/components/datagrid/controls/menu/import/ImportSection.js +72 -0
  470. package/dist/components/datagrid/controls/menu/import/import.d.ts +27 -0
  471. package/dist/components/datagrid/controls/menu/import/import.js +193 -0
  472. package/dist/components/datagrid/controls/menu/index.d.ts +10 -0
  473. package/dist/components/datagrid/controls/menu/index.js +11 -0
  474. package/dist/components/datagrid/controls/menu/view/CardView.d.ts +17 -0
  475. package/dist/components/datagrid/controls/menu/view/CardView.js +173 -0
  476. package/dist/components/datagrid/controls/menu/view/ChartView.d.ts +9 -0
  477. package/dist/components/datagrid/controls/menu/view/ChartView.js +363 -0
  478. package/dist/components/datagrid/controls/menu/view/ViewSection.d.ts +7 -0
  479. package/dist/components/datagrid/controls/menu/view/ViewSection.js +9 -0
  480. package/dist/components/datagrid/hooks/useCellRangeSelection.d.ts +20 -0
  481. package/dist/components/datagrid/hooks/useCellRangeSelection.js +124 -0
  482. package/dist/components/datagrid/hooks/useClipboard.d.ts +15 -0
  483. package/dist/components/datagrid/hooks/useClipboard.js +151 -0
  484. package/dist/components/datagrid/hooks/useDataGridState.d.ts +46 -0
  485. package/dist/components/datagrid/hooks/useDataGridState.js +112 -0
  486. package/dist/components/datagrid/hooks/useKeyboardNavigation.d.ts +18 -0
  487. package/dist/components/datagrid/hooks/useKeyboardNavigation.js +117 -0
  488. package/dist/components/datagrid/index.d.ts +34 -0
  489. package/dist/components/datagrid/index.js +41 -0
  490. package/dist/components/datagrid/rows/DraggableRow.d.ts +33 -0
  491. package/dist/components/datagrid/rows/DraggableRow.js +31 -0
  492. package/dist/components/datagrid/rows/ExpandableRow.d.ts +48 -0
  493. package/dist/components/datagrid/rows/ExpandableRow.js +178 -0
  494. package/dist/components/datagrid/rows/FilterRow.d.ts +10 -0
  495. package/dist/components/datagrid/rows/FilterRow.js +185 -0
  496. package/dist/components/datagrid/rows/SelectColumn.d.ts +2 -0
  497. package/dist/components/datagrid/rows/SelectColumn.js +31 -0
  498. package/dist/components/datagrid/rows/SummaryRow.d.ts +12 -0
  499. package/dist/components/datagrid/rows/SummaryRow.js +31 -0
  500. package/dist/components/datagrid/rows/summary.d.ts +9 -0
  501. package/dist/components/datagrid/rows/summary.js +63 -0
  502. package/dist/components/datagrid/search/InlineSearchCell.d.ts +13 -0
  503. package/dist/components/datagrid/search/InlineSearchCell.js +96 -0
  504. package/dist/components/datagrid/search/SearchHighlighter.d.ts +16 -0
  505. package/dist/components/datagrid/search/SearchHighlighter.js +124 -0
  506. package/dist/components/datagrid/search/SearchNavigator.d.ts +24 -0
  507. package/dist/components/datagrid/search/SearchNavigator.js +148 -0
  508. package/dist/components/datagrid/search/SearchNewModal.d.ts +12 -0
  509. package/dist/components/datagrid/search/SearchNewModal.js +202 -0
  510. package/dist/components/datagrid/search/advancedSearch.d.ts +23 -0
  511. package/dist/components/datagrid/search/advancedSearch.js +109 -0
  512. package/dist/components/datagrid/utils/grid-helpers.d.ts +34 -0
  513. package/dist/components/datagrid/utils/grid-helpers.js +94 -0
  514. package/dist/components/datagrid/utils/grid-types.d.ts +157 -0
  515. package/dist/components/datagrid/utils/grid-types.js +2 -0
  516. package/dist/components/draft/AutoSaveIndicator.d.ts +28 -0
  517. package/dist/components/draft/AutoSaveIndicator.js +67 -0
  518. package/dist/components/draft/DraftModal.d.ts +27 -0
  519. package/dist/components/draft/DraftModal.js +184 -0
  520. package/dist/components/forms/date-picker/CalendarView.d.ts +17 -0
  521. package/dist/components/forms/date-picker/CalendarView.js +46 -0
  522. package/dist/components/forms/date-picker/DatePicker.d.ts +35 -0
  523. package/dist/components/forms/date-picker/DatePicker.js +712 -0
  524. package/dist/components/forms/date-picker/DateTimePicker.d.ts +15 -0
  525. package/dist/components/forms/date-picker/DateTimePicker.js +138 -0
  526. package/dist/components/forms/date-picker/index.d.ts +7 -0
  527. package/dist/components/forms/date-picker/index.js +9 -0
  528. package/dist/components/forms/date-picker/shared-utils.d.ts +6 -0
  529. package/dist/components/forms/date-picker/shared-utils.js +19 -0
  530. package/dist/components/forms/dropdown/Dropdown.d.ts +144 -0
  531. package/dist/components/forms/dropdown/Dropdown.js +384 -0
  532. package/dist/components/forms/dropdown/MultiSelect.d.ts +29 -0
  533. package/dist/components/forms/dropdown/MultiSelect.js +100 -0
  534. package/dist/components/forms/dropdown/SingleSelect.d.ts +39 -0
  535. package/dist/components/forms/dropdown/SingleSelect.js +218 -0
  536. package/dist/components/forms/dropdown/hooks/useDropdownCreate.d.ts +8 -0
  537. package/dist/components/forms/dropdown/hooks/useDropdownCreate.js +52 -0
  538. package/dist/components/forms/dropdown/hooks/useDropdownFiltering.d.ts +5 -0
  539. package/dist/components/forms/dropdown/hooks/useDropdownFiltering.js +51 -0
  540. package/dist/components/forms/dropdown/hooks/useDropdownState.d.ts +7 -0
  541. package/dist/components/forms/dropdown/hooks/useDropdownState.js +27 -0
  542. package/dist/components/forms/dropdown/index.d.ts +2 -0
  543. package/dist/components/forms/dropdown/index.js +2 -0
  544. package/dist/components/forms/dropdown/types.d.ts +67 -0
  545. package/dist/components/forms/dropdown/types.js +2 -0
  546. package/dist/components/forms/file-attachment/EmailPreview.d.ts +5 -0
  547. package/dist/components/forms/file-attachment/EmailPreview.js +383 -0
  548. package/dist/components/forms/file-attachment/FileAttachment.d.ts +30 -0
  549. package/dist/components/forms/file-attachment/FileAttachment.js +930 -0
  550. package/dist/components/forms/file-attachment/index.d.ts +2 -0
  551. package/dist/components/forms/file-attachment/index.js +2 -0
  552. package/dist/components/forms/index.d.ts +9 -0
  553. package/dist/components/forms/index.js +7 -0
  554. package/dist/components/forms/quantity-input-popup.d.ts +10 -0
  555. package/dist/components/forms/quantity-input-popup.js +99 -0
  556. package/dist/components/forms/remark-input/RemarkInput.d.ts +58 -0
  557. package/dist/components/forms/remark-input/RemarkInput.js +258 -0
  558. package/dist/components/forms/remark-input/index.d.ts +1 -0
  559. package/dist/components/forms/remark-input/index.js +2 -0
  560. package/dist/components/forms/unified-currency-dropdown.d.ts +26 -0
  561. package/dist/components/forms/unified-currency-dropdown.js +166 -0
  562. package/dist/components/index.d.ts +14 -0
  563. package/dist/components/index.js +15 -0
  564. package/dist/components/layout/SidebarContextMenu.d.ts +18 -0
  565. package/dist/components/layout/SidebarContextMenu.js +142 -0
  566. package/dist/components/layout/app-shell.d.ts +32 -0
  567. package/dist/components/layout/app-shell.js +43 -0
  568. package/dist/components/layout/bottom-nav.d.ts +28 -0
  569. package/dist/components/layout/bottom-nav.js +219 -0
  570. package/dist/components/layout/floating-action-button.d.ts +10 -0
  571. package/dist/components/layout/floating-action-button.js +74 -0
  572. package/dist/components/layout/footer.d.ts +37 -0
  573. package/dist/components/layout/footer.js +56 -0
  574. package/dist/components/layout/index.d.ts +10 -0
  575. package/dist/components/layout/index.js +7 -0
  576. package/dist/components/layout/mobile-menu-sheet.d.ts +7 -0
  577. package/dist/components/layout/mobile-menu-sheet.js +159 -0
  578. package/dist/components/layout/side-panel.d.ts +50 -0
  579. package/dist/components/layout/side-panel.js +115 -0
  580. package/dist/components/layout/sidebar.d.ts +12 -0
  581. package/dist/components/layout/sidebar.js +542 -0
  582. package/dist/components/layout/top-header.d.ts +8 -0
  583. package/dist/components/layout/top-header.js +234 -0
  584. package/dist/components/layout/userprofile-dropdown.d.ts +1 -0
  585. package/dist/components/layout/userprofile-dropdown.js +97 -0
  586. package/dist/components/master/editable-cells/EditableCell.d.ts +43 -0
  587. package/dist/components/master/editable-cells/EditableCell.js +66 -0
  588. package/dist/components/master/editable-cells/index.d.ts +9 -0
  589. package/dist/components/master/editable-cells/index.js +10 -0
  590. package/dist/components/master/index.d.ts +1 -0
  591. package/dist/components/master/index.js +3 -0
  592. package/dist/components/messaging/conversation-list.d.ts +13 -0
  593. package/dist/components/messaging/conversation-list.js +103 -0
  594. package/dist/components/messaging/create-conversation-modal.d.ts +9 -0
  595. package/dist/components/messaging/create-conversation-modal.js +109 -0
  596. package/dist/components/messaging/message-bubble.d.ts +15 -0
  597. package/dist/components/messaging/message-bubble.js +66 -0
  598. package/dist/components/messaging/message-input.d.ts +17 -0
  599. package/dist/components/messaging/message-input.js +151 -0
  600. package/dist/components/messaging/message-thread.d.ts +10 -0
  601. package/dist/components/messaging/message-thread.js +121 -0
  602. package/dist/components/messaging/messaging-panel-content.d.ts +5 -0
  603. package/dist/components/messaging/messaging-panel-content.js +66 -0
  604. package/dist/components/messaging/thread-panel.d.ts +10 -0
  605. package/dist/components/messaging/thread-panel.js +47 -0
  606. package/dist/components/modals/3DModal.d.ts +39 -0
  607. package/dist/components/modals/3DModal.js +32 -0
  608. package/dist/components/modals/ImageModal.d.ts +28 -0
  609. package/dist/components/modals/ImageModal.js +551 -0
  610. package/dist/components/modals/Modal.d.ts +92 -0
  611. package/dist/components/modals/Modal.js +264 -0
  612. package/dist/components/modals/StandardModal.d.ts +27 -0
  613. package/dist/components/modals/StandardModal.js +25 -0
  614. package/dist/components/modals/api-config-modal.d.ts +7 -0
  615. package/dist/components/modals/api-config-modal.js +117 -0
  616. package/dist/components/modals/global-api-config-modal.d.ts +7 -0
  617. package/dist/components/modals/global-api-config-modal.js +124 -0
  618. package/dist/components/modals/index.d.ts +7 -0
  619. package/dist/components/modals/index.js +8 -0
  620. package/dist/components/modals/logout-modal.d.ts +32 -0
  621. package/dist/components/modals/logout-modal.js +42 -0
  622. package/dist/components/modals/modal-alert.d.ts +139 -0
  623. package/dist/components/modals/modal-alert.js +250 -0
  624. package/dist/components/modals/password-reset-modal.d.ts +11 -0
  625. package/dist/components/modals/password-reset-modal.js +109 -0
  626. package/dist/components/modals/session-expiry-warning.d.ts +12 -0
  627. package/dist/components/modals/session-expiry-warning.js +15 -0
  628. package/dist/components/providers/api-provider.d.ts +10 -0
  629. package/dist/components/providers/api-provider.js +15 -0
  630. package/dist/components/providers/query-provider.d.ts +3 -0
  631. package/dist/components/providers/query-provider.js +26 -0
  632. package/dist/components/providers/session-provider.d.ts +7 -0
  633. package/dist/components/providers/session-provider.js +116 -0
  634. package/dist/components/theme/ThemeCustomizer.d.ts +37 -0
  635. package/dist/components/theme/ThemeCustomizer.js +178 -0
  636. package/dist/components/ui/buttons/button.d.ts +59 -0
  637. package/dist/components/ui/buttons/button.js +228 -0
  638. package/dist/components/ui/card.d.ts +8 -0
  639. package/dist/components/ui/card.js +17 -0
  640. package/dist/components/ui/chart.d.ts +83 -0
  641. package/dist/components/ui/chart.js +113 -0
  642. package/dist/components/ui/display/boolean-badge.d.ts +7 -0
  643. package/dist/components/ui/display/boolean-badge.js +23 -0
  644. package/dist/components/ui/display/card.d.ts +10 -0
  645. package/dist/components/ui/display/card.js +11 -0
  646. package/dist/components/ui/display/collapsible.d.ts +6 -0
  647. package/dist/components/ui/display/collapsible.js +6 -0
  648. package/dist/components/ui/display/separator.d.ts +4 -0
  649. package/dist/components/ui/display/separator.js +8 -0
  650. package/dist/components/ui/display/stats-card.d.ts +22 -0
  651. package/dist/components/ui/display/stats-card.js +25 -0
  652. package/dist/components/ui/display/text.d.ts +14 -0
  653. package/dist/components/ui/display/text.js +57 -0
  654. package/dist/components/ui/feedback/alert.d.ts +8 -0
  655. package/dist/components/ui/feedback/alert.js +23 -0
  656. package/dist/components/ui/feedback/badge.d.ts +49 -0
  657. package/dist/components/ui/feedback/badge.js +87 -0
  658. package/dist/components/ui/feedback/progress.d.ts +4 -0
  659. package/dist/components/ui/feedback/progress.js +8 -0
  660. package/dist/components/ui/feedback/reminder-button.d.ts +22 -0
  661. package/dist/components/ui/feedback/reminder-button.js +75 -0
  662. package/dist/components/ui/feedback/skeleton-table.d.ts +18 -0
  663. package/dist/components/ui/feedback/skeleton-table.js +17 -0
  664. package/dist/components/ui/feedback/skeleton.d.ts +53 -0
  665. package/dist/components/ui/feedback/skeleton.js +48 -0
  666. package/dist/components/ui/feedback/tooltip.d.ts +15 -0
  667. package/dist/components/ui/feedback/tooltip.js +14 -0
  668. package/dist/components/ui/form-toggle.d.ts +57 -0
  669. package/dist/components/ui/form-toggle.js +44 -0
  670. package/dist/components/ui/forms/checkbox.d.ts +6 -0
  671. package/dist/components/ui/forms/checkbox.js +17 -0
  672. package/dist/components/ui/forms/input.d.ts +18 -0
  673. package/dist/components/ui/forms/input.js +75 -0
  674. package/dist/components/ui/forms/label.d.ts +5 -0
  675. package/dist/components/ui/forms/label.js +6 -0
  676. package/dist/components/ui/forms/switch.d.ts +10 -0
  677. package/dist/components/ui/forms/switch.js +22 -0
  678. package/dist/components/ui/forms/textarea.d.ts +8 -0
  679. package/dist/components/ui/forms/textarea.js +13 -0
  680. package/dist/components/ui/index.d.ts +49 -0
  681. package/dist/components/ui/index.js +62 -0
  682. package/dist/components/ui/navigation/dropdown-menu.d.ts +27 -0
  683. package/dist/components/ui/navigation/dropdown-menu.js +34 -0
  684. package/dist/components/ui/navigation/header-steps.d.ts +16 -0
  685. package/dist/components/ui/navigation/header-steps.js +15 -0
  686. package/dist/components/ui/navigation/tabs.d.ts +40 -0
  687. package/dist/components/ui/navigation/tabs.js +59 -0
  688. package/dist/components/ui/overlays/loading.d.ts +47 -0
  689. package/dist/components/ui/overlays/loading.js +131 -0
  690. package/dist/components/ui/select.d.ts +13 -0
  691. package/dist/components/ui/select.js +27 -0
  692. package/dist/config/api.d.ts +30 -0
  693. package/dist/config/api.js +58 -0
  694. package/dist/contexts/AppConfigContext.d.ts +13 -0
  695. package/dist/contexts/AppConfigContext.js +33 -0
  696. package/dist/contexts/CurrencyContext.d.ts +43 -0
  697. package/dist/contexts/CurrencyContext.js +331 -0
  698. package/dist/contexts/DeviceContext.d.ts +12 -0
  699. package/dist/contexts/DeviceContext.js +69 -0
  700. package/dist/contexts/EmailContext.d.ts +112 -0
  701. package/dist/contexts/EmailContext.js +720 -0
  702. package/dist/contexts/GlobalAlertContext.d.ts +67 -0
  703. package/dist/contexts/GlobalAlertContext.js +192 -0
  704. package/dist/contexts/ImpactAnalysisContext.d.ts +11 -0
  705. package/dist/contexts/ImpactAnalysisContext.js +23 -0
  706. package/dist/contexts/LanguageContext.d.ts +21 -0
  707. package/dist/contexts/LanguageContext.js +66 -0
  708. package/dist/contexts/MessagingContext.d.ts +70 -0
  709. package/dist/contexts/MessagingContext.js +722 -0
  710. package/dist/contexts/ModuleAuthContext.d.ts +42 -0
  711. package/dist/contexts/ModuleAuthContext.js +278 -0
  712. package/dist/contexts/NavigationContext.d.ts +26 -0
  713. package/dist/contexts/NavigationContext.js +143 -0
  714. package/dist/contexts/NetworkStatusContext.d.ts +18 -0
  715. package/dist/contexts/NetworkStatusContext.js +87 -0
  716. package/dist/contexts/NotificationContext.d.ts +47 -0
  717. package/dist/contexts/NotificationContext.js +165 -0
  718. package/dist/contexts/PageTitleContext.d.ts +11 -0
  719. package/dist/contexts/PageTitleContext.js +23 -0
  720. package/dist/contexts/SearchPreferencesContext.d.ts +11 -0
  721. package/dist/contexts/SearchPreferencesContext.js +38 -0
  722. package/dist/contexts/SessionAdapterContext.d.ts +39 -0
  723. package/dist/contexts/SessionAdapterContext.js +20 -0
  724. package/dist/contexts/SidebarPreferencesContext.d.ts +19 -0
  725. package/dist/contexts/SidebarPreferencesContext.js +112 -0
  726. package/dist/contexts/ThemeContext.d.ts +63 -0
  727. package/dist/contexts/ThemeContext.js +153 -0
  728. package/dist/hooks/index.d.ts +23 -0
  729. package/dist/hooks/index.js +18 -0
  730. package/dist/hooks/useApproval.d.ts +47 -0
  731. package/dist/hooks/useApproval.js +247 -0
  732. package/dist/hooks/useBacchaSearch.d.ts +57 -0
  733. package/dist/hooks/useBacchaSearch.js +254 -0
  734. package/dist/hooks/useBusinessAudit.d.ts +24 -0
  735. package/dist/hooks/useBusinessAudit.js +51 -0
  736. package/dist/hooks/useColumnFreezing.d.ts +85 -0
  737. package/dist/hooks/useColumnFreezing.js +201 -0
  738. package/dist/hooks/useColumnMetadata.d.ts +20 -0
  739. package/dist/hooks/useColumnMetadata.js +44 -0
  740. package/dist/hooks/useConditionalFormatting.d.ts +43 -0
  741. package/dist/hooks/useConditionalFormatting.js +193 -0
  742. package/dist/hooks/useDebounce.d.ts +14 -0
  743. package/dist/hooks/useDebounce.js +45 -0
  744. package/dist/hooks/useDraft.d.ts +46 -0
  745. package/dist/hooks/useDraft.js +178 -0
  746. package/dist/hooks/useFormValidation.d.ts +37 -0
  747. package/dist/hooks/useFormValidation.js +65 -0
  748. package/dist/hooks/useGridSettings.d.ts +26 -0
  749. package/dist/hooks/useGridSettings.js +82 -0
  750. package/dist/hooks/useGridTheme.d.ts +59 -0
  751. package/dist/hooks/useGridTheme.js +199 -0
  752. package/dist/hooks/useId.d.ts +2 -0
  753. package/dist/hooks/useId.js +17 -0
  754. package/dist/hooks/useIntelligentColumnSizing.d.ts +71 -0
  755. package/dist/hooks/useIntelligentColumnSizing.js +310 -0
  756. package/dist/hooks/useKeyboardNavigation.d.ts +33 -0
  757. package/dist/hooks/useKeyboardNavigation.js +189 -0
  758. package/dist/hooks/useNotifications.d.ts +7 -0
  759. package/dist/hooks/useNotifications.js +56 -0
  760. package/dist/hooks/usePrevious.d.ts +9 -0
  761. package/dist/hooks/usePrevious.js +17 -0
  762. package/dist/hooks/useRowSelection.d.ts +45 -0
  763. package/dist/hooks/useRowSelection.js +147 -0
  764. package/dist/hooks/useSignalR.d.ts +13 -0
  765. package/dist/hooks/useSignalR.js +50 -0
  766. package/dist/hooks/useTheme.d.ts +59 -0
  767. package/dist/hooks/useTheme.js +261 -0
  768. package/dist/hooks/useTranslation.d.ts +5 -0
  769. package/dist/hooks/useTranslation.js +17 -0
  770. package/dist/hooks/useUnsavedChanges.d.ts +40 -0
  771. package/dist/hooks/useUnsavedChanges.js +83 -0
  772. package/dist/index.d.ts +2 -3173
  773. package/dist/index.js +4 -25937
  774. package/dist/lib/api/activity/audit/audit.d.ts +34 -0
  775. package/dist/lib/api/activity/audit/audit.js +44 -0
  776. package/dist/lib/api/activity/audit/index.d.ts +6 -0
  777. package/dist/lib/api/activity/audit/index.js +7 -0
  778. package/dist/lib/api/activity/audit/send.d.ts +152 -0
  779. package/dist/lib/api/activity/audit/send.js +403 -0
  780. package/dist/lib/api/activity/email/client.d.ts +167 -0
  781. package/dist/lib/api/activity/email/client.js +455 -0
  782. package/dist/lib/api/activity/email/index.d.ts +7 -0
  783. package/dist/lib/api/activity/email/index.js +10 -0
  784. package/dist/lib/api/activity/email/password-reset.d.ts +8 -0
  785. package/dist/lib/api/activity/email/password-reset.js +55 -0
  786. package/dist/lib/api/activity/email/templates.d.ts +10 -0
  787. package/dist/lib/api/activity/email/templates.js +531 -0
  788. package/dist/lib/api/activity/email/types.d.ts +237 -0
  789. package/dist/lib/api/activity/email/types.js +21 -0
  790. package/dist/lib/api/activity/index.d.ts +12 -0
  791. package/dist/lib/api/activity/index.js +15 -0
  792. package/dist/lib/api/activity/messaging/messaging.d.ts +149 -0
  793. package/dist/lib/api/activity/messaging/messaging.js +245 -0
  794. package/dist/lib/api/activity/notifications/index.d.ts +9 -0
  795. package/dist/lib/api/activity/notifications/index.js +9 -0
  796. package/dist/lib/api/activity/notifications/notifications.d.ts +59 -0
  797. package/dist/lib/api/activity/notifications/notifications.js +218 -0
  798. package/dist/lib/api/activity/notifications/reminders.d.ts +35 -0
  799. package/dist/lib/api/activity/notifications/reminders.js +25 -0
  800. package/dist/lib/api/activity/notifications/send.d.ts +122 -0
  801. package/dist/lib/api/activity/notifications/send.js +252 -0
  802. package/dist/lib/api/activity/notifications/types.d.ts +119 -0
  803. package/dist/lib/api/activity/notifications/types.js +62 -0
  804. package/dist/lib/api/activity/notify-and-log.d.ts +50 -0
  805. package/dist/lib/api/activity/notify-and-log.js +60 -0
  806. package/dist/lib/api/activity/remarks/index.d.ts +2 -0
  807. package/dist/lib/api/activity/remarks/index.js +2 -0
  808. package/dist/lib/api/activity/remarks/remarks.d.ts +83 -0
  809. package/dist/lib/api/activity/remarks/remarks.js +179 -0
  810. package/dist/lib/api/activity/storage.d.ts +28 -0
  811. package/dist/lib/api/activity/storage.js +79 -0
  812. package/dist/lib/api/ai/chat.d.ts +67 -0
  813. package/dist/lib/api/ai/chat.js +212 -0
  814. package/dist/lib/api/ai/types.d.ts +69 -0
  815. package/dist/lib/api/ai/types.js +5 -0
  816. package/dist/lib/api/approval/approvals.d.ts +66 -0
  817. package/dist/lib/api/approval/approvals.js +205 -0
  818. package/dist/lib/api/approval/index.d.ts +5 -0
  819. package/dist/lib/api/approval/index.js +6 -0
  820. package/dist/lib/api/auth/auth.d.ts +12 -0
  821. package/dist/lib/api/auth/auth.js +148 -0
  822. package/dist/lib/api/auth/index.d.ts +1 -0
  823. package/dist/lib/api/auth/index.js +4 -0
  824. package/dist/lib/api/auth/password-reset-otp.d.ts +49 -0
  825. package/dist/lib/api/auth/password-reset-otp.js +185 -0
  826. package/dist/lib/api/auth/two-factor-auth.d.ts +55 -0
  827. package/dist/lib/api/auth/two-factor-auth.js +84 -0
  828. package/dist/lib/api/auth/two-factor.d.ts +41 -0
  829. package/dist/lib/api/auth/two-factor.js +180 -0
  830. package/dist/lib/api/core/auth-helpers.d.ts +13 -0
  831. package/dist/lib/api/core/auth-helpers.js +137 -0
  832. package/dist/lib/api/core/client.d.ts +37 -0
  833. package/dist/lib/api/core/client.js +301 -0
  834. package/dist/lib/api/core/config.d.ts +46 -0
  835. package/dist/lib/api/core/config.js +238 -0
  836. package/dist/lib/api/core/index.d.ts +6 -0
  837. package/dist/lib/api/core/index.js +11 -0
  838. package/dist/lib/api/core/session-validator.d.ts +55 -0
  839. package/dist/lib/api/core/session-validator.js +94 -0
  840. package/dist/lib/api/core/types.d.ts +192 -0
  841. package/dist/lib/api/core/types.js +3 -0
  842. package/dist/lib/api/core/utils.d.ts +15 -0
  843. package/dist/lib/api/core/utils.js +64 -0
  844. package/dist/lib/api/dashboard/costing.d.ts +129 -0
  845. package/dist/lib/api/dashboard/costing.js +8 -0
  846. package/dist/lib/api/dashboard/management.d.ts +91 -0
  847. package/dist/lib/api/dashboard/management.js +5 -0
  848. package/dist/lib/api/dashboard/sales.d.ts +87 -0
  849. package/dist/lib/api/dashboard/sales.js +5 -0
  850. package/dist/lib/api/draft/drafts.d.ts +49 -0
  851. package/dist/lib/api/draft/drafts.js +274 -0
  852. package/dist/lib/api/draft/index.d.ts +5 -0
  853. package/dist/lib/api/draft/index.js +6 -0
  854. package/dist/lib/api/enquiry/enquiry.d.ts +324 -0
  855. package/dist/lib/api/enquiry/enquiry.js +617 -0
  856. package/dist/lib/api/enquiry/index.d.ts +2 -0
  857. package/dist/lib/api/enquiry/index.js +4 -0
  858. package/dist/lib/api/enquiry/rate-enquiry.d.ts +97 -0
  859. package/dist/lib/api/enquiry/rate-enquiry.js +69 -0
  860. package/dist/lib/api/estimation/categories.d.ts +28 -0
  861. package/dist/lib/api/estimation/categories.js +104 -0
  862. package/dist/lib/api/estimation/category-defaults.d.ts +56 -0
  863. package/dist/lib/api/estimation/category-defaults.js +41 -0
  864. package/dist/lib/api/estimation/company-config.d.ts +59 -0
  865. package/dist/lib/api/estimation/company-config.js +19 -0
  866. package/dist/lib/api/estimation/content.d.ts +103 -0
  867. package/dist/lib/api/estimation/content.js +203 -0
  868. package/dist/lib/api/estimation/freight.d.ts +34 -0
  869. package/dist/lib/api/estimation/freight.js +18 -0
  870. package/dist/lib/api/estimation/grid-costing-drafts.d.ts +38 -0
  871. package/dist/lib/api/estimation/grid-costing-drafts.js +21 -0
  872. package/dist/lib/api/estimation/grid-costing.d.ts +353 -0
  873. package/dist/lib/api/estimation/grid-costing.js +126 -0
  874. package/dist/lib/api/estimation/index.d.ts +10 -0
  875. package/dist/lib/api/estimation/index.js +22 -0
  876. package/dist/lib/api/estimation/legacy-costing.d.ts +42 -0
  877. package/dist/lib/api/estimation/legacy-costing.js +46 -0
  878. package/dist/lib/api/estimation/machines.d.ts +32 -0
  879. package/dist/lib/api/estimation/machines.js +67 -0
  880. package/dist/lib/api/estimation/planning.d.ts +479 -0
  881. package/dist/lib/api/estimation/planning.js +385 -0
  882. package/dist/lib/api/estimation/qualities.d.ts +128 -0
  883. package/dist/lib/api/estimation/qualities.js +229 -0
  884. package/dist/lib/api/estimation/quotation-load.d.ts +30 -0
  885. package/dist/lib/api/estimation/quotation-load.js +46 -0
  886. package/dist/lib/api/estimation/quotation-save.d.ts +88 -0
  887. package/dist/lib/api/estimation/quotation-save.js +101 -0
  888. package/dist/lib/api/estimation/quote-check.d.ts +19 -0
  889. package/dist/lib/api/estimation/quote-check.js +28 -0
  890. package/dist/lib/api/estimation/quotepanel.d.ts +304 -0
  891. package/dist/lib/api/estimation/quotepanel.js +489 -0
  892. package/dist/lib/api/estimation/shipper-planning.d.ts +71 -0
  893. package/dist/lib/api/estimation/shipper-planning.js +208 -0
  894. package/dist/lib/api/estimation/wastage.d.ts +40 -0
  895. package/dist/lib/api/estimation/wastage.js +40 -0
  896. package/dist/lib/api/index.d.ts +7 -0
  897. package/dist/lib/api/index.js +17 -0
  898. package/dist/lib/api/integration/proxy.d.ts +7 -0
  899. package/dist/lib/api/integration/proxy.js +34 -0
  900. package/dist/lib/api/master/category.d.ts +126 -0
  901. package/dist/lib/api/master/category.js +208 -0
  902. package/dist/lib/api/master/company.d.ts +167 -0
  903. package/dist/lib/api/master/company.js +368 -0
  904. package/dist/lib/api/master/hsn.d.ts +36 -0
  905. package/dist/lib/api/master/hsn.js +54 -0
  906. package/dist/lib/api/master/index.d.ts +12 -0
  907. package/dist/lib/api/master/index.js +27 -0
  908. package/dist/lib/api/master/item.d.ts +158 -0
  909. package/dist/lib/api/master/item.js +135 -0
  910. package/dist/lib/api/master/ledger.d.ts +173 -0
  911. package/dist/lib/api/master/ledger.js +391 -0
  912. package/dist/lib/api/master/logistics.d.ts +117 -0
  913. package/dist/lib/api/master/logistics.js +107 -0
  914. package/dist/lib/api/master/machine.d.ts +406 -0
  915. package/dist/lib/api/master/machine.js +570 -0
  916. package/dist/lib/api/master/material-group.d.ts +97 -0
  917. package/dist/lib/api/master/material-group.js +96 -0
  918. package/dist/lib/api/master/other.d.ts +65 -0
  919. package/dist/lib/api/master/other.js +56 -0
  920. package/dist/lib/api/master/process-types.d.ts +178 -0
  921. package/dist/lib/api/master/process-types.js +4 -0
  922. package/dist/lib/api/master/process.d.ts +94 -0
  923. package/dist/lib/api/master/process.js +124 -0
  924. package/dist/lib/api/master/production-units.d.ts +10 -0
  925. package/dist/lib/api/master/production-units.js +15 -0
  926. package/dist/lib/api/master/rate.d.ts +174 -0
  927. package/dist/lib/api/master/rate.js +196 -0
  928. package/dist/lib/api/master/tool.d.ts +48 -0
  929. package/dist/lib/api/master/tool.js +80 -0
  930. package/dist/lib/api/master/user.d.ts +473 -0
  931. package/dist/lib/api/master/user.js +147 -0
  932. package/dist/lib/api/settings/erp-parameters.d.ts +33 -0
  933. package/dist/lib/api/settings/erp-parameters.js +61 -0
  934. package/dist/lib/api/utility/index.d.ts +1 -0
  935. package/dist/lib/api/utility/index.js +5 -0
  936. package/dist/lib/api/utility/menu.d.ts +32 -0
  937. package/dist/lib/api/utility/menu.js +128 -0
  938. package/dist/lib/auth.d.ts +3 -0
  939. package/dist/lib/auth.js +7 -0
  940. package/dist/lib/pwa.d.ts +8 -0
  941. package/dist/lib/pwa.js +53 -0
  942. package/dist/lib/react-query-config.d.ts +140 -0
  943. package/dist/lib/react-query-config.js +131 -0
  944. package/dist/lib/security/audit-logger.d.ts +71 -0
  945. package/dist/lib/security/audit-logger.js +173 -0
  946. package/dist/lib/security/rate-limiter.d.ts +28 -0
  947. package/dist/lib/security/rate-limiter.js +118 -0
  948. package/dist/lib/server-url.d.ts +18 -0
  949. package/dist/lib/server-url.js +70 -0
  950. package/dist/lib/svg-utils.d.ts +62 -0
  951. package/dist/lib/svg-utils.js +206 -0
  952. package/dist/lib/theme/types.d.ts +109 -0
  953. package/dist/lib/theme/types.js +231 -0
  954. package/dist/lib/theme/utils.d.ts +73 -0
  955. package/dist/lib/theme/utils.js +343 -0
  956. package/dist/lib/types/index.d.ts +58 -0
  957. package/dist/lib/types/index.js +2 -0
  958. package/dist/lib/utils/attachment-loader.d.ts +27 -0
  959. package/dist/lib/utils/attachment-loader.js +79 -0
  960. package/dist/lib/utils/client-lead-utils.d.ts +24 -0
  961. package/dist/lib/utils/client-lead-utils.js +56 -0
  962. package/dist/lib/utils/device-detection.d.ts +19 -0
  963. package/dist/lib/utils/device-detection.js +105 -0
  964. package/dist/lib/utils/logout-cleanup.d.ts +63 -0
  965. package/dist/lib/utils/logout-cleanup.js +297 -0
  966. package/dist/lib/utils/planning-prefs.d.ts +10 -0
  967. package/dist/lib/utils/planning-prefs.js +27 -0
  968. package/dist/lib/utils.d.ts +20 -0
  969. package/dist/lib/utils.js +60 -0
  970. package/dist/lib/vision/dieline-extractor.d.ts +38 -0
  971. package/dist/lib/vision/dieline-extractor.js +313 -0
  972. package/dist/lib/vision/reference-grid.d.ts +52 -0
  973. package/dist/lib/vision/reference-grid.js +241 -0
  974. package/dist/locales/de.json +79 -0
  975. package/dist/locales/en.json +2217 -0
  976. package/dist/locales/es.json +79 -0
  977. package/dist/locales/fr.json +78 -0
  978. package/dist/locales/hi.json +1599 -0
  979. package/dist/providers.d.ts +14 -0
  980. package/dist/providers.js +15 -0
  981. package/dist/services/GlobalLoadingService.d.ts +216 -0
  982. package/dist/services/GlobalLoadingService.js +216 -0
  983. package/dist/styles/grid-themes.css +346 -0
  984. package/dist/styles/index.css +5 -0
  985. package/dist/{sidebar-scrollbar-NBCB2OO2.css → styles/sidebar-scrollbar.css} +45 -45
  986. package/dist/styles/tokens.css +713 -0
  987. package/dist/types/approval.d.ts +201 -0
  988. package/dist/types/approval.js +19 -0
  989. package/dist/types/audit.d.ts +87 -0
  990. package/dist/types/audit.js +47 -0
  991. package/dist/types/draft.d.ts +142 -0
  992. package/dist/types/draft.js +19 -0
  993. package/dist/types/master.d.ts +154 -0
  994. package/dist/types/master.js +3 -0
  995. package/dist/types/shipper-planning.d.ts +277 -0
  996. package/dist/types/shipper-planning.js +6 -0
  997. package/package.json +187 -119
  998. package/dist/chunk-4PEFU7N7.js +0 -16
  999. package/dist/chunk-4PEFU7N7.js.map +0 -1
  1000. package/dist/de-EKT7SUK5.js +0 -106
  1001. package/dist/de-EKT7SUK5.js.map +0 -1
  1002. package/dist/en-QRFSIEHD.js +0 -1685
  1003. package/dist/en-QRFSIEHD.js.map +0 -1
  1004. package/dist/es-KHZMWGUI.js +0 -106
  1005. package/dist/es-KHZMWGUI.js.map +0 -1
  1006. package/dist/fr-X2XUXSHK.js +0 -105
  1007. package/dist/fr-X2XUXSHK.js.map +0 -1
  1008. package/dist/hi-YRATOE5Q.js +0 -415
  1009. package/dist/hi-YRATOE5Q.js.map +0 -1
  1010. package/dist/index.cjs +0 -28216
  1011. package/dist/index.cjs.map +0 -1
  1012. package/dist/index.d.cts +0 -3173
  1013. package/dist/index.js.map +0 -1
  1014. /package/{src → dist/cjs}/styles/index.css +0 -0
@@ -0,0 +1,930 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { motion, AnimatePresence } from 'framer-motion';
6
+ import ReactCrop, { centerCrop, makeAspectCrop } from 'react-image-crop';
7
+ import 'react-image-crop/dist/ReactCrop.css';
8
+ import { Upload, X, File as FileIcon, FileText, Image, FileArchive, FileVideo, FileAudio, Download, Eye, Camera, Plus, XCircle, Save, Mail, Paperclip, RefreshCw, Search } from 'lucide-react';
9
+ import { cn } from '../../../lib/utils.js';
10
+ import { Button } from '../../ui/index.js';
11
+ import { Footer } from '../../layout/index.js';
12
+ import { Modal, ModalContent, ModalHeader, ModalTitle } from '../../modals/Modal.js';
13
+ import { EmailPreview } from './EmailPreview.js';
14
+ import { useEmail } from '../../../contexts/EmailContext.js';
15
+ // Helper function to get cropped image as blob
16
+ async function getCroppedImg(image, crop, mimeType = 'image/jpeg', quality = 0.92) {
17
+ const canvas = document.createElement('canvas');
18
+ const ctx = canvas.getContext('2d');
19
+ if (!ctx) {
20
+ return null;
21
+ }
22
+ // Calculate scale factors
23
+ const scaleX = image.naturalWidth / image.width;
24
+ const scaleY = image.naturalHeight / image.height;
25
+ // Set canvas size to the crop size (in natural pixels for best quality)
26
+ const pixelRatio = window.devicePixelRatio || 1;
27
+ canvas.width = Math.floor(crop.width * scaleX * pixelRatio);
28
+ canvas.height = Math.floor(crop.height * scaleY * pixelRatio);
29
+ // Scale context for high DPI displays
30
+ ctx.scale(pixelRatio, pixelRatio);
31
+ ctx.imageSmoothingQuality = 'high';
32
+ // Calculate crop coordinates in natural image pixels
33
+ const cropX = crop.x * scaleX;
34
+ const cropY = crop.y * scaleY;
35
+ const cropWidth = crop.width * scaleX;
36
+ const cropHeight = crop.height * scaleY;
37
+ // Draw the cropped image
38
+ ctx.drawImage(image, cropX, cropY, cropWidth, cropHeight, 0, 0, crop.width * scaleX, crop.height * scaleY);
39
+ return new Promise((resolve) => {
40
+ // Use lossless quality for PNG/BMP/GIF (quality param is ignored for these)
41
+ canvas.toBlob((blob) => {
42
+ if (blob) {
43
+ resolve({
44
+ blob,
45
+ url: URL.createObjectURL(blob)
46
+ });
47
+ }
48
+ else {
49
+ resolve(null);
50
+ }
51
+ }, mimeType, quality);
52
+ });
53
+ }
54
+ // Helper to create centered aspect ratio crop
55
+ function centerAspectCrop(mediaWidth, mediaHeight, aspect) {
56
+ if (aspect) {
57
+ return centerCrop(makeAspectCrop({
58
+ unit: '%',
59
+ width: 90,
60
+ }, aspect, mediaWidth, mediaHeight), mediaWidth, mediaHeight);
61
+ }
62
+ // No aspect ratio - use 90% of image
63
+ return {
64
+ unit: '%',
65
+ x: 5,
66
+ y: 5,
67
+ width: 90,
68
+ height: 90
69
+ };
70
+ }
71
+ const formatFileSize = (bytes) => {
72
+ if (bytes === 0)
73
+ return '0 Bytes';
74
+ const k = 1024;
75
+ const sizes = ['Bytes', 'KB', 'MB', 'GB'];
76
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
77
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
78
+ };
79
+ // Allowed filename characters: letters, digits, space, and a small set of safe
80
+ // punctuation. Rejects emojis and other characters that break the S3 object key.
81
+ const VALID_FILENAME = /^[A-Za-z0-9 ._\-()[\]&+#]+$/;
82
+ // Returns an error string if the filename is invalid, else null.
83
+ const validateFileName = (name) => {
84
+ const base = (name || '').trim();
85
+ if (!base)
86
+ return 'File name is empty';
87
+ if (!VALID_FILENAME.test(base)) {
88
+ const bad = Array.from(base).filter(c => !VALID_FILENAME.test(c));
89
+ const shown = Array.from(new Set(bad)).slice(0, 5).join(' ');
90
+ return `File name "${base}" has invalid characters (${shown}). Use only letters, numbers, spaces and . _ - ( ) [ ] & + #`;
91
+ }
92
+ return null;
93
+ };
94
+ // Check if file is an email type (.eml, .msg, or imported email)
95
+ const isEmailFile = (type, name) => {
96
+ return type.includes('message/') ||
97
+ type.includes('rfc822') ||
98
+ type.includes('ms-outlook') ||
99
+ type === 'message/email' ||
100
+ name?.endsWith('.eml') ||
101
+ name?.endsWith('.msg');
102
+ };
103
+ // Check if file is an Excel type
104
+ const isExcelFile = (type, name) => {
105
+ return type.includes('spreadsheet') ||
106
+ type.includes('excel') ||
107
+ type === 'application/vnd.ms-excel' ||
108
+ type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
109
+ name?.endsWith('.xlsx') ||
110
+ name?.endsWith('.xls') ||
111
+ name?.endsWith('.csv');
112
+ };
113
+ const getFileIcon = (type, name) => {
114
+ if (type.startsWith('image/'))
115
+ return Image;
116
+ if (type.startsWith('video/'))
117
+ return FileVideo;
118
+ if (type.startsWith('audio/'))
119
+ return FileAudio;
120
+ if (isEmailFile(type, name))
121
+ return Mail;
122
+ if (type.includes('pdf') || type.includes('text/'))
123
+ return FileText;
124
+ if (type.includes('zip') || type.includes('rar') || type.includes('7z'))
125
+ return FileArchive;
126
+ return FileIcon;
127
+ };
128
+ const getFileTypeColor = (type, name) => {
129
+ if (type.startsWith('image/'))
130
+ return 'text-[rgb(var(--color-success))] bg-[rgb(var(--color-success)/0.1)]';
131
+ if (type.startsWith('video/'))
132
+ return 'text-[rgb(var(--color-primary))] bg-[rgb(var(--color-primary)/0.1)]';
133
+ if (type.startsWith('audio/'))
134
+ return 'text-[rgb(var(--color-info))] bg-[rgb(var(--color-info)/0.1)]';
135
+ if (isEmailFile(type, name))
136
+ return 'text-[rgb(var(--color-info))] bg-[rgb(var(--color-info)/0.1)]';
137
+ if (type.includes('pdf'))
138
+ return 'text-[rgb(var(--color-error))] bg-[rgb(var(--color-error)/0.1)]';
139
+ if (type.includes('text/'))
140
+ return 'text-[rgb(var(--fg-muted))] bg-[rgb(var(--bg-muted))]';
141
+ if (type.includes('zip') || type.includes('rar') || type.includes('7z'))
142
+ return 'text-[rgb(var(--color-warning))] bg-[rgb(var(--color-warning)/0.1)]';
143
+ return 'text-[rgb(var(--fg-muted))] bg-[rgb(var(--bg-muted))]';
144
+ };
145
+ // Image Preview Component with loading and error states
146
+ function ImagePreviewContent({ file }) {
147
+ const [imageLoading, setImageLoading] = React.useState(true);
148
+ const [imageError, setImageError] = React.useState(false);
149
+ const [imageSrc, setImageSrc] = React.useState(null);
150
+ React.useEffect(() => {
151
+ let blobUrl = null;
152
+ let isCancelled = false;
153
+ setImageLoading(true);
154
+ setImageError(false);
155
+ // Priority 1: If we have a File object, create a fresh blob URL from it
156
+ if (file.file && typeof file.file === 'object' && 'size' in file.file) {
157
+ try {
158
+ blobUrl = URL.createObjectURL(file.file);
159
+ if (!isCancelled) {
160
+ setImageSrc(blobUrl);
161
+ }
162
+ return () => {
163
+ isCancelled = true;
164
+ if (blobUrl) {
165
+ URL.revokeObjectURL(blobUrl);
166
+ }
167
+ };
168
+ }
169
+ catch (e) {
170
+ // Failed to create blob URL, continue to other options
171
+ }
172
+ }
173
+ // Priority 2: If we have a data URL, use it directly (always works)
174
+ if (file.url?.startsWith('data:')) {
175
+ if (!isCancelled)
176
+ setImageSrc(file.url);
177
+ return () => { isCancelled = true; };
178
+ }
179
+ // Priority 3: If we have a blob URL, use it (might be stale but try)
180
+ if (file.url?.startsWith('blob:')) {
181
+ if (!isCancelled)
182
+ setImageSrc(file.url);
183
+ return () => { isCancelled = true; };
184
+ }
185
+ // Priority 4: Server URL - use directly
186
+ if (file.url) {
187
+ if (!isCancelled)
188
+ setImageSrc(file.url);
189
+ return () => { isCancelled = true; };
190
+ }
191
+ // No valid source found
192
+ if (!isCancelled) {
193
+ setImageError(true);
194
+ setImageLoading(false);
195
+ }
196
+ return () => { isCancelled = true; };
197
+ }, [file]);
198
+ if (imageError) {
199
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center text-[rgb(var(--fg-muted))]", children: [_jsx(Image, { className: "h-16 w-16 mb-4 opacity-50" }), _jsx("h3", { className: "text-lg font-medium mb-2 text-[rgb(var(--fg-default))]", children: "Unable to load image" }), _jsxs("p", { className: "text-sm text-center mb-4", children: ["The image could not be displayed.", _jsx("br", {}), "Try downloading the file instead."] })] }));
200
+ }
201
+ return (_jsxs("div", { className: "relative w-full h-full flex items-center justify-center", children: [imageLoading && (_jsx("div", { className: "absolute inset-0 flex items-center justify-center bg-[rgb(var(--bg-muted))]", children: _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx("div", { className: "w-8 h-8 border-2 border-[rgb(var(--color-primary))] border-t-transparent rounded-full animate-spin" }), _jsx("span", { className: "text-sm text-[rgb(var(--fg-muted))]", children: "Loading image..." })] }) })), imageSrc && (_jsx("img", { src: imageSrc, alt: file.name, className: cn("max-w-full max-h-full object-contain rounded-lg shadow-lg transition-opacity duration-300", imageLoading ? "opacity-0" : "opacity-100"), onLoad: () => setImageLoading(false), onError: () => {
202
+ setImageLoading(false);
203
+ setImageError(true);
204
+ } }))] }));
205
+ }
206
+ // ExcelJS ARGB ("FF1E3A5F") → CSS "#1E3A5F". Skips fully transparent / absent.
207
+ function argbToCss(argb) {
208
+ if (!argb || argb.length < 6)
209
+ return undefined;
210
+ const hex = argb.length === 8 ? argb.slice(2) : argb;
211
+ if (argb.length === 8 && argb.slice(0, 2) === '00')
212
+ return undefined; // transparent
213
+ return `#${hex}`;
214
+ }
215
+ function ExcelPreviewContent({ file }) {
216
+ const [loading, setLoading] = React.useState(true);
217
+ const [error, setError] = React.useState(false);
218
+ const [sheetData, setSheetData] = React.useState([]);
219
+ const [activeSheet, setActiveSheet] = React.useState(0);
220
+ React.useEffect(() => {
221
+ let isCancelled = false;
222
+ setLoading(true);
223
+ setError(false);
224
+ const loadExcel = async () => {
225
+ try {
226
+ let arrayBuffer;
227
+ // Get file data
228
+ if (file.file instanceof File) {
229
+ arrayBuffer = await file.file.arrayBuffer();
230
+ }
231
+ else if (file.url) {
232
+ const response = await fetch(file.url);
233
+ arrayBuffer = await response.arrayBuffer();
234
+ }
235
+ else {
236
+ throw new Error('No file data available');
237
+ }
238
+ // Parse with ExcelJS (not SheetJS) — the community xlsx build strips cell
239
+ // fills/fonts, but ExcelJS preserves them, so the preview can show the
240
+ // real colors + merges of the sheet.
241
+ const { Workbook } = await import('exceljs');
242
+ const workbook = new Workbook();
243
+ await workbook.xlsx.load(arrayBuffer);
244
+ const sheets = workbook.worksheets.map(ws => {
245
+ const merges = Object.values(ws._merges ?? {}).map((m) => ({
246
+ r1: m.top - 1, c1: m.left - 1, r2: m.bottom - 1, c2: m.right - 1,
247
+ }));
248
+ const colCount = Math.max(ws.columnCount, ...merges.map(m => m.c2 + 1), 0);
249
+ const rows = [];
250
+ for (let r = 1; r <= ws.rowCount; r++) {
251
+ const row = ws.getRow(r);
252
+ const cells = [];
253
+ for (let c = 1; c <= colCount; c++) {
254
+ const cell = row.getCell(c);
255
+ const v = cell.value;
256
+ let text = '';
257
+ if (v != null) {
258
+ if (typeof v === 'object' && 'richText' in v) {
259
+ text = v.richText.map((t) => t.text).join('');
260
+ }
261
+ else if (typeof v === 'object' && 'text' in v) {
262
+ text = String(v.text);
263
+ }
264
+ else if (typeof v === 'object' && 'result' in v) {
265
+ text = String(v.result ?? '');
266
+ }
267
+ else {
268
+ text = String(v);
269
+ }
270
+ }
271
+ const fill = cell.fill;
272
+ const bg = fill?.type === 'pattern' ? argbToCss(fill.fgColor?.argb) : undefined;
273
+ const fg = argbToCss(cell.font?.color?.argb);
274
+ cells.push({ text, bg, fg, bold: cell.font?.bold });
275
+ }
276
+ rows.push(cells);
277
+ }
278
+ return { name: ws.name, rows, merges };
279
+ });
280
+ if (!isCancelled) {
281
+ setSheetData(sheets);
282
+ setLoading(false);
283
+ }
284
+ }
285
+ catch (e) {
286
+ if (!isCancelled) {
287
+ setError(true);
288
+ setLoading(false);
289
+ }
290
+ }
291
+ };
292
+ loadExcel();
293
+ return () => { isCancelled = true; };
294
+ }, [file]);
295
+ if (loading) {
296
+ return (_jsx("div", { className: "w-full h-full flex items-center justify-center bg-[rgb(var(--bg-muted))]", children: _jsxs("div", { className: "flex flex-col items-center gap-2", children: [_jsx("div", { className: "w-8 h-8 border-2 border-[rgb(var(--color-primary))] border-t-transparent rounded-full animate-spin" }), _jsx("span", { className: "text-sm text-[rgb(var(--fg-muted))]", children: "Loading spreadsheet..." })] }) }));
297
+ }
298
+ if (error || sheetData.length === 0) {
299
+ return (_jsxs("div", { className: "w-full h-full flex flex-col items-center justify-center text-[rgb(var(--fg-muted))]", children: [_jsx(FileText, { className: "h-16 w-16 mb-4 opacity-50" }), _jsx("h3", { className: "text-lg font-medium mb-2 text-[rgb(var(--fg-default))]", children: "Unable to load spreadsheet" }), _jsx("p", { className: "text-sm text-center mb-4", children: "The file could not be parsed." })] }));
300
+ }
301
+ const currentSheet = sheetData[activeSheet];
302
+ return (_jsxs("div", { className: "w-full h-full flex flex-col bg-white", children: [sheetData.length > 1 && (_jsx("div", { className: "flex-shrink-0 flex gap-1 px-4 pt-3 pb-2 border-b border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))] overflow-x-auto", children: sheetData.map((sheet, index) => (_jsx("button", { onClick: () => setActiveSheet(index), className: cn("px-3 py-1.5 text-xs font-medium rounded-t transition-colors whitespace-nowrap", activeSheet === index
303
+ ? "bg-white text-[rgb(var(--fg-default))] border border-b-0 border-[rgb(var(--bd-default))]"
304
+ : "text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-hover))]"), children: sheet.name }, sheet.name))) })), _jsxs("div", { className: "flex-1 overflow-auto p-4", children: [currentSheet.rows.length > 0 ? ((() => {
305
+ // Merge lookups: origin cell "r:c" → span; covered cell "r:c" → skip.
306
+ // Row spans are clamped to the 100-row render window so a merge that
307
+ // extends past it doesn't reference unrendered rows.
308
+ const ROW_LIMIT = 100;
309
+ const spanByOrigin = new Map();
310
+ const covered = new Set();
311
+ for (const m of currentSheet.merges) {
312
+ if (m.r1 >= ROW_LIMIT)
313
+ continue;
314
+ const r2 = Math.min(m.r2, ROW_LIMIT - 1);
315
+ spanByOrigin.set(`${m.r1}:${m.c1}`, { rowSpan: r2 - m.r1 + 1, colSpan: m.c2 - m.c1 + 1 });
316
+ for (let r = m.r1; r <= r2; r++) {
317
+ for (let c = m.c1; c <= m.c2; c++) {
318
+ if (r !== m.r1 || c !== m.c1)
319
+ covered.add(`${r}:${c}`);
320
+ }
321
+ }
322
+ }
323
+ return (_jsx("table", { className: "border-collapse text-sm whitespace-nowrap", children: _jsx("tbody", { children: currentSheet.rows.slice(0, 100).map((row, rowIndex) => (_jsx("tr", { children: row.map((cell, cellIndex) => {
324
+ if (covered.has(`${rowIndex}:${cellIndex}`))
325
+ return null;
326
+ const span = spanByOrigin.get(`${rowIndex}:${cellIndex}`);
327
+ return (_jsx("td", { rowSpan: span?.rowSpan, colSpan: span?.colSpan, className: cn("border border-[rgb(var(--bd-default))] px-2 py-1.5 align-top", span && "text-center", cell.bold && "font-semibold"), style: {
328
+ backgroundColor: cell.bg,
329
+ color: cell.fg,
330
+ }, children: cell.text }, cellIndex));
331
+ }) }, rowIndex))) }) }));
332
+ })()) : (_jsx("div", { className: "text-center text-[rgb(var(--fg-muted))] py-8", children: "This sheet is empty" })), currentSheet.rows.length > 100 && (_jsxs("div", { className: "text-center text-[rgb(var(--fg-muted))] text-xs mt-4", children: ["Showing first 100 rows of ", currentSheet.rows.length, " total"] }))] })] }));
333
+ }
334
+ export function FileAttachment({ value = [], onChange, maxFiles = 10, maxFileSize = 10 * 1024 * 1024, // 10MB
335
+ acceptedFileTypes = [], label = "File Attachment", className, disabled = false, showInlinePreview = false, previewShape = 'rectangular', previewSize = 'md', hideInstructions = false, hideDropzone = false, onFileClick, selectedFileId, enableEmailImport = false }) {
336
+ const [isDragging, setIsDragging] = React.useState(false);
337
+ const [previewFile, setPreviewFile] = React.useState(null);
338
+ // Blob URL created for the currently-previewed server file. Revoked when the
339
+ // preview closes or switches to another file so we don't leak it (a PDF/image
340
+ // blob can be several MB, and every preview open created a fresh one).
341
+ const previewBlobUrlRef = React.useRef(null);
342
+ React.useEffect(() => {
343
+ const url = previewFile?.url;
344
+ const isBlob = !!url && url.startsWith('blob:');
345
+ if (isBlob && url !== previewBlobUrlRef.current) {
346
+ if (previewBlobUrlRef.current)
347
+ URL.revokeObjectURL(previewBlobUrlRef.current);
348
+ previewBlobUrlRef.current = url;
349
+ }
350
+ else if (!previewFile && previewBlobUrlRef.current) {
351
+ URL.revokeObjectURL(previewBlobUrlRef.current);
352
+ previewBlobUrlRef.current = null;
353
+ }
354
+ }, [previewFile]);
355
+ React.useEffect(() => () => {
356
+ if (previewBlobUrlRef.current)
357
+ URL.revokeObjectURL(previewBlobUrlRef.current);
358
+ }, []);
359
+ const [imageZoom, setImageZoom] = React.useState(1);
360
+ const [imageRotation, setImageRotation] = React.useState(0);
361
+ const [showCameraModal, setShowCameraModal] = React.useState(false);
362
+ const [cameraStream, setCameraStream] = React.useState(null);
363
+ const [capturedImage, setCapturedImage] = React.useState(null);
364
+ const [showCropModal, setShowCropModal] = React.useState(false);
365
+ const [imageToCrop, setImageToCrop] = React.useState(null);
366
+ const [originalFileInfo, setOriginalFileInfo] = React.useState(null);
367
+ const [crop, setCrop] = React.useState();
368
+ const [completedCrop, setCompletedCrop] = React.useState();
369
+ const cropImageRef = React.useRef(null);
370
+ // Email import state
371
+ const [showEmailImportModal, setShowEmailImportModal] = React.useState(false);
372
+ const [selectedEmail, setSelectedEmail] = React.useState(null);
373
+ const [emailSearchQuery, setEmailSearchQuery] = React.useState('');
374
+ const fileInputRef = React.useRef(null);
375
+ // Get emails from EmailContext
376
+ const { state: emailState, actions: emailActions } = useEmail();
377
+ const imageInputRef = React.useRef(null);
378
+ const videoRef = React.useRef(null);
379
+ const canvasRef = React.useRef(null);
380
+ const handleFileSelect = (files) => {
381
+ if (!files || disabled || files.length === 0)
382
+ return;
383
+ const currentFiles = value || [];
384
+ const filesArray = Array.from(files);
385
+ // Check if we have room for all files
386
+ const availableSlots = maxFiles - currentFiles.length;
387
+ if (availableSlots <= 0) {
388
+ alert(`Maximum ${maxFiles} files allowed`);
389
+ return;
390
+ }
391
+ // If multiple files selected, skip cropping and add them directly
392
+ if (filesArray.length > 1) {
393
+ const newFiles = [];
394
+ const filesToProcess = filesArray.slice(0, availableSlots);
395
+ for (const file of filesToProcess) {
396
+ // Check file size - 10MB limit for images
397
+ const sizeLimit = file.type.startsWith('image/') ? 10 * 1024 * 1024 : maxFileSize;
398
+ if (file.size > sizeLimit) {
399
+ alert(`File "${file.name}" is too large. Maximum size is ${formatFileSize(sizeLimit)}`);
400
+ continue;
401
+ }
402
+ // Check file type - also allow .eml and .msg files by extension
403
+ const isAllowedEmailFile = file.name.endsWith('.eml') || file.name.endsWith('.msg');
404
+ if (acceptedFileTypes.length > 0 && !isAllowedEmailFile && !acceptedFileTypes.some(type => file.type.includes(type))) {
405
+ alert(`File type "${file.type}" is not accepted`);
406
+ continue;
407
+ }
408
+ const nameError = validateFileName(file.name);
409
+ if (nameError) {
410
+ alert(nameError);
411
+ continue;
412
+ }
413
+ newFiles.push({
414
+ id: Math.random().toString(36).substr(2, 9),
415
+ name: file.name,
416
+ size: file.size,
417
+ type: file.type,
418
+ file,
419
+ url: URL.createObjectURL(file)
420
+ });
421
+ }
422
+ if (newFiles.length > 0) {
423
+ onChange?.([...currentFiles, ...newFiles]);
424
+ }
425
+ return;
426
+ }
427
+ // Single file - check for cropping
428
+ const file = filesArray[0];
429
+ // Check file size - 10MB limit for images
430
+ const sizeLimit = file.type.startsWith('image/') ? 10 * 1024 * 1024 : maxFileSize;
431
+ if (file.size > sizeLimit) {
432
+ alert(`File "${file.name}" is too large. Maximum size is ${formatFileSize(sizeLimit)}`);
433
+ return;
434
+ }
435
+ // Check file type - also allow .eml and .msg files by extension
436
+ const isAllowedEmailFile = file.name.endsWith('.eml') || file.name.endsWith('.msg');
437
+ if (acceptedFileTypes.length > 0 && !isAllowedEmailFile && !acceptedFileTypes.some(type => file.type.includes(type))) {
438
+ alert(`File type "${file.type}" is not accepted`);
439
+ return;
440
+ }
441
+ const nameError = validateFileName(file.name);
442
+ if (nameError) {
443
+ alert(nameError);
444
+ return;
445
+ }
446
+ // For single image, show cropper
447
+ if (file.type.startsWith('image/')) {
448
+ setOriginalFileInfo({ name: file.name, type: file.type });
449
+ const reader = new FileReader();
450
+ reader.onloadend = () => {
451
+ setImageToCrop(reader.result);
452
+ setShowCropModal(true);
453
+ };
454
+ reader.readAsDataURL(file);
455
+ }
456
+ else {
457
+ // Non-image file, add directly
458
+ const attachedFile = {
459
+ id: Math.random().toString(36).substr(2, 9),
460
+ name: file.name,
461
+ size: file.size,
462
+ type: file.type,
463
+ file,
464
+ url: URL.createObjectURL(file)
465
+ };
466
+ onChange?.([...currentFiles, attachedFile]);
467
+ }
468
+ };
469
+ const handleDragOver = (e) => {
470
+ e.preventDefault();
471
+ if (!disabled) {
472
+ setIsDragging(true);
473
+ }
474
+ };
475
+ const handleDragLeave = (e) => {
476
+ e.preventDefault();
477
+ setIsDragging(false);
478
+ };
479
+ const handleDrop = (e) => {
480
+ e.preventDefault();
481
+ setIsDragging(false);
482
+ if (disabled)
483
+ return;
484
+ const files = e.dataTransfer.files;
485
+ handleFileSelect(files);
486
+ };
487
+ // Fetch emails using EmailContext
488
+ const handleOpenEmailModal = () => {
489
+ setShowEmailImportModal(true);
490
+ // Refresh emails if needed
491
+ if (emailState.emails.length === 0 && emailActions?.fetchEmails) {
492
+ emailActions.fetchEmails();
493
+ }
494
+ };
495
+ // Handle email selection and import
496
+ // State for import loading
497
+ const [importingEmail, setImportingEmail] = React.useState(false);
498
+ const handleEmailImport = async (email) => {
499
+ const currentFiles = value || [];
500
+ setImportingEmail(true);
501
+ try {
502
+ // Download the actual .eml file from the API
503
+ // Pass folder hint for faster fetching (skips searching all folders)
504
+ const folderParam = email.folder ? `&folder=${encodeURIComponent(email.folder)}` : '';
505
+ const response = await fetch(`/api/emails/${email.id}?format=eml${folderParam}`, {
506
+ method: 'GET',
507
+ credentials: 'include'
508
+ });
509
+ if (!response.ok) {
510
+ let errorMsg = `HTTP ${response.status}`;
511
+ try {
512
+ const text = await response.text();
513
+ try {
514
+ const errData = JSON.parse(text);
515
+ errorMsg = errData.error || errorMsg;
516
+ }
517
+ catch {
518
+ errorMsg = text.substring(0, 200) || errorMsg;
519
+ }
520
+ }
521
+ catch { /* couldn't read body */ }
522
+ throw new Error(errorMsg);
523
+ }
524
+ // Get the raw email content
525
+ const emlContent = await response.blob();
526
+ // Create filename from subject
527
+ const safeSubject = email.subject.replace(/[<>:"/\\|?*]/g, '_').substring(0, 50);
528
+ const filename = `${safeSubject}.eml`;
529
+ // Create File object
530
+ const file = new File([emlContent], filename, { type: 'message/rfc822' });
531
+ const attachedFile = {
532
+ id: Math.random().toString(36).substr(2, 9),
533
+ name: filename,
534
+ size: file.size,
535
+ type: 'message/rfc822',
536
+ file,
537
+ url: URL.createObjectURL(emlContent)
538
+ };
539
+ onChange?.([...currentFiles, attachedFile]);
540
+ setShowEmailImportModal(false);
541
+ setSelectedEmail(null);
542
+ }
543
+ catch (error) {
544
+ console.error('Failed to import email:', error);
545
+ const msg = error instanceof Error ? error.message : 'Unknown error';
546
+ alert(`Failed to import email: ${msg}`);
547
+ }
548
+ finally {
549
+ setImportingEmail(false);
550
+ }
551
+ };
552
+ const removeFile = (fileId) => {
553
+ if (disabled)
554
+ return;
555
+ const updatedFiles = value.filter(file => file.id !== fileId);
556
+ onChange?.(updatedFiles);
557
+ };
558
+ const openFileDialog = () => {
559
+ if (disabled)
560
+ return;
561
+ fileInputRef.current?.click();
562
+ };
563
+ const openImageDialog = () => {
564
+ if (disabled)
565
+ return;
566
+ imageInputRef.current?.click();
567
+ };
568
+ const openCamera = async () => {
569
+ if (disabled)
570
+ return;
571
+ try {
572
+ // Check if mediaDevices is supported
573
+ if (!navigator.mediaDevices || !navigator.mediaDevices.getUserMedia) {
574
+ alert('Camera access is not supported in this browser. Please use a modern browser like Chrome, Firefox, or Safari.');
575
+ return;
576
+ }
577
+ // Check camera permission status if available
578
+ if (navigator.permissions && navigator.permissions.query) {
579
+ try {
580
+ const permissionStatus = await navigator.permissions.query({ name: 'camera' });
581
+ if (permissionStatus.state === 'denied') {
582
+ alert('Camera access has been blocked.\n\n' +
583
+ 'To enable camera access:\n' +
584
+ '1. Click the camera/lock icon in your browser\'s address bar\n' +
585
+ '2. Change camera permission to "Allow"\n' +
586
+ '3. Refresh the page and try again');
587
+ return;
588
+ }
589
+ }
590
+ catch (permError) {
591
+ // Permission API might not support camera, continue anyway
592
+ }
593
+ }
594
+ let stream = null;
595
+ try {
596
+ // Try with default camera first (more compatible)
597
+ stream = await navigator.mediaDevices.getUserMedia({
598
+ video: {
599
+ width: { ideal: 1920 },
600
+ height: { ideal: 1080 }
601
+ }
602
+ });
603
+ }
604
+ catch (firstError) {
605
+ // Fallback: Try with minimal constraints
606
+ try {
607
+ stream = await navigator.mediaDevices.getUserMedia({
608
+ video: true
609
+ });
610
+ }
611
+ catch (secondError) {
612
+ // If both attempts fail, throw the second error
613
+ throw secondError;
614
+ }
615
+ }
616
+ if (stream) {
617
+ setCameraStream(stream);
618
+ setShowCameraModal(true);
619
+ // Wait for modal to render then set video source
620
+ setTimeout(() => {
621
+ if (videoRef.current) {
622
+ videoRef.current.srcObject = stream;
623
+ videoRef.current.play().catch(() => {
624
+ // Video play error - silently handled
625
+ });
626
+ }
627
+ }, 100);
628
+ }
629
+ }
630
+ catch (err) {
631
+ // Provide specific error messages based on error type
632
+ let errorMessage = 'Unable to access camera. ';
633
+ if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') {
634
+ errorMessage += 'Camera permission was denied.\n\n';
635
+ errorMessage += 'To fix this:\n';
636
+ errorMessage += '1. Click the camera/lock icon in your browser\'s address bar\n';
637
+ errorMessage += '2. Allow camera access for this site\n';
638
+ errorMessage += '3. Refresh the page and try again\n\n';
639
+ errorMessage += 'Note: Camera access requires HTTPS (secure connection).';
640
+ }
641
+ else if (err.name === 'NotFoundError' || err.name === 'DevicesNotFoundError') {
642
+ errorMessage += 'No camera found on this device.';
643
+ }
644
+ else if (err.name === 'NotReadableError' || err.name === 'TrackStartError') {
645
+ errorMessage += 'Camera is already in use by another application. Please close other apps using the camera and try again.';
646
+ }
647
+ else if (err.name === 'OverconstrainedError') {
648
+ errorMessage += 'Camera does not support the requested settings. Trying with default settings...';
649
+ }
650
+ else if (err.name === 'SecurityError') {
651
+ errorMessage += 'Camera access is blocked due to security restrictions.\n\n';
652
+ errorMessage += 'This usually happens when:\n';
653
+ errorMessage += '- The site is not served over HTTPS\n';
654
+ errorMessage += '- Browser security settings block camera access\n';
655
+ errorMessage += '- You\'re using an incognito/private window';
656
+ }
657
+ else {
658
+ errorMessage += `Error: ${err.message || 'Unknown error'}\n\n`;
659
+ errorMessage += 'Please check your browser permissions and try again.';
660
+ }
661
+ alert(errorMessage);
662
+ }
663
+ };
664
+ const capturePhoto = () => {
665
+ if (!videoRef.current || !canvasRef.current)
666
+ return;
667
+ const video = videoRef.current;
668
+ const canvas = canvasRef.current;
669
+ const ctx = canvas.getContext('2d');
670
+ canvas.width = video.videoWidth;
671
+ canvas.height = video.videoHeight;
672
+ ctx?.drawImage(video, 0, 0);
673
+ const imageDataUrl = canvas.toDataURL('image/jpeg');
674
+ setCapturedImage(imageDataUrl);
675
+ };
676
+ const retakePhoto = () => {
677
+ setCapturedImage(null);
678
+ };
679
+ const confirmPhoto = () => {
680
+ if (!capturedImage)
681
+ return;
682
+ // Convert data URL to blob
683
+ fetch(capturedImage)
684
+ .then(res => res.blob())
685
+ .then(blob => {
686
+ const fileName = `camera-${Date.now()}.jpg`;
687
+ let file;
688
+ try {
689
+ file = new File([blob], fileName, { type: 'image/jpeg' });
690
+ }
691
+ catch (error) {
692
+ // Fallback for older browsers
693
+ const fileBlob = blob;
694
+ fileBlob.name = fileName;
695
+ fileBlob.lastModified = Date.now();
696
+ file = fileBlob;
697
+ }
698
+ const fileList = {
699
+ 0: file,
700
+ length: 1,
701
+ item: (index) => index === 0 ? file : null,
702
+ [Symbol.iterator]: function* () {
703
+ yield file;
704
+ }
705
+ };
706
+ handleFileSelect(fileList);
707
+ closeCameraModal();
708
+ });
709
+ };
710
+ const closeCameraModal = () => {
711
+ if (cameraStream) {
712
+ cameraStream.getTracks().forEach(track => track.stop());
713
+ setCameraStream(null);
714
+ }
715
+ setCapturedImage(null);
716
+ setShowCameraModal(false);
717
+ };
718
+ const downloadFile = (file) => {
719
+ if (file.url) {
720
+ const link = document.createElement('a');
721
+ link.href = file.url;
722
+ link.download = file.name;
723
+ link.click();
724
+ }
725
+ };
726
+ const handlePreviewFile = async (file) => {
727
+ // For server URLs (not blob/data URLs and no local file), fetch and create blob
728
+ const isServerUrl = file.url && !file.url.startsWith('blob:') && !file.url.startsWith('data:') && !file.file;
729
+ if (isServerUrl && file.url) {
730
+ try {
731
+ const response = await fetch(file.url);
732
+ const blob = await response.blob();
733
+ const blobUrl = URL.createObjectURL(blob);
734
+ // Create updated file with blob URL and size
735
+ const updatedFile = {
736
+ ...file,
737
+ url: blobUrl,
738
+ size: blob.size,
739
+ file: new File([blob], file.name, { type: blob.type || file.type })
740
+ };
741
+ setPreviewFile(updatedFile);
742
+ setImageZoom(1);
743
+ setImageRotation(0);
744
+ }
745
+ catch (error) {
746
+ // If fetch fails, open in new tab as fallback
747
+ window.open(file.url, '_blank');
748
+ }
749
+ return;
750
+ }
751
+ setPreviewFile(file);
752
+ setImageZoom(1);
753
+ setImageRotation(0);
754
+ };
755
+ const hasFile = value.length > 0;
756
+ const singleFile = value.length === 1 ? value[0] : null;
757
+ const isImage = singleFile?.type.startsWith('image/');
758
+ // Preview size classes
759
+ const previewSizeClasses = {
760
+ sm: previewShape === 'circular' ? 'w-24 h-24' : 'w-32 h-20',
761
+ md: previewShape === 'circular' ? 'w-32 h-32' : 'w-48 h-28',
762
+ lg: previewShape === 'circular' ? 'w-40 h-40' : 'w-64 h-36',
763
+ };
764
+ return (_jsxs("div", { className: cn('w-full', className), children: [showInlinePreview && hasFile && singleFile && isImage ? (_jsxs("div", { className: "flex flex-col items-center justify-center", children: [_jsx("input", { ref: fileInputRef, type: "file", multiple: maxFiles > 1, accept: "image/*", onChange: (e) => handleFileSelect(e.target.files), className: "hidden", disabled: disabled }), _jsx("input", { ref: imageInputRef, type: "file", multiple: maxFiles > 1, accept: "image/*", onChange: (e) => handleFileSelect(e.target.files), className: "hidden", disabled: disabled }), _jsxs("div", { className: "relative group flex-shrink-0", children: [_jsx("div", { className: cn(previewSizeClasses[previewSize], previewShape === 'circular' && 'rounded-full', previewShape === 'rectangular' && 'rounded-lg', 'border-2 border-[rgb(var(--bd-default))] overflow-hidden bg-gray-50 cursor-pointer transition-all hover:shadow-lg relative'), children: singleFile.url ? (_jsx("img", { src: singleFile.url, alt: singleFile.name, className: cn('w-full h-full object-cover absolute inset-0', previewShape === 'circular' && 'object-center'), onError: () => {
765
+ // Image load error - silently handled
766
+ } })) : (_jsx("div", { className: "absolute inset-0 flex items-center justify-center text-xs text-gray-400", children: "No preview" })) }), _jsxs("div", { className: cn('absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2 cursor-pointer', previewShape === 'circular' && 'rounded-full', previewShape === 'rectangular' && 'rounded-lg'), children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: (e) => {
767
+ e.stopPropagation();
768
+ handlePreviewFile(singleFile);
769
+ }, disabled: disabled, className: "h-8 bg-white/90 hover:bg-white border-white", children: [_jsx(Eye, { className: "h-3 w-3 mr-1" }), "Preview"] }), _jsxs(Button, { variant: "outline", size: "sm", onClick: (e) => {
770
+ e.stopPropagation();
771
+ openFileDialog();
772
+ }, disabled: disabled, className: "h-8 bg-white/90 hover:bg-white border-white", children: [_jsx(Upload, { className: "h-3 w-3 mr-1" }), "Change"] })] })] }), label && (_jsx("label", { className: "block text-sm font-medium text-gray-700 mt-3 text-center", children: label }))] })) : showInlinePreview ? (
773
+ /* Empty state for inline preview - matches final shape */
774
+ _jsxs("div", { className: "flex flex-col items-center justify-center", children: [_jsx("input", { ref: fileInputRef, type: "file", multiple: maxFiles > 1, accept: "image/*", onChange: (e) => handleFileSelect(e.target.files), className: "hidden", disabled: disabled }), _jsx("input", { ref: imageInputRef, type: "file", multiple: maxFiles > 1, accept: "image/*", onChange: (e) => handleFileSelect(e.target.files), className: "hidden", disabled: disabled }), _jsxs("div", { className: "relative group", children: [_jsx("div", { className: cn(previewSizeClasses[previewSize], previewShape === 'circular' && 'rounded-full', previewShape === 'rectangular' && 'rounded-lg', 'border-2 border-dashed border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))] cursor-pointer transition-all hover:border-gray-400 flex items-center justify-center'), onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, children: _jsx(Plus, { className: "h-8 w-8 text-gray-400 group-hover:text-gray-600 transition-colors" }) }), _jsxs("div", { className: cn('absolute inset-0 bg-white/95 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2', previewShape === 'circular' && 'rounded-full', previewShape === 'rectangular' && 'rounded-lg'), children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: (e) => {
775
+ e.stopPropagation();
776
+ openFileDialog();
777
+ }, disabled: disabled || value.length >= maxFiles, className: "h-8 bg-white border-gray-300 hover:border-gray-400", children: [_jsx(Upload, { className: "h-3 w-3 mr-1" }), "Upload"] }), enableEmailImport && (_jsxs(Button, { variant: "outline", size: "sm", onClick: (e) => {
778
+ e.stopPropagation();
779
+ handleOpenEmailModal();
780
+ }, disabled: disabled || value.length >= maxFiles, className: "h-8 bg-white border-gray-300 hover:border-gray-400", children: [_jsx(Mail, { className: "h-3 w-3 mr-1" }), "Email"] }))] })] }), label && (_jsx("label", { className: "block text-sm font-medium text-gray-700 mt-3 text-center", children: label }))] })) : (
781
+ /* Regular Upload Area - Non-inline preview mode */
782
+ _jsxs("div", { children: [label && (_jsx("label", { className: "block text-xs font-medium text-gray-700 mb-1", children: label })), !hideDropzone && (_jsxs("div", { className: cn('group border-2 border-dashed rounded-lg transition-all duration-200 px-3 py-2 h-10', isDragging && !disabled && 'border-blue-400 bg-blue-50', !isDragging && !disabled && 'border-gray-300 hover:border-gray-400', disabled && 'border-gray-200 bg-gray-50 cursor-not-allowed', 'cursor-pointer flex flex-col items-center justify-center relative'), onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: openFileDialog, children: [_jsx("input", { ref: fileInputRef, type: "file", multiple: true, accept: ".pdf,.xlsx,.xls,.png,.jpg,.jpeg,.gif,.bmp,.webp,.eml,.msg", onChange: (e) => handleFileSelect(e.target.files), className: "hidden", disabled: disabled }), _jsx("input", { ref: imageInputRef, type: "file", multiple: true, accept: "image/*", onChange: (e) => handleFileSelect(e.target.files), className: "hidden", disabled: disabled }), !hideInstructions && (_jsx("p", { className: "text-xs text-[rgb(var(--fg-muted))]", children: "Hover to upload or drag and drop (PDF, XLSX, PNG, JPG, EML)" })), _jsxs("div", { className: "absolute inset-0 bg-white/95 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-3 rounded-lg", children: [_jsxs(Button, { variant: "outline", size: "sm", onClick: (e) => {
783
+ e.stopPropagation();
784
+ openFileDialog();
785
+ }, disabled: disabled || value.length >= maxFiles, className: "h-8 text-xs", children: [_jsx(Upload, { className: "h-3 w-3 mr-1" }), "Upload Files"] }), enableEmailImport && (_jsxs(Button, { variant: "outline", size: "sm", onClick: (e) => {
786
+ e.stopPropagation();
787
+ handleOpenEmailModal();
788
+ }, disabled: disabled || value.length >= maxFiles, className: "h-8 text-xs", children: [_jsx(Mail, { className: "h-3 w-3 mr-1" }), "Import from Email"] }))] })] }))] })), _jsx(AnimatePresence, { children: value.length > 0 && !(showInlinePreview && singleFile && isImage) && (_jsx(motion.div, { initial: { opacity: 0, height: 0 }, animate: { opacity: 1, height: 'auto' }, exit: { opacity: 0, height: 0 }, transition: { duration: 0.3 }, className: "mt-2", children: _jsx("div", { className: "flex flex-wrap gap-2", children: value.map((file, index) => {
789
+ const FileIcon = getFileIcon(file.type, file.name);
790
+ const colorClasses = getFileTypeColor(file.type, file.name);
791
+ return (_jsxs(motion.div, { initial: { opacity: 0, scale: 0.8 }, animate: { opacity: 1, scale: 1 }, exit: { opacity: 0, scale: 0.8 }, transition: { duration: 0.2, delay: index * 0.03 }, className: "relative group", children: [_jsxs("div", { title: file.name, className: cn('flex flex-col items-center justify-center p-1.5 bg-[rgb(var(--bg-surface))] border rounded hover:shadow-sm transition-all duration-200 cursor-pointer w-14 h-14 relative', onFileClick && selectedFileId === file.id
792
+ ? 'border-[rgb(var(--color-primary))] ring-2 ring-[rgb(var(--color-primary))]/40'
793
+ : 'border-[rgb(var(--bd-default))]'), onClick: () => onFileClick ? onFileClick(file) : handlePreviewFile(file), children: [_jsx("div", { className: cn('p-1 rounded mb-0.5', colorClasses), children: _jsx(FileIcon, { className: "h-3.5 w-3.5" }) }), _jsx("div", { className: "text-[9px] text-[rgb(var(--fg-muted))] truncate w-full text-center leading-tight", children: formatFileSize(file.size) }), _jsxs("div", { className: "absolute inset-0 bg-black/40 rounded flex items-center justify-center gap-1.5 opacity-0 group-hover:opacity-100 transition-opacity duration-200", children: [_jsx("button", { className: "p-1 rounded-full bg-white/20 hover:bg-white/40 transition-colors", onClick: (e) => {
794
+ e.stopPropagation();
795
+ handlePreviewFile(file);
796
+ }, title: "Preview", children: _jsx(Eye, { className: "h-3 w-3 text-white" }) }), _jsx("button", { className: "p-1 rounded-full bg-white/20 hover:bg-white/40 transition-colors", onClick: (e) => {
797
+ e.stopPropagation();
798
+ downloadFile(file);
799
+ }, title: "Download", children: _jsx(Download, { className: "h-3 w-3 text-white" }) })] })] }), _jsx("button", { className: "absolute -top-1.5 -right-1.5 h-4 w-4 p-0 bg-red-500 hover:bg-red-600 text-white rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex items-center justify-center", onClick: (e) => {
800
+ e.stopPropagation();
801
+ removeFile(file.id);
802
+ }, disabled: disabled, children: _jsx(X, { className: "h-2.5 w-2.5" }) }), _jsxs("div", { className: "absolute bottom-full left-0 mb-1 px-2 py-1 bg-gray-900 text-white text-[10px] rounded shadow-lg opacity-0 group-hover:opacity-100 transition-opacity duration-200 pointer-events-none max-w-[12rem] truncate z-[120]", children: [file.name, _jsx("div", { className: "absolute top-full left-3 border-4 border-transparent border-t-gray-900" })] })] }, file.id));
803
+ }) }) })) }), typeof document !== 'undefined' && createPortal(_jsx(AnimatePresence, { children: previewFile && (_jsx(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2, ease: "easeOut" }, className: "fixed inset-0 bg-black/95 z-[200] flex flex-col", onClick: () => setPreviewFile(null), children: _jsxs(motion.div, { initial: { scale: 0.98, opacity: 0, y: 20 }, animate: { scale: 1, opacity: 1, y: 0 }, exit: { scale: 0.98, opacity: 0, y: 20 }, transition: { duration: 0.25, ease: "easeOut" }, className: "bg-white w-full h-full flex flex-col", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-3 border-b border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))]", children: [_jsxs("div", { className: "flex items-center space-x-3", children: [(() => {
804
+ const FileIconComponent = getFileIcon(previewFile.type, previewFile.name);
805
+ const colorClasses = getFileTypeColor(previewFile.type, previewFile.name);
806
+ return (_jsx("div", { className: cn('p-2 rounded-lg', colorClasses), children: _jsx(FileIconComponent, { className: "h-5 w-5" }) }));
807
+ })(), _jsxs("div", { children: [_jsx("h3", { className: "font-semibold text-[rgb(var(--fg-default))]", children: previewFile.name }), _jsx("p", { className: "text-sm text-[rgb(var(--fg-muted))]", children: formatFileSize(previewFile.size) })] })] }), _jsxs("div", { className: "flex items-center space-x-2", children: [_jsx(Button, { variant: "action-download", onClick: () => downloadFile(previewFile), icon: Download, children: "Download" }), _jsx("button", { onClick: () => setPreviewFile(null), className: "close-btn-md", "aria-label": "Close preview modal", children: _jsx(X, { className: "h-4 w-4" }) })] })] }), _jsx("div", { className: cn("flex-1 overflow-hidden", (isEmailFile(previewFile.type, previewFile.name) || isExcelFile(previewFile.type, previewFile.name)) ? "min-h-0" : "bg-[rgb(var(--bg-muted))]"), children: previewFile.type.startsWith('image/') && previewFile.url ? (_jsx("div", { className: "w-full h-full flex items-center justify-center p-4 bg-[rgb(var(--bg-muted))]", children: _jsx(ImagePreviewContent, { file: previewFile }) })) : previewFile.type === 'application/pdf' && previewFile.url ? (
808
+ /* PDF Preview - Using browser's built-in viewer */
809
+ _jsx("div", { className: "w-full h-full", children: _jsx("iframe", { src: previewFile.url, className: "w-full h-full border-0", title: previewFile.name }) })) : previewFile.type.startsWith('text/') && previewFile.url ? (_jsx("div", { className: "w-full h-full p-4", children: _jsx("iframe", { src: previewFile.url, className: "w-full h-full rounded-lg border border-[rgb(var(--bd-default))] bg-white", title: previewFile.name }) })) : isEmailFile(previewFile.type, previewFile.name) ? (_jsx(EmailPreview, { file: previewFile })) : isExcelFile(previewFile.type, previewFile.name) ? (_jsx(ExcelPreviewContent, { file: previewFile })) : (_jsxs("div", { className: "w-full h-full flex flex-col items-center justify-center py-12 text-[rgb(var(--fg-muted))]", children: [(() => {
810
+ const FileIconComponent = getFileIcon(previewFile.type, previewFile.name);
811
+ return _jsx(FileIconComponent, { className: "h-16 w-16 mb-4" });
812
+ })(), _jsx("h3", { className: "text-lg font-medium mb-2 text-[rgb(var(--fg-default))]", children: "Preview not available" }), _jsxs("p", { className: "text-sm text-center mb-4", children: ["This file type cannot be previewed directly.", _jsx("br", {}), "Click download to view the file."] }), _jsxs(Button, { variant: "outline", onClick: () => downloadFile(previewFile), children: [_jsx(Download, { className: "h-4 w-4 mr-2" }), "Download File"] })] })) })] }) })) }), document.body), _jsx(Modal, { open: showCropModal && !!imageToCrop, onOpenChange: (open) => {
813
+ if (!open) {
814
+ setShowCropModal(false);
815
+ setImageToCrop(null);
816
+ setOriginalFileInfo(null);
817
+ setCrop(undefined);
818
+ setCompletedCrop(undefined);
819
+ }
820
+ }, children: _jsxs(ModalContent, { size: "lg", hideCloseButton: true, disableOutsideClick: true, className: "p-0 flex flex-col overflow-hidden max-w-3xl w-[90vw] h-[80vh] max-h-[700px]", children: [_jsx(ModalHeader, { className: "px-6 py-4 border-b border-[rgb(var(--bd-default))] flex-shrink-0", children: _jsx(ModalTitle, { children: "Crop Image" }) }), _jsx("div", { className: "flex-1 flex items-center justify-center bg-[rgb(var(--bg-muted))] overflow-auto p-4", style: { minHeight: 0 }, children: imageToCrop && (_jsx(ReactCrop, { crop: crop, onChange: (_, percentCrop) => setCrop(percentCrop), onComplete: (c) => setCompletedCrop(c), aspect: previewShape === 'circular' ? 1 : undefined, circularCrop: previewShape === 'circular', className: "max-h-full", ruleOfThirds: true, children: _jsx("img", { ref: cropImageRef, src: imageToCrop, alt: "Crop preview", style: { maxHeight: '55vh', maxWidth: '100%' }, onLoad: (e) => {
821
+ const { width, height } = e.currentTarget;
822
+ const initialCrop = centerAspectCrop(width, height, previewShape === 'circular' ? 1 : undefined);
823
+ setCrop(initialCrop);
824
+ } }) })) }), _jsx(Footer, { variant: "modal", gradient: true, actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "action-cancel", onClick: () => {
825
+ setShowCropModal(false);
826
+ setImageToCrop(null);
827
+ setOriginalFileInfo(null);
828
+ setCrop(undefined);
829
+ setCompletedCrop(undefined);
830
+ }, icon: XCircle, children: "Cancel" }), _jsx(Button, { variant: "action-save", disabled: !completedCrop, onClick: async () => {
831
+ if (!cropImageRef.current || !completedCrop)
832
+ return;
833
+ // Preserve original file format and build cropped filename
834
+ const origType = originalFileInfo?.type || 'image/jpeg';
835
+ const origName = originalFileInfo?.name || 'image.jpg';
836
+ const lastDot = origName.lastIndexOf('.');
837
+ const baseName = lastDot > 0 ? origName.substring(0, lastDot) : origName;
838
+ const extension = lastDot > 0 ? origName.substring(lastDot) : '.jpg';
839
+ const croppedName = `${baseName}_cropped${extension}`;
840
+ const result = await getCroppedImg(cropImageRef.current, completedCrop, origType);
841
+ if (result) {
842
+ const { blob, url } = result;
843
+ if (blob.size > 10 * 1024 * 1024) {
844
+ alert('Cropped image is too large (max 10MB). Please crop a smaller area.');
845
+ return;
846
+ }
847
+ const reader = new FileReader();
848
+ reader.onloadend = () => {
849
+ const attachedFile = {
850
+ id: Math.random().toString(36).substr(2, 9),
851
+ name: croppedName,
852
+ size: blob.size,
853
+ type: origType,
854
+ file: new File([blob], croppedName, { type: origType }),
855
+ url: reader.result
856
+ };
857
+ // Append to existing files instead of replacing
858
+ const currentFiles = value || [];
859
+ onChange?.([...currentFiles, attachedFile]);
860
+ setShowCropModal(false);
861
+ setImageToCrop(null);
862
+ setOriginalFileInfo(null);
863
+ setCrop(undefined);
864
+ setCompletedCrop(undefined);
865
+ };
866
+ reader.readAsDataURL(blob);
867
+ URL.revokeObjectURL(url);
868
+ }
869
+ }, icon: Save, children: "Crop & Upload" })] }) })] }) }), _jsx(Modal, { open: showEmailImportModal, onOpenChange: (open) => {
870
+ if (!open) {
871
+ setShowEmailImportModal(false);
872
+ setSelectedEmail(null);
873
+ setEmailSearchQuery('');
874
+ }
875
+ }, children: _jsxs(ModalContent, { size: "lg", hideCloseButton: true, disableOutsideClick: true, className: "p-0 flex flex-col overflow-hidden max-w-2xl w-[90vw] h-[75vh] max-h-[650px]", children: [_jsx(ModalHeader, { className: "px-5 py-3 border-b border-[rgb(var(--bd-default))] flex-shrink-0 bg-[rgb(var(--bg-surface))]", children: _jsxs("div", { className: "flex items-center justify-between w-full gap-3", children: [_jsxs("div", { className: "flex items-center gap-3 flex-shrink-0", children: [_jsx("div", { className: "w-9 h-9 rounded-lg bg-[rgba(var(--color-primary),0.1)] flex items-center justify-center", children: _jsx(Mail, { className: "h-4.5 w-4.5 text-[rgb(var(--color-primary))]" }) }), _jsxs("div", { children: [_jsx(ModalTitle, { className: "text-sm", children: "Import from Email" }), emailState.emails.length > 0 && (_jsxs("p", { className: "text-xs text-[rgb(var(--fg-muted))] mt-0.5", children: [emailState.emails.length, " emails"] }))] })] }), _jsxs("div", { className: "flex-1 min-w-0 relative", children: [_jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-[rgb(var(--fg-muted))]" }), _jsx("input", { type: "text", placeholder: "Search by subject, sender, or content...", value: emailSearchQuery, onChange: (e) => setEmailSearchQuery(e.target.value), className: "w-full pl-9 pr-8 py-1.5 rounded-md border border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-default))] text-xs text-[rgb(var(--fg-default))] placeholder:text-[rgb(var(--fg-muted))] focus:outline-none focus:ring-2 focus:ring-[rgb(var(--color-primary))] focus:border-transparent" }), emailSearchQuery && (_jsx("button", { onClick: () => setEmailSearchQuery(''), className: "absolute right-2.5 top-1/2 -translate-y-1/2 p-0.5 rounded hover:bg-[rgb(var(--bg-hover))]", children: _jsx(X, { className: "h-3.5 w-3.5 text-[rgb(var(--fg-muted))]" }) }))] }), _jsxs("div", { className: "flex items-center gap-2 flex-shrink-0", children: [_jsx("button", { onClick: () => emailActions?.fetchEmails?.(), disabled: emailState.loading, className: "p-1.5 rounded-md hover:bg-[rgb(var(--bg-hover))] text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors disabled:opacity-50", "aria-label": "Refresh emails", children: _jsx(RefreshCw, { className: cn("h-4 w-4", emailState.loading && "animate-spin") }) }), _jsx("button", { onClick: () => {
876
+ setShowEmailImportModal(false);
877
+ setSelectedEmail(null);
878
+ setEmailSearchQuery('');
879
+ }, className: "close-btn-md", "aria-label": "Close modal", children: _jsx(X, { className: "h-5 w-5" }) })] })] }) }), _jsx("div", { className: "flex-1 overflow-auto", style: { minHeight: 0 }, children: emailState.loading && emailState.emails.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-3", children: [_jsx("div", { className: "w-8 h-8 border-2 border-[rgb(var(--color-primary))] border-t-transparent rounded-full animate-spin" }), _jsx("div", { className: "text-sm text-[rgb(var(--fg-muted))]", children: "Loading emails..." })] })) : emailState.emails.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center h-full gap-3 p-6", children: [_jsx("div", { className: "w-16 h-16 rounded-full bg-[rgb(var(--bg-muted))] flex items-center justify-center", children: _jsx(Mail, { className: "h-8 w-8 text-[rgb(var(--fg-muted))]" }) }), _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-base font-medium text-[rgb(var(--fg-default))] mb-1", children: "No emails found" }), _jsx("div", { className: "text-sm text-[rgb(var(--fg-muted))]", children: "Check your email configuration in User Master" })] })] })) : (_jsx("div", { className: "divide-y divide-[rgb(var(--bd-subtle))]", children: emailState.emails
880
+ .filter((email) => {
881
+ if (!emailSearchQuery.trim())
882
+ return true;
883
+ const query = emailSearchQuery.toLowerCase();
884
+ const subject = (email.subject || '').toLowerCase();
885
+ const fromObj = email.from;
886
+ const fromName = (typeof fromObj === 'string' ? fromObj : (fromObj?.name || fromObj?.email || '')).toLowerCase();
887
+ const fromEmailAddr = (typeof fromObj === 'string' ? '' : (fromObj?.email || '')).toLowerCase();
888
+ const body = (email.body || email.snippet || '').toLowerCase();
889
+ return subject.includes(query) || fromName.includes(query) || fromEmailAddr.includes(query) || body.includes(query);
890
+ })
891
+ .map((email) => {
892
+ const fromName = typeof email.from === 'string' ? email.from : email.from?.name || email.from?.email || 'Unknown';
893
+ const fromEmail = typeof email.from === 'string' ? email.from : email.from?.email || '';
894
+ const emailDate = email.receivedAt || email.sentAt;
895
+ const formattedDate = emailDate ? new Date(emailDate).toLocaleDateString('en-US', {
896
+ month: 'short',
897
+ day: 'numeric',
898
+ year: new Date(emailDate).getFullYear() !== new Date().getFullYear() ? 'numeric' : undefined
899
+ }) : '';
900
+ const formattedTime = emailDate ? new Date(emailDate).toLocaleTimeString('en-US', {
901
+ hour: 'numeric',
902
+ minute: '2-digit'
903
+ }) : '';
904
+ const snippet = email.snippet || email.body?.substring(0, 120) || '';
905
+ const isSelected = selectedEmail?.id === email.id;
906
+ return (_jsx("div", { onClick: () => setSelectedEmail({
907
+ id: email.id,
908
+ subject: email.subject || '(No Subject)',
909
+ from: fromEmail,
910
+ date: emailDate || new Date().toISOString(),
911
+ body: email.body || email.snippet || '',
912
+ attachments: email.attachments?.map(a => ({ name: a.filename, size: a.size || 0, type: a.contentType || '' })) || [],
913
+ folder: email.folder
914
+ }), className: cn('px-4 py-3 cursor-pointer transition-all', isSelected
915
+ ? 'bg-[rgba(var(--color-primary),0.08)] border-l-2 border-l-[rgb(var(--color-primary))]'
916
+ : 'hover:bg-[rgb(var(--bg-hover))] border-l-2 border-l-transparent', !email.isRead && 'bg-[rgb(var(--bg-subtle))]'), children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsxs("div", { className: "relative flex-shrink-0", children: [_jsx("div", { className: cn("w-10 h-10 rounded-full flex items-center justify-center text-white text-sm font-medium", isSelected ? "bg-[rgb(var(--color-primary))]" : "bg-[rgb(var(--color-info))]"), children: isSelected ? (_jsx("svg", { className: "w-5 h-5 text-white", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 3, d: "M5 13l4 4L19 7" }) })) : (fromName.charAt(0).toUpperCase()) }), !email.isRead && !isSelected && (_jsx("div", { className: "absolute -top-0.5 -right-0.5 w-3 h-3 rounded-full bg-[rgb(var(--color-primary))] border-2 border-white" }))] }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 mb-0.5", children: [_jsx("span", { className: cn("text-sm truncate", !email.isRead ? "font-semibold text-[rgb(var(--fg-default))]" : "font-medium text-[rgb(var(--fg-default))]"), children: fromName }), _jsxs("span", { className: "text-xs text-[rgb(var(--fg-muted))] flex-shrink-0 whitespace-nowrap", children: [formattedDate, " ", formattedTime] })] }), _jsx("div", { className: cn("text-sm truncate mb-1", !email.isRead ? "font-medium text-[rgb(var(--fg-default))]" : "text-[rgb(var(--fg-muted))]"), children: email.subject || '(No Subject)' }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-xs text-[rgb(var(--fg-muted))] truncate flex-1", children: snippet.length > 100 ? snippet.substring(0, 100) + '...' : snippet }), email.attachments && email.attachments.length > 0 && (_jsxs("span", { className: "flex items-center gap-1 text-xs text-[rgb(var(--fg-muted))] flex-shrink-0 bg-[rgb(var(--bg-muted))] px-1.5 py-0.5 rounded", children: [_jsx(Paperclip, { className: "h-3 w-3" }), email.attachments.length] }))] })] })] }) }, email.id));
917
+ }) })) }), _jsx(Footer, { variant: "modal", gradient: true, actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: "action-cancel", onClick: () => {
918
+ setShowEmailImportModal(false);
919
+ setSelectedEmail(null);
920
+ setEmailSearchQuery('');
921
+ }, icon: XCircle, children: "Cancel" }), _jsx(Button, { variant: "action-save", disabled: !selectedEmail || importingEmail, onClick: () => {
922
+ if (selectedEmail) {
923
+ handleEmailImport(selectedEmail);
924
+ }
925
+ }, icon: Mail, loading: importingEmail, children: importingEmail ? 'Importing...' : 'Import Email' })] }) })] }) }), _jsx(AnimatePresence, { children: showCameraModal && (_jsx(motion.div, { initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, transition: { duration: 0.2, ease: "easeOut" }, className: "fixed inset-0 bg-black/95 z-50 flex flex-col", onClick: closeCameraModal, children: _jsxs(motion.div, { initial: { scale: 0.98, opacity: 0, y: 20 }, animate: { scale: 1, opacity: 1, y: 0 }, exit: { scale: 0.98, opacity: 0, y: 20 }, transition: { duration: 0.25, ease: "easeOut" }, className: "bg-white w-full h-full flex flex-col", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-center justify-between p-4 border-b", children: [_jsx("h3", { className: "text-lg font-semibold text-gray-900", children: capturedImage ? 'Review Photo' : 'Take Photo' }), _jsx(Button, { variant: "ghost", size: "sm", onClick: closeCameraModal, children: _jsx(X, { className: "h-4 w-4" }) })] }), _jsx("div", { className: "flex-1 flex items-center justify-center p-4 bg-black", children: !capturedImage ? (
926
+ /* Live Camera View */
927
+ _jsxs("div", { className: "relative w-full max-w-2xl aspect-video bg-gray-900 rounded-lg overflow-hidden", children: [_jsx("video", { ref: videoRef, className: "w-full h-full object-cover", playsInline: true, muted: true }), _jsx("canvas", { ref: canvasRef, className: "hidden" }), _jsx("div", { className: "absolute bottom-4 left-1/2 transform -translate-x-1/2", children: _jsx(Button, { onClick: capturePhoto, className: "w-16 h-16 rounded-full bg-white text-gray-900 hover:bg-gray-100 border-4 border-white", children: _jsx(Camera, { className: "h-6 w-6" }) }) })] })) : (
928
+ /* Captured Image Preview */
929
+ _jsxs("div", { className: "relative w-full max-w-2xl", children: [_jsx("img", { src: capturedImage, alt: "Captured", className: "w-full h-auto rounded-lg" }), _jsx("div", { className: "absolute top-4 right-4 flex gap-2", children: _jsx(Button, { variant: "outline", size: "sm", onClick: retakePhoto, className: "bg-white/90 hover:bg-white", children: "Retake" }) })] })) }), _jsx("div", { className: "flex items-center justify-center p-4 border-t bg-white", children: capturedImage ? (_jsxs("div", { className: "flex gap-3", children: [_jsx(Button, { variant: "outline", onClick: retakePhoto, children: "Retake Photo" }), _jsx(Button, { variant: "primary", onClick: confirmPhoto, children: "Use Photo" })] })) : (_jsxs("div", { className: "text-sm text-gray-500 text-center", children: [_jsx("p", { children: "Position your camera and tap the capture button" }), _jsx("p", { className: "text-xs mt-1", children: "Make sure the image is clear and well-lit" })] })) })] }) })) })] }));
930
+ }