@12-apps/ui 6.7.0 → 6.9.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 (405) hide show
  1. package/dist/chunk-3X3JVF6E.js +438 -0
  2. package/dist/chunk-3X3JVF6E.js.map +1 -0
  3. package/dist/chunk-AL3W7TXN.js +465 -0
  4. package/dist/chunk-AL3W7TXN.js.map +1 -0
  5. package/dist/{chunk-QLBYAYUG.js → chunk-KR2BP7NK.js} +4 -4
  6. package/dist/chunk-KR2BP7NK.js.map +1 -0
  7. package/dist/{chunk-DFVRZ3UK.js → chunk-KXARS46L.js} +3 -3
  8. package/dist/chunk-KXARS46L.js.map +1 -0
  9. package/dist/{chunk-JP55QWVR.js → chunk-L7L6SX64.js} +5 -2
  10. package/dist/chunk-L7L6SX64.js.map +1 -0
  11. package/dist/{chunk-QZZVHY6U.js → chunk-PVLDKXKR.js} +7 -3
  12. package/dist/chunk-PVLDKXKR.js.map +1 -0
  13. package/dist/{chunk-H7UAGTVW.js → chunk-TSG5C7MP.js} +4 -3
  14. package/dist/chunk-TSG5C7MP.js.map +1 -0
  15. package/dist/{chunk-NUCLEOHF.js → chunk-UNM7KFDX.js} +44 -14
  16. package/dist/chunk-UNM7KFDX.js.map +1 -0
  17. package/dist/{chunk-CEKPLUQV.js → chunk-UY7UF7IN.js} +19 -13
  18. package/dist/chunk-UY7UF7IN.js.map +1 -0
  19. package/dist/data-display/DataGrid.js +1 -1
  20. package/dist/data-display/DataViews.js +88 -65
  21. package/dist/data-display/DataViews.js.map +1 -1
  22. package/dist/data-display/HoverCard.js +4 -1
  23. package/dist/data-display/HoverCard.js.map +1 -1
  24. package/dist/data-display/Table.js +4 -2
  25. package/dist/data-display/Table.js.map +1 -1
  26. package/dist/data-display/TimingDiagram.js +3 -2
  27. package/dist/data-display/TimingDiagram.js.map +1 -1
  28. package/dist/en-US.js +56 -0
  29. package/dist/en-US.js.map +1 -0
  30. package/dist/feedback/Sonner.js +5 -4
  31. package/dist/feedback/Sonner.js.map +1 -1
  32. package/dist/feedback/StackedModal.js +1 -1
  33. package/dist/feedback/TutorialOverlay.js +19 -5
  34. package/dist/feedback/TutorialOverlay.js.map +1 -1
  35. package/dist/form/AddressAutocomplete.js +16 -8
  36. package/dist/form/AddressAutocomplete.js.map +1 -1
  37. package/dist/form/Autocomplete.js +9 -7
  38. package/dist/form/Autocomplete.js.map +1 -1
  39. package/dist/form/Calendar.js +1 -1
  40. package/dist/form/CodeEditor.js +14 -9
  41. package/dist/form/CodeEditor.js.map +1 -1
  42. package/dist/form/DateRangePicker.js +10 -3
  43. package/dist/form/DateRangePicker.js.map +1 -1
  44. package/dist/form/Menubar.js +4 -1
  45. package/dist/form/Menubar.js.map +1 -1
  46. package/dist/form/PasswordStrength.js +48 -28
  47. package/dist/form/PasswordStrength.js.map +1 -1
  48. package/dist/form/PhoneInput.js +11 -5
  49. package/dist/form/PhoneInput.js.map +1 -1
  50. package/dist/form/SearchPalette.js +4 -1
  51. package/dist/form/SearchPalette.js.map +1 -1
  52. package/dist/form/Textarea.js +21 -19
  53. package/dist/form/Textarea.js.map +1 -1
  54. package/dist/form/UploadButton.js +16 -11
  55. package/dist/form/UploadButton.js.map +1 -1
  56. package/dist/layout/ContentToolbar.js +1 -1
  57. package/dist/layout/Dashboard.js +2 -1
  58. package/dist/layout/Dashboard.js.map +1 -1
  59. package/dist/layout/ScrollArea.js +9 -3
  60. package/dist/layout/ScrollArea.js.map +1 -1
  61. package/dist/layout/TableFilter.js +1 -1
  62. package/dist/locales.js +171 -0
  63. package/dist/locales.js.map +1 -0
  64. package/dist/navigation/Breadcrumbs.js +9 -3
  65. package/dist/navigation/Breadcrumbs.js.map +1 -1
  66. package/dist/navigation/CommandPalette.js +20 -7
  67. package/dist/navigation/CommandPalette.js.map +1 -1
  68. package/dist/navigation/Pagination.js +1 -1
  69. package/dist/navigation/Tabs.js +7 -3
  70. package/dist/navigation/Tabs.js.map +1 -1
  71. package/dist/pt-BR.js +42 -274
  72. package/dist/pt-BR.js.map +1 -1
  73. package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts +1 -0
  74. package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts.map +1 -1
  75. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +5 -0
  76. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  77. package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts.map +1 -1
  78. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +27 -1
  79. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  80. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts +12 -1
  81. package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
  82. package/dist/types/components/data-display/DataViews/data-views-filter-panel.d.ts.map +1 -1
  83. package/dist/types/components/data-display/DataViews/data-views-grid-bodies.d.ts.map +1 -1
  84. package/dist/types/components/data-display/DataViews/data-views-grid-parts.d.ts.map +1 -1
  85. package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
  86. package/dist/types/components/data-display/DataViews/data-views-pagination.d.ts.map +1 -1
  87. package/dist/types/components/data-display/DataViews/data-views-range-pill.d.ts.map +1 -1
  88. package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
  89. package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts +1 -1
  90. package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts.map +1 -1
  91. package/dist/types/components/data-display/HoverCard/HoverCard.d.ts.map +1 -1
  92. package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts +2 -0
  93. package/dist/types/components/data-display/HoverCard/HoverCard.types.d.ts.map +1 -1
  94. package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
  95. package/dist/types/components/data-display/Table/Table.types.d.ts +5 -0
  96. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  97. package/dist/types/components/data-display/Table/TableStates.d.ts +3 -1
  98. package/dist/types/components/data-display/Table/TableStates.d.ts.map +1 -1
  99. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.d.ts.map +1 -1
  100. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts +3 -0
  101. package/dist/types/components/data-display/TimingDiagram/TimingDiagram.types.d.ts.map +1 -1
  102. package/dist/types/components/feedback/Sonner/Sonner.d.ts +8 -0
  103. package/dist/types/components/feedback/Sonner/Sonner.d.ts.map +1 -1
  104. package/dist/types/components/feedback/Sonner/Sonner.types.d.ts +2 -0
  105. package/dist/types/components/feedback/Sonner/Sonner.types.d.ts.map +1 -1
  106. package/dist/types/components/feedback/Sonner/SonnerToast.d.ts.map +1 -1
  107. package/dist/types/components/feedback/StackedModal/StackedModal.d.ts.map +1 -1
  108. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts +2 -0
  109. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  110. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts +2 -0
  111. package/dist/types/components/feedback/StackedModal/StackedModal.types.d.ts.map +1 -1
  112. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.d.ts.map +1 -1
  113. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts +3 -0
  114. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.types.d.ts.map +1 -1
  115. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts +2 -0
  116. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts.map +1 -1
  117. package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts +7 -0
  118. package/dist/types/components/form/AddressAutocomplete/AddressAutocomplete.types.d.ts.map +1 -1
  119. package/dist/types/components/form/AddressAutocomplete/AddressAutocompleteField.d.ts.map +1 -1
  120. package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts +1 -0
  121. package/dist/types/components/form/AddressAutocomplete/AddressFallbackField.d.ts.map +1 -1
  122. package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts +1 -0
  123. package/dist/types/components/form/AddressAutocomplete/AddressInputField.d.ts.map +1 -1
  124. package/dist/types/components/form/Autocomplete/Autocomplete.d.ts.map +1 -1
  125. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts +9 -3
  126. package/dist/types/components/form/Autocomplete/Autocomplete.parts.d.ts.map +1 -1
  127. package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts +7 -0
  128. package/dist/types/components/form/Autocomplete/Autocomplete.types.d.ts.map +1 -1
  129. package/dist/types/components/form/Calendar/Calendar.types.d.ts +6 -0
  130. package/dist/types/components/form/Calendar/Calendar.types.d.ts.map +1 -1
  131. package/dist/types/components/form/CodeEditor/CodeEditor.d.ts.map +1 -1
  132. package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts +7 -0
  133. package/dist/types/components/form/CodeEditor/CodeEditor.types.d.ts.map +1 -1
  134. package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts +2 -0
  135. package/dist/types/components/form/CodeEditor/CodeEditorToolbar.d.ts.map +1 -1
  136. package/dist/types/components/form/DateRangePicker/DateRangePicker.d.ts.map +1 -1
  137. package/dist/types/components/form/DateRangePicker/DateRangePicker.range.d.ts.map +1 -1
  138. package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts +11 -0
  139. package/dist/types/components/form/DateRangePicker/DateRangePicker.types.d.ts.map +1 -1
  140. package/dist/types/components/form/DateRangePicker/DateRangePickerFields.d.ts.map +1 -1
  141. package/dist/types/components/form/Menubar/Menubar.d.ts.map +1 -1
  142. package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts +1 -0
  143. package/dist/types/components/form/Menubar/Menubar.toolbar.d.ts.map +1 -1
  144. package/dist/types/components/form/Menubar/Menubar.types.d.ts +5 -0
  145. package/dist/types/components/form/Menubar/Menubar.types.d.ts.map +1 -1
  146. package/dist/types/components/form/PasswordStrength/PasswordStrength.d.ts.map +1 -1
  147. package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts +4 -2
  148. package/dist/types/components/form/PasswordStrength/PasswordStrength.helpers.d.ts.map +1 -1
  149. package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts +8 -0
  150. package/dist/types/components/form/PasswordStrength/PasswordStrength.types.d.ts.map +1 -1
  151. package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
  152. package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts +7 -0
  153. package/dist/types/components/form/PhoneInput/PhoneInput.types.d.ts.map +1 -1
  154. package/dist/types/components/form/SearchPalette/SearchPalette.d.ts.map +1 -1
  155. package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts +2 -0
  156. package/dist/types/components/form/SearchPalette/SearchPalette.parts.d.ts.map +1 -1
  157. package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts +6 -0
  158. package/dist/types/components/form/SearchPalette/SearchPalette.types.d.ts.map +1 -1
  159. package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
  160. package/dist/types/components/form/Textarea/Textarea.types.d.ts +16 -1
  161. package/dist/types/components/form/Textarea/Textarea.types.d.ts.map +1 -1
  162. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts +7 -0
  163. package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
  164. package/dist/types/components/form/UploadButton/UploadButton.d.ts.map +1 -1
  165. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts +6 -3
  166. package/dist/types/components/form/UploadButton/UploadButton.parts.d.ts.map +1 -1
  167. package/dist/types/components/form/UploadButton/UploadButton.types.d.ts +7 -0
  168. package/dist/types/components/form/UploadButton/UploadButton.types.d.ts.map +1 -1
  169. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts +1 -1
  170. package/dist/types/components/layout/ContentToolbar/ContentToolbar.d.ts.map +1 -1
  171. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts +12 -0
  172. package/dist/types/components/layout/ContentToolbar/ContentToolbar.types.d.ts.map +1 -1
  173. package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts +1 -1
  174. package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts.map +1 -1
  175. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts +1 -1
  176. package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts.map +1 -1
  177. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts +1 -1
  178. package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts.map +1 -1
  179. package/dist/types/components/layout/Dashboard/Dashboard.d.ts +1 -1
  180. package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts +4 -0
  181. package/dist/types/components/layout/Dashboard/Dashboard.types.d.ts.map +1 -1
  182. package/dist/types/components/layout/Dashboard/DashboardParts.d.ts +1 -1
  183. package/dist/types/components/layout/Dashboard/DashboardParts.d.ts.map +1 -1
  184. package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
  185. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +21 -3
  186. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
  187. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts +2 -0
  188. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts.map +1 -1
  189. package/dist/types/components/layout/TableFilter/TableFilter.d.ts +1 -1
  190. package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
  191. package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts +7 -0
  192. package/dist/types/components/layout/TableFilter/TableFilter.types.d.ts.map +1 -1
  193. package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts +9 -0
  194. package/dist/types/components/layout/TableFilter/TableFilterContext.d.ts.map +1 -1
  195. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts +2 -0
  196. package/dist/types/components/navigation/Breadcrumbs/BreadcrumbEntry.d.ts.map +1 -1
  197. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
  198. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts +3 -0
  199. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.types.d.ts.map +1 -1
  200. package/dist/types/components/navigation/CommandPalette/CommandPalette.d.ts.map +1 -1
  201. package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts +3 -0
  202. package/dist/types/components/navigation/CommandPalette/CommandPalette.types.d.ts.map +1 -1
  203. package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts +2 -0
  204. package/dist/types/components/navigation/CommandPalette/CommandPaletteResults.d.ts.map +1 -1
  205. package/dist/types/components/navigation/Pagination/Pagination.d.ts.map +1 -1
  206. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts +2 -0
  207. package/dist/types/components/navigation/Pagination/Pagination.types.d.ts.map +1 -1
  208. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts +2 -0
  209. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
  210. package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
  211. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts +2 -0
  212. package/dist/types/components/navigation/Tabs/Tabs.types.d.ts.map +1 -1
  213. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
  214. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +6 -2
  215. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
  216. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +6 -0
  217. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
  218. package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts +4 -2
  219. package/dist/types/components/utility/InstallPrompt/InstallPrompt.d.ts.map +1 -1
  220. package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts +8 -7
  221. package/dist/types/components/utility/InstallPrompt/InstallPrompt.types.d.ts.map +1 -1
  222. package/dist/types/copy/data-display.d.ts +56 -0
  223. package/dist/types/copy/data-display.d.ts.map +1 -0
  224. package/dist/types/copy/feedback.d.ts +38 -0
  225. package/dist/types/copy/feedback.d.ts.map +1 -0
  226. package/dist/types/copy/form.d.ts +146 -0
  227. package/dist/types/copy/form.d.ts.map +1 -0
  228. package/dist/types/copy/layout.d.ts +18 -0
  229. package/dist/types/copy/layout.d.ts.map +1 -0
  230. package/dist/types/copy/navigation.d.ts +24 -0
  231. package/dist/types/copy/navigation.d.ts.map +1 -0
  232. package/dist/types/copy/shared.d.ts +119 -0
  233. package/dist/types/copy/shared.d.ts.map +1 -0
  234. package/dist/types/copy/utility.d.ts +35 -0
  235. package/dist/types/copy/utility.d.ts.map +1 -0
  236. package/dist/types/copy.d.ts +12 -165
  237. package/dist/types/copy.d.ts.map +1 -1
  238. package/dist/types/en-US.d.ts +24 -0
  239. package/dist/types/en-US.d.ts.map +1 -0
  240. package/dist/types/en-US.data-display.d.ts +13 -0
  241. package/dist/types/en-US.data-display.d.ts.map +1 -0
  242. package/dist/types/en-US.feedback.d.ts +8 -0
  243. package/dist/types/en-US.feedback.d.ts.map +1 -0
  244. package/dist/types/en-US.form.d.ts +13 -0
  245. package/dist/types/en-US.form.d.ts.map +1 -0
  246. package/dist/types/en-US.layout.d.ts +7 -0
  247. package/dist/types/en-US.layout.d.ts.map +1 -0
  248. package/dist/types/en-US.navigation.d.ts +8 -0
  249. package/dist/types/en-US.navigation.d.ts.map +1 -0
  250. package/dist/types/en-US.shared.d.ts +26 -0
  251. package/dist/types/en-US.shared.d.ts.map +1 -0
  252. package/dist/types/en-US.utility.d.ts +8 -0
  253. package/dist/types/en-US.utility.d.ts.map +1 -0
  254. package/dist/types/locales.d.ts +53 -0
  255. package/dist/types/locales.d.ts.map +1 -0
  256. package/dist/types/pt-BR.d.ts +15 -22
  257. package/dist/types/pt-BR.d.ts.map +1 -1
  258. package/dist/types/pt-BR.data-display.d.ts +13 -0
  259. package/dist/types/pt-BR.data-display.d.ts.map +1 -0
  260. package/dist/types/pt-BR.feedback.d.ts +8 -0
  261. package/dist/types/pt-BR.feedback.d.ts.map +1 -0
  262. package/dist/types/pt-BR.form.d.ts +13 -0
  263. package/dist/types/pt-BR.form.d.ts.map +1 -0
  264. package/dist/types/pt-BR.layout.d.ts +7 -0
  265. package/dist/types/pt-BR.layout.d.ts.map +1 -0
  266. package/dist/types/pt-BR.navigation.d.ts +8 -0
  267. package/dist/types/pt-BR.navigation.d.ts.map +1 -0
  268. package/dist/types/pt-BR.shared.d.ts +21 -0
  269. package/dist/types/pt-BR.shared.d.ts.map +1 -0
  270. package/dist/types/pt-BR.utility.d.ts +8 -0
  271. package/dist/types/pt-BR.utility.d.ts.map +1 -0
  272. package/dist/types/user-avatar/user-avatar.d.ts +7 -1
  273. package/dist/types/user-avatar/user-avatar.d.ts.map +1 -1
  274. package/dist/user-avatar.js +2 -2
  275. package/dist/user-avatar.js.map +1 -1
  276. package/dist/utility/InfiniteScroll.js +7 -5
  277. package/dist/utility/InfiniteScroll.js.map +1 -1
  278. package/dist/utility/InstallPrompt.js +14 -13
  279. package/dist/utility/InstallPrompt.js.map +1 -1
  280. package/package.json +10 -1
  281. package/src/components/data-display/DataGrid/DataGrid.states.tsx +3 -3
  282. package/src/components/data-display/DataGrid/DataGrid.tsx +1 -1
  283. package/src/components/data-display/DataGrid/DataGrid.types.ts +5 -0
  284. package/src/components/data-display/DataViews/data-views-category-pill.tsx +2 -0
  285. package/src/components/data-display/DataViews/data-views-copy.ts +27 -1
  286. package/src/components/data-display/DataViews/data-views-day-input.tsx +14 -3
  287. package/src/components/data-display/DataViews/data-views-filter-panel.tsx +2 -1
  288. package/src/components/data-display/DataViews/data-views-grid-bodies.tsx +3 -0
  289. package/src/components/data-display/DataViews/data-views-grid-parts.tsx +9 -10
  290. package/src/components/data-display/DataViews/data-views-more-fields.tsx +3 -1
  291. package/src/components/data-display/DataViews/data-views-pagination.tsx +3 -0
  292. package/src/components/data-display/DataViews/data-views-range-pill.tsx +3 -1
  293. package/src/components/data-display/DataViews/data-views-toolbar.tsx +2 -0
  294. package/src/components/data-display/HoverCard/HoverCard.content.tsx +10 -2
  295. package/src/components/data-display/HoverCard/HoverCard.tsx +2 -3
  296. package/src/components/data-display/HoverCard/HoverCard.types.ts +2 -0
  297. package/src/components/data-display/Table/Table.tsx +7 -2
  298. package/src/components/data-display/Table/Table.types.ts +5 -0
  299. package/src/components/data-display/Table/TableStates.tsx +2 -2
  300. package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +3 -2
  301. package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +3 -0
  302. package/src/components/feedback/Sonner/Sonner.tsx +15 -3
  303. package/src/components/feedback/Sonner/Sonner.types.ts +2 -0
  304. package/src/components/feedback/Sonner/SonnerToast.tsx +2 -1
  305. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +10 -3
  306. package/src/components/feedback/StackedModal/StackedModal.tsx +2 -1
  307. package/src/components/feedback/StackedModal/StackedModal.types.ts +2 -0
  308. package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +13 -1
  309. package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +3 -0
  310. package/src/components/feedback/TutorialOverlay/TutorialStepBody.tsx +10 -4
  311. package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +7 -0
  312. package/src/components/form/AddressAutocomplete/AddressAutocompleteField.tsx +2 -0
  313. package/src/components/form/AddressAutocomplete/AddressFallbackField.tsx +4 -2
  314. package/src/components/form/AddressAutocomplete/AddressInputField.tsx +13 -6
  315. package/src/components/form/Autocomplete/Autocomplete.parts.tsx +9 -6
  316. package/src/components/form/Autocomplete/Autocomplete.tsx +2 -1
  317. package/src/components/form/Autocomplete/Autocomplete.types.ts +7 -0
  318. package/src/components/form/Calendar/Calendar.tsx +2 -2
  319. package/src/components/form/Calendar/Calendar.types.ts +7 -0
  320. package/src/components/form/CodeEditor/CodeEditor.tsx +6 -4
  321. package/src/components/form/CodeEditor/CodeEditor.types.ts +7 -0
  322. package/src/components/form/CodeEditor/CodeEditorToolbar.tsx +12 -5
  323. package/src/components/form/DateRangePicker/DateRangePicker.range.ts +2 -0
  324. package/src/components/form/DateRangePicker/DateRangePicker.tsx +4 -0
  325. package/src/components/form/DateRangePicker/DateRangePicker.types.ts +11 -0
  326. package/src/components/form/DateRangePicker/DateRangePickerFields.tsx +2 -0
  327. package/src/components/form/Menubar/Menubar.toolbar.tsx +3 -1
  328. package/src/components/form/Menubar/Menubar.tsx +2 -1
  329. package/src/components/form/Menubar/Menubar.types.ts +5 -0
  330. package/src/components/form/PasswordStrength/PasswordStrength.helpers.tsx +33 -17
  331. package/src/components/form/PasswordStrength/PasswordStrength.tsx +29 -13
  332. package/src/components/form/PasswordStrength/PasswordStrength.types.ts +9 -0
  333. package/src/components/form/PhoneInput/PhoneInput.tsx +15 -5
  334. package/src/components/form/PhoneInput/PhoneInput.types.ts +7 -0
  335. package/src/components/form/SearchPalette/SearchPalette.parts.tsx +4 -1
  336. package/src/components/form/SearchPalette/SearchPalette.tsx +4 -1
  337. package/src/components/form/SearchPalette/SearchPalette.types.ts +6 -0
  338. package/src/components/form/Textarea/Textarea.tsx +6 -1
  339. package/src/components/form/Textarea/Textarea.types.ts +14 -1
  340. package/src/components/form/Textarea/TextareaRichEditor.tsx +28 -18
  341. package/src/components/form/UploadButton/UploadButton.parts.tsx +16 -7
  342. package/src/components/form/UploadButton/UploadButton.tsx +4 -1
  343. package/src/components/form/UploadButton/UploadButton.types.ts +8 -0
  344. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +10 -2
  345. package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +12 -0
  346. package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +15 -4
  347. package/src/components/layout/ContentToolbar/SortByDropdown.tsx +12 -3
  348. package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -1
  349. package/src/components/layout/Dashboard/Dashboard.types.ts +4 -0
  350. package/src/components/layout/Dashboard/DashboardParts.tsx +2 -1
  351. package/src/components/layout/ScrollArea/ScrollArea.tsx +16 -3
  352. package/src/components/layout/ScrollArea/ScrollArea.types.ts +19 -4
  353. package/src/components/layout/ScrollArea/ScrollViewport.tsx +4 -1
  354. package/src/components/layout/TableFilter/TableFilter.tsx +19 -11
  355. package/src/components/layout/TableFilter/TableFilter.types.ts +8 -0
  356. package/src/components/layout/TableFilter/TableFilterContext.tsx +10 -0
  357. package/src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx +11 -4
  358. package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +2 -0
  359. package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +3 -0
  360. package/src/components/navigation/CommandPalette/CommandPalette.tsx +15 -5
  361. package/src/components/navigation/CommandPalette/CommandPalette.types.ts +3 -0
  362. package/src/components/navigation/CommandPalette/CommandPaletteResults.tsx +5 -2
  363. package/src/components/navigation/Pagination/Pagination.tsx +2 -0
  364. package/src/components/navigation/Pagination/Pagination.types.ts +2 -0
  365. package/src/components/navigation/Pagination/PaginationParts.tsx +4 -1
  366. package/src/components/navigation/Tabs/Tabs.tsx +8 -3
  367. package/src/components/navigation/Tabs/Tabs.types.ts +2 -0
  368. package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +4 -4
  369. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +4 -2
  370. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +6 -0
  371. package/src/components/utility/InstallPrompt/InstallPrompt.tsx +18 -13
  372. package/src/components/utility/InstallPrompt/InstallPrompt.types.ts +9 -7
  373. package/src/copy/data-display.ts +60 -0
  374. package/src/copy/feedback.ts +39 -0
  375. package/src/copy/form.ts +154 -0
  376. package/src/copy/layout.ts +18 -0
  377. package/src/copy/navigation.ts +25 -0
  378. package/src/copy/shared.ts +122 -0
  379. package/src/copy/utility.ts +36 -0
  380. package/src/copy.ts +12 -173
  381. package/src/en-US.data-display.ts +244 -0
  382. package/src/en-US.feedback.ts +25 -0
  383. package/src/en-US.form.ts +103 -0
  384. package/src/en-US.layout.ts +15 -0
  385. package/src/en-US.navigation.ts +23 -0
  386. package/src/en-US.shared.ts +105 -0
  387. package/src/en-US.ts +24 -0
  388. package/src/en-US.utility.ts +24 -0
  389. package/src/locales.ts +151 -0
  390. package/src/pt-BR.data-display.ts +236 -0
  391. package/src/pt-BR.feedback.ts +25 -0
  392. package/src/pt-BR.form.ts +96 -0
  393. package/src/pt-BR.layout.ts +15 -0
  394. package/src/pt-BR.navigation.ts +21 -0
  395. package/src/pt-BR.shared.ts +94 -0
  396. package/src/pt-BR.ts +15 -307
  397. package/src/pt-BR.utility.ts +21 -0
  398. package/src/user-avatar/user-avatar.tsx +8 -2
  399. package/dist/chunk-CEKPLUQV.js.map +0 -1
  400. package/dist/chunk-DFVRZ3UK.js.map +0 -1
  401. package/dist/chunk-H7UAGTVW.js.map +0 -1
  402. package/dist/chunk-JP55QWVR.js.map +0 -1
  403. package/dist/chunk-NUCLEOHF.js.map +0 -1
  404. package/dist/chunk-QLBYAYUG.js.map +0 -1
  405. package/dist/chunk-QZZVHY6U.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/navigation/Breadcrumbs/Breadcrumbs.tsx","../../src/components/navigation/Breadcrumbs/Breadcrumbs.styles.tsx","../../src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx"],"sourcesContent":["import ArrowForwardIos from '@mui/icons-material/ArrowForwardIos';\nimport ChevronRight from '@mui/icons-material/ChevronRight';\nimport NavigateNext from '@mui/icons-material/NavigateNext';\nimport {\n Box,\n Breadcrumbs as MuiBreadcrumbs,\n useMediaQuery,\n useTheme } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport {\n breadcrumbsBarStyles,\n sizeIconMap } from './Breadcrumbs.styles';\nimport { BreadcrumbEntry } from './BreadcrumbEntry';\nimport type { BreadcrumbItem,BreadcrumbsProps } from './Breadcrumbs.types';\n\n// Animation keyframes\nconst StyledBreadcrumbs = styled(MuiBreadcrumbs, {\n shouldForwardProp: (prop) =>\n prop !== 'size' && prop !== 'color' && prop !== 'visualStyle' && prop !== 'elevation' })<{ size?: string; color?: string; visualStyle?: string; elevation?: number }>(\n ({ theme, size, color, visualStyle, elevation = 0 }) => ({\n ...breadcrumbsBarStyles({ theme, size, color, visualStyle, elevation }) }),\n);\n\nconst AnimatedSeparator = styled(Box)(() => ({\n display: 'flex',\n alignItems: 'center',\n opacity: 0.6,\n transition: 'all 0.2s ease',\n\n '&:hover': {\n opacity: 1,\n transform: 'scale(1.1)' } }));\n\nconst getSeparator = (separatorType: string) => {\n const separatorContent = (() => {\n switch (separatorType) {\n case 'slash':\n return '/';\n case 'arrow':\n return <NavigateNext fontSize=\"small\" />;\n case 'chevron':\n return <ChevronRight fontSize=\"small\" />;\n case 'dot':\n return '•';\n case 'pipe':\n return '|';\n default:\n return <ArrowForwardIos sx={{ fontSize: 12 }} />;\n }\n })();\n\n return <AnimatedSeparator>{separatorContent}</AnimatedSeparator>;\n};\n\ntype DisplayItem = BreadcrumbItem & { isEllipsis?: boolean };\n\n// Long trails either hide their middle behind a menu or replace it with an\n// ellipsis crumb; short ones pass straight through.\nconst collapseItems = ({\n items,\n effectiveMaxItems,\n collapseBehavior }: {\n items: BreadcrumbItem[];\n effectiveMaxItems: number;\n collapseBehavior: string;\n}): { displayItems: DisplayItem[]; collapsedItems: BreadcrumbItem[] } => {\n if (items.length <= effectiveMaxItems) {\n return { displayItems: items, collapsedItems: [] };\n }\n\n if (collapseBehavior === 'menu') {\n const firstItem = items[0];\n const tail = items.slice(-(effectiveMaxItems - 2));\n\n return {\n displayItems: firstItem ? [firstItem, ...tail] : tail,\n collapsedItems: items.slice(1, -(effectiveMaxItems - 2)) };\n }\n\n if (collapseBehavior === 'ellipsis') {\n const half = Math.floor(effectiveMaxItems / 2);\n\n return {\n displayItems: [\n ...items.slice(0, half),\n { label: '...', href: '#', isEllipsis: true },\n ...items.slice(-half),\n ],\n collapsedItems: [] };\n }\n\n return { displayItems: items, collapsedItems: [] };\n};\n\ntype BreadcrumbsDefaultedKeys =\n | 'variant'\n | 'separatorType'\n | 'maxItems'\n | 'showHomeIcon'\n | 'size'\n | 'color'\n | 'elevation'\n | 'collapseBehavior'\n | 'mobileMaxItems';\n\ntype ResolvedBreadcrumbsProps = BreadcrumbsProps &\n Required<Pick<BreadcrumbsProps, BreadcrumbsDefaultedKeys>>;\n\nconst BREADCRUMBS_DEFAULTS: Pick<BreadcrumbsProps, BreadcrumbsDefaultedKeys> = {\n variant: 'default',\n separatorType: 'default',\n maxItems: 8,\n showHomeIcon: true,\n size: 'md',\n color: 'neutral',\n elevation: 1,\n collapseBehavior: 'menu',\n mobileMaxItems: 3 };\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would. Applied as\n// a merge rather than destructuring defaults, which would otherwise put nine\n// branches into the component's own complexity budget.\nconst resolveProps = (props: BreadcrumbsProps): ResolvedBreadcrumbsProps =>\n ({\n ...BREADCRUMBS_DEFAULTS,\n ...(Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<BreadcrumbsProps>) }) as ResolvedBreadcrumbsProps;\n\nexport const Breadcrumbs = React.forwardRef<HTMLElement, BreadcrumbsProps>(\n (componentProps, ref) => {\n const {\n variant,\n separatorType,\n items,\n separator,\n maxItems,\n showHomeIcon,\n size,\n color,\n elevation,\n collapseBehavior,\n mobileMaxItems,\n ariaLabel,\n dataTestId,\n ...props\n } = resolveProps(componentProps);\n const theme = useTheme();\n // separatorType picks a built-in separator; an explicit `separator` wins.\n // This was computed before but never passed on, so separatorType had no\n // effect on what rendered.\n const finalSeparator = separator || getSeparator(separatorType);\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const iconSize = sizeIconMap[size];\n\n // Handle mobile collapsing\n const effectiveMaxItems = isMobile ? mobileMaxItems : maxItems;\n const shouldCollapse = items.length > effectiveMaxItems;\n\n const { displayItems, collapsedItems } = collapseItems({\n items,\n effectiveMaxItems,\n collapseBehavior });\n\n return (\n <StyledBreadcrumbs\n ref={ref}\n separator={finalSeparator}\n maxItems={shouldCollapse ? undefined : effectiveMaxItems}\n size={size}\n color={color}\n visualStyle={variant}\n elevation={elevation}\n aria-label={ariaLabel || 'breadcrumb navigation'}\n role=\"navigation\"\n data-testid={dataTestId || 'breadcrumbs'}\n {...props}\n >\n {displayItems.map((item, index) => (\n <BreadcrumbEntry\n key={index}\n item={item}\n index={index}\n itemCount={displayItems.length}\n collapsedItems={collapsedItems}\n collapseBehavior={collapseBehavior}\n separator={finalSeparator}\n showHomeIcon={showHomeIcon}\n iconSize={iconSize}\n size={size}\n variant={variant}\n dataTestId={dataTestId}\n />\n ))}\n </StyledBreadcrumbs>\n );\n },\n);\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n","import { alpha, keyframes } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nexport const slideIn = keyframes`\n from {\n opacity: 0;\n transform: translateX(-10px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const pulse = keyframes`\n 0% {\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4);\n }\n 70% {\n box-shadow: 0 0 0 10px rgba(99, 102, 241, 0);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);\n }\n`;\n\nconst BAR_VARIANTS: Record<string, (theme: Theme, elevation: number) => CSSObject> = {\n glass: (theme, elevation) => ({\n background:\n theme.palette.mode === 'dark' ? 'rgba(17, 24, 39, 0.7)' : 'rgba(255, 255, 255, 0.7)',\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${\n theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'\n }`,\n boxShadow:\n theme.palette.mode === 'dark'\n ? `0 ${elevation * 4}px ${elevation * 8}px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1)`\n : `0 ${elevation * 4}px ${elevation * 8}px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8)` }),\n elevated: (theme, elevation) => ({\n background: theme.palette.background.paper,\n boxShadow: theme.shadows[elevation] || theme.shadows[1],\n borderRadius: theme.spacing(1.5) }),\n outlined: (theme, _elevation) => ({\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.spacing(1) }) };\n\n// Spacing and colour for the separator glyphs between crumbs.\nconst separatorStyles = (\n theme: Theme,\n size: string | undefined,\n color: string | undefined,\n _visualStyle: string | undefined,\n): CSSObject => ({\n '& .MuiBreadcrumbs-separator': {\n marginLeft: theme.spacing(size === 'sm' ? 0.5 : size === 'lg' ? 1.5 : 1),\n marginRight: theme.spacing(size === 'sm' ? 0.5 : size === 'lg' ? 1.5 : 1),\n opacity: 0.6,\n transition: 'all 0.2s ease',\n ...(color === 'primary' && {\n color: theme.palette.primary.main }),\n ...(color === 'secondary' && {\n color: theme.palette.secondary.main }) } });\n\n// Only one visual style applies at a time, so a lookup replaces three mutually\n// exclusive spreads.\nconst barVariantStyles = (theme: Theme, visualStyle: string | undefined, elevation: number): CSSObject =>\n visualStyle ? (BAR_VARIANTS[visualStyle]?.(theme, elevation) ?? {}) : {};\n\n// The bar's own styling, lifted out so the styled() callback is a single spread\n// rather than seventy lines of conditionals.\nexport const breadcrumbsBarStyles = ({\n theme,\n size,\n color,\n visualStyle,\n elevation = 0 }: {\n theme: Theme;\n size?: string;\n color?: string;\n visualStyle?: string;\n elevation?: number;\n}): CSSObject => ({\n padding: theme.spacing(size === 'sm' ? 0.75 : size === 'lg' ? 1.5 : 1, 2),\n borderRadius: theme.spacing(visualStyle === 'glass' ? 2 : 1),\n ...barVariantStyles(theme, visualStyle, elevation),\n animation: `${slideIn} 0.3s ease-out`,\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n\n // Glass morphism effect\n\n\n // Elevated variant\n\n\n // Outlined variant\n\n\n '& .MuiBreadcrumbs-ol': {\n alignItems: 'center',\n flexWrap: 'nowrap',\n [theme.breakpoints.down('sm')]: {\n flexWrap: 'wrap',\n gap: theme.spacing(0.5) } },\n\n ...separatorStyles(theme, size, color, visualStyle),\n\n\n '&:hover': {\n ...(visualStyle === 'glass' && {\n background:\n theme.palette.mode === 'dark' ? 'rgba(17, 24, 39, 0.85)' : 'rgba(255, 255, 255, 0.85)',\n boxShadow:\n theme.palette.mode === 'dark'\n ? `0 ${elevation * 6}px ${elevation * 12}px rgba(0, 0, 0, 0.4)`\n : `0 ${elevation * 6}px ${elevation * 12}px rgba(0, 0, 0, 0.12)` }) } });\n\n// The idle glass treatment and the active-crumb treatment are mutually\n// exclusive; keeping them as named pieces takes both branches out of the main\n// style function.\nconst linkGlassIdleStyles = (theme: Theme): CSSObject => ({\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)`,\n opacity: 0,\n transition: 'opacity 0.3s ease',\n borderRadius: 'inherit' } });\n\nconst linkActiveStyles = (theme: Theme, visualStyle?: string): CSSObject => ({\n pointerEvents: 'none',\n cursor: 'default',\n color: theme.palette.primary.main,\n fontWeight: 600,\n\n ...(visualStyle === 'glass' && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)`,\n animation: `${pulse} 2s infinite` }) });\n\n// Hover treatment. The tint is a touch stronger on the glass variant so it still\n// reads against the translucent bar.\nconst linkHoverStyles = (theme: Theme, visualStyle?: string): CSSObject => ({\n '&:hover, &[data-hover=\"true\"]': {\n color: theme.palette.primary.main,\n backgroundColor: alpha(theme.palette.primary.main, visualStyle === 'glass' ? 0.1 : 0.08),\n transform: 'translateY(-1px)',\n\n '&::before': {\n opacity: 1 },\n\n '& .breadcrumb-icon': {\n transform: 'scale(1.1)' } } });\n\nexport const breadcrumbLinkStyles = ({\n theme,\n size,\n active,\n visualStyle }: {\n theme: Theme;\n size?: string;\n active?: boolean;\n visualStyle?: string;\n}): CSSObject => ({\n ...(visualStyle === 'glass' && !active ? linkGlassIdleStyles(theme) : {}),\n ...(active ? linkActiveStyles(theme, visualStyle) : {}),\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n textDecoration: 'none',\n fontSize: size === 'sm' ? '0.875rem' : size === 'lg' ? '1.125rem' : '1rem',\n fontWeight: active ? 600 : 400,\n color: active ? theme.palette.text.primary : theme.palette.text.secondary,\n padding: theme.spacing(0.5, 0.75),\n borderRadius: theme.spacing(0.75),\n position: 'relative',\n overflow: 'hidden',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n\n // Add subtle background for glass variant\n\n\n ...linkHoverStyles(theme, visualStyle),\n\n\n '&:active': {\n transform: 'translateY(0)',\n backgroundColor: alpha(theme.palette.primary.main, 0.12) },\n\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n backgroundColor: alpha(theme.palette.primary.main, 0.04) },\n\n\n\n '& .breadcrumb-icon': {\n transition: 'transform 0.2s ease' },\n\n // Mobile responsiveness\n [theme.breakpoints.down('sm')]: {\n fontSize: size === 'lg' ? '1rem' : size === 'sm' ? '0.75rem' : '0.875rem',\n padding: theme.spacing(0.375, 0.5) } });\n\nexport const sizeIconMap = {\n xs: 'small',\n sm: 'small',\n md: 'small',\n lg: 'medium',\n xl: 'medium',\n} as const;\n","import Home from '@mui/icons-material/Home';\nimport MoreHoriz from '@mui/icons-material/MoreHoriz';\nimport { alpha, Box, Fade, Link, Tooltip, Typography } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { breadcrumbLinkStyles } from './Breadcrumbs.styles';\nimport type { BreadcrumbItem } from './Breadcrumbs.types';\n\nconst BreadcrumbLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'size' && prop !== 'active' && prop !== 'visualStyle' })<{ size?: string; active?: boolean; visualStyle?: string }>(\n ({ theme, size, active, visualStyle }) => ({\n ...breadcrumbLinkStyles({ theme, size, active, visualStyle }) }),\n);\n\nconst BreadcrumbText = styled(Typography, {\n shouldForwardProp: (prop) => prop !== 'size' && prop !== 'visualStyle' })<{ size?: string; visualStyle?: string }>(({ theme, size, visualStyle }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: size === 'sm' ? '0.875rem' : size === 'lg' ? '1.125rem' : '1rem',\n fontWeight: 600,\n color: theme.palette.primary.main,\n padding: theme.spacing(0.5, 0.75),\n borderRadius: theme.spacing(0.75),\n position: 'relative',\n\n ...(visualStyle === 'glass' && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)`,\n backdropFilter: 'blur(4px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}` }),\n\n '& .breadcrumb-icon': {\n color: theme.palette.primary.main },\n\n // Mobile responsiveness\n [theme.breakpoints.down('sm')]: {\n fontSize: size === 'lg' ? '1rem' : size === 'sm' ? '0.75rem' : '0.875rem',\n padding: theme.spacing(0.375, 0.5) } }));\n\n// Animated separator wrapper\n\n// Mobile collapsed menu component\n// The list that drops down from the \"...\" trigger.\nconst CollapsedItemsPopover: React.FC<{\n open: boolean;\n items: BreadcrumbItem[];\n size: string;\n visualStyle?: string;\n dataTestId?: string;\n onSelect: () => void;\n}> = ({ open, items, dataTestId, onSelect }) => (\n<Fade in={open}>\n <Box\n sx={{\n background: (theme) =>\n theme.palette.mode === 'dark'\n ? 'rgba(17, 24, 39, 0.95)'\n : 'rgba(255, 255, 255, 0.95)',\n backdropFilter: 'blur(10px)',\n borderRadius: 1,\n boxShadow: 3,\n p: 1,\n minWidth: 150 }}\n >\n {items.map((item, index) => (\n <Box\n key={index}\n component=\"a\"\n href={item.href || '#'}\n onClick={(e) => {\n onSelect();\n item.onClick?.(e);\n }}\n sx={{\n display: 'block',\n px: 2,\n py: 1,\n color: 'text.secondary',\n textDecoration: 'none',\n borderRadius: 0.5,\n transition: 'all 0.2s',\n '&:hover': {\n backgroundColor: 'action.hover',\n color: 'primary.main' } }}\n data-testid={dataTestId ? `${dataTestId}-collapsed-item-${index}` : `breadcrumbs-collapsed-item-${index}`}\n >\n {item.label}\n </Box>\n ))}\n </Box>\n </Fade>\n);\n\nconst CollapsedMenu = ({\n items,\n size,\n visualStyle,\n dataTestId }: {\n items: BreadcrumbItem[];\n size: string;\n visualStyle?: string;\n dataTestId?: string;\n}) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip title=\"Show more\" arrow>\n <BreadcrumbLink\n onClick={handleClick}\n size={size}\n visualStyle={visualStyle}\n sx={{ cursor: 'pointer' }}\n data-testid={dataTestId ? `${dataTestId}-collapsed-menu` : 'breadcrumbs-collapsed-menu'}\n >\n <MoreHoriz className=\"breadcrumb-icon\" />\n </BreadcrumbLink>\n </Tooltip>\n <Box\n sx={{\n position: 'absolute',\n top: '100%',\n left: 0,\n mt: 1,\n display: open ? 'block' : 'none',\n zIndex: 1000 }}\n data-testid={dataTestId ? `${dataTestId}-collapsed-menu-items` : 'breadcrumbs-collapsed-menu-items'}\n >\n <CollapsedItemsPopover\n open={open}\n items={items}\n size={size}\n visualStyle={visualStyle}\n dataTestId={dataTestId}\n onSelect={handleClose}\n />\n </Box>\n </>\n );\n};\n\n// The leading crumb gets a house unless it brings its own icon; everything else\n// shows only what it supplies.\nconst crumbIcon = ({\n item,\n isFirst,\n showHomeIcon,\n iconSize }: {\n item: BreadcrumbItem;\n isFirst: boolean;\n showHomeIcon: boolean;\n iconSize: 'small' | 'medium';\n}) => {\n if (isFirst && showHomeIcon && !item.icon) {\n return <Home className=\"breadcrumb-icon\" fontSize={iconSize} />;\n }\n\n if (!item.icon) return null;\n\n return (\n <Box component=\"span\" className=\"breadcrumb-icon\" sx={{ display: 'flex', alignItems: 'center' }}>\n {item.icon}\n </Box>\n );\n};\n\nconst EllipsisCrumb: React.FC<{ label: string; dataTestId?: string }> = ({\n label,\n dataTestId }) => (\n <Tooltip title=\"More items\" arrow>\n <Box\n sx={{\n px: 1,\n color: 'text.disabled',\n cursor: 'default',\n userSelect: 'none' }}\n data-testid={dataTestId ? `${dataTestId}-ellipsis` : 'breadcrumbs-ellipsis'}\n >\n {label}\n </Box>\n </Tooltip>\n);\n\n// The same conditional test id was written at each crumb variant. An item that\n// names its OWN id wins: see `BreadcrumbItem.dataTestId`.\nconst makeTestId =\n (dataTestId?: string) =>\n (suffix: string, own?: string): string =>\n own ?? (dataTestId ? `${dataTestId}-${suffix}` : `breadcrumbs-${suffix}`);\n\nconst ClickableCrumb: React.FC<{\n item: BreadcrumbItem;\n index: number;\n icon: React.ReactNode;\n size: string;\n variant: string;\n isActive: boolean;\n testId: (suffix: string, own?: string) => string;\n}> = ({ item, index, icon, size, variant, isActive, testId }) => (\n <Tooltip title={item.tooltip || item.label} arrow disableHoverListener={!item.tooltip}>\n <BreadcrumbLink\n href={item.href || '#'}\n onClick={item.onClick}\n size={size}\n visualStyle={variant}\n active={isActive}\n underline=\"none\"\n aria-label={item.ariaLabel || item.label}\n data-testid={testId(`link-${index}`, item.dataTestId)}\n >\n {icon}\n <span>{item.label}</span>\n </BreadcrumbLink>\n </Tooltip>\n);\n\n// One crumb: the collapsed-menu stand-in, the ellipsis, the active tail item or\n// a plain link.\nexport const BreadcrumbEntry: React.FC<{\n item: BreadcrumbItem & { isEllipsis?: boolean };\n index: number;\n itemCount: number;\n collapsedItems: BreadcrumbItem[];\n collapseBehavior: string;\n separator: React.ReactNode;\n showHomeIcon: boolean;\n iconSize: 'small' | 'medium';\n size: string;\n variant: string;\n dataTestId?: string;\n}> = ({\n item,\n index,\n itemCount,\n collapsedItems,\n collapseBehavior,\n separator,\n showHomeIcon,\n iconSize,\n size,\n variant,\n dataTestId }) => {\n const testId = makeTestId(dataTestId);\n const isLast = index === itemCount - 1;\n // The tail crumb is the current page unless it is the ellipsis placeholder.\n const isActive = item.active || (isLast && !item.isEllipsis);\n\n const isCollapsePoint =\n index === 1 && collapsedItems.length > 0 && collapseBehavior === 'menu';\n\n if (isCollapsePoint) {\n return (\n <>\n <CollapsedMenu\n items={collapsedItems}\n size={size}\n visualStyle={variant}\n dataTestId={dataTestId}\n />\n {separator}\n </>\n );\n }\n\n if (item.isEllipsis) {\n return <EllipsisCrumb label={item.label} dataTestId={dataTestId} />;\n }\n\n const icon = crumbIcon({ item, isFirst: index === 0, showHomeIcon, iconSize });\n\n if (isActive) {\n return (\n <BreadcrumbText\n size={size}\n visualStyle={variant}\n aria-current=\"page\"\n data-testid={testId(`item-${index}`, item.dataTestId)}\n >\n {icon}\n <span>{item.label}</span>\n </BreadcrumbText>\n );\n }\n\n return (\n <ClickableCrumb\n item={item}\n index={index}\n icon={icon}\n size={size}\n variant={variant}\n isActive={isActive}\n testId={testId}\n />\n );\n};\n"],"mappings":";;;AAAA,OAAO,qBAAqB;AAC5B,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB;AAAA,EACE,OAAAA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,OAAgB;AAClB,SAAS,UAAAC,eAAc;AACvB,OAAOC,YAAW;;;ACTlB,SAAS,OAAO,iBAAiB;AAG1B,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhB,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYrB,IAAM,eAA+E;AAAA,EACnF,OAAO,CAAC,OAAO,eAAe;AAAA,IAC1B,YACE,MAAM,QAAQ,SAAS,SAAS,0BAA0B;AAAA,IAC5D,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,QAAQ,aACN,MAAM,QAAQ,SAAS,SAAS,6BAA6B,oBAC/D;AAAA,IACA,WACE,MAAM,QAAQ,SAAS,SACnB,KAAK,YAAY,CAAC,MAAM,YAAY,CAAC,kEACrC,KAAK,YAAY,CAAC,MAAM,YAAY,CAAC;AAAA,EAAiE;AAAA,EAChH,UAAU,CAAC,OAAO,eAAe;AAAA,IAC7B,YAAY,MAAM,QAAQ,WAAW;AAAA,IACrC,WAAW,MAAM,QAAQ,SAAS,KAAK,MAAM,QAAQ,CAAC;AAAA,IACtD,cAAc,MAAM,QAAQ,GAAG;AAAA,EAAE;AAAA,EACrC,UAAU,CAAC,OAAO,gBAAgB;AAAA,IAC9B,QAAQ,aAAa,MAAM,QAAQ,OAAO;AAAA,IAC1C,cAAc,MAAM,QAAQ,CAAC;AAAA,EAAE;AAAG;AAGxC,IAAM,kBAAkB,CACtB,OACA,MACA,OACA,kBACe;AAAA,EACf,+BAA+B;AAAA,IAC3B,YAAY,MAAM,QAAQ,SAAS,OAAO,MAAM,SAAS,OAAO,MAAM,CAAC;AAAA,IACvE,aAAa,MAAM,QAAQ,SAAS,OAAO,MAAM,SAAS,OAAO,MAAM,CAAC;AAAA,IACxE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,GAAI,UAAU,aAAa;AAAA,MACzB,OAAO,MAAM,QAAQ,QAAQ;AAAA,IAAK;AAAA,IACpC,GAAI,UAAU,eAAe;AAAA,MAC3B,OAAO,MAAM,QAAQ,UAAU;AAAA,IAAK;AAAA,EAAG;AAAE;AAIjD,IAAM,mBAAmB,CAAC,OAAc,aAAiC,cACvE,cAAe,aAAa,WAAW,IAAI,OAAO,SAAS,KAAK,CAAC,IAAK,CAAC;AAIlE,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAE,OAME;AAAA,EACd,SAAS,MAAM,QAAQ,SAAS,OAAO,OAAO,SAAS,OAAO,MAAM,GAAG,CAAC;AAAA,EACxE,cAAc,MAAM,QAAQ,gBAAgB,UAAU,IAAI,CAAC;AAAA,EAC7D,GAAG,iBAAiB,OAAO,aAAa,SAAS;AAAA,EAC/C,WAAW,GAAG,OAAO;AAAA,EACrB,YAAY;AAAA,EACZ,UAAU;AAAA;AAAA;AAAA;AAAA,EAWV,wBAAwB;AAAA,IACtB,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,CAAC,MAAM,YAAY,KAAK,IAAI,CAAC,GAAG;AAAA,MAC9B,UAAU;AAAA,MACV,KAAK,MAAM,QAAQ,GAAG;AAAA,IAAE;AAAA,EAAE;AAAA,EAE9B,GAAG,gBAAgB,OAAO,MAAM,OAAO,WAAW;AAAA,EAGlD,WAAW;AAAA,IACT,GAAI,gBAAgB,WAAW;AAAA,MAC7B,YACE,MAAM,QAAQ,SAAS,SAAS,2BAA2B;AAAA,MAC7D,WACE,MAAM,QAAQ,SAAS,SACnB,KAAK,YAAY,CAAC,MAAM,YAAY,EAAE,0BACtC,KAAK,YAAY,CAAC,MAAM,YAAY,EAAE;AAAA,IAAyB;AAAA,EAAG;AAAE;AAKlF,IAAM,sBAAsB,CAAC,WAA6B;AAAA,EAClD,aAAa;AAAA,IACX,SAAS;AAAA,IACT,UAAU;AAAA,IACV,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY,2BAA2B,MAAM,MAAM,QAAQ,QAAQ,MAAM,CAAC,CAAC,QAAQ,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC1H,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAc;AAAA,EAAU;AAAE;AAEpC,IAAM,mBAAmB,CAAC,OAAc,iBAAqC;AAAA,EACvE,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAC7B,YAAY;AAAA,EAEZ,GAAI,gBAAgB,WAAW;AAAA,IAC7B,YAAY,2BAA2B,MAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC,QAAQ,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC5H,WAAW,GAAG,KAAK;AAAA,EAAe;AAAG;AAI7C,IAAM,kBAAkB,CAAC,OAAc,iBAAqC;AAAA,EAC1E,iCAAiC;AAAA,IAC7B,OAAO,MAAM,QAAQ,QAAQ;AAAA,IAC7B,iBAAiB,MAAM,MAAM,QAAQ,QAAQ,MAAM,gBAAgB,UAAU,MAAM,IAAI;AAAA,IACvF,WAAW;AAAA,IAEX,aAAa;AAAA,MACX,SAAS;AAAA,IAAE;AAAA,IAEb,sBAAsB;AAAA,MACpB,WAAW;AAAA,IAAa;AAAA,EAAE;AAAE;AAE7B,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAY,OAKI;AAAA,EAChB,GAAI,gBAAgB,WAAW,CAAC,SAAS,oBAAoB,KAAK,IAAI,CAAC;AAAA,EACvE,GAAI,SAAS,iBAAiB,OAAO,WAAW,IAAI,CAAC;AAAA,EACnD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK,MAAM,QAAQ,GAAG;AAAA,EACtB,gBAAgB;AAAA,EAChB,UAAU,SAAS,OAAO,aAAa,SAAS,OAAO,aAAa;AAAA,EACpE,YAAY,SAAS,MAAM;AAAA,EAC3B,OAAO,SAAS,MAAM,QAAQ,KAAK,UAAU,MAAM,QAAQ,KAAK;AAAA,EAChE,SAAS,MAAM,QAAQ,KAAK,IAAI;AAAA,EAChC,cAAc,MAAM,QAAQ,IAAI;AAAA,EAChC,UAAU;AAAA,EACV,UAAU;AAAA,EACV,YAAY;AAAA;AAAA,EAKd,GAAG,gBAAgB,OAAO,WAAW;AAAA,EAGnC,YAAY;AAAA,IACV,WAAW;AAAA,IACX,iBAAiB,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAAE;AAAA,EAE3D,mBAAmB;AAAA,IACjB,SAAS,aAAa,MAAM,QAAQ,QAAQ,IAAI;AAAA,IAChD,eAAe;AAAA,IACf,iBAAiB,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAAE;AAAA,EAI3D,sBAAsB;AAAA,IACpB,YAAY;AAAA,EAAsB;AAAA;AAAA,EAGpC,CAAC,MAAM,YAAY,KAAK,IAAI,CAAC,GAAG;AAAA,IAC9B,UAAU,SAAS,OAAO,SAAS,SAAS,OAAO,YAAY;AAAA,IAC/D,SAAS,MAAM,QAAQ,OAAO,GAAG;AAAA,EAAE;AAAE;AAEpC,IAAM,cAAc;AAAA,EACzB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;;;ACtNA,OAAO,UAAU;AACjB,OAAO,eAAe;AACtB,SAAS,SAAAC,QAAO,KAAK,MAAM,MAAM,SAAS,kBAAkB;AAC5D,SAAS,cAAc;AACvB,OAAO,WAAW;AA8DV,SAkDJ,UAlDI,KAkDJ,YAlDI;AAzDR,IAAM,iBAAiB,OAAO,MAAM;AAAA,EAClC,mBAAmB,CAAC,SAAS,SAAS,UAAU,SAAS,YAAY,SAAS;AAAc,CAAC;AAAA,EAC7F,CAAC,EAAE,OAAO,MAAM,QAAQ,YAAY,OAAO;AAAA,IACzC,GAAG,qBAAqB,EAAE,OAAO,MAAM,QAAQ,YAAY,CAAC;AAAA,EAAE;AAClE;AAEA,IAAM,iBAAiB,OAAO,YAAY;AAAA,EACxC,mBAAmB,CAAC,SAAS,SAAS,UAAU,SAAS;AAAc,CAAC,EAA2C,CAAC,EAAE,OAAO,MAAM,YAAY,OAAO;AAAA,EACtJ,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK,MAAM,QAAQ,GAAG;AAAA,EACtB,UAAU,SAAS,OAAO,aAAa,SAAS,OAAO,aAAa;AAAA,EACpE,YAAY;AAAA,EACZ,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAC7B,SAAS,MAAM,QAAQ,KAAK,IAAI;AAAA,EAChC,cAAc,MAAM,QAAQ,IAAI;AAAA,EAChC,UAAU;AAAA,EAEV,GAAI,gBAAgB,WAAW;AAAA,IAC7B,YAAY,2BAA2BC,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC,QAAQA,OAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IAC5H,gBAAgB;AAAA,IAChB,QAAQ,aAAaA,OAAM,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC;AAAA,EAAG;AAAA,EAEhE,sBAAsB;AAAA,IACpB,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAAK;AAAA;AAAA,EAGpC,CAAC,MAAM,YAAY,KAAK,IAAI,CAAC,GAAG;AAAA,IAC9B,UAAU,SAAS,OAAO,SAAS,SAAS,OAAO,YAAY;AAAA,IAC/D,SAAS,MAAM,QAAQ,OAAO,GAAG;AAAA,EAAE;AAAE,EAAE;AAM3C,IAAM,wBAOD,CAAC,EAAE,MAAM,OAAO,YAAY,SAAS,MAC1C,oBAAC,QAAK,IAAI,MACN;AAAA,EAAC;AAAA;AAAA,IACC,IAAI;AAAA,MACF,YAAY,CAAC,UACX,MAAM,QAAQ,SAAS,SACnB,2BACA;AAAA,MACN,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,GAAG;AAAA,MACH,UAAU;AAAA,IAAI;AAAA,IAEf,gBAAM,IAAI,CAAC,MAAM,UAChB;AAAA,MAAC;AAAA;AAAA,QAEC,WAAU;AAAA,QACV,MAAM,KAAK,QAAQ;AAAA,QACnB,SAAS,CAAC,MAAM;AACd,mBAAS;AACT,eAAK,UAAU,CAAC;AAAA,QAClB;AAAA,QACA,IAAI;AAAA,UACF,SAAS;AAAA,UACT,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,gBAAgB;AAAA,UAChB,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,WAAW;AAAA,YACT,iBAAiB;AAAA,YACjB,OAAO;AAAA,UAAe;AAAA,QAAE;AAAA,QAC5B,eAAa,aAAa,GAAG,UAAU,mBAAmB,KAAK,KAAK,8BAA8B,KAAK;AAAA,QAEtG,eAAK;AAAA;AAAA,MApBD;AAAA,IAqBP,CACD;AAAA;AACH,GACF;AAGF,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAW,MAKP;AACJ,QAAM,CAAC,UAAU,WAAW,IAAI,MAAM,SAA6B,IAAI;AACvE,QAAM,OAAO,QAAQ,QAAQ;AAE7B,QAAM,cAAc,CAAC,UAAyC;AAC5D,gBAAY,MAAM,aAAa;AAAA,EACjC;AAEA,QAAM,cAAc,MAAM;AACxB,gBAAY,IAAI;AAAA,EAClB;AAEA,SACE,iCACE;AAAA,wBAAC,WAAQ,OAAM,aAAY,OAAK,MAC9B;AAAA,MAAC;AAAA;AAAA,QACC,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,IAAI,EAAE,QAAQ,UAAU;AAAA,QACxB,eAAa,aAAa,GAAG,UAAU,oBAAoB;AAAA,QAE3D,8BAAC,aAAU,WAAU,mBAAkB;AAAA;AAAA,IACzC,GACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,IAAI;AAAA,UACF,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,SAAS,OAAO,UAAU;AAAA,UAC1B,QAAQ;AAAA,QAAK;AAAA,QACf,eAAa,aAAa,GAAG,UAAU,0BAA0B;AAAA,QAEjE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAIA,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAS,MAKL;AACJ,MAAI,WAAW,gBAAgB,CAAC,KAAK,MAAM;AACzC,WAAO,oBAAC,QAAK,WAAU,mBAAkB,UAAU,UAAU;AAAA,EAC/D;AAEA,MAAI,CAAC,KAAK,KAAM,QAAO;AAEvB,SACE,oBAAC,OAAI,WAAU,QAAO,WAAU,mBAAkB,IAAI,EAAE,SAAS,QAAQ,YAAY,SAAS,GAC3F,eAAK,MACR;AAEJ;AAEA,IAAM,gBAAkE,CAAC;AAAA,EACvE;AAAA,EACA;AAAW,MACX,oBAAC,WAAQ,OAAM,cAAa,OAAK,MACvB;AAAA,EAAC;AAAA;AAAA,IACC,IAAI;AAAA,MACF,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,IAAO;AAAA,IACrB,eAAa,aAAa,GAAG,UAAU,cAAc;AAAA,IAEpD;AAAA;AACH,GACF;AAKV,IAAM,aACJ,CAAC,eACD,CAAC,QAAgB,QACf,QAAQ,aAAa,GAAG,UAAU,IAAI,MAAM,KAAK,eAAe,MAAM;AAE1E,IAAM,iBAQD,CAAC,EAAE,MAAM,OAAO,MAAM,MAAM,SAAS,UAAU,OAAO,MACzD,oBAAC,WAAQ,OAAO,KAAK,WAAW,KAAK,OAAO,OAAK,MAAC,sBAAsB,CAAC,KAAK,SAC5E;AAAA,EAAC;AAAA;AAAA,IACC,MAAM,KAAK,QAAQ;AAAA,IACnB,SAAS,KAAK;AAAA,IACd;AAAA,IACA,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,WAAU;AAAA,IACV,cAAY,KAAK,aAAa,KAAK;AAAA,IACnC,eAAa,OAAO,QAAQ,KAAK,IAAI,KAAK,UAAU;AAAA,IAEnD;AAAA;AAAA,MACD,oBAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AACpB,GACF;AAKK,IAAM,kBAYR,CAAC;AAAA,EACJ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAW,MAAM;AACjB,QAAM,SAAS,WAAW,UAAU;AACpC,QAAM,SAAS,UAAU,YAAY;AAErC,QAAM,WAAW,KAAK,UAAW,UAAU,CAAC,KAAK;AAEjD,QAAM,kBACJ,UAAU,KAAK,eAAe,SAAS,KAAK,qBAAqB;AAEnE,MAAI,iBAAiB;AACnB,WACE,iCACE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,UACP;AAAA,UACA,aAAa;AAAA,UACb;AAAA;AAAA,MACF;AAAA,MACC;AAAA,OACH;AAAA,EAEJ;AAEA,MAAI,KAAK,YAAY;AACnB,WAAO,oBAAC,iBAAc,OAAO,KAAK,OAAO,YAAwB;AAAA,EACnE;AAEA,QAAM,OAAO,UAAU,EAAE,MAAM,SAAS,UAAU,GAAG,cAAc,SAAS,CAAC;AAE7E,MAAI,UAAU;AACZ,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,aAAa;AAAA,QACb,gBAAa;AAAA,QACb,eAAa,OAAO,QAAQ,KAAK,IAAI,KAAK,UAAU;AAAA,QAEnD;AAAA;AAAA,UACD,oBAAC,UAAM,eAAK,OAAM;AAAA;AAAA;AAAA,IACpB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAEJ;;;AFxQe,gBAAAC,YAAA;AAvBf,IAAM,oBAAoBC,QAAO,gBAAgB;AAAA,EAC/C,mBAAmB,CAAC,SAClB,SAAS,UAAU,SAAS,WAAW,SAAS,iBAAiB,SAAS;AAAY,CAAC;AAAA,EACzF,CAAC,EAAE,OAAO,MAAM,OAAO,aAAa,YAAY,EAAE,OAAO;AAAA,IACvD,GAAG,qBAAqB,EAAE,OAAO,MAAM,OAAO,aAAa,UAAU,CAAC;AAAA,EAAE;AAC5E;AAEA,IAAM,oBAAoBA,QAAOC,IAAG,EAAE,OAAO;AAAA,EAC3C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AAAA,EAEZ,WAAW;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,EAAa;AAAE,EAAE;AAEhC,IAAM,eAAe,CAAC,kBAA0B;AAC9C,QAAM,oBAAoB,MAAM;AAC9B,YAAQ,eAAe;AAAA,MACrB,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,gBAAAF,KAAC,gBAAa,UAAS,SAAQ;AAAA,MACxC,KAAK;AACH,eAAO,gBAAAA,KAAC,gBAAa,UAAS,SAAQ;AAAA,MACxC,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,gBAAAA,KAAC,mBAAgB,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA,IAClD;AAAA,EACF,GAAG;AAEH,SAAO,gBAAAA,KAAC,qBAAmB,4BAAiB;AAC9C;AAMA,IAAM,gBAAgB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAiB,MAIsD;AACvE,MAAI,MAAM,UAAU,mBAAmB;AACrC,WAAO,EAAE,cAAc,OAAO,gBAAgB,CAAC,EAAE;AAAA,EACnD;AAEA,MAAI,qBAAqB,QAAQ;AAC/B,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,OAAO,MAAM,MAAM,EAAE,oBAAoB,EAAE;AAEjD,WAAO;AAAA,MACL,cAAc,YAAY,CAAC,WAAW,GAAG,IAAI,IAAI;AAAA,MACjD,gBAAgB,MAAM,MAAM,GAAG,EAAE,oBAAoB,EAAE;AAAA,IAAE;AAAA,EAC7D;AAEA,MAAI,qBAAqB,YAAY;AACnC,UAAM,OAAO,KAAK,MAAM,oBAAoB,CAAC;AAE7C,WAAO;AAAA,MACL,cAAc;AAAA,QACZ,GAAG,MAAM,MAAM,GAAG,IAAI;AAAA,QACtB,EAAE,OAAO,OAAO,MAAM,KAAK,YAAY,KAAK;AAAA,QAC5C,GAAG,MAAM,MAAM,CAAC,IAAI;AAAA,MACtB;AAAA,MACA,gBAAgB,CAAC;AAAA,IAAE;AAAA,EACvB;AAEA,SAAO,EAAE,cAAc,OAAO,gBAAgB,CAAC,EAAE;AACnD;AAgBA,IAAM,uBAAyE;AAAA,EAC7E,SAAS;AAAA,EACT,eAAe;AAAA,EACf,UAAU;AAAA,EACV,cAAc;AAAA,EACd,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,gBAAgB;AAAE;AAMpB,IAAM,eAAe,CAAC,WACnB;AAAA,EACC,GAAG;AAAA,EACH,GAAI,OAAO;AAAA,IACT,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAAA,EACjE;AAAgC;AAE7B,IAAM,cAAcG,OAAM;AAAA,EAC/B,CAAC,gBAAgB,QAAQ;AACvB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL,IAAI,aAAa,cAAc;AAC/B,UAAM,QAAQ,SAAS;AAIvB,UAAM,iBAAiB,aAAa,aAAa,aAAa;AAC9D,UAAM,WAAW,cAAc,MAAM,YAAY,KAAK,IAAI,CAAC;AAC3D,UAAM,WAAW,YAAY,IAAI;AAGjC,UAAM,oBAAoB,WAAW,iBAAiB;AACtD,UAAM,iBAAiB,MAAM,SAAS;AAEtC,UAAM,EAAE,cAAc,eAAe,IAAI,cAAc;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,IAAiB,CAAC;AAEpB,WACE,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX,UAAU,iBAAiB,SAAY;AAAA,QACvC;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA,cAAY,aAAa;AAAA,QACzB,MAAK;AAAA,QACL,eAAa,cAAc;AAAA,QAC1B,GAAG;AAAA,QAEH,uBAAa,IAAI,CAAC,MAAM,UACvB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA;AAAA,YACA,WAAW,aAAa;AAAA,YACxB;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,UAXK;AAAA,QAYP,CACD;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;","names":["Box","styled","React","alpha","alpha","jsx","styled","Box","React"]}
