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,1029 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ /**
4
+ * Reusable chat with sidebar, sounds, floating widget, and mobile/desktop headers.
5
+ * Domain-specific branding (logo, title, messages) is injected via props.
6
+ */
7
+ import { useState, useEffect, useCallback, useRef } from 'react';
8
+ import { useSession } from 'next-auth/react';
9
+ import { useRouter } from 'next/navigation';
10
+ import { X, Plus, Maximize2, Download, Share2, Volume2, VolumeX, Bot, PanelLeftOpen, Star, Pencil, Trash2, ChevronDown, Search, Calendar } from 'lucide-react';
11
+ import { cn } from '../../lib/utils.js';
12
+ import { sendChatMessageAPI, getConversationsAPI, getMessagesAPI, deleteConversationAPI, renameConversationAPI, toggleStarConversationAPI, submitMessageFeedbackAPI, duplicateConversationAPI } from '../../lib/api/ai/chat.js';
13
+ import { useGlobalAlert } from '../../contexts/GlobalAlertContext.js';
14
+ import { useLanguage } from '../../contexts/LanguageContext.js';
15
+ import { SidePanel } from '../layout/side-panel.js';
16
+ import { Messages } from './ai-messages.js';
17
+ import { MultimodalInput } from './multimodal-input.js';
18
+ import { ChatPromptNavigator } from './chat-prompt-navigator.js';
19
+ import { DatePicker } from '../forms/date-picker/index.js';
20
+ import { getLocalDateString } from '../../lib/utils.js';
21
+ function buildSendPayload(ctx, message, autoTitle) {
22
+ if (ctx.mode === 'new') {
23
+ return { message, conversationId: undefined, newChat: true, title: autoTitle };
24
+ }
25
+ return { message, conversationId: ctx.id, newChat: false, title: null };
26
+ }
27
+ // Sidebar / search-modal date stamp: "19 May 2026, 3:42 PM".
28
+ function formatConversationStamp(iso) {
29
+ try {
30
+ const d = new Date(iso);
31
+ const date = d.toLocaleDateString(undefined, { day: '2-digit', month: 'short', year: 'numeric' });
32
+ const time = d.toLocaleTimeString(undefined, { hour: 'numeric', minute: '2-digit' });
33
+ return `${date}, ${time}`;
34
+ }
35
+ catch {
36
+ return '';
37
+ }
38
+ }
39
+ // Date-bucket key for a conversation timestamp. Buckets match the ChatGPT
40
+ // pattern: Today / Yesterday / Previous 7 Days / Previous 30 Days / Month YYYY.
41
+ function bucketForDate(iso, now = new Date()) {
42
+ if (!iso)
43
+ return { id: 'unknown', label: 'Older', sort: -1 };
44
+ const d = new Date(iso);
45
+ if (isNaN(d.getTime()))
46
+ return { id: 'unknown', label: 'Older', sort: -1 };
47
+ const startOfDay = (x) => new Date(x.getFullYear(), x.getMonth(), x.getDate()).getTime();
48
+ const today = startOfDay(now);
49
+ const that = startOfDay(d);
50
+ const diffDays = Math.floor((today - that) / 86400000);
51
+ if (diffDays <= 0)
52
+ return { id: 'today', label: 'Today', sort: 1000 };
53
+ if (diffDays === 1)
54
+ return { id: 'yesterday', label: 'Yesterday', sort: 999 };
55
+ if (diffDays <= 7)
56
+ return { id: 'prev7', label: 'Previous 7 Days', sort: 998 };
57
+ if (diffDays <= 30)
58
+ return { id: 'prev30', label: 'Previous 30 Days', sort: 997 };
59
+ const monthLabel = d.toLocaleDateString(undefined, { month: 'long', year: 'numeric' });
60
+ const sort = -(d.getFullYear() * 12 + d.getMonth());
61
+ return { id: `m-${d.getFullYear()}-${d.getMonth()}`, label: monthLabel, sort };
62
+ }
63
+ export function Chat({ mode = 'fullpage', externalMuted, title = 'Chat', sidebarTitle, bubbleLogo, logo, MessagesComponent, fullpagePath, onBeforeEditMessage, initialMessage, initialConversationId, headerActions, onMessagesChange }) {
64
+ const { data: session } = useSession();
65
+ const router = useRouter();
66
+ const alerts = useGlobalAlert();
67
+ const { t } = useLanguage();
68
+ const [conversations, setConversations] = useState([]);
69
+ // Conversation context as a discriminated union — makes the invalid combo
70
+ // (existing-mode with no id) unrepresentable. All send-payload construction
71
+ // goes through buildSendPayload() so the wire shape is derived from the union.
72
+ // The ref mirror is updated synchronously with the state so handlers reading
73
+ // mid-render still see the latest value (no render-cycle gap on chat switch).
74
+ const [convCtx, setConvCtxState] = useState({ mode: 'new' });
75
+ const convCtxRef = useRef({ mode: 'new' });
76
+ const setConvCtx = useCallback((next) => {
77
+ convCtxRef.current = next;
78
+ setConvCtxState(next);
79
+ }, []);
80
+ // Derived views — kept as locals so existing read-sites compile without churn.
81
+ const currentConversationId = convCtx.mode === 'existing' ? convCtx.id : null;
82
+ const isNewChat = convCtx.mode === 'new';
83
+ const [messages, setMessages] = useState([]);
84
+ // Stream the latest messages array out to the parent so it can derive UI state
85
+ // (e.g. SynthiaPage uses it to build the Copy-Input-Specs template from the
86
+ // active conversation's summary).
87
+ useEffect(() => {
88
+ onMessagesChange?.(messages);
89
+ }, [messages, onMessagesChange]);
90
+ const [isLoading, setIsLoading] = useState(false);
91
+ const [isSidebarOpen, setIsSidebarOpen] = useState(false);
92
+ const [isFloatingOpen, setIsFloatingOpen] = useState(false);
93
+ const [isMuted, setIsMuted] = useState(true);
94
+ // Search-chats modal — ChatGPT-style centered overlay with text search + date-range filter.
95
+ const [isSearchOpen, setIsSearchOpen] = useState(false);
96
+ const [searchQuery, setSearchQuery] = useState('');
97
+ const [searchFrom, setSearchFrom] = useState('');
98
+ const [searchTo, setSearchTo] = useState('');
99
+ // Sidebar grouping toggle: OFF → flat "Recents" list (default). ON → date buckets
100
+ // (Today / Yesterday / Previous 7 Days / Previous 30 Days / Month YYYY). Sticky via
101
+ // localStorage so power users who prefer buckets keep them across reloads.
102
+ const [groupByDate, setGroupByDate] = useState(false);
103
+ useEffect(() => {
104
+ try {
105
+ const v = localStorage.getItem('synthia.sidebarGroupByDate');
106
+ if (v === '1')
107
+ setGroupByDate(true);
108
+ }
109
+ catch { }
110
+ }, []);
111
+ useEffect(() => {
112
+ try {
113
+ localStorage.setItem('synthia.sidebarGroupByDate', groupByDate ? '1' : '0');
114
+ }
115
+ catch { }
116
+ }, [groupByDate]);
117
+ // Use external mute state if provided (e.g. from floating widget header)
118
+ const effectiveMuted = externalMuted ?? isMuted;
119
+ // Hard-limit detection — when the conversation has been closed server-side, the last assistant
120
+ // message carries the exact phrase below. Lock the input in that case.
121
+ const isConversationClosed = (() => {
122
+ for (let i = messages.length - 1; i >= 0; i--) {
123
+ const m = messages[i];
124
+ if (m.role === 'assistant') {
125
+ return /This conversation has reached its limit\.\s*Please start a new chat to continue\./i.test(m.content || '');
126
+ }
127
+ if (m.role === 'user')
128
+ return false;
129
+ }
130
+ return false;
131
+ })();
132
+ useEffect(() => {
133
+ if (session) {
134
+ loadConversations();
135
+ }
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
+ }, [session]);
138
+ const initialSentRef = useRef(false);
139
+ // Stop-generation support — abort in-flight costingbot fetch when user clicks Stop
140
+ const abortControllerRef = useRef(null);
141
+ // Scroll container for the active messages viewport (floating vs fullpage/modal)
142
+ const messagesScrollRef = useRef(null);
143
+ const handleStop = useCallback(() => {
144
+ abortControllerRef.current?.abort();
145
+ abortControllerRef.current = null;
146
+ }, []);
147
+ // The inner Messages component has its own overflow-y-auto wrapper, so the
148
+ // outer ref'd div doesn't scroll. Find the nearest actually-scrollable descendant.
149
+ const findScroller = useCallback(() => {
150
+ const root = messagesScrollRef.current;
151
+ if (!root)
152
+ return null;
153
+ if (root.scrollHeight > root.clientHeight)
154
+ return root;
155
+ const candidates = root.querySelectorAll('*');
156
+ for (const el of Array.from(candidates)) {
157
+ if (el.scrollHeight > el.clientHeight) {
158
+ const style = window.getComputedStyle(el);
159
+ if (/(auto|scroll)/.test(style.overflowY))
160
+ return el;
161
+ }
162
+ }
163
+ return root;
164
+ }, []);
165
+ const scrollToBottom = useCallback(() => {
166
+ const el = findScroller();
167
+ if (el)
168
+ el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });
169
+ }, [findScroller]);
170
+ const scrollToTop = useCallback(() => {
171
+ const el = findScroller();
172
+ if (el)
173
+ el.scrollTo({ top: 0, behavior: 'smooth' });
174
+ }, [findScroller]);
175
+ // Show "scroll to bottom" floating button when user has scrolled away from the latest message
176
+ const [showScrollDown, setShowScrollDown] = useState(false);
177
+ useEffect(() => {
178
+ const el = findScroller();
179
+ if (!el)
180
+ return;
181
+ const onScroll = () => {
182
+ const distanceFromBottom = el.scrollHeight - el.scrollTop - el.clientHeight;
183
+ setShowScrollDown(distanceFromBottom > 120);
184
+ };
185
+ onScroll();
186
+ el.addEventListener('scroll', onScroll, { passive: true });
187
+ return () => el.removeEventListener('scroll', onScroll);
188
+ }, [findScroller, messages.length]);
189
+ const loadConversations = useCallback(async () => {
190
+ if (!session)
191
+ return;
192
+ const response = await getConversationsAPI(session);
193
+ if (response.success && response.data) {
194
+ setConversations(response.data);
195
+ }
196
+ }, [session]);
197
+ const loadConversation = useCallback(async (conversationId) => {
198
+ if (!session)
199
+ return;
200
+ setConvCtx({ mode: 'existing', id: conversationId });
201
+ setMessages([]);
202
+ const response = await getMessagesAPI(conversationId, session);
203
+ if (response.success && response.data) {
204
+ const rows = response.data;
205
+ const formattedMessages = [];
206
+ const seenUiIds = new Set();
207
+ // Pending ui_data waiting to be attached to the NEXT assistant row (GPT tool-call order quirk)
208
+ let pendingUiData = [];
209
+ let pendingReadonly = false;
210
+ for (let idx = 0; idx < rows.length; idx++) {
211
+ const msg = rows[idx];
212
+ // Backend may send the text under either MessageContent or Content — read whichever is present
213
+ const rawContent = msg.MessageContent ?? msg.Content ?? '';
214
+ // Tool rows: parse, extract __ui_data, render as historical dropdown.
215
+ // If missing/invalid JSON or no __ui_data → skip (non-UI tool result, not a chat bubble).
216
+ if (msg.Role === 'tool') {
217
+ let parsedPayload = null;
218
+ let uiDataRaw = null;
219
+ try {
220
+ parsedPayload = JSON.parse(rawContent);
221
+ uiDataRaw = parsedPayload?.__ui_data;
222
+ }
223
+ catch {
224
+ // Non-JSON tool content — skip silently
225
+ }
226
+ // __ui_data might be a single entry (object) or an array — normalize to array
227
+ const uiData = Array.isArray(uiDataRaw)
228
+ ? uiDataRaw
229
+ : (uiDataRaw && typeof uiDataRaw === 'object' ? [uiDataRaw] : []);
230
+ if (uiData.length === 0)
231
+ continue;
232
+ // Stamp display_header from the parent payload onto each entry so the renderer can use it
233
+ const displayHeader = typeof parsedPayload?.display_header === 'string'
234
+ ? parsedPayload.display_header
235
+ : undefined;
236
+ const filtered = uiData
237
+ .filter((e) => e?.version === 1 && Array.isArray(e.items) && e.items.length > 0 && !seenUiIds.has(e.id))
238
+ .map(e => ({ ...e, display_header: e.display_header ?? displayHeader }));
239
+ filtered.forEach(e => seenUiIds.add(e.id));
240
+ if (filtered.length === 0)
241
+ continue;
242
+ // Contract §3.110: live iff no USER reply follows this tool row.
243
+ // A user reply after the tool means the user already picked → historical/read-only.
244
+ const hasUserAfter = rows.slice(idx + 1).some(r => r.Role === 'user');
245
+ pendingUiData.push(...filtered);
246
+ pendingReadonly = hasUserAfter;
247
+ continue;
248
+ }
249
+ const built = {
250
+ id: `${msg.MessageID || idx}`,
251
+ conversationId: conversationId,
252
+ role: msg.Role,
253
+ content: rawContent,
254
+ timestamp: new Date(),
255
+ contentType: 'text',
256
+ feedback: msg.Feedback === 1 ? 'up' : msg.Feedback === 0 ? 'down' : null
257
+ };
258
+ // If this is the assistant row that the previous tool row was meant for, attach the ui_data here
259
+ if (msg.Role === 'assistant' && pendingUiData.length > 0) {
260
+ built.ui_data = pendingUiData;
261
+ built.uiDataReadonly = pendingReadonly;
262
+ pendingUiData = [];
263
+ pendingReadonly = false;
264
+ }
265
+ formattedMessages.push(built);
266
+ }
267
+ // Any ui_data still pending after the loop means there was no assistant after the final tool row
268
+ // → it's the live/active dropdown. Attach to the most recent assistant as non-readonly.
269
+ if (pendingUiData.length > 0) {
270
+ for (let j = formattedMessages.length - 1; j >= 0; j--) {
271
+ if (formattedMessages[j].role === 'assistant') {
272
+ formattedMessages[j] = {
273
+ ...formattedMessages[j],
274
+ ui_data: [...(formattedMessages[j].ui_data || []), ...pendingUiData],
275
+ uiDataReadonly: false
276
+ };
277
+ break;
278
+ }
279
+ }
280
+ }
281
+ setMessages(formattedMessages);
282
+ }
283
+ if (window.innerWidth < 768) {
284
+ setIsSidebarOpen(false);
285
+ }
286
+ loadConversations();
287
+ }, [session, loadConversations]);
288
+ const startNewChat = useCallback(() => {
289
+ setConvCtx({ mode: 'new' });
290
+ setMessages([]);
291
+ if (window.innerWidth < 768) {
292
+ setIsSidebarOpen(false);
293
+ }
294
+ }, [setConvCtx]);
295
+ const deleteConversation = useCallback(async (conversationId) => {
296
+ if (!session)
297
+ return;
298
+ alerts.showConfirmation(t('Delete Conversation'), t('Are you sure you want to delete this conversation?'), async () => {
299
+ const response = await deleteConversationAPI(conversationId, session);
300
+ if (response.success) {
301
+ if (conversationId === currentConversationId) {
302
+ startNewChat();
303
+ }
304
+ loadConversations();
305
+ alerts.showSuccess(t('Deleted'), t('Conversation deleted successfully'));
306
+ }
307
+ else {
308
+ alerts.showError(t('Error'), response.error || t('Failed to delete conversation'));
309
+ }
310
+ });
311
+ }, [session, currentConversationId, startNewChat, loadConversations, alerts]);
312
+ const duplicateConversation = useCallback(async (conversationId) => {
313
+ if (!session)
314
+ return;
315
+ const response = await duplicateConversationAPI(conversationId, session);
316
+ if (response.success && response.data?.ConversationID) {
317
+ await loadConversations();
318
+ alerts.showSuccess(t('Duplicated'), t('Conversation duplicated successfully'));
319
+ }
320
+ else {
321
+ alerts.showError(t('Error'), response.error || t('Failed to duplicate conversation'));
322
+ }
323
+ }, [session, loadConversations, alerts, t]);
324
+ // Inline rename — which conversation is currently being edited, and the draft title
325
+ const [renamingId, setRenamingId] = useState(null);
326
+ const [renameDraft, setRenameDraft] = useState('');
327
+ const renameFocusedRef = useRef(false);
328
+ const startRename = useCallback((conversationId) => {
329
+ const conv = conversations.find(c => c.ConversationID === conversationId);
330
+ renameFocusedRef.current = false;
331
+ setRenamingId(conversationId);
332
+ setRenameDraft(conv?.Title || '');
333
+ }, [conversations]);
334
+ const commitRename = useCallback(async () => {
335
+ if (!session || renamingId === null)
336
+ return;
337
+ const trimmed = renameDraft.trim();
338
+ const conv = conversations.find(c => c.ConversationID === renamingId);
339
+ // No-op if empty or unchanged
340
+ if (!trimmed || trimmed === conv?.Title) {
341
+ setRenamingId(null);
342
+ return;
343
+ }
344
+ // Optimistic
345
+ setConversations(prev => prev.map(c => c.ConversationID === renamingId ? { ...c, Title: trimmed } : c));
346
+ setRenamingId(null);
347
+ const response = await renameConversationAPI(renamingId, trimmed, session);
348
+ if (!response.success) {
349
+ alerts.showError(t('Error'), response.error || t('Failed to rename'));
350
+ loadConversations();
351
+ }
352
+ }, [session, renamingId, renameDraft, conversations, alerts, loadConversations]);
353
+ const cancelRename = useCallback(() => {
354
+ setRenamingId(null);
355
+ setRenameDraft('');
356
+ }, []);
357
+ const toggleStar = useCallback(async (conversationId) => {
358
+ if (!session)
359
+ return;
360
+ const current = conversations.find(c => c.ConversationID === conversationId);
361
+ const currentStarred = current?.IsStarred === 1 || current?.IsStarred === true;
362
+ setConversations(prev => prev.map(c => c.ConversationID === conversationId ? { ...c, IsStarred: currentStarred ? 0 : 1 } : c));
363
+ const response = await toggleStarConversationAPI(conversationId, session);
364
+ if (!response.success) {
365
+ alerts.showError(t('Error'), response.error || t('Failed to update star'));
366
+ loadConversations();
367
+ }
368
+ else {
369
+ loadConversations();
370
+ }
371
+ }, [session, conversations, alerts, loadConversations]);
372
+ // Build sidebar items with star indicator + inline rename input
373
+ const conversationItems = conversations.map(conv => {
374
+ const starred = conv.IsStarred === 1 || conv.IsStarred === true;
375
+ const title = conv.Title || `Conversation ${conv.ConversationID}`;
376
+ const isRenaming = renamingId === conv.ConversationID;
377
+ return {
378
+ id: String(conv.ConversationID),
379
+ searchText: title,
380
+ disableSelect: isRenaming,
381
+ label: isRenaming ? (_jsx("input", { ref: (el) => {
382
+ if (el && !renameFocusedRef.current) {
383
+ renameFocusedRef.current = true;
384
+ el.focus();
385
+ el.select();
386
+ }
387
+ }, value: renameDraft, onChange: (e) => setRenameDraft(e.target.value), onKeyDown: (e) => {
388
+ // Stop keys from reaching the wrapping <button>, the global chat input, and the search bar.
389
+ e.stopPropagation();
390
+ if (e.key === 'Enter') {
391
+ e.preventDefault();
392
+ commitRename();
393
+ }
394
+ else if (e.key === 'Escape') {
395
+ e.preventDefault();
396
+ cancelRename();
397
+ }
398
+ }, onKeyUp: (e) => e.stopPropagation(), onKeyPress: (e) => e.stopPropagation(), onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), className: "w-full bg-[rgb(var(--bg-surface))] border border-[rgb(var(--color-primary))] rounded-md px-2 py-0.5 outline-none text-[0.8125rem] text-[rgb(var(--fg-default))]" })) : (_jsxs("span", { className: "flex flex-col min-w-0 gap-0", children: [_jsxs("span", { className: "flex items-center gap-1.5 min-w-0", children: [starred && _jsx(Star, { className: "w-3 h-3 shrink-0 fill-current text-[rgb(var(--color-primary))]" }), _jsx("span", { className: "truncate", children: title })] }), conv.CreatedAt && (_jsx("span", { className: "text-[0.6875rem] text-[rgb(var(--fg-muted))] truncate", children: formatConversationStamp(conv.CreatedAt) }))] }))
399
+ };
400
+ });
401
+ // Sidebar categories. Two modes:
402
+ // - groupByDate=false (default): single flat "Conversations" category — preserves
403
+ // the original chronological list under the "Recents" header.
404
+ // - groupByDate=true: bucket items by Today / Yesterday / Previous 7 Days /
405
+ // Previous 30 Days / Month YYYY (ChatGPT-style).
406
+ // Bucket grain is identical to the search modal so the two views feel consistent.
407
+ const conversationCategories = (() => {
408
+ if (!groupByDate) {
409
+ return [{ id: 'conversations', label: 'Conversations', items: conversationItems }];
410
+ }
411
+ const groups = new Map();
412
+ conversations.forEach((conv, idx) => {
413
+ const b = bucketForDate(conv.CreatedAt);
414
+ const item = conversationItems[idx];
415
+ if (!groups.has(b.id))
416
+ groups.set(b.id, { label: b.label, sort: b.sort, items: [] });
417
+ groups.get(b.id).items.push(item);
418
+ });
419
+ return Array.from(groups.entries())
420
+ .sort((a, b) => b[1].sort - a[1].sort)
421
+ .map(([id, g]) => ({ id, label: g.label, items: g.items }));
422
+ })();
423
+ // Toggle rendered to the right of the sidebar "Recents" header. Pill-style two-state
424
+ // switch — "List" (flat) vs "Group" (date buckets). Kept tiny so it doesn't crowd
425
+ // the header.
426
+ const groupingToggle = (_jsx("button", { onClick: (e) => { e.stopPropagation(); setGroupByDate(g => !g); }, title: groupByDate ? 'Switch to flat list' : 'Group by date', className: cn('text-[0.6rem] font-semibold uppercase tracking-wider px-1.5 py-0.5 rounded-md transition-colors', groupByDate
427
+ ? 'bg-[rgb(var(--color-primary))]/10 text-[rgb(var(--color-primary))]'
428
+ : 'text-[rgb(var(--fg-muted))] hover:bg-[rgb(var(--bg-subtle))] hover:text-[rgb(var(--fg-default))]'), children: groupByDate ? 'Grouped' : 'Group' }));
429
+ // Context menu renderer for a conversation row — shared by floating and fullpage sidebars
430
+ const renderConversationMenu = useCallback((itemId, close) => {
431
+ const id = parseInt(itemId);
432
+ const conv = conversations.find(c => c.ConversationID === id);
433
+ const starred = conv?.IsStarred === 1 || conv?.IsStarred === true;
434
+ const itemCls = 'w-full px-3 py-2 text-left text-sm text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] transition-colors flex items-center gap-2.5';
435
+ const fire = (fn) => (e) => {
436
+ e.stopPropagation();
437
+ close();
438
+ fn();
439
+ };
440
+ return (_jsxs("div", { className: "py-1", children: [_jsxs("button", { onClick: fire(() => toggleStar(id)), className: itemCls, children: [_jsx(Star, { className: cn('w-3.5 h-3.5', starred && 'fill-current text-[rgb(var(--color-primary))]') }), starred ? 'Unstar' : 'Star'] }), _jsxs("button", { onClick: fire(() => startRename(id)), className: itemCls, children: [_jsx(Pencil, { className: "w-3.5 h-3.5" }), "Rename"] }), _jsxs("button", { onClick: fire(() => deleteConversation(id)), className: "w-full px-3 py-2 text-left text-sm text-red-500 hover:bg-red-500/10 transition-colors flex items-center gap-2.5", children: [_jsx(Trash2, { className: "w-3.5 h-3.5" }), "Delete"] })] }));
441
+ }, [conversations, toggleStar, startRename, deleteConversation]);
442
+ // Play a gentle two-note chime — nicer than a flat beep, soft on ears
443
+ const playChime = useCallback((notes, durationPerNote, peakGain) => {
444
+ if (effectiveMuted)
445
+ return;
446
+ try {
447
+ const audioContext = new (window.AudioContext || window.webkitAudioContext)();
448
+ const now = audioContext.currentTime;
449
+ notes.forEach((freq, i) => {
450
+ const osc = audioContext.createOscillator();
451
+ const gain = audioContext.createGain();
452
+ osc.connect(gain);
453
+ gain.connect(audioContext.destination);
454
+ osc.frequency.value = freq;
455
+ osc.type = 'sine';
456
+ const start = now + i * durationPerNote * 0.85;
457
+ gain.gain.setValueAtTime(0, start);
458
+ gain.gain.linearRampToValueAtTime(peakGain, start + 0.015);
459
+ gain.gain.exponentialRampToValueAtTime(0.0001, start + durationPerNote);
460
+ osc.start(start);
461
+ osc.stop(start + durationPerNote);
462
+ });
463
+ }
464
+ catch (e) {
465
+ // Silently fail if audio not supported
466
+ }
467
+ }, [effectiveMuted]);
468
+ // Send: soft single "pop" — quick, low-key, doesn't compete with receive chime
469
+ const playSendSound = useCallback(() => {
470
+ if (effectiveMuted)
471
+ return;
472
+ try {
473
+ const audioContext = new (window.AudioContext || window.webkitAudioContext)();
474
+ const now = audioContext.currentTime;
475
+ const osc = audioContext.createOscillator();
476
+ const gain = audioContext.createGain();
477
+ osc.connect(gain);
478
+ gain.connect(audioContext.destination);
479
+ osc.type = 'sine';
480
+ // Quick frequency sweep up = gentle "blip"
481
+ osc.frequency.setValueAtTime(520, now);
482
+ osc.frequency.exponentialRampToValueAtTime(880, now + 0.07);
483
+ gain.gain.setValueAtTime(0, now);
484
+ gain.gain.linearRampToValueAtTime(0.08, now + 0.01);
485
+ gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.09);
486
+ osc.start(now);
487
+ osc.stop(now + 0.1);
488
+ }
489
+ catch (e) {
490
+ // Silently fail if audio not supported
491
+ }
492
+ }, [effectiveMuted]);
493
+ // Receive: soft descending chime (G5 → D5) — warm acknowledgement
494
+ const playReceiveSound = useCallback(() => {
495
+ playChime([783.99, 587.33], 0.18, 0.1);
496
+ }, [playChime]);
497
+ const handleSubmit = useCallback(async (input, files, displayOverride) => {
498
+ if (!session || (!input.trim() && !files?.length) || isLoading || isConversationClosed)
499
+ return;
500
+ // Snapshot context at send time from the ref so a chat-switch that just
501
+ // happened (state setter not yet flushed) is still respected. The captured
502
+ // ctx is also used post-await to detect mid-flight switches.
503
+ const sentCtx = convCtxRef.current;
504
+ playSendSound();
505
+ // When displayOverride is set (e.g. multiselect confirm), the bubble shows the friendly labels
506
+ // while the backend still receives the structured `input` string with ids.
507
+ const bubbleText = displayOverride ?? input;
508
+ const conversationIdAtSend = sentCtx.mode === 'existing' ? sentCtx.id : 0;
509
+ const userMessage = {
510
+ id: `user-${Date.now()}`,
511
+ conversationId: conversationIdAtSend,
512
+ role: 'user',
513
+ content: bubbleText + (files?.length ? `\n\n[${files.length} file(s) attached]` : ''),
514
+ timestamp: new Date(),
515
+ contentType: 'text'
516
+ };
517
+ setMessages((prev) => [...prev, userMessage]);
518
+ setIsLoading(true);
519
+ const autoTitle = sentCtx.mode === 'new' ? bubbleText.substring(0, 40) : null;
520
+ const controller = new AbortController();
521
+ abortControllerRef.current = controller;
522
+ try {
523
+ const response = await sendChatMessageAPI(buildSendPayload(sentCtx, input, autoTitle), session, controller.signal);
524
+ // If the user switched conversations during the request, drop the response.
525
+ // Compare against the live ref — closure state is captured at send time
526
+ // and won't reflect a switch that happened during await.
527
+ const liveCtx = convCtxRef.current;
528
+ const stillOnSameConversation = sentCtx.mode === 'existing'
529
+ ? liveCtx.mode === 'existing' && liveCtx.id === sentCtx.id
530
+ // new-chat case: still on the same chat if user hasn't switched at all
531
+ // (still in 'new' mode) or we're now on the conversation the backend
532
+ // just created for this send.
533
+ : liveCtx.mode === 'new' || (liveCtx.mode === 'existing' && liveCtx.id === response.conversationId);
534
+ if (!stillOnSameConversation) {
535
+ return;
536
+ }
537
+ if (response.aborted) {
538
+ // User clicked Stop — drop in a small marker so it's clear the reply was halted
539
+ const stoppedMessage = {
540
+ id: `assistant-stopped-${Date.now()}`,
541
+ conversationId: conversationIdAtSend,
542
+ role: 'assistant',
543
+ content: t('The response was interrupted by the user.'),
544
+ timestamp: new Date(),
545
+ contentType: 'text'
546
+ };
547
+ setMessages((prev) => [...prev, stoppedMessage]);
548
+ }
549
+ else if (response.success && response.data) {
550
+ // First reply on a new chat — promote ctx to 'existing' with the backend-assigned id.
551
+ if (sentCtx.mode === 'new' && response.conversationId) {
552
+ setConvCtx({ mode: 'existing', id: response.conversationId });
553
+ }
554
+ // Update user message with real backend MessageID (for edit/resend to work)
555
+ if (response.userMessageId) {
556
+ setMessages(prev => prev.map(m => m.id === userMessage.id ? { ...m, id: response.userMessageId } : m));
557
+ }
558
+ const aiMessage = {
559
+ id: `assistant-${Date.now()}`,
560
+ conversationId: response.conversationId || conversationIdAtSend,
561
+ role: 'assistant',
562
+ content: response.data,
563
+ timestamp: new Date(),
564
+ contentType: 'text',
565
+ tokens: response.tokens,
566
+ ui_data: response.ui_data
567
+ };
568
+ setMessages((prev) => [...prev, aiMessage]);
569
+ playReceiveSound();
570
+ loadConversations();
571
+ }
572
+ else {
573
+ alerts.showError(t('Error'), response.error || t('Failed to send message'));
574
+ }
575
+ }
576
+ catch (error) {
577
+ alerts.showError(t('Error'), t('Connection failed'));
578
+ }
579
+ finally {
580
+ if (abortControllerRef.current === controller)
581
+ abortControllerRef.current = null;
582
+ setIsLoading(false);
583
+ }
584
+ }, [session, isLoading, isConversationClosed, loadConversations, alerts, playSendSound, playReceiveSound, setConvCtx, t]);
585
+ const handleExport = useCallback(() => {
586
+ if (messages.length === 0)
587
+ return;
588
+ const conversationText = messages
589
+ .map((msg) => `${msg.role.toUpperCase()}: ${msg.content}`)
590
+ .join('\n\n---\n\n');
591
+ const blob = new Blob([conversationText], { type: 'text/plain' });
592
+ const url = URL.createObjectURL(blob);
593
+ const a = document.createElement('a');
594
+ a.href = url;
595
+ a.download = `conversation-${currentConversationId || 'new'}-${Date.now()}.txt`;
596
+ document.body.appendChild(a);
597
+ a.click();
598
+ document.body.removeChild(a);
599
+ URL.revokeObjectURL(url);
600
+ alerts.showSuccess(t('Exported'), t('Conversation exported successfully'));
601
+ }, [messages, currentConversationId, alerts]);
602
+ const handleShare = useCallback(async () => {
603
+ if (messages.length === 0)
604
+ return;
605
+ const conversationText = messages
606
+ .map((msg) => `${msg.role.toUpperCase()}: ${msg.content}`)
607
+ .join('\n\n');
608
+ try {
609
+ if (navigator.share) {
610
+ await navigator.share({
611
+ title: `${title} Conversation`,
612
+ text: conversationText
613
+ });
614
+ }
615
+ else {
616
+ await navigator.clipboard.writeText(conversationText);
617
+ }
618
+ }
619
+ catch (error) {
620
+ alerts.showError(t('Error'), t('Failed to share conversation'));
621
+ }
622
+ }, [messages, alerts, title]);
623
+ const handleEditMessage = useCallback(async (messageId, newContent) => {
624
+ if (!session || isLoading)
625
+ return;
626
+ // Edit/resend only makes sense on a saved conversation. A "new" chat with
627
+ // no id can't have a prior message to resend against — bail out cleanly.
628
+ const sentCtx = convCtxRef.current;
629
+ if (sentCtx.mode !== 'existing')
630
+ return;
631
+ // Find the index of the edited message
632
+ const editIndex = messages.findIndex(m => m.id === messageId);
633
+ if (editIndex === -1)
634
+ return;
635
+ // Backend cleanup: delete messages after this one (cascade delete like legacy)
636
+ if (onBeforeEditMessage) {
637
+ try {
638
+ await onBeforeEditMessage(sentCtx.id, messageId);
639
+ }
640
+ catch {
641
+ // Continue even if backend cleanup fails — DOM cleanup still works
642
+ }
643
+ }
644
+ // Cascade delete: keep only messages up to and including the edited one.
645
+ // Stamp a fresh client-only id so we can find this exact row later when
646
+ // the backend hands us the real MessageID — matching by content alone
647
+ // would alias to any earlier user message with the same text.
648
+ const optimisticEditedId = `user-edit-${Date.now()}`;
649
+ const updatedMessages = messages.slice(0, editIndex).concat({
650
+ ...messages[editIndex],
651
+ id: optimisticEditedId,
652
+ content: newContent
653
+ });
654
+ setMessages(updatedMessages);
655
+ // Resend the edited message
656
+ playSendSound();
657
+ setIsLoading(true);
658
+ const controller = new AbortController();
659
+ abortControllerRef.current = controller;
660
+ try {
661
+ const response = await sendChatMessageAPI(buildSendPayload(sentCtx, newContent, null), session, controller.signal);
662
+ // Drop the response if user switched conversations during the request.
663
+ const liveCtx = convCtxRef.current;
664
+ if (liveCtx.mode !== 'existing' || liveCtx.id !== sentCtx.id) {
665
+ return;
666
+ }
667
+ if (response.aborted) {
668
+ // User clicked Stop mid-resend — mark it so they know the reply was interrupted
669
+ const stoppedMessage = {
670
+ id: `assistant-stopped-${Date.now()}`,
671
+ conversationId: sentCtx.id,
672
+ role: 'assistant',
673
+ content: t('The response was interrupted by the user.'),
674
+ timestamp: new Date(),
675
+ contentType: 'text'
676
+ };
677
+ setMessages(prev => [...prev, stoppedMessage]);
678
+ }
679
+ else if (response.success && response.data) {
680
+ // Update the edited user message with new backend MessageID
681
+ if (response.userMessageId) {
682
+ setMessages(prev => prev.map(m => m.id === optimisticEditedId
683
+ ? { ...m, id: response.userMessageId }
684
+ : m));
685
+ }
686
+ const aiMessage = {
687
+ id: `assistant-${Date.now()}`,
688
+ conversationId: sentCtx.id,
689
+ role: 'assistant',
690
+ content: response.data,
691
+ timestamp: new Date(),
692
+ contentType: 'text',
693
+ tokens: response.tokens,
694
+ ui_data: response.ui_data
695
+ };
696
+ setMessages(prev => [...prev, aiMessage]);
697
+ playReceiveSound();
698
+ loadConversations();
699
+ }
700
+ else {
701
+ alerts.showError(t('Error'), response.error || t('Failed to resend message'));
702
+ }
703
+ }
704
+ catch (error) {
705
+ alerts.showError(t('Error'), t('Connection failed'));
706
+ }
707
+ finally {
708
+ if (abortControllerRef.current === controller)
709
+ abortControllerRef.current = null;
710
+ setIsLoading(false);
711
+ }
712
+ }, [session, isLoading, messages, playSendSound, playReceiveSound, loadConversations, alerts, onBeforeEditMessage, t]);
713
+ const handleFeedback = useCallback((messageId, rating) => {
714
+ if (!session)
715
+ return;
716
+ submitMessageFeedbackAPI(messageId, rating, session);
717
+ }, [session]);
718
+ // Regenerate from an AI message — find the user prompt that triggered it and resend
719
+ const handleRegenerateAi = useCallback((aiMessageId) => {
720
+ const aiIndex = messages.findIndex(m => m.id === aiMessageId);
721
+ if (aiIndex === -1)
722
+ return;
723
+ for (let i = aiIndex - 1; i >= 0; i--) {
724
+ if (messages[i].role === 'user') {
725
+ handleEditMessage(messages[i].id, messages[i].content);
726
+ return;
727
+ }
728
+ }
729
+ }, [messages, handleEditMessage]);
730
+ useEffect(() => {
731
+ if (session && initialMessage && !initialSentRef.current) {
732
+ initialSentRef.current = true;
733
+ handleSubmit(initialMessage);
734
+ }
735
+ // eslint-disable-next-line react-hooks/exhaustive-deps
736
+ }, [session, initialMessage]);
737
+ // Load a specific conversation on mount (e.g., when expanding floating chat → fullpage via ?c=<id>)
738
+ const initialConvLoadedRef = useRef(false);
739
+ useEffect(() => {
740
+ if (session && initialConversationId && !initialConvLoadedRef.current) {
741
+ initialConvLoadedRef.current = true;
742
+ loadConversation(initialConversationId);
743
+ }
744
+ // eslint-disable-next-line react-hooks/exhaustive-deps
745
+ }, [session, initialConversationId]);
746
+ // Hijack the sidebar's built-in search input: when the user focuses or clicks
747
+ // it, open the chat-wide search modal instead of typing into the small inline
748
+ // filter. Immediately blur the original so the inline filter doesn't also run.
749
+ // Re-scans on conversations/sidebar-open changes since the SidePanel re-renders.
750
+ useEffect(() => {
751
+ const el = document.querySelector('[data-sidepanel-search]');
752
+ if (!el)
753
+ return;
754
+ const open = (e) => {
755
+ e.preventDefault();
756
+ e.stopPropagation();
757
+ setIsSearchOpen(true);
758
+ // Defer blur so React doesn't fight the focus event in the same tick.
759
+ setTimeout(() => el.blur(), 0);
760
+ };
761
+ el.addEventListener('focus', open);
762
+ el.addEventListener('mousedown', open);
763
+ return () => {
764
+ el.removeEventListener('focus', open);
765
+ el.removeEventListener('mousedown', open);
766
+ };
767
+ }, [isSidebarOpen, conversations.length, mode, isFloatingOpen]);
768
+ const handleSelectItem = useCallback((item) => {
769
+ // When user selects from list, auto-send as message.
770
+ // If the item carries a messageText (e.g. multiselect "Selected: ... (ids: ...)"), that goes
771
+ // to the backend while item.name remains the bubble text shown to the user.
772
+ const wire = item.messageText ?? item.name;
773
+ const display = item.messageText ? item.name : undefined;
774
+ handleSubmit(wire, undefined, display);
775
+ }, [handleSubmit]);
776
+ // Keyboard shortcuts — only active when the chat UI is mounted/visible.
777
+ // Floating widget: only when open. Others: always.
778
+ useEffect(() => {
779
+ const active = mode !== 'floating' || isFloatingOpen;
780
+ if (!active)
781
+ return;
782
+ const onKeyDown = (e) => {
783
+ const mod = e.ctrlKey || e.metaKey;
784
+ // Ctrl/Cmd + ↓ → scroll to bottom
785
+ if (mod && !e.shiftKey && e.key === 'ArrowDown') {
786
+ e.preventDefault();
787
+ scrollToBottom();
788
+ return;
789
+ }
790
+ // Ctrl/Cmd + ↑ → scroll to top
791
+ if (mod && !e.shiftKey && e.key === 'ArrowUp') {
792
+ e.preventDefault();
793
+ scrollToTop();
794
+ return;
795
+ }
796
+ // Ctrl/Cmd + Shift + O → new chat
797
+ if (mod && e.shiftKey && (e.key === 'O' || e.key === 'o')) {
798
+ e.preventDefault();
799
+ startNewChat();
800
+ return;
801
+ }
802
+ // Ctrl/Cmd + K → focus chat input
803
+ if (mod && !e.shiftKey && (e.key === 'k' || e.key === 'K')) {
804
+ e.preventDefault();
805
+ const el = document.querySelector('textarea[data-chat-input]');
806
+ el?.focus();
807
+ return;
808
+ }
809
+ // Ctrl/Cmd + Shift + K → open search-chats modal
810
+ if (mod && e.shiftKey && (e.key === 'k' || e.key === 'K')) {
811
+ e.preventDefault();
812
+ setIsSearchOpen(true);
813
+ return;
814
+ }
815
+ // "/" while not typing → open search-chats modal (matches sidebar UX)
816
+ if (e.key === '/' && !mod) {
817
+ const target = e.target;
818
+ const tag = (target?.tagName || '').toLowerCase();
819
+ const isEditable = tag === 'input' || tag === 'textarea' || target?.isContentEditable;
820
+ if (!isEditable) {
821
+ e.preventDefault();
822
+ setIsSearchOpen(true);
823
+ return;
824
+ }
825
+ }
826
+ // Esc → stop generation if loading; otherwise close sidebar if open
827
+ if (e.key === 'Escape') {
828
+ if (isLoading) {
829
+ e.preventDefault();
830
+ handleStop();
831
+ return;
832
+ }
833
+ if (isSidebarOpen) {
834
+ e.preventDefault();
835
+ setIsSidebarOpen(false);
836
+ }
837
+ }
838
+ };
839
+ window.addEventListener('keydown', onKeyDown);
840
+ return () => window.removeEventListener('keydown', onKeyDown);
841
+ }, [mode, isFloatingOpen, isLoading, isSidebarOpen, scrollToBottom, scrollToTop, startNewChat, handleStop]);
842
+ // Resolve the messages component
843
+ const ResolvedMessages = MessagesComponent || Messages;
844
+ // Default logo fallback
845
+ const logoElement = logo || _jsx(Bot, { className: "w-4 h-4 text-[rgb(var(--fg-muted))]" });
846
+ const bubbleLogoElement = bubbleLogo || logoElement;
847
+ // ── Draggable floating bubble state ──────────────────────────────────
848
+ const [bubblePos, setBubblePos] = useState(null);
849
+ const dragRef = useRef(null);
850
+ const bubbleRef = useRef(null);
851
+ const handlePointerDown = useCallback((e) => {
852
+ const el = bubbleRef.current;
853
+ if (!el)
854
+ return;
855
+ el.setPointerCapture(e.pointerId);
856
+ const rect = el.getBoundingClientRect();
857
+ const posX = bubblePos?.x ?? (window.innerWidth - rect.right + rect.width / 2);
858
+ const posY = bubblePos?.y ?? (window.innerHeight - rect.bottom + rect.height / 2);
859
+ dragRef.current = {
860
+ startX: e.clientX,
861
+ startY: e.clientY,
862
+ startPosX: posX,
863
+ startPosY: posY,
864
+ dragged: false,
865
+ };
866
+ }, [bubblePos]);
867
+ const handlePointerMove = useCallback((e) => {
868
+ if (!dragRef.current)
869
+ return;
870
+ const dx = e.clientX - dragRef.current.startX;
871
+ const dy = e.clientY - dragRef.current.startY;
872
+ if (!dragRef.current.dragged && Math.abs(dx) + Math.abs(dy) > 5) {
873
+ dragRef.current.dragged = true;
874
+ }
875
+ if (dragRef.current.dragged) {
876
+ // Position is stored as distance from right/bottom edges
877
+ const newX = Math.max(8, Math.min(window.innerWidth - 64, dragRef.current.startPosX - dx));
878
+ const newY = Math.max(8, Math.min(window.innerHeight - 64, dragRef.current.startPosY - dy));
879
+ setBubblePos({ x: newX, y: newY });
880
+ }
881
+ }, []);
882
+ const handlePointerUp = useCallback((e) => {
883
+ if (!dragRef.current)
884
+ return;
885
+ const wasDragged = dragRef.current.dragged;
886
+ dragRef.current = null;
887
+ if (!wasDragged) {
888
+ setIsFloatingOpen(true);
889
+ }
890
+ }, []);
891
+ // ── Draggable panel state (header as drag handle) ────────────────────
892
+ const [panelPos, setPanelPos] = useState(null);
893
+ const panelDragRef = useRef(null);
894
+ const panelRef = useRef(null);
895
+ const handlePanelPointerDown = useCallback((e) => {
896
+ // Don't drag if clicking on buttons inside the header
897
+ if (e.target.closest('button'))
898
+ return;
899
+ const el = panelRef.current;
900
+ if (!el)
901
+ return;
902
+ e.currentTarget.setPointerCapture(e.pointerId);
903
+ const rect = el.getBoundingClientRect();
904
+ const posX = panelPos?.x ?? (window.innerWidth - rect.right);
905
+ const posY = panelPos?.y ?? (window.innerHeight - rect.bottom);
906
+ panelDragRef.current = {
907
+ startX: e.clientX,
908
+ startY: e.clientY,
909
+ startPosX: posX,
910
+ startPosY: posY,
911
+ dragged: false,
912
+ };
913
+ }, [panelPos]);
914
+ const handlePanelPointerMove = useCallback((e) => {
915
+ if (!panelDragRef.current)
916
+ return;
917
+ const dx = e.clientX - panelDragRef.current.startX;
918
+ const dy = e.clientY - panelDragRef.current.startY;
919
+ if (!panelDragRef.current.dragged && Math.abs(dx) + Math.abs(dy) > 5) {
920
+ panelDragRef.current.dragged = true;
921
+ }
922
+ if (panelDragRef.current.dragged) {
923
+ const newX = Math.max(0, Math.min(window.innerWidth - 200, panelDragRef.current.startPosX - dx));
924
+ const newY = Math.max(0, Math.min(window.innerHeight - 100, panelDragRef.current.startPosY - dy));
925
+ setPanelPos({ x: newX, y: newY });
926
+ }
927
+ }, []);
928
+ const handlePanelPointerUp = useCallback(() => {
929
+ panelDragRef.current = null;
930
+ }, []);
931
+ // Filtered + bucketed results for the search modal. Text match is OR over title
932
+ // and ContactNo; date range filters by CreatedAt. Same bucketing as the sidebar
933
+ // so the modal feels consistent with what users see in the side list.
934
+ const searchResults = (() => {
935
+ const q = searchQuery.trim().toLowerCase();
936
+ const fromTs = searchFrom ? new Date(searchFrom + 'T00:00:00').getTime() : null;
937
+ const toTs = searchTo ? new Date(searchTo + 'T23:59:59').getTime() : null;
938
+ const filtered = conversations.filter(c => {
939
+ if (q) {
940
+ const title = (c.Title || '').toLowerCase();
941
+ const contact = (c.ContactNo || '').toLowerCase();
942
+ if (!title.includes(q) && !contact.includes(q))
943
+ return false;
944
+ }
945
+ if ((fromTs || toTs) && c.CreatedAt) {
946
+ const ts = new Date(c.CreatedAt).getTime();
947
+ if (fromTs && ts < fromTs)
948
+ return false;
949
+ if (toTs && ts > toTs)
950
+ return false;
951
+ }
952
+ return true;
953
+ });
954
+ const groups = new Map();
955
+ filtered.forEach(c => {
956
+ const b = bucketForDate(c.CreatedAt);
957
+ if (!groups.has(b.id))
958
+ groups.set(b.id, { label: b.label, sort: b.sort, items: [] });
959
+ groups.get(b.id).items.push(c);
960
+ });
961
+ return Array.from(groups.entries())
962
+ .sort((a, b) => b[1].sort - a[1].sort)
963
+ .map(([id, g]) => ({ id, label: g.label, items: g.items }));
964
+ })();
965
+ const searchModal = isSearchOpen ? (_jsx("div", { className: "fixed inset-0 z-[100] flex items-start justify-center pt-[10vh] px-4 bg-black/50 backdrop-blur-sm", onClick: () => setIsSearchOpen(false), children: _jsxs("div", { className: "w-full max-w-2xl bg-[rgb(var(--bg-surface))] border border-[rgb(var(--bd-default))] rounded-xl shadow-2xl flex flex-col max-h-[80vh] overflow-hidden", onClick: e => e.stopPropagation(), children: [_jsxs("div", { className: "flex items-center gap-2 px-4 py-3 border-b border-[rgb(var(--bd-default))]", children: [_jsx(Search, { className: "w-4 h-4 text-[rgb(var(--fg-muted))] shrink-0" }), _jsx("input", { autoFocus: true, value: searchQuery, onChange: e => setSearchQuery(e.target.value), placeholder: t('Search chats...'), className: "flex-1 bg-transparent outline-none text-sm text-[rgb(var(--fg-default))] placeholder:text-[rgb(var(--fg-muted))]", onKeyDown: e => { if (e.key === 'Escape')
966
+ setIsSearchOpen(false); } }), _jsx("button", { onClick: () => setIsSearchOpen(false), className: "h-7 w-7 rounded-md hover:bg-[rgb(var(--bg-subtle))] flex items-center justify-center text-[rgb(var(--fg-muted))]", "aria-label": t('Close'), children: _jsx(X, { className: "w-4 h-4" }) })] }), _jsxs("div", { className: "flex items-center gap-2 px-4 py-2 border-b border-[rgb(var(--bd-default))] text-xs text-[rgb(var(--fg-muted))]", children: [_jsx(Calendar, { className: "w-3.5 h-3.5 shrink-0" }), _jsx("span", { className: "whitespace-nowrap shrink-0", children: t('Date range') }), _jsx(DatePicker, { mode: "range", showFromTo: true, placeholder: t('Select date range...'), value: {
967
+ from: searchFrom ? new Date(searchFrom + 'T00:00:00') : undefined,
968
+ to: searchTo ? new Date(searchTo + 'T00:00:00') : undefined,
969
+ }, onChange: (val) => {
970
+ const range = (val && typeof val === 'object' && 'from' in val) ? val : { from: undefined, to: undefined };
971
+ setSearchFrom(range.from ? getLocalDateString(range.from) : '');
972
+ setSearchTo(range.to ? getLocalDateString(range.to) : '');
973
+ } }), (searchFrom || searchTo || searchQuery) && (_jsx("button", { onClick: () => { setSearchFrom(''); setSearchTo(''); setSearchQuery(''); }, className: "ml-auto px-2 py-1 rounded hover:bg-[rgb(var(--bg-subtle))] text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))]", children: t('Clear') }))] }), _jsx("div", { className: "flex-1 overflow-y-auto py-2", children: searchResults.length === 0 ? (_jsx("div", { className: "px-4 py-8 text-center text-sm text-[rgb(var(--fg-muted))]", children: t('No chats found') })) : (searchResults.map(group => (_jsxs("div", { className: "mb-2", children: [_jsx("div", { className: "px-4 py-1 text-[0.6875rem] uppercase tracking-wide text-[rgb(var(--fg-muted))] font-medium", children: group.label }), group.items.map(c => (_jsxs("button", { onClick: () => {
974
+ loadConversation(c.ConversationID);
975
+ setIsSearchOpen(false);
976
+ }, className: "w-full flex items-center gap-2 px-4 py-2 hover:bg-[rgb(var(--bg-subtle))] text-left", children: [(c.IsStarred === 1 || c.IsStarred === true) && (_jsx(Star, { className: "w-3 h-3 shrink-0 fill-current text-[rgb(var(--color-primary))]" })), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("div", { className: "text-sm text-[rgb(var(--fg-default))] truncate", children: c.Title || `Conversation ${c.ConversationID}` }), c.CreatedAt && (_jsx("div", { className: "text-[0.6875rem] text-[rgb(var(--fg-muted))] truncate", children: formatConversationStamp(c.CreatedAt) }))] })] }, c.ConversationID)))] }, group.id)))) })] }) })) : null;
977
+ // Floating Widget Mode — bubble + backdrop + panel chrome wrapping the regular chat
978
+ if (mode === 'floating') {
979
+ if (!isFloatingOpen) {
980
+ return (_jsx("button", { ref: bubbleRef, onPointerDown: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, className: cn("fixed z-50 touch-none select-none cursor-pointer", "h-14 w-14 rounded-full", "bg-[rgb(var(--bg-surface))]", "flex items-center justify-center", "hover:scale-110", "transition-shadow duration-200 ease-out", "border border-[rgb(var(--bd-default))]", "shadow-[0_4px_20px_rgba(0,0,0,0.15)] hover:shadow-[0_8px_30px_rgba(0,0,0,0.25)]", !dragRef.current?.dragged && "animate-floating-bubble"), style: {
981
+ right: bubblePos ? `${bubblePos.x}px` : '16px',
982
+ bottom: bubblePos ? `${bubblePos.y}px` : '16px',
983
+ }, "aria-label": t('Open chat'), children: bubbleLogoElement }));
984
+ }
985
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 bg-black/60 backdrop-blur-sm z-40 animate-in fade-in duration-200", onClick: () => setIsFloatingOpen(false) }), _jsxs("div", { ref: panelRef, className: cn("fixed z-50 flex flex-col", "bg-[rgb(var(--bg-surface))] rounded-xl shadow-2xl overflow-hidden", "border border-[rgb(var(--bd-default))]", !panelPos && "animate-in slide-in-from-bottom-4 duration-300", "inset-4 md:inset-auto", "md:w-[480px] md:h-[680px]"), style: {
986
+ ...(panelPos
987
+ ? { right: `${panelPos.x}px`, bottom: `${panelPos.y}px` }
988
+ : { right: '16px', bottom: '16px' }),
989
+ }, children: [_jsxs("div", { onPointerDown: handlePanelPointerDown, onPointerMove: handlePanelPointerMove, onPointerUp: handlePanelPointerUp, className: "h-12 px-3 flex items-center justify-between border-b border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))] shrink-0 cursor-move touch-none select-none", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [logoElement, _jsx("span", { className: "font-semibold text-sm text-[rgb(var(--fg-default))]", children: title }), process.env.NEXT_PUBLIC_SHOW_TOKENS === 'true' && currentConversationId && (_jsxs("span", { className: "text-[10px] font-mono px-1.5 py-0.5 rounded-md bg-[rgb(var(--bg-subtle))] text-[rgb(var(--fg-muted))]", children: ["Conversation ID: #", currentConversationId] }))] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [_jsx("button", { onClick: () => setIsMuted(!isMuted), className: "h-7 w-7 rounded-md hover:bg-[rgb(var(--bg-subtle))] flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors", title: isMuted ? "Unmute sounds" : "Mute sounds", children: isMuted ? _jsx(VolumeX, { className: "h-3.5 w-3.5" }) : _jsx(Volume2, { className: "h-3.5 w-3.5" }) }), _jsx("button", { onClick: handleExport, className: "h-7 w-7 rounded-md hover:bg-[rgb(var(--bg-subtle))] flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors", title: t('Export'), children: _jsx(Download, { className: "h-3.5 w-3.5" }) }), _jsx("button", { onClick: handleShare, className: "h-7 w-7 rounded-md hover:bg-[rgb(var(--bg-subtle))] flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors", title: t('Share'), children: _jsx(Share2, { className: "h-3.5 w-3.5" }) }), fullpagePath && (_jsx("button", { onClick: () => {
990
+ setIsFloatingOpen(false);
991
+ const target = currentConversationId
992
+ ? `${fullpagePath}?c=${currentConversationId}`
993
+ : fullpagePath;
994
+ router.push(target);
995
+ }, disabled: isLoading && !currentConversationId, className: "h-7 w-7 rounded-md hover:bg-[rgb(var(--bg-subtle))] flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent", title: isLoading && !currentConversationId ? 'Wait for first reply to expand' : 'Open fullpage', children: _jsx(Maximize2, { className: "h-3.5 w-3.5" }) })), _jsx("button", { onClick: () => setIsFloatingOpen(false), className: "h-7 w-7 rounded-md hover:bg-[rgb(var(--bg-subtle))] flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] transition-colors", "aria-label": t('Close chat'), children: _jsx(X, { className: "h-4 w-4" }) })] })] }), _jsxs("div", { className: "flex-1 flex min-h-0 overflow-hidden bg-[rgb(var(--bg-app))]", children: [_jsx(SidePanel, { title: sidebarTitle || title, categories: conversationCategories, activeItemId: String(currentConversationId), onItemSelect: (id) => loadConversation(parseInt(id)), actionButton: {
996
+ label: 'New Chat',
997
+ icon: Plus,
998
+ onClick: startNewChat
999
+ }, isOpen: isSidebarOpen, onClose: () => setIsSidebarOpen(false), showSearch: true, collapsible: true, defaultCollapsed: true, showItemIcons: false, itemContextMenu: renderConversationMenu, recentsAction: groupingToggle }), _jsxs("div", { className: "flex-1 flex flex-col min-w-0 overflow-hidden", children: [_jsxs("div", { className: "relative flex-1 min-h-0", children: [_jsx("div", { ref: messagesScrollRef, className: "absolute inset-0 overflow-y-auto", children: _jsx(ResolvedMessages, { messages: messages, isLoading: isLoading, onSelectItem: handleSelectItem, onEditMessage: handleEditMessage, onRegenerateAi: handleRegenerateAi, onFeedback: handleFeedback }) }), showScrollDown && (_jsx("button", { type: "button", onClick: scrollToBottom, "aria-label": t('Scroll to bottom'), className: "absolute left-1/2 -translate-x-1/2 bottom-3 z-10 w-11 h-11 lg:w-8 lg:h-8 rounded-full bg-[rgb(var(--bg-surface))] border border-[rgb(var(--bd-default))] shadow-md hover:bg-[rgb(var(--bg-hover))] hover:shadow-lg flex items-center justify-center transition-all", children: _jsx(ChevronDown, { className: "w-4 h-4 text-[rgb(var(--fg-default))]" }) }))] }), _jsx(MultimodalInput, { onSubmit: handleSubmit, onStop: handleStop, isLoading: isLoading, allowFileUpload: false, compact: true, disabled: isConversationClosed, disabledReason: isConversationClosed ? 'This conversation has reached its limit. Start a new chat to continue.' : undefined })] })] })] }), searchModal] }));
1000
+ }
1001
+ // Regular Chat Mode (fullpage, modal)
1002
+ return (_jsxs("div", { className: cn('flex h-full w-full overflow-hidden', mode === 'fullpage' && 'bg-[rgb(var(--bg-app))]'), children: [_jsx(SidePanel, { title: sidebarTitle || title, categories: conversationCategories, activeItemId: String(currentConversationId), onItemSelect: (id) => loadConversation(parseInt(id)), actionButton: {
1003
+ label: 'New Chat',
1004
+ icon: Plus,
1005
+ onClick: startNewChat
1006
+ }, isOpen: isSidebarOpen, onClose: () => setIsSidebarOpen(false), showSearch: true, collapsible: true, defaultCollapsed: mode === 'widget', showItemIcons: false, itemContextMenu: renderConversationMenu, recentsAction: groupingToggle }), _jsxs("div", { className: "flex-1 flex flex-col min-w-0 overflow-hidden bg-[rgb(var(--bg-app))]", children: [_jsxs("div", { className: "md:hidden h-12 flex items-center justify-between px-3 border-b border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))] shrink-0", children: [_jsxs("div", { className: "flex items-center gap-2 min-w-0", children: [_jsx("button", { onClick: () => setIsSidebarOpen(!isSidebarOpen), className: "w-8 h-8 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-lg transition-colors shrink-0", title: t('Chat history'), children: _jsx(PanelLeftOpen, { className: "w-4 h-4" }) }), logo && _jsx("div", { className: "shrink-0", children: logo }), _jsx("span", { className: "font-semibold text-sm text-[rgb(var(--fg-default))] truncate", children: title }), process.env.NEXT_PUBLIC_SHOW_TOKENS === 'true' && currentConversationId && (_jsxs("span", { className: "text-[10px] font-mono px-1.5 py-0.5 rounded-md bg-[rgb(var(--bg-subtle))] text-[rgb(var(--fg-muted))] shrink-0", children: ["Conversation ID: #", currentConversationId] }))] }), _jsxs("div", { className: "flex items-center gap-0.5 shrink-0", children: [headerActions, _jsx("button", { onClick: startNewChat, className: "w-8 h-8 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--color-primary))] hover:bg-[rgb(var(--color-primary))]/5 rounded-lg transition-colors", title: t('New chat'), children: _jsx(Plus, { className: "w-4 h-4" }) }), messages.length > 0 && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleExport, className: "w-8 h-8 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-lg transition-colors", title: t('Export'), children: _jsx(Download, { className: "w-3.5 h-3.5" }) }), _jsx("button", { onClick: handleShare, className: "w-8 h-8 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-lg transition-colors", title: t('Share'), children: _jsx(Share2, { className: "w-3.5 h-3.5" }) })] })), fullpagePath && mode === 'modal' && (_jsx("button", { onClick: () => {
1007
+ const target = currentConversationId
1008
+ ? `${fullpagePath}?c=${currentConversationId}`
1009
+ : fullpagePath;
1010
+ router.push(target);
1011
+ }, disabled: isLoading && !currentConversationId, className: "w-8 h-8 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-lg transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent", title: isLoading && !currentConversationId ? 'Wait for first reply to expand' : 'Open fullpage', children: _jsx(Maximize2, { className: "w-3.5 h-3.5" }) }))] })] }), _jsxs("div", { className: "hidden md:flex h-10 items-center justify-center px-3 border-b border-[rgb(var(--bd-default))] bg-[rgb(var(--bg-surface))] shrink-0 relative", children: [process.env.NEXT_PUBLIC_SHOW_TOKENS === 'true' && currentConversationId && (_jsxs("span", { className: "absolute left-3 text-[10px] font-mono px-1.5 py-0.5 rounded-md bg-[rgb(var(--bg-subtle))] text-[rgb(var(--fg-muted))]", children: ["Conversation ID: #", currentConversationId] })), process.env.NEXT_PUBLIC_SHOW_TOKENS === 'true' && messages.length > 0 && (() => {
1012
+ const totals = messages.reduce((acc, m) => {
1013
+ if (m.tokens) {
1014
+ acc.prompt += m.tokens.prompt;
1015
+ acc.completion += m.tokens.completion;
1016
+ acc.total += m.tokens.total;
1017
+ }
1018
+ return acc;
1019
+ }, { prompt: 0, completion: 0, total: 0 });
1020
+ if (totals.total === 0)
1021
+ return null;
1022
+ return (_jsxs("span", { className: "text-[0.65rem] text-[rgb(var(--fg-muted))] font-mono", children: ["Prompt: ", totals.prompt.toLocaleString(), " \u00B7 Response: ", totals.completion.toLocaleString(), " \u00B7 Total: ", totals.total.toLocaleString(), " tokens \u00B7 ", messages.filter(m => m.tokens).length, " calls"] }));
1023
+ })(), _jsxs("div", { className: "absolute right-3 flex items-center gap-0.5", children: [headerActions, _jsx("button", { onClick: () => setIsMuted(!isMuted), className: "w-7 h-7 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-md transition-colors", title: isMuted ? "Unmute sounds" : "Mute sounds", children: isMuted ? _jsx(VolumeX, { className: "w-3.5 h-3.5" }) : _jsx(Volume2, { className: "w-3.5 h-3.5" }) }), messages.length > 0 && (_jsxs(_Fragment, { children: [_jsx("button", { onClick: handleExport, className: "w-7 h-7 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-md transition-colors", title: t('Export'), children: _jsx(Download, { className: "w-3.5 h-3.5" }) }), _jsx("button", { onClick: handleShare, className: "w-7 h-7 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-md transition-colors", title: t('Share'), children: _jsx(Share2, { className: "w-3.5 h-3.5" }) })] })), fullpagePath && mode === 'modal' && (_jsx("button", { onClick: () => {
1024
+ const target = currentConversationId
1025
+ ? `${fullpagePath}?c=${currentConversationId}`
1026
+ : fullpagePath;
1027
+ router.push(target);
1028
+ }, disabled: isLoading && !currentConversationId, title: isLoading && !currentConversationId ? 'Wait for first reply to expand' : 'Open fullpage', className: "w-7 h-7 flex items-center justify-center text-[rgb(var(--fg-muted))] hover:text-[rgb(var(--fg-default))] hover:bg-[rgb(var(--bg-subtle))] rounded-md transition-colors disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-transparent", children: _jsx(Maximize2, { className: "w-3.5 h-3.5" }) }))] })] }), _jsxs("div", { className: "relative flex-1 min-h-0", children: [_jsx("div", { ref: messagesScrollRef, className: "absolute inset-0 overflow-y-auto", children: _jsx(ResolvedMessages, { messages: messages, isLoading: isLoading, onSelectItem: handleSelectItem, onEditMessage: handleEditMessage, onRegenerateAi: handleRegenerateAi, onFeedback: handleFeedback }) }), showScrollDown && (_jsx("button", { type: "button", onClick: scrollToBottom, "aria-label": t('Scroll to bottom'), className: "absolute left-1/2 -translate-x-1/2 bottom-3 z-10 w-11 h-11 lg:w-8 lg:h-8 rounded-full bg-[rgb(var(--bg-surface))] border border-[rgb(var(--bd-default))] shadow-md hover:bg-[rgb(var(--bg-hover))] hover:shadow-lg flex items-center justify-center transition-all", children: _jsx(ChevronDown, { className: "w-4 h-4 text-[rgb(var(--fg-default))]" }) })), mode === 'fullpage' && (_jsx(ChatPromptNavigator, { messages: messages, scrollContainer: findScroller, moduleName: title }))] }), _jsx(MultimodalInput, { onSubmit: handleSubmit, onStop: handleStop, isLoading: isLoading, allowFileUpload: false, compact: mode === 'widget', disabled: isConversationClosed, disabledReason: isConversationClosed ? 'This conversation has reached its limit. Start a new chat to continue.' : undefined })] }), isSidebarOpen && (_jsx("div", { className: "md:hidden fixed inset-0 bg-black/60 backdrop-blur-sm z-40", onClick: () => setIsSidebarOpen(false) })), searchModal] }));
1029
+ }