@startdownnotez404/ui 1.3.5 → 1.3.6

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 (254) hide show
  1. package/dist/AutocompleteField-653233JU.mjs +203 -0
  2. package/dist/AutocompleteField-653233JU.mjs.map +1 -0
  3. package/dist/AvatarField-KFASMVZU.mjs +378 -0
  4. package/dist/AvatarField-KFASMVZU.mjs.map +1 -0
  5. package/dist/{DateField-ZYMZFHL4.mjs → DateField-CDJ6W6XF.mjs} +19 -7
  6. package/dist/DateField-CDJ6W6XF.mjs.map +1 -0
  7. package/dist/DateRangeField-ZWSFT5KV.mjs +118 -0
  8. package/dist/DateRangeField-ZWSFT5KV.mjs.map +1 -0
  9. package/dist/{DateTimeField-TPTJ7YIZ.mjs → DateTimeField-SFAF4I6A.mjs} +36 -11
  10. package/dist/DateTimeField-SFAF4I6A.mjs.map +1 -0
  11. package/dist/FileUploadField-TSNCSLXX.mjs +101 -0
  12. package/dist/FileUploadField-TSNCSLXX.mjs.map +1 -0
  13. package/dist/{JSONEditorField-TMRWGXVR.mjs → JSONEditorField-3KXC2GOG.mjs} +7 -6
  14. package/dist/{JSONEditorField-TMRWGXVR.mjs.map → JSONEditorField-3KXC2GOG.mjs.map} +1 -1
  15. package/dist/{PopperMenu-LJ36RPBW.mjs → PopperMenu-PSHLKIEZ.mjs} +26 -12
  16. package/dist/{PopperMenu-LJ36RPBW.mjs.map → PopperMenu-PSHLKIEZ.mjs.map} +1 -1
  17. package/dist/{TelField-LOGRVZ4I.mjs → TelField-FRQT2UBJ.mjs} +8 -7
  18. package/dist/{TelField-LOGRVZ4I.mjs.map → TelField-FRQT2UBJ.mjs.map} +1 -1
  19. package/dist/TimeField-XVWXBJID.mjs +94 -0
  20. package/dist/TimeField-XVWXBJID.mjs.map +1 -0
  21. package/dist/alert.d.mts +148 -18
  22. package/dist/alert.d.ts +148 -18
  23. package/dist/alert.js +698 -254
  24. package/dist/alert.js.map +1 -1
  25. package/dist/alert.mjs +46 -10
  26. package/dist/autocomplete.d.mts +438 -4
  27. package/dist/autocomplete.d.ts +438 -4
  28. package/dist/autocomplete.js +632 -21
  29. package/dist/autocomplete.js.map +1 -1
  30. package/dist/autocomplete.mjs +26 -7
  31. package/dist/avatar.js +2 -1
  32. package/dist/avatar.js.map +1 -1
  33. package/dist/avatar.mjs +12 -11
  34. package/dist/box.mjs +2 -1
  35. package/dist/button.mjs +3 -2
  36. package/dist/chart.mjs +3 -2
  37. package/dist/checkbox.mjs +3 -2
  38. package/dist/chunk-2FK24ZPJ.mjs +78 -0
  39. package/dist/chunk-2FK24ZPJ.mjs.map +1 -0
  40. package/dist/{chunk-V26V2S3W.mjs → chunk-3O3N6X6D.mjs} +3 -3
  41. package/dist/{chunk-Y74ALKBL.mjs → chunk-4MSPA7U7.mjs} +11 -9
  42. package/dist/{chunk-Y74ALKBL.mjs.map → chunk-4MSPA7U7.mjs.map} +1 -1
  43. package/dist/{chunk-24XDGNJ6.mjs → chunk-4P45Z5LR.mjs} +63 -41
  44. package/dist/chunk-4P45Z5LR.mjs.map +1 -0
  45. package/dist/chunk-4SSJY32J.mjs +1182 -0
  46. package/dist/chunk-4SSJY32J.mjs.map +1 -0
  47. package/dist/{chunk-XJ2SXC2Q.mjs → chunk-6B6I27TT.mjs} +18 -16
  48. package/dist/{chunk-XJ2SXC2Q.mjs.map → chunk-6B6I27TT.mjs.map} +1 -1
  49. package/dist/chunk-6JKMEH2L.mjs +205 -0
  50. package/dist/chunk-6JKMEH2L.mjs.map +1 -0
  51. package/dist/{chunk-IN3O4R7Q.mjs → chunk-7O526A2D.mjs} +6 -4
  52. package/dist/{chunk-IN3O4R7Q.mjs.map → chunk-7O526A2D.mjs.map} +1 -1
  53. package/dist/chunk-AFLEG5ZC.mjs +28 -0
  54. package/dist/chunk-AFLEG5ZC.mjs.map +1 -0
  55. package/dist/{chunk-UGMRJMFZ.mjs → chunk-BO5CU4ZM.mjs} +4 -4
  56. package/dist/{chunk-JIU5GVM7.mjs → chunk-D4XPNSSI.mjs} +5 -3
  57. package/dist/{chunk-JIU5GVM7.mjs.map → chunk-D4XPNSSI.mjs.map} +1 -1
  58. package/dist/chunk-DPIMA5IO.mjs +72 -0
  59. package/dist/chunk-DPIMA5IO.mjs.map +1 -0
  60. package/dist/chunk-F2CGFVIZ.mjs +83 -0
  61. package/dist/chunk-F2CGFVIZ.mjs.map +1 -0
  62. package/dist/{chunk-R5MKQN6D.mjs → chunk-FBLSJQWK.mjs} +3 -3
  63. package/dist/{chunk-BGB7JHIU.mjs → chunk-FMGZCOJC.mjs} +5 -3
  64. package/dist/{chunk-BGB7JHIU.mjs.map → chunk-FMGZCOJC.mjs.map} +1 -1
  65. package/dist/{chunk-UTVSYS6S.mjs → chunk-FNSIQ2B7.mjs} +18 -6
  66. package/dist/chunk-FNSIQ2B7.mjs.map +1 -0
  67. package/dist/{chunk-JWANK42G.mjs → chunk-FUZ2JNTZ.mjs} +3 -3
  68. package/dist/{chunk-CRYIEYZZ.mjs → chunk-HAJWE62X.mjs} +66 -42
  69. package/dist/chunk-HAJWE62X.mjs.map +1 -0
  70. package/dist/{chunk-CWFWRZWU.mjs → chunk-KSN33A6I.mjs} +3 -2
  71. package/dist/{chunk-CWFWRZWU.mjs.map → chunk-KSN33A6I.mjs.map} +1 -1
  72. package/dist/chunk-KYTHGFFY.mjs +866 -0
  73. package/dist/chunk-KYTHGFFY.mjs.map +1 -0
  74. package/dist/{chunk-QKGCW37O.mjs → chunk-LDFM46LV.mjs} +5 -3
  75. package/dist/{chunk-QKGCW37O.mjs.map → chunk-LDFM46LV.mjs.map} +1 -1
  76. package/dist/chunk-LQNDBPHU.mjs +142 -0
  77. package/dist/chunk-LQNDBPHU.mjs.map +1 -0
  78. package/dist/{chunk-E3I2VDHZ.mjs → chunk-M2PYXSAF.mjs} +6 -4
  79. package/dist/{chunk-E3I2VDHZ.mjs.map → chunk-M2PYXSAF.mjs.map} +1 -1
  80. package/dist/{chunk-DELCADNF.mjs → chunk-ODVKRIVN.mjs} +30 -30
  81. package/dist/{chunk-HR3A4H4E.mjs → chunk-PEJL2T2K.mjs} +13 -11
  82. package/dist/{chunk-HR3A4H4E.mjs.map → chunk-PEJL2T2K.mjs.map} +1 -1
  83. package/dist/{chunk-OGNGPI3M.mjs → chunk-PL55YKT4.mjs} +2 -2
  84. package/dist/{chunk-S6EZVRZC.mjs → chunk-PNSJC6PC.mjs} +5 -28
  85. package/dist/chunk-PNSJC6PC.mjs.map +1 -0
  86. package/dist/{chunk-TDRA5EZI.mjs → chunk-PUREEN2J.mjs} +7 -7
  87. package/dist/chunk-QFS5CENY.mjs +659 -0
  88. package/dist/chunk-QFS5CENY.mjs.map +1 -0
  89. package/dist/chunk-RSN7NH2J.mjs +250 -0
  90. package/dist/chunk-RSN7NH2J.mjs.map +1 -0
  91. package/dist/{chunk-UDREPVEY.mjs → chunk-RVSMEZE3.mjs} +12 -78
  92. package/dist/chunk-RVSMEZE3.mjs.map +1 -0
  93. package/dist/{chunk-SRWPHN2N.mjs → chunk-S64IYJ6Y.mjs} +2 -2
  94. package/dist/{chunk-ZG3NQI77.mjs → chunk-SMD7OEUW.mjs} +6 -4
  95. package/dist/{chunk-ZG3NQI77.mjs.map → chunk-SMD7OEUW.mjs.map} +1 -1
  96. package/dist/{chunk-NJYNJLT7.mjs → chunk-SWFB3A3G.mjs} +2 -2
  97. package/dist/{chunk-RXBQ7KXF.mjs → chunk-USXGNKWJ.mjs} +98 -44
  98. package/dist/chunk-USXGNKWJ.mjs.map +1 -0
  99. package/dist/{chunk-OJV6V7YZ.mjs → chunk-VL7V52YD.mjs} +27 -20
  100. package/dist/chunk-VL7V52YD.mjs.map +1 -0
  101. package/dist/{chunk-2ZZJTBTE.mjs → chunk-WJZ3IYET.mjs} +2 -2
  102. package/dist/chunk-XAJAMVAG.mjs +1720 -0
  103. package/dist/chunk-XAJAMVAG.mjs.map +1 -0
  104. package/dist/chunk-YIJ5QVJ6.mjs +277 -0
  105. package/dist/chunk-YIJ5QVJ6.mjs.map +1 -0
  106. package/dist/{chunk-T6AMRENK.mjs → chunk-YRW5NKD7.mjs} +148 -112
  107. package/dist/chunk-YRW5NKD7.mjs.map +1 -0
  108. package/dist/chunk-ZMJKG2UI.mjs +71 -0
  109. package/dist/chunk-ZMJKG2UI.mjs.map +1 -0
  110. package/dist/confirm.d.mts +48 -0
  111. package/dist/confirm.d.ts +48 -0
  112. package/dist/confirm.js +334 -0
  113. package/dist/confirm.js.map +1 -0
  114. package/dist/confirm.mjs +20 -0
  115. package/dist/datePicker.d.mts +256 -14
  116. package/dist/datePicker.d.ts +256 -14
  117. package/dist/datePicker.js +1624 -145
  118. package/dist/datePicker.js.map +1 -1
  119. package/dist/datePicker.mjs +19 -6
  120. package/dist/dialog.d.mts +166 -0
  121. package/dist/dialog.d.ts +166 -0
  122. package/dist/dialog.js +362 -0
  123. package/dist/dialog.js.map +1 -0
  124. package/dist/dialog.mjs +45 -0
  125. package/dist/emptyState.d.mts +17 -0
  126. package/dist/emptyState.d.ts +17 -0
  127. package/dist/emptyState.js +253 -0
  128. package/dist/emptyState.js.map +1 -0
  129. package/dist/emptyState.mjs +12 -0
  130. package/dist/emptyState.mjs.map +1 -0
  131. package/dist/errorState.d.mts +18 -0
  132. package/dist/errorState.d.ts +18 -0
  133. package/dist/{displayFile.js → errorState.js} +107 -156
  134. package/dist/errorState.js.map +1 -0
  135. package/dist/errorState.mjs +15 -0
  136. package/dist/errorState.mjs.map +1 -0
  137. package/dist/fileUpload.d.mts +197 -0
  138. package/dist/fileUpload.d.ts +197 -0
  139. package/dist/fileUpload.js +1483 -0
  140. package/dist/fileUpload.js.map +1 -0
  141. package/dist/fileUpload.mjs +65 -0
  142. package/dist/fileUpload.mjs.map +1 -0
  143. package/dist/flowMap.mjs +7 -6
  144. package/dist/flowMap.mjs.map +1 -1
  145. package/dist/image.js +1195 -429
  146. package/dist/image.js.map +1 -1
  147. package/dist/image.mjs +8 -6
  148. package/dist/index.d.ts +7 -2
  149. package/dist/index.js +8606 -4087
  150. package/dist/index.js.map +1 -1
  151. package/dist/index.mjs +314 -152
  152. package/dist/inlineError.d.mts +16 -0
  153. package/dist/inlineError.d.ts +16 -0
  154. package/dist/inlineError.js +297 -0
  155. package/dist/inlineError.js.map +1 -0
  156. package/dist/inlineError.mjs +15 -0
  157. package/dist/inlineError.mjs.map +1 -0
  158. package/dist/input.mjs +8 -7
  159. package/dist/jsonEditor.mjs +3 -2
  160. package/dist/list.mjs +7 -6
  161. package/dist/loading.mjs +8 -6
  162. package/dist/markdown.mjs +7 -6
  163. package/dist/markdown.mjs.map +1 -1
  164. package/dist/menu.mjs +9 -8
  165. package/dist/modal.js +2 -1
  166. package/dist/modal.js.map +1 -1
  167. package/dist/modal.mjs +7 -5
  168. package/dist/process.d.mts +33 -75
  169. package/dist/process.d.ts +33 -75
  170. package/dist/process.js +1275 -203
  171. package/dist/process.js.map +1 -1
  172. package/dist/process.mjs +12 -9
  173. package/dist/scrollToLoad.mjs +4 -3
  174. package/dist/select.mjs +10 -9
  175. package/dist/skeleton.d.mts +15 -1
  176. package/dist/skeleton.d.ts +15 -1
  177. package/dist/skeleton.js +114 -2
  178. package/dist/skeleton.js.map +1 -1
  179. package/dist/skeleton.mjs +6 -3
  180. package/dist/stepper.mjs +4 -3
  181. package/dist/tab.mjs +10 -9
  182. package/dist/table.d.mts +269 -85
  183. package/dist/table.d.ts +269 -85
  184. package/dist/table.js +5102 -3153
  185. package/dist/table.js.map +1 -1
  186. package/dist/table.mjs +21 -19
  187. package/dist/theme.js +1766 -432
  188. package/dist/theme.js.map +1 -1
  189. package/dist/theme.mjs +32 -25
  190. package/dist/timeline.mjs +4 -3
  191. package/dist/toast.d.mts +49 -0
  192. package/dist/toast.d.ts +49 -0
  193. package/dist/toast.js +175 -0
  194. package/dist/toast.js.map +1 -0
  195. package/dist/toast.mjs +9 -0
  196. package/dist/toast.mjs.map +1 -0
  197. package/dist/toggleButtonGroup.mjs +3 -2
  198. package/dist/useForm.d.mts +270 -86
  199. package/dist/useForm.d.ts +270 -86
  200. package/dist/useForm.js +4672 -2727
  201. package/dist/useForm.js.map +1 -1
  202. package/dist/useForm.mjs +18 -16
  203. package/dist/useSearch.mjs +13 -12
  204. package/dist/variablesRenderer.mjs +8 -7
  205. package/package.json +3 -3
  206. package/dist/AutocompleteField-ZKNU2IRR.mjs +0 -181
  207. package/dist/AutocompleteField-ZKNU2IRR.mjs.map +0 -1
  208. package/dist/AvatarField-SAODT3CZ.mjs +0 -275
  209. package/dist/AvatarField-SAODT3CZ.mjs.map +0 -1
  210. package/dist/DateField-ZYMZFHL4.mjs.map +0 -1
  211. package/dist/DateTimeField-TPTJ7YIZ.mjs.map +0 -1
  212. package/dist/FileUploadField-NTMWBJER.mjs +0 -78
  213. package/dist/FileUploadField-NTMWBJER.mjs.map +0 -1
  214. package/dist/chunk-24XDGNJ6.mjs.map +0 -1
  215. package/dist/chunk-27KYFU7R.mjs +0 -30
  216. package/dist/chunk-27KYFU7R.mjs.map +0 -1
  217. package/dist/chunk-AAH2O24U.mjs +0 -325
  218. package/dist/chunk-AAH2O24U.mjs.map +0 -1
  219. package/dist/chunk-CRYIEYZZ.mjs.map +0 -1
  220. package/dist/chunk-EEH7HACG.mjs +0 -249
  221. package/dist/chunk-EEH7HACG.mjs.map +0 -1
  222. package/dist/chunk-EKPULYPU.mjs +0 -497
  223. package/dist/chunk-EKPULYPU.mjs.map +0 -1
  224. package/dist/chunk-OJV6V7YZ.mjs.map +0 -1
  225. package/dist/chunk-RXBQ7KXF.mjs.map +0 -1
  226. package/dist/chunk-S6EZVRZC.mjs.map +0 -1
  227. package/dist/chunk-SGCUDWO3.mjs +0 -396
  228. package/dist/chunk-SGCUDWO3.mjs.map +0 -1
  229. package/dist/chunk-T6AMRENK.mjs.map +0 -1
  230. package/dist/chunk-UDREPVEY.mjs.map +0 -1
  231. package/dist/chunk-UTVSYS6S.mjs.map +0 -1
  232. package/dist/chunk-XIMFP6RB.mjs +0 -161
  233. package/dist/chunk-XIMFP6RB.mjs.map +0 -1
  234. package/dist/displayFile.d.mts +0 -95
  235. package/dist/displayFile.d.ts +0 -95
  236. package/dist/displayFile.js.map +0 -1
  237. package/dist/displayFile.mjs +0 -19
  238. package/dist/fileUploader.d.mts +0 -86
  239. package/dist/fileUploader.d.ts +0 -86
  240. package/dist/fileUploader.js +0 -722
  241. package/dist/fileUploader.js.map +0 -1
  242. package/dist/fileUploader.mjs +0 -16
  243. /package/dist/{chunk-V26V2S3W.mjs.map → chunk-3O3N6X6D.mjs.map} +0 -0
  244. /package/dist/{chunk-UGMRJMFZ.mjs.map → chunk-BO5CU4ZM.mjs.map} +0 -0
  245. /package/dist/{chunk-R5MKQN6D.mjs.map → chunk-FBLSJQWK.mjs.map} +0 -0
  246. /package/dist/{chunk-JWANK42G.mjs.map → chunk-FUZ2JNTZ.mjs.map} +0 -0
  247. /package/dist/{chunk-DELCADNF.mjs.map → chunk-ODVKRIVN.mjs.map} +0 -0
  248. /package/dist/{chunk-OGNGPI3M.mjs.map → chunk-PL55YKT4.mjs.map} +0 -0
  249. /package/dist/{chunk-TDRA5EZI.mjs.map → chunk-PUREEN2J.mjs.map} +0 -0
  250. /package/dist/{chunk-SRWPHN2N.mjs.map → chunk-S64IYJ6Y.mjs.map} +0 -0
  251. /package/dist/{chunk-NJYNJLT7.mjs.map → chunk-SWFB3A3G.mjs.map} +0 -0
  252. /package/dist/{chunk-2ZZJTBTE.mjs.map → chunk-WJZ3IYET.mjs.map} +0 -0
  253. /package/dist/{displayFile.mjs.map → confirm.mjs.map} +0 -0
  254. /package/dist/{fileUploader.mjs.map → dialog.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/elemental/Menu/src/Menu/Menu.tsx","../src/components/elemental/Menu/src/MenuItem.tsx","../src/components/elemental/Menu/src/Menu/index.ts","../src/components/elemental/Menu/src/Menu/theme.ts","../src/components/elemental/Menu/src/useMenu/useMenu.tsx","../src/components/elemental/Menu/src/useMenu/IconMenu.tsx","../src/components/elemental/Menu/src/DetailMenu/DetailMenu.tsx","../src/components/elemental/Menu/src/ModelMenu/ModelMenu.tsx","../src/components/elemental/Menu/src/ModelPicker/ModelPicker.tsx"],"sourcesContent":["'use client'\nimport { useState ,forwardRef, useImperativeHandle, useMemo, useEffect } from 'react'\nimport MenuList from '@mui/material/MenuList'\nimport ListItemText from '@mui/material/ListItemText'\nimport {styled} from '@mui/material/styles'\n\nimport type {MenuOption,OnItemClickHandler,MenuRef} from '../_utils'\nimport { StyledMenuItem, StyledItemIcon } from '../MenuItem'\n\ntype Props = {\n\toptions: MenuOption[];\n optionHeader?:React.ReactNode;\n extraItemClickHandler?:OnItemClickHandler;\n menuItemProps?:{\n variant?: 'rounded' | 'square';\n fontSize?: React.CSSProperties['fontSize'];\n padding?: React.CSSProperties['padding'];\n };\n initSelected:MenuOption[\"id\"][];\n multiple?:boolean;\n autoFocusItem?:boolean;\n menuRef?:React.RefObject<HTMLUListElement|null> ;\n isIconOnly?:boolean; // if true, only icon will be shown\n sorted?:boolean; // if true, options will be sorted by label\n}\n/**\n * A Mui Menu component\n * \n * @param extraItemClickHandler - a function to be called when an item is clicked\n * \n */\nconst CustomMenuList = forwardRef<MenuRef,Props>(({\n\toptions=[],\n extraItemClickHandler,\n menuItemProps, \n initSelected=[],\n multiple=false,\n autoFocusItem,\n menuRef,\n isIconOnly=false,\n optionHeader,\n sorted=true,\n},ref) => {\n const [localSelected,setLocalSelected] = useState<Props[\"initSelected\"]>(initSelected)\n\n useImperativeHandle(ref, () => ({\n getSelectedItem: () => localSelected,\n \n }), [localSelected])\n\n useEffect(()=>{\n setLocalSelected(initSelected)\n },[initSelected])\n\n const sortedOptions = useMemo(()=>{\n if(!sorted)return options\n return [...options].sort((a, b) => {\n if(a.label && b.label){\n return a.label.toString().localeCompare(b.label.toString())\n }\n return 0\n })\n },[sorted, options])\n\n\treturn (\n\t\t<StyledMenuList ref={menuRef}\n autoFocusItem={autoFocusItem}\n fontSize={menuItemProps?.fontSize}\n padding={menuItemProps?.padding}\n >\n {optionHeader}\n {sortedOptions.map((o, i) => (\n\n <StyledMenuItem key={i} \n selected={localSelected.includes(o.id)}\n customPadding={menuItemProps?.padding}\n customFontSize={menuItemProps?.fontSize}\n onClick={(e)=>{\n if(extraItemClickHandler)extraItemClickHandler(e)\n if(multiple)setLocalSelected(old=>{\n // if already selected, remove it\n if(old.includes(o.id))return old.filter(id=>id!==o.id)\n // else add it\n return [...old,o.id]\n })\n o.onClick?.()\n }}>\n {o.icon && <StyledItemIcon isIconOnly={isIconOnly}>{o.icon}</StyledItemIcon>}\n {o.label && !isIconOnly && <ListItemText>{o.label}</ListItemText>}\n {o.extension}\n </StyledMenuItem>\n\n ))}\n </StyledMenuList>\n\t)\n})\nexport default CustomMenuList\n\ntype CustomMenuListProps = {\n fontSize?: React.CSSProperties['fontSize'];\n padding?: React.CSSProperties['padding'];\n}\nconst StyledMenuList = styled(MenuList,{\n shouldForwardProp: (prop) => \n prop !== 'fontSize'\n && prop !== 'padding',\n})<CustomMenuListProps>(p=>createMenuListTheme(p))\n\ntype StyledMenuListProps = React.ComponentProps<typeof MenuList> & CustomMenuListProps\nexport function createMenuListTheme(p:StyledMenuListProps){\n return {\n \"&.MuiList-root\":{\n padding:\"8px 4px\",\n display:\"flex\",\n flexDirection:\"column\",\n alignContent:\"center\",\n alignItems:\"center\",\n width:\"100%\",\n gap:\"2px\",\n\n \"& li\":{\n width:\"-webkit-fill-available\",\n borderRadius:\"8px\",\n minHeight:\"fit-content\",\n padding:p.padding || \"6px 16px\",\n margin:\"0\",\n overflow:\"hidden\",\n \n \"& .MuiListItemText-primary\":{\n fontSize:p.fontSize || '1rem',\n overflow:\"hidden\",\n textOverflow:\"ellipsis\",\n },\n },\n },\n }\n}","'use client'\nimport React from 'react'\nimport MenuItem from '@mui/material/MenuItem'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport { styled } from '@mui/material/styles'\n\nexport const StyledMenuItem = styled(MenuItem,{\n shouldForwardProp: (prop) => prop !== 'customPadding' && prop !== 'customFontSize',\n})<{customPadding?: React.CSSProperties['padding'], customFontSize?: React.CSSProperties['fontSize']}>(({ customPadding, customFontSize }) => ({\n width: \"-webkit-fill-available\",\n borderRadius: \"8px\",\n minHeight: \"fit-content\",\n padding: customPadding || \"6px 16px\",\n margin: \"0\",\n overflow: \"hidden\",\n gap: \"4px\",\n\n \"& .MuiListItemText-primary\": {\n fontSize: customFontSize || '1rem',\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n}));\n\nexport const StyledItemIcon = styled(ListItemIcon,{\n shouldForwardProp: (prop) => prop !== 'isIconOnly',\n})<{isIconOnly?:boolean}>({\n \"&.MuiListItemIcon-root\":{\n minWidth: \"var(--minW)\",\n },\n\n variants:[\n {\n props:{isIconOnly:true},\n style:{\n '--minW':\"0\",\n },\n },\n {\n props:{isIconOnly:false},\n style:{\n '--minW':\"auto\",\n },\n },\n {\n props:{isIconOnly:undefined}, // default\n style:{\n '--minW':\"auto\",\n }\n }\n ]\n})\n","export {default as Menu} from './Menu'\nexport {default as MenuItem} from '@mui/material/MenuItem'\nexport * from './theme'","import type { MuiComponentTheme } from '@/_utils/_types'\n\nexport const menuItemTheme = {\n defaultProps: {\n },\n styleOverrides: {\n root: {\n '--menu-item-hover-bg': 'var(--mui-palette-background-hover-1)',\n '--menu-item-selected-bg': 'var(--mui-palette-focus-1)',\n\n \"&:hover\":{\n backgroundColor:\"var(--menu-item-hover-bg)\",\n },\n \"&.Mui-selected:before\":{\n width:\"100%\",\n height:\"100%\",\n content:\"''\",\n position:\"absolute\",\n left:0,\n top:0,\n backgroundColor:\"var(--menu-item-selected-bg)\",\n overflow:\"hidden\",\n },\n\n \"& svg\":{\n fontSize:\"1.2rem\",\n },\n \n },\n\n }\n\n} as const satisfies MuiComponentTheme<\"MuiMenuItem\">\n\nexport const menuTheme = {\n styleOverrides: {\n \n },\n} as const satisfies MuiComponentTheme<\"MuiMenu\">","'use client'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport { Paper } from '@/ele/Paper'\nimport { useState, useRef } from 'react'\n\nimport {Menu} from '../Menu'\nimport type { \n\tMenuOption, \n\tOnItemClickClientArg, OnTriggerClickHandler,\n\tMenuRef,\n} from '../_utils'\n\ntype MenuPopperProps = {\n\toptions: MenuOption[];\n\tplacement?: React.ComponentProps<typeof Popper>[\"placement\"];\n\topenMenuProps: OpenMenuProps;\n\tmenuItemProps?: React.ComponentProps<typeof Menu>[\"menuItemProps\"];\n\toptionHeader?: React.ComponentProps<typeof Menu>[\"optionHeader\"];\n}\n\n/**\n * A Mui Menu component that is triggered by an icon button.\n */\nexport const MenuPopper = ({\n\tplacement=\"bottom-start\",\n\toptions=[],\n\topenMenuProps,\n\tmenuItemProps,\n\toptionHeader,\n}: MenuPopperProps) => {\n\tconst {\n\t\tcloseHandler,\n\t\tanchorEl,\n\t\tonItemClickClientArg,\n\t\tmultiple,\n\t\tref,\n\t\tmenuRef,\n\t\tinitSelected,\n\t\tsorted=true,\n\t} = openMenuProps;\n\n\tconst open = Boolean(anchorEl)\n\n\treturn (\n\t\t<Popper\n\t\t\topen={open}\n\t\t\tanchorEl={anchorEl}\n\t\t\tplacement={placement}\n\t\t\tsx={{ zIndex: \"1301\" }}\n\t\t\tmodifiers={[{\n\t\t\t\tname: 'offset',\n\t\t\t\toptions: { offset: [0, 8] }\n\t\t\t}]}\n\t\t>\n\t\t\t<Paper\n\t\t\t\tvariant='outlined'\n\t\t\t\tsx={{\n\t\t\t\t\t\"&.MuiPaper-root\":{\n\t\t\t\t\t\tpr:1,\n\t\t\t\t\t\tminWidth:150,\n\t\t\t\t\t\tmaxHeight:300,\n\t\t\t\t\t\tborderRadius:\"16px\",\n\t\t\t\t\t\toverflow:\"hidden\",\n\t\t\t\t\t\tdisplay:\"flex\",\n\t\t\t\t\t\tflexDirection:\"column\",\n\n\t\t\t\t\t\t\"& .MuiList-root\":{\n\t\t\t\t\t\t\tdisplay:\"flex\",\n\t\t\t\t\t\t\tflexDirection:\"column\",\n\t\t\t\t\t\t\talignContent:\"center\",\n\t\t\t\t\t\t\talignItems:\"center\",\n\t\t\t\t\t\t\twidth:\"100%\",\n\t\t\t\t\t\t\toverflowY:\"auto\",\n\t\t\t\t\t\t\theight:\"100%\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"& li\":{\n\t\t\t\t\t\t\twidth:\"100%\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ClickAwayListener onClickAway={closeHandler}>\n\t\t\t\t\t<Menu \n\t\t\t\t\t\tref={ref} \n\t\t\t\t\t\tmenuRef={menuRef}\n\t\t\t\t\t\tautoFocusItem={open}\n\t\t\t\t\t\tmenuItemProps={menuItemProps}\n\t\t\t\t\t\toptionHeader={optionHeader}\n\t\t\t\t\t\toptions={options} \n\t\t\t\t\t\tmultiple={multiple}\n\t\t\t\t\t\tinitSelected={initSelected}\n\t\t\t\t\t\textraItemClickHandler={(e) => {\n\t\t\t\t\t\t\tif(onItemClickClientArg) onItemClickClientArg({event:e, closeHandler})\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsorted={sorted}\n\t\t\t\t\t/>\n\t\t\t\t</ClickAwayListener>\n\t\t\t</Paper>\n\t\t</Popper>\n\t)\n}\n\nexport type OpenMenuProps = {\n\tanchorEl: HTMLButtonElement | HTMLDivElement | null;\n\tanchorPosition: {top:number; left:number};\n\tonTriggerClickHandler: OnTriggerClickHandler;\n\tonItemClickClientArg?: OnItemClickClientArg;\n\tcloseHandler: (event?: Event | React.SyntheticEvent) => void;\n\tmultiple?: boolean;\n\tref: React.RefObject<MenuRef | null>;\n\tmenuRef: React.RefObject<HTMLUListElement | null>;\n\tinitSelected: MenuOption[\"id\"][];\n\tsorted?: boolean;\n}\n\ntype UseMenuProps = {\n\tonItemClickClientArg?: OnItemClickClientArg;\n\tmultiple?: boolean;\n\tinitSelected?: OpenMenuProps[\"initSelected\"];\n\tsetSelected?: React.Dispatch<React.SetStateAction<MenuOption[\"id\"][]>>;\n}\n\nexport default function useMenu({\n\tonItemClickClientArg,\n\tmultiple=false,\n\tinitSelected=[],\n\tsetSelected,\n}: UseMenuProps): OpenMenuProps {\n\tconst [anchorEl, setAnchorEl] = useState<OpenMenuProps[\"anchorEl\"]>(null)\n\tconst [anchorPosition, setAnchorPosition] = useState<OpenMenuProps[\"anchorPosition\"]>({top:0, left:0})\n\tconst ref = useRef<MenuRef|null>(null)\n\tconst menuRef = useRef<HTMLUListElement|null>(null)\n\n\tconst closeHandler = (event?: Event | React.SyntheticEvent) => {\n\t\t// if the anchor element contains the event target, then return\n\t\tif (\n\t\t\tevent\n\t\t\t&& menuRef.current\n\t\t\t&& event.target instanceof Node\n\t\t\t&& menuRef.current.contains(event.target)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// update the selected value if setSelected is provided and multiple is true\n\t\tif(setSelected && multiple){\n\t\t\tconst localSelected = ref.current?.getSelectedItem()\n\t\t\t// only update the selected value if the selected value is an array\n\t\t\tif(localSelected && Array.isArray(localSelected)){\n\t\t\t\tsetSelected(localSelected)\n\t\t\t}\n\t\t}\n\t\tsetAnchorEl(null)\n\t}\n\n\tconst onTriggerClickHandler: OnTriggerClickHandler = (event) => {\n\t\tconst bottom = event.clientY\n\t\tconst right = event.clientX\n\t\n\t\tsetAnchorEl(event.currentTarget)\n\t\tsetAnchorPosition({top:bottom, left:right})\n\t}\n\n\treturn {\n\t\tanchorEl, \n\t\tanchorPosition,\n\t\tonTriggerClickHandler,\n\t\tonItemClickClientArg,\n\t\tcloseHandler,\n\t\tmultiple,\n\t\tref,\n\t\tinitSelected,\n\t\tmenuRef,\n\t}\n}","'use client'\nimport { useMemo } from 'react'\n\nimport { IconButton, IconButtonSpin } from '@/ele/Button'\n\nimport useMenu, { MenuPopper, type OpenMenuProps } from './useMenu'\nimport type { \n\tOnItemClickClientArg, \n\tMenuOption,\n} from '../_utils'\n\n// allow the CustomTriggerBtn to be a button or a div\nexport type TriggerBtnIconProps = {\n\ticon?: React.ReactNode;\n\ttitle?: string;\n\ticonSize?: \"small\" | \"medium\" | \"large\";\n\tonItemClickClientArg?: OnItemClickClientArg;\n\tisSpinButton?: boolean;\n} & Omit<React.ComponentProps<typeof IconButton>,\"title\"|\"size\"|\"children\"|\"onClick\">;\n\nexport type IconMenuListSlots = {\n\t/**\n\t * The component used for the trigger button.\n\t * Defaults to IconButton (or IconButtonSpin if isSpinButton is true).\n\t */\n\ttrigger?: React.ElementType;\n}\n\nexport type IconMenuListSlotProps = {\n\t/**\n\t * Props passed to the trigger component.\n\t */\n\ttrigger?: TriggerBtnIconProps;\n\t/**\n\t * Props passed to the MenuPopper component (logic props).\n\t */\n\tmenu?: Partial<OpenMenuProps>;\n\t/**\n\t * Props passed to the menu items.\n\t */\n\tmenuItem?: React.ComponentProps<typeof MenuPopper>[\"menuItemProps\"];\n\t/**\n\t * Props/Content for the option header.\n\t */\n\toptionHeader?: React.ComponentProps<typeof MenuPopper>[\"optionHeader\"];\n\t/**\n\t * Props passed to the Popper component.\n\t */\n\tpopper?: Omit<React.ComponentProps<typeof MenuPopper>, 'openMenuProps' | 'options' | 'menuItemProps' | 'optionHeader'>;\n}\n\nexport type IconMenuListProps = {\n\toptions: MenuOption[];\n\tslots?: IconMenuListSlots;\n\tslotProps?: IconMenuListSlotProps;\n}\n\n/**\n * A Mui Menu component that is triggered by an icon button.\n */\nconst IconMenuList = (props: IconMenuListProps) => {\n\tconst {\n\t\toptions=[],\n\t\tslots={},\n\t\tslotProps={},\n\t} = props;\n\n\tconst {\n\t\ttrigger: triggerProps = {},\n\t\tmenu: menuProps,\n\t\tmenuItem: menuItemProps,\n\t\toptionHeader: optionHeaderProps,\n\t\tpopper: popperProps,\n\t} = slotProps;\n\n\tconst {\n\t\ttitle,\n\t\tonItemClickClientArg,\n\t\ticon,\n\t\ticonSize=\"small\",\n\t\tisSpinButton,\n\t\t...triggerExtraProps\n\t} = triggerProps;\n\t\n\tconst p = useMenu({\n\t\tonItemClickClientArg:(p)=>{\n\t\t\tif(p.closeHandler)p.closeHandler()\n\t\t\tif(onItemClickClientArg)onItemClickClientArg(p)\n\t\t},\n\t})\n\n\tconst Trigger = useMemo(() => {\n\t\tif (slots.trigger) return slots.trigger;\n\t\tif (isSpinButton) {\n\t\t\treturn IconButtonSpin;\n\t\t} else {\n\t\t\treturn IconButton;\n\t\t}\n\t}, [isSpinButton, slots.trigger]);\n\n\treturn (\n\t\t// dont use Box here, it will cause the Button tooltip render differently\n\t\t// the height of the tooltip will be a bit off from IconButton\n\t\t<>\n\t\t\t<Trigger \n\t\t\t\ttitle={title} \n\t\t\t\tonClick={p.onTriggerClickHandler}\n\t\t\t\tsize={iconSize}\n\t\t\t\t{...triggerExtraProps}\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t</Trigger>\n\n\t\t\t<MenuPopper \n\t\t\t\topenMenuProps={{\n\t\t\t\t\t...p,\n\t\t\t\t\t...menuProps,\n\t\t\t\t}}\n\t\t\t\toptionHeader={optionHeaderProps}\n\t\t\t\toptions={options}\n\t\t\t\tmenuItemProps={menuItemProps}\n\t\t\t\t{...popperProps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nexport default IconMenuList","'use client'\n\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { InputAdornment } from '@/ele/Form'\nimport InputBase from '@mui/material/InputBase'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport type { PopperPlacementType } from '@mui/material/Popper'\nimport type { PaperProps } from '@mui/material/Paper'\nimport type { SxProps, Theme } from '@mui/material/styles'\n\nimport { Box } from '@/ele/Box'\nimport { List, ListItemButton } from '@/ele/List'\nimport { Paper } from '@/ele/Paper'\nimport { Typography } from '@/ele/Typography'\nimport { ClearIcon, SearchIcon } from '@/icons/MuiIcon'\nimport { IconButton } from '@/ele/Button'\nimport { mergeSx } from '@/_utils/_func'\n\nexport type DetailMenuOption = {\n id: string\n label: string\n /** Side-panel description when this option is hovered / focused. */\n detail?: string\n icon?: React.ReactNode\n /** Accent for detail title + selected checkmark. */\n accentColor?: string\n /** Extra text included in search matching (label is always searched). */\n keywords?: string\n /** Short pill rendered after the label (e.g. \"Fast\", \"High\"). Included in search. */\n badge?: string\n /**\n * Free-form content rendered at the bottom of this option's detail panel —\n * a slot for host-owned controls (e.g. a per-model config selector).\n * DetailMenu never interprets it.\n */\n detailSlot?: React.ReactNode\n /** Section label — an uppercase header renders above the first option of each distinct group. */\n group?: string\n /** Hide behind the \"N more\" footer row until expanded (click). Ignored while searching. */\n collapsed?: boolean\n /**\n * Trailing per-option action (e.g. a settings gear), revealed on row\n * hover/focus. Clicks inside it never trigger option selection.\n */\n actionSlot?: React.ReactNode\n}\n\ntype DetailMenuPaperSlotProps = {\n sx?: SxProps<Theme>\n} & Omit<PaperProps, 'sx' | 'children' | 'elevation'>\n\nexport type DetailMenuProps = {\n anchorEl: HTMLElement | null\n options: readonly DetailMenuOption[]\n selectedId?: string | null\n onClose: () => void\n onSelect: (id: string) => void\n placement?: PopperPlacementType\n /** Show a filter field above the list. Default false. */\n searchable?: boolean\n searchPlaceholder?: string\n /** Hover/focus preview panel beside the list. Default true. */\n showDetailPanel?: boolean\n emptySearchText?: string\n /** Label for the collapsed-options footer row (only relevant when options use `collapsed`). */\n collapsedRowLabel?: (hiddenCount: number) => string\n /**\n * Free-form footer under the option list (e.g. \"Add Models\").\n * Rendered inside the list Paper, below the scrollable list.\n */\n footerSlot?: React.ReactNode\n maxListHeight?: number | string\n listMinWidth?: number | string\n listMaxWidth?: number | string\n detailWidth?: number | string\n /**\n * Props forwarded to the list Paper (`paper`) and hover detail Paper\n * (`detailPaper`). `sx` merges after DetailMenu defaults.\n */\n slotProps?: {\n paper?: DetailMenuPaperSlotProps\n detailPaper?: DetailMenuPaperSlotProps\n }\n}\n\n/**\n * Anchored select menu with optional search and a hover detail panel —\n * the graph/mode-menu pattern used in the composer dock.\n */\nexport function DetailMenu({\n anchorEl,\n options,\n selectedId = null,\n onClose,\n onSelect,\n placement = 'top-start',\n searchable = false,\n searchPlaceholder = 'Search…',\n showDetailPanel = true,\n emptySearchText = 'No matches',\n collapsedRowLabel = (count) => `${count} more`,\n footerSlot,\n maxListHeight = 280,\n listMinWidth = 196,\n listMaxWidth = 260,\n detailWidth = 180,\n slotProps,\n}: DetailMenuProps) {\n const open = Boolean(anchorEl)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n const [query, setQuery] = useState('')\n const [expanded, setExpanded] = useState(false)\n const [detailSide, setDetailSide] = useState<'left' | 'right'>('right')\n const [detailTop, setDetailTop] = useState(0)\n const searchRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLUListElement | null>(null)\n const detailPaperRef = useRef<HTMLDivElement | null>(null)\n\n const eventOriginatedInside = (event: MouseEvent | TouchEvent) => {\n const root = rootRef.current\n if (!root) {\n return false\n }\n // composedPath keeps nodes that React may have unmounted during this\n // same click (e.g. the \"N more\" expand row). event.target alone is\n // unreliable after that update and would false-positive click-away.\n const path =\n typeof event.composedPath === 'function'\n ? event.composedPath()\n : [event.target]\n return path.some(\n (node) => node instanceof Node && (node === root || root.contains(node)),\n )\n }\n\n const { sx: paperSlotSx, ...paperSlotProps } = slotProps?.paper ?? {}\n const { sx: detailPaperSlotSx, ...detailPaperSlotProps } =\n slotProps?.detailPaper ?? {}\n\n const filteredOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase()\n if (!normalized) {\n return options\n }\n\n return options.filter((option) => {\n const haystack = [option.label, option.detail, option.badge, option.keywords]\n .filter(Boolean)\n .join(' ')\n .toLowerCase()\n return haystack.includes(normalized)\n })\n }, [options, query])\n\n // Searching bypasses collapse so hidden options still match.\n const showCollapsed = expanded || query.trim().length > 0\n const visibleOptions = showCollapsed\n ? filteredOptions\n : filteredOptions.filter((option) => !option.collapsed)\n const hiddenCount = filteredOptions.length - visibleOptions.length\n\n const updateDetailPosition = React.useCallback(() => {\n const root = rootRef.current\n if (!root || !showDetailPanel) {\n return\n }\n\n const nextSide = resolveDetailSide(root, toCssPixels(detailWidth, 180))\n setDetailSide((current) => (current === nextSide ? current : nextSide))\n\n if (!hoveredId) {\n return\n }\n\n const row = root.querySelector(\n `[data-detail-menu-option=\"${CSS.escape(hoveredId)}\"]`,\n )\n if (!(row instanceof HTMLElement)) {\n return\n }\n\n const rootRect = root.getBoundingClientRect()\n const rowRect = row.getBoundingClientRect()\n let top = rowRect.top - rootRect.top\n\n // Keep the detail panel inside the viewport when the row is near the bottom.\n const detailHeight = detailPaperRef.current?.offsetHeight ?? 0\n if (detailHeight > 0) {\n const overflow =\n rowRect.top + detailHeight - (window.innerHeight - VIEWPORT_PAD_PX)\n if (overflow > 0) {\n top -= overflow\n }\n }\n\n setDetailTop((current) =>\n Math.abs(current - top) < 0.5 ? current : top,\n )\n }, [detailWidth, hoveredId, showDetailPanel])\n\n const updateDetailPositionRef = useRef(updateDetailPosition)\n updateDetailPositionRef.current = updateDetailPosition\n\n useLayoutEffect(() => {\n if (!open || !showDetailPanel) {\n return\n }\n updateDetailPosition()\n // Second pass after the detail panel has painted so viewport clamping\n // can use the real height.\n const id = window.requestAnimationFrame(() => updateDetailPosition())\n return () => window.cancelAnimationFrame(id)\n }, [open, showDetailPanel, hoveredId, updateDetailPosition])\n\n useEffect(() => {\n if (!open || !showDetailPanel) {\n return\n }\n\n const onResize = () => updateDetailPosition()\n window.addEventListener('resize', onResize)\n const list = listRef.current\n list?.addEventListener('scroll', onResize, { passive: true })\n return () => {\n window.removeEventListener('resize', onResize)\n list?.removeEventListener('scroll', onResize)\n }\n }, [open, showDetailPanel, updateDetailPosition])\n\n // Replaced by updateDetailPosition — keep a thin alias for the popper modifier.\n const updateDetailSideRef = updateDetailPositionRef\n\n useEffect(() => {\n if (!open) {\n setHoveredId(null)\n setQuery('')\n setExpanded(false)\n setDetailSide('right')\n setDetailTop(0)\n return\n }\n\n setHoveredId(selectedId || options[0]?.id || null)\n\n if (searchable) {\n // Defer so Popper mounts before focusing.\n const id = window.requestAnimationFrame(() => {\n searchRef.current?.focus()\n })\n return () => window.cancelAnimationFrame(id)\n }\n }, [open, options, selectedId, searchable])\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n if (visibleOptions.length === 0) {\n setHoveredId(null)\n return\n }\n\n setHoveredId((current) => {\n if (current && visibleOptions.some((option) => option.id === current)) {\n return current\n }\n if (selectedId && visibleOptions.some((option) => option.id === selectedId)) {\n return selectedId\n }\n return visibleOptions[0]?.id ?? null\n })\n }, [visibleOptions, open, selectedId])\n\n const hoveredOption =\n visibleOptions.find((option) => option.id === hoveredId) ??\n visibleOptions.find((option) => option.id === selectedId) ??\n visibleOptions[0]\n\n const paperSx = {\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2.5,\n overflow: 'hidden',\n bgcolor: 'color-mix(in srgb, var(--mui-palette-background-paper), transparent 4%)',\n boxShadow: '0 12px 32px color-mix(in srgb, var(--mui-palette-common-black), transparent 78%)',\n } as const\n\n const detailPositionSx =\n detailSide === 'left'\n ? { right: 'calc(100% + 8px)', left: 'auto' }\n : { left: 'calc(100% + 8px)', right: 'auto' }\n\n const flipFallbacks =\n placement.startsWith('right')\n ? (['left-start', 'right-end', 'left-end'] as const)\n : placement.startsWith('left')\n ? (['right-start', 'left-end', 'right-end'] as const)\n : (['bottom-start', 'top-start'] as const)\n\n return (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement={placement}\n modifiers={[\n { name: 'offset', options: { offset: [0, 10] } },\n { name: 'preventOverflow', options: { padding: 8 } },\n // Keep start-aligned so the list stays under the chip; end placements\n // misalign when a wide absolute detail panel exists beside the list.\n // Side placements (ModelPicker flyout) flip left/right instead of up.\n { name: 'flip', options: { fallbackPlacements: [...flipFallbacks] } },\n {\n name: 'detailSide',\n enabled: true,\n phase: 'write',\n fn() {\n updateDetailSideRef.current()\n },\n },\n ]}\n sx={{ zIndex: (theme) => theme.zIndex.modal + 2 }}\n >\n <ClickAwayListener\n onClickAway={(event) => {\n if (eventOriginatedInside(event)) {\n return\n }\n onClose()\n }}\n >\n {/*\n Popper measures this root. Keep it sized to the list only —\n the detail panel is absolutely positioned so it does not widen\n the measured box or pull the list left under flip/end alignment.\n */}\n <Box\n ref={rootRef}\n onKeyDown={(event) => {\n if (event.key === 'Tab' && hiddenCount > 0) {\n // Keep focus inside and reveal the collapsed options.\n event.preventDefault()\n setExpanded(true)\n }\n }}\n sx={{\n position: 'relative',\n display: 'inline-block',\n verticalAlign: 'top',\n }}\n >\n <Paper\n elevation={0}\n {...paperSlotProps}\n sx={mergeSx(\n { ...paperSx, minWidth: listMinWidth, maxWidth: listMaxWidth },\n paperSlotSx,\n )}\n >\n {searchable ? (\n <Box\n sx={{\n px: 1,\n pt: 1,\n pb: 0.5,\n borderBottom: '1px solid',\n borderColor: 'divider',\n }}\n >\n <InputBase\n inputRef={searchRef}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (query) {\n setQuery('')\n return\n }\n onClose()\n }\n }}\n placeholder={searchPlaceholder}\n fullWidth\n startAdornment={\n <InputAdornment position=\"start\" sx={{ mr: 0.5 }}>\n <SearchIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n </InputAdornment>\n }\n endAdornment={\n query ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n aria-label=\"Clear search\"\n onClick={() => {\n setQuery('')\n searchRef.current?.focus()\n }}\n sx={{ p: 0.25 }}\n >\n <ClearIcon sx={{ fontSize: 14 }} />\n </IconButton>\n </InputAdornment>\n ) : null\n }\n sx={{\n px: 0.75,\n py: 0.35,\n fontSize: '0.82rem',\n borderRadius: 1.5,\n bgcolor: 'action.hover',\n '& .MuiInputBase-input': {\n py: 0.4,\n },\n }}\n />\n </Box>\n ) : null}\n\n <List\n ref={listRef}\n dense\n disablePadding\n sx={{\n py: 0.5,\n maxHeight: maxListHeight,\n overflowY: 'auto',\n }}\n >\n {visibleOptions.length === 0 && hiddenCount === 0 ? (\n <Box sx={{ px: 1.5, py: 1.25 }}>\n <Typography\n variant=\"body2\"\n sx={{ fontSize: '0.78rem', color: 'text.secondary', m: 0 }}\n >\n {emptySearchText}\n </Typography>\n </Box>\n ) : (\n <>\n {visibleOptions.map((option, index) => {\n const selected = option.id === selectedId\n const hovered = option.id === hoveredId\n const accent = option.accentColor\n const showGroupHeader =\n option.group != null &&\n (index === 0 || visibleOptions[index - 1]?.group !== option.group)\n\n return (\n <React.Fragment key={option.id}>\n {showGroupHeader ? (\n <Typography\n component=\"div\"\n sx={{\n px: 1.5,\n pt: 1,\n pb: 0.25,\n fontSize: '0.66rem',\n fontWeight: 700,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: 'text.secondary',\n m: 0,\n }}\n >\n {option.group}\n </Typography>\n ) : null}\n <ListItemButton\n selected={selected}\n data-detail-menu-option={option.id}\n onMouseEnter={() => setHoveredId(option.id)}\n onFocus={() => setHoveredId(option.id)}\n onClick={() => onSelect(option.id)}\n sx={{\n mx: 0.5,\n my: 0.15,\n px: 1,\n py: 0.85,\n gap: 1,\n borderRadius: 1.75,\n alignItems: 'center',\n '& .detail-menu-action': { opacity: 0 },\n '&:hover .detail-menu-action, &:focus-within .detail-menu-action':\n { opacity: 1 },\n '&.Mui-selected': {\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-action-selected), transparent 55%)',\n },\n '&.Mui-selected:hover': {\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-action-selected), transparent 35%)',\n },\n ...(hovered && !selected\n ? {\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-action-hover), transparent 40%)',\n }\n : null),\n }}\n >\n {option.icon ? (\n <Box\n sx={{\n width: 22,\n height: 22,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n {option.icon}\n </Box>\n ) : null}\n <Typography\n sx={{\n flex: 1,\n minWidth: 0,\n fontSize: '0.82rem',\n fontWeight: selected ? 700 : 600,\n color: selected && accent ? accent : 'text.primary',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n m: 0,\n }}\n >\n {option.label}\n </Typography>\n {option.badge ? (\n <Typography\n component=\"span\"\n sx={{\n flexShrink: 0,\n fontSize: '0.72rem',\n fontWeight: 500,\n color: 'text.secondary',\n m: 0,\n }}\n >\n {option.badge}\n </Typography>\n ) : null}\n {option.actionSlot ? (\n <Box\n component=\"span\"\n className=\"detail-menu-action\"\n onClick={(event) => event.stopPropagation()}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 18,\n flexShrink: 0,\n color: 'text.secondary',\n transition: 'opacity 120ms',\n }}\n >\n {option.actionSlot}\n </Box>\n ) : null}\n </ListItemButton>\n </React.Fragment>\n )\n })}\n {hiddenCount > 0 ? (\n <ListItemButton\n onMouseDown={(event) => {\n // Keep the click inside this menu — expanding unmounts\n // this row, which would otherwise look like a click-away.\n event.preventDefault()\n event.stopPropagation()\n }}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n setExpanded(true)\n }}\n sx={{\n mx: 0.5,\n my: 0.15,\n px: 1,\n py: 0.85,\n borderRadius: 1.75,\n alignItems: 'center',\n }}\n >\n <Typography\n sx={{\n flex: 1,\n minWidth: 0,\n fontSize: '0.78rem',\n color: 'text.secondary',\n m: 0,\n }}\n >\n {collapsedRowLabel(hiddenCount)}\n </Typography>\n </ListItemButton>\n ) : null}\n </>\n )}\n </List>\n {footerSlot ? (\n <Box\n sx={{\n borderTop: '1px solid',\n borderColor: 'divider',\n px: 0.5,\n py: 0.35,\n }}\n >\n {footerSlot}\n </Box>\n ) : null}\n </Paper>\n\n {showDetailPanel && hoveredOption ? (\n <Box\n ref={detailPaperRef}\n sx={{\n display: { xs: 'none', sm: 'block' },\n position: 'absolute',\n top: detailTop,\n ...detailPositionSx,\n width: detailWidth,\n }}\n >\n <Paper\n elevation={0}\n {...detailPaperSlotProps}\n sx={mergeSx(\n {\n px: 1.25,\n py: 1.1,\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2,\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-background-paper), transparent 4%)',\n boxShadow:\n '0 10px 28px color-mix(in srgb, var(--mui-palette-common-black), transparent 82%)',\n },\n detailPaperSlotSx,\n )}\n >\n <Typography\n sx={{\n fontSize: '0.78rem',\n fontWeight: 700,\n color: hoveredOption.accentColor || 'text.primary',\n lineHeight: 1.2,\n mt: 0,\n mx: 0,\n mb: 0.4,\n }}\n >\n {hoveredOption.label}\n </Typography>\n <Typography\n sx={{\n fontSize: '0.72rem',\n color: 'text.secondary',\n lineHeight: 1.35,\n m: 0,\n }}\n >\n {hoveredOption.detail?.trim() || '—'}\n </Typography>\n {hoveredOption.detailSlot ? (\n <Box\n sx={{\n mt: 1,\n pt: 1,\n borderTop: '1px solid',\n borderColor: 'divider',\n }}\n >\n {hoveredOption.detailSlot}\n </Box>\n ) : null}\n </Paper>\n </Box>\n ) : null}\n </Box>\n </ClickAwayListener>\n </Popper>\n )\n}\n\nconst DETAIL_GAP_PX = 8\nconst VIEWPORT_PAD_PX = 8\n\nfunction toCssPixels(value: number | string, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)px$/i)\n if (match) {\n return Number.parseFloat(match[1])\n }\n }\n\n return fallback\n}\n\nfunction resolveDetailSide(listRoot: HTMLElement, detailWidthPx: number): 'left' | 'right' {\n const rect = listRoot.getBoundingClientRect()\n const need = detailWidthPx + DETAIL_GAP_PX\n const spaceRight = window.innerWidth - rect.right - VIEWPORT_PAD_PX\n const spaceLeft = rect.left - VIEWPORT_PAD_PX\n\n if (spaceRight >= need) {\n return 'right'\n }\n if (spaceLeft >= need) {\n return 'left'\n }\n\n return spaceLeft > spaceRight ? 'left' : 'right'\n}\n\nexport default DetailMenu\n","'use client'\n\nimport { useMemo, type ReactNode } from 'react'\n\nimport { Box } from '@/ele/Box'\nimport { MemoryIcon } from '@/icons/MuiIcon'\n\nimport { DetailMenu, type DetailMenuOption, type DetailMenuProps } from '../DetailMenu'\n\nexport type ModelBrand = 'openai' | 'anthropic' | 'google' | 'meta'\n\nexport type ModelMenuOption = {\n id: string\n label: string\n /** Side-panel description when this option is hovered / focused. */\n detail?: string\n /** Optional provider key. Pass `brandIconMap` or `option.icon` for a brand mark. */\n brand?: ModelBrand | (string & {})\n /** Extra search terms merged into the filter index. */\n keywords?: string\n /** Short config pill rendered after the label (e.g. \"Fast\"); searchable. */\n badge?: string\n /** Per-option icon override; wins over the brand icon. */\n icon?: ReactNode\n /**\n * Slot rendered at the bottom of this option's detail panel — host-owned\n * config controls (e.g. a reasoning-effort selector for models that allow\n * it). ModelMenu never interprets the content; per-model capability\n * (\"does this model allow effort?\") stays with the host, which simply\n * omits the slot for models without it.\n */\n detailSlot?: ReactNode\n /** Section label — an uppercase header renders above the first option of each distinct group (e.g. \"Favorites\"). */\n group?: string\n /** Hide behind the \"N more models\" footer row until expanded (click). Ignored while searching. */\n collapsed?: boolean\n /**\n * Trailing per-option action (e.g. a settings gear), revealed on row\n * hover/focus. Clicks inside it never select the model.\n */\n actionSlot?: ReactNode\n}\n\nexport type ModelMenuProps = {\n anchorEl: HTMLElement | null\n options: readonly ModelMenuOption[]\n selectedId?: string | null\n onClose: () => void\n onSelect: (optionId: string) => void\n /** Default: on when there are 6+ options. */\n searchable?: boolean\n searchPlaceholder?: string\n /** Popper placement. Default: top-start. */\n placement?: DetailMenuProps['placement']\n /** Hover detail panel beside the list. Default true. */\n showDetailPanel?: boolean\n /** Host-owned brand marks keyed by `option.brand`. The library does not ship provider logos. */\n brandIconMap?: Record<string, ReactNode>\n slotProps?: DetailMenuProps['slotProps']\n maxListHeight?: number | string\n /** Footer under the list (e.g. \"Add Models\"). */\n footerSlot?: ReactNode\n}\n\nconst BRAND_LABELS: Record<string, string> = {\n anthropic: 'Anthropic',\n google: 'Google',\n meta: 'Meta',\n openai: 'OpenAI',\n}\n\nconst defaultBrandIcon = (): ReactNode => (\n <MemoryIcon sx={{ fontSize: 14 }} aria-hidden />\n)\n\n/**\n * Anchored model picker — DetailMenu specialized with host-owned brand\n * icons and search that turns on automatically for longer lists.\n * The model catalog and provider logos stay owned by the consuming app.\n */\nexport function ModelMenu({\n anchorEl,\n options,\n selectedId = null,\n onClose,\n onSelect,\n searchable,\n searchPlaceholder = 'Search models…',\n placement,\n showDetailPanel,\n brandIconMap,\n slotProps,\n maxListHeight,\n footerSlot,\n}: ModelMenuProps) {\n const detailOptions = useMemo<DetailMenuOption[]>(\n () =>\n options.map((option) => ({\n id: option.id,\n label: option.label,\n detail: option.detail,\n badge: option.badge,\n detailSlot: option.detailSlot,\n group: option.group,\n collapsed: option.collapsed,\n actionSlot: option.actionSlot,\n keywords: [option.brand, option.detail, option.keywords]\n .filter(Boolean)\n .join(' '),\n icon: (\n <Box\n component=\"span\"\n title={BRAND_LABELS[option.brand ?? '']}\n sx={{\n display: 'inline-flex',\n width: 20,\n height: 20,\n alignItems: 'center',\n justifyContent: 'center',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1.25,\n color: 'text.secondary',\n '& svg': { display: 'block' },\n }}\n >\n {option.icon ??\n brandIconMap?.[option.brand ?? ''] ??\n defaultBrandIcon()}\n </Box>\n ),\n })),\n [options, brandIconMap],\n )\n\n return (\n <DetailMenu\n anchorEl={anchorEl}\n options={detailOptions}\n selectedId={selectedId}\n searchable={searchable ?? options.length >= 6}\n searchPlaceholder={searchPlaceholder}\n placement={placement}\n showDetailPanel={showDetailPanel}\n collapsedRowLabel={(count) =>\n `${count} more model${count === 1 ? '' : 's'}`\n }\n onClose={onClose}\n onSelect={onSelect}\n slotProps={slotProps}\n maxListHeight={maxListHeight}\n footerSlot={footerSlot}\n />\n )\n}\n\nexport default ModelMenu\n","'use client'\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport type { SxProps, Theme } from '@mui/material/styles'\n\nimport { Box } from '@/ele/Box'\nimport { List, ListItemButton } from '@/ele/List'\nimport { Paper } from '@/ele/Paper'\nimport { Typography } from '@/ele/Typography'\nimport { KeyboardArrowRightIcon } from '@/icons/MuiIcon'\n\nimport {\n ModelMenu,\n type ModelMenuOption,\n type ModelMenuProps,\n} from '../ModelMenu'\n\nexport type ModelPickerProps = {\n anchorEl: HTMLElement | null\n options: readonly ModelMenuOption[]\n selectedId?: string | null\n onClose: () => void\n onSelect: (optionId: string) => void\n /**\n * Host-owned config controls rendered above the Model row (e.g. a\n * Reasoning Low/High/Max list). ModelPicker never interprets the content —\n * omit it when the selected model has nothing to configure.\n */\n configSlot?: ReactNode\n /** Label for the bottom Model section. Default: \"Model\". */\n modelSectionLabel?: string\n /** Forwarded to the ModelMenu flyout. */\n searchable?: boolean\n searchPlaceholder?: string\n brandIconMap?: ModelMenuProps['brandIconMap']\n slotProps?: ModelMenuProps['slotProps']\n maxListHeight?: ModelMenuProps['maxListHeight']\n /** Footer under the model list flyout (e.g. \"Add Models\"). */\n footerSlot?: ReactNode\n /**\n * Hover detail panel beside the model list (title + detail text + optional\n * detailSlot). Default true.\n */\n showDetailPanel?: boolean\n}\n\nconst paperSx = {\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2.5,\n overflow: 'hidden',\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-background-paper), transparent 4%)',\n boxShadow:\n '0 12px 32px color-mix(in srgb, var(--mui-palette-common-black), transparent 78%)',\n minWidth: 180,\n} as const\n\n/**\n * Cursor-style model picker: configure first (configSlot), change the model\n * at the bottom. The Model row opens ModelMenu as a side flyout.\n */\nexport function ModelPicker({\n anchorEl,\n options,\n selectedId = null,\n onClose,\n onSelect,\n configSlot,\n modelSectionLabel = 'Model',\n searchable,\n searchPlaceholder,\n brandIconMap,\n slotProps,\n maxListHeight,\n footerSlot,\n showDetailPanel = true,\n}: ModelPickerProps) {\n const open = Boolean(anchorEl)\n const [modelRowEl, setModelRowEl] = useState<HTMLElement | null>(null)\n const [modelFlyoutOpen, setModelFlyoutOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n const selected = useMemo(\n () => options.find((option) => option.id === selectedId) ?? options[0],\n [options, selectedId],\n )\n\n useEffect(() => {\n if (!open) {\n setModelFlyoutOpen(false)\n setModelRowEl(null)\n }\n }, [open])\n\n const closeAll = () => {\n setModelFlyoutOpen(false)\n onClose()\n }\n\n const openModelFlyout = (element: HTMLElement) => {\n setModelRowEl(element)\n setModelFlyoutOpen(true)\n }\n\n const isInsidePickerSurface = (event: MouseEvent | TouchEvent) => {\n const path =\n typeof event.composedPath === 'function'\n ? event.composedPath()\n : [event.target]\n return path.some((node) => {\n if (!(node instanceof Element)) {\n return false\n }\n if (rootRef.current?.contains(node)) {\n return true\n }\n // ModelMenu portals its Paper to document.body — tag it so click-away\n // does not treat expand / model selection as \"outside\". Prefer the path\n // attribute check so a row that React unmounted mid-click still counts.\n return (\n node.hasAttribute('data-model-picker-flyout') ||\n Boolean(node.closest('[data-model-picker-flyout]'))\n )\n })\n }\n\n const flyoutSlotProps = useMemo<ModelMenuProps['slotProps']>(() => {\n const paper = slotProps?.paper\n const detailPaper = slotProps?.detailPaper\n // Tag list + detail Papers so click-away keeps the config menu open —\n // the detail panel sits outside the list Paper as an absolute sibling.\n const flyoutTag = { 'data-model-picker-flyout': '' } as const\n return {\n ...slotProps,\n paper: {\n ...paper,\n ...flyoutTag,\n } as NonNullable<ModelMenuProps['slotProps']>['paper'],\n detailPaper: {\n ...detailPaper,\n ...flyoutTag,\n } as NonNullable<ModelMenuProps['slotProps']>['detailPaper'],\n }\n }, [slotProps])\n\n return (\n <>\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"top-start\"\n modifiers={[\n { name: 'offset', options: { offset: [0, 10] } },\n { name: 'preventOverflow', options: { padding: 8 } },\n {\n name: 'flip',\n options: { fallbackPlacements: ['bottom-start', 'top-start'] },\n },\n ]}\n sx={{ zIndex: (theme) => theme.zIndex.modal + 2 }}\n >\n <ClickAwayListener\n onClickAway={(event) => {\n if (isInsidePickerSurface(event)) {\n return\n }\n closeAll()\n }}\n >\n <Box ref={rootRef} sx={{ display: 'inline-block' }}>\n <Paper\n elevation={0}\n sx={paperSx as SxProps<Theme>}\n >\n {configSlot ? (\n <Box sx={{ px: 0.5, pt: 0.5, pb: 0.25 }}>{configSlot}</Box>\n ) : null}\n\n {configSlot ? (\n <Box\n sx={{\n borderTop: '1px solid',\n borderColor: 'divider',\n mx: 1,\n }}\n />\n ) : null}\n\n <Box sx={{ px: 0.5, pb: 0.5, pt: configSlot ? 0.25 : 0.5 }}>\n <Typography\n component=\"div\"\n sx={{\n px: 1,\n pt: 0.5,\n pb: 0.15,\n fontSize: '0.66rem',\n fontWeight: 700,\n letterSpacing: '0.04em',\n color: 'text.secondary',\n m: 0,\n }}\n >\n {modelSectionLabel}\n </Typography>\n <List dense disablePadding>\n <ListItemButton\n onMouseEnter={(event) => openModelFlyout(event.currentTarget)}\n onClick={(event) => openModelFlyout(event.currentTarget)}\n sx={{\n mx: 0.5,\n my: 0.15,\n px: 1,\n py: 0.75,\n gap: 1,\n borderRadius: 1.5,\n alignItems: 'center',\n bgcolor: 'action.hover',\n '&:hover': { bgcolor: 'action.selected' },\n }}\n >\n <Typography\n sx={{\n flex: 1,\n minWidth: 0,\n fontSize: '0.82rem',\n fontWeight: 600,\n color: 'text.primary',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n m: 0,\n }}\n >\n {selected?.label ?? 'Select model'}\n </Typography>\n <KeyboardArrowRightIcon\n sx={{ fontSize: 16, color: 'text.secondary', flexShrink: 0 }}\n />\n </ListItemButton>\n </List>\n </Box>\n </Paper>\n </Box>\n </ClickAwayListener>\n </Popper>\n\n {modelFlyoutOpen ? (\n <ModelMenu\n anchorEl={modelRowEl}\n options={options}\n selectedId={selectedId}\n searchable={searchable}\n searchPlaceholder={searchPlaceholder}\n brandIconMap={brandIconMap}\n slotProps={flyoutSlotProps}\n maxListHeight={maxListHeight}\n footerSlot={footerSlot}\n placement=\"right-start\"\n showDetailPanel={showDetailPanel}\n onClose={() => setModelFlyoutOpen(false)}\n onSelect={(id) => {\n // Keep the config menu open — Cursor stays open so you can keep\n // adjusting Effort/Options after changing the model.\n onSelect(id)\n }}\n />\n ) : null}\n </>\n )\n}\n\nexport default ModelPicker\n"],"mappings":"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","names":["styled","styled","default","useState","jsx","default","useState","useMemo","jsx","jsxs","p","useMemo","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","paperSx","default","useMemo","jsx","default","useMemo","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","default"]}
1
+ {"version":3,"sources":["../src/components/elemental/Menu/src/Menu/Menu.tsx","../src/components/elemental/Menu/src/MenuItem.tsx","../src/components/elemental/Menu/src/Menu/index.ts","../src/components/elemental/Menu/src/Menu/theme.ts","../src/components/elemental/Menu/src/useMenu/useMenu.tsx","../src/components/elemental/Menu/src/useMenu/IconMenu.tsx","../src/components/elemental/Menu/src/DetailMenu/DetailMenu.tsx","../src/components/elemental/Menu/src/ModelMenu/ModelMenu.tsx","../src/components/elemental/Menu/src/ModelPicker/ModelPicker.tsx"],"sourcesContent":["'use client'\nimport { useState ,forwardRef, useImperativeHandle, useMemo, useEffect } from 'react'\nimport MenuList from '@mui/material/MenuList'\nimport ListItemText from '@mui/material/ListItemText'\nimport {styled} from '@mui/material/styles'\n\nimport type {MenuOption,OnItemClickHandler,MenuRef} from '../_utils'\nimport { StyledMenuItem, StyledItemIcon } from '../MenuItem'\n\ntype Props = {\n\toptions: MenuOption[];\n optionHeader?:React.ReactNode;\n extraItemClickHandler?:OnItemClickHandler;\n menuItemProps?:{\n variant?: 'rounded' | 'square';\n fontSize?: React.CSSProperties['fontSize'];\n padding?: React.CSSProperties['padding'];\n };\n initSelected:MenuOption[\"id\"][];\n multiple?:boolean;\n autoFocusItem?:boolean;\n menuRef?:React.RefObject<HTMLUListElement|null> ;\n isIconOnly?:boolean; // if true, only icon will be shown\n sorted?:boolean; // if true, options will be sorted by label\n}\n/**\n * A Mui Menu component\n * \n * @param extraItemClickHandler - a function to be called when an item is clicked\n * \n */\nconst CustomMenuList = forwardRef<MenuRef,Props>(({\n\toptions=[],\n extraItemClickHandler,\n menuItemProps, \n initSelected=[],\n multiple=false,\n autoFocusItem,\n menuRef,\n isIconOnly=false,\n optionHeader,\n sorted=true,\n},ref) => {\n const [localSelected,setLocalSelected] = useState<Props[\"initSelected\"]>(initSelected)\n\n useImperativeHandle(ref, () => ({\n getSelectedItem: () => localSelected,\n \n }), [localSelected])\n\n useEffect(()=>{\n setLocalSelected(initSelected)\n },[initSelected])\n\n const sortedOptions = useMemo(()=>{\n if(!sorted)return options\n return [...options].sort((a, b) => {\n if(a.label && b.label){\n return a.label.toString().localeCompare(b.label.toString())\n }\n return 0\n })\n },[sorted, options])\n\n\treturn (\n\t\t<StyledMenuList ref={menuRef}\n autoFocusItem={autoFocusItem}\n fontSize={menuItemProps?.fontSize}\n padding={menuItemProps?.padding}\n >\n {optionHeader}\n {sortedOptions.map((o, i) => (\n\n <StyledMenuItem key={i} \n selected={localSelected.includes(o.id)}\n customPadding={menuItemProps?.padding}\n customFontSize={menuItemProps?.fontSize}\n onClick={(e)=>{\n if(extraItemClickHandler)extraItemClickHandler(e)\n if(multiple)setLocalSelected(old=>{\n // if already selected, remove it\n if(old.includes(o.id))return old.filter(id=>id!==o.id)\n // else add it\n return [...old,o.id]\n })\n o.onClick?.()\n }}>\n {o.icon && <StyledItemIcon isIconOnly={isIconOnly}>{o.icon}</StyledItemIcon>}\n {o.label && !isIconOnly && <ListItemText>{o.label}</ListItemText>}\n {o.extension}\n </StyledMenuItem>\n\n ))}\n </StyledMenuList>\n\t)\n})\nexport default CustomMenuList\n\ntype CustomMenuListProps = {\n fontSize?: React.CSSProperties['fontSize'];\n padding?: React.CSSProperties['padding'];\n}\nconst StyledMenuList = styled(MenuList,{\n shouldForwardProp: (prop) => \n prop !== 'fontSize'\n && prop !== 'padding',\n})<CustomMenuListProps>(p=>createMenuListTheme(p))\n\ntype StyledMenuListProps = React.ComponentProps<typeof MenuList> & CustomMenuListProps\nexport function createMenuListTheme(p:StyledMenuListProps){\n return {\n \"&.MuiList-root\":{\n padding:\"8px 4px\",\n display:\"flex\",\n flexDirection:\"column\",\n alignContent:\"center\",\n alignItems:\"center\",\n width:\"100%\",\n gap:\"2px\",\n\n \"& li\":{\n width:\"-webkit-fill-available\",\n borderRadius:\"8px\",\n minHeight:\"fit-content\",\n padding:p.padding || \"6px 16px\",\n margin:\"0\",\n overflow:\"hidden\",\n \n \"& .MuiListItemText-primary\":{\n fontSize:p.fontSize || '1rem',\n overflow:\"hidden\",\n textOverflow:\"ellipsis\",\n },\n },\n },\n }\n}","'use client'\nimport React from 'react'\nimport MenuItem from '@mui/material/MenuItem'\nimport ListItemIcon from '@mui/material/ListItemIcon'\nimport { styled } from '@mui/material/styles'\n\nexport const StyledMenuItem = styled(MenuItem,{\n shouldForwardProp: (prop) => prop !== 'customPadding' && prop !== 'customFontSize',\n})<{customPadding?: React.CSSProperties['padding'], customFontSize?: React.CSSProperties['fontSize']}>(({ customPadding, customFontSize }) => ({\n width: \"-webkit-fill-available\",\n borderRadius: \"8px\",\n minHeight: \"fit-content\",\n padding: customPadding || \"6px 16px\",\n margin: \"0\",\n overflow: \"hidden\",\n gap: \"4px\",\n\n \"& .MuiListItemText-primary\": {\n fontSize: customFontSize || '1rem',\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n },\n}));\n\nexport const StyledItemIcon = styled(ListItemIcon,{\n shouldForwardProp: (prop) => prop !== 'isIconOnly',\n})<{isIconOnly?:boolean}>({\n \"&.MuiListItemIcon-root\":{\n minWidth: \"var(--minW)\",\n },\n\n variants:[\n {\n props:{isIconOnly:true},\n style:{\n '--minW':\"0\",\n },\n },\n {\n props:{isIconOnly:false},\n style:{\n '--minW':\"auto\",\n },\n },\n {\n props:{isIconOnly:undefined}, // default\n style:{\n '--minW':\"auto\",\n }\n }\n ]\n})\n","export {default as Menu} from './Menu'\nexport {default as MenuItem} from '@mui/material/MenuItem'\nexport * from './theme'","import type { MuiComponentTheme } from '@/_utils/_types'\n\nexport const menuItemTheme = {\n defaultProps: {\n },\n styleOverrides: {\n root: {\n '--menu-item-hover-bg': 'var(--mui-palette-background-hover-1)',\n '--menu-item-selected-bg': 'var(--mui-palette-focus-1)',\n\n \"&:hover\":{\n backgroundColor:\"var(--menu-item-hover-bg)\",\n },\n \"&.Mui-selected:before\":{\n width:\"100%\",\n height:\"100%\",\n content:\"''\",\n position:\"absolute\",\n left:0,\n top:0,\n backgroundColor:\"var(--menu-item-selected-bg)\",\n overflow:\"hidden\",\n },\n\n \"& svg\":{\n fontSize:\"1.2rem\",\n },\n \n },\n\n }\n\n} as const satisfies MuiComponentTheme<\"MuiMenuItem\">\n\nexport const menuTheme = {\n styleOverrides: {\n \n },\n} as const satisfies MuiComponentTheme<\"MuiMenu\">","'use client'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport { Paper } from '@/ele/Paper'\nimport { useState, useRef } from 'react'\n\nimport {Menu} from '../Menu'\nimport type { \n\tMenuOption, \n\tOnItemClickClientArg, OnTriggerClickHandler,\n\tMenuRef,\n} from '../_utils'\n\ntype MenuPopperProps = {\n\toptions: MenuOption[];\n\tplacement?: React.ComponentProps<typeof Popper>[\"placement\"];\n\topenMenuProps: OpenMenuProps;\n\tmenuItemProps?: React.ComponentProps<typeof Menu>[\"menuItemProps\"];\n\toptionHeader?: React.ComponentProps<typeof Menu>[\"optionHeader\"];\n}\n\n/**\n * A Mui Menu component that is triggered by an icon button.\n */\nexport const MenuPopper = ({\n\tplacement=\"bottom-start\",\n\toptions=[],\n\topenMenuProps,\n\tmenuItemProps,\n\toptionHeader,\n}: MenuPopperProps) => {\n\tconst {\n\t\tcloseHandler,\n\t\tanchorEl,\n\t\tonItemClickClientArg,\n\t\tmultiple,\n\t\tref,\n\t\tmenuRef,\n\t\tinitSelected,\n\t\tsorted=true,\n\t} = openMenuProps;\n\n\tconst open = Boolean(anchorEl)\n\n\treturn (\n\t\t<Popper\n\t\t\topen={open}\n\t\t\tanchorEl={anchorEl}\n\t\t\tplacement={placement}\n\t\t\tsx={{ zIndex: \"1301\" }}\n\t\t\tmodifiers={[{\n\t\t\t\tname: 'offset',\n\t\t\t\toptions: { offset: [0, 8] }\n\t\t\t}]}\n\t\t>\n\t\t\t<Paper\n\t\t\t\tvariant='outlined'\n\t\t\t\tsx={{\n\t\t\t\t\t\"&.MuiPaper-root\":{\n\t\t\t\t\t\tpr:1,\n\t\t\t\t\t\tminWidth:150,\n\t\t\t\t\t\tmaxHeight:300,\n\t\t\t\t\t\tborderRadius:\"16px\",\n\t\t\t\t\t\toverflow:\"hidden\",\n\t\t\t\t\t\tdisplay:\"flex\",\n\t\t\t\t\t\tflexDirection:\"column\",\n\n\t\t\t\t\t\t\"& .MuiList-root\":{\n\t\t\t\t\t\t\tdisplay:\"flex\",\n\t\t\t\t\t\t\tflexDirection:\"column\",\n\t\t\t\t\t\t\talignContent:\"center\",\n\t\t\t\t\t\t\talignItems:\"center\",\n\t\t\t\t\t\t\twidth:\"100%\",\n\t\t\t\t\t\t\toverflowY:\"auto\",\n\t\t\t\t\t\t\theight:\"100%\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t\"& li\":{\n\t\t\t\t\t\t\twidth:\"100%\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<ClickAwayListener onClickAway={closeHandler}>\n\t\t\t\t\t<Menu \n\t\t\t\t\t\tref={ref} \n\t\t\t\t\t\tmenuRef={menuRef}\n\t\t\t\t\t\tautoFocusItem={open}\n\t\t\t\t\t\tmenuItemProps={menuItemProps}\n\t\t\t\t\t\toptionHeader={optionHeader}\n\t\t\t\t\t\toptions={options} \n\t\t\t\t\t\tmultiple={multiple}\n\t\t\t\t\t\tinitSelected={initSelected}\n\t\t\t\t\t\textraItemClickHandler={(e) => {\n\t\t\t\t\t\t\tif(onItemClickClientArg) onItemClickClientArg({event:e, closeHandler})\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tsorted={sorted}\n\t\t\t\t\t/>\n\t\t\t\t</ClickAwayListener>\n\t\t\t</Paper>\n\t\t</Popper>\n\t)\n}\n\nexport type OpenMenuProps = {\n\tanchorEl: HTMLButtonElement | HTMLDivElement | null;\n\tanchorPosition: {top:number; left:number};\n\tonTriggerClickHandler: OnTriggerClickHandler;\n\tonItemClickClientArg?: OnItemClickClientArg;\n\tcloseHandler: (event?: Event | React.SyntheticEvent) => void;\n\tmultiple?: boolean;\n\tref: React.RefObject<MenuRef | null>;\n\tmenuRef: React.RefObject<HTMLUListElement | null>;\n\tinitSelected: MenuOption[\"id\"][];\n\tsorted?: boolean;\n}\n\ntype UseMenuProps = {\n\tonItemClickClientArg?: OnItemClickClientArg;\n\tmultiple?: boolean;\n\tinitSelected?: OpenMenuProps[\"initSelected\"];\n\tsetSelected?: React.Dispatch<React.SetStateAction<MenuOption[\"id\"][]>>;\n}\n\nexport default function useMenu({\n\tonItemClickClientArg,\n\tmultiple=false,\n\tinitSelected=[],\n\tsetSelected,\n}: UseMenuProps): OpenMenuProps {\n\tconst [anchorEl, setAnchorEl] = useState<OpenMenuProps[\"anchorEl\"]>(null)\n\tconst [anchorPosition, setAnchorPosition] = useState<OpenMenuProps[\"anchorPosition\"]>({top:0, left:0})\n\tconst ref = useRef<MenuRef|null>(null)\n\tconst menuRef = useRef<HTMLUListElement|null>(null)\n\n\tconst closeHandler = (event?: Event | React.SyntheticEvent) => {\n\t\t// if the anchor element contains the event target, then return\n\t\tif (\n\t\t\tevent\n\t\t\t&& menuRef.current\n\t\t\t&& event.target instanceof Node\n\t\t\t&& menuRef.current.contains(event.target)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// update the selected value if setSelected is provided and multiple is true\n\t\tif(setSelected && multiple){\n\t\t\tconst localSelected = ref.current?.getSelectedItem()\n\t\t\t// only update the selected value if the selected value is an array\n\t\t\tif(localSelected && Array.isArray(localSelected)){\n\t\t\t\tsetSelected(localSelected)\n\t\t\t}\n\t\t}\n\t\tsetAnchorEl(null)\n\t}\n\n\tconst onTriggerClickHandler: OnTriggerClickHandler = (event) => {\n\t\tconst bottom = event.clientY\n\t\tconst right = event.clientX\n\t\n\t\tsetAnchorEl(event.currentTarget)\n\t\tsetAnchorPosition({top:bottom, left:right})\n\t}\n\n\treturn {\n\t\tanchorEl, \n\t\tanchorPosition,\n\t\tonTriggerClickHandler,\n\t\tonItemClickClientArg,\n\t\tcloseHandler,\n\t\tmultiple,\n\t\tref,\n\t\tinitSelected,\n\t\tmenuRef,\n\t}\n}","'use client'\nimport { useMemo } from 'react'\n\nimport { IconButton, IconButtonSpin } from '@/ele/Button'\n\nimport useMenu, { MenuPopper, type OpenMenuProps } from './useMenu'\nimport type { \n\tOnItemClickClientArg, \n\tMenuOption,\n} from '../_utils'\n\n// allow the CustomTriggerBtn to be a button or a div\nexport type TriggerBtnIconProps = {\n\ticon?: React.ReactNode;\n\ttitle?: string;\n\ticonSize?: \"small\" | \"medium\" | \"large\";\n\tonItemClickClientArg?: OnItemClickClientArg;\n\tisSpinButton?: boolean;\n} & Omit<React.ComponentProps<typeof IconButton>,\"title\"|\"size\"|\"children\"|\"onClick\">;\n\nexport type IconMenuListSlots = {\n\t/**\n\t * The component used for the trigger button.\n\t * Defaults to IconButton (or IconButtonSpin if isSpinButton is true).\n\t */\n\ttrigger?: React.ElementType;\n}\n\nexport type IconMenuListSlotProps = {\n\t/**\n\t * Props passed to the trigger component.\n\t */\n\ttrigger?: TriggerBtnIconProps;\n\t/**\n\t * Props passed to the MenuPopper component (logic props).\n\t */\n\tmenu?: Partial<OpenMenuProps>;\n\t/**\n\t * Props passed to the menu items.\n\t */\n\tmenuItem?: React.ComponentProps<typeof MenuPopper>[\"menuItemProps\"];\n\t/**\n\t * Props/Content for the option header.\n\t */\n\toptionHeader?: React.ComponentProps<typeof MenuPopper>[\"optionHeader\"];\n\t/**\n\t * Props passed to the Popper component.\n\t */\n\tpopper?: Omit<React.ComponentProps<typeof MenuPopper>, 'openMenuProps' | 'options' | 'menuItemProps' | 'optionHeader'>;\n}\n\nexport type IconMenuListProps = {\n\toptions: MenuOption[];\n\tslots?: IconMenuListSlots;\n\tslotProps?: IconMenuListSlotProps;\n}\n\n/**\n * A Mui Menu component that is triggered by an icon button.\n */\nconst IconMenuList = (props: IconMenuListProps) => {\n\tconst {\n\t\toptions=[],\n\t\tslots={},\n\t\tslotProps={},\n\t} = props;\n\n\tconst {\n\t\ttrigger: triggerProps = {},\n\t\tmenu: menuProps,\n\t\tmenuItem: menuItemProps,\n\t\toptionHeader: optionHeaderProps,\n\t\tpopper: popperProps,\n\t} = slotProps;\n\n\tconst {\n\t\ttitle,\n\t\tonItemClickClientArg,\n\t\ticon,\n\t\ticonSize=\"small\",\n\t\tisSpinButton,\n\t\t...triggerExtraProps\n\t} = triggerProps;\n\t\n\tconst p = useMenu({\n\t\tonItemClickClientArg:(p)=>{\n\t\t\tif(p.closeHandler)p.closeHandler()\n\t\t\tif(onItemClickClientArg)onItemClickClientArg(p)\n\t\t},\n\t})\n\n\tconst Trigger = useMemo(() => {\n\t\tif (slots.trigger) return slots.trigger;\n\t\tif (isSpinButton) {\n\t\t\treturn IconButtonSpin;\n\t\t} else {\n\t\t\treturn IconButton;\n\t\t}\n\t}, [isSpinButton, slots.trigger]);\n\n\treturn (\n\t\t// dont use Box here, it will cause the Button tooltip render differently\n\t\t// the height of the tooltip will be a bit off from IconButton\n\t\t<>\n\t\t\t<Trigger \n\t\t\t\ttitle={title} \n\t\t\t\tonClick={p.onTriggerClickHandler}\n\t\t\t\tsize={iconSize}\n\t\t\t\t{...triggerExtraProps}\n\t\t\t>\n\t\t\t\t{icon}\n\t\t\t</Trigger>\n\n\t\t\t<MenuPopper \n\t\t\t\topenMenuProps={{\n\t\t\t\t\t...p,\n\t\t\t\t\t...menuProps,\n\t\t\t\t}}\n\t\t\t\toptionHeader={optionHeaderProps}\n\t\t\t\toptions={options}\n\t\t\t\tmenuItemProps={menuItemProps}\n\t\t\t\t{...popperProps}\n\t\t\t/>\n\t\t</>\n\t)\n}\n\nexport default IconMenuList","'use client'\n\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { InputAdornment } from '@/ele/Form'\nimport InputBase from '@mui/material/InputBase'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport type { PopperPlacementType } from '@mui/material/Popper'\nimport type { PaperProps } from '@mui/material/Paper'\nimport type { SxProps, Theme } from '@mui/material/styles'\n\nimport { Box } from '@/ele/Box'\nimport { List, ListItemButton } from '@/ele/List'\nimport { Paper } from '@/ele/Paper'\nimport { Typography } from '@/ele/Typography'\nimport { ClearIcon, SearchIcon } from '@/icons/MuiIcon'\nimport { IconButton } from '@/ele/Button'\nimport { mergeSx } from '@/_utils/_func'\n\nexport type DetailMenuOption = {\n id: string\n label: string\n /** Side-panel description when this option is hovered / focused. */\n detail?: string\n icon?: React.ReactNode\n /** Accent for detail title + selected checkmark. */\n accentColor?: string\n /** Extra text included in search matching (label is always searched). */\n keywords?: string\n /** Short pill rendered after the label (e.g. \"Fast\", \"High\"). Included in search. */\n badge?: string\n /**\n * Free-form content rendered at the bottom of this option's detail panel —\n * a slot for host-owned controls (e.g. a per-model config selector).\n * DetailMenu never interprets it.\n */\n detailSlot?: React.ReactNode\n /** Section label — an uppercase header renders above the first option of each distinct group. */\n group?: string\n /** Hide behind the \"N more\" footer row until expanded (click). Ignored while searching. */\n collapsed?: boolean\n /**\n * Trailing per-option action (e.g. a settings gear), revealed on row\n * hover/focus. Clicks inside it never trigger option selection.\n */\n actionSlot?: React.ReactNode\n}\n\ntype DetailMenuPaperSlotProps = {\n sx?: SxProps<Theme>\n} & Omit<PaperProps, 'sx' | 'children' | 'elevation'>\n\nexport type DetailMenuProps = {\n anchorEl: HTMLElement | null\n options: readonly DetailMenuOption[]\n selectedId?: string | null\n onClose: () => void\n onSelect: (id: string) => void\n placement?: PopperPlacementType\n /** Show a filter field above the list. Default false. */\n searchable?: boolean\n searchPlaceholder?: string\n /** Hover/focus preview panel beside the list. Default true. */\n showDetailPanel?: boolean\n emptySearchText?: string\n /** Label for the collapsed-options footer row (only relevant when options use `collapsed`). */\n collapsedRowLabel?: (hiddenCount: number) => string\n /**\n * Free-form footer under the option list (e.g. \"Add Models\").\n * Rendered inside the list Paper, below the scrollable list.\n */\n footerSlot?: React.ReactNode\n maxListHeight?: number | string\n listMinWidth?: number | string\n listMaxWidth?: number | string\n detailWidth?: number | string\n /**\n * Props forwarded to the list Paper (`paper`) and hover detail Paper\n * (`detailPaper`). `sx` merges after DetailMenu defaults.\n */\n slotProps?: {\n paper?: DetailMenuPaperSlotProps\n detailPaper?: DetailMenuPaperSlotProps\n }\n}\n\n/**\n * Anchored select menu with optional search and a hover detail panel —\n * the graph/mode-menu pattern used in the composer dock.\n */\nexport function DetailMenu({\n anchorEl,\n options,\n selectedId = null,\n onClose,\n onSelect,\n placement = 'top-start',\n searchable = false,\n searchPlaceholder = 'Search…',\n showDetailPanel = true,\n emptySearchText = 'No matches',\n collapsedRowLabel = (count) => `${count} more`,\n footerSlot,\n maxListHeight = 280,\n listMinWidth = 196,\n listMaxWidth = 260,\n detailWidth = 180,\n slotProps,\n}: DetailMenuProps) {\n const open = Boolean(anchorEl)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n const [query, setQuery] = useState('')\n const [expanded, setExpanded] = useState(false)\n const [detailSide, setDetailSide] = useState<'left' | 'right'>('right')\n const [detailTop, setDetailTop] = useState(0)\n const searchRef = useRef<HTMLInputElement>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const listRef = useRef<HTMLUListElement | null>(null)\n const detailPaperRef = useRef<HTMLDivElement | null>(null)\n\n const eventOriginatedInside = (event: MouseEvent | TouchEvent) => {\n const root = rootRef.current\n if (!root) {\n return false\n }\n // composedPath keeps nodes that React may have unmounted during this\n // same click (e.g. the \"N more\" expand row). event.target alone is\n // unreliable after that update and would false-positive click-away.\n const path =\n typeof event.composedPath === 'function'\n ? event.composedPath()\n : [event.target]\n return path.some(\n (node) => node instanceof Node && (node === root || root.contains(node)),\n )\n }\n\n const { sx: paperSlotSx, ...paperSlotProps } = slotProps?.paper ?? {}\n const { sx: detailPaperSlotSx, ...detailPaperSlotProps } =\n slotProps?.detailPaper ?? {}\n\n const filteredOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase()\n if (!normalized) {\n return options\n }\n\n return options.filter((option) => {\n const haystack = [option.label, option.detail, option.badge, option.keywords]\n .filter(Boolean)\n .join(' ')\n .toLowerCase()\n return haystack.includes(normalized)\n })\n }, [options, query])\n\n // Searching bypasses collapse so hidden options still match.\n const showCollapsed = expanded || query.trim().length > 0\n const visibleOptions = showCollapsed\n ? filteredOptions\n : filteredOptions.filter((option) => !option.collapsed)\n const hiddenCount = filteredOptions.length - visibleOptions.length\n\n const updateDetailPosition = React.useCallback(() => {\n const root = rootRef.current\n if (!root || !showDetailPanel) {\n return\n }\n\n const nextSide = resolveDetailSide(root, toCssPixels(detailWidth, 180))\n setDetailSide((current) => (current === nextSide ? current : nextSide))\n\n if (!hoveredId) {\n return\n }\n\n const row = root.querySelector(\n `[data-detail-menu-option=\"${CSS.escape(hoveredId)}\"]`,\n )\n if (!(row instanceof HTMLElement)) {\n return\n }\n\n const rootRect = root.getBoundingClientRect()\n const rowRect = row.getBoundingClientRect()\n let top = rowRect.top - rootRect.top\n\n // Keep the detail panel inside the viewport when the row is near the bottom.\n const detailHeight = detailPaperRef.current?.offsetHeight ?? 0\n if (detailHeight > 0) {\n const overflow =\n rowRect.top + detailHeight - (window.innerHeight - VIEWPORT_PAD_PX)\n if (overflow > 0) {\n top -= overflow\n }\n }\n\n setDetailTop((current) =>\n Math.abs(current - top) < 0.5 ? current : top,\n )\n }, [detailWidth, hoveredId, showDetailPanel])\n\n const updateDetailPositionRef = useRef(updateDetailPosition)\n updateDetailPositionRef.current = updateDetailPosition\n\n useLayoutEffect(() => {\n if (!open || !showDetailPanel) {\n return\n }\n updateDetailPosition()\n // Second pass after the detail panel has painted so viewport clamping\n // can use the real height.\n const id = window.requestAnimationFrame(() => updateDetailPosition())\n return () => window.cancelAnimationFrame(id)\n }, [open, showDetailPanel, hoveredId, updateDetailPosition])\n\n useEffect(() => {\n if (!open || !showDetailPanel) {\n return\n }\n\n const onResize = () => updateDetailPosition()\n window.addEventListener('resize', onResize)\n const list = listRef.current\n list?.addEventListener('scroll', onResize, { passive: true })\n return () => {\n window.removeEventListener('resize', onResize)\n list?.removeEventListener('scroll', onResize)\n }\n }, [open, showDetailPanel, updateDetailPosition])\n\n // Replaced by updateDetailPosition — keep a thin alias for the popper modifier.\n const updateDetailSideRef = updateDetailPositionRef\n\n useEffect(() => {\n if (!open) {\n setHoveredId(null)\n setQuery('')\n setExpanded(false)\n setDetailSide('right')\n setDetailTop(0)\n return\n }\n\n setHoveredId(selectedId || options[0]?.id || null)\n\n if (searchable) {\n // Defer so Popper mounts before focusing.\n const id = window.requestAnimationFrame(() => {\n searchRef.current?.focus()\n })\n return () => window.cancelAnimationFrame(id)\n }\n }, [open, options, selectedId, searchable])\n\n useEffect(() => {\n if (!open) {\n return\n }\n\n if (visibleOptions.length === 0) {\n setHoveredId(null)\n return\n }\n\n setHoveredId((current) => {\n if (current && visibleOptions.some((option) => option.id === current)) {\n return current\n }\n if (selectedId && visibleOptions.some((option) => option.id === selectedId)) {\n return selectedId\n }\n return visibleOptions[0]?.id ?? null\n })\n }, [visibleOptions, open, selectedId])\n\n const hoveredOption =\n visibleOptions.find((option) => option.id === hoveredId) ??\n visibleOptions.find((option) => option.id === selectedId) ??\n visibleOptions[0]\n\n const paperSx = {\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2.5,\n overflow: 'hidden',\n bgcolor: 'color-mix(in srgb, var(--mui-palette-background-paper), transparent 4%)',\n boxShadow: '0 12px 32px color-mix(in srgb, var(--mui-palette-common-black), transparent 78%)',\n } as const\n\n const detailPositionSx =\n detailSide === 'left'\n ? { right: 'calc(100% + 8px)', left: 'auto' }\n : { left: 'calc(100% + 8px)', right: 'auto' }\n\n const flipFallbacks =\n placement.startsWith('right')\n ? (['left-start', 'right-end', 'left-end'] as const)\n : placement.startsWith('left')\n ? (['right-start', 'left-end', 'right-end'] as const)\n : (['bottom-start', 'top-start'] as const)\n\n return (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement={placement}\n modifiers={[\n { name: 'offset', options: { offset: [0, 10] } },\n { name: 'preventOverflow', options: { padding: 8 } },\n // Keep start-aligned so the list stays under the chip; end placements\n // misalign when a wide absolute detail panel exists beside the list.\n // Side placements (ModelPicker flyout) flip left/right instead of up.\n { name: 'flip', options: { fallbackPlacements: [...flipFallbacks] } },\n {\n name: 'detailSide',\n enabled: true,\n phase: 'write',\n fn() {\n updateDetailSideRef.current()\n },\n },\n ]}\n sx={{ zIndex: (theme) => theme.zIndex.modal + 2 }}\n >\n <ClickAwayListener\n onClickAway={(event) => {\n if (eventOriginatedInside(event)) {\n return\n }\n onClose()\n }}\n >\n {/*\n Popper measures this root. Keep it sized to the list only —\n the detail panel is absolutely positioned so it does not widen\n the measured box or pull the list left under flip/end alignment.\n */}\n <Box\n ref={rootRef}\n onKeyDown={(event) => {\n if (event.key === 'Tab' && hiddenCount > 0) {\n // Keep focus inside and reveal the collapsed options.\n event.preventDefault()\n setExpanded(true)\n }\n }}\n sx={{\n position: 'relative',\n display: 'inline-block',\n verticalAlign: 'top',\n }}\n >\n <Paper\n elevation={0}\n {...paperSlotProps}\n sx={mergeSx(\n { ...paperSx, minWidth: listMinWidth, maxWidth: listMaxWidth },\n paperSlotSx,\n )}\n >\n {searchable ? (\n <Box\n sx={{\n px: 1,\n pt: 1,\n pb: 0.5,\n borderBottom: '1px solid',\n borderColor: 'divider',\n }}\n >\n <InputBase\n inputRef={searchRef}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.stopPropagation()\n if (query) {\n setQuery('')\n return\n }\n onClose()\n }\n }}\n placeholder={searchPlaceholder}\n fullWidth\n startAdornment={\n <InputAdornment position=\"start\" sx={{ mr: 0.5 }}>\n <SearchIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n </InputAdornment>\n }\n endAdornment={\n query ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n aria-label=\"Clear search\"\n onClick={() => {\n setQuery('')\n searchRef.current?.focus()\n }}\n sx={{ p: 0.25 }}\n >\n <ClearIcon sx={{ fontSize: 14 }} />\n </IconButton>\n </InputAdornment>\n ) : null\n }\n sx={{\n px: 0.75,\n py: 0.35,\n fontSize: '0.82rem',\n borderRadius: 1.5,\n bgcolor: 'action.hover',\n '& .MuiInputBase-input': {\n py: 0.4,\n },\n }}\n />\n </Box>\n ) : null}\n\n <List\n ref={listRef}\n dense\n disablePadding\n sx={{\n py: 0.5,\n maxHeight: maxListHeight,\n overflowY: 'auto',\n }}\n >\n {visibleOptions.length === 0 && hiddenCount === 0 ? (\n <Box sx={{ px: 1.5, py: 1.25 }}>\n <Typography\n variant=\"body2\"\n sx={{ fontSize: '0.78rem', color: 'text.secondary', m: 0 }}\n >\n {emptySearchText}\n </Typography>\n </Box>\n ) : (\n <>\n {visibleOptions.map((option, index) => {\n const selected = option.id === selectedId\n const hovered = option.id === hoveredId\n const accent = option.accentColor\n const showGroupHeader =\n option.group != null &&\n (index === 0 || visibleOptions[index - 1]?.group !== option.group)\n\n return (\n <React.Fragment key={option.id}>\n {showGroupHeader ? (\n <Typography\n component=\"div\"\n sx={{\n px: 1.5,\n pt: 1,\n pb: 0.25,\n fontSize: '0.66rem',\n fontWeight: 700,\n letterSpacing: '0.06em',\n textTransform: 'uppercase',\n color: 'text.secondary',\n m: 0,\n }}\n >\n {option.group}\n </Typography>\n ) : null}\n <ListItemButton\n selected={selected}\n data-detail-menu-option={option.id}\n onMouseEnter={() => setHoveredId(option.id)}\n onFocus={() => setHoveredId(option.id)}\n onClick={() => onSelect(option.id)}\n sx={{\n mx: 0.5,\n my: 0.15,\n px: 1,\n py: 0.85,\n gap: 1,\n borderRadius: 1.75,\n alignItems: 'center',\n '& .detail-menu-action': { opacity: 0 },\n '&:hover .detail-menu-action, &:focus-within .detail-menu-action':\n { opacity: 1 },\n '&.Mui-selected': {\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-action-selected), transparent 55%)',\n },\n '&.Mui-selected:hover': {\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-action-selected), transparent 35%)',\n },\n ...(hovered && !selected\n ? {\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-action-hover), transparent 40%)',\n }\n : null),\n }}\n >\n {option.icon ? (\n <Box\n sx={{\n width: 22,\n height: 22,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n {option.icon}\n </Box>\n ) : null}\n <Typography\n sx={{\n flex: 1,\n minWidth: 0,\n fontSize: '0.82rem',\n fontWeight: selected ? 700 : 600,\n color: selected && accent ? accent : 'text.primary',\n lineHeight: 1.2,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n m: 0,\n }}\n >\n {option.label}\n </Typography>\n {option.badge ? (\n <Typography\n component=\"span\"\n sx={{\n flexShrink: 0,\n fontSize: '0.72rem',\n fontWeight: 500,\n color: 'text.secondary',\n m: 0,\n }}\n >\n {option.badge}\n </Typography>\n ) : null}\n {option.actionSlot ? (\n <Box\n component=\"span\"\n className=\"detail-menu-action\"\n onClick={(event) => event.stopPropagation()}\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 18,\n flexShrink: 0,\n color: 'text.secondary',\n transition: 'opacity 120ms',\n }}\n >\n {option.actionSlot}\n </Box>\n ) : null}\n </ListItemButton>\n </React.Fragment>\n )\n })}\n {hiddenCount > 0 ? (\n <ListItemButton\n onMouseDown={(event) => {\n // Keep the click inside this menu — expanding unmounts\n // this row, which would otherwise look like a click-away.\n event.preventDefault()\n event.stopPropagation()\n }}\n onClick={(event) => {\n event.preventDefault()\n event.stopPropagation()\n setExpanded(true)\n }}\n sx={{\n mx: 0.5,\n my: 0.15,\n px: 1,\n py: 0.85,\n borderRadius: 1.75,\n alignItems: 'center',\n }}\n >\n <Typography\n sx={{\n flex: 1,\n minWidth: 0,\n fontSize: '0.78rem',\n color: 'text.secondary',\n m: 0,\n }}\n >\n {collapsedRowLabel(hiddenCount)}\n </Typography>\n </ListItemButton>\n ) : null}\n </>\n )}\n </List>\n {footerSlot ? (\n <Box\n sx={{\n borderTop: '1px solid',\n borderColor: 'divider',\n px: 0.5,\n py: 0.35,\n }}\n >\n {footerSlot}\n </Box>\n ) : null}\n </Paper>\n\n {showDetailPanel && hoveredOption ? (\n <Box\n ref={detailPaperRef}\n sx={{\n display: { xs: 'none', sm: 'block' },\n position: 'absolute',\n top: detailTop,\n ...detailPositionSx,\n width: detailWidth,\n }}\n >\n <Paper\n elevation={0}\n {...detailPaperSlotProps}\n sx={mergeSx(\n {\n px: 1.25,\n py: 1.1,\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2,\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-background-paper), transparent 4%)',\n boxShadow:\n '0 10px 28px color-mix(in srgb, var(--mui-palette-common-black), transparent 82%)',\n },\n detailPaperSlotSx,\n )}\n >\n <Typography\n sx={{\n fontSize: '0.78rem',\n fontWeight: 700,\n color: hoveredOption.accentColor || 'text.primary',\n lineHeight: 1.2,\n mt: 0,\n mx: 0,\n mb: 0.4,\n }}\n >\n {hoveredOption.label}\n </Typography>\n <Typography\n sx={{\n fontSize: '0.72rem',\n color: 'text.secondary',\n lineHeight: 1.35,\n m: 0,\n }}\n >\n {hoveredOption.detail?.trim() || '—'}\n </Typography>\n {hoveredOption.detailSlot ? (\n <Box\n sx={{\n mt: 1,\n pt: 1,\n borderTop: '1px solid',\n borderColor: 'divider',\n }}\n >\n {hoveredOption.detailSlot}\n </Box>\n ) : null}\n </Paper>\n </Box>\n ) : null}\n </Box>\n </ClickAwayListener>\n </Popper>\n )\n}\n\nconst DETAIL_GAP_PX = 8\nconst VIEWPORT_PAD_PX = 8\n\nfunction toCssPixels(value: number | string, fallback: number): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n const match = value.trim().match(/^(\\d+(?:\\.\\d+)?)px$/i)\n if (match) {\n return Number.parseFloat(match[1])\n }\n }\n\n return fallback\n}\n\nfunction resolveDetailSide(listRoot: HTMLElement, detailWidthPx: number): 'left' | 'right' {\n const rect = listRoot.getBoundingClientRect()\n const need = detailWidthPx + DETAIL_GAP_PX\n const spaceRight = window.innerWidth - rect.right - VIEWPORT_PAD_PX\n const spaceLeft = rect.left - VIEWPORT_PAD_PX\n\n if (spaceRight >= need) {\n return 'right'\n }\n if (spaceLeft >= need) {\n return 'left'\n }\n\n return spaceLeft > spaceRight ? 'left' : 'right'\n}\n\nexport default DetailMenu\n","'use client'\n\nimport { useMemo, type ReactNode } from 'react'\n\nimport { Box } from '@/ele/Box'\nimport { MemoryIcon } from '@/icons/MuiIcon'\n\nimport { DetailMenu, type DetailMenuOption, type DetailMenuProps } from '../DetailMenu'\n\nexport type ModelBrand = 'openai' | 'anthropic' | 'google' | 'meta'\n\nexport type ModelMenuOption = {\n id: string\n label: string\n /** Side-panel description when this option is hovered / focused. */\n detail?: string\n /** Optional provider key. Pass `brandIconMap` or `option.icon` for a brand mark. */\n brand?: ModelBrand | (string & {})\n /** Extra search terms merged into the filter index. */\n keywords?: string\n /** Short config pill rendered after the label (e.g. \"Fast\"); searchable. */\n badge?: string\n /** Per-option icon override; wins over the brand icon. */\n icon?: ReactNode\n /**\n * Slot rendered at the bottom of this option's detail panel — host-owned\n * config controls (e.g. a reasoning-effort selector for models that allow\n * it). ModelMenu never interprets the content; per-model capability\n * (\"does this model allow effort?\") stays with the host, which simply\n * omits the slot for models without it.\n */\n detailSlot?: ReactNode\n /** Section label — an uppercase header renders above the first option of each distinct group (e.g. \"Favorites\"). */\n group?: string\n /** Hide behind the \"N more models\" footer row until expanded (click). Ignored while searching. */\n collapsed?: boolean\n /**\n * Trailing per-option action (e.g. a settings gear), revealed on row\n * hover/focus. Clicks inside it never select the model.\n */\n actionSlot?: ReactNode\n}\n\nexport type ModelMenuProps = {\n anchorEl: HTMLElement | null\n options: readonly ModelMenuOption[]\n selectedId?: string | null\n onClose: () => void\n onSelect: (optionId: string) => void\n /** Default: on when there are 6+ options. */\n searchable?: boolean\n searchPlaceholder?: string\n /** Popper placement. Default: top-start. */\n placement?: DetailMenuProps['placement']\n /** Hover detail panel beside the list. Default true. */\n showDetailPanel?: boolean\n /** Host-owned brand marks keyed by `option.brand`. The library does not ship provider logos. */\n brandIconMap?: Record<string, ReactNode>\n slotProps?: DetailMenuProps['slotProps']\n maxListHeight?: number | string\n /** Footer under the list (e.g. \"Add Models\"). */\n footerSlot?: ReactNode\n}\n\nconst BRAND_LABELS: Record<string, string> = {\n anthropic: 'Anthropic',\n google: 'Google',\n meta: 'Meta',\n openai: 'OpenAI',\n}\n\nconst defaultBrandIcon = (): ReactNode => (\n <MemoryIcon sx={{ fontSize: 14 }} aria-hidden />\n)\n\n/**\n * Anchored model picker — DetailMenu specialized with host-owned brand\n * icons and search that turns on automatically for longer lists.\n * The model catalog and provider logos stay owned by the consuming app.\n */\nexport function ModelMenu({\n anchorEl,\n options,\n selectedId = null,\n onClose,\n onSelect,\n searchable,\n searchPlaceholder = 'Search models…',\n placement,\n showDetailPanel,\n brandIconMap,\n slotProps,\n maxListHeight,\n footerSlot,\n}: ModelMenuProps) {\n const detailOptions = useMemo<DetailMenuOption[]>(\n () =>\n options.map((option) => ({\n id: option.id,\n label: option.label,\n detail: option.detail,\n badge: option.badge,\n detailSlot: option.detailSlot,\n group: option.group,\n collapsed: option.collapsed,\n actionSlot: option.actionSlot,\n keywords: [option.brand, option.detail, option.keywords]\n .filter(Boolean)\n .join(' '),\n icon: (\n <Box\n component=\"span\"\n title={BRAND_LABELS[option.brand ?? '']}\n sx={{\n display: 'inline-flex',\n width: 20,\n height: 20,\n alignItems: 'center',\n justifyContent: 'center',\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 1.25,\n color: 'text.secondary',\n '& svg': { display: 'block' },\n }}\n >\n {option.icon ??\n brandIconMap?.[option.brand ?? ''] ??\n defaultBrandIcon()}\n </Box>\n ),\n })),\n [options, brandIconMap],\n )\n\n return (\n <DetailMenu\n anchorEl={anchorEl}\n options={detailOptions}\n selectedId={selectedId}\n searchable={searchable ?? options.length >= 6}\n searchPlaceholder={searchPlaceholder}\n placement={placement}\n showDetailPanel={showDetailPanel}\n collapsedRowLabel={(count) =>\n `${count} more model${count === 1 ? '' : 's'}`\n }\n onClose={onClose}\n onSelect={onSelect}\n slotProps={slotProps}\n maxListHeight={maxListHeight}\n footerSlot={footerSlot}\n />\n )\n}\n\nexport default ModelMenu\n","'use client'\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Popper, ClickAwayListener } from '@/ele/Overlay'\nimport type { SxProps, Theme } from '@mui/material/styles'\n\nimport { Box } from '@/ele/Box'\nimport { List, ListItemButton } from '@/ele/List'\nimport { Paper } from '@/ele/Paper'\nimport { Typography } from '@/ele/Typography'\nimport { KeyboardArrowRightIcon } from '@/icons/MuiIcon'\n\nimport {\n ModelMenu,\n type ModelMenuOption,\n type ModelMenuProps,\n} from '../ModelMenu'\n\nexport type ModelPickerProps = {\n anchorEl: HTMLElement | null\n options: readonly ModelMenuOption[]\n selectedId?: string | null\n onClose: () => void\n onSelect: (optionId: string) => void\n /**\n * Host-owned config controls rendered above the Model row (e.g. a\n * Reasoning Low/High/Max list). ModelPicker never interprets the content —\n * omit it when the selected model has nothing to configure.\n */\n configSlot?: ReactNode\n /** Label for the bottom Model section. Default: \"Model\". */\n modelSectionLabel?: string\n /** Forwarded to the ModelMenu flyout. */\n searchable?: boolean\n searchPlaceholder?: string\n brandIconMap?: ModelMenuProps['brandIconMap']\n slotProps?: ModelMenuProps['slotProps']\n maxListHeight?: ModelMenuProps['maxListHeight']\n /** Footer under the model list flyout (e.g. \"Add Models\"). */\n footerSlot?: ReactNode\n /**\n * Hover detail panel beside the model list (title + detail text + optional\n * detailSlot). Default true.\n */\n showDetailPanel?: boolean\n}\n\nconst paperSx = {\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: 2.5,\n overflow: 'hidden',\n bgcolor:\n 'color-mix(in srgb, var(--mui-palette-background-paper), transparent 4%)',\n boxShadow:\n '0 12px 32px color-mix(in srgb, var(--mui-palette-common-black), transparent 78%)',\n minWidth: 180,\n} as const\n\n/**\n * Cursor-style model picker: configure first (configSlot), change the model\n * at the bottom. The Model row opens ModelMenu as a side flyout.\n */\nexport function ModelPicker({\n anchorEl,\n options,\n selectedId = null,\n onClose,\n onSelect,\n configSlot,\n modelSectionLabel = 'Model',\n searchable,\n searchPlaceholder,\n brandIconMap,\n slotProps,\n maxListHeight,\n footerSlot,\n showDetailPanel = true,\n}: ModelPickerProps) {\n const open = Boolean(anchorEl)\n const [modelRowEl, setModelRowEl] = useState<HTMLElement | null>(null)\n const [modelFlyoutOpen, setModelFlyoutOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n const selected = useMemo(\n () => options.find((option) => option.id === selectedId) ?? options[0],\n [options, selectedId],\n )\n\n useEffect(() => {\n if (!open) {\n setModelFlyoutOpen(false)\n setModelRowEl(null)\n }\n }, [open])\n\n const closeAll = () => {\n setModelFlyoutOpen(false)\n onClose()\n }\n\n const openModelFlyout = (element: HTMLElement) => {\n setModelRowEl(element)\n setModelFlyoutOpen(true)\n }\n\n const isInsidePickerSurface = (event: MouseEvent | TouchEvent) => {\n const path =\n typeof event.composedPath === 'function'\n ? event.composedPath()\n : [event.target]\n return path.some((node) => {\n if (!(node instanceof Element)) {\n return false\n }\n if (rootRef.current?.contains(node)) {\n return true\n }\n // ModelMenu portals its Paper to document.body — tag it so click-away\n // does not treat expand / model selection as \"outside\". Prefer the path\n // attribute check so a row that React unmounted mid-click still counts.\n return (\n node.hasAttribute('data-model-picker-flyout') ||\n Boolean(node.closest('[data-model-picker-flyout]'))\n )\n })\n }\n\n const flyoutSlotProps = useMemo<ModelMenuProps['slotProps']>(() => {\n const paper = slotProps?.paper\n const detailPaper = slotProps?.detailPaper\n // Tag list + detail Papers so click-away keeps the config menu open —\n // the detail panel sits outside the list Paper as an absolute sibling.\n const flyoutTag = { 'data-model-picker-flyout': '' } as const\n return {\n ...slotProps,\n paper: {\n ...paper,\n ...flyoutTag,\n } as NonNullable<ModelMenuProps['slotProps']>['paper'],\n detailPaper: {\n ...detailPaper,\n ...flyoutTag,\n } as NonNullable<ModelMenuProps['slotProps']>['detailPaper'],\n }\n }, [slotProps])\n\n return (\n <>\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"top-start\"\n modifiers={[\n { name: 'offset', options: { offset: [0, 10] } },\n { name: 'preventOverflow', options: { padding: 8 } },\n {\n name: 'flip',\n options: { fallbackPlacements: ['bottom-start', 'top-start'] },\n },\n ]}\n sx={{ zIndex: (theme) => theme.zIndex.modal + 2 }}\n >\n <ClickAwayListener\n onClickAway={(event) => {\n if (isInsidePickerSurface(event)) {\n return\n }\n closeAll()\n }}\n >\n <Box ref={rootRef} sx={{ display: 'inline-block' }}>\n <Paper\n elevation={0}\n sx={paperSx as SxProps<Theme>}\n >\n {configSlot ? (\n <Box sx={{ px: 0.5, pt: 0.5, pb: 0.25 }}>{configSlot}</Box>\n ) : null}\n\n {configSlot ? (\n <Box\n sx={{\n borderTop: '1px solid',\n borderColor: 'divider',\n mx: 1,\n }}\n />\n ) : null}\n\n <Box sx={{ px: 0.5, pb: 0.5, pt: configSlot ? 0.25 : 0.5 }}>\n <Typography\n component=\"div\"\n sx={{\n px: 1,\n pt: 0.5,\n pb: 0.15,\n fontSize: '0.66rem',\n fontWeight: 700,\n letterSpacing: '0.04em',\n color: 'text.secondary',\n m: 0,\n }}\n >\n {modelSectionLabel}\n </Typography>\n <List dense disablePadding>\n <ListItemButton\n onMouseEnter={(event) => openModelFlyout(event.currentTarget)}\n onClick={(event) => openModelFlyout(event.currentTarget)}\n sx={{\n mx: 0.5,\n my: 0.15,\n px: 1,\n py: 0.75,\n gap: 1,\n borderRadius: 1.5,\n alignItems: 'center',\n bgcolor: 'action.hover',\n '&:hover': { bgcolor: 'action.selected' },\n }}\n >\n <Typography\n sx={{\n flex: 1,\n minWidth: 0,\n fontSize: '0.82rem',\n fontWeight: 600,\n color: 'text.primary',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n m: 0,\n }}\n >\n {selected?.label ?? 'Select model'}\n </Typography>\n <KeyboardArrowRightIcon\n sx={{ fontSize: 16, color: 'text.secondary', flexShrink: 0 }}\n />\n </ListItemButton>\n </List>\n </Box>\n </Paper>\n </Box>\n </ClickAwayListener>\n </Popper>\n\n {modelFlyoutOpen ? (\n <ModelMenu\n anchorEl={modelRowEl}\n options={options}\n selectedId={selectedId}\n searchable={searchable}\n searchPlaceholder={searchPlaceholder}\n brandIconMap={brandIconMap}\n slotProps={flyoutSlotProps}\n maxListHeight={maxListHeight}\n footerSlot={footerSlot}\n placement=\"right-start\"\n showDetailPanel={showDetailPanel}\n onClose={() => setModelFlyoutOpen(false)}\n onSelect={(id) => {\n // Keep the config menu open — Cursor stays open so you can keep\n // adjusting Effort/Options after changing the model.\n onSelect(id)\n }}\n />\n ) : null}\n </>\n )\n}\n\nexport default ModelPicker\n"],"mappings":"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","names":["styled","styled","default","useState","jsx","default","useState","useMemo","jsx","jsxs","p","useMemo","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","paperSx","default","useMemo","jsx","default","useMemo","useEffect","useMemo","useRef","useState","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","default"]}
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-ZVFYOXDE.mjs";
7
7
  import {
8
8
  default as default2
9
- } from "./chunk-S6EZVRZC.mjs";
9
+ } from "./chunk-PNSJC6PC.mjs";
10
10
 
