@12-apps/ui 6.7.0 → 6.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/dist/{chunk-QLBYAYUG.js → chunk-KR2BP7NK.js} +4 -4
  2. package/dist/chunk-KR2BP7NK.js.map +1 -0
  3. package/dist/{chunk-DFVRZ3UK.js → chunk-KXARS46L.js} +3 -3
  4. package/dist/chunk-KXARS46L.js.map +1 -0
  5. package/dist/{chunk-JP55QWVR.js → chunk-L7L6SX64.js} +5 -2
  6. package/dist/chunk-L7L6SX64.js.map +1 -0
  7. package/dist/{chunk-QZZVHY6U.js → chunk-PVLDKXKR.js} +7 -3
  8. package/dist/chunk-PVLDKXKR.js.map +1 -0
  9. package/dist/{chunk-H7UAGTVW.js → chunk-TSG5C7MP.js} +4 -3
  10. package/dist/chunk-TSG5C7MP.js.map +1 -0
  11. package/dist/{chunk-NUCLEOHF.js → chunk-UNM7KFDX.js} +44 -14
  12. package/dist/chunk-UNM7KFDX.js.map +1 -0
  13. package/dist/{chunk-CEKPLUQV.js → chunk-UY7UF7IN.js} +19 -13
  14. package/dist/chunk-UY7UF7IN.js.map +1 -0
  15. package/dist/data-display/DataGrid.js +1 -1
  16. package/dist/data-display/DataViews.js +88 -65
  17. package/dist/data-display/DataViews.js.map +1 -1
  18. package/dist/data-display/HoverCard.js +4 -1
  19. package/dist/data-display/HoverCard.js.map +1 -1
  20. package/dist/data-display/Table.js +4 -2
  21. package/dist/data-display/Table.js.map +1 -1
  22. package/dist/data-display/TimingDiagram.js +3 -2
  23. package/dist/data-display/TimingDiagram.js.map +1 -1
  24. package/dist/feedback/Sonner.js +5 -4
  25. package/dist/feedback/Sonner.js.map +1 -1
  26. package/dist/feedback/StackedModal.js +1 -1
  27. package/dist/feedback/TutorialOverlay.js +19 -5
  28. package/dist/feedback/TutorialOverlay.js.map +1 -1
  29. package/dist/form/AddressAutocomplete.js +16 -8
  30. package/dist/form/AddressAutocomplete.js.map +1 -1
  31. package/dist/form/Autocomplete.js +9 -7
  32. package/dist/form/Autocomplete.js.map +1 -1
  33. package/dist/form/Calendar.js +1 -1
  34. package/dist/form/CodeEditor.js +14 -9
  35. package/dist/form/CodeEditor.js.map +1 -1
  36. package/dist/form/DateRangePicker.js +10 -3
  37. package/dist/form/DateRangePicker.js.map +1 -1
  38. package/dist/form/Menubar.js +4 -1
  39. package/dist/form/Menubar.js.map +1 -1
  40. package/dist/form/PasswordStrength.js +48 -28
  41. package/dist/form/PasswordStrength.js.map +1 -1
  42. package/dist/form/PhoneInput.js +11 -5
  43. package/dist/form/PhoneInput.js.map +1 -1
  44. package/dist/form/SearchPalette.js +4 -1
  45. package/dist/form/SearchPalette.js.map +1 -1
  46. package/dist/form/Textarea.js +21 -19
  47. package/dist/form/Textarea.js.map +1 -1
  48. package/dist/form/UploadButton.js +16 -11
  49. package/dist/form/UploadButton.js.map +1 -1
  50. package/dist/layout/ContentToolbar.js +1 -1
  51. package/dist/layout/Dashboard.js +2 -1
  52. package/dist/layout/Dashboard.js.map +1 -1
  53. package/dist/layout/ScrollArea.js +9 -3
  54. package/dist/layout/ScrollArea.js.map +1 -1
  55. package/dist/layout/TableFilter.js +1 -1
  56. package/dist/navigation/Breadcrumbs.js +9 -3
  57. package/dist/navigation/Breadcrumbs.js.map +1 -1
  58. package/dist/navigation/CommandPalette.js +20 -7
  59. package/dist/navigation/CommandPalette.js.map +1 -1
  60. package/dist/navigation/Pagination.js +1 -1
  61. package/dist/navigation/Tabs.js +7 -3
  62. package/dist/navigation/Tabs.js.map +1 -1
  63. package/dist/pt-BR.js +159 -8
  64. package/dist/pt-BR.js.map +1 -1
  65. package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts +1 -0
  66. package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts.map +1 -1
  67. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +5 -0
  68. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  69. package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts.map +1 -1
  70. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +27 -1
  71. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  72. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +12 -1
  73. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
  74. package/dist/types/components/data-display/DataViews/data-views-filter-panel.d.ts.map +1 -1
  75. package/dist/types/components/data-display/DataViews/data-views-grid-bodies.d.ts.map +1 -1
  76. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
  77. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
  78. package/dist/types/components/data-display/DataViews/data-views-pagination.d.ts.map +1 -1
  79. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
  80. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
  81. package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts +1 -1
  82. package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts.map +1 -1
  83. package/dist/types/components/data-display/HoverCard/HoverCard.d.ts.map +1 -1
  84. package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts +2 -0
  85. package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts.map +1 -1
  86. package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
  87. package/dist/types/components/data-display/Table/Table.types.d.ts +5 -0
  88. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  89. package/dist/types/components/data-display/Table/TableStates.d.ts +3 -1
  90. package/dist/types/components/data-display/Table/TableStates.d.ts.map +1 -1
  91. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.d.ts.map +1 -1
  92. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts +3 -0
  93. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts.map +1 -1
  94. package/dist/types/components/feedback/Sonner/Sonner.d.ts +8 -0
  95. package/dist/types/components/feedback/Sonner/Sonner.d.ts.map +1 -1
  96. package/dist/types/components/feedback/Sonner/Sonner.types.d.ts +2 -0
  97. package/dist/types/components/feedback/Sonner/Sonner.types.d.ts.map +1 -1
  98. package/dist/types/components/feedback/Sonner/SonnerToast.d.ts.map +1 -1
  99. package/dist/types/components/feedback/StackedModal/StackedModal.d.ts.map +1 -1
  100. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts +2 -0
  101. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  102. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts +2 -0
  103. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts.map +1 -1
  104. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.d.ts.map +1 -1
  105. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts +3 -0
  106. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts.map +1 -1
  107. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts +2 -0
  108. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts.map +1 -1
  109. package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts +7 -0
  110. package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts.map +1 -1
  111. package/dist/types/components/form/AddressAutocomplete/AddressAutocompleteField.d.ts.map +1 -1
  112. package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts +1 -0
  113. package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts.map +1 -1
  114. package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts +1 -0
  115. package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts.map +1 -1
  116. package/dist/types/components/form/Autocomplete/Autocomplete.d.ts.map +1 -1
  117. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts +9 -3
  118. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts.map +1 -1
  119. package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts +7 -0
  120. package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts.map +1 -1
  121. package/dist/types/components/form/Calendar/Calendar.types.d.ts +6 -0
  122. package/dist/types/components/form/Calendar/Calendar.types.d.ts.map +1 -1
  123. package/dist/types/components/form/CodeEditor/CodeEditor.d.ts.map +1 -1
  124. package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts +7 -0
  125. package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts.map +1 -1
  126. package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts +2 -0
  127. package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts.map +1 -1
  128. package/dist/types/components/form/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  129. package/dist/types/components/form/DateRangePicker/DateRangePicker.range.d.ts.map +1 -1
  130. package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts +11 -0
  131. package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts.map +1 -1
  132. package/dist/types/components/form/DateRangePicker/DateRangePickerFields.d.ts.map +1 -1
  133. package/dist/types/components/form/Menubar/Menubar.d.ts.map +1 -1
  134. package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts +1 -0
  135. package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts.map +1 -1
  136. package/dist/types/components/form/Menubar/Menubar.types.d.ts +5 -0
  137. package/dist/types/components/form/Menubar/Menubar.types.d.ts.map +1 -1
  138. package/dist/types/components/form/PasswordStrength/PasswordStrength.d.ts.map +1 -1
  139. package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts +4 -2
  140. package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts.map +1 -1
  141. package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts +8 -0
  142. package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts.map +1 -1
  143. package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
  144. package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts +7 -0
  145. package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts.map +1 -1
  146. package/dist/types/components/form/SearchPalette/SearchPalette.d.ts.map +1 -1
  147. package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts +2 -0
  148. package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts.map +1 -1
  149. package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts +6 -0
  150. package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts.map +1 -1
  151. package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
  152. package/dist/types/components/form/Textarea/Textarea.types.d.ts +16 -1
  153. package/dist/types/components/form/Textarea/Textarea.types.d.ts.map +1 -1
  154. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts +7 -0
  155. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
  156. package/dist/types/components/form/UploadButton/UploadButton.d.ts.map +1 -1
  157. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts +6 -3
  158. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts.map +1 -1
  159. package/dist/types/components/form/UploadButton/UploadButton.types.d.ts +7 -0
  160. package/dist/types/components/form/UploadButton/UploadButton.types.d.ts.map +1 -1
  161. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts +1 -1
  162. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts.map +1 -1
  163. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts +12 -0
  164. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts.map +1 -1
  165. package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts +1 -1
  166. package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts.map +1 -1
  167. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts +1 -1
  168. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts.map +1 -1
  169. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts +1 -1
  170. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts.map +1 -1
  171. package/dist/types/components/layout/Dashboard/Dashboard.d.ts +1 -1
  172. package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts +4 -0
  173. package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts.map +1 -1
  174. package/dist/types/components/layout/Dashboard/DashboardParts.d.ts +1 -1
  175. package/dist/types/components/layout/Dashboard/DashboardParts.d.ts.map +1 -1
  176. package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
  177. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +21 -3
  178. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
  179. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts +2 -0
  180. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts.map +1 -1
  181. package/dist/types/components/layout/TableFilter/TableFilter.d.ts +1 -1
  182. package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
  183. package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts +7 -0
  184. package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts.map +1 -1
  185. package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts +9 -0
  186. package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts.map +1 -1
  187. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts +2 -0
  188. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts.map +1 -1
  189. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  190. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +3 -0
  191. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -1
  192. package/dist/types/components/navigation/CommandPalette/CommandPalette.d.ts.map +1 -1
  193. package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts +3 -0
  194. package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts.map +1 -1
  195. package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts +2 -0
  196. package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts.map +1 -1
  197. package/dist/types/components/navigation/Pagination/Pagination.d.ts.map +1 -1
  198. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +2 -0
  199. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts.map +1 -1
  200. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts +2 -0
  201. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
  202. package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
  203. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +2 -0
  204. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts.map +1 -1
  205. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
  206. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +6 -2
  207. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
  208. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +6 -0
  209. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
  210. package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts +4 -2
  211. package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts.map +1 -1
  212. package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts +8 -7
  213. package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts.map +1 -1
  214. package/dist/types/copy/data-display.d.ts +56 -0
  215. package/dist/types/copy/data-display.d.ts.map +1 -0
  216. package/dist/types/copy/feedback.d.ts +38 -0
  217. package/dist/types/copy/feedback.d.ts.map +1 -0
  218. package/dist/types/copy/form.d.ts +146 -0
  219. package/dist/types/copy/form.d.ts.map +1 -0
  220. package/dist/types/copy/layout.d.ts +18 -0
  221. package/dist/types/copy/layout.d.ts.map +1 -0
  222. package/dist/types/copy/navigation.d.ts +24 -0
  223. package/dist/types/copy/navigation.d.ts.map +1 -0
  224. package/dist/types/copy/shared.d.ts +119 -0
  225. package/dist/types/copy/shared.d.ts.map +1 -0
  226. package/dist/types/copy/utility.d.ts +35 -0
  227. package/dist/types/copy/utility.d.ts.map +1 -0
  228. package/dist/types/copy.d.ts +12 -165
  229. package/dist/types/copy.d.ts.map +1 -1
  230. package/dist/types/pt-BR.d.ts +15 -22
  231. package/dist/types/pt-BR.d.ts.map +1 -1
  232. package/dist/types/pt-BR.data-display.d.ts +13 -0
  233. package/dist/types/pt-BR.data-display.d.ts.map +1 -0
  234. package/dist/types/pt-BR.feedback.d.ts +8 -0
  235. package/dist/types/pt-BR.feedback.d.ts.map +1 -0
  236. package/dist/types/pt-BR.form.d.ts +13 -0
  237. package/dist/types/pt-BR.form.d.ts.map +1 -0
  238. package/dist/types/pt-BR.layout.d.ts +7 -0
  239. package/dist/types/pt-BR.layout.d.ts.map +1 -0
  240. package/dist/types/pt-BR.navigation.d.ts +8 -0
  241. package/dist/types/pt-BR.navigation.d.ts.map +1 -0
  242. package/dist/types/pt-BR.shared.d.ts +21 -0
  243. package/dist/types/pt-BR.shared.d.ts.map +1 -0
  244. package/dist/types/pt-BR.utility.d.ts +8 -0
  245. package/dist/types/pt-BR.utility.d.ts.map +1 -0
  246. package/dist/types/user-avatar/user-avatar.d.ts +7 -1
  247. package/dist/types/user-avatar/user-avatar.d.ts.map +1 -1
  248. package/dist/user-avatar.js +2 -2
  249. package/dist/user-avatar.js.map +1 -1
  250. package/dist/utility/InfiniteScroll.js +7 -5
  251. package/dist/utility/InfiniteScroll.js.map +1 -1
  252. package/dist/utility/InstallPrompt.js +14 -13
  253. package/dist/utility/InstallPrompt.js.map +1 -1
  254. package/package.json +1 -1
  255. package/src/components/data-display/DataGrid/DataGrid.states.tsx +3 -3
  256. package/src/components/data-display/DataGrid/DataGrid.tsx +1 -1
  257. package/src/components/data-display/DataGrid/DataGrid.types.ts +5 -0
  258. package/src/components/data-display/DataViews/data-views-category-pill.tsx +2 -0
  259. package/src/components/data-display/DataViews/data-views-copy.ts +27 -1
  260. package/src/components/data-display/DataViews/data-views-day-input.tsx +14 -3
  261. package/src/components/data-display/DataViews/data-views-filter-panel.tsx +2 -1
  262. package/src/components/data-display/DataViews/data-views-grid-bodies.tsx +3 -0
  263. package/src/components/data-display/DataViews/data-views-grid-parts.tsx +9 -10
  264. package/src/components/data-display/DataViews/data-views-more-fields.tsx +3 -1
  265. package/src/components/data-display/DataViews/data-views-pagination.tsx +3 -0
  266. package/src/components/data-display/DataViews/data-views-range-pill.tsx +3 -1
  267. package/src/components/data-display/DataViews/data-views-toolbar.tsx +2 -0
  268. package/src/components/data-display/HoverCard/HoverCard.content.tsx +10 -2
  269. package/src/components/data-display/HoverCard/HoverCard.tsx +2 -3
  270. package/src/components/data-display/HoverCard/HoverCard.types.ts +2 -0
  271. package/src/components/data-display/Table/Table.tsx +7 -2
  272. package/src/components/data-display/Table/Table.types.ts +5 -0
  273. package/src/components/data-display/Table/TableStates.tsx +2 -2
  274. package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +3 -2
  275. package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +3 -0
  276. package/src/components/feedback/Sonner/Sonner.tsx +15 -3
  277. package/src/components/feedback/Sonner/Sonner.types.ts +2 -0
  278. package/src/components/feedback/Sonner/SonnerToast.tsx +2 -1
  279. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +10 -3
  280. package/src/components/feedback/StackedModal/StackedModal.tsx +2 -1
  281. package/src/components/feedback/StackedModal/StackedModal.types.ts +2 -0
  282. package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +13 -1
  283. package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +3 -0
  284. package/src/components/feedback/TutorialOverlay/TutorialStepBody.tsx +10 -4
  285. package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +7 -0
  286. package/src/components/form/AddressAutocomplete/AddressAutocompleteField.tsx +2 -0
  287. package/src/components/form/AddressAutocomplete/AddressFallbackField.tsx +4 -2
  288. package/src/components/form/AddressAutocomplete/AddressInputField.tsx +13 -6
  289. package/src/components/form/Autocomplete/Autocomplete.parts.tsx +9 -6
  290. package/src/components/form/Autocomplete/Autocomplete.tsx +2 -1
  291. package/src/components/form/Autocomplete/Autocomplete.types.ts +7 -0
  292. package/src/components/form/Calendar/Calendar.tsx +2 -2
  293. package/src/components/form/Calendar/Calendar.types.ts +7 -0
  294. package/src/components/form/CodeEditor/CodeEditor.tsx +6 -4
  295. package/src/components/form/CodeEditor/CodeEditor.types.ts +7 -0
  296. package/src/components/form/CodeEditor/CodeEditorToolbar.tsx +12 -5
  297. package/src/components/form/DateRangePicker/DateRangePicker.range.ts +2 -0
  298. package/src/components/form/DateRangePicker/DateRangePicker.tsx +4 -0
  299. package/src/components/form/DateRangePicker/DateRangePicker.types.ts +11 -0
  300. package/src/components/form/DateRangePicker/DateRangePickerFields.tsx +2 -0
  301. package/src/components/form/Menubar/Menubar.toolbar.tsx +3 -1
  302. package/src/components/form/Menubar/Menubar.tsx +2 -1
  303. package/src/components/form/Menubar/Menubar.types.ts +5 -0
  304. package/src/components/form/PasswordStrength/PasswordStrength.helpers.tsx +33 -17
  305. package/src/components/form/PasswordStrength/PasswordStrength.tsx +29 -13
  306. package/src/components/form/PasswordStrength/PasswordStrength.types.ts +9 -0
  307. package/src/components/form/PhoneInput/PhoneInput.tsx +15 -5
  308. package/src/components/form/PhoneInput/PhoneInput.types.ts +7 -0
  309. package/src/components/form/SearchPalette/SearchPalette.parts.tsx +4 -1
  310. package/src/components/form/SearchPalette/SearchPalette.tsx +4 -1
  311. package/src/components/form/SearchPalette/SearchPalette.types.ts +6 -0
  312. package/src/components/form/Textarea/Textarea.tsx +6 -1
  313. package/src/components/form/Textarea/Textarea.types.ts +14 -1
  314. package/src/components/form/Textarea/TextareaRichEditor.tsx +28 -18
  315. package/src/components/form/UploadButton/UploadButton.parts.tsx +16 -7
  316. package/src/components/form/UploadButton/UploadButton.tsx +4 -1
  317. package/src/components/form/UploadButton/UploadButton.types.ts +8 -0
  318. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +10 -2
  319. package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +12 -0
  320. package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +15 -4
  321. package/src/components/layout/ContentToolbar/SortByDropdown.tsx +12 -3
  322. package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -1
  323. package/src/components/layout/Dashboard/Dashboard.types.ts +4 -0
  324. package/src/components/layout/Dashboard/DashboardParts.tsx +2 -1
  325. package/src/components/layout/ScrollArea/ScrollArea.tsx +16 -3
  326. package/src/components/layout/ScrollArea/ScrollArea.types.ts +19 -4
  327. package/src/components/layout/ScrollArea/ScrollViewport.tsx +4 -1
  328. package/src/components/layout/TableFilter/TableFilter.tsx +19 -11
  329. package/src/components/layout/TableFilter/TableFilter.types.ts +8 -0
  330. package/src/components/layout/TableFilter/TableFilterContext.tsx +10 -0
  331. package/src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx +11 -4
  332. package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +2 -0
  333. package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +3 -0
  334. package/src/components/navigation/CommandPalette/CommandPalette.tsx +15 -5
  335. package/src/components/navigation/CommandPalette/CommandPalette.types.ts +3 -0
  336. package/src/components/navigation/CommandPalette/CommandPaletteResults.tsx +5 -2
  337. package/src/components/navigation/Pagination/Pagination.tsx +2 -0
  338. package/src/components/navigation/Pagination/Pagination.types.ts +2 -0
  339. package/src/components/navigation/Pagination/PaginationParts.tsx +4 -1
  340. package/src/components/navigation/Tabs/Tabs.tsx +8 -3
  341. package/src/components/navigation/Tabs/Tabs.types.ts +2 -0
  342. package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +4 -4
  343. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +4 -2
  344. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +6 -0
  345. package/src/components/utility/InstallPrompt/InstallPrompt.tsx +18 -13
  346. package/src/components/utility/InstallPrompt/InstallPrompt.types.ts +9 -7
  347. package/src/copy/data-display.ts +60 -0
  348. package/src/copy/feedback.ts +39 -0
  349. package/src/copy/form.ts +154 -0
  350. package/src/copy/layout.ts +18 -0
  351. package/src/copy/navigation.ts +25 -0
  352. package/src/copy/shared.ts +122 -0
  353. package/src/copy/utility.ts +36 -0
  354. package/src/copy.ts +12 -173
  355. package/src/pt-BR.data-display.ts +236 -0
  356. package/src/pt-BR.feedback.ts +25 -0
  357. package/src/pt-BR.form.ts +96 -0
  358. package/src/pt-BR.layout.ts +15 -0
  359. package/src/pt-BR.navigation.ts +21 -0
  360. package/src/pt-BR.shared.ts +94 -0
  361. package/src/pt-BR.ts +15 -307
  362. package/src/pt-BR.utility.ts +21 -0
  363. package/src/user-avatar/user-avatar.tsx +8 -2
  364. package/dist/chunk-CEKPLUQV.js.map +0 -1
  365. package/dist/chunk-DFVRZ3UK.js.map +0 -1
  366. package/dist/chunk-H7UAGTVW.js.map +0 -1
  367. package/dist/chunk-JP55QWVR.js.map +0 -1
  368. package/dist/chunk-NUCLEOHF.js.map +0 -1
  369. package/dist/chunk-QLBYAYUG.js.map +0 -1
  370. package/dist/chunk-QZZVHY6U.js.map +0 -1