1
+ {"version":3,"sources":["../../src/components/navigation/Breadcrumbs/Breadcrumbs.tsx","../../src/components/navigation/Breadcrumbs/Breadcrumbs.styles.tsx","../../src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx"],"sourcesContent":["import ArrowForwardIos from '@mui/icons-material/ArrowForwardIos';\nimport ChevronRight from '@mui/icons-material/ChevronRight';\nimport NavigateNext from '@mui/icons-material/NavigateNext';\nimport {\n Box,\n Breadcrumbs as MuiBreadcrumbs,\n useMediaQuery,\n useTheme } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport {\n breadcrumbsBarStyles,\n sizeIconMap } from './Breadcrumbs.styles';\nimport { BreadcrumbEntry } from './BreadcrumbEntry';\nimport type { BreadcrumbItem,BreadcrumbsProps } from './Breadcrumbs.types';\n\n// Animation keyframes\nconst StyledBreadcrumbs = styled(MuiBreadcrumbs, {\n shouldForwardProp: (prop) =>\n prop !== 'size' && prop !== 'color' && prop !== 'visualStyle' && prop !== 'elevation' })<{ size?: string; color?: string; visualStyle?: string; elevation?: number }>(\n ({ theme, size, color, visualStyle, elevation = 0 }) => ({\n ...breadcrumbsBarStyles({ theme, size, color, visualStyle, elevation }) }),\n);\n\nconst AnimatedSeparator = styled(Box)(() => ({\n display: 'flex',\n alignItems: 'center',\n opacity: 0.6,\n transition: 'all 0.2s ease',\n\n '&:hover': {\n opacity: 1,\n transform: 'scale(1.1)' } }));\n\nconst getSeparator = (separatorType: string) => {\n const separatorContent = (() => {\n switch (separatorType) {\n case 'slash':\n return '/';\n case 'arrow':\n return <NavigateNext fontSize=\"small\" />;\n case 'chevron':\n return <ChevronRight fontSize=\"small\" />;\n case 'dot':\n return '•';\n case 'pipe':\n return '|';\n default:\n return <ArrowForwardIos sx={{ fontSize: 12 }} />;\n }\n })();\n\n return <AnimatedSeparator>{separatorContent}</AnimatedSeparator>;\n};\n\ntype DisplayItem = BreadcrumbItem & { isEllipsis?: boolean };\n\n// Long trails either hide their middle behind a menu or replace it with an\n// ellipsis crumb; short ones pass straight through.\nconst collapseItems = ({\n items,\n effectiveMaxItems,\n collapseBehavior }: {\n items: BreadcrumbItem[];\n effectiveMaxItems: number;\n collapseBehavior: string;\n}): { displayItems: DisplayItem[]; collapsedItems: BreadcrumbItem[] } => {\n if (items.length <= effectiveMaxItems) {\n return { displayItems: items, collapsedItems: [] };\n }\n\n if (collapseBehavior === 'menu') {\n const firstItem = items[0];\n const tail = items.slice(-(effectiveMaxItems - 2));\n\n return {\n displayItems: firstItem ? [firstItem, ...tail] : tail,\n collapsedItems: items.slice(1, -(effectiveMaxItems - 2)) };\n }\n\n if (collapseBehavior === 'ellipsis') {\n const half = Math.floor(effectiveMaxItems / 2);\n\n return {\n displayItems: [\n ...items.slice(0, half),\n { label: '...', href: '#', isEllipsis: true },\n ...items.slice(-half),\n ],\n collapsedItems: [] };\n }\n\n return { displayItems: items, collapsedItems: [] };\n};\n\ntype BreadcrumbsDefaultedKeys =\n | 'variant'\n | 'separatorType'\n | 'maxItems'\n | 'showHomeIcon'\n | 'size'\n | 'color'\n | 'elevation'\n | 'collapseBehavior'\n | 'mobileMaxItems';\n\ntype ResolvedBreadcrumbsProps = BreadcrumbsProps &\n Required<Pick<BreadcrumbsProps, BreadcrumbsDefaultedKeys>>;\n\nconst BREADCRUMBS_DEFAULTS: Pick<BreadcrumbsProps, BreadcrumbsDefaultedKeys> = {\n variant: 'default',\n separatorType: 'default',\n maxItems: 8,\n showHomeIcon: true,\n size: 'md',\n color: 'neutral',\n elevation: 1,\n collapseBehavior: 'menu',\n mobileMaxItems: 3 };\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would. Applied as\n// a merge rather than destructuring defaults, which would otherwise put nine\n// branches into the component's own complexity budget.\nconst resolveProps = (props: BreadcrumbsProps): ResolvedBreadcrumbsProps =>\n ({\n ...BREADCRUMBS_DEFAULTS,\n ...(Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<BreadcrumbsProps>) }) as ResolvedBreadcrumbsProps;\n\nexport const Breadcrumbs = React.forwardRef<HTMLElement, BreadcrumbsProps>(\n (componentProps, ref) => {\n const {\n variant,\n separatorType,\n items,\n separator,\n maxItems,\n showHomeIcon,\n size,\n color,\n elevation,\n collapseBehavior,\n mobileMaxItems,\n ariaLabel,\n copy,\n dataTestId,\n ...props\n } = resolveProps(componentProps);\n const theme = useTheme();\n // separatorType picks a built-in separator; an explicit `separator` wins.\n // This was computed before but never passed on, so separatorType had no\n // effect on what rendered.\n const finalSeparator = separator || getSeparator(separatorType);\n const isMobile = useMediaQuery(theme.breakpoints.down('sm'));\n const iconSize = sizeIconMap[size];\n\n // Handle mobile collapsing\n const effectiveMaxItems = isMobile ? mobileMaxItems : maxItems;\n const shouldCollapse = items.length > effectiveMaxItems;\n\n const { displayItems, collapsedItems } = collapseItems({\n items,\n effectiveMaxItems,\n collapseBehavior });\n\n return (\n <StyledBreadcrumbs\n ref={ref}\n separator={finalSeparator}\n maxItems={shouldCollapse ? undefined : effectiveMaxItems}\n size={size}\n color={color}\n visualStyle={variant}\n elevation={elevation}\n aria-label={ariaLabel || 'breadcrumb navigation'}\n role=\"navigation\"\n data-testid={dataTestId || 'breadcrumbs'}\n {...props}\n >\n {displayItems.map((item, index) => (\n <BreadcrumbEntry\n copy={copy}\n key={index}\n item={item}\n index={index}\n itemCount={displayItems.length}\n collapsedItems={collapsedItems}\n collapseBehavior={collapseBehavior}\n separator={finalSeparator}\n showHomeIcon={showHomeIcon}\n iconSize={iconSize}\n size={size}\n variant={variant}\n dataTestId={dataTestId}\n />\n ))}\n </StyledBreadcrumbs>\n );\n },\n);\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n","import { alpha, keyframes } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nexport const slideIn = keyframes`\n from {\n opacity: 0;\n transform: translateX(-10px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const pulse = keyframes`\n 0% {\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.4);\n }\n 70% {\n box-shadow: 0 0 0 10px rgba(99, 102, 241, 0);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(99, 102, 241, 0);\n }\n`;\n\nconst BAR_VARIANTS: Record<string, (theme: Theme, elevation: number) => CSSObject> = {\n glass: (theme, elevation) => ({\n background:\n theme.palette.mode === 'dark' ? 'rgba(17, 24, 39, 0.7)' : 'rgba(255, 255, 255, 0.7)',\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${\n theme.palette.mode === 'dark' ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)'\n }`,\n boxShadow:\n theme.palette.mode === 'dark'\n ? `0 ${elevation * 4}px ${elevation * 8}px rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1)`\n : `0 ${elevation * 4}px ${elevation * 8}px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.8)` }),\n elevated: (theme, elevation) => ({\n background: theme.palette.background.paper,\n boxShadow: theme.shadows[elevation] || theme.shadows[1],\n borderRadius: theme.spacing(1.5) }),\n outlined: (theme, _elevation) => ({\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.spacing(1) }) };\n\n// Spacing and colour for the separator glyphs between crumbs.\nconst separatorStyles = (\n theme: Theme,\n size: string | undefined,\n color: string | undefined,\n _visualStyle: string | undefined,\n): CSSObject => ({\n '& .MuiBreadcrumbs-separator': {\n marginLeft: theme.spacing(size === 'sm' ? 0.5 : size === 'lg' ? 1.5 : 1),\n marginRight: theme.spacing(size === 'sm' ? 0.5 : size === 'lg' ? 1.5 : 1),\n opacity: 0.6,\n transition: 'all 0.2s ease',\n ...(color === 'primary' && {\n color: theme.palette.primary.main }),\n ...(color === 'secondary' && {\n color: theme.palette.secondary.main }) } });\n\n// Only one visual style applies at a time, so a lookup replaces three mutually\n// exclusive spreads.\nconst barVariantStyles = (theme: Theme, visualStyle: string | undefined, elevation: number): CSSObject =>\n visualStyle ? (BAR_VARIANTS[visualStyle]?.(theme, elevation) ?? {}) : {};\n\n// The bar's own styling, lifted out so the styled() callback is a single spread\n// rather than seventy lines of conditionals.\nexport const breadcrumbsBarStyles = ({\n theme,\n size,\n color,\n visualStyle,\n elevation = 0 }: {\n theme: Theme;\n size?: string;\n color?: string;\n visualStyle?: string;\n elevation?: number;\n}): CSSObject => ({\n padding: theme.spacing(size === 'sm' ? 0.75 : size === 'lg' ? 1.5 : 1, 2),\n borderRadius: theme.spacing(visualStyle === 'glass' ? 2 : 1),\n ...barVariantStyles(theme, visualStyle, elevation),\n animation: `${slideIn} 0.3s ease-out`,\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n position: 'relative',\n\n // Glass morphism effect\n\n\n // Elevated variant\n\n\n // Outlined variant\n\n\n '& .MuiBreadcrumbs-ol': {\n alignItems: 'center',\n flexWrap: 'nowrap',\n [theme.breakpoints.down('sm')]: {\n flexWrap: 'wrap',\n gap: theme.spacing(0.5) } },\n\n ...separatorStyles(theme, size, color, visualStyle),\n\n\n '&:hover': {\n ...(visualStyle === 'glass' && {\n background:\n theme.palette.mode === 'dark' ? 'rgba(17, 24, 39, 0.85)' : 'rgba(255, 255, 255, 0.85)',\n boxShadow:\n theme.palette.mode === 'dark'\n ? `0 ${elevation * 6}px ${elevation * 12}px rgba(0, 0, 0, 0.4)`\n : `0 ${elevation * 6}px ${elevation * 12}px rgba(0, 0, 0, 0.12)` }) } });\n\n// The idle glass treatment and the active-crumb treatment are mutually\n// exclusive; keeping them as named pieces takes both branches out of the main\n// style function.\nconst linkGlassIdleStyles = (theme: Theme): CSSObject => ({\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)`,\n opacity: 0,\n transition: 'opacity 0.3s ease',\n borderRadius: 'inherit' } });\n\nconst linkActiveStyles = (theme: Theme, visualStyle?: string): CSSObject => ({\n pointerEvents: 'none',\n cursor: 'default',\n color: theme.palette.primary.main,\n fontWeight: 600,\n\n ...(visualStyle === 'glass' && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)`,\n animation: `${pulse} 2s infinite` }) });\n\n// Hover treatment. The tint is a touch stronger on the glass variant so it still\n// reads against the translucent bar.\nconst linkHoverStyles = (theme: Theme, visualStyle?: string): CSSObject => ({\n '&:hover, &[data-hover=\"true\"]': {\n color: theme.palette.primary.main,\n backgroundColor: alpha(theme.palette.primary.main, visualStyle === 'glass' ? 0.1 : 0.08),\n transform: 'translateY(-1px)',\n\n '&::before': {\n opacity: 1 },\n\n '& .breadcrumb-icon': {\n transform: 'scale(1.1)' } } });\n\nexport const breadcrumbLinkStyles = ({\n theme,\n size,\n active,\n visualStyle }: {\n theme: Theme;\n size?: string;\n active?: boolean;\n visualStyle?: string;\n}): CSSObject => ({\n ...(visualStyle === 'glass' && !active ? linkGlassIdleStyles(theme) : {}),\n ...(active ? linkActiveStyles(theme, visualStyle) : {}),\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n textDecoration: 'none',\n fontSize: size === 'sm' ? '0.875rem' : size === 'lg' ? '1.125rem' : '1rem',\n fontWeight: active ? 600 : 400,\n color: active ? theme.palette.text.primary : theme.palette.text.secondary,\n padding: theme.spacing(0.5, 0.75),\n borderRadius: theme.spacing(0.75),\n position: 'relative',\n overflow: 'hidden',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n\n // Add subtle background for glass variant\n\n\n ...linkHoverStyles(theme, visualStyle),\n\n\n '&:active': {\n transform: 'translateY(0)',\n backgroundColor: alpha(theme.palette.primary.main, 0.12) },\n\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n backgroundColor: alpha(theme.palette.primary.main, 0.04) },\n\n\n\n '& .breadcrumb-icon': {\n transition: 'transform 0.2s ease' },\n\n // Mobile responsiveness\n [theme.breakpoints.down('sm')]: {\n fontSize: size === 'lg' ? '1rem' : size === 'sm' ? '0.75rem' : '0.875rem',\n padding: theme.spacing(0.375, 0.5) } });\n\nexport const sizeIconMap = {\n xs: 'small',\n sm: 'small',\n md: 'small',\n lg: 'medium',\n xl: 'medium',\n} as const;\n","import Home from '@mui/icons-material/Home';\nimport MoreHoriz from '@mui/icons-material/MoreHoriz';\nimport { alpha, Box, Fade, Link, Tooltip, Typography } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { breadcrumbLinkStyles } from './Breadcrumbs.styles';\nimport type { BreadcrumbItem } from './Breadcrumbs.types';\nimport type { BreadcrumbCopy } from '../../../copy';\n\nconst BreadcrumbLink = styled(Link, {\n shouldForwardProp: (prop) => prop !== 'size' && prop !== 'active' && prop !== 'visualStyle' })<{ size?: string; active?: boolean; visualStyle?: string }>(\n ({ theme, size, active, visualStyle }) => ({\n ...breadcrumbLinkStyles({ theme, size, active, visualStyle }) }),\n);\n\nconst BreadcrumbText = styled(Typography, {\n shouldForwardProp: (prop) => prop !== 'size' && prop !== 'visualStyle' })<{ size?: string; visualStyle?: string }>(({ theme, size, visualStyle }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(0.5),\n fontSize: size === 'sm' ? '0.875rem' : size === 'lg' ? '1.125rem' : '1rem',\n fontWeight: 600,\n color: theme.palette.primary.main,\n padding: theme.spacing(0.5, 0.75),\n borderRadius: theme.spacing(0.75),\n position: 'relative',\n\n ...(visualStyle === 'glass' && {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.1)} 0%, ${alpha(theme.palette.primary.main, 0.05)} 100%)`,\n backdropFilter: 'blur(4px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}` }),\n\n '& .breadcrumb-icon': {\n color: theme.palette.primary.main },\n\n // Mobile responsiveness\n [theme.breakpoints.down('sm')]: {\n fontSize: size === 'lg' ? '1rem' : size === 'sm' ? '0.75rem' : '0.875rem',\n padding: theme.spacing(0.375, 0.5) } }));\n\n// Animated separator wrapper\n\n// Mobile collapsed menu component\n// The list that drops down from the \"...\" trigger.\nconst CollapsedItemsPopover: React.FC<{\n open: boolean;\n items: BreadcrumbItem[];\n size: string;\n visualStyle?: string;\n dataTestId?: string;\n onSelect: () => void;\n}> = ({ open, items, dataTestId, onSelect }) => (\n<Fade in={open}>\n <Box\n sx={{\n background: (theme) =>\n theme.palette.mode === 'dark'\n ? 'rgba(17, 24, 39, 0.95)'\n : 'rgba(255, 255, 255, 0.95)',\n backdropFilter: 'blur(10px)',\n borderRadius: 1,\n boxShadow: 3,\n p: 1,\n minWidth: 150 }}\n >\n {items.map((item, index) => (\n <Box\n key={index}\n component=\"a\"\n href={item.href || '#'}\n onClick={(e) => {\n onSelect();\n item.onClick?.(e);\n }}\n sx={{\n display: 'block',\n px: 2,\n py: 1,\n color: 'text.secondary',\n textDecoration: 'none',\n borderRadius: 0.5,\n transition: 'all 0.2s',\n '&:hover': {\n backgroundColor: 'action.hover',\n color: 'primary.main' } }}\n data-testid={dataTestId ? `${dataTestId}-collapsed-item-${index}` : `breadcrumbs-collapsed-item-${index}`}\n >\n {item.label}\n </Box>\n ))}\n </Box>\n </Fade>\n);\n\nconst CollapsedMenu = ({\n items,\n size,\n visualStyle,\n copy,\n dataTestId }: {\n items: BreadcrumbItem[];\n size: string;\n visualStyle?: string;\n copy: BreadcrumbCopy;\n dataTestId?: string;\n}) => {\n const [anchorEl, setAnchorEl] = React.useState<null | HTMLElement>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = (event: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Tooltip title={copy.showMore} arrow>\n <BreadcrumbLink\n onClick={handleClick}\n size={size}\n visualStyle={visualStyle}\n sx={{ cursor: 'pointer' }}\n data-testid={dataTestId ? `${dataTestId}-collapsed-menu` : 'breadcrumbs-collapsed-menu'}\n >\n <MoreHoriz className=\"breadcrumb-icon\" />\n </BreadcrumbLink>\n </Tooltip>\n <Box\n sx={{\n position: 'absolute',\n top: '100%',\n left: 0,\n mt: 1,\n display: open ? 'block' : 'none',\n zIndex: 1000 }}\n data-testid={dataTestId ? `${dataTestId}-collapsed-menu-items` : 'breadcrumbs-collapsed-menu-items'}\n >\n <CollapsedItemsPopover\n open={open}\n items={items}\n size={size}\n visualStyle={visualStyle}\n dataTestId={dataTestId}\n onSelect={handleClose}\n />\n </Box>\n </>\n );\n};\n\n// The leading crumb gets a house unless it brings its own icon; everything else\n// shows only what it supplies.\nconst crumbIcon = ({\n item,\n isFirst,\n showHomeIcon,\n iconSize }: {\n item: BreadcrumbItem;\n isFirst: boolean;\n showHomeIcon: boolean;\n iconSize: 'small' | 'medium';\n}) => {\n if (isFirst && showHomeIcon && !item.icon) {\n return <Home className=\"breadcrumb-icon\" fontSize={iconSize} />;\n }\n\n if (!item.icon) return null;\n\n return (\n <Box component=\"span\" className=\"breadcrumb-icon\" sx={{ display: 'flex', alignItems: 'center' }}>\n {item.icon}\n </Box>\n );\n};\n\nconst EllipsisCrumb: React.FC<{ label: string; copy: BreadcrumbCopy; dataTestId?: string }> = ({\n label,\n copy,\n dataTestId }) => (\n <Tooltip title={copy.moreItems} arrow>\n <Box\n sx={{\n px: 1,\n color: 'text.disabled',\n cursor: 'default',\n userSelect: 'none' }}\n data-testid={dataTestId ? `${dataTestId}-ellipsis` : 'breadcrumbs-ellipsis'}\n >\n {label}\n </Box>\n </Tooltip>\n);\n\n// The same conditional test id was written at each crumb variant. An item that\n// names its OWN id wins: see `BreadcrumbItem.dataTestId`.\nconst makeTestId =\n (dataTestId?: string) =>\n (suffix: string, own?: string): string =>\n own ?? (dataTestId ? `${dataTestId}-${suffix}` : `breadcrumbs-${suffix}`);\n\nconst ClickableCrumb: React.FC<{\n item: BreadcrumbItem;\n index: number;\n icon: React.ReactNode;\n size: string;\n variant: string;\n isActive: boolean;\n testId: (suffix: string, own?: string) => string;\n}> = ({ item, index, icon, size, variant, isActive, testId }) => (\n <Tooltip title={item.tooltip || item.label} arrow disableHoverListener={!item.tooltip}>\n <BreadcrumbLink\n href={item.href || '#'}\n onClick={item.onClick}\n size={size}\n visualStyle={variant}\n active={isActive}\n underline=\"none\"\n aria-label={item.ariaLabel || item.label}\n data-testid={testId(`link-${index}`, item.dataTestId)}\n >\n {icon}\n <span>{item.label}</span>\n </BreadcrumbLink>\n </Tooltip>\n);\n\n// One crumb: the collapsed-menu stand-in, the ellipsis, the active tail item or\n// a plain link.\nexport const BreadcrumbEntry: React.FC<{\n item: BreadcrumbItem & { isEllipsis?: boolean };\n index: number;\n itemCount: number;\n collapsedItems: BreadcrumbItem[];\n collapseBehavior: string;\n separator: React.ReactNode;\n showHomeIcon: boolean;\n iconSize: 'small' | 'medium';\n size: string;\n variant: string;\n copy: BreadcrumbCopy;\n dataTestId?: string;\n}> = ({\n item,\n index,\n itemCount,\n collapsedItems,\n collapseBehavior,\n separator,\n showHomeIcon,\n iconSize,\n size,\n variant,\n copy,\n dataTestId }) => {\n const testId = makeTestId(dataTestId);\n const isLast = index === itemCount - 1;\n // The tail crumb is the current page unless it is the ellipsis placeholder.\n const isActive = item.active || (isLast && !item.isEllipsis);\n\n const isCollapsePoint =\n index === 1 && collapsedItems.length > 0 && collapseBehavior === 'menu';\n\n if (isCollapsePoint) {\n return (\n <>\n <CollapsedMenu\n copy={copy}\n items={collapsedItems}\n size={size}\n visualStyle={variant}\n dataTestId={dataTestId}\n />\n {separator}\n </>\n );\n }\n\n if (item.isEllipsis) {\n return <EllipsisCrumb copy={copy} label={item.label} dataTestId={dataTestId} />;\n }\n\n const icon = crumbIcon({ item, isFirst: index === 0, showHomeIcon, iconSize });\n\n if (isActive) {\n return (\n <BreadcrumbText\n size={size}\n visualStyle={variant}\n aria-current=\"page\"\n data-testid={testId(`item-${index}`, item.dataTestId)}\n >\n {icon}\n <span>{item.label}</span>\n </BreadcrumbText>\n );\n }\n\n return (\n <ClickableCrumb\n item={item}\n index={index}\n icon={icon}\n size={size}\n variant={variant}\n isActive={isActive}\n testId={testId}\n />\n );\n};\n"],"mappings":"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","names":["Box","styled","React","alpha","alpha","jsx","styled","Box","React"]}
@@ -304,6 +304,7 @@ var CommandRow = ({ command, index, selected, dataTestId, onSelect, onExecute })
304
304
  );