11
11
  // src/components/elemental/Input/src/TelPhoneInput/TelPhoneInput.tsx
12
12
  import "react-phone-number-input/style.css";
@@ -330,4 +330,4 @@ var StyledWrapper = styled(default2, {
330
330
  export {
331
331
  TelPhoneInput
332
332
  };
333
- //# sourceMappingURL=chunk-OGNGPI3M.mjs.map
333
+ //# sourceMappingURL=chunk-PL55YKT4.mjs.map
@@ -1,32 +1,10 @@
1
+ import {
2
+ mergeSx
3
+ } from "./chunk-AFLEG5ZC.mjs";
4
+
1
5
  // src/components/elemental/Box/src/BorderBox/BorderBox.tsx
2
6
  import { forwardRef } from "react";
3
7
  import Box from "@mui/material/Box";
4
-
5
- // src/_utils/_func/sx.ts
6
- function flattenSx(part) {
7
- if (part == null || typeof part === "boolean") {
8
- return [];
9
- }
10
- if (Array.isArray(part)) {
11
- return part.flatMap(flattenSx);
12
- }
13
- if (typeof part === "function" || typeof part === "object") {
14
- return [part];
15
- }
16
- return [];
17
- }
18
- function mergeSx(...parts) {
19
- const list = parts.flatMap(flattenSx);
20
- if (list.length === 0) {
21
- return void 0;
22
- }
23
- if (list.length === 1) {
24
- return list[0];
25
- }
26
- return list;
27
- }
28
-
29
- // src/components/elemental/Box/src/BorderBox/BorderBox.tsx
30
8
  import { jsx, jsxs } from "react/jsx-runtime";
31
9
  var spanPx = 5;
32
10
  var fieldsetPx = 4;
@@ -152,10 +130,9 @@ import { default as default3 } from "@mui/material/Stack";
152
130
  import { default as default4 } from "@mui/material/Grid";
153
131
 
154
132
  export {
155
- mergeSx,
156
133
  BorderBox_default,
157
134
  default2 as default,
158
135
  default3 as default2,
159
136
  default4 as default3
160
137
  };
161
- //# sourceMappingURL=chunk-S6EZVRZC.mjs.map
138
+ //# sourceMappingURL=chunk-PNSJC6PC.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/elemental/Box/src/BorderBox/BorderBox.tsx","../src/components/elemental/Box/src/index.ts"],"sourcesContent":["import React, { forwardRef, } from 'react'\nimport Box, { type BoxProps} from '@mui/material/Box'\nimport { mergeSx } from '@/_utils/_func'\n\nconst spanPx = 5\nconst fieldsetPx = 4\n\ntype Props = {\n\tchildren: React.ReactNode, \n\ttitle?: string,\n\terror?: boolean,\n\tpyPx?: number,\n\tpxPx?: number,\n} & BoxProps\n/**\n * A Mui TextField like Box with a title and a border.\n * \n * Props options:\n * \n * @property {ReactNode} children - Whatever go inside the box.\n * @property {string} title - The left top title.\n * @property {string} error - change border-color to red.\n * @property {number} pyPx - padding top and bottom.\n * @property {number} pxPx - padding left and right.\n * @property {Record<string, unknown>} ...rest - Box props to the outer box.\n * @example\n * ### Example\n * ```js\n * const B = () => (\n * <BorderBox title=\"title\" error={false} ref={ref}>\n * something inside\n * </BorderBox>)\n * ```\n */\nconst BorderBox = forwardRef<HTMLDivElement,Props>(({ \n\ttitle, children,pyPx=8,pxPx=12, error=false,\n sx,\n\t...rest\n},ref) => {\n\t\n\treturn (\n\t\t<Box // control-root\n\t\tcomponent=\"div\"\n\t\tref={ref}\n\t\tstyle={{\n\t\t\t\"--border-radius\": \"var(--mui-shape-borderRadius)\",\n\t\t\t\"--py\": `${pyPx}px`,\n\t\t\t\"--px\": `${pxPx}px`,\n\t\t\t\"--span-px\": `${spanPx}px`,\n\t\t\t\"--fieldset-px\": `${fieldsetPx}px`, \n\t\t\t\"--border-color-local\": error ? \"var(--mui-palette-error-main)\" : \"var(--mui-palette-border-1)\",\n\t\t\t\"--color-content-local\": error ? \"var(--mui-palette-error-main)\" : \"var(--mui-palette-text-primary)\",\n\t\t\t\"--color-local\": error ? \"var(--mui-palette-error-main)\" : \"var(--mui-palette-text-grey-1)\",\n\t\t\t\"--hover-border-color-local\": error ? \"var(--mui-palette-error-dark)\" : \"var(--mui-palette-border-hover-1)\",\n\t\t\tminWidth: 0,\n\t\t}}\n\t\tsx={mergeSx(\n\t\t\t{ // inputbase-root\n\t\t\tdisplay: 'inline-flex',\n\t\t\tflexDirection: 'column',\n\t\t\tposition: 'relative',\n\t\t\tminWidth: 0,\n\t\t\tpadding: 0, \n\t\t\tpaddingTop:`var(--py)`, paddingBottom:`var(--py)`, // avoid title overlap\n\t\t\tmargin: 0,\n\t\t\tborder: 0,\n\t\t\tverticalAlign: 'top',\n\t\t\tcursor: 'auto',\n\t\t\t\"&:hover>div>fieldset\": {\n\t\t\t\tborderColor:\"var(--hover-border-color-local)\",\n\t\t\t},\n\t\t},\n\t\t\tsx,\n\t\t)}\n\t\t{...rest}\n\t\t>\n\t\t\t<Box sx={{ // input\n\t\t\t\tletterSpacing: '0.00938em',\n\t\t\t\tboxSizing: 'border-box',\n\t\t\t\tposition: 'relative',\n\t\t\t\talignItems: 'center',\n\t\t\t\tdisplay: 'block',\n\t\t\t\tborderRadius:'var(--border-radius)',\n\t\t\t\twidth:\"100%\",\n\t\t\t}}>\n\t\t\t\t<Box sx={{\n\t\t\t\t\tpaddingLeft:`var(--px)`, paddingRight:`var(--px)`,\n\t\t\t\t\tpaddingTop:`var(--py)`, paddingBottom:`var(--py)`,\n\t\t\t\t\tfontWeight: 400,\n\t\t\t\t\tfontSize: '1rem',\n\t\t\t\t\tlineHeight: '1.4375em',\n\t\t\t\t\twidth:\"-webkit-fill-available\",\n\t\t\t\t\tminHeight:\"1rem\",\n\t\t\t\t\tcolor:\"var(--color-content-local)\",\n\t\t\t\t}} >{children}</Box>\n\t\t\t\t<Box component=\"fieldset\" sx={{\n\t\t\t\t\ttextAlign: 'left',\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tbottom: 0,\n\t\t\t\t\tright: 0,\n\t\t\t\t\ttop: `calc(var(--py)*-1)`,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\tpaddingLeft:\"var(--fieldset-px)\", paddingRight:\"var(--fieldset-px)\",\n\t\t\t\t\tmargin:0,\n\t\t\t\t\tpointerEvents: 'none',\n\t\t\t\t\tborderRadius: 'inherit',\n\t\t\t\t\tborder:\"1px solid\",\n\t\t\t\t\tborderColor:\"var(--border-color-local)\",\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tminWidth: '0%',\n\t\t\t\t\t\n\t\t\t\t}}>\n\t\t\t\t\t<Box component=\"legend\" sx={{\n\t\t\t\t\t\tfloat: 'unset',\n\t\t\t\t\t\twidth: 'auto',\n\t\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\tpadding: 0,\n\t\t\t\t\t\theight: \"1em\",\n\t\t\t\t\t\tvisibility: 'hidden',\n\t\t\t\t\t\tmaxWidth: '100%',\n\t\t\t\t\t\twhiteSpace: 'nowrap',\n\t\t\t\t\t}}>\n\t\t\t\t\t\t{title && <Box component=\"span\" sx={{\n\t\t\t\t\t\t\tpaddingLeft:\"var(--span-px)\", paddingRight:\"var(--span-px)\",\n\t\t\t\t\t\t\tvisibility: 'visible',\n\t\t\t\t\t\t\tfontSize: '0.7em',\n\t\t\t\t\t\t\tlineHeight: '1.4375em',\n\t\t\t\t\t\t\tletterSpacing: '0.00938em',\n\t\t\t\t\t\t\tfontWeight: 400,\n\t\t\t\t\t\t\tdisplay: 'block',\n\t\t\t\t\t\t\theight: '100%',\n\t\t\t\t\t\tfontFamily: 'inherit',\n\t\t\t\t\t\t\ttextOverflow: 'ellipsis',\n\t\t\t\t\t\t\tcolor:\"var(--color-local)\",\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t</Box>}\n\t\t\t\t\t</Box>\n\t\t\t\t</Box>\n\t\t\t</Box>\n\t\t</Box>\n\t)\n})\n\nexport default BorderBox\n\n/*\nshift = px-5+8\n*/","export * from './BorderBox'\nexport {default as Box} from '@mui/material/Box'\nexport {default as Stack} from '@mui/material/Stack'\nexport {default as Grid} from '@mui/material/Grid'\n"],"mappings":"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","names":["default"]}
@@ -1,22 +1,22 @@
1
1
  import {
2
2
  default as default6
3
3
  } from "./chunk-3DQINB57.mjs";
4
- import {
5
- default as default7
6
- } from "./chunk-BGB7JHIU.mjs";
7
4
  import {
8
5
  default as default4,
9
6
  default3 as default5
10
7
  } from "./chunk-I5JWS4Z7.mjs";
11
8
  import {
12
- Button
13
- } from "./chunk-JIU5GVM7.mjs";
9
+ default as default7
10
+ } from "./chunk-FMGZCOJC.mjs";
14
11
  import {
15
12
  default93 as default3
16
13
  } from "./chunk-ZVFYOXDE.mjs";
14
+ import {
15
+ Button
16
+ } from "./chunk-D4XPNSSI.mjs";
17
17
  import {
18
18
  default3 as default2
19
- } from "./chunk-S6EZVRZC.mjs";
19
+ } from "./chunk-PNSJC6PC.mjs";
20
20
 
21
21
  // src/components/elemental/List/src/List/index.ts
22
22
  import { default as default10 } from "@mui/material/List";
@@ -322,4 +322,4 @@ export {
322
322
  default8 as default5,
323
323
  default13 as default6
324
324
  };
325
- //# sourceMappingURL=chunk-TDRA5EZI.mjs.map
325
+ //# sourceMappingURL=chunk-PUREEN2J.mjs.map