@@ -86,10 +86,11 @@ var DetailedContent = ({
86
86
  ] });
87
87
  var HoverCardContent = (props) => {
88
88
  const { variant, title, description, avatar, loading, loadingComponent, children, dataTestId } = props;
89
+ const { loadingText } = props;
89
90
  if (loading) {
90
91
  return /* @__PURE__ */ jsx(LoadingContainer, { children: loadingComponent || /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
91
92
  /* @__PURE__ */ jsx(CircularProgress, { size: 20 }),
92
- /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Loading..." })
93
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", children: loadingText })
93
94
  ] }) });
94
95
  }
95
96
  if (variant === "detailed" && (avatar || title || description)) {
@@ -486,6 +487,7 @@ var HoverCard = React3.forwardRef((props, ref) => {
486
487
  maxWidth,
487
488
  loading,
488
489
  loadingComponent,
490
+ loadingText,
489
491
  touchEnabled,
490
492
  offset,
491
493
  disabled,
@@ -542,6 +544,7 @@ var HoverCard = React3.forwardRef((props, ref) => {
542
544
  children: /* @__PURE__ */ jsx2(CardContent, { sx: { p: padding, "&:last-child": { pb: padding } }, children: /* @__PURE__ */ jsx2(
543
545
  HoverCardContent,
544
546
  {
547
+ loadingText,
545
548
  variant,
546
549
  title,
547
550
  description,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-display/HoverCard/HoverCard.tsx","../../src/components/data-display/HoverCard/HoverCard.content.tsx","../../src/components/data-display/HoverCard/HoverCard.hooks.ts","../../src/components/data-display/HoverCard/HoverCard.styles.ts","../../src/components/data-display/HoverCard/HoverCard.animations.ts"],"sourcesContent":["import { Box, Card, CardContent, Popover } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { HoverCardContent } from './HoverCard.content';\nimport { useHoverCard } from './HoverCard.hooks';\nimport { arrowSx, cardSx, getAnchorOrigin, getTransformOrigin, sideOf } from './HoverCard.styles';\nimport type { CardStyleFlags } from './HoverCard.styles';\nimport type { HoverCardAnimation, HoverCardPlacement, HoverCardProps } from './HoverCard.types';\n\nconst ArrowContainer = styled('div')<{ placement: HoverCardPlacement; offset: number }>(\n ({ theme, placement }) => ({ ...arrowSx(theme, placement) }),\n);\n\nconst StyledCard = styled(Card, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'animation'].includes(prop as string),\n})<CardStyleFlags>(({ theme, ...flags }) => ({ ...cardSx(theme, flags) }));\n\nconst StyledPopover = styled(Popover, {\n shouldForwardProp: (prop) => prop !== 'customAnimation',\n})<{ customAnimation?: HoverCardAnimation }>(({ customAnimation }) => ({\n // The popover only positions; StyledCard draws the surface.\n '& .MuiPopover-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n overflow: 'visible',\n ...(customAnimation === 'scale' && { transformOrigin: 'center' }),\n },\n}));\n\nconst DEFAULTS = {\n variant: 'default',\n glow: false,\n pulse: false,\n placement: 'bottom',\n showArrow: false,\n animation: 'fade',\n enterDelay: 700,\n exitDelay: 0,\n maxWidth: 400,\n loading: false,\n touchEnabled: true,\n offset: 8,\n disabled: false,\n} satisfies Partial<HoverCardProps>;\n\ntype ResolvedProps = HoverCardProps & Required<Pick<HoverCardProps, keyof typeof DEFAULTS>>;\n\n/** Padding is the variant's own: detailed roomier, minimal tighter. */\nconst CONTENT_PADDING: Record<string, number> = { detailed: 3, minimal: 1.5 };\n\n/** The card is nudged off the anchor on whichever side it sits. */\nconst offsetMargin = (placement: HoverCardPlacement, offset: number) => {\n const side = sideOf(placement);\n const key = ({ top: 'mt', bottom: 'mb', left: 'ml', right: 'mr' } as const)[side];\n return { [key]: `${offset}px` };\n};\n\nexport const HoverCard = React.forwardRef<HTMLDivElement, HoverCardProps>((props, ref) => {\n const {\n variant, glow, pulse, title, description, avatar, trigger, placement, showArrow,\n animation, enterDelay, exitDelay, maxWidth, loading, loadingComponent, touchEnabled,\n offset, disabled, onOpen, onClose, children, dataTestId,\n ...rest\n } = withDefaults(props, DEFAULTS) as ResolvedProps;\n\n const { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers } = useHoverCard({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n });\n\n const triggerProps = {\n ...triggerHandlers,\n style: { cursor: disabled ? 'default' : 'pointer' },\n 'data-testid': dataTestId ? `${dataTestId}-trigger` : 'hover-card-trigger',\n };\n\n const triggerElement = trigger ? (\n React.cloneElement(trigger, triggerProps)\n ) : (\n <span {...triggerProps} style={{ display: 'inline-block', ...triggerProps.style }}>\n {children}\n </span>\n );\n\n const padding = CONTENT_PADDING[variant] ?? 2;\n\n return (\n <>\n {triggerElement}\n <StyledPopover\n ref={ref}\n open={isOpen && !disabled}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={getAnchorOrigin(placement)}\n transformOrigin={getTransformOrigin(placement)}\n {...cardHandlers}\n disableAutoFocus\n disableEnforceFocus\n disableRestoreFocus\n customAnimation={animation}\n slotProps={{ paper: { style: { pointerEvents: 'auto' } } }}\n {...rest}\n >\n <Box sx={{ position: 'relative' }}>\n {showArrow && <ArrowContainer placement={placement} offset={offset} />}\n <StyledCard\n customVariant={variant}\n glow={glow}\n pulse={pulse}\n animation={animation}\n data-testid={dataTestId || 'hover-card-content'}\n sx={{ maxWidth, ...offsetMargin(placement, offset) }}\n >\n <CardContent sx={{ p: padding, '&:last-child': { pb: padding } }}>\n <HoverCardContent\n variant={variant}\n title={title}\n description={description}\n avatar={avatar}\n loading={loading}\n loadingComponent={loadingComponent}\n dataTestId={dataTestId}\n >\n {children}\n </HoverCardContent>\n </CardContent>\n </StyledCard>\n </Box>\n </StyledPopover>\n </>\n );\n});\n\nHoverCard.displayName = 'HoverCard';\n","import { Avatar, Box, CircularProgress, Typography } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type { HoverCardProps } from './HoverCard.types';\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 80,\n color: theme.palette.text.secondary,\n}));\n\n/** `${dataTestId}-${suffix}`, or the shared default when the caller gave no id. */\nconst testId = (base: string | undefined, suffix: string, fallback: string) =>\n base ? `${base}-${suffix}` : fallback;\n\nexport interface HoverCardContentProps\n extends Pick<\n HoverCardProps,\n 'variant' | 'title' | 'description' | 'avatar' | 'loading' | 'loadingComponent' | 'children'\n > {\n dataTestId?: string;\n}\n\n/** A string avatar is a src; anything else is an element to re-size in place. */\nconst CardAvatar: React.FC<{ avatar: HoverCardProps['avatar'] }> = ({ avatar }) => {\n if (!avatar) return null;\n\n if (typeof avatar === 'string') {\n return <Avatar src={avatar} sx={{ width: 48, height: 48, mr: 2 }} />;\n }\n\n const element = avatar as React.ReactElement<{ sx?: object }>;\n return React.cloneElement(element, {\n sx: { width: 48, height: 48, mr: 2, ...element.props.sx },\n });\n};\n\nconst Title: React.FC<{\n title: React.ReactNode;\n variant?: string;\n sx?: object;\n dataTestId?: string;\n}> = ({ title, variant, sx, dataTestId }) => (\n <Typography\n variant={variant === 'minimal' ? 'body2' : 'subtitle1'}\n sx={{ fontWeight: 600, ...sx }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n);\n\nconst Description: React.FC<{\n description: React.ReactNode;\n sx?: object;\n dataTestId?: string;\n}> = ({ description, sx, dataTestId }) => (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={sx}\n data-testid={testId(dataTestId, 'description', 'hover-card-description')}\n >\n {description}\n </Typography>\n);\n\n/** The detailed variant leads with the avatar and sets the text beside it. */\nconst DetailedContent: React.FC<HoverCardContentProps> = ({\n title,\n description,\n avatar,\n children,\n dataTestId,\n}) => (\n <>\n {avatar && (\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\n <CardAvatar avatar={avatar} />\n <Box>\n {title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 0.5 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n </Box>\n </Box>\n )}\n {!avatar && title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 1 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {!avatar && description && (\n <Description description={description} sx={{ mb: 1 }} dataTestId={dataTestId} />\n )}\n {children && <Box>{children}</Box>}\n </>\n);\n\nexport const HoverCardContent: React.FC<HoverCardContentProps> = (props) => {\n const { variant, title, description, avatar, loading, loadingComponent, children, dataTestId } =\n props;\n\n if (loading) {\n return (\n <LoadingContainer>\n {loadingComponent || (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={20} />\n <Typography variant=\"body2\">Loading...</Typography>\n </Box>\n )}\n </LoadingContainer>\n );\n }\n\n if (variant === 'detailed' && (avatar || title || description)) {\n return <DetailedContent {...props} />;\n }\n\n return (\n <>\n {title && (\n <Title title={title} variant={variant} sx={{ mb: 0.5 }} dataTestId={dataTestId} />\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n {children}\n </>\n );\n};\n","import React from 'react';\n\ninterface HandlerInput {\n isTouchDevice: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n openCard: (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => void;\n closeCard: () => void;\n exitTimeoutRef: React.MutableRefObject<number | undefined>;\n}\n\n/**\n * The pointer and touch handlers, over the open/close pair. Touch gets a\n * long-press because there is no hover to respond to; the card's own handlers\n * keep it open while the pointer is travelling onto it.\n */\nconst useHoverHandlers = ({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n}: HandlerInput) => {\n const [touchTimeout, setTouchTimeout] = React.useState<number>();\n\n /** A touch device with touch disabled has no hover to respond to. */\n const hoverIgnored = isTouchDevice && !touchEnabled;\n\n const cancelTouch = React.useCallback(() => {\n if (touchTimeout) {\n window.clearTimeout(touchTimeout);\n setTouchTimeout(undefined);\n }\n }, [touchTimeout]);\n\n React.useEffect(\n () => () => {\n if (touchTimeout) window.clearTimeout(touchTimeout);\n },\n [touchTimeout],\n );\n\n const triggerHandlers = {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n if (hoverIgnored) return;\n openCard(event);\n },\n onMouseLeave: () => {\n if (hoverIgnored) return;\n closeCard();\n },\n onTouchStart: (event: React.TouchEvent<HTMLElement>) => {\n if (!touchEnabled) return;\n if (touchTimeout) window.clearTimeout(touchTimeout);\n setTouchTimeout(window.setTimeout(() => openCard(event), enterDelay));\n },\n // End and cancel do the same thing: the press did not become a long press.\n onTouchEnd: cancelTouch,\n onTouchCancel: cancelTouch,\n };\n\n /** Moving onto the card keeps it open; leaving it starts the exit delay. */\n const cardHandlers = {\n onMouseEnter: () => {\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n onMouseLeave: closeCard,\n };\n\n return { triggerHandlers, cardHandlers };\n};\n\n/** Escape dismisses the card while it is open. */\nconst useEscapeKey = (active: boolean, onEscape: () => void) => {\n React.useEffect(() => {\n if (!active) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') onEscape();\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [active, onEscape]);\n};\n\ninterface HoverCardTimingInput {\n disabled: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n exitDelay: number;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\n/**\n * When the card is open, and the delays that decide it.\n *\n * Three timers are in play: the enter delay before opening, the exit delay\n * before closing (so the pointer can travel from the trigger onto the card\n * without dismissing it), and the long-press timer on touch. Each cancels the\n * others' pending work, which is why they live together.\n */\nexport const useHoverCard = ({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n}: HoverCardTimingInput) => {\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);\n const [isOpen, setIsOpen] = React.useState(false);\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n const enterTimeoutRef = React.useRef<number | undefined>(undefined);\n const exitTimeoutRef = React.useRef<number | undefined>(undefined);\n\n // Probed in an effect, not during render, so SSR and hydration stay intact.\n React.useEffect(() => {\n setIsTouchDevice('ontouchstart' in window);\n }, []);\n\n const openCard = React.useCallback(\n (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => {\n if (disabled) return;\n\n if (exitTimeoutRef.current) {\n window.clearTimeout(exitTimeoutRef.current);\n }\n\n const target = event.currentTarget;\n enterTimeoutRef.current = window.setTimeout(() => {\n setAnchorEl(target);\n setIsOpen(true);\n onOpen?.();\n }, enterDelay);\n },\n [disabled, enterDelay, onOpen],\n );\n\n const closeCard = React.useCallback(() => {\n if (enterTimeoutRef.current) {\n window.clearTimeout(enterTimeoutRef.current);\n }\n\n exitTimeoutRef.current = window.setTimeout(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, exitDelay);\n }, [exitDelay, onClose]);\n\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, [onClose]);\n\n const { triggerHandlers, cardHandlers } = useHoverHandlers({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n });\n\n useEscapeKey(isOpen, handleClose);\n\n React.useEffect(\n () => () => {\n if (enterTimeoutRef.current) window.clearTimeout(enterTimeoutRef.current);\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n [],\n );\n\n return { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers };\n};\n","import { alpha } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport {\n pulseAnimation,\n scaleIn,\n slideInDown,\n slideInLeft,\n slideInRight,\n slideInUp,\n} from './HoverCard.animations';\nimport type { HoverCardAnimation, HoverCardPlacement } from './HoverCard.types';\n\n/** The edge the card sits on, ignoring the `-start`/`-end` alignment suffix. */\ntype Side = 'top' | 'bottom' | 'left' | 'right';\n\nexport const sideOf = (placement: HoverCardPlacement): Side => {\n if (placement.startsWith('top')) return 'top';\n if (placement.startsWith('left')) return 'left';\n if (placement.startsWith('right')) return 'right';\n return 'bottom';\n};\n\nconst ARROW_SIZE = 8;\n\n/**\n * The arrow is a CSS triangle: two transparent borders on the cross axis and one\n * filled border pointing back at the anchor. Every placement is that same shape,\n * so the table holds only which edge is filled and where the triangle sits.\n */\nconst ARROWS: Record<Side, (color: string) => CSSObject> = {\n top: (color) => ({\n bottom: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid ${color}`,\n }),\n bottom: (color) => ({\n top: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid ${color}`,\n }),\n left: (color) => ({\n right: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderLeft: `${ARROW_SIZE}px solid ${color}`,\n }),\n right: (color) => ({\n left: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid ${color}`,\n }),\n};\n\nexport const arrowSx = (theme: Theme, placement: HoverCardPlacement): CSSObject => ({\n position: 'absolute',\n width: 0,\n height: 0,\n zIndex: 1,\n ...ARROWS[sideOf(placement)](theme.palette.background.paper),\n});\n\ntype Origin = { vertical: 'top' | 'center' | 'bottom'; horizontal: 'left' | 'center' | 'right' };\n\n/** Where the popover attaches to the anchor, per side. */\nconst ANCHOR_ORIGINS: Record<Side, Origin> = {\n top: { vertical: 'top', horizontal: 'center' },\n bottom: { vertical: 'bottom', horizontal: 'center' },\n left: { vertical: 'center', horizontal: 'left' },\n right: { vertical: 'center', horizontal: 'right' },\n};\n\n/** The card's own corner meets the anchor's, so its origin is the opposite one. */\nconst flip = (origin: Origin): Origin => ({\n vertical: origin.vertical === 'top' ? 'bottom' : origin.vertical === 'bottom' ? 'top' : 'center',\n horizontal:\n origin.horizontal === 'left' ? 'right' : origin.horizontal === 'right' ? 'left' : 'center',\n});\n\nexport const getAnchorOrigin = (placement: HoverCardPlacement): Origin =>\n ANCHOR_ORIGINS[sideOf(placement)];\n\nexport const getTransformOrigin = (placement: HoverCardPlacement): Origin =>\n flip(ANCHOR_ORIGINS[sideOf(placement)]);\n\nconst ANIMATIONS: Record<string, CSSObject> = {\n // `fade` shares slideInUp deliberately: the keyframes fade in while rising.\n fade: { animation: `${slideInUp} 0.2s ease-out` },\n scale: { transformOrigin: 'center', animation: `${scaleIn} 0.2s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-up': { animation: `${slideInUp} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-down': { animation: `${slideInDown} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-left': { animation: `${slideInLeft} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-right': { animation: `${slideInRight} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n};\n\nconst VARIANTS: Record<string, (theme: Theme) => CSSObject> = {\n default: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[8],\n }),\n glass: (theme) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.85),\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.common.black, 0.12)}`,\n }),\n detailed: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[12],\n }),\n minimal: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n boxShadow: theme.shadows[4],\n }),\n};\n\nconst glowStyles = (theme: Theme): CSSObject => ({\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n});\n\nconst pulseStyles = (theme: Theme): CSSObject => ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n});\n\nexport interface CardStyleFlags {\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n animation?: HoverCardAnimation;\n}\n\nexport const cardSx = (theme: Theme, flags: CardStyleFlags): CSSObject => {\n const { customVariant, glow, pulse, animation } = flags;\n\n return {\n borderRadius: theme.spacing(1.5),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n overflow: 'visible',\n minWidth: 200,\n maxWidth: 400,\n ...(animation ? (ANIMATIONS[animation] ?? {}) : {}),\n ...(customVariant ? (VARIANTS[customVariant]?.(theme) ?? {}) : {}),\n // The old \"both\" arm was exactly these two spread together.\n ...(glow && glowStyles(theme)),\n ...(pulse && pulseStyles(theme)),\n };\n};\n","import { keyframes } from '@mui/material';\n\nexport const pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nexport const slideInUp = keyframes`\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInDown = keyframes`\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const slideInRight = keyframes`\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const scaleIn = keyframes`\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Arrow component\n"],"mappings":"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","names":["Box","styled","React","React","Fragment","jsx","jsxs","styled","React","Box"]}
1
+ {"version":3,"sources":["../../src/components/data-display/HoverCard/HoverCard.tsx","../../src/components/data-display/HoverCard/HoverCard.content.tsx","../../src/components/data-display/HoverCard/HoverCard.hooks.ts","../../src/components/data-display/HoverCard/HoverCard.styles.ts","../../src/components/data-display/HoverCard/HoverCard.animations.ts"],"sourcesContent":["import { Box, Card, CardContent, Popover } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { HoverCardContent } from './HoverCard.content';\nimport { useHoverCard } from './HoverCard.hooks';\nimport { arrowSx, cardSx, getAnchorOrigin, getTransformOrigin, sideOf } from './HoverCard.styles';\nimport type { CardStyleFlags } from './HoverCard.styles';\nimport type { HoverCardAnimation, HoverCardPlacement, HoverCardProps } from './HoverCard.types';\n\nconst ArrowContainer = styled('div')<{ placement: HoverCardPlacement; offset: number }>(\n ({ theme, placement }) => ({ ...arrowSx(theme, placement) }),\n);\n\nconst StyledCard = styled(Card, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'animation'].includes(prop as string),\n})<CardStyleFlags>(({ theme, ...flags }) => ({ ...cardSx(theme, flags) }));\n\nconst StyledPopover = styled(Popover, {\n shouldForwardProp: (prop) => prop !== 'customAnimation',\n})<{ customAnimation?: HoverCardAnimation }>(({ customAnimation }) => ({\n // The popover only positions; StyledCard draws the surface.\n '& .MuiPopover-paper': {\n backgroundColor: 'transparent',\n boxShadow: 'none',\n overflow: 'visible',\n ...(customAnimation === 'scale' && { transformOrigin: 'center' }),\n },\n}));\n\nconst DEFAULTS = {\n variant: 'default',\n glow: false,\n pulse: false,\n placement: 'bottom',\n showArrow: false,\n animation: 'fade',\n enterDelay: 700,\n exitDelay: 0,\n maxWidth: 400,\n loading: false,\n touchEnabled: true,\n offset: 8,\n disabled: false,\n} satisfies Partial<HoverCardProps>;\n\ntype ResolvedProps = HoverCardProps & Required<Pick<HoverCardProps, keyof typeof DEFAULTS>>;\n\n/** Padding is the variant's own: detailed roomier, minimal tighter. */\nconst CONTENT_PADDING: Record<string, number> = { detailed: 3, minimal: 1.5 };\n\n/** The card is nudged off the anchor on whichever side it sits. */\nconst offsetMargin = (placement: HoverCardPlacement, offset: number) => {\n const side = sideOf(placement);\n const key = ({ top: 'mt', bottom: 'mb', left: 'ml', right: 'mr' } as const)[side];\n return { [key]: `${offset}px` };\n};\n\nexport const HoverCard = React.forwardRef<HTMLDivElement, HoverCardProps>((props, ref) => {\n const {\n variant, glow, pulse, title, description, avatar, trigger, placement, showArrow,\n animation, enterDelay, exitDelay, maxWidth, loading, loadingComponent, loadingText, touchEnabled,\n offset, disabled, onOpen, onClose, children, dataTestId,\n ...rest\n } = withDefaults(props, DEFAULTS) as ResolvedProps;\n\n const { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers } = useHoverCard({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n });\n\n const triggerProps = {\n ...triggerHandlers,\n style: { cursor: disabled ? 'default' : 'pointer' },\n 'data-testid': dataTestId ? `${dataTestId}-trigger` : 'hover-card-trigger',\n };\n\n const triggerElement = trigger ? (\n React.cloneElement(trigger, triggerProps)\n ) : (\n <span {...triggerProps} style={{ display: 'inline-block', ...triggerProps.style }}>\n {children}\n </span>\n );\n\n const padding = CONTENT_PADDING[variant] ?? 2;\n\n return (\n <>\n {triggerElement}\n <StyledPopover\n ref={ref}\n open={isOpen && !disabled}\n anchorEl={anchorEl}\n onClose={handleClose}\n anchorOrigin={getAnchorOrigin(placement)}\n transformOrigin={getTransformOrigin(placement)}\n {...cardHandlers}\n disableAutoFocus\n disableEnforceFocus\n disableRestoreFocus\n customAnimation={animation}\n slotProps={{ paper: { style: { pointerEvents: 'auto' } } }}\n {...rest}\n >\n <Box sx={{ position: 'relative' }}>\n {showArrow && <ArrowContainer placement={placement} offset={offset} />}\n <StyledCard\n customVariant={variant}\n glow={glow}\n pulse={pulse}\n animation={animation}\n data-testid={dataTestId || 'hover-card-content'}\n sx={{ maxWidth, ...offsetMargin(placement, offset) }}\n >\n <CardContent sx={{ p: padding, '&:last-child': { pb: padding } }}>\n <HoverCardContent\n loadingText={loadingText} variant={variant} title={title}\n description={description}\n avatar={avatar}\n loading={loading}\n loadingComponent={loadingComponent}\n dataTestId={dataTestId}\n >\n {children}\n </HoverCardContent>\n </CardContent>\n </StyledCard>\n </Box>\n </StyledPopover>\n </>\n );\n});\n\nHoverCard.displayName = 'HoverCard';\n","import { Avatar, Box, CircularProgress, Typography } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type { HoverCardProps } from './HoverCard.types';\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 80,\n color: theme.palette.text.secondary,\n}));\n\n/** `${dataTestId}-${suffix}`, or the shared default when the caller gave no id. */\nconst testId = (base: string | undefined, suffix: string, fallback: string) =>\n base ? `${base}-${suffix}` : fallback;\n\nexport interface HoverCardContentProps\n extends Pick<\n HoverCardProps,\n | 'variant'\n | 'title'\n | 'description'\n | 'avatar'\n | 'loading'\n | 'loadingComponent'\n | 'loadingText'\n | 'children'\n > {\n dataTestId?: string;\n}\n\n/** A string avatar is a src; anything else is an element to re-size in place. */\nconst CardAvatar: React.FC<{ avatar: HoverCardProps['avatar'] }> = ({ avatar }) => {\n if (!avatar) return null;\n\n if (typeof avatar === 'string') {\n return <Avatar src={avatar} sx={{ width: 48, height: 48, mr: 2 }} />;\n }\n\n const element = avatar as React.ReactElement<{ sx?: object }>;\n return React.cloneElement(element, {\n sx: { width: 48, height: 48, mr: 2, ...element.props.sx },\n });\n};\n\nconst Title: React.FC<{\n title: React.ReactNode;\n variant?: string;\n sx?: object;\n dataTestId?: string;\n}> = ({ title, variant, sx, dataTestId }) => (\n <Typography\n variant={variant === 'minimal' ? 'body2' : 'subtitle1'}\n sx={{ fontWeight: 600, ...sx }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n);\n\nconst Description: React.FC<{\n description: React.ReactNode;\n sx?: object;\n dataTestId?: string;\n}> = ({ description, sx, dataTestId }) => (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={sx}\n data-testid={testId(dataTestId, 'description', 'hover-card-description')}\n >\n {description}\n </Typography>\n);\n\n/** The detailed variant leads with the avatar and sets the text beside it. */\nconst DetailedContent: React.FC<HoverCardContentProps> = ({\n title,\n description,\n avatar,\n children,\n dataTestId,\n}) => (\n <>\n {avatar && (\n <Box sx={{ display: 'flex', alignItems: 'center', mb: 2 }}>\n <CardAvatar avatar={avatar} />\n <Box>\n {title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 0.5 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n </Box>\n </Box>\n )}\n {!avatar && title && (\n <Typography\n variant=\"h6\"\n sx={{ fontWeight: 600, mb: 1 }}\n data-testid={testId(dataTestId, 'title', 'hover-card-title')}\n >\n {title}\n </Typography>\n )}\n {!avatar && description && (\n <Description description={description} sx={{ mb: 1 }} dataTestId={dataTestId} />\n )}\n {children && <Box>{children}</Box>}\n </>\n);\n\nexport const HoverCardContent: React.FC<HoverCardContentProps> = (props) => {\n const { variant, title, description, avatar, loading, loadingComponent, children, dataTestId } =\n props;\n const { loadingText } = props;\n\n if (loading) {\n return (\n <LoadingContainer>\n {loadingComponent || (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <CircularProgress size={20} />\n <Typography variant=\"body2\">{loadingText}</Typography>\n </Box>\n )}\n </LoadingContainer>\n );\n }\n\n if (variant === 'detailed' && (avatar || title || description)) {\n return <DetailedContent {...props} />;\n }\n\n return (\n <>\n {title && (\n <Title title={title} variant={variant} sx={{ mb: 0.5 }} dataTestId={dataTestId} />\n )}\n {description && <Description description={description} dataTestId={dataTestId} />}\n {children}\n </>\n );\n};\n","import React from 'react';\n\ninterface HandlerInput {\n isTouchDevice: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n openCard: (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => void;\n closeCard: () => void;\n exitTimeoutRef: React.MutableRefObject<number | undefined>;\n}\n\n/**\n * The pointer and touch handlers, over the open/close pair. Touch gets a\n * long-press because there is no hover to respond to; the card's own handlers\n * keep it open while the pointer is travelling onto it.\n */\nconst useHoverHandlers = ({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n}: HandlerInput) => {\n const [touchTimeout, setTouchTimeout] = React.useState<number>();\n\n /** A touch device with touch disabled has no hover to respond to. */\n const hoverIgnored = isTouchDevice && !touchEnabled;\n\n const cancelTouch = React.useCallback(() => {\n if (touchTimeout) {\n window.clearTimeout(touchTimeout);\n setTouchTimeout(undefined);\n }\n }, [touchTimeout]);\n\n React.useEffect(\n () => () => {\n if (touchTimeout) window.clearTimeout(touchTimeout);\n },\n [touchTimeout],\n );\n\n const triggerHandlers = {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n if (hoverIgnored) return;\n openCard(event);\n },\n onMouseLeave: () => {\n if (hoverIgnored) return;\n closeCard();\n },\n onTouchStart: (event: React.TouchEvent<HTMLElement>) => {\n if (!touchEnabled) return;\n if (touchTimeout) window.clearTimeout(touchTimeout);\n setTouchTimeout(window.setTimeout(() => openCard(event), enterDelay));\n },\n // End and cancel do the same thing: the press did not become a long press.\n onTouchEnd: cancelTouch,\n onTouchCancel: cancelTouch,\n };\n\n /** Moving onto the card keeps it open; leaving it starts the exit delay. */\n const cardHandlers = {\n onMouseEnter: () => {\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n onMouseLeave: closeCard,\n };\n\n return { triggerHandlers, cardHandlers };\n};\n\n/** Escape dismisses the card while it is open. */\nconst useEscapeKey = (active: boolean, onEscape: () => void) => {\n React.useEffect(() => {\n if (!active) return;\n\n const handleEscape = (event: globalThis.KeyboardEvent) => {\n if (event.key === 'Escape') onEscape();\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [active, onEscape]);\n};\n\ninterface HoverCardTimingInput {\n disabled: boolean;\n touchEnabled: boolean;\n enterDelay: number;\n exitDelay: number;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\n/**\n * When the card is open, and the delays that decide it.\n *\n * Three timers are in play: the enter delay before opening, the exit delay\n * before closing (so the pointer can travel from the trigger onto the card\n * without dismissing it), and the long-press timer on touch. Each cancels the\n * others' pending work, which is why they live together.\n */\nexport const useHoverCard = ({\n disabled,\n touchEnabled,\n enterDelay,\n exitDelay,\n onOpen,\n onClose,\n}: HoverCardTimingInput) => {\n const [anchorEl, setAnchorEl] = React.useState<HTMLElement | null>(null);\n const [isOpen, setIsOpen] = React.useState(false);\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n const enterTimeoutRef = React.useRef<number | undefined>(undefined);\n const exitTimeoutRef = React.useRef<number | undefined>(undefined);\n\n // Probed in an effect, not during render, so SSR and hydration stay intact.\n React.useEffect(() => {\n setIsTouchDevice('ontouchstart' in window);\n }, []);\n\n const openCard = React.useCallback(\n (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>) => {\n if (disabled) return;\n\n if (exitTimeoutRef.current) {\n window.clearTimeout(exitTimeoutRef.current);\n }\n\n const target = event.currentTarget;\n enterTimeoutRef.current = window.setTimeout(() => {\n setAnchorEl(target);\n setIsOpen(true);\n onOpen?.();\n }, enterDelay);\n },\n [disabled, enterDelay, onOpen],\n );\n\n const closeCard = React.useCallback(() => {\n if (enterTimeoutRef.current) {\n window.clearTimeout(enterTimeoutRef.current);\n }\n\n exitTimeoutRef.current = window.setTimeout(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, exitDelay);\n }, [exitDelay, onClose]);\n\n const handleClose = React.useCallback(() => {\n setIsOpen(false);\n setAnchorEl(null);\n onClose?.();\n }, [onClose]);\n\n const { triggerHandlers, cardHandlers } = useHoverHandlers({\n isTouchDevice,\n touchEnabled,\n enterDelay,\n openCard,\n closeCard,\n exitTimeoutRef,\n });\n\n useEscapeKey(isOpen, handleClose);\n\n React.useEffect(\n () => () => {\n if (enterTimeoutRef.current) window.clearTimeout(enterTimeoutRef.current);\n if (exitTimeoutRef.current) window.clearTimeout(exitTimeoutRef.current);\n },\n [],\n );\n\n return { anchorEl, isOpen, handleClose, triggerHandlers, cardHandlers };\n};\n","import { alpha } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport {\n pulseAnimation,\n scaleIn,\n slideInDown,\n slideInLeft,\n slideInRight,\n slideInUp,\n} from './HoverCard.animations';\nimport type { HoverCardAnimation, HoverCardPlacement } from './HoverCard.types';\n\n/** The edge the card sits on, ignoring the `-start`/`-end` alignment suffix. */\ntype Side = 'top' | 'bottom' | 'left' | 'right';\n\nexport const sideOf = (placement: HoverCardPlacement): Side => {\n if (placement.startsWith('top')) return 'top';\n if (placement.startsWith('left')) return 'left';\n if (placement.startsWith('right')) return 'right';\n return 'bottom';\n};\n\nconst ARROW_SIZE = 8;\n\n/**\n * The arrow is a CSS triangle: two transparent borders on the cross axis and one\n * filled border pointing back at the anchor. Every placement is that same shape,\n * so the table holds only which edge is filled and where the triangle sits.\n */\nconst ARROWS: Record<Side, (color: string) => CSSObject> = {\n top: (color) => ({\n bottom: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderTop: `${ARROW_SIZE}px solid ${color}`,\n }),\n bottom: (color) => ({\n top: -ARROW_SIZE,\n left: '50%',\n transform: 'translateX(-50%)',\n borderLeft: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid ${color}`,\n }),\n left: (color) => ({\n right: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderLeft: `${ARROW_SIZE}px solid ${color}`,\n }),\n right: (color) => ({\n left: -ARROW_SIZE,\n top: '50%',\n transform: 'translateY(-50%)',\n borderTop: `${ARROW_SIZE}px solid transparent`,\n borderBottom: `${ARROW_SIZE}px solid transparent`,\n borderRight: `${ARROW_SIZE}px solid ${color}`,\n }),\n};\n\nexport const arrowSx = (theme: Theme, placement: HoverCardPlacement): CSSObject => ({\n position: 'absolute',\n width: 0,\n height: 0,\n zIndex: 1,\n ...ARROWS[sideOf(placement)](theme.palette.background.paper),\n});\n\ntype Origin = { vertical: 'top' | 'center' | 'bottom'; horizontal: 'left' | 'center' | 'right' };\n\n/** Where the popover attaches to the anchor, per side. */\nconst ANCHOR_ORIGINS: Record<Side, Origin> = {\n top: { vertical: 'top', horizontal: 'center' },\n bottom: { vertical: 'bottom', horizontal: 'center' },\n left: { vertical: 'center', horizontal: 'left' },\n right: { vertical: 'center', horizontal: 'right' },\n};\n\n/** The card's own corner meets the anchor's, so its origin is the opposite one. */\nconst flip = (origin: Origin): Origin => ({\n vertical: origin.vertical === 'top' ? 'bottom' : origin.vertical === 'bottom' ? 'top' : 'center',\n horizontal:\n origin.horizontal === 'left' ? 'right' : origin.horizontal === 'right' ? 'left' : 'center',\n});\n\nexport const getAnchorOrigin = (placement: HoverCardPlacement): Origin =>\n ANCHOR_ORIGINS[sideOf(placement)];\n\nexport const getTransformOrigin = (placement: HoverCardPlacement): Origin =>\n flip(ANCHOR_ORIGINS[sideOf(placement)]);\n\nconst ANIMATIONS: Record<string, CSSObject> = {\n // `fade` shares slideInUp deliberately: the keyframes fade in while rising.\n fade: { animation: `${slideInUp} 0.2s ease-out` },\n scale: { transformOrigin: 'center', animation: `${scaleIn} 0.2s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-up': { animation: `${slideInUp} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-down': { animation: `${slideInDown} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-left': { animation: `${slideInLeft} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n 'slide-right': { animation: `${slideInRight} 0.3s cubic-bezier(0.4, 0, 0.2, 1)` },\n};\n\nconst VARIANTS: Record<string, (theme: Theme) => CSSObject> = {\n default: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[8],\n }),\n glass: (theme) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.85),\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: `0 8px 32px ${alpha(theme.palette.common.black, 0.12)}`,\n }),\n detailed: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[12],\n }),\n minimal: (theme) => ({\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n boxShadow: theme.shadows[4],\n }),\n};\n\nconst glowStyles = (theme: Theme): CSSObject => ({\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n});\n\nconst pulseStyles = (theme: Theme): CSSObject => ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n});\n\nexport interface CardStyleFlags {\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n animation?: HoverCardAnimation;\n}\n\nexport const cardSx = (theme: Theme, flags: CardStyleFlags): CSSObject => {\n const { customVariant, glow, pulse, animation } = flags;\n\n return {\n borderRadius: theme.spacing(1.5),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n overflow: 'visible',\n minWidth: 200,\n maxWidth: 400,\n ...(animation ? (ANIMATIONS[animation] ?? {}) : {}),\n ...(customVariant ? (VARIANTS[customVariant]?.(theme) ?? {}) : {}),\n // The old \"both\" arm was exactly these two spread together.\n ...(glow && glowStyles(theme)),\n ...(pulse && pulseStyles(theme)),\n };\n};\n","import { keyframes } from '@mui/material';\n\nexport const pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nexport const slideInUp = keyframes`\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInDown = keyframes`\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const slideInRight = keyframes`\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const scaleIn = keyframes`\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Arrow component\n"],"mappings":"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","names":["Box","styled","React","React","Fragment","jsx","jsxs","styled","React","Box"]}
@@ -448,7 +448,7 @@ EnhancedTableBody.displayName = "EnhancedTableBody";
448
448
  // src/components/data-display/Table/TableStates.tsx
449
449
  import { Box as Box2, TableBody as TableBody2, TableCell as TableCell2, TableRow as TableRow2 } from "@mui/material";
450
450
  import { jsx as jsx3 } from "react/jsx-runtime";
451
- var NoDataPlaceholder = () => /* @__PURE__ */ jsx3(Box2, { py: 4, color: "text.secondary", children: "No data available" });
451
+ var NoDataPlaceholder = ({ emptyText }) => /* @__PURE__ */ jsx3(Box2, { py: 4, color: "text.secondary", children: emptyText });
452
452
  var EmptyRow = ({
453
453
  colSpan,
454
454
  children
@@ -838,7 +838,7 @@ var buildShell = ({
838
838
  rest
839
839
  });
840
840
  var TableLoadingState = ({ shell, loadingComponent, columns }) => /* @__PURE__ */ jsx4(TableShell, { ...shell, children: /* @__PURE__ */ jsx4(TableBody3, { "data-testid": "table-loading", children: loadingComponent || /* @__PURE__ */ jsx4(LoadingSkeletonRows, { columns }) }) });
841
- var TableEmptyState = ({ shell, emptyStateComponent, colSpan }) => /* @__PURE__ */ jsx4(TableShell, { ...shell, children: /* @__PURE__ */ jsx4(EmptyRow, { colSpan, children: emptyStateComponent || /* @__PURE__ */ jsx4(NoDataPlaceholder, {}) }) });
841
+ var TableEmptyState = ({ shell, emptyStateComponent, emptyText, colSpan }) => /* @__PURE__ */ jsx4(TableShell, { ...shell, children: /* @__PURE__ */ jsx4(EmptyRow, { colSpan, children: emptyStateComponent || /* @__PURE__ */ jsx4(NoDataPlaceholder, { emptyText }) }) });
842
842
  var Table = React2.forwardRef(
843
843
  (tableProps, ref) => {
844
844
  const resolved = { ...TABLE_DEFAULTS, ...definedProps(tableProps) };
@@ -849,6 +849,7 @@ var Table = React2.forwardRef(
849
849
  loading,
850
850
  loadingComponent,
851
851
  emptyStateComponent,
852
+ emptyText,
852
853
  children,
853
854
  ...props
854
855
  } = resolved;
@@ -874,6 +875,7 @@ var Table = React2.forwardRef(
874
875
  {
875
876
  shell,
876
877
  emptyStateComponent,
878
+ emptyText,
877
879
  colSpan: finalColumns?.length || 1
878
880
  }
879
881
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-display/Table/Table.tsx","../../src/components/data-display/Table/Table.helpers.ts","../../src/components/data-display/Table/Table.hooks.ts","../../src/components/data-display/Table/TableParts.tsx","../../src/components/data-display/Table/TableParts.hooks.tsx","../../src/components/data-display/Table/TableStates.tsx","../../src/components/data-display/Table/Table.styles.ts"],"sourcesContent":["import MoreVertIcon from '@mui/icons-material/MoreVert';\nimport {\n Box,\n FormControlLabel,\n IconButton,\n Menu,\n MenuItem,\n Skeleton,\n Switch,\n Table as MuiTable,\n TableBody,\n TableCell,\n TableContainer,\n TableRow\n } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type {\n ColumnConfig,\n TableDensity,\n TableProps,\n TableStripeColor} from './Table.types';\nimport { TABLE_DEFAULTS, definedProps } from './Table.helpers';\nimport { useTableSelection } from './Table.hooks';\nimport { EnhancedTableBody, EnhancedTableHeader } from './TableParts';\nimport { EmptyRow, NoDataPlaceholder } from './TableStates';\nimport {\n tableStyles } from './Table.styles';\n\n// Define pulse animation\nconst StyledTableContainer = styled(TableContainer, {\n shouldForwardProp: (prop) => !['virtualScrolling', 'containerHeight'].includes(prop as string) })<{ \n virtualScrolling?: boolean; \n containerHeight?: number | string;\n}>(({ virtualScrolling, containerHeight }) => ({\n ...(virtualScrolling && {\n height: containerHeight || 400,\n overflow: 'auto' }) }));\n\n// Helper function to get stripe color from theme\nconst StyledTable = styled(MuiTable, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'hoverable', 'density', 'stickyHeader', 'stripeColor'].includes(prop as string) })<{\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n stripeColor?: TableStripeColor;\n}>(({ theme, customVariant, glow, pulse, hoverable, density, stickyHeader, stripeColor = 'neutral' }) => {\n return tableStyles({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor });\n});\n\n// Virtual Scrolling Hook\nconst TableShell: React.FC<{\n innerRef: React.Ref<globalThis.HTMLTableElement>;\n variant?: string;\n stripeColor?: TableStripeColor;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n header: React.ReactNode;\n rest: Record<string, unknown>;\n children: React.ReactNode;\n}> = ({\n innerRef,\n variant,\n stripeColor,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n header,\n rest,\n children }) => (\n <StyledTableContainer>\n <StyledTable\n ref={innerRef}\n customVariant={variant}\n stripeColor={stripeColor}\n glow={glow}\n pulse={pulse}\n hoverable={hoverable}\n density={density}\n stickyHeader={stickyHeader}\n {...rest}\n >\n {header}\n {children}\n </StyledTable>\n </StyledTableContainer>\n);\n\nconst SKELETON_ROW_COUNT = 5;\n\nconst LoadingSkeletonRows: React.FC<{ columns?: ColumnConfig[] }> = ({ columns }) => (\n <>\n {Array.from({ length: SKELETON_ROW_COUNT }, (_, index) => (\n <TableRow key={index}>\n {columns?.map((column) => (\n <TableCell key={column.key}>\n <Skeleton height={20} />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </>\n);\n\nexport type TableShellProps = Omit<React.ComponentProps<typeof TableShell>, 'children'>;\n\ntype Selection = ReturnType<typeof useTableSelection>;\n\ninterface RendererProps {\n resolved: TableProps;\n selection: Selection;\n innerRef: React.Ref<globalThis.HTMLTableElement>;\n rest: Record<string, unknown>;\n}\n\n// The column-visibility control, shown only when responsive mode has actually\n// hidden something on a narrow viewport.\nconst ColumnToggleMenu: React.FC<{\n columns: ColumnConfig[];\n hiddenColumns: number[];\n anchor: HTMLElement | null;\n setAnchor: (element: HTMLElement | null) => void;\n setHiddenColumns: (next: number[]) => void;\n}> = ({ columns, hiddenColumns, anchor, setAnchor, setHiddenColumns }) => (\n <Box position=\"absolute\" top={8} right={8}>\n <IconButton onClick={(event) => setAnchor(event.currentTarget)} size=\"small\">\n <MoreVertIcon />\n </IconButton>\n <Menu anchorEl={anchor} open={Boolean(anchor)} onClose={() => setAnchor(null)}>\n {columns.map((column, index) => (\n <MenuItem key={column.key}>\n <FormControlLabel\n control={\n <Switch\n checked={!hiddenColumns.includes(index)}\n onChange={(event) =>\n setHiddenColumns(\n event.target.checked\n ? hiddenColumns.filter((i: number) => i !== index)\n : [...hiddenColumns, index],\n )\n }\n size=\"small\"\n />\n }\n label={column.label}\n />\n </MenuItem>\n ))}\n </Menu>\n </Box>\n);\n\n// The populated table. Local because StyledTableContainer and StyledTable\n// cannot cross a module boundary (TS2742).\nconst columnsFor = (resolved: TableProps, selection: Selection): ColumnConfig[] =>\n (resolved.responsive ? selection.visibleColumns : resolved.columns) ?? [];\n\n// The toggle only earns its place when responsive mode has actually hidden\n// something on a narrow viewport.\nconst showsColumnToggle = (resolved: TableProps, selection: Selection): boolean =>\n Boolean(\n resolved.responsive &&\n selection.isMobile &&\n resolved.showColumnToggle &&\n selection.hiddenColumns.length > 0,\n );\n\nconst AdvancedTable: React.FC<RendererProps> = ({ resolved: p, selection, innerRef, rest }) => {\n const finalColumns = columnsFor(p, selection);\n const showToggle = showsColumnToggle(p, selection);\n\n return (\n <Box position=\"relative\">\n <StyledTableContainer\n virtualScrolling={p.virtualScrolling}\n containerHeight={p.containerHeight}\n >\n <StyledTable\n ref={innerRef}\n customVariant={p.variant}\n stripeColor={p.stripeColor}\n glow={p.glow}\n pulse={p.pulse}\n hoverable={p.hoverable}\n density={p.density}\n stickyHeader={p.stickyHeader}\n {...rest}\n >\n <EnhancedTableHeader\n columns={finalColumns}\n data={p.data ?? []}\n sortable={p.sortable}\n sortConfig={p.sortConfig}\n onSortChange={p.onSortChange}\n selectable={p.selectable}\n selectedRows={p.selectedRows}\n onSelectAll={selection.handleSelectAll}\n density={p.density}\n stickyHeader={p.stickyHeader}\n />\n <EnhancedTableBody\n data={p.data ?? []}\n columns={finalColumns}\n selectedRows={p.selectedRows}\n onRowClick={p.onRowClick}\n onRowFocus={p.onRowFocus}\n onRowBlur={p.onRowBlur}\n onSelectionChange={selection.handleSelectionChange}\n rowKeyExtractor={p.rowKeyExtractor}\n density={p.density}\n selectable={p.selectable}\n hoverable={p.hoverable}\n renderRow={p.renderRow}\n renderCell={p.renderCell}\n virtualScrolling={p.virtualScrolling}\n containerHeight={typeof p.containerHeight === 'number' ? p.containerHeight : undefined}\n rowHeight={p.rowHeight}\n overscan={p.overscan}\n />\n </StyledTable>\n </StyledTableContainer>\n\n {showToggle && (\n <ColumnToggleMenu\n columns={p.columns ?? []}\n hiddenColumns={selection.hiddenColumns}\n anchor={selection.columnMenuAnchor}\n setAnchor={selection.setColumnMenuAnchor}\n setHiddenColumns={selection.setHiddenColumns}\n />\n )}\n </Box>\n );\n};\n\n// The loading and empty states render the same shell as the populated table, so\n// they share TableShell rather than repeating it three times.\nconst buildShell = ({\n resolved,\n selection,\n innerRef,\n rest,\n finalColumns }: RendererProps & { finalColumns?: ColumnConfig[] }) => ({\n innerRef,\n variant: resolved.variant,\n stripeColor: resolved.stripeColor,\n glow: resolved.glow,\n pulse: resolved.pulse,\n hoverable: resolved.hoverable,\n density: resolved.density,\n stickyHeader: resolved.stickyHeader,\n header: resolved.columns ? (\n <EnhancedTableHeader\n columns={finalColumns ?? []}\n data={[]}\n sortable={resolved.sortable}\n sortConfig={resolved.sortConfig}\n onSortChange={resolved.onSortChange}\n selectable={resolved.selectable}\n selectedRows={resolved.selectedRows}\n onSelectAll={selection.handleSelectAll}\n density={resolved.density}\n stickyHeader={resolved.stickyHeader}\n />\n ) : null,\n rest: rest as Record<string, unknown> });\n\nconst TableLoadingState: React.FC<{\n shell: TableShellProps;\n loadingComponent?: React.ReactNode;\n columns?: ColumnConfig[];\n}> = ({ shell, loadingComponent, columns }) => (\n <TableShell {...shell}>\n <TableBody data-testid=\"table-loading\">\n {loadingComponent || <LoadingSkeletonRows columns={columns} />}\n </TableBody>\n </TableShell>\n);\n\nconst TableEmptyState: React.FC<{\n shell: TableShellProps;\n emptyStateComponent?: React.ReactNode;\n colSpan: number;\n}> = ({ shell, emptyStateComponent, colSpan }) => (\n <TableShell {...shell}>\n <EmptyRow colSpan={colSpan}>{emptyStateComponent || <NoDataPlaceholder />}</EmptyRow>\n </TableShell>\n);\n\nexport const Table = React.forwardRef<globalThis.HTMLTableElement, TableProps>(\n (tableProps, ref) => {\n const resolved = { ...TABLE_DEFAULTS, ...definedProps(tableProps) } as TableProps;\n const {\n columns,\n data,\n responsive,\n loading,\n loadingComponent,\n emptyStateComponent,\n children,\n ...props\n } = resolved;\n\n const selection = useTableSelection({\n columns,\n data,\n responsive,\n columnPriorities: resolved.columnPriorities,\n selectedRows: resolved.selectedRows ?? [],\n rowKeyExtractor: resolved.rowKeyExtractor,\n onSelectionChange: resolved.onSelectionChange });\n\n const rest = props as unknown as Record<string, unknown>;\n const renderer: RendererProps = { resolved, selection, innerRef: ref, rest };\n const finalColumns = responsive ? selection.visibleColumns : columns;\n const shell = buildShell({ ...renderer, finalColumns });\n\n if (loading) {\n return (\n <TableLoadingState shell={shell} loadingComponent={loadingComponent} columns={columns} />\n );\n }\n\n if (data && data.length === 0) {\n return (\n <TableEmptyState\n shell={shell}\n emptyStateComponent={emptyStateComponent}\n colSpan={finalColumns?.length || 1}\n />\n );\n }\n\n if (columns && data) return <AdvancedTable {...renderer} />;\n\n // Basic table (backward compatibility)\n return (\n <StyledTable\n ref={ref}\n customVariant={resolved.variant}\n stripeColor={resolved.stripeColor}\n glow={resolved.glow}\n pulse={resolved.pulse}\n hoverable={resolved.hoverable}\n density={resolved.density}\n stickyHeader={resolved.stickyHeader}\n {...rest}\n >\n {children}\n </StyledTable>\n );\n },\n);\n\nTable.displayName = 'Table';","import type { TableProps } from './Table.types';\n\nexport const TABLE_DEFAULTS: Partial<TableProps> = {\n variant: 'default',\n stripeColor: 'neutral',\n glow: false,\n pulse: false,\n hoverable: false,\n loading: false,\n density: 'normal',\n stickyHeader: false,\n selectable: false,\n selectedRows: [],\n sortable: false,\n virtualScrolling: false,\n rowHeight: 52,\n overscan: 5,\n responsive: false,\n showColumnToggle: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default as a destructuring default would. Eighteen separate\n// destructuring defaults were most of this component's branch count.\nexport const definedProps = (props: TableProps): Partial<TableProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<TableProps>;\n\n// The container + styled table + optional header, shared by the loading, empty\n// and populated renders.\n","import { useMediaQuery, useTheme } from '@mui/material';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport type { ColumnConfig, TableProps } from './Table.types';\n\nexport const useVirtualScrolling = (\n data: Record<string, unknown>[],\n rowHeight: number,\n containerHeight: number,\n overscan: number = 5\n) => {\n const [scrollTop, setScrollTop] = useState(0);\n \n const visibleItems = useMemo(() => {\n const visibleHeight = containerHeight;\n const startIndex = Math.floor(scrollTop / rowHeight);\n const endIndex = Math.min(\n data.length,\n Math.ceil((scrollTop + visibleHeight) / rowHeight)\n );\n \n const start = Math.max(0, startIndex - overscan);\n const end = Math.min(data.length, endIndex + overscan);\n \n return {\n startIndex: start,\n endIndex: end,\n items: data.slice(start, end),\n totalHeight: data.length * rowHeight,\n offsetY: start * rowHeight,\n };\n }, [data, rowHeight, containerHeight, scrollTop, overscan]);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop);\n }, []);\n\n return { visibleItems, handleScroll };\n};\n\n// Responsive Hook\n\nconst useResponsive = (\n columns: ColumnConfig[],\n columnPriorities?: number[]\n) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\n const isTablet = useMediaQuery(theme.breakpoints.down('lg'));\n \n const [hiddenColumns, setHiddenColumns] = useState<number[]>([]);\n const [columnMenuAnchor, setColumnMenuAnchor] = useState<null | HTMLElement>(null);\n\n useEffect(() => {\n if (!columnPriorities) return;\n \n let columnsToHide: number[] = [];\n \n if (isMobile) {\n // Hide lowest priority columns on mobile\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 2))\n .map(item => item.index);\n } else if (isTablet) {\n // Hide some columns on tablet\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 3))\n .map(item => item.index);\n }\n \n setHiddenColumns(columnsToHide);\n }, [isMobile, isTablet, columnPriorities, columns.length]);\n\n const visibleColumns = columns.filter((_, index) => !hiddenColumns.includes(index));\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n };\n};\n\n// Enhanced Table Header Component\n// Visible/hidden column split for responsive mode, plus row selection.\nexport const useTableSelection = ({\n columns,\n data,\n responsive,\n columnPriorities,\n selectedRows,\n rowKeyExtractor,\n onSelectionChange,\n}: {\n columns?: ColumnConfig[];\n data: TableProps['data'];\n responsive?: boolean;\n columnPriorities?: number[];\n selectedRows: (string | number)[];\n rowKeyExtractor?: (row: Record<string, unknown>, index: number) => string | number;\n onSelectionChange?: TableProps['onSelectionChange'];\n}) => {\n \n // Use responsive hook if responsive mode is enabled\n const {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n } = useResponsive(\n columns || [],\n responsive ? columnPriorities : undefined\n );\n\n // Handle selection changes\n const handleSelectionChange = useCallback((rowKey: string | number, selected: boolean) => {\n if (!onSelectionChange) return;\n \n let newSelection: (string | number)[];\n if (selected) {\n newSelection = [...selectedRows, rowKey];\n } else {\n newSelection = selectedRows.filter(key => key !== rowKey);\n }\n onSelectionChange(newSelection);\n }, [selectedRows, onSelectionChange]);\n\n const handleSelectAll = useCallback((selected: boolean) => {\n if (!onSelectionChange || !data) return;\n \n if (selected) {\n const allKeys = data.map((rowData, index) => \n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index\n );\n onSelectionChange(allKeys);\n } else {\n onSelectionChange([]);\n }\n }, [data, onSelectionChange, rowKeyExtractor]);\n\n // Loading state\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n handleSelectionChange,\n handleSelectAll,\n };\n};\n","import {\n Box,\n Checkbox,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TableSortLabel } from '@mui/material';\nimport React, { useCallback } from 'react';\n\nimport { useVirtualScrolling } from './Table.hooks';\nimport { useTableRowRenderer } from './TableParts.hooks';\nimport type { ColumnConfig, TableBodyProps, TableHeaderProps } from './Table.types';\n\n// Mirrors the visible sort indicator for assistive technology; undefined when\n// the column is not sorted, which is what removes the attribute entirely.\nconst ariaSortFor = (\n canSort: boolean,\n isSorted: boolean,\n direction?: 'asc' | 'desc',\n): 'ascending' | 'descending' | undefined => {\n if (!canSort || !isSorted) return undefined;\n\n return direction === 'asc' ? 'ascending' : 'descending';\n};\n\n// One header cell. Sorting is offered when the table is sortable and the column\n// has not opted out; aria-sort mirrors the visible indicator.\nconst HeaderCell: React.FC<{\n column: ColumnConfig;\n sortable?: boolean;\n sortConfig?: { key: string; direction: 'asc' | 'desc' };\n onSort: (columnKey: string) => void;\n}> = ({ column, sortable, sortConfig, onSort }) => {\n const canSort = Boolean(sortable) && column.sortable !== false;\n const isSorted = sortConfig?.key === column.key;\n\n return (\n <TableCell\n align={column.align || 'left'}\n style={{ minWidth: column.minWidth, width: column.width }}\n aria-sort={ariaSortFor(canSort, isSorted, sortConfig?.direction)}\n >\n {canSort ? (\n <TableSortLabel\n active={isSorted}\n direction={isSorted ? sortConfig?.direction : 'asc'}\n onClick={() => onSort(column.key)}\n data-testid=\"sort-indicator\"\n aria-label={`Sort by ${column.label}`}\n >\n {column.label}\n </TableSortLabel>\n ) : (\n column.label\n )}\n </TableCell>\n );\n};\n\nexport const EnhancedTableHeader: React.FC<TableHeaderProps> = React.memo(({\n columns,\n data,\n sortable,\n sortConfig,\n onSortChange,\n selectable,\n selectedRows = [],\n onSelectAll }) => {\n const handleSort = useCallback(\n (columnKey: string) => {\n if (!sortable || !onSortChange) return;\n \n const direction = \n sortConfig?.key === columnKey && sortConfig.direction === 'asc' ? 'desc' : 'asc';\n onSortChange(columnKey, direction);\n },\n [sortable, onSortChange, sortConfig]\n );\n\n const handleSelectAll = useCallback(\n (event: React.ChangeEvent<globalThis.HTMLInputElement>) => {\n if (!onSelectAll) return;\n onSelectAll(event.target.checked);\n },\n [onSelectAll]\n );\n\n return (\n <TableHead>\n <TableRow>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n indeterminate={selectedRows.length > 0 && selectedRows.length < data.length}\n checked={selectedRows.length === data.length && data.length > 0}\n onChange={handleSelectAll}\n inputProps={{ 'aria-label': 'select all' }}\n />\n </TableCell>\n )}\n {columns.map((column) => (\n <HeaderCell\n key={column.key}\n column={column}\n sortable={sortable}\n sortConfig={sortConfig}\n onSort={handleSort}\n />\n ))}\n </TableRow>\n </TableHead>\n );\n});\n\nEnhancedTableHeader.displayName = 'EnhancedTableHeader';\n\n// One data row. Split out of the memoised renderTableRow callback so the\n// callback stays a short dispatch and the row markup is readable on its own.\nexport const TableDataRow: React.FC<{\n rowData: Record<string, unknown>;\n rowKey: string | number;\n index: number;\n offsetY: number;\n columns: ColumnConfig[];\n selected: boolean;\n selectable?: boolean;\n rowHeight?: number;\n onRowClick?: TableBodyProps['onRowClick'];\n onRowFocus?: TableBodyProps['onRowFocus'];\n onRowBlur?: TableBodyProps['onRowBlur'];\n onSelect: (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => void;\n virtualScrolling?: boolean;\n renderCell?: TableBodyProps['renderCell'];\n}> = ({\n rowData,\n rowKey,\n index,\n offsetY,\n columns,\n selected,\n selectable,\n rowHeight,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelect,\n virtualScrolling,\n renderCell }) => (\n\n <TableRow\n key={String(rowKey)}\n selected={selected}\n className={selected ? 'selected' : ''}\n onClick={(event: React.MouseEvent<globalThis.HTMLTableRowElement>) => onRowClick?.(event, rowData)}\n onFocus={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowFocus?.(event, rowData)}\n onBlur={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowBlur?.(event, rowData)}\n style={virtualScrolling ? { \n transform: `translateY(${offsetY}px)`,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: rowHeight } : undefined}\n >\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n checked={selected}\n onChange={(event) => onSelect(event, rowKey)}\n onClick={(event) => event.stopPropagation()}\n inputProps={{ 'aria-label': `select row ${index + 1}` }}\n />\n </TableCell>\n )}\n {columns.map((column) => {\n const value = rowData[column.key];\n return (\n <TableCell key={column.key} align={column.align || 'left'}>\n {renderCell \n ? renderCell(value, column, rowData, index)\n : column.render \n ? column.render(value, rowData) \n : (value as React.ReactNode)\n }\n </TableCell>\n );\n })}\n </TableRow>\n);\n\n// Only the rows in view are rendered, positioned by absolute offset inside a\n// spacer sized to the full data set.\nconst VirtualisedBody: React.FC<{\n visibleItems: {\n items: Record<string, unknown>[];\n startIndex: number;\n offsetY: number;\n totalHeight: number;\n };\n rowHeight: number;\n containerHeight: number;\n onScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n renderTableRow: (\n rowData: Record<string, unknown>,\n index: number,\n offsetY?: number,\n ) => React.ReactNode;\n}> = ({ visibleItems, rowHeight, containerHeight, onScroll, renderTableRow }) => (\n\n <Box\n onScroll={onScroll}\n style={{\n height: containerHeight,\n overflow: 'auto',\n position: 'relative' }}\n >\n <TableBody\n style={{\n height: visibleItems.totalHeight,\n position: 'relative' }}\n >\n {visibleItems.items.map((rowData, index) => \n renderTableRow(rowData, visibleItems.startIndex + index, visibleItems.offsetY + index * rowHeight)\n )}\n </TableBody>\n </Box>\n \n);\n\nconst PlainBody: React.FC<{\n data: TableBodyProps['data'];\n renderTableRow: (rowData: Record<string, unknown>, index: number) => React.ReactNode;\n}> = ({ data, renderTableRow }) => (\n\n <TableBody>\n {data.map((rowData, index) => renderTableRow(rowData, index))}\n </TableBody>\n);\n\n// Enhanced Table Body Component \nexport const EnhancedTableBody: React.FC<TableBodyProps> = React.memo(({\n data,\n columns,\n selectedRows = [],\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n containerHeight,\n rowHeight,\n overscan = 5 }) => {\n const renderTableRow = useTableRowRenderer({\n columns,\n selectedRows,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n rowHeight });\n\n const { visibleItems, handleScroll } = useVirtualScrolling(\n data, \n rowHeight || 40, \n typeof containerHeight === 'number' ? containerHeight : 400, \n overscan\n );\n\n if (virtualScrolling && containerHeight && rowHeight) {\n return (\n <VirtualisedBody\n visibleItems={visibleItems}\n rowHeight={rowHeight}\n containerHeight={containerHeight}\n onScroll={handleScroll}\n renderTableRow={renderTableRow}\n />\n );\n }\n\n return (\n <PlainBody data={data} renderTableRow={renderTableRow} />\n );\n});\n\nEnhancedTableBody.displayName = 'EnhancedTableBody';\n\n// Main Table Component\n","import type React from 'react';\nimport { useCallback } from 'react';\n\nimport { TableDataRow } from './TableParts';\nimport type { TableBodyProps } from './Table.types';\n\n// Row identity, selection and the row element itself. Split out of\n// EnhancedTableBody so that component is just the virtualised/plain choice.\n// A row's identity: the caller's extractor, else its id, else its position.\nconst useRowKey = (rowKeyExtractor: TableBodyProps['rowKeyExtractor']) =>\n useCallback(\n (rowData: Record<string, unknown>, index: number): string | number =>\n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index,\n [rowKeyExtractor],\n );\n\nconst useRowSelection = ({\n selectedRows,\n onSelectionChange,\n}: {\n selectedRows: Array<string | number>;\n onSelectionChange: TableBodyProps['onSelectionChange'];\n}) =>\n useCallback(\n (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => {\n // Stop propagation so selecting does not also fire the row click.\n event.stopPropagation();\n if (!onSelectionChange) return;\n onSelectionChange(rowKey, !selectedRows.includes(rowKey));\n },\n [onSelectionChange, selectedRows],\n );\n\nexport const useTableRowRenderer = ({\n columns,\n selectedRows,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n rowHeight,\n}: Pick<\n TableBodyProps,\n | 'columns'\n | 'onRowClick'\n | 'onRowFocus'\n | 'onRowBlur'\n | 'onSelectionChange'\n | 'rowKeyExtractor'\n | 'selectable'\n | 'renderRow'\n | 'renderCell'\n | 'virtualScrolling'\n | 'rowHeight'\n> & { selectedRows: Array<string | number> }) => {\n const getRowKey = useRowKey(rowKeyExtractor);\n const isRowSelected = useCallback(\n (rowKey: string | number) => selectedRows.includes(rowKey),\n [selectedRows],\n );\n const handleRowSelection = useRowSelection({ selectedRows, onSelectionChange });\n\n const renderTableRow = useCallback(\n (rowData: Record<string, unknown>, index: number, offsetY: number = 0) => {\n const rowKey = getRowKey(rowData, index);\n const selected = isRowSelected(rowKey);\n\n if (renderRow) return renderRow(rowData, index, selected);\n\n return (\n <TableDataRow\n key={rowKey}\n rowData={rowData}\n rowKey={rowKey}\n index={index}\n offsetY={offsetY}\n columns={columns}\n selected={selected}\n selectable={selectable}\n rowHeight={rowHeight}\n onRowClick={onRowClick}\n onRowFocus={onRowFocus}\n onRowBlur={onRowBlur}\n onSelect={handleRowSelection}\n virtualScrolling={virtualScrolling}\n renderCell={renderCell}\n />\n );\n },\n [\n columns,\n getRowKey,\n isRowSelected,\n handleRowSelection,\n onRowClick,\n onRowFocus,\n onRowBlur,\n renderRow,\n renderCell,\n rowHeight,\n selectable,\n virtualScrolling,\n ],\n );\n\n return renderTableRow;\n};\n","import { Box, TableBody, TableCell, TableRow } from '@mui/material';\nimport React from 'react';\n\n\nexport const NoDataPlaceholder: React.FC = () => (\n <Box py={4} color=\"text.secondary\">\n No data available\n </Box>\n);\n\nexport const EmptyRow: React.FC<{ colSpan: number; children: React.ReactNode }> = ({\n colSpan,\n children }) => (\n <TableBody>\n <TableRow>\n <TableCell colSpan={colSpan} align=\"center\">\n {children}\n </TableCell>\n </TableRow>\n </TableBody>\n);\n","import { alpha, keyframes } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport type { TableDensity, TableStripeColor } from './Table.types';\n\nconst pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\n// Density configurations\nconst getDensityConfig = (density: TableDensity = 'normal') => {\n const configs = {\n compact: {\n rowHeight: 36,\n cellPadding: '6px 12px',\n fontSize: '0.8125rem',\n headerPadding: '8px 12px' },\n normal: {\n rowHeight: 52,\n cellPadding: '12px 16px',\n fontSize: '0.875rem',\n headerPadding: '16px 16px' },\n comfortable: {\n rowHeight: 68,\n cellPadding: '18px 24px',\n fontSize: '0.875rem',\n headerPadding: '20px 24px' } };\n return configs[density];\n};\n\nconst getStripeColorFromTheme = (theme: { palette: { primary: { main: string }; secondary: { main: string }; info: { main: string }; success: { main: string }; warning: { main: string }; error: { main: string }; action: { hover: string } } }, stripeColor: TableStripeColor = 'neutral') => {\n const colorMap: Record<TableStripeColor, string> = {\n primary: theme.palette.primary.main,\n secondary: theme.palette.secondary.main,\n info: theme.palette.info.main,\n success: theme.palette.success.main,\n warning: theme.palette.warning.main,\n danger: theme.palette.error.main,\n neutral: theme.palette.action.hover };\n return colorMap[stripeColor];\n};\n\n/**\n * The zebra stripe for one body row.\n *\n * `neutral` — the default — resolves to `palette.action.hover`, which ALREADY\n * carries its subtlety in its own alpha (`rgba(0,0,0,0.04)` in the light\n * theme). MUI's `alpha()` REPLACES that channel rather than multiplying it, so\n * re-alpha-ing it at 0.5 amplified the tint 12.5× into `rgba(0,0,0,0.5)` —\n * solid #808080 on a white card, which reads as a selected or errored row\n * rather than as a stripe (FUT-755). It is used as-is instead.\n *\n * The named colours are opaque `*.main` values with no alpha of their own, so\n * they still need one.\n */\nconst stripeRowColor = (\n theme: Parameters<typeof getStripeColorFromTheme>[0],\n stripeColor: TableStripeColor = 'neutral',\n): string => {\n const color = getStripeColorFromTheme(theme, stripeColor);\n return stripeColor === 'neutral' ? color : alpha(color, 0.15);\n};\n\n// One variant applies at a time, so a lookup replaces the mutually exclusive\n// spreads.\nconst TABLE_VARIANTS: Record<string, (args: VariantArgs) => CSSObject> = {\n default: ({ theme }) => ({\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableHead-root': {\n backgroundColor: alpha(theme.palette.primary.main, 0.1) } }),\n striped: ({ theme, stripeColor }) => ({\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableBody-root .MuiTableRow-root:nth-of-type(even)': {\n backgroundColor: stripeRowColor(theme, stripeColor) } }),\n glass: ({ theme }) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}` }),\n minimal: ({ theme }) => ({\n backgroundColor: 'transparent',\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.1)}` } }),\n gradient: ({ theme }) => ({\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.05)}, ${alpha(theme.palette.secondary.main, 0.05)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n '& .MuiTableHead-root': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.15)}, ${alpha(theme.palette.secondary.main, 0.15)})` },\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.15)}` } }) };\n\ntype VariantArgs = {\n theme: Theme;\n densityConfig: ReturnType<typeof getDensityConfig>;\n stripeColor?: TableStripeColor;\n};\n\nconst tableVariantStyles = (args: VariantArgs, customVariant?: string): CSSObject =>\n customVariant ? (TABLE_VARIANTS[customVariant]?.(args) ?? {}) : {};\n\n// Sticky headers and row hover are independent of the variant.\nconst stickyHeaderStyles = (\n theme: Theme,\n densityConfig: ReturnType<typeof getDensityConfig>,\n): CSSObject => ({\n '& .MuiTableHead-root': {\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableCell-root': {\n borderBottom: `2px solid ${theme.palette.divider}`,\n fontWeight: 600,\n padding: densityConfig.headerPadding } } });\n\nconst hoverableRowStyles = (theme: Theme): CSSObject => ({\n '& .MuiTableBody-root .MuiTableRow-root:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n cursor: 'pointer',\n transition: 'background-color 0.15s ease-in-out' } });\n\n// glow and pulse combine into three distinct looks, spelled out rather than\n// layered — the glow-only shadow differs from the one used when both are on.\nconst emphasisStyles = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObject => {\n if (glow && pulse) return ({\n position: 'relative',\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1 } });\n if (glow) return ({\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)' });\n if (pulse) return ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1 } });\n\n return {};\n};\n\n// The table's own styling, lifted out so the styled() callback just forwards\n// its props.\nexport const tableStyles = ({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor = 'neutral' }: {\n theme: Theme;\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n stripeColor?: TableStripeColor;\n}): CSSObject => {\n const densityConfig = getDensityConfig(density);\n \n return {\n borderRadius: theme.spacing(1),\n overflow: 'hidden',\n transition: 'all 0.3s ease',\n position: 'relative',\n\n // Density styles\n '& .MuiTableCell-root': {\n padding: densityConfig.cellPadding,\n fontSize: densityConfig.fontSize,\n height: densityConfig.rowHeight },\n\n // Sticky header\n ...tableVariantStyles({ theme, densityConfig, stripeColor }, customVariant),\n ...(stickyHeader ? stickyHeaderStyles(theme, densityConfig) : {}),\n ...(hoverable ? hoverableRowStyles(theme) : {}),\n ...emphasisStyles(theme, glow, pulse),\n\n\n // Variant styles\n\n\n\n\n\n\n\n\n\n\n // Hoverable rows\n\n\n // Selection styles\n '& .MuiTableRow-root.selected': {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.16) } },\n\n // Glow effect\n\n\n // Pulse animation\n\n\n // Both glow and pulse\n\n };\n}\n"],"mappings":"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","names":["Box","TableBody","TableCell","TableRow","React","useCallback","useCallback","useCallback","jsx","useCallback","Box","TableBody","TableCell","TableRow","jsx","jsx","jsxs","TableRow","TableCell","Box","TableBody","React"]}
1
+ {"version":3,"sources":["../../src/components/data-display/Table/Table.tsx","../../src/components/data-display/Table/Table.helpers.ts","../../src/components/data-display/Table/Table.hooks.ts","../../src/components/data-display/Table/TableParts.tsx","../../src/components/data-display/Table/TableParts.hooks.tsx","../../src/components/data-display/Table/TableStates.tsx","../../src/components/data-display/Table/Table.styles.ts"],"sourcesContent":["import MoreVertIcon from '@mui/icons-material/MoreVert';\nimport {\n Box,\n FormControlLabel,\n IconButton,\n Menu,\n MenuItem,\n Skeleton,\n Switch,\n Table as MuiTable,\n TableBody,\n TableCell,\n TableContainer,\n TableRow\n } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type {\n ColumnConfig,\n TableDensity,\n TableProps,\n TableStripeColor} from './Table.types';\nimport { TABLE_DEFAULTS, definedProps } from './Table.helpers';\nimport { useTableSelection } from './Table.hooks';\nimport { EnhancedTableBody, EnhancedTableHeader } from './TableParts';\nimport { EmptyRow, NoDataPlaceholder } from './TableStates';\nimport {\n tableStyles } from './Table.styles';\n\n// Define pulse animation\nconst StyledTableContainer = styled(TableContainer, {\n shouldForwardProp: (prop) => !['virtualScrolling', 'containerHeight'].includes(prop as string) })<{ \n virtualScrolling?: boolean; \n containerHeight?: number | string;\n}>(({ virtualScrolling, containerHeight }) => ({\n ...(virtualScrolling && {\n height: containerHeight || 400,\n overflow: 'auto' }) }));\n\n// Helper function to get stripe color from theme\nconst StyledTable = styled(MuiTable, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'hoverable', 'density', 'stickyHeader', 'stripeColor'].includes(prop as string) })<{\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n stripeColor?: TableStripeColor;\n}>(({ theme, customVariant, glow, pulse, hoverable, density, stickyHeader, stripeColor = 'neutral' }) => {\n return tableStyles({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor });\n});\n\n// Virtual Scrolling Hook\nconst TableShell: React.FC<{\n innerRef: React.Ref<globalThis.HTMLTableElement>;\n variant?: string;\n stripeColor?: TableStripeColor;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n header: React.ReactNode;\n rest: Record<string, unknown>;\n children: React.ReactNode;\n}> = ({\n innerRef,\n variant,\n stripeColor,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n header,\n rest,\n children }) => (\n <StyledTableContainer>\n <StyledTable\n ref={innerRef}\n customVariant={variant}\n stripeColor={stripeColor}\n glow={glow}\n pulse={pulse}\n hoverable={hoverable}\n density={density}\n stickyHeader={stickyHeader}\n {...rest}\n >\n {header}\n {children}\n </StyledTable>\n </StyledTableContainer>\n);\n\nconst SKELETON_ROW_COUNT = 5;\n\nconst LoadingSkeletonRows: React.FC<{ columns?: ColumnConfig[] }> = ({ columns }) => (\n <>\n {Array.from({ length: SKELETON_ROW_COUNT }, (_, index) => (\n <TableRow key={index}>\n {columns?.map((column) => (\n <TableCell key={column.key}>\n <Skeleton height={20} />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </>\n);\n\nexport type TableShellProps = Omit<React.ComponentProps<typeof TableShell>, 'children'>;\n\ntype Selection = ReturnType<typeof useTableSelection>;\n\ninterface RendererProps {\n resolved: TableProps;\n selection: Selection;\n innerRef: React.Ref<globalThis.HTMLTableElement>;\n rest: Record<string, unknown>;\n}\n\n// The column-visibility control, shown only when responsive mode has actually\n// hidden something on a narrow viewport.\nconst ColumnToggleMenu: React.FC<{\n columns: ColumnConfig[];\n hiddenColumns: number[];\n anchor: HTMLElement | null;\n setAnchor: (element: HTMLElement | null) => void;\n setHiddenColumns: (next: number[]) => void;\n}> = ({ columns, hiddenColumns, anchor, setAnchor, setHiddenColumns }) => (\n <Box position=\"absolute\" top={8} right={8}>\n <IconButton onClick={(event) => setAnchor(event.currentTarget)} size=\"small\">\n <MoreVertIcon />\n </IconButton>\n <Menu anchorEl={anchor} open={Boolean(anchor)} onClose={() => setAnchor(null)}>\n {columns.map((column, index) => (\n <MenuItem key={column.key}>\n <FormControlLabel\n control={\n <Switch\n checked={!hiddenColumns.includes(index)}\n onChange={(event) =>\n setHiddenColumns(\n event.target.checked\n ? hiddenColumns.filter((i: number) => i !== index)\n : [...hiddenColumns, index],\n )\n }\n size=\"small\"\n />\n }\n label={column.label}\n />\n </MenuItem>\n ))}\n </Menu>\n </Box>\n);\n\n// The populated table. Local because StyledTableContainer and StyledTable\n// cannot cross a module boundary (TS2742).\nconst columnsFor = (resolved: TableProps, selection: Selection): ColumnConfig[] =>\n (resolved.responsive ? selection.visibleColumns : resolved.columns) ?? [];\n\n// The toggle only earns its place when responsive mode has actually hidden\n// something on a narrow viewport.\nconst showsColumnToggle = (resolved: TableProps, selection: Selection): boolean =>\n Boolean(\n resolved.responsive &&\n selection.isMobile &&\n resolved.showColumnToggle &&\n selection.hiddenColumns.length > 0,\n );\n\nconst AdvancedTable: React.FC<RendererProps> = ({ resolved: p, selection, innerRef, rest }) => {\n const finalColumns = columnsFor(p, selection);\n const showToggle = showsColumnToggle(p, selection);\n\n return (\n <Box position=\"relative\">\n <StyledTableContainer\n virtualScrolling={p.virtualScrolling}\n containerHeight={p.containerHeight}\n >\n <StyledTable\n ref={innerRef}\n customVariant={p.variant}\n stripeColor={p.stripeColor}\n glow={p.glow}\n pulse={p.pulse}\n hoverable={p.hoverable}\n density={p.density}\n stickyHeader={p.stickyHeader}\n {...rest}\n >\n <EnhancedTableHeader\n columns={finalColumns}\n data={p.data ?? []}\n sortable={p.sortable}\n sortConfig={p.sortConfig}\n onSortChange={p.onSortChange}\n selectable={p.selectable}\n selectedRows={p.selectedRows}\n onSelectAll={selection.handleSelectAll}\n density={p.density}\n stickyHeader={p.stickyHeader}\n />\n <EnhancedTableBody\n data={p.data ?? []}\n columns={finalColumns}\n selectedRows={p.selectedRows}\n onRowClick={p.onRowClick}\n onRowFocus={p.onRowFocus}\n onRowBlur={p.onRowBlur}\n onSelectionChange={selection.handleSelectionChange}\n rowKeyExtractor={p.rowKeyExtractor}\n density={p.density}\n selectable={p.selectable}\n hoverable={p.hoverable}\n renderRow={p.renderRow}\n renderCell={p.renderCell}\n virtualScrolling={p.virtualScrolling}\n containerHeight={typeof p.containerHeight === 'number' ? p.containerHeight : undefined}\n rowHeight={p.rowHeight}\n overscan={p.overscan}\n />\n </StyledTable>\n </StyledTableContainer>\n\n {showToggle && (\n <ColumnToggleMenu\n columns={p.columns ?? []}\n hiddenColumns={selection.hiddenColumns}\n anchor={selection.columnMenuAnchor}\n setAnchor={selection.setColumnMenuAnchor}\n setHiddenColumns={selection.setHiddenColumns}\n />\n )}\n </Box>\n );\n};\n\n// The loading and empty states render the same shell as the populated table, so\n// they share TableShell rather than repeating it three times.\nconst buildShell = ({\n resolved,\n selection,\n innerRef,\n rest,\n finalColumns }: RendererProps & { finalColumns?: ColumnConfig[] }) => ({\n innerRef,\n variant: resolved.variant,\n stripeColor: resolved.stripeColor,\n glow: resolved.glow,\n pulse: resolved.pulse,\n hoverable: resolved.hoverable,\n density: resolved.density,\n stickyHeader: resolved.stickyHeader,\n header: resolved.columns ? (\n <EnhancedTableHeader\n columns={finalColumns ?? []}\n data={[]}\n sortable={resolved.sortable}\n sortConfig={resolved.sortConfig}\n onSortChange={resolved.onSortChange}\n selectable={resolved.selectable}\n selectedRows={resolved.selectedRows}\n onSelectAll={selection.handleSelectAll}\n density={resolved.density}\n stickyHeader={resolved.stickyHeader}\n />\n ) : null,\n rest: rest as Record<string, unknown> });\n\nconst TableLoadingState: React.FC<{\n shell: TableShellProps;\n loadingComponent?: React.ReactNode;\n columns?: ColumnConfig[];\n}> = ({ shell, loadingComponent, columns }) => (\n <TableShell {...shell}>\n <TableBody data-testid=\"table-loading\">\n {loadingComponent || <LoadingSkeletonRows columns={columns} />}\n </TableBody>\n </TableShell>\n);\n\nconst TableEmptyState: React.FC<{\n shell: TableShellProps;\n emptyStateComponent?: React.ReactNode;\n emptyText: string;\n colSpan: number;\n}> = ({ shell, emptyStateComponent, emptyText, colSpan }) => (\n <TableShell {...shell}>\n <EmptyRow colSpan={colSpan}>\n {emptyStateComponent || <NoDataPlaceholder emptyText={emptyText} />}\n </EmptyRow>\n </TableShell>\n);\n\nexport const Table = React.forwardRef<globalThis.HTMLTableElement, TableProps>(\n (tableProps, ref) => {\n const resolved = { ...TABLE_DEFAULTS, ...definedProps(tableProps) } as TableProps;\n const {\n columns,\n data,\n responsive,\n loading,\n loadingComponent,\n emptyStateComponent,\n emptyText,\n children,\n ...props\n } = resolved;\n\n const selection = useTableSelection({\n columns,\n data,\n responsive,\n columnPriorities: resolved.columnPriorities,\n selectedRows: resolved.selectedRows ?? [],\n rowKeyExtractor: resolved.rowKeyExtractor,\n onSelectionChange: resolved.onSelectionChange });\n\n const rest = props as unknown as Record<string, unknown>;\n const renderer: RendererProps = { resolved, selection, innerRef: ref, rest };\n const finalColumns = responsive ? selection.visibleColumns : columns;\n const shell = buildShell({ ...renderer, finalColumns });\n\n if (loading) {\n return (\n <TableLoadingState shell={shell} loadingComponent={loadingComponent} columns={columns} />\n );\n }\n\n if (data && data.length === 0) {\n return (\n <TableEmptyState\n shell={shell}\n emptyStateComponent={emptyStateComponent}\n emptyText={emptyText}\n colSpan={finalColumns?.length || 1}\n />\n );\n }\n\n if (columns && data) return <AdvancedTable {...renderer} />;\n\n // Basic table (backward compatibility)\n return (\n <StyledTable\n ref={ref}\n customVariant={resolved.variant}\n stripeColor={resolved.stripeColor}\n glow={resolved.glow}\n pulse={resolved.pulse}\n hoverable={resolved.hoverable}\n density={resolved.density}\n stickyHeader={resolved.stickyHeader}\n {...rest}\n >\n {children}\n </StyledTable>\n );\n },\n);\n\nTable.displayName = 'Table';","import type { TableProps } from './Table.types';\n\nexport const TABLE_DEFAULTS: Partial<TableProps> = {\n variant: 'default',\n stripeColor: 'neutral',\n glow: false,\n pulse: false,\n hoverable: false,\n loading: false,\n density: 'normal',\n stickyHeader: false,\n selectable: false,\n selectedRows: [],\n sortable: false,\n virtualScrolling: false,\n rowHeight: 52,\n overscan: 5,\n responsive: false,\n showColumnToggle: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default as a destructuring default would. Eighteen separate\n// destructuring defaults were most of this component's branch count.\nexport const definedProps = (props: TableProps): Partial<TableProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<TableProps>;\n\n// The container + styled table + optional header, shared by the loading, empty\n// and populated renders.\n","import { useMediaQuery, useTheme } from '@mui/material';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport type { ColumnConfig, TableProps } from './Table.types';\n\nexport const useVirtualScrolling = (\n data: Record<string, unknown>[],\n rowHeight: number,\n containerHeight: number,\n overscan: number = 5\n) => {\n const [scrollTop, setScrollTop] = useState(0);\n \n const visibleItems = useMemo(() => {\n const visibleHeight = containerHeight;\n const startIndex = Math.floor(scrollTop / rowHeight);\n const endIndex = Math.min(\n data.length,\n Math.ceil((scrollTop + visibleHeight) / rowHeight)\n );\n \n const start = Math.max(0, startIndex - overscan);\n const end = Math.min(data.length, endIndex + overscan);\n \n return {\n startIndex: start,\n endIndex: end,\n items: data.slice(start, end),\n totalHeight: data.length * rowHeight,\n offsetY: start * rowHeight,\n };\n }, [data, rowHeight, containerHeight, scrollTop, overscan]);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop);\n }, []);\n\n return { visibleItems, handleScroll };\n};\n\n// Responsive Hook\n\nconst useResponsive = (\n columns: ColumnConfig[],\n columnPriorities?: number[]\n) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\n const isTablet = useMediaQuery(theme.breakpoints.down('lg'));\n \n const [hiddenColumns, setHiddenColumns] = useState<number[]>([]);\n const [columnMenuAnchor, setColumnMenuAnchor] = useState<null | HTMLElement>(null);\n\n useEffect(() => {\n if (!columnPriorities) return;\n \n let columnsToHide: number[] = [];\n \n if (isMobile) {\n // Hide lowest priority columns on mobile\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 2))\n .map(item => item.index);\n } else if (isTablet) {\n // Hide some columns on tablet\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 3))\n .map(item => item.index);\n }\n \n setHiddenColumns(columnsToHide);\n }, [isMobile, isTablet, columnPriorities, columns.length]);\n\n const visibleColumns = columns.filter((_, index) => !hiddenColumns.includes(index));\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n };\n};\n\n// Enhanced Table Header Component\n// Visible/hidden column split for responsive mode, plus row selection.\nexport const useTableSelection = ({\n columns,\n data,\n responsive,\n columnPriorities,\n selectedRows,\n rowKeyExtractor,\n onSelectionChange,\n}: {\n columns?: ColumnConfig[];\n data: TableProps['data'];\n responsive?: boolean;\n columnPriorities?: number[];\n selectedRows: (string | number)[];\n rowKeyExtractor?: (row: Record<string, unknown>, index: number) => string | number;\n onSelectionChange?: TableProps['onSelectionChange'];\n}) => {\n \n // Use responsive hook if responsive mode is enabled\n const {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n } = useResponsive(\n columns || [],\n responsive ? columnPriorities : undefined\n );\n\n // Handle selection changes\n const handleSelectionChange = useCallback((rowKey: string | number, selected: boolean) => {\n if (!onSelectionChange) return;\n \n let newSelection: (string | number)[];\n if (selected) {\n newSelection = [...selectedRows, rowKey];\n } else {\n newSelection = selectedRows.filter(key => key !== rowKey);\n }\n onSelectionChange(newSelection);\n }, [selectedRows, onSelectionChange]);\n\n const handleSelectAll = useCallback((selected: boolean) => {\n if (!onSelectionChange || !data) return;\n \n if (selected) {\n const allKeys = data.map((rowData, index) => \n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index\n );\n onSelectionChange(allKeys);\n } else {\n onSelectionChange([]);\n }\n }, [data, onSelectionChange, rowKeyExtractor]);\n\n // Loading state\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n handleSelectionChange,\n handleSelectAll,\n };\n};\n","import {\n Box,\n Checkbox,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TableSortLabel } from '@mui/material';\nimport React, { useCallback } from 'react';\n\nimport { useVirtualScrolling } from './Table.hooks';\nimport { useTableRowRenderer } from './TableParts.hooks';\nimport type { ColumnConfig, TableBodyProps, TableHeaderProps } from './Table.types';\n\n// Mirrors the visible sort indicator for assistive technology; undefined when\n// the column is not sorted, which is what removes the attribute entirely.\nconst ariaSortFor = (\n canSort: boolean,\n isSorted: boolean,\n direction?: 'asc' | 'desc',\n): 'ascending' | 'descending' | undefined => {\n if (!canSort || !isSorted) return undefined;\n\n return direction === 'asc' ? 'ascending' : 'descending';\n};\n\n// One header cell. Sorting is offered when the table is sortable and the column\n// has not opted out; aria-sort mirrors the visible indicator.\nconst HeaderCell: React.FC<{\n column: ColumnConfig;\n sortable?: boolean;\n sortConfig?: { key: string; direction: 'asc' | 'desc' };\n onSort: (columnKey: string) => void;\n}> = ({ column, sortable, sortConfig, onSort }) => {\n const canSort = Boolean(sortable) && column.sortable !== false;\n const isSorted = sortConfig?.key === column.key;\n\n return (\n <TableCell\n align={column.align || 'left'}\n style={{ minWidth: column.minWidth, width: column.width }}\n aria-sort={ariaSortFor(canSort, isSorted, sortConfig?.direction)}\n >\n {canSort ? (\n <TableSortLabel\n active={isSorted}\n direction={isSorted ? sortConfig?.direction : 'asc'}\n onClick={() => onSort(column.key)}\n data-testid=\"sort-indicator\"\n aria-label={`Sort by ${column.label}`}\n >\n {column.label}\n </TableSortLabel>\n ) : (\n column.label\n )}\n </TableCell>\n );\n};\n\nexport const EnhancedTableHeader: React.FC<TableHeaderProps> = React.memo(({\n columns,\n data,\n sortable,\n sortConfig,\n onSortChange,\n selectable,\n selectedRows = [],\n onSelectAll }) => {\n const handleSort = useCallback(\n (columnKey: string) => {\n if (!sortable || !onSortChange) return;\n \n const direction = \n sortConfig?.key === columnKey && sortConfig.direction === 'asc' ? 'desc' : 'asc';\n onSortChange(columnKey, direction);\n },\n [sortable, onSortChange, sortConfig]\n );\n\n const handleSelectAll = useCallback(\n (event: React.ChangeEvent<globalThis.HTMLInputElement>) => {\n if (!onSelectAll) return;\n onSelectAll(event.target.checked);\n },\n [onSelectAll]\n );\n\n return (\n <TableHead>\n <TableRow>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n indeterminate={selectedRows.length > 0 && selectedRows.length < data.length}\n checked={selectedRows.length === data.length && data.length > 0}\n onChange={handleSelectAll}\n inputProps={{ 'aria-label': 'select all' }}\n />\n </TableCell>\n )}\n {columns.map((column) => (\n <HeaderCell\n key={column.key}\n column={column}\n sortable={sortable}\n sortConfig={sortConfig}\n onSort={handleSort}\n />\n ))}\n </TableRow>\n </TableHead>\n );\n});\n\nEnhancedTableHeader.displayName = 'EnhancedTableHeader';\n\n// One data row. Split out of the memoised renderTableRow callback so the\n// callback stays a short dispatch and the row markup is readable on its own.\nexport const TableDataRow: React.FC<{\n rowData: Record<string, unknown>;\n rowKey: string | number;\n index: number;\n offsetY: number;\n columns: ColumnConfig[];\n selected: boolean;\n selectable?: boolean;\n rowHeight?: number;\n onRowClick?: TableBodyProps['onRowClick'];\n onRowFocus?: TableBodyProps['onRowFocus'];\n onRowBlur?: TableBodyProps['onRowBlur'];\n onSelect: (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => void;\n virtualScrolling?: boolean;\n renderCell?: TableBodyProps['renderCell'];\n}> = ({\n rowData,\n rowKey,\n index,\n offsetY,\n columns,\n selected,\n selectable,\n rowHeight,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelect,\n virtualScrolling,\n renderCell }) => (\n\n <TableRow\n key={String(rowKey)}\n selected={selected}\n className={selected ? 'selected' : ''}\n onClick={(event: React.MouseEvent<globalThis.HTMLTableRowElement>) => onRowClick?.(event, rowData)}\n onFocus={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowFocus?.(event, rowData)}\n onBlur={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowBlur?.(event, rowData)}\n style={virtualScrolling ? { \n transform: `translateY(${offsetY}px)`,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: rowHeight } : undefined}\n >\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n checked={selected}\n onChange={(event) => onSelect(event, rowKey)}\n onClick={(event) => event.stopPropagation()}\n inputProps={{ 'aria-label': `select row ${index + 1}` }}\n />\n </TableCell>\n )}\n {columns.map((column) => {\n const value = rowData[column.key];\n return (\n <TableCell key={column.key} align={column.align || 'left'}>\n {renderCell \n ? renderCell(value, column, rowData, index)\n : column.render \n ? column.render(value, rowData) \n : (value as React.ReactNode)\n }\n </TableCell>\n );\n })}\n </TableRow>\n);\n\n// Only the rows in view are rendered, positioned by absolute offset inside a\n// spacer sized to the full data set.\nconst VirtualisedBody: React.FC<{\n visibleItems: {\n items: Record<string, unknown>[];\n startIndex: number;\n offsetY: number;\n totalHeight: number;\n };\n rowHeight: number;\n containerHeight: number;\n onScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n renderTableRow: (\n rowData: Record<string, unknown>,\n index: number,\n offsetY?: number,\n ) => React.ReactNode;\n}> = ({ visibleItems, rowHeight, containerHeight, onScroll, renderTableRow }) => (\n\n <Box\n onScroll={onScroll}\n style={{\n height: containerHeight,\n overflow: 'auto',\n position: 'relative' }}\n >\n <TableBody\n style={{\n height: visibleItems.totalHeight,\n position: 'relative' }}\n >\n {visibleItems.items.map((rowData, index) => \n renderTableRow(rowData, visibleItems.startIndex + index, visibleItems.offsetY + index * rowHeight)\n )}\n </TableBody>\n </Box>\n \n);\n\nconst PlainBody: React.FC<{\n data: TableBodyProps['data'];\n renderTableRow: (rowData: Record<string, unknown>, index: number) => React.ReactNode;\n}> = ({ data, renderTableRow }) => (\n\n <TableBody>\n {data.map((rowData, index) => renderTableRow(rowData, index))}\n </TableBody>\n);\n\n// Enhanced Table Body Component \nexport const EnhancedTableBody: React.FC<TableBodyProps> = React.memo(({\n data,\n columns,\n selectedRows = [],\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n containerHeight,\n rowHeight,\n overscan = 5 }) => {\n const renderTableRow = useTableRowRenderer({\n columns,\n selectedRows,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n rowHeight });\n\n const { visibleItems, handleScroll } = useVirtualScrolling(\n data, \n rowHeight || 40, \n typeof containerHeight === 'number' ? containerHeight : 400, \n overscan\n );\n\n if (virtualScrolling && containerHeight && rowHeight) {\n return (\n <VirtualisedBody\n visibleItems={visibleItems}\n rowHeight={rowHeight}\n containerHeight={containerHeight}\n onScroll={handleScroll}\n renderTableRow={renderTableRow}\n />\n );\n }\n\n return (\n <PlainBody data={data} renderTableRow={renderTableRow} />\n );\n});\n\nEnhancedTableBody.displayName = 'EnhancedTableBody';\n\n// Main Table Component\n","import type React from 'react';\nimport { useCallback } from 'react';\n\nimport { TableDataRow } from './TableParts';\nimport type { TableBodyProps } from './Table.types';\n\n// Row identity, selection and the row element itself. Split out of\n// EnhancedTableBody so that component is just the virtualised/plain choice.\n// A row's identity: the caller's extractor, else its id, else its position.\nconst useRowKey = (rowKeyExtractor: TableBodyProps['rowKeyExtractor']) =>\n useCallback(\n (rowData: Record<string, unknown>, index: number): string | number =>\n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index,\n [rowKeyExtractor],\n );\n\nconst useRowSelection = ({\n selectedRows,\n onSelectionChange,\n}: {\n selectedRows: Array<string | number>;\n onSelectionChange: TableBodyProps['onSelectionChange'];\n}) =>\n useCallback(\n (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => {\n // Stop propagation so selecting does not also fire the row click.\n event.stopPropagation();\n if (!onSelectionChange) return;\n onSelectionChange(rowKey, !selectedRows.includes(rowKey));\n },\n [onSelectionChange, selectedRows],\n );\n\nexport const useTableRowRenderer = ({\n columns,\n selectedRows,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n rowHeight,\n}: Pick<\n TableBodyProps,\n | 'columns'\n | 'onRowClick'\n | 'onRowFocus'\n | 'onRowBlur'\n | 'onSelectionChange'\n | 'rowKeyExtractor'\n | 'selectable'\n | 'renderRow'\n | 'renderCell'\n | 'virtualScrolling'\n | 'rowHeight'\n> & { selectedRows: Array<string | number> }) => {\n const getRowKey = useRowKey(rowKeyExtractor);\n const isRowSelected = useCallback(\n (rowKey: string | number) => selectedRows.includes(rowKey),\n [selectedRows],\n );\n const handleRowSelection = useRowSelection({ selectedRows, onSelectionChange });\n\n const renderTableRow = useCallback(\n (rowData: Record<string, unknown>, index: number, offsetY: number = 0) => {\n const rowKey = getRowKey(rowData, index);\n const selected = isRowSelected(rowKey);\n\n if (renderRow) return renderRow(rowData, index, selected);\n\n return (\n <TableDataRow\n key={rowKey}\n rowData={rowData}\n rowKey={rowKey}\n index={index}\n offsetY={offsetY}\n columns={columns}\n selected={selected}\n selectable={selectable}\n rowHeight={rowHeight}\n onRowClick={onRowClick}\n onRowFocus={onRowFocus}\n onRowBlur={onRowBlur}\n onSelect={handleRowSelection}\n virtualScrolling={virtualScrolling}\n renderCell={renderCell}\n />\n );\n },\n [\n columns,\n getRowKey,\n isRowSelected,\n handleRowSelection,\n onRowClick,\n onRowFocus,\n onRowBlur,\n renderRow,\n renderCell,\n rowHeight,\n selectable,\n virtualScrolling,\n ],\n );\n\n return renderTableRow;\n};\n","import { Box, TableBody, TableCell, TableRow } from '@mui/material';\nimport React from 'react';\n\n\nexport const NoDataPlaceholder: React.FC<{ emptyText: string }> = ({ emptyText }) => (\n <Box py={4} color=\"text.secondary\">\n {emptyText}\n </Box>\n);\n\nexport const EmptyRow: React.FC<{ colSpan: number; children: React.ReactNode }> = ({\n colSpan,\n children }) => (\n <TableBody>\n <TableRow>\n <TableCell colSpan={colSpan} align=\"center\">\n {children}\n </TableCell>\n </TableRow>\n </TableBody>\n);\n","import { alpha, keyframes } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport type { TableDensity, TableStripeColor } from './Table.types';\n\nconst pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\n// Density configurations\nconst getDensityConfig = (density: TableDensity = 'normal') => {\n const configs = {\n compact: {\n rowHeight: 36,\n cellPadding: '6px 12px',\n fontSize: '0.8125rem',\n headerPadding: '8px 12px' },\n normal: {\n rowHeight: 52,\n cellPadding: '12px 16px',\n fontSize: '0.875rem',\n headerPadding: '16px 16px' },\n comfortable: {\n rowHeight: 68,\n cellPadding: '18px 24px',\n fontSize: '0.875rem',\n headerPadding: '20px 24px' } };\n return configs[density];\n};\n\nconst getStripeColorFromTheme = (theme: { palette: { primary: { main: string }; secondary: { main: string }; info: { main: string }; success: { main: string }; warning: { main: string }; error: { main: string }; action: { hover: string } } }, stripeColor: TableStripeColor = 'neutral') => {\n const colorMap: Record<TableStripeColor, string> = {\n primary: theme.palette.primary.main,\n secondary: theme.palette.secondary.main,\n info: theme.palette.info.main,\n success: theme.palette.success.main,\n warning: theme.palette.warning.main,\n danger: theme.palette.error.main,\n neutral: theme.palette.action.hover };\n return colorMap[stripeColor];\n};\n\n/**\n * The zebra stripe for one body row.\n *\n * `neutral` — the default — resolves to `palette.action.hover`, which ALREADY\n * carries its subtlety in its own alpha (`rgba(0,0,0,0.04)` in the light\n * theme). MUI's `alpha()` REPLACES that channel rather than multiplying it, so\n * re-alpha-ing it at 0.5 amplified the tint 12.5× into `rgba(0,0,0,0.5)` —\n * solid #808080 on a white card, which reads as a selected or errored row\n * rather than as a stripe (FUT-755). It is used as-is instead.\n *\n * The named colours are opaque `*.main` values with no alpha of their own, so\n * they still need one.\n */\nconst stripeRowColor = (\n theme: Parameters<typeof getStripeColorFromTheme>[0],\n stripeColor: TableStripeColor = 'neutral',\n): string => {\n const color = getStripeColorFromTheme(theme, stripeColor);\n return stripeColor === 'neutral' ? color : alpha(color, 0.15);\n};\n\n// One variant applies at a time, so a lookup replaces the mutually exclusive\n// spreads.\nconst TABLE_VARIANTS: Record<string, (args: VariantArgs) => CSSObject> = {\n default: ({ theme }) => ({\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableHead-root': {\n backgroundColor: alpha(theme.palette.primary.main, 0.1) } }),\n striped: ({ theme, stripeColor }) => ({\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableBody-root .MuiTableRow-root:nth-of-type(even)': {\n backgroundColor: stripeRowColor(theme, stripeColor) } }),\n glass: ({ theme }) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}` }),\n minimal: ({ theme }) => ({\n backgroundColor: 'transparent',\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.1)}` } }),\n gradient: ({ theme }) => ({\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.05)}, ${alpha(theme.palette.secondary.main, 0.05)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n '& .MuiTableHead-root': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.15)}, ${alpha(theme.palette.secondary.main, 0.15)})` },\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.15)}` } }) };\n\ntype VariantArgs = {\n theme: Theme;\n densityConfig: ReturnType<typeof getDensityConfig>;\n stripeColor?: TableStripeColor;\n};\n\nconst tableVariantStyles = (args: VariantArgs, customVariant?: string): CSSObject =>\n customVariant ? (TABLE_VARIANTS[customVariant]?.(args) ?? {}) : {};\n\n// Sticky headers and row hover are independent of the variant.\nconst stickyHeaderStyles = (\n theme: Theme,\n densityConfig: ReturnType<typeof getDensityConfig>,\n): CSSObject => ({\n '& .MuiTableHead-root': {\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableCell-root': {\n borderBottom: `2px solid ${theme.palette.divider}`,\n fontWeight: 600,\n padding: densityConfig.headerPadding } } });\n\nconst hoverableRowStyles = (theme: Theme): CSSObject => ({\n '& .MuiTableBody-root .MuiTableRow-root:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n cursor: 'pointer',\n transition: 'background-color 0.15s ease-in-out' } });\n\n// glow and pulse combine into three distinct looks, spelled out rather than\n// layered — the glow-only shadow differs from the one used when both are on.\nconst emphasisStyles = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObject => {\n if (glow && pulse) return ({\n position: 'relative',\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1 } });\n if (glow) return ({\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)' });\n if (pulse) return ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1 } });\n\n return {};\n};\n\n// The table's own styling, lifted out so the styled() callback just forwards\n// its props.\nexport const tableStyles = ({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor = 'neutral' }: {\n theme: Theme;\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n stripeColor?: TableStripeColor;\n}): CSSObject => {\n const densityConfig = getDensityConfig(density);\n \n return {\n borderRadius: theme.spacing(1),\n overflow: 'hidden',\n transition: 'all 0.3s ease',\n position: 'relative',\n\n // Density styles\n '& .MuiTableCell-root': {\n padding: densityConfig.cellPadding,\n fontSize: densityConfig.fontSize,\n height: densityConfig.rowHeight },\n\n // Sticky header\n ...tableVariantStyles({ theme, densityConfig, stripeColor }, customVariant),\n ...(stickyHeader ? stickyHeaderStyles(theme, densityConfig) : {}),\n ...(hoverable ? hoverableRowStyles(theme) : {}),\n ...emphasisStyles(theme, glow, pulse),\n\n\n // Variant styles\n\n\n\n\n\n\n\n\n\n\n // Hoverable rows\n\n\n // Selection styles\n '& .MuiTableRow-root.selected': {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.16) } },\n\n // Glow effect\n\n\n // Pulse animation\n\n\n // Both glow and pulse\n\n };\n}\n"],"mappings":"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","names":["Box","TableBody","TableCell","TableRow","React","useCallback","useCallback","useCallback","jsx","useCallback","Box","TableBody","TableCell","TableRow","jsx","jsx","jsxs","TableRow","TableCell","Box","TableBody","React"]}
@@ -340,6 +340,7 @@ var VIEWS = {
340
340
  horizontal: HorizontalView
341
341
  };
342
342
  var TimingDiagram = ({
343
+ copy,
343
344
  data,
344
345
  showLabels = true,
345
346
  height = 40,
@@ -350,8 +351,8 @@ var TimingDiagram = ({
350
351
  const percentages = useMemo(() => calculatePercentages(data), [data]);
351
352
  const phases = phasesOf(data);
352
353
  const View = VIEWS[variant];
353
- return /* @__PURE__ */ jsxs2(DiagramContainer, { elevation: 2, role: "region", "aria-label": "Timing diagram", tabIndex: 0, children: [
354
- /* @__PURE__ */ jsx2(Typography2, { variant: "h6", fontWeight: "bold", gutterBottom: true, children: "Request Timing" }),
354
+ return /* @__PURE__ */ jsxs2(DiagramContainer, { elevation: 2, role: "region", "aria-label": copy.regionLabel, tabIndex: 0, children: [
355
+ /* @__PURE__ */ jsx2(Typography2, { variant: "h6", fontWeight: "bold", gutterBottom: true, children: copy.heading }),
355
356
  View && /* @__PURE__ */ jsx2(
356
357
  View,
357
358
  {