305
305
  var slug = (value) => value.toLowerCase().replace(/\s+/g, "-");
306
306
  var PaletteResults = ({
307
+ copy,
307
308
  listRef,
308
309
  dataTestId,
309
310
  searchQuery,
@@ -323,7 +324,7 @@ var PaletteResults = ({
323
324
  searchQuery,
324
325
  '"'
325
326
  ] }),
326
- /* @__PURE__ */ jsx2(Typography, { variant: "caption", color: "text.disabled", sx: { mt: 1 }, children: "Try a different search term" })
327
+ /* @__PURE__ */ jsx2(Typography, { variant: "caption", color: "text.disabled", sx: { mt: 1 }, children: copy.tryAnotherTerm })
327
328
  ] });
328
329
  }
329
330
  const showRecentSection = !searchQuery && showRecent && recentCommandIds.length > 0;
@@ -349,7 +350,7 @@ var PaletteResults = ({
349
350
  showRecentSection && /* @__PURE__ */ jsxs(Fragment, { children: [
350
351
  /* @__PURE__ */ jsxs(CategoryLabel, { "data-testid": `${dataTestId}-group-recent`, children: [
351
352
  /* @__PURE__ */ jsx2(RecentIcon, { sx: { fontSize: 14, mr: 0.5, verticalAlign: "middle" } }),
352
- "Recent"
353
+ copy.recent
353
354
  ] }),
354
355
  recent.map(row),
355
356
  filteredCommands.length > recentCommandIds.length && /* @__PURE__ */ jsx2(Divider, { sx: { my: 1 } })
@@ -431,7 +432,10 @@ var PaletteSearch = ({ inputRef, placeholder, value, dataTestId, onChange, onClo
431
432
  ),
432
433
  /* @__PURE__ */ jsx3(IconButton, { size: "small", onClick: onClose, sx: { ml: 1 }, children: /* @__PURE__ */ jsx3(CloseIcon, { fontSize: "small" }) })
433
434
  ] });
434
- var PaletteFooter = ({ commandCount }) => {
435
+ var PaletteFooter = ({
436
+ commandCount,
437
+ copy
438
+ }) => {
435
439
  const theme = useTheme();
436
440
  return /* @__PURE__ */ jsxs2(
437
441
  Box2,
@@ -446,9 +450,16 @@ var PaletteFooter = ({ commandCount }) => {
446
450
  },
447
451
  children: [
448
452
  /* @__PURE__ */ jsxs2(Box2, { sx: { display: "flex", gap: 1 }, children: [
449
- /* @__PURE__ */ jsx3(ShortcutChip, { icon: /* @__PURE__ */ jsx3(EnterIcon, { sx: { fontSize: 12 } }), label: "Execute", size: "small" }),
450
- /* @__PURE__ */ jsx3(ShortcutChip, { label: "\u2191\u2193 Navigate", size: "small" }),
451
- /* @__PURE__ */ jsx3(ShortcutChip, { label: "ESC Close", size: "small" })
453
+ /* @__PURE__ */ jsx3(
454
+ ShortcutChip,
455
+ {
456
+ icon: /* @__PURE__ */ jsx3(EnterIcon, { sx: { fontSize: 12 } }),
457
+ label: copy.execute,
458
+ size: "small"
459
+ }
460
+ ),
461
+ /* @__PURE__ */ jsx3(ShortcutChip, { label: copy.navigate, size: "small" }),
462
+ /* @__PURE__ */ jsx3(ShortcutChip, { label: copy.close, size: "small" })
452
463
  ] }),
453
464
  /* @__PURE__ */ jsxs2(Typography2, { variant: "caption", color: "text.secondary", children: [
454
465
  commandCount,
@@ -459,6 +470,7 @@ var PaletteFooter = ({ commandCount }) => {
459
470
  );
460
471
  };
461
472
  var CommandPalette = ({
473
+ copy,
462
474
  open,
463
475
  onClose,
464
476
  commands,
@@ -516,6 +528,7 @@ var CommandPalette = ({
516
528
  /* @__PURE__ */ jsx3(
517
529
  PaletteResults,
518
530
  {
531
+ copy,
519
532
  listRef,
520
533
  dataTestId,
521
534
  searchQuery,
@@ -529,7 +542,7 @@ var CommandPalette = ({
529
542
  onExecute: executeCommand
530
543
  }
531
544
  ),
532
- /* @__PURE__ */ jsx3(PaletteFooter, { commandCount: filteredCommands.length })
545
+ /* @__PURE__ */ jsx3(PaletteFooter, { copy, commandCount: filteredCommands.length })
533
546
  ] }) })
534
547
  }
535
548
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/navigation/CommandPalette/CommandPalette.tsx","../../src/components/navigation/CommandPalette/CommandPalette.hooks.ts","../../src/components/navigation/CommandPalette/CommandPalette.helpers.ts","../../src/components/navigation/CommandPalette/CommandPaletteResults.tsx","../../src/components/navigation/CommandPalette/ShortcutChip.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport EnterIcon from '@mui/icons-material/KeyboardReturn';\nimport SearchIcon from '@mui/icons-material/Search';\nimport {\n alpha,\n Box,\n Dialog,\n DialogContent,\n IconButton,\n InputBase,\n Paper,\n Slide,\n styled,\n Typography,\n useTheme } from '@mui/material';\nimport type { TransitionProps } from '@mui/material/transitions';\nimport type { FC} from 'react';\nimport React, { } from 'react';\n\nimport { useCommandPalette } from './CommandPalette.hooks';\nimport { PaletteResults } from './CommandPaletteResults';\nimport { ShortcutChip } from './ShortcutChip';\nimport type { CommandPaletteProps } from './CommandPalette.types';\n\n// Styled components\nconst StyledDialog = styled(Dialog)(() => ({\n '& .MuiBackdrop-root': {\n backgroundColor: alpha('#000', 0.6),\n backdropFilter: 'blur(4px)' },\n '& .MuiDialog-paper': {\n position: 'fixed',\n top: '20%',\n margin: 0,\n maxHeight: 'none',\n background: 'transparent',\n boxShadow: 'none',\n overflow: 'visible' } }));\n\nconst PaletteContainer = styled(Paper)(({ theme }) => ({\n width: '100%',\n maxWidth: 640,\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.98)} 0%, ${alpha(theme.palette.background.paper, 0.95)} 100%)`,\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,\n borderRadius: theme.shape.borderRadius * 2,\n overflow: 'hidden',\n boxShadow: theme.shadows[24] }));\n\nconst SearchContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(2),\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n background: alpha(theme.palette.background.default, 0.4) }));\n\nconst SearchInput = styled(InputBase)(({ theme }) => ({\n flex: 1,\n fontSize: '1.125rem',\n fontWeight: 400,\n '& input': {\n padding: theme.spacing(0, 1),\n '&::placeholder': {\n color: theme.palette.text.secondary,\n opacity: 0.8 } } }));\n\nconst Transition = React.forwardRef<unknown, TransitionProps & { children: React.ReactElement }>(\n function Transition(props, ref) {\n return <Slide direction=\"down\" ref={ref} {...props} />;\n },\n);\n\n// Main component\nconst PaletteSearch: React.FC<{\n inputRef: React.Ref<HTMLInputElement>;\n placeholder?: string;\n value: string;\n dataTestId?: string;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onClose: () => void;\n}> = ({ inputRef, placeholder, value, dataTestId, onChange, onClose }) => (\n <SearchContainer>\n <SearchIcon sx={{ color: 'text.secondary', mr: 1 }} />\n <SearchInput\n ref={inputRef}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n inputProps={{ 'data-testid': `${dataTestId}-input` }}\n />\n <IconButton size=\"small\" onClick={onClose} sx={{ ml: 1 }}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </SearchContainer>\n);\n\nconst PaletteFooter: React.FC<{ commandCount: number }> = ({ commandCount }) => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 1,\n borderTop: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n background: alpha(theme.palette.background.default, 0.4) }}\n >\n <Box sx={{ display: 'flex', gap: 1 }}>\n <ShortcutChip icon={<EnterIcon sx={{ fontSize: 12 }} />} label=\"Execute\" size=\"small\" />\n <ShortcutChip label=\"↑↓ Navigate\" size=\"small\" />\n <ShortcutChip label=\"ESC Close\" size=\"small\" />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {commandCount} commands\n </Typography>\n </Box>\n );\n};\n\nexport const CommandPalette: FC<CommandPaletteProps> = ({\n open,\n onClose,\n commands,\n placeholder = 'Type a command or search...',\n width = '640px',\n maxHeight = '400px',\n showRecent = true,\n recentCommands = [],\n onCommandExecute,\n dataTestId = 'command-palette' }) => {\n const {\n searchQuery,\n setSearchQuery,\n selectedIndex,\n setSelectedIndex,\n searchInputRef,\n listRef,\n filteredCommands,\n groupedCommands,\n executeCommand,\n recentCommandIds } = useCommandPalette({\n open,\n commands,\n showRecent,\n recentCommands,\n onCommandExecute,\n onClose });\n\n const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(event.target.value);\n };\n\n return (\n <StyledDialog\n open={open}\n onClose={onClose}\n TransitionComponent={Transition}\n maxWidth={false}\n fullWidth\n data-testid={dataTestId}\n >\n <DialogContent sx={{ overflow: 'visible', p: 0 }}>\n <PaletteContainer elevation={24} sx={{ width, maxHeight }}>\n <PaletteSearch\n inputRef={searchInputRef}\n placeholder={placeholder}\n value={searchQuery}\n dataTestId={dataTestId}\n onChange={handleSearchChange}\n onClose={onClose}\n />\n\n <PaletteResults\n listRef={listRef}\n dataTestId={dataTestId}\n searchQuery={searchQuery}\n showRecent={showRecent}\n commands={commands}\n recentCommandIds={recentCommandIds}\n filteredCommands={filteredCommands}\n groupedCommands={groupedCommands}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n onExecute={executeCommand}\n />\n\n <PaletteFooter commandCount={filteredCommands.length} />\n </PaletteContainer>\n </DialogContent>\n </StyledDialog>\n );\n};\n\n// Export default\nexport default CommandPalette;\n","import Fuse from 'fuse.js';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n createPaletteKeyHandler,\n filterCommands,\n groupByCategory,\n} from './CommandPalette.helpers';\nimport type { PaletteCommand } from './CommandPalette.types';\n\nconst RECENT_LIMIT = 5;\nconst FOCUS_DELAY_MS = 100;\n\n// The fuzzy index and the two derived lists it feeds.\nconst useCommandSearch = ({\n commands,\n searchQuery,\n showRecent,\n recentCommandIds,\n}: {\n commands: PaletteCommand[];\n searchQuery: string;\n showRecent?: boolean;\n recentCommandIds: string[];\n}) => {\n const fuse = useMemo(\n () =>\n new Fuse(commands, {\n keys: ['label', 'description', 'keywords', 'category'],\n threshold: 0.3,\n includeScore: true,\n }),\n [commands],\n );\n\n const filteredCommands = useMemo(\n () => filterCommands({ commands, searchQuery, fuse, showRecent, recentCommandIds }),\n [searchQuery, commands, fuse, showRecent, recentCommandIds],\n );\n\n const groupedCommands = useMemo(() => groupByCategory(filteredCommands), [filteredCommands]);\n\n return { filteredCommands, groupedCommands };\n};\n\n// Running a command records it as recent, fires the caller's callback and closes\n// the palette.\nconst useExecuteCommand = ({\n setRecentCommandIds,\n onCommandExecute,\n onClose,\n}: {\n setRecentCommandIds: React.Dispatch<React.SetStateAction<string[]>>;\n onCommandExecute?: (command: PaletteCommand) => void;\n onClose: () => void;\n}) =>\n useCallback(\n (command: PaletteCommand) => {\n setRecentCommandIds((prev) =>\n [command.id, ...prev.filter((id) => id !== command.id)].slice(0, RECENT_LIMIT),\n );\n\n command.action();\n onCommandExecute?.(command);\n onClose();\n },\n [setRecentCommandIds, onCommandExecute, onClose],\n );\n\n// The highlight resets on every new query; opening the palette focuses the input\n// and closing it clears the query.\nconst useSelectionReset = ({\n open,\n searchQuery,\n searchInputRef,\n setSearchQuery,\n setSelectedIndex,\n}: {\n open: boolean;\n searchQuery: string;\n searchInputRef: React.RefObject<HTMLInputElement | null>;\n setSearchQuery: React.Dispatch<React.SetStateAction<string>>;\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>;\n}) => {\n useEffect(() => {\n setSelectedIndex(0);\n }, [searchQuery, setSelectedIndex]);\n\n useEffect(() => {\n if (open) {\n window.setTimeout(() => {\n searchInputRef.current?.focus();\n }, FOCUS_DELAY_MS);\n return;\n }\n\n setSearchQuery('');\n setSelectedIndex(0);\n }, [open, searchInputRef, setSearchQuery, setSelectedIndex]);\n};\n\n// Global key handling while the palette is open, plus keeping the highlighted\n// row scrolled into view.\nconst usePaletteKeyboard = ({\n open,\n selectedIndex,\n filteredCommands,\n listRef,\n setSelectedIndex,\n executeCommand,\n onClose,\n}: {\n open: boolean;\n selectedIndex: number;\n filteredCommands: PaletteCommand[];\n listRef: React.RefObject<globalThis.HTMLUListElement | null>;\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>;\n executeCommand: (command: PaletteCommand) => void;\n onClose: () => void;\n}) => {\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = createPaletteKeyHandler({\n commandCount: filteredCommands.length,\n selectedCommand: filteredCommands[selectedIndex],\n setSelectedIndex,\n executeCommand,\n onClose,\n });\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [open, selectedIndex, filteredCommands, setSelectedIndex, executeCommand, onClose]);\n\n useEffect(() => {\n const selectedElement = listRef.current?.querySelector(\n `[data-index=\"${selectedIndex}\"]`,\n ) as HTMLElement | null;\n\n selectedElement?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, [selectedIndex, listRef]);\n};\n\n// All of the palette's state: the query, the highlighted row, the derived lists\n// and the effects that keep them in sync. Grouped here so the exported component\n// is prop defaults plus markup.\nexport const useCommandPalette = ({\n open,\n commands,\n showRecent,\n recentCommands,\n onCommandExecute,\n onClose,\n}: {\n open: boolean;\n commands: PaletteCommand[];\n showRecent?: boolean;\n recentCommands: string[];\n onCommandExecute?: (command: PaletteCommand) => void;\n onClose: () => void;\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [recentCommandIds, setRecentCommandIds] = useState<string[]>(recentCommands);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<globalThis.HTMLUListElement>(null);\n\n const { filteredCommands, groupedCommands } = useCommandSearch({\n commands,\n searchQuery,\n showRecent,\n recentCommandIds,\n });\n\n const executeCommand = useExecuteCommand({ setRecentCommandIds, onCommandExecute, onClose });\n\n useSelectionReset({ open, searchQuery, searchInputRef, setSearchQuery, setSelectedIndex });\n\n usePaletteKeyboard({\n open,\n selectedIndex,\n filteredCommands,\n listRef,\n setSelectedIndex,\n executeCommand,\n onClose,\n });\n\n return {\n searchQuery,\n setSearchQuery,\n selectedIndex,\n setSelectedIndex,\n searchInputRef,\n listRef,\n filteredCommands,\n groupedCommands,\n executeCommand,\n recentCommandIds,\n };\n};\n","import type Fuse from 'fuse.js';\nimport type React from 'react';\n\nimport type { PaletteCommand } from './CommandPalette.types';\n\n// Without a query the list is the recent commands first, then the rest; with one\n// it is whatever fuzzy search returns.\nexport const filterCommands = ({\n commands,\n searchQuery,\n fuse,\n showRecent,\n recentCommandIds,\n}: {\n commands: PaletteCommand[];\n searchQuery: string;\n fuse: Fuse<PaletteCommand>;\n showRecent?: boolean;\n recentCommandIds: string[];\n}): PaletteCommand[] => {\n if (searchQuery) {\n return fuse.search(searchQuery).map((result) => result.item);\n }\n\n if (!showRecent || recentCommandIds.length === 0) {\n return commands;\n }\n\n const recent = recentCommandIds\n .map((id) => commands.find((command) => command.id === id))\n .filter(Boolean) as PaletteCommand[];\n\n return [...recent, ...commands.filter((command) => !recentCommandIds.includes(command.id))];\n};\n\nexport const groupByCategory = (commands: PaletteCommand[]): Record<string, PaletteCommand[]> => {\n const groups: Record<string, PaletteCommand[]> = {};\n\n for (const command of commands) {\n const category = command.category || 'General';\n groups[category] = groups[category] ?? [];\n groups[category].push(command);\n }\n\n return groups;\n};\n\n// Arrow keys move the highlight, Enter runs the highlighted command, Escape\n// closes. Built outside the effect so the switch does not count against the\n// component body.\nexport const createPaletteKeyHandler = ({\n commandCount,\n selectedCommand,\n setSelectedIndex,\n executeCommand,\n onClose,\n}: {\n commandCount: number;\n selectedCommand?: PaletteCommand;\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>;\n executeCommand: (command: PaletteCommand) => void;\n onClose: () => void;\n}) => (event: globalThis.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setSelectedIndex((prev) => (prev < commandCount - 1 ? prev + 1 : prev));\n break;\n case 'ArrowUp':\n event.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n break;\n case 'Enter':\n event.preventDefault();\n if (selectedCommand) executeCommand(selectedCommand);\n break;\n case 'Escape':\n event.preventDefault();\n onClose();\n break;\n }\n};\n","import RecentIcon from '@mui/icons-material/History';\nimport { Box, Divider, List, ListItem, ListItemIcon, ListItemText, Typography } from '@mui/material';\nimport { alpha, styled } from '@mui/material';\nimport React from 'react';\n\nimport { ShortcutChip } from './ShortcutChip';\nimport type { PaletteCommand } from './CommandPalette.types';\n\nconst ResultsList = styled(List)(({ theme }) => ({\n maxHeight: 400,\n overflowY: 'auto',\n padding: theme.spacing(1),\n '&::-webkit-scrollbar': {\n width: 8,\n },\n '&::-webkit-scrollbar-track': {\n background: alpha(theme.palette.action.disabled, 0.1),\n },\n '&::-webkit-scrollbar-thumb': {\n background: alpha(theme.palette.primary.main, 0.3),\n borderRadius: 4,\n '&:hover': {\n background: alpha(theme.palette.primary.main, 0.5),\n },\n },\n}));\n\nconst CommandItem = styled(ListItem)<{ selected?: boolean }>(({ theme, selected }) => ({\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(0.5),\n transition: theme.transitions.create(['background-color', 'transform']),\n cursor: 'pointer',\n ...(selected && {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n transform: 'translateX(4px)',\n '& .MuiListItemIcon-root': {\n color: theme.palette.primary.main,\n },\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n },\n}));\n\nconst CategoryLabel = styled(Typography)(({ theme }) => ({\n fontSize: '0.75rem',\n fontWeight: 600,\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.1em',\n padding: theme.spacing(1, 2, 0.5, 2),\n marginTop: theme.spacing(1),\n}));\n\nconst NoResults = styled(Box)(({ theme }) => ({\n padding: theme.spacing(4, 2),\n textAlign: 'center',\n color: theme.palette.text.secondary,\n}));\n\nconst CommandRow: React.FC<{\n command: PaletteCommand;\n index: number;\n selected: boolean;\n dataTestId?: string;\n onSelect: (index: number) => void;\n onExecute: (command: PaletteCommand) => void;\n}> = ({ command, index, selected, dataTestId, onSelect, onExecute }) => (\n <CommandItem\n data-index={index}\n data-testid={`${dataTestId}-item-${command.id}`}\n selected={selected}\n onClick={() => onExecute(command)}\n onMouseEnter={() => onSelect(index)}\n >\n {command.icon && <ListItemIcon sx={{ minWidth: 40 }}>{command.icon}</ListItemIcon>}\n <ListItemText\n primary={command.label}\n secondary={command.description}\n primaryTypographyProps={{ fontSize: '0.9rem', fontWeight: selected ? 500 : 400 }}\n secondaryTypographyProps={{ fontSize: '0.75rem' }}\n />\n {command.shortcut && <ShortcutChip label={command.shortcut} size=\"small\" />}\n </CommandItem>\n);\n\nconst slug = (value: string) => value.toLowerCase().replace(/\\s+/g, '-');\n\n// The list, its recent section and the empty state. The running commandIndex\n// has to stay consistent across both sections, so it is threaded through here\n// rather than mutated from inside the render as it was before.\nexport const PaletteResults: React.FC<{\n listRef: React.Ref<globalThis.HTMLUListElement>;\n dataTestId?: string;\n searchQuery: string;\n showRecent?: boolean;\n commands: PaletteCommand[];\n recentCommandIds: string[];\n filteredCommands: PaletteCommand[];\n groupedCommands: Record<string, PaletteCommand[]>;\n selectedIndex: number;\n onSelect: (index: number) => void;\n onExecute: (command: PaletteCommand) => void;\n}> = ({\n listRef,\n dataTestId,\n searchQuery,\n showRecent,\n commands,\n recentCommandIds,\n filteredCommands,\n groupedCommands,\n selectedIndex,\n onSelect,\n onExecute,\n}) => {\n if (filteredCommands.length === 0) {\n return (\n <NoResults data-testid={`${dataTestId}-no-results`}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No commands found for \"{searchQuery}\"\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ mt: 1 }}>\n Try a different search term\n </Typography>\n </NoResults>\n );\n }\n\n const showRecentSection = !searchQuery && showRecent && recentCommandIds.length > 0;\n const recent = showRecentSection\n ? (recentCommandIds\n .map((id) => commands.find((command) => command.id === id))\n .filter(Boolean) as PaletteCommand[])\n : [];\n\n // One running index across both sections, so keyboard selection lines up with\n // what is on screen.\n let commandIndex = 0;\n const row = (command: PaletteCommand) => {\n const index = commandIndex++;\n return (\n <CommandRow\n key={command.id}\n command={command}\n index={index}\n selected={index === selectedIndex}\n dataTestId={dataTestId}\n onSelect={onSelect}\n onExecute={onExecute}\n />\n );\n };\n\n const showCategoryLabels = Object.keys(groupedCommands).length > 1;\n\n return (\n <ResultsList ref={listRef} data-testid={`${dataTestId}-list`}>\n {showRecentSection && (\n <>\n <CategoryLabel data-testid={`${dataTestId}-group-recent`}>\n <RecentIcon sx={{ fontSize: 14, mr: 0.5, verticalAlign: 'middle' }} />\n Recent\n </CategoryLabel>\n {recent.map(row)}\n {filteredCommands.length > recentCommandIds.length && <Divider sx={{ my: 1 }} />}\n </>\n )}\n\n {Object.entries(groupedCommands).map(([category, categoryCommands]) => (\n <Box key={category} data-testid={`${dataTestId}-group-${slug(category)}`}>\n {showCategoryLabels && (\n <CategoryLabel data-testid={`${dataTestId}-group-label-${slug(category)}`}>\n {category}\n </CategoryLabel>\n )}\n {categoryCommands.map(row)}\n </Box>\n ))}\n </ResultsList>\n );\n};\n","import type { ChipProps } from '@mui/material';\nimport { Chip } from '@mui/material';\nimport React from 'react';\n\n// A plain component rather than styled(Chip): a styled component's inferred type\n// cannot be named across a module boundary in this package (TS2742), and both\n// the results list and the palette footer need this one.\nexport const ShortcutChip: React.FC<ChipProps> = (props) => (\n <Chip\n {...props}\n sx={{\n height: 20,\n fontSize: '0.7rem',\n fontFamily: 'monospace',\n ...props.sx,\n }}\n />\n);\n"],"mappings":"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","names":["alpha","Box","styled","Typography","React","jsx","jsx","jsxs","styled","alpha","Box","React","Transition","Typography"]}
1
+ {"version":3,"sources":["../../src/components/navigation/CommandPalette/CommandPalette.tsx","../../src/components/navigation/CommandPalette/CommandPalette.hooks.ts","../../src/components/navigation/CommandPalette/CommandPalette.helpers.ts","../../src/components/navigation/CommandPalette/CommandPaletteResults.tsx","../../src/components/navigation/CommandPalette/ShortcutChip.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport EnterIcon from '@mui/icons-material/KeyboardReturn';\nimport SearchIcon from '@mui/icons-material/Search';\nimport {\n alpha,\n Box,\n Dialog,\n DialogContent,\n IconButton,\n InputBase,\n Paper,\n Slide,\n styled,\n Typography,\n useTheme } from '@mui/material';\nimport type { TransitionProps } from '@mui/material/transitions';\nimport type { FC} from 'react';\nimport React, { } from 'react';\n\nimport { useCommandPalette } from './CommandPalette.hooks';\nimport { PaletteResults } from './CommandPaletteResults';\nimport { ShortcutChip } from './ShortcutChip';\nimport type { CommandPaletteProps } from './CommandPalette.types';\nimport type { CommandPaletteCopy } from '../../../copy';\n\n// Styled components\nconst StyledDialog = styled(Dialog)(() => ({\n '& .MuiBackdrop-root': {\n backgroundColor: alpha('#000', 0.6),\n backdropFilter: 'blur(4px)' },\n '& .MuiDialog-paper': {\n position: 'fixed',\n top: '20%',\n margin: 0,\n maxHeight: 'none',\n background: 'transparent',\n boxShadow: 'none',\n overflow: 'visible' } }));\n\nconst PaletteContainer = styled(Paper)(({ theme }) => ({\n width: '100%',\n maxWidth: 640,\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.98)} 0%, ${alpha(theme.palette.background.paper, 0.95)} 100%)`,\n backdropFilter: 'blur(20px)',\n WebkitBackdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.18)}`,\n borderRadius: theme.shape.borderRadius * 2,\n overflow: 'hidden',\n boxShadow: theme.shadows[24] }));\n\nconst SearchContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(2),\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n background: alpha(theme.palette.background.default, 0.4) }));\n\nconst SearchInput = styled(InputBase)(({ theme }) => ({\n flex: 1,\n fontSize: '1.125rem',\n fontWeight: 400,\n '& input': {\n padding: theme.spacing(0, 1),\n '&::placeholder': {\n color: theme.palette.text.secondary,\n opacity: 0.8 } } }));\n\nconst Transition = React.forwardRef<unknown, TransitionProps & { children: React.ReactElement }>(\n function Transition(props, ref) {\n return <Slide direction=\"down\" ref={ref} {...props} />;\n },\n);\n\n// Main component\nconst PaletteSearch: React.FC<{\n inputRef: React.Ref<HTMLInputElement>;\n placeholder?: string;\n value: string;\n dataTestId?: string;\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\n onClose: () => void;\n}> = ({ inputRef, placeholder, value, dataTestId, onChange, onClose }) => (\n <SearchContainer>\n <SearchIcon sx={{ color: 'text.secondary', mr: 1 }} />\n <SearchInput\n ref={inputRef}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck=\"false\"\n inputProps={{ 'data-testid': `${dataTestId}-input` }}\n />\n <IconButton size=\"small\" onClick={onClose} sx={{ ml: 1 }}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </SearchContainer>\n);\n\nconst PaletteFooter: React.FC<{ commandCount: number; copy: CommandPaletteCopy }> = ({\n commandCount,\n copy,\n}) => {\n const theme = useTheme();\n\n return (\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: 1,\n borderTop: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n background: alpha(theme.palette.background.default, 0.4) }}\n >\n <Box sx={{ display: 'flex', gap: 1 }}>\n <ShortcutChip\n icon={<EnterIcon sx={{ fontSize: 12 }} />}\n label={copy.execute}\n size=\"small\"\n />\n <ShortcutChip label={copy.navigate} size=\"small\" />\n <ShortcutChip label={copy.close} size=\"small\" />\n </Box>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {commandCount} commands\n </Typography>\n </Box>\n );\n};\n\nexport const CommandPalette: FC<CommandPaletteProps> = ({\n copy,\n open,\n onClose,\n commands,\n placeholder = 'Type a command or search...',\n width = '640px',\n maxHeight = '400px',\n showRecent = true,\n recentCommands = [],\n onCommandExecute,\n dataTestId = 'command-palette' }) => {\n const {\n searchQuery,\n setSearchQuery,\n selectedIndex,\n setSelectedIndex,\n searchInputRef,\n listRef,\n filteredCommands,\n groupedCommands,\n executeCommand,\n recentCommandIds } = useCommandPalette({\n open,\n commands,\n showRecent,\n recentCommands,\n onCommandExecute,\n onClose });\n\n const handleSearchChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(event.target.value);\n };\n\n return (\n <StyledDialog\n open={open}\n onClose={onClose}\n TransitionComponent={Transition}\n maxWidth={false}\n fullWidth\n data-testid={dataTestId}\n >\n <DialogContent sx={{ overflow: 'visible', p: 0 }}>\n <PaletteContainer elevation={24} sx={{ width, maxHeight }}>\n <PaletteSearch\n inputRef={searchInputRef}\n placeholder={placeholder}\n value={searchQuery}\n dataTestId={dataTestId}\n onChange={handleSearchChange}\n onClose={onClose}\n />\n\n <PaletteResults\n copy={copy}\n listRef={listRef}\n dataTestId={dataTestId}\n searchQuery={searchQuery}\n showRecent={showRecent}\n commands={commands}\n recentCommandIds={recentCommandIds}\n filteredCommands={filteredCommands}\n groupedCommands={groupedCommands}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n onExecute={executeCommand}\n />\n\n <PaletteFooter copy={copy} commandCount={filteredCommands.length} />\n </PaletteContainer>\n </DialogContent>\n </StyledDialog>\n );\n};\n\n// Export default\nexport default CommandPalette;\n","import Fuse from 'fuse.js';\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n createPaletteKeyHandler,\n filterCommands,\n groupByCategory,\n} from './CommandPalette.helpers';\nimport type { PaletteCommand } from './CommandPalette.types';\n\nconst RECENT_LIMIT = 5;\nconst FOCUS_DELAY_MS = 100;\n\n// The fuzzy index and the two derived lists it feeds.\nconst useCommandSearch = ({\n commands,\n searchQuery,\n showRecent,\n recentCommandIds,\n}: {\n commands: PaletteCommand[];\n searchQuery: string;\n showRecent?: boolean;\n recentCommandIds: string[];\n}) => {\n const fuse = useMemo(\n () =>\n new Fuse(commands, {\n keys: ['label', 'description', 'keywords', 'category'],\n threshold: 0.3,\n includeScore: true,\n }),\n [commands],\n );\n\n const filteredCommands = useMemo(\n () => filterCommands({ commands, searchQuery, fuse, showRecent, recentCommandIds }),\n [searchQuery, commands, fuse, showRecent, recentCommandIds],\n );\n\n const groupedCommands = useMemo(() => groupByCategory(filteredCommands), [filteredCommands]);\n\n return { filteredCommands, groupedCommands };\n};\n\n// Running a command records it as recent, fires the caller's callback and closes\n// the palette.\nconst useExecuteCommand = ({\n setRecentCommandIds,\n onCommandExecute,\n onClose,\n}: {\n setRecentCommandIds: React.Dispatch<React.SetStateAction<string[]>>;\n onCommandExecute?: (command: PaletteCommand) => void;\n onClose: () => void;\n}) =>\n useCallback(\n (command: PaletteCommand) => {\n setRecentCommandIds((prev) =>\n [command.id, ...prev.filter((id) => id !== command.id)].slice(0, RECENT_LIMIT),\n );\n\n command.action();\n onCommandExecute?.(command);\n onClose();\n },\n [setRecentCommandIds, onCommandExecute, onClose],\n );\n\n// The highlight resets on every new query; opening the palette focuses the input\n// and closing it clears the query.\nconst useSelectionReset = ({\n open,\n searchQuery,\n searchInputRef,\n setSearchQuery,\n setSelectedIndex,\n}: {\n open: boolean;\n searchQuery: string;\n searchInputRef: React.RefObject<HTMLInputElement | null>;\n setSearchQuery: React.Dispatch<React.SetStateAction<string>>;\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>;\n}) => {\n useEffect(() => {\n setSelectedIndex(0);\n }, [searchQuery, setSelectedIndex]);\n\n useEffect(() => {\n if (open) {\n window.setTimeout(() => {\n searchInputRef.current?.focus();\n }, FOCUS_DELAY_MS);\n return;\n }\n\n setSearchQuery('');\n setSelectedIndex(0);\n }, [open, searchInputRef, setSearchQuery, setSelectedIndex]);\n};\n\n// Global key handling while the palette is open, plus keeping the highlighted\n// row scrolled into view.\nconst usePaletteKeyboard = ({\n open,\n selectedIndex,\n filteredCommands,\n listRef,\n setSelectedIndex,\n executeCommand,\n onClose,\n}: {\n open: boolean;\n selectedIndex: number;\n filteredCommands: PaletteCommand[];\n listRef: React.RefObject<globalThis.HTMLUListElement | null>;\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>;\n executeCommand: (command: PaletteCommand) => void;\n onClose: () => void;\n}) => {\n useEffect(() => {\n if (!open) return;\n\n const handleKeyDown = createPaletteKeyHandler({\n commandCount: filteredCommands.length,\n selectedCommand: filteredCommands[selectedIndex],\n setSelectedIndex,\n executeCommand,\n onClose,\n });\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [open, selectedIndex, filteredCommands, setSelectedIndex, executeCommand, onClose]);\n\n useEffect(() => {\n const selectedElement = listRef.current?.querySelector(\n `[data-index=\"${selectedIndex}\"]`,\n ) as HTMLElement | null;\n\n selectedElement?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, [selectedIndex, listRef]);\n};\n\n// All of the palette's state: the query, the highlighted row, the derived lists\n// and the effects that keep them in sync. Grouped here so the exported component\n// is prop defaults plus markup.\nexport const useCommandPalette = ({\n open,\n commands,\n showRecent,\n recentCommands,\n onCommandExecute,\n onClose,\n}: {\n open: boolean;\n commands: PaletteCommand[];\n showRecent?: boolean;\n recentCommands: string[];\n onCommandExecute?: (command: PaletteCommand) => void;\n onClose: () => void;\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [recentCommandIds, setRecentCommandIds] = useState<string[]>(recentCommands);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<globalThis.HTMLUListElement>(null);\n\n const { filteredCommands, groupedCommands } = useCommandSearch({\n commands,\n searchQuery,\n showRecent,\n recentCommandIds,\n });\n\n const executeCommand = useExecuteCommand({ setRecentCommandIds, onCommandExecute, onClose });\n\n useSelectionReset({ open, searchQuery, searchInputRef, setSearchQuery, setSelectedIndex });\n\n usePaletteKeyboard({\n open,\n selectedIndex,\n filteredCommands,\n listRef,\n setSelectedIndex,\n executeCommand,\n onClose,\n });\n\n return {\n searchQuery,\n setSearchQuery,\n selectedIndex,\n setSelectedIndex,\n searchInputRef,\n listRef,\n filteredCommands,\n groupedCommands,\n executeCommand,\n recentCommandIds,\n };\n};\n","import type Fuse from 'fuse.js';\nimport type React from 'react';\n\nimport type { PaletteCommand } from './CommandPalette.types';\n\n// Without a query the list is the recent commands first, then the rest; with one\n// it is whatever fuzzy search returns.\nexport const filterCommands = ({\n commands,\n searchQuery,\n fuse,\n showRecent,\n recentCommandIds,\n}: {\n commands: PaletteCommand[];\n searchQuery: string;\n fuse: Fuse<PaletteCommand>;\n showRecent?: boolean;\n recentCommandIds: string[];\n}): PaletteCommand[] => {\n if (searchQuery) {\n return fuse.search(searchQuery).map((result) => result.item);\n }\n\n if (!showRecent || recentCommandIds.length === 0) {\n return commands;\n }\n\n const recent = recentCommandIds\n .map((id) => commands.find((command) => command.id === id))\n .filter(Boolean) as PaletteCommand[];\n\n return [...recent, ...commands.filter((command) => !recentCommandIds.includes(command.id))];\n};\n\nexport const groupByCategory = (commands: PaletteCommand[]): Record<string, PaletteCommand[]> => {\n const groups: Record<string, PaletteCommand[]> = {};\n\n for (const command of commands) {\n const category = command.category || 'General';\n groups[category] = groups[category] ?? [];\n groups[category].push(command);\n }\n\n return groups;\n};\n\n// Arrow keys move the highlight, Enter runs the highlighted command, Escape\n// closes. Built outside the effect so the switch does not count against the\n// component body.\nexport const createPaletteKeyHandler = ({\n commandCount,\n selectedCommand,\n setSelectedIndex,\n executeCommand,\n onClose,\n}: {\n commandCount: number;\n selectedCommand?: PaletteCommand;\n setSelectedIndex: React.Dispatch<React.SetStateAction<number>>;\n executeCommand: (command: PaletteCommand) => void;\n onClose: () => void;\n}) => (event: globalThis.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setSelectedIndex((prev) => (prev < commandCount - 1 ? prev + 1 : prev));\n break;\n case 'ArrowUp':\n event.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : prev));\n break;\n case 'Enter':\n event.preventDefault();\n if (selectedCommand) executeCommand(selectedCommand);\n break;\n case 'Escape':\n event.preventDefault();\n onClose();\n break;\n }\n};\n","import RecentIcon from '@mui/icons-material/History';\nimport { Box, Divider, List, ListItem, ListItemIcon, ListItemText, Typography } from '@mui/material';\nimport { alpha, styled } from '@mui/material';\nimport React from 'react';\n\nimport { ShortcutChip } from './ShortcutChip';\nimport type { PaletteCommand } from './CommandPalette.types';\nimport type { CommandPaletteCopy } from '../../../copy';\n\nconst ResultsList = styled(List)(({ theme }) => ({\n maxHeight: 400,\n overflowY: 'auto',\n padding: theme.spacing(1),\n '&::-webkit-scrollbar': {\n width: 8,\n },\n '&::-webkit-scrollbar-track': {\n background: alpha(theme.palette.action.disabled, 0.1),\n },\n '&::-webkit-scrollbar-thumb': {\n background: alpha(theme.palette.primary.main, 0.3),\n borderRadius: 4,\n '&:hover': {\n background: alpha(theme.palette.primary.main, 0.5),\n },\n },\n}));\n\nconst CommandItem = styled(ListItem)<{ selected?: boolean }>(({ theme, selected }) => ({\n borderRadius: theme.shape.borderRadius,\n marginBottom: theme.spacing(0.5),\n transition: theme.transitions.create(['background-color', 'transform']),\n cursor: 'pointer',\n ...(selected && {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n transform: 'translateX(4px)',\n '& .MuiListItemIcon-root': {\n color: theme.palette.primary.main,\n },\n }),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n },\n}));\n\nconst CategoryLabel = styled(Typography)(({ theme }) => ({\n fontSize: '0.75rem',\n fontWeight: 600,\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n letterSpacing: '0.1em',\n padding: theme.spacing(1, 2, 0.5, 2),\n marginTop: theme.spacing(1),\n}));\n\nconst NoResults = styled(Box)(({ theme }) => ({\n padding: theme.spacing(4, 2),\n textAlign: 'center',\n color: theme.palette.text.secondary,\n}));\n\nconst CommandRow: React.FC<{\n command: PaletteCommand;\n index: number;\n selected: boolean;\n dataTestId?: string;\n onSelect: (index: number) => void;\n onExecute: (command: PaletteCommand) => void;\n}> = ({ command, index, selected, dataTestId, onSelect, onExecute }) => (\n <CommandItem\n data-index={index}\n data-testid={`${dataTestId}-item-${command.id}`}\n selected={selected}\n onClick={() => onExecute(command)}\n onMouseEnter={() => onSelect(index)}\n >\n {command.icon && <ListItemIcon sx={{ minWidth: 40 }}>{command.icon}</ListItemIcon>}\n <ListItemText\n primary={command.label}\n secondary={command.description}\n primaryTypographyProps={{ fontSize: '0.9rem', fontWeight: selected ? 500 : 400 }}\n secondaryTypographyProps={{ fontSize: '0.75rem' }}\n />\n {command.shortcut && <ShortcutChip label={command.shortcut} size=\"small\" />}\n </CommandItem>\n);\n\nconst slug = (value: string) => value.toLowerCase().replace(/\\s+/g, '-');\n\n// The list, its recent section and the empty state. The running commandIndex\n// has to stay consistent across both sections, so it is threaded through here\n// rather than mutated from inside the render as it was before.\nexport const PaletteResults: React.FC<{\n copy: CommandPaletteCopy;\n listRef: React.Ref<globalThis.HTMLUListElement>;\n dataTestId?: string;\n searchQuery: string;\n showRecent?: boolean;\n commands: PaletteCommand[];\n recentCommandIds: string[];\n filteredCommands: PaletteCommand[];\n groupedCommands: Record<string, PaletteCommand[]>;\n selectedIndex: number;\n onSelect: (index: number) => void;\n onExecute: (command: PaletteCommand) => void;\n}> = ({\n copy,\n listRef,\n dataTestId,\n searchQuery,\n showRecent,\n commands,\n recentCommandIds,\n filteredCommands,\n groupedCommands,\n selectedIndex,\n onSelect,\n onExecute,\n}) => {\n if (filteredCommands.length === 0) {\n return (\n <NoResults data-testid={`${dataTestId}-no-results`}>\n <Typography variant=\"body2\" color=\"text.secondary\">\n No commands found for \"{searchQuery}\"\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\" sx={{ mt: 1 }}>\n {copy.tryAnotherTerm}\n </Typography>\n </NoResults>\n );\n }\n\n const showRecentSection = !searchQuery && showRecent && recentCommandIds.length > 0;\n const recent = showRecentSection\n ? (recentCommandIds\n .map((id) => commands.find((command) => command.id === id))\n .filter(Boolean) as PaletteCommand[])\n : [];\n\n // One running index across both sections, so keyboard selection lines up with\n // what is on screen.\n let commandIndex = 0;\n const row = (command: PaletteCommand) => {\n const index = commandIndex++;\n return (\n <CommandRow\n key={command.id}\n command={command}\n index={index}\n selected={index === selectedIndex}\n dataTestId={dataTestId}\n onSelect={onSelect}\n onExecute={onExecute}\n />\n );\n };\n\n const showCategoryLabels = Object.keys(groupedCommands).length > 1;\n\n return (\n <ResultsList ref={listRef} data-testid={`${dataTestId}-list`}>\n {showRecentSection && (\n <>\n <CategoryLabel data-testid={`${dataTestId}-group-recent`}>\n <RecentIcon sx={{ fontSize: 14, mr: 0.5, verticalAlign: 'middle' }} />\n {copy.recent}\n </CategoryLabel>\n {recent.map(row)}\n {filteredCommands.length > recentCommandIds.length && <Divider sx={{ my: 1 }} />}\n </>\n )}\n\n {Object.entries(groupedCommands).map(([category, categoryCommands]) => (\n <Box key={category} data-testid={`${dataTestId}-group-${slug(category)}`}>\n {showCategoryLabels && (\n <CategoryLabel data-testid={`${dataTestId}-group-label-${slug(category)}`}>\n {category}\n </CategoryLabel>\n )}\n {categoryCommands.map(row)}\n </Box>\n ))}\n </ResultsList>\n );\n};\n","import type { ChipProps } from '@mui/material';\nimport { Chip } from '@mui/material';\nimport React from 'react';\n\n// A plain component rather than styled(Chip): a styled component's inferred type\n// cannot be named across a module boundary in this package (TS2742), and both\n// the results list and the palette footer need this one.\nexport const ShortcutChip: React.FC<ChipProps> = (props) => (\n <Chip\n {...props}\n sx={{\n height: 20,\n fontSize: '0.7rem',\n fontFamily: 'monospace',\n ...props.sx,\n }}\n />\n);\n"],"mappings":"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","names":["alpha","Box","styled","Typography","React","jsx","jsx","jsxs","styled","alpha","Box","React","Transition","Typography"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Pagination
3
- } from "../chunk-JP55QWVR.js";
3
+ } from "../chunk-L7L6SX64.js";
4
4
  import "../chunk-PZ5AY32C.js";
5
5
  export {
6
6
  Pagination
@@ -298,7 +298,7 @@ var buildTabsSx = ({
298
298
  },
299
299
  ...disabled && { opacity: 0.6, pointerEvents: "none" }
300
300
  });
301
- var TabLabel = ({ item, onClose }) => {
301
+ var TabLabel = ({ item, closeTabLabel, onClose }) => {
302
302
  const content = /* @__PURE__ */ jsxs(Box2, { sx: { display: "flex", alignItems: "center", gap: 1 }, children: [
303
303
  item.icon,
304
304
  /* @__PURE__ */ jsx2("span", { children: item.label }),
@@ -308,7 +308,7 @@ var TabLabel = ({ item, onClose }) => {
308
308
  onClick: (e) => onClose(e, item.id),
309
309
  role: "button",
310
310
  tabIndex: 0,
311
- "aria-label": "Close tab",
311
+ "aria-label": closeTabLabel,
312
312
  onKeyDown: (e) => {
313
313
  if (e.key !== "Enter" && e.key !== " ") return;
314
314
  onClose(e, item.id);
@@ -348,7 +348,7 @@ var TabsBar = ({ rest, items, value, onChange, onCloseTab, dataTestId, ...p }) =
348
348
  MuiTab,
349
349
  {
350
350
  value: item.id,
351
- label: /* @__PURE__ */ jsx2(TabLabel, { item, onClose: onCloseTab }),
351
+ label: /* @__PURE__ */ jsx2(TabLabel, { closeTabLabel: p.closeTabLabel, item, onClose: onCloseTab }),
352
352
  disabled: item.disabled || p.disabled,
353
353
  className: item.className,
354
354
  id: `tab-${item.id}`,
@@ -392,6 +392,10 @@ var Tabs = React.forwardRef(
392
392
  (tabsProps, ref) => {
393
393
  const resolved = { ...TABS_DEFAULTS, ...definedProps(tabsProps) };
394
394
  const {
395
+ // Destructured only to keep it OUT of `rest`, which is spread onto the
396
+ // DOM node — `{...resolved}` below is what actually carries it to
397
+ // `TabsBar`. Same reason as `value` on the next line.
398
+ closeTabLabel: _closeTabLabel,
395
399
  value: _value,
396
400
  onChange,
397
401
  onTabClose,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/navigation/Tabs/Tabs.tsx","../../src/components/navigation/Tabs/TabsPanel.tsx","../../src/components/navigation/Tabs/Tabs.styles.ts"],"sourcesContent":["import Close from '@mui/icons-material/Close';\nimport {\n alpha,\n Badge,\n Box,\n Divider,\n Tab as MuiTab,\n Tabs as MuiTabs } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { CustomTabPanel } from './TabsPanel';\nimport { tabsRootStyles } from './Tabs.styles';\nimport type { TabItem, TabsProps } from './Tabs.types';\n\nconst StyledTabs = styled(MuiTabs, {\n shouldForwardProp: (prop) => !['customVariant', 'size', 'showDividers'].includes(prop as string) })<{ customVariant?: string; size?: string; showDividers?: boolean }>(\n ({ theme, customVariant, size, showDividers }) => ({\n ...tabsRootStyles({ theme, customVariant, size, showDividers }) }),\n);\n\nconst CloseButton = styled(Box)(({ theme }) => ({\n marginLeft: theme.spacing(0.5),\n padding: theme.spacing(0.25),\n width: 20,\n height: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n borderRadius: '50%',\n color: theme.palette.action.active,\n '&:hover': {\n backgroundColor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main } }));\n\nconst BadgeWrapper = styled(Badge)(() => ({\n '& .MuiBadge-badge': {\n right: -6,\n top: 4,\n fontSize: '0.75rem',\n minWidth: 16,\n height: 16,\n padding: 0 } }));\n\nconst TABS_DEFAULTS: Partial<TabsProps> = {\n variant: 'default',\n size: 'md',\n color: 'primary',\n fullWidth: false,\n orientation: 'horizontal',\n showDividers: false,\n centered: false,\n scrollable: false,\n scrollButtons: 'auto',\n sticky: false,\n stickyOffset: 0,\n animateContent: false,\n animationDuration: 300,\n persistContent: false,\n disabled: false,\n loading: false };\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}`\n// still falls back to the default as a destructuring default would.\nconst definedProps = (props: TabsProps): Partial<TabsProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<TabsProps>;\n\n// Once the row is scrollable every accepted scrollButtons value ends up as\n// MUI's 'auto'. That is exactly what the previous nested ternary did — it mapped\n// 'on'/'off'/'desktop' to 'auto', and its remaining branch could only ever be\n// 'auto' anyway — so the behaviour is preserved here rather than quietly\n// changed. Worth knowing that scrollButtons=\"off\" therefore still shows buttons.\nconst resolveScrollButtons = (scrollable?: boolean): 'auto' | false =>\n scrollable ? 'auto' : false;\n\nconst buildTabsSx = ({\n fullWidth,\n sticky,\n stickyOffset,\n indicatorColor,\n disabled }: {\n fullWidth?: boolean;\n sticky?: boolean;\n stickyOffset?: number;\n indicatorColor?: string;\n disabled?: boolean;\n}) => ({\n ...(fullWidth && { width: '100%' }),\n // Pin the tab list while panels scroll beneath it. Opaque background + bottom\n // divider so scrolled content does not show through.\n ...(sticky && {\n position: 'sticky',\n top: stickyOffset,\n zIndex: 2,\n backgroundColor: 'background.default',\n borderBottom: 1,\n borderColor: 'divider' }),\n ...(indicatorColor && {\n '& .MuiTabs-indicator': { backgroundColor: indicatorColor } }),\n ...(disabled && { opacity: 0.6, pointerEvents: 'none' }) });\n\n// A tab's label: icon, text, optional close affordance, optionally badged.\nconst TabLabel: React.FC<{\n item: TabItem;\n onClose: (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => void;\n}> = ({ item, onClose }) => {\n const content = (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {item.icon}\n <span>{item.label}</span>\n {item.closable && (\n <CloseButton\n onClick={(e) => onClose(e, item.id)}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Close tab\"\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n onClose(e, item.id);\n }}\n >\n <Close fontSize=\"inherit\" />\n </CloseButton>\n )}\n </Box>\n );\n\n if (item.badge === undefined) return content;\n\n return (\n <BadgeWrapper badgeContent={item.badge} color=\"error\">\n {content}\n </BadgeWrapper>\n );\n};\n\ntype ResolvedTabs = TabsProps;\n\n// The tab strip. Kept in this file because StyledTabs cannot cross a module\n// boundary (TS2742).\nconst TabsBar: React.FC<\n ResolvedTabs & {\n rest: Record<string, unknown>;\n onChange: (event: React.SyntheticEvent, newValue: string) => void;\n onCloseTab: (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => void;\n }\n> = ({ rest, items, value, onChange, onCloseTab, dataTestId, ...p }) => (\n <StyledTabs\n {...rest}\n value={value}\n onChange={onChange}\n customVariant={p.variant}\n size={p.size}\n showDividers={p.showDividers}\n orientation={p.orientation}\n centered={p.centered}\n // MUI only scrolls when its own `variant` is `scrollable`; map our\n // `scrollable` flag onto it so overflowing tab rows actually scroll.\n variant={p.scrollable ? 'scrollable' : 'standard'}\n data-testid={dataTestId ? `${dataTestId}-list` : 'tabs-list'}\n scrollButtons={resolveScrollButtons(p.scrollable)}\n allowScrollButtonsMobile={p.scrollable}\n textColor={p.color}\n indicatorColor={p.color}\n sx={buildTabsSx({\n fullWidth: p.fullWidth,\n sticky: p.sticky,\n stickyOffset: p.stickyOffset,\n indicatorColor: p.indicatorColor,\n disabled: p.disabled })}\n >\n {items.map((item, index) => (\n <MuiTab\n key={item.id}\n value={item.id}\n label={<TabLabel item={item} onClose={onCloseTab} />}\n disabled={item.disabled || p.disabled}\n className={item.className}\n id={`tab-${item.id}`}\n aria-controls={`tabpanel-${item.id}`}\n aria-disabled={item.disabled || p.disabled}\n data-testid={dataTestId ? `${dataTestId}-tab-${index}` : `tabs-tab-${index}`}\n />\n ))}\n </StyledTabs>\n);\n\nconst TabsPanels: React.FC<ResolvedTabs> = ({\n items,\n value,\n variant,\n animateContent,\n animationDuration,\n persistContent,\n loading,\n loadingComponent,\n tabPanelProps,\n dataTestId }) => (\n <Box sx={{ mt: variant === 'enclosed' ? 0 : 2 }}>\n {items.map((item, index) => (\n <CustomTabPanel\n key={item.id}\n id={item.id}\n value={value}\n animate={animateContent}\n animationDuration={animationDuration}\n persist={persistContent}\n loading={loading}\n loadingComponent={loadingComponent}\n className={tabPanelProps?.className}\n dataTestId={dataTestId}\n index={index}\n >\n {item.content}\n </CustomTabPanel>\n ))}\n </Box>\n);\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n (tabsProps, ref) => {\n const resolved = { ...TABS_DEFAULTS, ...definedProps(tabsProps) } as TabsProps;\n const {\n value: _value,\n onChange,\n onTabClose,\n className,\n disabled,\n showDividers,\n variant,\n dataTestId,\n ...rest\n } = resolved;\n\n const handleChange = (event: React.SyntheticEvent, newValue: string) => {\n if (!disabled) onChange(event, newValue);\n };\n\n const handleTabClose = (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => {\n event.stopPropagation();\n onTabClose?.(tabId);\n };\n\n return (\n <Box className={className} ref={ref} data-testid={dataTestId || 'tabs'}>\n <TabsBar\n {...resolved}\n rest={rest as unknown as Record<string, unknown>}\n onChange={handleChange}\n onCloseTab={handleTabClose}\n />\n\n {showDividers && variant !== 'enclosed' && <Divider />}\n\n <TabsPanels {...resolved} />\n </Box>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n","import { Box, CircularProgress, Fade } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type { TabPanelProps } from './Tabs.types';\n\nconst TabPanel = styled(Box, {\n shouldForwardProp: (prop) => !['animate', 'persist'].includes(prop as string),\n})<{ animate?: boolean; persist?: boolean }>(({ animate, persist }) => ({\n width: '100%',\n\n ...(animate && {\n transition: 'all 0.3s ease-in-out',\n }),\n\n ...(persist && {\n '&[hidden]': {\n display: 'none !important',\n },\n }),\n}));\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n color: theme.palette.text.secondary,\n}));\n\n// A loading panel shows the caller's placeholder, or a spinner if there isn't one.\nconst panelContent = (\n loading: boolean,\n loadingComponent: React.ReactNode,\n children: React.ReactNode,\n): React.ReactNode => {\n if (!loading) return children;\n\n return (\n loadingComponent || (\n <LoadingContainer>\n <CircularProgress size={32} />\n </LoadingContainer>\n )\n );\n};\n\nconst panelTestId = (dataTestId: string | undefined, index: number): string =>\n dataTestId ? `${dataTestId}-panel-${index}` : `tabs-panel-${index}`;\n\nexport const CustomTabPanel: React.FC<TabPanelProps & { dataTestId?: string; index: number }> = ({\n children,\n id,\n value,\n animate = false,\n animationDuration = 300,\n persist = false,\n loading = false,\n loadingComponent,\n className,\n dataTestId,\n index,\n ...props\n}) => {\n const isActive = value === id;\n const shouldRender = isActive || persist;\n\n if (!shouldRender) {\n return null;\n }\n\n const content = panelContent(loading, loadingComponent, children);\n const testId = panelTestId(dataTestId, index);\n\n const panel = (\n <TabPanel\n role=\"tabpanel\"\n hidden={!isActive}\n id={`tabpanel-${id}`}\n aria-labelledby={`tab-${id}`}\n animate={animate}\n persist={persist}\n className={className}\n data-testid={testId}\n {...props}\n >\n {content}\n </TabPanel>\n );\n\n // The animated and plain panels are the same element; only the Fade wrapper\n // differs.\n if (!animate) return panel;\n\n return (\n <Fade in={isActive} timeout={animationDuration}>\n {panel}\n </Fade>\n );\n};\n","import type { CSSObject, Theme } from '@mui/material';\nimport { alpha } from '@mui/material';\n\nconst sizeStyles = (theme: Theme, size?: string): CSSObject => ({\n ...(size === 'sm' && {\n minHeight: 32,\n '& .MuiTab-root': {\n fontSize: '0.875rem',\n minHeight: 32,\n padding: theme.spacing(0.5, 1.5),\n },\n }),\n\n ...(size === 'lg' && {\n minHeight: 56,\n '& .MuiTab-root': {\n fontSize: '1.125rem',\n minHeight: 56,\n padding: theme.spacing(1.5, 3),\n },\n }),\n\n});\n\nconst compactVariantStyles = (theme: Theme, customVariant?: string): CSSObject => ({\n ...(customVariant === 'default' && {\n '& .MuiTabs-indicator': {\n height: 3,\n borderRadius: '3px 3px 0 0',\n background: `linear-gradient(90deg, ${theme.palette.primary.main}, ${theme.palette.primary.dark})`,\n },\n }),\n\n // Pills variant (rounded tabs)\n ...(customVariant === 'pills' && {\n '& .MuiTabs-indicator': {\n display: 'none',\n },\n '& .MuiTab-root': {\n borderRadius: theme.spacing(3),\n margin: theme.spacing(0, 0.5),\n minWidth: 'auto',\n transition: 'all 0.3s ease',\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n transform: 'translateY(-1px)',\n },\n '&.Mui-selected': {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n boxShadow: `0 4px 12px ${alpha(theme.palette.primary.main, 0.3)}`,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n },\n },\n }),\n\n // Underline variant (minimal underline indicator)\n});\n\nconst boxedVariantStyles = (theme: Theme, customVariant?: string): CSSObject => ({\n ...(customVariant === 'underline' && {\n '& .MuiTabs-flexContainer': {\n gap: theme.spacing(2),\n },\n '& .MuiTabs-indicator': {\n height: 2,\n backgroundColor: theme.palette.primary.main,\n borderRadius: 1,\n },\n '& .MuiTab-root': {\n textTransform: 'none',\n fontWeight: 500,\n padding: theme.spacing(1, 0),\n minWidth: 'auto',\n '&:hover': {\n color: theme.palette.primary.main,\n },\n '&.Mui-selected': {\n color: theme.palette.primary.main,\n fontWeight: 600,\n },\n },\n }),\n\n // Enclosed variant (bordered tabs)\n ...(customVariant === 'enclosed' && {\n '& .MuiTabs-indicator': {\n display: 'none',\n },\n '& .MuiTabs-flexContainer': {\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n '& .MuiTab-root': {\n border: `1px solid ${theme.palette.divider}`,\n borderBottom: 'none',\n borderRadius: `${theme.spacing(1)} ${theme.spacing(1)} 0 0`,\n margin: theme.spacing(0, 0.5),\n marginBottom: -1,\n backgroundColor: alpha(theme.palette.action.hover, 0.5),\n '&:hover': {\n backgroundColor: alpha(theme.palette.action.hover, 0.8),\n },\n '&.Mui-selected': {\n backgroundColor: theme.palette.background.paper,\n borderColor: theme.palette.divider,\n borderBottomColor: theme.palette.background.paper,\n zIndex: 1,\n },\n },\n }),\n});\n\nconst variantStyles = (theme: Theme, customVariant?: string): CSSObject => ({\n ...compactVariantStyles(theme, customVariant),\n ...boxedVariantStyles(theme, customVariant),\n});\n\n// Vertical rules between tabs, for the variants that do not already have edges.\nconst dividerStyles = (\n theme: Theme,\n customVariant?: string,\n showDividers?: boolean,\n): CSSObject => ({\n ...(showDividers &&\n customVariant !== 'enclosed' &&\n customVariant !== 'pills' && {\n '& .MuiTab-root:not(:last-child)': {\n borderRight: `1px solid ${alpha(theme.palette.divider, 0.5)}`,\n },\n }),\n});\n\n// The root Tabs styling, kept out of Tabs.tsx so the styled() call stays small.\n// Spread into a fresh literal at the call site: handing styled() a named-type\n// value makes TypeScript demand a `variants` key (CSSObjectWithVariants).\nexport const tabsRootStyles = ({\n theme,\n customVariant,\n size,\n showDividers,\n}: {\n theme: Theme;\n customVariant?: string;\n size?: string;\n showDividers?: boolean;\n}): CSSObject => ({\n position: 'relative',\n\n // Collapse disabled scroll buttons (e.g. the left button at the start of a\n // scrollable row) so they don't reserve empty space before the first tab.\n '& .MuiTabs-scrollButtons.Mui-disabled': {\n width: 0,\n minWidth: 0,\n overflow: 'hidden',\n },\n\n // Size variants\n ...sizeStyles(theme, size),\n ...variantStyles(theme, customVariant),\n ...dividerStyles(theme, customVariant, showDividers),\n});\n"],"mappings":"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","names":["alpha","Box","styled","jsx","styled","Box","alpha"]}
1
+ {"version":3,"sources":["../../src/components/navigation/Tabs/Tabs.tsx","../../src/components/navigation/Tabs/TabsPanel.tsx","../../src/components/navigation/Tabs/Tabs.styles.ts"],"sourcesContent":["import Close from '@mui/icons-material/Close';\nimport {\n alpha,\n Badge,\n Box,\n Divider,\n Tab as MuiTab,\n Tabs as MuiTabs } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport { CustomTabPanel } from './TabsPanel';\nimport { tabsRootStyles } from './Tabs.styles';\nimport type { TabItem, TabsProps } from './Tabs.types';\n\nconst StyledTabs = styled(MuiTabs, {\n shouldForwardProp: (prop) => !['customVariant', 'size', 'showDividers'].includes(prop as string) })<{ customVariant?: string; size?: string; showDividers?: boolean }>(\n ({ theme, customVariant, size, showDividers }) => ({\n ...tabsRootStyles({ theme, customVariant, size, showDividers }) }),\n);\n\nconst CloseButton = styled(Box)(({ theme }) => ({\n marginLeft: theme.spacing(0.5),\n padding: theme.spacing(0.25),\n width: 20,\n height: 20,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n borderRadius: '50%',\n color: theme.palette.action.active,\n '&:hover': {\n backgroundColor: alpha(theme.palette.error.main, 0.1),\n color: theme.palette.error.main } }));\n\nconst BadgeWrapper = styled(Badge)(() => ({\n '& .MuiBadge-badge': {\n right: -6,\n top: 4,\n fontSize: '0.75rem',\n minWidth: 16,\n height: 16,\n padding: 0 } }));\n\nconst TABS_DEFAULTS: Partial<TabsProps> = {\n variant: 'default',\n size: 'md',\n color: 'primary',\n fullWidth: false,\n orientation: 'horizontal',\n showDividers: false,\n centered: false,\n scrollable: false,\n scrollButtons: 'auto',\n sticky: false,\n stickyOffset: 0,\n animateContent: false,\n animationDuration: 300,\n persistContent: false,\n disabled: false,\n loading: false };\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}`\n// still falls back to the default as a destructuring default would.\nconst definedProps = (props: TabsProps): Partial<TabsProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<TabsProps>;\n\n// Once the row is scrollable every accepted scrollButtons value ends up as\n// MUI's 'auto'. That is exactly what the previous nested ternary did — it mapped\n// 'on'/'off'/'desktop' to 'auto', and its remaining branch could only ever be\n// 'auto' anyway — so the behaviour is preserved here rather than quietly\n// changed. Worth knowing that scrollButtons=\"off\" therefore still shows buttons.\nconst resolveScrollButtons = (scrollable?: boolean): 'auto' | false =>\n scrollable ? 'auto' : false;\n\nconst buildTabsSx = ({\n fullWidth,\n sticky,\n stickyOffset,\n indicatorColor,\n disabled }: {\n fullWidth?: boolean;\n sticky?: boolean;\n stickyOffset?: number;\n indicatorColor?: string;\n disabled?: boolean;\n}) => ({\n ...(fullWidth && { width: '100%' }),\n // Pin the tab list while panels scroll beneath it. Opaque background + bottom\n // divider so scrolled content does not show through.\n ...(sticky && {\n position: 'sticky',\n top: stickyOffset,\n zIndex: 2,\n backgroundColor: 'background.default',\n borderBottom: 1,\n borderColor: 'divider' }),\n ...(indicatorColor && {\n '& .MuiTabs-indicator': { backgroundColor: indicatorColor } }),\n ...(disabled && { opacity: 0.6, pointerEvents: 'none' }) });\n\n// A tab's label: icon, text, optional close affordance, optionally badged.\nconst TabLabel: React.FC<{\n item: TabItem;\n closeTabLabel: string;\n onClose: (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => void;\n}> = ({ item, closeTabLabel, onClose }) => {\n const content = (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {item.icon}\n <span>{item.label}</span>\n {item.closable && (\n <CloseButton\n onClick={(e) => onClose(e, item.id)}\n role=\"button\"\n tabIndex={0}\n aria-label={closeTabLabel}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return;\n onClose(e, item.id);\n }}\n >\n <Close fontSize=\"inherit\" />\n </CloseButton>\n )}\n </Box>\n );\n\n if (item.badge === undefined) return content;\n\n return (\n <BadgeWrapper badgeContent={item.badge} color=\"error\">\n {content}\n </BadgeWrapper>\n );\n};\n\ntype ResolvedTabs = TabsProps;\n\n// The tab strip. Kept in this file because StyledTabs cannot cross a module\n// boundary (TS2742).\nconst TabsBar: React.FC<\n ResolvedTabs & {\n rest: Record<string, unknown>;\n onChange: (event: React.SyntheticEvent, newValue: string) => void;\n onCloseTab: (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => void;\n }\n> = ({ rest, items, value, onChange, onCloseTab, dataTestId, ...p }) => (\n <StyledTabs\n {...rest}\n value={value}\n onChange={onChange}\n customVariant={p.variant}\n size={p.size}\n showDividers={p.showDividers}\n orientation={p.orientation}\n centered={p.centered}\n // MUI only scrolls when its own `variant` is `scrollable`; map our\n // `scrollable` flag onto it so overflowing tab rows actually scroll.\n variant={p.scrollable ? 'scrollable' : 'standard'}\n data-testid={dataTestId ? `${dataTestId}-list` : 'tabs-list'}\n scrollButtons={resolveScrollButtons(p.scrollable)}\n allowScrollButtonsMobile={p.scrollable}\n textColor={p.color}\n indicatorColor={p.color}\n sx={buildTabsSx({\n fullWidth: p.fullWidth,\n sticky: p.sticky,\n stickyOffset: p.stickyOffset,\n indicatorColor: p.indicatorColor,\n disabled: p.disabled })}\n >\n {items.map((item, index) => (\n <MuiTab\n key={item.id}\n value={item.id}\n label={<TabLabel closeTabLabel={p.closeTabLabel} item={item} onClose={onCloseTab} />}\n disabled={item.disabled || p.disabled}\n className={item.className}\n id={`tab-${item.id}`}\n aria-controls={`tabpanel-${item.id}`}\n aria-disabled={item.disabled || p.disabled}\n data-testid={dataTestId ? `${dataTestId}-tab-${index}` : `tabs-tab-${index}`}\n />\n ))}\n </StyledTabs>\n);\n\nconst TabsPanels: React.FC<ResolvedTabs> = ({\n items,\n value,\n variant,\n animateContent,\n animationDuration,\n persistContent,\n loading,\n loadingComponent,\n tabPanelProps,\n dataTestId }) => (\n <Box sx={{ mt: variant === 'enclosed' ? 0 : 2 }}>\n {items.map((item, index) => (\n <CustomTabPanel\n key={item.id}\n id={item.id}\n value={value}\n animate={animateContent}\n animationDuration={animationDuration}\n persist={persistContent}\n loading={loading}\n loadingComponent={loadingComponent}\n className={tabPanelProps?.className}\n dataTestId={dataTestId}\n index={index}\n >\n {item.content}\n </CustomTabPanel>\n ))}\n </Box>\n);\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n (tabsProps, ref) => {\n const resolved = { ...TABS_DEFAULTS, ...definedProps(tabsProps) } as TabsProps;\n const {\n // Destructured only to keep it OUT of `rest`, which is spread onto the\n // DOM node — `{...resolved}` below is what actually carries it to\n // `TabsBar`. Same reason as `value` on the next line.\n closeTabLabel: _closeTabLabel,\n value: _value,\n onChange,\n onTabClose,\n className,\n disabled,\n showDividers,\n variant,\n dataTestId,\n ...rest\n } = resolved;\n\n const handleChange = (event: React.SyntheticEvent, newValue: string) => {\n if (!disabled) onChange(event, newValue);\n };\n\n const handleTabClose = (event: React.MouseEvent | React.KeyboardEvent, tabId: string) => {\n event.stopPropagation();\n onTabClose?.(tabId);\n };\n\n return (\n <Box className={className} ref={ref} data-testid={dataTestId || 'tabs'}>\n <TabsBar\n {...resolved}\n rest={rest as unknown as Record<string, unknown>}\n onChange={handleChange}\n onCloseTab={handleTabClose}\n />\n\n {showDividers && variant !== 'enclosed' && <Divider />}\n\n <TabsPanels {...resolved} />\n </Box>\n );\n },\n);\n\nTabs.displayName = 'Tabs';\n","import { Box, CircularProgress, Fade } from '@mui/material';\nimport { styled } from '@mui/material';\nimport React from 'react';\n\nimport type { TabPanelProps } from './Tabs.types';\n\nconst TabPanel = styled(Box, {\n shouldForwardProp: (prop) => !['animate', 'persist'].includes(prop as string),\n})<{ animate?: boolean; persist?: boolean }>(({ animate, persist }) => ({\n width: '100%',\n\n ...(animate && {\n transition: 'all 0.3s ease-in-out',\n }),\n\n ...(persist && {\n '&[hidden]': {\n display: 'none !important',\n },\n }),\n}));\n\nconst LoadingContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 200,\n color: theme.palette.text.secondary,\n}));\n\n// A loading panel shows the caller's placeholder, or a spinner if there isn't one.\nconst panelContent = (\n loading: boolean,\n loadingComponent: React.ReactNode,\n children: React.ReactNode,\n): React.ReactNode => {\n if (!loading) return children;\n\n return (\n loadingComponent || (\n <LoadingContainer>\n <CircularProgress size={32} />\n </LoadingContainer>\n )\n );\n};\n\nconst panelTestId = (dataTestId: string | undefined, index: number): string =>\n dataTestId ? `${dataTestId}-panel-${index}` : `tabs-panel-${index}`;\n\nexport const CustomTabPanel: React.FC<TabPanelProps & { dataTestId?: string; index: number }> = ({\n children,\n id,\n value,\n animate = false,\n animationDuration = 300,\n persist = false,\n loading = false,\n loadingComponent,\n className,\n dataTestId,\n index,\n ...props\n}) => {\n const isActive = value === id;\n const shouldRender = isActive || persist;\n\n if (!shouldRender) {\n return null;\n }\n\n const content = panelContent(loading, loadingComponent, children);\n const testId = panelTestId(dataTestId, index);\n\n const panel = (\n <TabPanel\n role=\"tabpanel\"\n hidden={!isActive}\n id={`tabpanel-${id}`}\n aria-labelledby={`tab-${id}`}\n animate={animate}\n persist={persist}\n className={className}\n data-testid={testId}\n {...props}\n >\n {content}\n </TabPanel>\n );\n\n // The animated and plain panels are the same element; only the Fade wrapper\n // differs.\n if (!animate) return panel;\n\n return (\n <Fade in={isActive} timeout={animationDuration}>\n {panel}\n </Fade>\n );\n};\n","import type { CSSObject, Theme } from '@mui/material';\nimport { alpha } from '@mui/material';\n\nconst sizeStyles = (theme: Theme, size?: string): CSSObject => ({\n ...(size === 'sm' && {\n minHeight: 32,\n '& .MuiTab-root': {\n fontSize: '0.875rem',\n minHeight: 32,\n padding: theme.spacing(0.5, 1.5),\n },\n }),\n\n ...(size === 'lg' && {\n minHeight: 56,\n '& .MuiTab-root': {\n fontSize: '1.125rem',\n minHeight: 56,\n padding: theme.spacing(1.5, 3),\n },\n }),\n\n});\n\nconst compactVariantStyles = (theme: Theme, customVariant?: string): CSSObject => ({\n ...(customVariant === 'default' && {\n '& .MuiTabs-indicator': {\n height: 3,\n borderRadius: '3px 3px 0 0',\n background: `linear-gradient(90deg, ${theme.palette.primary.main}, ${theme.palette.primary.dark})`,\n },\n }),\n\n // Pills variant (rounded tabs)\n ...(customVariant === 'pills' && {\n '& .MuiTabs-indicator': {\n display: 'none',\n },\n '& .MuiTab-root': {\n borderRadius: theme.spacing(3),\n margin: theme.spacing(0, 0.5),\n minWidth: 'auto',\n transition: 'all 0.3s ease',\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n transform: 'translateY(-1px)',\n },\n '&.Mui-selected': {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n boxShadow: `0 4px 12px ${alpha(theme.palette.primary.main, 0.3)}`,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n },\n },\n },\n }),\n\n // Underline variant (minimal underline indicator)\n});\n\nconst boxedVariantStyles = (theme: Theme, customVariant?: string): CSSObject => ({\n ...(customVariant === 'underline' && {\n '& .MuiTabs-flexContainer': {\n gap: theme.spacing(2),\n },\n '& .MuiTabs-indicator': {\n height: 2,\n backgroundColor: theme.palette.primary.main,\n borderRadius: 1,\n },\n '& .MuiTab-root': {\n textTransform: 'none',\n fontWeight: 500,\n padding: theme.spacing(1, 0),\n minWidth: 'auto',\n '&:hover': {\n color: theme.palette.primary.main,\n },\n '&.Mui-selected': {\n color: theme.palette.primary.main,\n fontWeight: 600,\n },\n },\n }),\n\n // Enclosed variant (bordered tabs)\n ...(customVariant === 'enclosed' && {\n '& .MuiTabs-indicator': {\n display: 'none',\n },\n '& .MuiTabs-flexContainer': {\n borderBottom: `1px solid ${theme.palette.divider}`,\n },\n '& .MuiTab-root': {\n border: `1px solid ${theme.palette.divider}`,\n borderBottom: 'none',\n borderRadius: `${theme.spacing(1)} ${theme.spacing(1)} 0 0`,\n margin: theme.spacing(0, 0.5),\n marginBottom: -1,\n backgroundColor: alpha(theme.palette.action.hover, 0.5),\n '&:hover': {\n backgroundColor: alpha(theme.palette.action.hover, 0.8),\n },\n '&.Mui-selected': {\n backgroundColor: theme.palette.background.paper,\n borderColor: theme.palette.divider,\n borderBottomColor: theme.palette.background.paper,\n zIndex: 1,\n },\n },\n }),\n});\n\nconst variantStyles = (theme: Theme, customVariant?: string): CSSObject => ({\n ...compactVariantStyles(theme, customVariant),\n ...boxedVariantStyles(theme, customVariant),\n});\n\n// Vertical rules between tabs, for the variants that do not already have edges.\nconst dividerStyles = (\n theme: Theme,\n customVariant?: string,\n showDividers?: boolean,\n): CSSObject => ({\n ...(showDividers &&\n customVariant !== 'enclosed' &&\n customVariant !== 'pills' && {\n '& .MuiTab-root:not(:last-child)': {\n borderRight: `1px solid ${alpha(theme.palette.divider, 0.5)}`,\n },\n }),\n});\n\n// The root Tabs styling, kept out of Tabs.tsx so the styled() call stays small.\n// Spread into a fresh literal at the call site: handing styled() a named-type\n// value makes TypeScript demand a `variants` key (CSSObjectWithVariants).\nexport const tabsRootStyles = ({\n theme,\n customVariant,\n size,\n showDividers,\n}: {\n theme: Theme;\n customVariant?: string;\n size?: string;\n showDividers?: boolean;\n}): CSSObject => ({\n position: 'relative',\n\n // Collapse disabled scroll buttons (e.g. the left button at the start of a\n // scrollable row) so they don't reserve empty space before the first tab.\n '& .MuiTabs-scrollButtons.Mui-disabled': {\n width: 0,\n minWidth: 0,\n overflow: 'hidden',\n },\n\n // Size variants\n ...sizeStyles(theme, size),\n ...variantStyles(theme, customVariant),\n ...dividerStyles(theme, customVariant, showDividers),\n});\n"],"mappings":"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","names":["alpha","Box","styled","jsx","styled","Box","alpha"]}