@proyecto-viviana/solidaria-components 0.5.0 → 0.7.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (561) hide show
  1. package/LICENSE-APACHE-2.0 +201 -0
  2. package/NOTICE +91 -0
  3. package/README.md +4 -7
  4. package/dist/ActionBar.d.ts +2 -10
  5. package/dist/ActionBar.d.ts.map +1 -1
  6. package/dist/ActionBar.js +95 -59
  7. package/dist/ActionBar.js.map +1 -1
  8. package/dist/ActionBar.jsx +42 -15
  9. package/dist/ActionBar.jsx.map +1 -1
  10. package/dist/ActionGroup.d.ts +1 -12
  11. package/dist/ActionGroup.d.ts.map +1 -1
  12. package/dist/ActionGroup.js +66 -44
  13. package/dist/ActionGroup.js.map +1 -1
  14. package/dist/ActionGroup.jsx +25 -10
  15. package/dist/ActionGroup.jsx.map +1 -1
  16. package/dist/Alert.d.ts +4 -1
  17. package/dist/Alert.d.ts.map +1 -1
  18. package/dist/Alert.js +25 -17
  19. package/dist/Alert.js.map +1 -1
  20. package/dist/Alert.jsx +9 -5
  21. package/dist/Alert.jsx.map +1 -1
  22. package/dist/Autocomplete.d.ts +2 -9
  23. package/dist/Autocomplete.d.ts.map +1 -1
  24. package/dist/Autocomplete.js +18 -5
  25. package/dist/Autocomplete.js.map +1 -1
  26. package/dist/Autocomplete.jsx +20 -7
  27. package/dist/Autocomplete.jsx.map +1 -1
  28. package/dist/Breadcrumbs.d.ts +2 -7
  29. package/dist/Breadcrumbs.d.ts.map +1 -1
  30. package/dist/Breadcrumbs.js +71 -51
  31. package/dist/Breadcrumbs.js.map +1 -1
  32. package/dist/Breadcrumbs.jsx +25 -12
  33. package/dist/Breadcrumbs.jsx.map +1 -1
  34. package/dist/Button.d.ts +1 -7
  35. package/dist/Button.d.ts.map +1 -1
  36. package/dist/Button.js +125 -72
  37. package/dist/Button.js.map +1 -1
  38. package/dist/Button.jsx +105 -43
  39. package/dist/Button.jsx.map +1 -1
  40. package/dist/Calendar.d.ts +1 -7
  41. package/dist/Calendar.d.ts.map +1 -1
  42. package/dist/Calendar.js +297 -221
  43. package/dist/Calendar.js.map +1 -1
  44. package/dist/Calendar.jsx +52 -32
  45. package/dist/Calendar.jsx.map +1 -1
  46. package/dist/CalendarPicker.d.ts +1 -10
  47. package/dist/CalendarPicker.d.ts.map +1 -1
  48. package/dist/CalendarPicker.js +12 -0
  49. package/dist/CalendarPicker.js.map +1 -1
  50. package/dist/CalendarPicker.jsx +12 -0
  51. package/dist/CalendarPicker.jsx.map +1 -1
  52. package/dist/Checkbox.d.ts +2 -7
  53. package/dist/Checkbox.d.ts.map +1 -1
  54. package/dist/Checkbox.js +332 -270
  55. package/dist/Checkbox.js.map +1 -1
  56. package/dist/Checkbox.jsx +70 -77
  57. package/dist/Checkbox.jsx.map +1 -1
  58. package/dist/Collection.d.ts +33 -7
  59. package/dist/Collection.d.ts.map +1 -1
  60. package/dist/Collection.js +128 -74
  61. package/dist/Collection.js.map +1 -1
  62. package/dist/Collection.jsx +46 -7
  63. package/dist/Collection.jsx.map +1 -1
  64. package/dist/Color.d.ts +15 -20
  65. package/dist/Color.d.ts.map +1 -1
  66. package/dist/Color.js +572 -334
  67. package/dist/Color.js.map +1 -1
  68. package/dist/Color.jsx +205 -85
  69. package/dist/Color.jsx.map +1 -1
  70. package/dist/ColorEditor.d.ts +3 -1
  71. package/dist/ColorEditor.d.ts.map +1 -1
  72. package/dist/ColorEditor.js +147 -124
  73. package/dist/ColorEditor.js.map +1 -1
  74. package/dist/ColorEditor.jsx +4 -1
  75. package/dist/ColorEditor.jsx.map +1 -1
  76. package/dist/ComboBox.d.ts +31 -10
  77. package/dist/ComboBox.d.ts.map +1 -1
  78. package/dist/ComboBox.js +539 -274
  79. package/dist/ComboBox.js.map +1 -1
  80. package/dist/ComboBox.jsx +213 -70
  81. package/dist/ComboBox.jsx.map +1 -1
  82. package/dist/ContextualHelpTrigger.d.ts +1 -7
  83. package/dist/ContextualHelpTrigger.d.ts.map +1 -1
  84. package/dist/ContextualHelpTrigger.js +102 -72
  85. package/dist/ContextualHelpTrigger.js.map +1 -1
  86. package/dist/ContextualHelpTrigger.jsx +36 -16
  87. package/dist/ContextualHelpTrigger.jsx.map +1 -1
  88. package/dist/DateField.d.ts +2 -7
  89. package/dist/DateField.d.ts.map +1 -1
  90. package/dist/DateField.js +0 -2
  91. package/dist/DateField.jsx +0 -2
  92. package/dist/DateField2.js +194 -179
  93. package/dist/DateField2.js.map +1 -1
  94. package/dist/DateField2.jsx +58 -55
  95. package/dist/DateField2.jsx.map +1 -1
  96. package/dist/DatePicker.d.ts +7 -7
  97. package/dist/DatePicker.d.ts.map +1 -1
  98. package/dist/DatePicker.js +2 -2
  99. package/dist/DatePicker.jsx +2 -2
  100. package/dist/DatePicker2.js +357 -435
  101. package/dist/DatePicker2.js.map +1 -1
  102. package/dist/DatePicker2.jsx +109 -178
  103. package/dist/DatePicker2.jsx.map +1 -1
  104. package/dist/DateRangePickerContext.d.ts +7 -0
  105. package/dist/DateRangePickerContext.d.ts.map +1 -1
  106. package/dist/Dialog.d.ts +4 -9
  107. package/dist/Dialog.d.ts.map +1 -1
  108. package/dist/Dialog.js +168 -101
  109. package/dist/Dialog.js.map +1 -1
  110. package/dist/Dialog.jsx +75 -27
  111. package/dist/Dialog.jsx.map +1 -1
  112. package/dist/Disclosure.d.ts +1 -9
  113. package/dist/Disclosure.d.ts.map +1 -1
  114. package/dist/Disclosure.js +121 -79
  115. package/dist/Disclosure.js.map +1 -1
  116. package/dist/Disclosure.jsx +32 -19
  117. package/dist/Disclosure.jsx.map +1 -1
  118. package/dist/DragAndDrop.d.ts +9 -6
  119. package/dist/DragAndDrop.d.ts.map +1 -1
  120. package/dist/DragAndDrop.js +37 -22
  121. package/dist/DragAndDrop.js.map +1 -1
  122. package/dist/DragAndDrop.jsx +20 -4
  123. package/dist/DragAndDrop.jsx.map +1 -1
  124. package/dist/DragPreview.d.ts +1 -1
  125. package/dist/DragPreview.d.ts.map +1 -1
  126. package/dist/DropZone.d.ts +1 -7
  127. package/dist/DropZone.d.ts.map +1 -1
  128. package/dist/DropZone.js +74 -40
  129. package/dist/DropZone.js.map +1 -1
  130. package/dist/DropZone.jsx +24 -8
  131. package/dist/DropZone.jsx.map +1 -1
  132. package/dist/ElementTag.d.ts +9 -20
  133. package/dist/ElementTag.d.ts.map +1 -1
  134. package/dist/ElementTag.js +8 -210
  135. package/dist/ElementTag.js.map +1 -1
  136. package/dist/ElementTag.jsx +8 -57
  137. package/dist/ElementTag.jsx.map +1 -1
  138. package/dist/FieldError.d.ts +8 -7
  139. package/dist/FieldError.d.ts.map +1 -1
  140. package/dist/FieldError.js +33 -13
  141. package/dist/FieldError.js.map +1 -1
  142. package/dist/FieldError.jsx +20 -5
  143. package/dist/FieldError.jsx.map +1 -1
  144. package/dist/FileTrigger.d.ts +1 -7
  145. package/dist/FileTrigger.d.ts.map +1 -1
  146. package/dist/FileTrigger.js +30 -12
  147. package/dist/FileTrigger.js.map +1 -1
  148. package/dist/FileTrigger.jsx +15 -2
  149. package/dist/FileTrigger.jsx.map +1 -1
  150. package/dist/Focusable.d.ts +2 -8
  151. package/dist/Focusable.d.ts.map +1 -1
  152. package/dist/Focusable.js +23 -6
  153. package/dist/Focusable.js.map +1 -1
  154. package/dist/Focusable.jsx +22 -5
  155. package/dist/Focusable.jsx.map +1 -1
  156. package/dist/Form.d.ts +9 -8
  157. package/dist/Form.d.ts.map +1 -1
  158. package/dist/Form.js +66 -43
  159. package/dist/Form.js.map +1 -1
  160. package/dist/Form.jsx +36 -16
  161. package/dist/Form.jsx.map +1 -1
  162. package/dist/GridList.d.ts +5 -10
  163. package/dist/GridList.d.ts.map +1 -1
  164. package/dist/GridList.js +372 -243
  165. package/dist/GridList.js.map +1 -1
  166. package/dist/GridList.jsx +177 -99
  167. package/dist/GridList.jsx.map +1 -1
  168. package/dist/HiddenDateInput.d.ts +1 -7
  169. package/dist/HiddenDateInput.d.ts.map +1 -1
  170. package/dist/Icon.d.ts +4 -1
  171. package/dist/Icon.d.ts.map +1 -1
  172. package/dist/Icon.js +41 -37
  173. package/dist/Icon.js.map +1 -1
  174. package/dist/Icon.jsx +7 -3
  175. package/dist/Icon.jsx.map +1 -1
  176. package/dist/Keyboard.d.ts +1 -7
  177. package/dist/Keyboard.d.ts.map +1 -1
  178. package/dist/Keyboard.js +24 -11
  179. package/dist/Keyboard.js.map +1 -1
  180. package/dist/Keyboard.jsx +15 -2
  181. package/dist/Keyboard.jsx.map +1 -1
  182. package/dist/Label.d.ts +20 -0
  183. package/dist/Label.d.ts.map +1 -0
  184. package/dist/Label.js +60 -0
  185. package/dist/Label.js.map +1 -0
  186. package/dist/Label.jsx +47 -0
  187. package/dist/Label.jsx.map +1 -0
  188. package/dist/Landmark.d.ts +4 -1
  189. package/dist/Landmark.d.ts.map +1 -1
  190. package/dist/Landmark.js +10 -4
  191. package/dist/Landmark.js.map +1 -1
  192. package/dist/Landmark.jsx +5 -1
  193. package/dist/Landmark.jsx.map +1 -1
  194. package/dist/Link.d.ts +2 -7
  195. package/dist/Link.d.ts.map +1 -1
  196. package/dist/Link.js +56 -36
  197. package/dist/Link.js.map +1 -1
  198. package/dist/Link.jsx +52 -10
  199. package/dist/Link.jsx.map +1 -1
  200. package/dist/ListBox.d.ts +17 -13
  201. package/dist/ListBox.d.ts.map +1 -1
  202. package/dist/ListBox.js +647 -348
  203. package/dist/ListBox.js.map +1 -1
  204. package/dist/ListBox.jsx +339 -236
  205. package/dist/ListBox.jsx.map +1 -1
  206. package/dist/ListDropTargetDelegate.d.ts +3 -0
  207. package/dist/ListDropTargetDelegate.d.ts.map +1 -1
  208. package/dist/Menu.d.ts +39 -30
  209. package/dist/Menu.d.ts.map +1 -1
  210. package/dist/Menu.js +547 -368
  211. package/dist/Menu.js.map +1 -1
  212. package/dist/Menu.jsx +328 -230
  213. package/dist/Menu.jsx.map +1 -1
  214. package/dist/Meter.d.ts +6 -13
  215. package/dist/Meter.d.ts.map +1 -1
  216. package/dist/Meter.js +55 -18
  217. package/dist/Meter.js.map +1 -1
  218. package/dist/Meter.jsx +33 -8
  219. package/dist/Meter.jsx.map +1 -1
  220. package/dist/Modal.d.ts +1 -7
  221. package/dist/Modal.d.ts.map +1 -1
  222. package/dist/Modal.js +104 -56
  223. package/dist/Modal.js.map +1 -1
  224. package/dist/Modal.jsx +68 -38
  225. package/dist/Modal.jsx.map +1 -1
  226. package/dist/NumberField.d.ts +4 -7
  227. package/dist/NumberField.d.ts.map +1 -1
  228. package/dist/NumberField.js +243 -124
  229. package/dist/NumberField.js.map +1 -1
  230. package/dist/NumberField.jsx +115 -26
  231. package/dist/NumberField.jsx.map +1 -1
  232. package/dist/Popover.d.ts +15 -7
  233. package/dist/Popover.d.ts.map +1 -1
  234. package/dist/Popover.js +370 -181
  235. package/dist/Popover.js.map +1 -1
  236. package/dist/Popover.jsx +215 -82
  237. package/dist/Popover.jsx.map +1 -1
  238. package/dist/Pressable.d.ts +2 -8
  239. package/dist/Pressable.d.ts.map +1 -1
  240. package/dist/Pressable.js +23 -6
  241. package/dist/Pressable.js.map +1 -1
  242. package/dist/Pressable.jsx +22 -5
  243. package/dist/Pressable.jsx.map +1 -1
  244. package/dist/PreviewTrigger.d.ts +24 -0
  245. package/dist/PreviewTrigger.d.ts.map +1 -0
  246. package/dist/PreviewTrigger.js +128 -0
  247. package/dist/PreviewTrigger.js.map +1 -0
  248. package/dist/PreviewTrigger.jsx +117 -0
  249. package/dist/PreviewTrigger.jsx.map +1 -0
  250. package/dist/ProgressBar.d.ts +1 -7
  251. package/dist/ProgressBar.d.ts.map +1 -1
  252. package/dist/ProgressBar.js +34 -14
  253. package/dist/ProgressBar.js.map +1 -1
  254. package/dist/ProgressBar.jsx +17 -3
  255. package/dist/ProgressBar.jsx.map +1 -1
  256. package/dist/RadioGroup.d.ts +2 -7
  257. package/dist/RadioGroup.d.ts.map +1 -1
  258. package/dist/RadioGroup.js +388 -269
  259. package/dist/RadioGroup.js.map +1 -1
  260. package/dist/RadioGroup.jsx +110 -99
  261. package/dist/RadioGroup.jsx.map +1 -1
  262. package/dist/RangeCalendar.d.ts +3 -7
  263. package/dist/RangeCalendar.d.ts.map +1 -1
  264. package/dist/RangeCalendar.js +271 -202
  265. package/dist/RangeCalendar.js.map +1 -1
  266. package/dist/RangeCalendar.jsx +56 -37
  267. package/dist/RangeCalendar.jsx.map +1 -1
  268. package/dist/RouterProvider.d.ts +3 -9
  269. package/dist/RouterProvider.d.ts.map +1 -1
  270. package/dist/RouterProvider.js +15 -14
  271. package/dist/RouterProvider.js.map +1 -1
  272. package/dist/RouterProvider.jsx +14 -13
  273. package/dist/RouterProvider.jsx.map +1 -1
  274. package/dist/SearchField.d.ts +4 -7
  275. package/dist/SearchField.d.ts.map +1 -1
  276. package/dist/SearchField.js +191 -164
  277. package/dist/SearchField.js.map +1 -1
  278. package/dist/SearchField.jsx +69 -62
  279. package/dist/SearchField.jsx.map +1 -1
  280. package/dist/Select.d.ts +5 -10
  281. package/dist/Select.d.ts.map +1 -1
  282. package/dist/Select.js +565 -359
  283. package/dist/Select.js.map +1 -1
  284. package/dist/Select.jsx +281 -161
  285. package/dist/Select.jsx.map +1 -1
  286. package/dist/SelectionIndicator.d.ts +1 -4
  287. package/dist/SelectionIndicator.d.ts.map +1 -1
  288. package/dist/SelectionIndicator.js +29 -13
  289. package/dist/SelectionIndicator.js.map +1 -1
  290. package/dist/SelectionIndicator.jsx +18 -4
  291. package/dist/SelectionIndicator.jsx.map +1 -1
  292. package/dist/Separator.d.ts +1 -7
  293. package/dist/Separator.d.ts.map +1 -1
  294. package/dist/Separator.js +22 -6
  295. package/dist/Separator.js.map +1 -1
  296. package/dist/Separator.jsx +16 -3
  297. package/dist/Separator.jsx.map +1 -1
  298. package/dist/SharedElementTransition.d.ts +1 -10
  299. package/dist/SharedElementTransition.d.ts.map +1 -1
  300. package/dist/SharedElementTransition.js +68 -40
  301. package/dist/SharedElementTransition.js.map +1 -1
  302. package/dist/SharedElementTransition.jsx +49 -25
  303. package/dist/SharedElementTransition.jsx.map +1 -1
  304. package/dist/Slider.d.ts +2 -8
  305. package/dist/Slider.d.ts.map +1 -1
  306. package/dist/Slider.js +155 -97
  307. package/dist/Slider.js.map +1 -1
  308. package/dist/Slider.jsx +25 -12
  309. package/dist/Slider.jsx.map +1 -1
  310. package/dist/StepList.d.ts +1 -7
  311. package/dist/StepList.d.ts.map +1 -1
  312. package/dist/StepList.js +112 -68
  313. package/dist/StepList.js.map +1 -1
  314. package/dist/StepList.jsx +58 -20
  315. package/dist/StepList.jsx.map +1 -1
  316. package/dist/Switch.d.ts +2 -9
  317. package/dist/Switch.d.ts.map +1 -1
  318. package/dist/Switch.js +164 -114
  319. package/dist/Switch.js.map +1 -1
  320. package/dist/Switch.jsx +26 -13
  321. package/dist/Switch.jsx.map +1 -1
  322. package/dist/Table.d.ts +2 -1
  323. package/dist/Table.d.ts.map +1 -1
  324. package/dist/Table.js +689 -592
  325. package/dist/Table.js.map +1 -1
  326. package/dist/Table.jsx +317 -237
  327. package/dist/Table.jsx.map +1 -1
  328. package/dist/Tabs.d.ts +2 -7
  329. package/dist/Tabs.d.ts.map +1 -1
  330. package/dist/Tabs.js +278 -293
  331. package/dist/Tabs.js.map +1 -1
  332. package/dist/Tabs.jsx +68 -66
  333. package/dist/Tabs.jsx.map +1 -1
  334. package/dist/TagGroup.d.ts +4 -11
  335. package/dist/TagGroup.d.ts.map +1 -1
  336. package/dist/TagGroup.js +153 -115
  337. package/dist/TagGroup.js.map +1 -1
  338. package/dist/TagGroup.jsx +37 -24
  339. package/dist/TagGroup.jsx.map +1 -1
  340. package/dist/Text.d.ts +3 -3
  341. package/dist/Text.d.ts.map +1 -1
  342. package/dist/Text.js +24 -7
  343. package/dist/Text.js.map +1 -1
  344. package/dist/Text.jsx +17 -5
  345. package/dist/Text.jsx.map +1 -1
  346. package/dist/TextField.d.ts +3 -16
  347. package/dist/TextField.d.ts.map +1 -1
  348. package/dist/TextField.js +104 -129
  349. package/dist/TextField.js.map +1 -1
  350. package/dist/TextField.jsx +76 -102
  351. package/dist/TextField.jsx.map +1 -1
  352. package/dist/TimeField.d.ts +2 -15
  353. package/dist/TimeField.d.ts.map +1 -1
  354. package/dist/TimeField.js +86 -102
  355. package/dist/TimeField.js.map +1 -1
  356. package/dist/TimeField.jsx +32 -49
  357. package/dist/TimeField.jsx.map +1 -1
  358. package/dist/Toast.d.ts +10 -13
  359. package/dist/Toast.d.ts.map +1 -1
  360. package/dist/Toast.js +209 -108
  361. package/dist/Toast.js.map +1 -1
  362. package/dist/Toast.jsx +127 -22
  363. package/dist/Toast.jsx.map +1 -1
  364. package/dist/ToggleButton.d.ts +1 -7
  365. package/dist/ToggleButton.d.ts.map +1 -1
  366. package/dist/ToggleButton.js +57 -35
  367. package/dist/ToggleButton.js.map +1 -1
  368. package/dist/ToggleButton.jsx +26 -12
  369. package/dist/ToggleButton.jsx.map +1 -1
  370. package/dist/ToggleButtonGroup.d.ts +1 -7
  371. package/dist/ToggleButtonGroup.d.ts.map +1 -1
  372. package/dist/ToggleButtonGroup.js +59 -44
  373. package/dist/ToggleButtonGroup.js.map +1 -1
  374. package/dist/ToggleButtonGroup.jsx +25 -12
  375. package/dist/ToggleButtonGroup.jsx.map +1 -1
  376. package/dist/TokenField.d.ts +52 -0
  377. package/dist/TokenField.d.ts.map +1 -0
  378. package/dist/TokenField.js +301 -0
  379. package/dist/TokenField.js.map +1 -0
  380. package/dist/TokenField.jsx +197 -0
  381. package/dist/TokenField.jsx.map +1 -0
  382. package/dist/Toolbar.d.ts +2 -7
  383. package/dist/Toolbar.d.ts.map +1 -1
  384. package/dist/Toolbar.js +35 -16
  385. package/dist/Toolbar.js.map +1 -1
  386. package/dist/Toolbar.jsx +15 -2
  387. package/dist/Toolbar.jsx.map +1 -1
  388. package/dist/Tooltip.d.ts +2 -7
  389. package/dist/Tooltip.d.ts.map +1 -1
  390. package/dist/Tooltip.js +105 -68
  391. package/dist/Tooltip.js.map +1 -1
  392. package/dist/Tooltip.jsx +60 -36
  393. package/dist/Tooltip.jsx.map +1 -1
  394. package/dist/Tree.d.ts +8 -11
  395. package/dist/Tree.d.ts.map +1 -1
  396. package/dist/Tree.js +486 -339
  397. package/dist/Tree.js.map +1 -1
  398. package/dist/Tree.jsx +155 -107
  399. package/dist/Tree.jsx.map +1 -1
  400. package/dist/Virtualizer.d.ts +39 -9
  401. package/dist/Virtualizer.d.ts.map +1 -1
  402. package/dist/Virtualizer.js +2 -2
  403. package/dist/Virtualizer.jsx +2 -2
  404. package/dist/Virtualizer2.js +491 -136
  405. package/dist/Virtualizer2.js.map +1 -1
  406. package/dist/Virtualizer2.jsx +455 -122
  407. package/dist/Virtualizer2.jsx.map +1 -1
  408. package/dist/VirtualizerLayouts.d.ts +55 -2
  409. package/dist/VirtualizerLayouts.d.ts.map +1 -1
  410. package/dist/VisuallyHidden.d.ts +4 -3
  411. package/dist/VisuallyHidden.d.ts.map +1 -1
  412. package/dist/VisuallyHidden.js +18 -11
  413. package/dist/VisuallyHidden.js.map +1 -1
  414. package/dist/VisuallyHidden.jsx +15 -9
  415. package/dist/VisuallyHidden.jsx.map +1 -1
  416. package/dist/contexts.d.ts +25 -0
  417. package/dist/contexts.d.ts.map +1 -1
  418. package/dist/contexts.js +3 -0
  419. package/dist/contexts.js.map +1 -1
  420. package/dist/contexts.jsx +3 -0
  421. package/dist/contexts.jsx.map +1 -1
  422. package/dist/index.d.ts +11 -9
  423. package/dist/index.d.ts.map +1 -1
  424. package/dist/index.js +14 -11
  425. package/dist/index.jsx +14 -11
  426. package/dist/intl/index.d.ts +16 -0
  427. package/dist/intl/index.d.ts.map +1 -0
  428. package/dist/intl.js +212 -0
  429. package/dist/intl.js.map +1 -0
  430. package/dist/intl.jsx +212 -0
  431. package/dist/intl.jsx.map +1 -0
  432. package/dist/useDragAndDrop.d.ts +4 -2
  433. package/dist/useDragAndDrop.d.ts.map +1 -1
  434. package/dist/useDragAndDrop2.js +39 -21
  435. package/dist/useDragAndDrop2.js.map +1 -1
  436. package/dist/useDragAndDrop2.jsx +39 -21
  437. package/dist/useDragAndDrop2.jsx.map +1 -1
  438. package/dist/utils.d.ts +28 -9
  439. package/dist/utils.d.ts.map +1 -1
  440. package/dist/utils.js +96 -24
  441. package/dist/utils.js.map +1 -1
  442. package/dist/utils.jsx +81 -24
  443. package/dist/utils.jsx.map +1 -1
  444. package/dist/virtualizer/Layout.d.ts +9 -0
  445. package/dist/virtualizer/Layout.d.ts.map +1 -1
  446. package/dist/virtualizer/Layout.js +23 -2
  447. package/dist/virtualizer/Layout.js.map +1 -1
  448. package/dist/virtualizer/Layout.jsx +23 -2
  449. package/dist/virtualizer/Layout.jsx.map +1 -1
  450. package/package.json +29 -10
  451. package/src/ActionBar.tsx +50 -24
  452. package/src/ActionGroup.tsx +31 -19
  453. package/src/Alert.tsx +10 -4
  454. package/src/Autocomplete.tsx +24 -15
  455. package/src/Breadcrumbs.tsx +32 -16
  456. package/src/Button.tsx +182 -67
  457. package/src/Calendar.tsx +65 -47
  458. package/src/CalendarPicker.tsx +16 -1
  459. package/src/Checkbox.tsx +84 -116
  460. package/src/Collection.tsx +84 -3
  461. package/src/Color.tsx +282 -104
  462. package/src/ColorEditor.tsx +5 -1
  463. package/src/ComboBox.tsx +384 -109
  464. package/src/ContextualHelpTrigger.tsx +47 -41
  465. package/src/DateField.tsx +74 -106
  466. package/src/DatePicker.tsx +156 -352
  467. package/src/DateRangePickerContext.tsx +8 -0
  468. package/src/Dialog.tsx +105 -38
  469. package/src/Disclosure.tsx +29 -19
  470. package/src/DragAndDrop.tsx +43 -8
  471. package/src/DragPreview.tsx +20 -1
  472. package/src/DropZone.tsx +32 -18
  473. package/src/ElementTag.tsx +14 -104
  474. package/src/FieldError.tsx +39 -7
  475. package/src/FileTrigger.tsx +18 -3
  476. package/src/Focusable.tsx +27 -6
  477. package/src/Form.tsx +57 -11
  478. package/src/GridList.tsx +233 -141
  479. package/src/HiddenDateInput.tsx +19 -3
  480. package/src/Icon.tsx +8 -2
  481. package/src/Keyboard.tsx +18 -2
  482. package/src/Label.tsx +77 -0
  483. package/src/Landmark.tsx +6 -1
  484. package/src/Link.tsx +65 -19
  485. package/src/ListBox.tsx +645 -468
  486. package/src/ListDropTargetDelegate.ts +4 -0
  487. package/src/Menu.tsx +512 -349
  488. package/src/Meter.tsx +42 -8
  489. package/src/Modal.tsx +85 -42
  490. package/src/NumberField.tsx +161 -48
  491. package/src/Popover.tsx +424 -148
  492. package/src/Pressable.tsx +27 -6
  493. package/src/PreviewTrigger.tsx +171 -0
  494. package/src/ProgressBar.tsx +25 -3
  495. package/src/RadioGroup.tsx +230 -161
  496. package/src/RangeCalendar.tsx +75 -63
  497. package/src/RouterProvider.tsx +24 -14
  498. package/src/SearchField.tsx +118 -121
  499. package/src/Select.tsx +454 -274
  500. package/src/SelectionIndicator.tsx +21 -3
  501. package/src/Separator.tsx +17 -1
  502. package/src/SharedElementTransition.tsx +115 -97
  503. package/src/Slider.tsx +35 -17
  504. package/src/StepList.tsx +71 -32
  505. package/src/Switch.tsx +45 -29
  506. package/src/Table.tsx +446 -380
  507. package/src/Tabs.tsx +132 -155
  508. package/src/TagGroup.tsx +53 -40
  509. package/src/Text.tsx +23 -6
  510. package/src/TextField.tsx +118 -159
  511. package/src/TimeField.tsx +34 -95
  512. package/src/Toast.tsx +141 -67
  513. package/src/ToggleButton.tsx +33 -15
  514. package/src/ToggleButtonGroup.tsx +27 -9
  515. package/src/TokenField.tsx +379 -0
  516. package/src/Toolbar.tsx +19 -9
  517. package/src/Tooltip.tsx +126 -84
  518. package/src/Tree.tsx +233 -173
  519. package/src/Virtualizer.tsx +400 -138
  520. package/src/VirtualizerLayouts.ts +211 -26
  521. package/src/VisuallyHidden.tsx +22 -8
  522. package/src/contexts.ts +13 -0
  523. package/src/index.ts +32 -11
  524. package/src/intl/ar-AE.json +6 -0
  525. package/src/intl/bg-BG.json +6 -0
  526. package/src/intl/cs-CZ.json +6 -0
  527. package/src/intl/da-DK.json +6 -0
  528. package/src/intl/de-DE.json +6 -0
  529. package/src/intl/el-GR.json +6 -0
  530. package/src/intl/en-US.json +6 -0
  531. package/src/intl/es-ES.json +6 -0
  532. package/src/intl/et-EE.json +6 -0
  533. package/src/intl/fi-FI.json +6 -0
  534. package/src/intl/fr-FR.json +6 -0
  535. package/src/intl/he-IL.json +6 -0
  536. package/src/intl/hr-HR.json +6 -0
  537. package/src/intl/hu-HU.json +6 -0
  538. package/src/intl/index.ts +125 -0
  539. package/src/intl/it-IT.json +6 -0
  540. package/src/intl/ja-JP.json +6 -0
  541. package/src/intl/ko-KR.json +6 -0
  542. package/src/intl/lt-LT.json +6 -0
  543. package/src/intl/lv-LV.json +6 -0
  544. package/src/intl/nb-NO.json +6 -0
  545. package/src/intl/nl-NL.json +6 -0
  546. package/src/intl/pl-PL.json +6 -0
  547. package/src/intl/pt-BR.json +6 -0
  548. package/src/intl/pt-PT.json +6 -0
  549. package/src/intl/ro-RO.json +6 -0
  550. package/src/intl/ru-RU.json +6 -0
  551. package/src/intl/sk-SK.json +6 -0
  552. package/src/intl/sl-SI.json +6 -0
  553. package/src/intl/sr-SP.json +6 -0
  554. package/src/intl/sv-SE.json +6 -0
  555. package/src/intl/tr-TR.json +6 -0
  556. package/src/intl/uk-UA.json +6 -0
  557. package/src/intl/zh-CN.json +6 -0
  558. package/src/intl/zh-TW.json +6 -0
  559. package/src/useDragAndDrop.ts +30 -32
  560. package/src/utils.tsx +124 -68
  561. package/src/virtualizer/Layout.ts +29 -0
package/dist/Popover.jsx CHANGED
@@ -1,8 +1,22 @@
1
+ /*
2
+ * Copyright 2022 Adobe. All rights reserved.
3
+ * This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
+ * you may not use this file except in compliance with the License. You may obtain a copy
5
+ * of the License at http://www.apache.org/licenses/LICENSE-2.0
6
+ *
7
+ * Unless required by applicable law or agreed to in writing, software distributed under
8
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
+ * OF ANY KIND, either express or implied. See the License for the specific language
10
+ * governing permissions and limitations under the License.
11
+ */
12
+ // Ported to SolidJS for Proyecto Viviana; based on packages/react-aria-components/src/Popover.tsx
1
13
  import { dataAttr, filterDOMProps, useIsHydrated, useRenderProps } from "./utils.jsx";
2
- import { o as usePopoverTrigger, r as PopoverTriggerContext, t as DialogTriggerContext } from "./contexts.jsx";
3
- import { Show, createContext, createEffect, createMemo, createSignal, createUniqueId, onCleanup, splitProps, useContext } from "solid-js";
4
- import { Portal } from "solid-js/web";
5
- import { FocusScope, createOverlayTrigger, createPopover, useLocale, useUNSAFE_PortalContext, visuallyHiddenStyles } from "@proyecto-viviana/solidaria";
14
+ import { n as OverlayTriggerStateContext, o as usePopoverTrigger, r as PopoverTriggerContext, t as DialogTriggerContext } from "./contexts.jsx";
15
+ import { SelectContext } from "./Select.jsx";
16
+ import { Show, createContext, createEffect, createMemo, createSignal, createTrackedEffect, createUniqueId, useContext } from "solid-js";
17
+ import { Portal } from "@solidjs/web";
18
+ import { FocusScope, FocusableContext, createEnterAnimation, createExitAnimation, createOverlayTrigger, createPopover, createStringFormatter, overlaysIntlStrings, useIsHidden, useLocale, useUNSAFE_PortalContext, visuallyHiddenStyles } from "@proyecto-viviana/solidaria";
19
+ import { splitProps } from "@proyecto-viviana/solidaria/utils";
6
20
  import { createOverlayTriggerState } from "@proyecto-viviana/solid-stately";
7
21
  //#region src/Popover.tsx
8
22
  /**
@@ -13,8 +27,21 @@ import { createOverlayTriggerState } from "@proyecto-viviana/solid-stately";
13
27
  */
14
28
  const PopoverContext = createContext(null);
15
29
  const PopoverGroupContext = createContext(null);
30
+ const OverlayContext = createContext(null);
31
+ function resolveTriggerElement(value) {
32
+ if (value == null) return null;
33
+ if (typeof value === "function") return resolveTriggerElement(value());
34
+ if (value instanceof Element) return value;
35
+ return null;
36
+ }
37
+ function preferredPlacementAxis(placement) {
38
+ const axis = (placement ?? "bottom").split(" ")[0];
39
+ if (axis === "top" || axis === "bottom" || axis === "left" || axis === "right") return axis;
40
+ return "bottom";
41
+ }
16
42
  function PopoverDismissButton(props) {
17
- return <button type="button" aria-label="Dismiss" tabIndex={-1} onClick={props.onDismiss} style={visuallyHiddenStyles} />;
43
+ const stringFormatter = createStringFormatter(overlaysIntlStrings, "@react-aria/overlays");
44
+ return <button type="button" aria-label={stringFormatter().format("dismiss")} tabindex={-1} onClick={props.onDismiss} style={visuallyHiddenStyles} />;
18
45
  }
19
46
  /**
20
47
  * A PopoverTrigger opens a popover when a trigger element is pressed.
@@ -43,7 +70,10 @@ function PopoverTrigger(props) {
43
70
  isOpen: () => state.isOpen(),
44
71
  open: () => state.open(),
45
72
  close: () => state.close(),
46
- toggle: () => state.toggle()
73
+ toggle: () => state.toggle(),
74
+ setOpen: (next) => state.setOpen(next),
75
+ point: () => state.point(),
76
+ setPoint: (next) => state.setPoint(next)
47
77
  },
48
78
  triggerRef: () => triggerRef,
49
79
  setTriggerRef: (el) => {
@@ -55,9 +85,7 @@ function PopoverTrigger(props) {
55
85
  overlayProps: triggerAria.overlayProps,
56
86
  trigger: "PopoverTrigger"
57
87
  }));
58
- return <PopoverTriggerContext.Provider value={contextValue()}>
59
- {props.children}
60
- </PopoverTriggerContext.Provider>;
88
+ return <PopoverTriggerContext value={contextValue()}>{props.children}</PopoverTriggerContext>;
61
89
  }
62
90
  /**
63
91
  * A popover is an overlay element positioned relative to a trigger.
@@ -86,15 +114,19 @@ function Popover(props) {
86
114
  "onOpenChange",
87
115
  "autoFocus",
88
116
  "isEntering",
89
- "isExiting"
117
+ "isExiting",
118
+ "shouldSkipAnimation"
90
119
  ]);
91
- const [popoverRef, setPopoverRef] = createSignal(null);
92
- const [groupRef, setGroupRef] = createSignal(null);
120
+ const [popoverRef, setPopoverRef] = createSignal(null, { ownedWrite: true });
121
+ const [groupRef, setGroupRef] = createSignal(null, { ownedWrite: true });
93
122
  const isHydrated = useIsHydrated();
94
123
  const locale = useLocale();
95
124
  const triggerContext = useContext(PopoverTriggerContext);
96
125
  const dialogTriggerContext = useContext(DialogTriggerContext);
126
+ const overlayTriggerState = useContext(OverlayTriggerStateContext);
97
127
  const popoverGroupContext = useContext(PopoverGroupContext);
128
+ const selectContext = useContext(SelectContext);
129
+ const overlayLabelledBy = () => props["aria-labelledby"] ?? (selectContext?.menuProps)?.["aria-labelledby"] ?? (triggerContext?.overlayProps)?.["aria-labelledby"];
98
130
  const resolvedTrigger = () => local.trigger ?? triggerContext?.trigger ?? (dialogTriggerContext ? "DialogTrigger" : void 0);
99
131
  const isSubPopover = () => resolvedTrigger() === "SubmenuTrigger" && popoverGroupContext != null;
100
132
  const [internalOpen, setInternalOpen] = createSignal(local.defaultOpen ?? false);
@@ -102,6 +134,7 @@ function Popover(props) {
102
134
  if (local.isOpen !== void 0) return local.isOpen;
103
135
  if (triggerContext) return triggerContext.state.isOpen();
104
136
  if (dialogTriggerContext) return dialogTriggerContext.state.isOpen();
137
+ if (overlayTriggerState) return overlayTriggerState.isOpen;
105
138
  return internalOpen();
106
139
  };
107
140
  const close = () => {
@@ -112,13 +145,16 @@ function Popover(props) {
112
145
  } else if (dialogTriggerContext) {
113
146
  dialogTriggerContext.state.close();
114
147
  local.onOpenChange?.(false);
148
+ } else if (overlayTriggerState) {
149
+ overlayTriggerState.close();
150
+ local.onOpenChange?.(false);
115
151
  } else {
116
152
  setInternalOpen(false);
117
153
  local.onOpenChange?.(false);
118
154
  }
119
155
  };
120
156
  const getTriggerRef = () => {
121
- if (local.triggerRef) return local.triggerRef();
157
+ if (local.triggerRef !== void 0) return resolveTriggerElement(local.triggerRef);
122
158
  if (triggerContext) return triggerContext.triggerRef();
123
159
  if (dialogTriggerContext) return dialogTriggerContext.triggerRef();
124
160
  return null;
@@ -158,7 +194,7 @@ function Popover(props) {
158
194
  return local.scrollRef;
159
195
  },
160
196
  get isNonModal() {
161
- return local.isNonModal;
197
+ return local.isNonModal ?? resolvedTrigger() === "PreviewTrigger";
162
198
  },
163
199
  get isKeyboardDismissDisabled() {
164
200
  return local.isKeyboardDismissDisabled;
@@ -179,6 +215,9 @@ function Popover(props) {
179
215
  } else if (dialogTriggerContext) {
180
216
  dialogTriggerContext.state.open();
181
217
  local.onOpenChange?.(true);
218
+ } else if (overlayTriggerState) {
219
+ overlayTriggerState.open();
220
+ local.onOpenChange?.(true);
182
221
  } else {
183
222
  setInternalOpen(true);
184
223
  local.onOpenChange?.(true);
@@ -190,43 +229,40 @@ function Popover(props) {
190
229
  else if (local.isOpen !== void 0) local.onOpenChange?.(true);
191
230
  else if (triggerContext) triggerContext.state.toggle();
192
231
  else if (dialogTriggerContext) dialogTriggerContext.state.toggle();
232
+ else if (overlayTriggerState) overlayTriggerState.toggle();
193
233
  else {
194
234
  setInternalOpen(true);
195
235
  local.onOpenChange?.(true);
196
236
  }
197
- }
198
- });
199
- const renderValues = createMemo(() => ({
200
- trigger: resolvedTrigger() ?? null,
201
- placement: popoverAria.placement(),
202
- isEntering: local.isEntering ?? false,
203
- isExiting: local.isExiting ?? false
204
- }));
205
- const renderProps = useRenderProps({
206
- get children() {
207
- return props.children;
208
237
  },
209
- class: local.class,
210
- style: local.style,
211
- defaultClassName: "solidaria-Popover"
212
- }, renderValues);
238
+ point: () => triggerContext?.state.point?.() ?? dialogTriggerContext?.state.point?.() ?? null
239
+ });
240
+ const skipAnimation = () => local.shouldSkipAnimation ?? triggerContext?.shouldSkipAnimation?.() ?? false;
241
+ const exitAnimation = createExitAnimation(() => popoverRef(), isOpen);
242
+ const isExiting = () => Boolean(local.isExiting) || !skipAnimation() && exitAnimation();
243
+ const isHidden = useIsHidden();
213
244
  const [triggerWidth, setTriggerWidth] = createSignal();
214
245
  const hasExplicitTriggerWidth = () => {
215
- return renderProps.style()?.["--trigger-width"] != null;
246
+ return (typeof local.style === "function" ? void 0 : local.style)?.["--trigger-width"] != null;
216
247
  };
217
248
  const updateTriggerWidth = () => {
218
249
  const trigger = getTriggerRef();
219
250
  if (!trigger || hasExplicitTriggerWidth()) return;
220
- setTriggerWidth(`${trigger.getBoundingClientRect().width}px`);
251
+ const width = trigger instanceof HTMLElement ? trigger.offsetWidth : trigger.getBoundingClientRect().width;
252
+ setTriggerWidth(`${width}px`);
221
253
  };
222
- createEffect(() => {
254
+ createTrackedEffect(() => {
255
+ const _s2Cleanups = [];
223
256
  if (!isOpen()) return;
224
257
  updateTriggerWidth();
225
258
  const trigger = getTriggerRef();
226
259
  if (!trigger || hasExplicitTriggerWidth() || typeof ResizeObserver === "undefined") return;
227
260
  const observer = new ResizeObserver(updateTriggerWidth);
228
261
  observer.observe(trigger);
229
- onCleanup(() => observer.disconnect());
262
+ _s2Cleanups.push(() => observer.disconnect());
263
+ return () => {
264
+ for (const c of _s2Cleanups) c();
265
+ };
230
266
  });
231
267
  const domProps = createMemo(() => filterDOMProps(rest, { global: true }));
232
268
  const overlayId = () => {
@@ -236,90 +272,187 @@ function Popover(props) {
236
272
  const { style: _style, ref: _ref, ...remaining } = popoverAria.popoverProps;
237
273
  return remaining;
238
274
  };
239
- const mergedStyle = () => {
240
- const ariaStyle = popoverAria.popoverProps.style;
241
- const renderStyle = renderProps.style() || {};
275
+ const shouldBeDialogBase = () => !local.isNonModal || resolvedTrigger() === "SubmenuTrigger" || resolvedTrigger() === "PreviewTrigger";
276
+ const [isDialog, setIsDialog] = createSignal(shouldBeDialogBase());
277
+ const [overlayContain, setOverlayContain] = createSignal(false);
278
+ createEffect(() => {
242
279
  return {
243
- ...ariaStyle,
244
- ...renderStyle,
245
- "--trigger-width": renderStyle["--trigger-width"] ?? triggerWidth()
280
+ node: popoverRef(),
281
+ dialogBase: shouldBeDialogBase()
246
282
  };
247
- };
248
- const shouldBeDialog = () => !local.isNonModal || resolvedTrigger() === "SubmenuTrigger";
283
+ }, ({ node, dialogBase }) => {
284
+ if (!node) return;
285
+ setIsDialog(dialogBase && node.querySelector("[role=dialog]") == null);
286
+ });
287
+ const shouldBeDialog = () => isDialog();
249
288
  const shouldContainFocus = () => {
250
289
  if (!shouldBeDialog()) return false;
251
- const trigger = resolvedTrigger();
252
- return trigger !== "MenuTrigger" && trigger !== "SubmenuTrigger";
290
+ return resolvedTrigger() !== "PreviewTrigger";
253
291
  };
254
292
  const portalContext = useUNSAFE_PortalContext();
255
293
  const portalContainer = () => {
256
294
  if (isSubPopover()) return popoverGroupContext?.() ?? portalContext.getContainer?.() ?? void 0;
257
295
  return portalContext.getContainer?.() ?? void 0;
258
296
  };
297
+ const callerDir = () => {
298
+ const value = rest.dir;
299
+ if (value === "ltr" || value === "rtl" || value === "auto") return value;
300
+ };
301
+ const callerLang = () => rest.lang;
302
+ const stampOverlayLocale = (el) => {
303
+ if (!el) return;
304
+ const loc = locale();
305
+ const dir = callerDir();
306
+ const lang = callerLang();
307
+ if (!dir) el.dir = loc.direction;
308
+ else el.dir = dir;
309
+ if (!lang) el.lang = loc.locale;
310
+ else el.lang = lang;
311
+ };
312
+ createEffect(() => {
313
+ const el = popoverRef();
314
+ domProps();
315
+ cleanPopoverProps();
316
+ triggerContext?.overlayProps;
317
+ locale();
318
+ return el;
319
+ }, (el) => {
320
+ if (!el) return;
321
+ stampOverlayLocale(el);
322
+ });
259
323
  createEffect(() => {
260
- if (!isOpen() || !shouldBeDialog()) return;
261
- if ((local.autoFocus ?? true) === false) return;
262
- if (!popoverRef()) return;
263
- if (resolvedTrigger() === "SubmenuTrigger") return;
324
+ return {
325
+ open: isOpen(),
326
+ dialog: shouldBeDialog(),
327
+ autoFocus: local.autoFocus ?? true,
328
+ node: popoverRef(),
329
+ trigger: resolvedTrigger()
330
+ };
331
+ }, ({ open, dialog, autoFocus, node, trigger }) => {
332
+ if (!open || !dialog) return;
333
+ if (autoFocus === false) return;
334
+ if (!node) return;
335
+ if (trigger === "SubmenuTrigger") return;
336
+ if (trigger === "PreviewTrigger") return;
264
337
  let timeout;
265
338
  let frame;
266
339
  const focusIfNeeded = () => {
267
340
  if (!isOpen() || !shouldBeDialog()) return;
268
- const node = popoverRef();
269
- if (!node || resolvedTrigger() === "SubmenuTrigger") return;
270
- if (document.activeElement === node || node.contains(document.activeElement)) return;
271
- node.focus();
341
+ const current = popoverRef();
342
+ if (!current || resolvedTrigger() === "SubmenuTrigger") return;
343
+ if (resolvedTrigger() === "PreviewTrigger") return;
344
+ if (current.querySelector("[role=dialog]")) return;
345
+ if (document.activeElement === current || current.contains(document.activeElement)) return;
346
+ current.focus();
272
347
  };
273
348
  const scheduleFocus = () => {
274
349
  timeout = window.setTimeout(focusIfNeeded, 0);
275
350
  };
276
351
  if (typeof window.requestAnimationFrame === "function") frame = window.requestAnimationFrame(scheduleFocus);
277
352
  else scheduleFocus();
278
- onCleanup(() => {
353
+ return () => {
279
354
  if (frame !== void 0) window.cancelAnimationFrame(frame);
280
355
  if (timeout !== void 0) window.clearTimeout(timeout);
281
- });
356
+ };
282
357
  });
283
- createEffect(() => {
284
- if (!isOpen()) return;
285
- if (local.isKeyboardDismissDisabled) return;
358
+ createEffect(() => ({
359
+ open: isOpen(),
360
+ keyboardDismissDisabled: !!local.isKeyboardDismissDisabled
361
+ }), ({ open, keyboardDismissDisabled }) => {
362
+ if (!open) return;
363
+ if (keyboardDismissDisabled) return;
286
364
  const onKeyDown = (event) => {
287
365
  if (event.key !== "Escape") return;
288
366
  if (event.defaultPrevented) return;
289
367
  close();
290
368
  };
291
369
  document.addEventListener("keydown", onKeyDown);
292
- onCleanup(() => document.removeEventListener("keydown", onKeyDown));
370
+ return () => document.removeEventListener("keydown", onKeyDown);
293
371
  });
294
- const overlay = () => <PopoverContext.Provider value={{
295
- placement: popoverAria.placement,
296
- arrowProps: () => popoverAria.arrowProps
297
- }}>
298
- <FocusScope contain={shouldContainFocus()} restoreFocus>
299
- <div {...domProps()} {...cleanPopoverProps()} ref={setPopoverRef} id={overlayId()} role={shouldBeDialog() ? "dialog" : void 0} tabIndex={shouldBeDialog() ? -1 : void 0} class={renderProps.class()} style={mergedStyle()} lang={locale().locale} dir={locale().direction} data-trigger={resolvedTrigger()} data-placement={popoverAria.placement()} data-entering={dataAttr(local.isEntering)} data-exiting={dataAttr(local.isExiting)}>
300
- <Show when={!local.isNonModal}>
372
+ const isNonModal = () => local.isNonModal ?? resolvedTrigger() === "PreviewTrigger";
373
+ function PopoverInner() {
374
+ const enterAnimation = createEnterAnimation(() => popoverRef(), () => popoverAria.placement() != null);
375
+ const isEntering = () => Boolean(local.isEntering) || !skipAnimation() && (enterAnimation() || isOpen() && popoverAria.placement() == null);
376
+ const renderValues = createMemo(() => {
377
+ const preferred = preferredPlacementAxis(local.placement);
378
+ const entering = isEntering();
379
+ return {
380
+ trigger: resolvedTrigger() ?? null,
381
+ placement: popoverAria.placement() ?? preferred,
382
+ isEntering: entering,
383
+ isExiting: isExiting()
384
+ };
385
+ });
386
+ const renderProps = useRenderProps({
387
+ get children() {
388
+ return props.children;
389
+ },
390
+ class: local.class,
391
+ style: local.style,
392
+ defaultClassName: "solidaria-Popover"
393
+ }, renderValues);
394
+ const mergedStyle = () => {
395
+ const ariaStyle = popoverAria.popoverProps.style;
396
+ const renderStyle = renderProps.style() || {};
397
+ return {
398
+ ...ariaStyle,
399
+ ...renderStyle,
400
+ "--trigger-width": renderStyle["--trigger-width"] ?? triggerWidth()
401
+ };
402
+ };
403
+ return <PopoverContext value={{
404
+ placement: popoverAria.placement,
405
+ arrowProps: () => popoverAria.arrowProps
406
+ }}>
407
+ <OverlayContext value={{ setContain: setOverlayContain }}>
408
+ <div {...domProps()} {...cleanPopoverProps()} {...triggerContext?.overlayProps ?? {}} ref={(el) => {
409
+ setPopoverRef(el);
410
+ triggerContext?.setOverlayRef?.(el);
411
+ stampOverlayLocale(el);
412
+ }} id={overlayId()} role={shouldBeDialog() ? "dialog" : void 0} tabindex={shouldBeDialog() ? -1 : void 0} aria-labelledby={overlayLabelledBy()} class={renderProps.class()} style={mergedStyle()} lang={callerLang() ?? locale().locale} dir={callerDir() ?? locale().direction} data-trigger={resolvedTrigger()} data-placement={renderValues().placement} data-entering={dataAttr(isEntering())} data-exiting={dataAttr(isExiting())}>
413
+ <Show when={!isNonModal()}>
414
+ <PopoverDismissButton onDismiss={close} />
415
+ </Show>
416
+ {}
417
+ {renderProps.renderChildrenStable()}
301
418
  <PopoverDismissButton onDismiss={close} />
302
- </Show>
303
- {renderProps.renderChildren()}
304
- <PopoverDismissButton onDismiss={close} />
305
- </div>
306
- </FocusScope>
307
- </PopoverContext.Provider>;
419
+ </div>
420
+ </OverlayContext>
421
+ </PopoverContext>;
422
+ }
308
423
  const underlay = () => <div data-testid="underlay" {...popoverAria.underlayProps} style={{
309
424
  position: "fixed",
310
425
  inset: 0
311
426
  }} />;
312
- return <Show when={isHydrated() && (isOpen() || local.isExiting)}>
313
- <Portal mount={portalContainer()}>
314
- <Show when={!local.isNonModal && !isSubPopover() && isOpen()}>{underlay()}</Show>
315
- <Show when={isSubPopover()} fallback={<div ref={setGroupRef} style={{ display: "contents" }}>
316
- <PopoverGroupContext.Provider value={() => groupRef()}>
317
- {overlay()}
318
- </PopoverGroupContext.Provider>
319
- </div>}>
320
- {overlay()}
321
- </Show>
322
- </Portal>
427
+ const hiddenChildren = () => {
428
+ const children = props.children;
429
+ if (typeof children === "function") return children({
430
+ trigger: resolvedTrigger() ?? null,
431
+ placement: "bottom",
432
+ isEntering: false,
433
+ isExiting: false
434
+ });
435
+ return children;
436
+ };
437
+ return <Show when={!isHidden()} fallback={hiddenChildren()}>
438
+ <Show when={isHydrated() && (isOpen() || isExiting())}>
439
+ {}
440
+ <Portal mount={portalContainer()}>
441
+ <FocusableContext value={null}>
442
+ {}
443
+ <FocusScope contain={(shouldContainFocus() || overlayContain()) && !isExiting()} restoreFocus>
444
+ <Show when={!isNonModal() && !isSubPopover() && isOpen()}>{underlay()}</Show>
445
+ <Show when={isSubPopover()} fallback={<div ref={setGroupRef} style={{ display: "contents" }}>
446
+ <PopoverGroupContext value={() => groupRef()}>
447
+ <PopoverInner />
448
+ </PopoverGroupContext>
449
+ </div>}>
450
+ <PopoverInner />
451
+ </Show>
452
+ </FocusScope>
453
+ </FocusableContext>
454
+ </Portal>
455
+ </Show>
323
456
  </Show>;
324
457
  }
325
458
  /**
@@ -349,6 +482,6 @@ function OverlayArrow(props) {
349
482
  </div>;
350
483
  }
351
484
  //#endregion
352
- export { OverlayArrow, Popover, Popover as default, PopoverContext, PopoverTrigger, PopoverTriggerContext, usePopoverTrigger };
485
+ export { OverlayArrow, OverlayContext, Popover, Popover as default, PopoverContext, PopoverTrigger, PopoverTriggerContext, usePopoverTrigger };
353
486
 
354
487
  //# sourceMappingURL=Popover.jsx.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.jsx","names":[],"sources":["../src/Popover.tsx"],"sourcesContent":["/**\n * Popover component for solidaria-components\n *\n * A headless popover component that positions relative to a trigger element.\n * Port of react-aria-components Popover.\n */\n\nimport {\n type JSX,\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n onCleanup,\n splitProps,\n useContext,\n Show,\n} from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport {\n createOverlayTrigger,\n createPopover,\n FocusScope,\n useLocale,\n useUNSAFE_PortalContext,\n visuallyHiddenStyles,\n type AriaLabelingProps,\n type Placement,\n type PlacementAxis,\n} from \"@proyecto-viviana/solidaria\";\nimport { createOverlayTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n dataAttr,\n useIsHydrated,\n} from \"./utils\";\nimport { DialogTriggerContext, PopoverTriggerContext } from \"./contexts\";\n\nexport interface PopoverRenderProps {\n /**\n * The name of the component that triggered the popover.\n */\n trigger: string | null;\n /**\n * The placement of the popover relative to the trigger.\n */\n placement: PlacementAxis | null;\n /**\n * Whether the popover is currently entering (for animations).\n */\n isEntering: boolean;\n /**\n * Whether the popover is currently exiting (for animations).\n */\n isExiting: boolean;\n}\n\nexport interface PopoverProps extends SlotProps, AriaLabelingProps {\n /** The children of the component - can be JSX or render function. */\n children?: RenderChildren<PopoverRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<PopoverRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<PopoverRenderProps>;\n /**\n * The name of the component that triggered the popover.\n */\n trigger?: string;\n /**\n * The ref for the element which the popover positions itself with respect to.\n * Required when used standalone (not within a trigger component).\n */\n triggerRef?: () => Element | null;\n /**\n * The placement of the element with respect to its anchor element.\n * @default 'bottom'\n */\n placement?: Placement;\n /**\n * The placement padding that should be applied between the element and its\n * surrounding container.\n * @default 12\n */\n containerPadding?: number;\n /**\n * The additional offset applied along the main axis between the element and its\n * anchor element.\n * @default 8\n */\n offset?: number;\n /**\n * The additional offset applied along the cross axis between the element and its\n * anchor element.\n * @default 0\n */\n crossOffset?: number;\n /**\n * Whether the element should flip its orientation when there is insufficient room.\n * @default true\n */\n shouldFlip?: boolean;\n /**\n * The max height of the popover.\n */\n maxHeight?: number;\n /**\n * A boundary element for placement calculations.\n */\n boundaryElement?: Element;\n /**\n * Overrides the target element's bounding rectangle. Useful for positioning relative to\n * a specific point such as the mouse cursor (e.g. context menus) or text selection.\n *\n * @default target.getBoundingClientRect()\n * @param target - The target element.\n */\n getTargetRect?: (target: Element) => DOMRect | null | undefined;\n /**\n * A ref for the popover arrow element.\n */\n arrowRef?: () => Element | null;\n /**\n * A ref for the scrollable popover element.\n */\n scrollRef?: () => Element | null;\n /**\n * Whether the popover is non-modal (allows interaction outside).\n */\n isNonModal?: boolean;\n /**\n * Whether pressing Escape to close should be disabled.\n */\n isKeyboardDismissDisabled?: boolean;\n /**\n * Filter for which outside interactions should close the popover.\n */\n shouldCloseOnInteractOutside?: (element: Element) => boolean;\n /** Whether the popover is open (controlled). */\n isOpen?: boolean;\n /** Whether the popover opens by default (uncontrolled). */\n defaultOpen?: boolean;\n /** Handler called when the popover's open state changes. */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Whether focus should move to the popover container on open.\n * @default true\n */\n autoFocus?: boolean;\n /** Whether the popover is entering (for animations). */\n isEntering?: boolean;\n /** Whether the popover is exiting (for animations). */\n isExiting?: boolean;\n}\n\nexport interface PopoverTriggerProps {\n /** The children - should include a trigger and popover content. */\n children: JSX.Element;\n /** Whether the popover is open (controlled). */\n isOpen?: boolean;\n /** Whether the popover is open by default (uncontrolled). */\n defaultOpen?: boolean;\n /** Callback when open state changes. */\n onOpenChange?: (isOpen: boolean) => void;\n}\n\nexport {\n PopoverTriggerContext,\n usePopoverTrigger,\n type PopoverTriggerContextValue,\n} from \"./contexts\";\n\ninterface PopoverContextValue {\n placement: () => PlacementAxis | null;\n arrowProps: () => JSX.HTMLAttributes<HTMLElement>;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue | null>(null);\nconst PopoverGroupContext = createContext<(() => HTMLElement | null) | null>(null);\n\nfunction PopoverDismissButton(props: { onDismiss: () => void }): JSX.Element {\n return (\n <button\n type=\"button\"\n aria-label=\"Dismiss\"\n tabIndex={-1}\n onClick={props.onDismiss}\n style={visuallyHiddenStyles}\n />\n );\n}\n\n/**\n * A PopoverTrigger opens a popover when a trigger element is pressed.\n * Children should include a trigger element (e.g. Button) and the Popover.\n */\nexport function PopoverTrigger(props: PopoverTriggerProps): JSX.Element {\n const [local] = splitProps(props, [\"isOpen\", \"defaultOpen\", \"onOpenChange\"]);\n\n const state = createOverlayTriggerState({\n get isOpen() {\n return local.isOpen;\n },\n get defaultOpen() {\n return local.defaultOpen;\n },\n onOpenChange: local.onOpenChange,\n });\n\n let triggerRef: HTMLElement | null = null;\n const triggerId = createUniqueId();\n\n const triggerAria = createOverlayTrigger({ type: \"dialog\" }, state, () => triggerRef);\n\n const contextValue = createMemo(() => ({\n state: {\n isOpen: () => state.isOpen(),\n open: () => state.open(),\n close: () => state.close(),\n toggle: () => state.toggle(),\n },\n triggerRef: () => triggerRef,\n setTriggerRef: (el: HTMLElement | null) => {\n if (!el) return;\n if (!triggerRef || !triggerRef.isConnected) {\n triggerRef = el;\n }\n },\n triggerId,\n triggerProps: triggerAria.triggerProps,\n overlayProps: triggerAria.overlayProps,\n trigger: \"PopoverTrigger\",\n }));\n\n return (\n <PopoverTriggerContext.Provider value={contextValue()}>\n {props.children}\n </PopoverTriggerContext.Provider>\n );\n}\n\n/**\n * A popover is an overlay element positioned relative to a trigger.\n */\nexport function Popover(props: PopoverProps): JSX.Element {\n // Note: do NOT early-return on the server. Returning `null` on the server and a\n // full <Show>/<Portal> tree on the client desyncs Solid's hydration walk (the\n // server emits no marker for the <Show>), which surfaces as \"Hydration Mismatch /\n // getNextElement\" in the parent (e.g. Picker). Instead, run the same structure on\n // both and gate the Portal on `useIsHydrated()` so the overlay only mounts on the\n // client after hydration — the server + first client render both produce an empty\n // <Show> marker, so hydration aligns.\n const [local, rest] = splitProps(props, [\n \"class\",\n \"style\",\n \"trigger\",\n \"triggerRef\",\n \"placement\",\n \"containerPadding\",\n \"offset\",\n \"crossOffset\",\n \"shouldFlip\",\n \"maxHeight\",\n \"boundaryElement\",\n \"getTargetRect\",\n \"arrowRef\",\n \"scrollRef\",\n \"isNonModal\",\n \"isKeyboardDismissDisabled\",\n \"shouldCloseOnInteractOutside\",\n \"isOpen\",\n \"defaultOpen\",\n \"onOpenChange\",\n \"autoFocus\",\n \"isEntering\",\n \"isExiting\",\n ]);\n\n // A reactive ref (not a plain `let`) so the overlay-position effect in\n // createOverlayPosition — which tracks `overlayRef()` as a dependency —\n // re-runs once the portal node actually mounts. React gets this timing for\n // free from useLayoutEffect (the ref is populated before the position effect\n // fires); in Solid the portal node is created lazily on open, AFTER the\n // position effect first ran with a null ref, so a non-reactive ref left the\n // popover stranded at the createOverlayPosition fallback (position:fixed;\n // top:0; left:0) whenever no other dependency happened to re-fire the effect\n // after mount. Mirrors the sibling groupRef signal below.\n const [popoverRef, setPopoverRef] = createSignal<HTMLDivElement | null>(null);\n const [groupRef, setGroupRef] = createSignal<HTMLDivElement | null>(null);\n // False on the server and during hydration; true after onMount. Gates the Portal\n // so overlay content only ever renders client-side, post-hydration.\n const isHydrated = useIsHydrated();\n\n // Mirrors upstream S2 Popover (Popover.mjs: `el.lang = locale; el.dir =\n // direction`): the overlay portals out of the app root, so it must carry both\n // the locale `lang` AND writing `direction` — otherwise the portaled\n // listbox/dialog stays LTR and keeps the Latin font under an RTL Provider (the\n // `:lang(ar)` font swap needs a `lang` ancestor the portal would otherwise\n // escape). RAC's own Popover only threads `dir`; S2 adds `lang` on top.\n const locale = useLocale();\n\n const triggerContext = useContext(PopoverTriggerContext);\n const dialogTriggerContext = useContext(DialogTriggerContext);\n const popoverGroupContext = useContext(PopoverGroupContext);\n const resolvedTrigger = () =>\n local.trigger ??\n triggerContext?.trigger ??\n (dialogTriggerContext ? \"DialogTrigger\" : undefined);\n const isSubPopover = () => resolvedTrigger() === \"SubmenuTrigger\" && popoverGroupContext != null;\n\n const [internalOpen, setInternalOpen] = createSignal(local.defaultOpen ?? false);\n\n const isOpen = (): boolean => {\n if (local.isOpen !== undefined) return local.isOpen;\n if (triggerContext) {\n return triggerContext.state.isOpen();\n }\n if (dialogTriggerContext) {\n return dialogTriggerContext.state.isOpen();\n }\n return internalOpen();\n };\n\n const close = () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(false);\n } else if (triggerContext) {\n triggerContext.state.close();\n local.onOpenChange?.(false);\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.close();\n local.onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n local.onOpenChange?.(false);\n }\n };\n\n const getTriggerRef = () => {\n if (local.triggerRef) return local.triggerRef();\n if (triggerContext) return triggerContext.triggerRef();\n if (dialogTriggerContext) return dialogTriggerContext.triggerRef();\n return null;\n };\n\n const popoverAria = createPopover(\n {\n triggerRef: getTriggerRef,\n popoverRef: () => popoverRef(),\n groupRef: () => (isSubPopover() ? (popoverGroupContext?.() ?? null) : groupRef()),\n get placement() {\n return local.placement;\n },\n get containerPadding() {\n return local.containerPadding;\n },\n get offset() {\n return local.offset ?? 8;\n },\n get crossOffset() {\n return local.crossOffset;\n },\n get shouldFlip() {\n return local.shouldFlip;\n },\n get maxHeight() {\n return local.maxHeight;\n },\n get boundaryElement() {\n return local.boundaryElement;\n },\n get getTargetRect() {\n return local.getTargetRect;\n },\n get arrowRef() {\n return local.arrowRef;\n },\n get scrollRef() {\n return local.scrollRef;\n },\n get isNonModal() {\n return local.isNonModal;\n },\n get isKeyboardDismissDisabled() {\n return local.isKeyboardDismissDisabled;\n },\n get shouldCloseOnInteractOutside() {\n return local.shouldCloseOnInteractOutside;\n },\n get trigger() {\n return resolvedTrigger();\n },\n },\n {\n isOpen,\n open: () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(true);\n } else if (triggerContext) {\n triggerContext.state.open();\n local.onOpenChange?.(true);\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.open();\n local.onOpenChange?.(true);\n } else {\n setInternalOpen(true);\n local.onOpenChange?.(true);\n }\n },\n close,\n toggle: () => {\n if (isOpen()) close();\n else if (local.isOpen !== undefined) {\n local.onOpenChange?.(true);\n } else if (triggerContext) {\n triggerContext.state.toggle();\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.toggle();\n } else {\n setInternalOpen(true);\n local.onOpenChange?.(true);\n }\n },\n },\n );\n\n const renderValues = createMemo<PopoverRenderProps>(() => ({\n trigger: resolvedTrigger() ?? null,\n placement: popoverAria.placement(),\n isEntering: local.isEntering ?? false,\n isExiting: local.isExiting ?? false,\n }));\n\n const renderProps = useRenderProps(\n {\n // Read children lazily. The popover content is gated behind\n // `<Show when={isHydrated() && …}>` below, so it must NOT be instantiated\n // during the component body. An eager `children: props.children` reads the\n // child getter at object-construction time, building the content template\n // (and walking `getNextElement`) before the gate — which the server, with\n // the gate closed, never emitted → hydration mismatch. The getter defers\n // the read until `renderChildren()` runs inside the gated overlay.\n get children() {\n return props.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-Popover\",\n },\n renderValues,\n );\n\n const [triggerWidth, setTriggerWidth] = createSignal<string | undefined>();\n const hasExplicitTriggerWidth = () => {\n const style = renderProps.style() as (JSX.CSSProperties & Record<string, unknown>) | undefined;\n return style?.[\"--trigger-width\"] != null;\n };\n const updateTriggerWidth = () => {\n const trigger = getTriggerRef();\n if (!trigger || hasExplicitTriggerWidth()) return;\n setTriggerWidth(`${trigger.getBoundingClientRect().width}px`);\n };\n createEffect(() => {\n if (!isOpen()) return;\n updateTriggerWidth();\n\n const trigger = getTriggerRef();\n if (!trigger || hasExplicitTriggerWidth() || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(updateTriggerWidth);\n observer.observe(trigger);\n onCleanup(() => observer.disconnect());\n });\n\n const domProps = createMemo(() =>\n filterDOMProps(rest as Record<string, unknown>, { global: true }),\n );\n const overlayId = () => {\n const restId = (rest as Record<string, unknown>).id as string | undefined;\n return (\n restId ??\n (triggerContext?.overlayProps?.id as string | undefined) ??\n (dialogTriggerContext?.overlayProps?.id as string | undefined)\n );\n };\n\n const cleanPopoverProps = () => {\n const {\n style: _style,\n ref: _ref,\n ...remaining\n } = popoverAria.popoverProps as Record<string, unknown>;\n return remaining;\n };\n\n const mergedStyle = (): JSX.CSSProperties => {\n const ariaStyle = (popoverAria.popoverProps as Record<string, unknown>).style as\n | JSX.CSSProperties\n | undefined;\n const renderStyle = (renderProps.style() || {}) as JSX.CSSProperties & Record<string, unknown>;\n return {\n ...ariaStyle,\n ...renderStyle,\n \"--trigger-width\": renderStyle[\"--trigger-width\"] ?? triggerWidth(),\n };\n };\n\n const shouldBeDialog = () => !local.isNonModal || resolvedTrigger() === \"SubmenuTrigger\";\n const shouldContainFocus = () => {\n if (!shouldBeDialog()) {\n return false;\n }\n\n const trigger = resolvedTrigger();\n return trigger !== \"MenuTrigger\" && trigger !== \"SubmenuTrigger\";\n };\n const portalContext = useUNSAFE_PortalContext();\n const portalContainer = () => {\n if (isSubPopover()) {\n return popoverGroupContext?.() ?? portalContext.getContainer?.() ?? undefined;\n }\n return portalContext.getContainer?.() ?? undefined;\n };\n\n // Match React Aria Components: focus the popover container only when no\n // descendant has already moved focus during mount.\n createEffect(() => {\n if (!isOpen() || !shouldBeDialog()) return;\n if ((local.autoFocus ?? true) === false) return;\n if (!popoverRef()) return;\n if (resolvedTrigger() === \"SubmenuTrigger\") return;\n\n let timeout: number | undefined;\n let frame: number | undefined;\n\n const focusIfNeeded = () => {\n if (!isOpen() || !shouldBeDialog()) return;\n const node = popoverRef();\n if (!node || resolvedTrigger() === \"SubmenuTrigger\") return;\n if (document.activeElement === node || node.contains(document.activeElement)) {\n return;\n }\n node.focus();\n };\n\n const scheduleFocus = () => {\n timeout = window.setTimeout(focusIfNeeded, 0);\n };\n\n if (typeof window.requestAnimationFrame === \"function\") {\n frame = window.requestAnimationFrame(scheduleFocus);\n } else {\n scheduleFocus();\n }\n\n onCleanup(() => {\n if (frame !== undefined) {\n window.cancelAnimationFrame(frame);\n }\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n }\n });\n });\n\n // Fallback Escape handling for environments where focus is not moved into the popover.\n createEffect(() => {\n if (!isOpen()) return;\n if (local.isKeyboardDismissDisabled) return;\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n if (event.defaultPrevented) return;\n close();\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n onCleanup(() => document.removeEventListener(\"keydown\", onKeyDown));\n });\n\n const overlay = () => (\n <PopoverContext.Provider\n value={{ placement: popoverAria.placement, arrowProps: () => popoverAria.arrowProps }}\n >\n <FocusScope contain={shouldContainFocus()} restoreFocus>\n <div\n {...domProps()}\n {...cleanPopoverProps()}\n ref={setPopoverRef}\n id={overlayId()}\n role={shouldBeDialog() ? \"dialog\" : undefined}\n tabIndex={shouldBeDialog() ? -1 : undefined}\n class={renderProps.class()}\n style={mergedStyle()}\n lang={locale().locale}\n dir={locale().direction}\n data-trigger={resolvedTrigger()}\n data-placement={popoverAria.placement()}\n data-entering={dataAttr(local.isEntering)}\n data-exiting={dataAttr(local.isExiting)}\n >\n <Show when={!local.isNonModal}>\n <PopoverDismissButton onDismiss={close} />\n </Show>\n {renderProps.renderChildren()}\n <PopoverDismissButton onDismiss={close} />\n </div>\n </FocusScope>\n </PopoverContext.Provider>\n );\n\n const underlay = () => (\n <div\n data-testid=\"underlay\"\n {...(popoverAria.underlayProps as unknown as JSX.HTMLAttributes<HTMLDivElement>)}\n style={{ position: \"fixed\", inset: 0 }}\n />\n );\n\n return (\n <Show when={isHydrated() && (isOpen() || local.isExiting)}>\n <Portal mount={portalContainer()}>\n <Show when={!local.isNonModal && !isSubPopover() && isOpen()}>{underlay()}</Show>\n <Show\n when={isSubPopover()}\n fallback={\n <div ref={setGroupRef} style={{ display: \"contents\" }}>\n <PopoverGroupContext.Provider value={() => groupRef()}>\n {overlay()}\n </PopoverGroupContext.Provider>\n </div>\n }\n >\n {overlay()}\n </Show>\n </Portal>\n </Show>\n );\n}\n\nexport interface OverlayArrowProps {\n /** The children - should be an SVG or element for the arrow. */\n children?: JSX.Element;\n /** Render function used when Solid children accessors would be ambiguous. */\n render?: () => JSX.Element;\n /** The CSS className. */\n class?: string;\n /** The inline style. */\n style?: JSX.CSSProperties;\n}\n\n/**\n * An arrow element that points towards the trigger.\n */\nexport function OverlayArrow(props: OverlayArrowProps): JSX.Element {\n const popoverContext = useContext(PopoverContext);\n const placement = () => popoverContext?.placement() ?? null;\n\n // Mirror react-aria-components' OverlayArrow: the wrapper positions itself\n // absolutely against the popover edge (`[placement]: '100%'`) and takes the\n // cross-axis offset (`left`/`top`) from the overlay's computed `arrowProps`.\n // No `aria-hidden`/`role=\"presentation\"` — upstream leaves the arrow in the\n // accessibility tree (the arrow SVG surfaces as an unlabeled `img`), matching\n // S2's `<OverlayArrow className=\"\">`. The styled layer therefore passes no\n // positioning class of its own.\n const mergedStyle = (): JSX.CSSProperties => {\n const currentPlacement = placement();\n // Mirror react-aria-components' OverlayArrow: the reported `arrowProps`\n // offset (`left`/`top`) points at the arrow's CENTER, so the wrapper must be\n // pulled back by half its size to center on that point — horizontally for\n // top/bottom placements, vertically for left/right. Omitting this shifts the\n // arrow off by half its width/height (a self-inflicted divergence).\n const style: JSX.CSSProperties = {\n position: \"absolute\",\n transform:\n currentPlacement === \"top\" || currentPlacement === \"bottom\"\n ? \"translateX(-50%)\"\n : \"translateY(-50%)\",\n };\n if (currentPlacement != null) {\n (style as Record<string, string>)[currentPlacement] = \"100%\";\n }\n\n const contextStyle = (popoverContext?.arrowProps() as Record<string, unknown> | undefined)\n ?.style as (JSX.CSSProperties & Record<string, unknown>) | undefined;\n if (typeof contextStyle?.left === \"string\") {\n style.left = contextStyle.left;\n }\n if (typeof contextStyle?.top === \"string\") {\n style.top = contextStyle.top;\n }\n\n const localStyle =\n props.style &&\n !(typeof CSSStyleDeclaration !== \"undefined\" && props.style instanceof CSSStyleDeclaration)\n ? props.style\n : undefined;\n\n return {\n ...style,\n ...localStyle,\n };\n };\n\n return (\n <div class={props.class} style={mergedStyle()} data-placement={placement()}>\n {props.render ? props.render() : props.children}\n </div>\n );\n}\n\nexport default Popover;\n"],"mappings":";;;;;;;;;;;;;AAsLA,MAAa,iBAAiB,cAA0C,IAAI;AAC5E,MAAM,sBAAsB,cAAiD,IAAI;AAEjF,SAAS,qBAAqB,OAA+C;CAC3E,OACE,CAAC,OACC,cACA,qBACA,UAAU,IACV,SAAS,MAAM,WACf,OAAO;AAGb;;;;;AAMA,SAAgB,eAAe,OAAyC;CACtE,MAAM,CAAC,SAAS,WAAW,OAAO;EAAC;EAAU;EAAe;CAAc,CAAC;CAE3E,MAAM,QAAQ,0BAA0B;EACtC,IAAI,SAAS;GACX,OAAO,MAAM;EACf;EACA,IAAI,cAAc;GAChB,OAAO,MAAM;EACf;EACA,cAAc,MAAM;CACtB,CAAC;CAED,IAAI,aAAiC;CACrC,MAAM,YAAY,eAAe;CAEjC,MAAM,cAAc,qBAAqB,EAAE,MAAM,SAAS,GAAG,aAAa,UAAU;CAEpF,MAAM,eAAe,kBAAkB;EACrC,OAAO;GACL,cAAc,MAAM,OAAO;GAC3B,YAAY,MAAM,KAAK;GACvB,aAAa,MAAM,MAAM;GACzB,cAAc,MAAM,OAAO;EAC7B;EACA,kBAAkB;EAClB,gBAAgB,OAA2B;GACzC,IAAI,CAAC,IAAI;GACT,IAAI,CAAC,cAAc,CAAC,WAAW,aAC7B,aAAa;EAEjB;EACA;EACA,cAAc,YAAY;EAC1B,cAAc,YAAY;EAC1B,SAAS;CACX,EAAE;CAEF,OACE,CAAC,sBAAsB,SAAS,OAAO,aAAa,GAAG;OACpD,MAAM,SAAS;IAClB,EAAE,sBAAsB;AAE5B;;;;AAKA,SAAgB,QAAQ,OAAkC;CAQxD,MAAM,CAAC,OAAO,QAAQ,WAAW,OAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAWD,MAAM,CAAC,YAAY,iBAAiB,aAAoC,IAAI;CAC5E,MAAM,CAAC,UAAU,eAAe,aAAoC,IAAI;CAGxE,MAAM,aAAa,cAAc;CAQjC,MAAM,SAAS,UAAU;CAEzB,MAAM,iBAAiB,WAAW,qBAAqB;CACvD,MAAM,uBAAuB,WAAW,oBAAoB;CAC5D,MAAM,sBAAsB,WAAW,mBAAmB;CAC1D,MAAM,wBACJ,MAAM,WACN,gBAAgB,YACf,uBAAuB,kBAAkB,KAAA;CAC5C,MAAM,qBAAqB,gBAAgB,MAAM,oBAAoB,uBAAuB;CAE5F,MAAM,CAAC,cAAc,mBAAmB,aAAa,MAAM,eAAe,KAAK;CAE/E,MAAM,eAAwB;EAC5B,IAAI,MAAM,WAAW,KAAA,GAAW,OAAO,MAAM;EAC7C,IAAI,gBACF,OAAO,eAAe,MAAM,OAAO;EAErC,IAAI,sBACF,OAAO,qBAAqB,MAAM,OAAO;EAE3C,OAAO,aAAa;CACtB;CAEA,MAAM,cAAc;EAClB,IAAI,MAAM,WAAW,KAAA,GACnB,MAAM,eAAe,KAAK;OACrB,IAAI,gBAAgB;GACzB,eAAe,MAAM,MAAM;GAC3B,MAAM,eAAe,KAAK;EAC5B,OAAO,IAAI,sBAAsB;GAC/B,qBAAqB,MAAM,MAAM;GACjC,MAAM,eAAe,KAAK;EAC5B,OAAO;GACL,gBAAgB,KAAK;GACrB,MAAM,eAAe,KAAK;EAC5B;CACF;CAEA,MAAM,sBAAsB;EAC1B,IAAI,MAAM,YAAY,OAAO,MAAM,WAAW;EAC9C,IAAI,gBAAgB,OAAO,eAAe,WAAW;EACrD,IAAI,sBAAsB,OAAO,qBAAqB,WAAW;EACjE,OAAO;CACT;CAEA,MAAM,cAAc,cAClB;EACE,YAAY;EACZ,kBAAkB,WAAW;EAC7B,gBAAiB,aAAa,IAAK,sBAAsB,KAAK,OAAQ,SAAS;EAC/E,IAAI,YAAY;GACd,OAAO,MAAM;EACf;EACA,IAAI,mBAAmB;GACrB,OAAO,MAAM;EACf;EACA,IAAI,SAAS;GACX,OAAO,MAAM,UAAU;EACzB;EACA,IAAI,cAAc;GAChB,OAAO,MAAM;EACf;EACA,IAAI,aAAa;GACf,OAAO,MAAM;EACf;EACA,IAAI,YAAY;GACd,OAAO,MAAM;EACf;EACA,IAAI,kBAAkB;GACpB,OAAO,MAAM;EACf;EACA,IAAI,gBAAgB;GAClB,OAAO,MAAM;EACf;EACA,IAAI,WAAW;GACb,OAAO,MAAM;EACf;EACA,IAAI,YAAY;GACd,OAAO,MAAM;EACf;EACA,IAAI,aAAa;GACf,OAAO,MAAM;EACf;EACA,IAAI,4BAA4B;GAC9B,OAAO,MAAM;EACf;EACA,IAAI,+BAA+B;GACjC,OAAO,MAAM;EACf;EACA,IAAI,UAAU;GACZ,OAAO,gBAAgB;EACzB;CACF,GACA;EACE;EACA,YAAY;GACV,IAAI,MAAM,WAAW,KAAA,GACnB,MAAM,eAAe,IAAI;QACpB,IAAI,gBAAgB;IACzB,eAAe,MAAM,KAAK;IAC1B,MAAM,eAAe,IAAI;GAC3B,OAAO,IAAI,sBAAsB;IAC/B,qBAAqB,MAAM,KAAK;IAChC,MAAM,eAAe,IAAI;GAC3B,OAAO;IACL,gBAAgB,IAAI;IACpB,MAAM,eAAe,IAAI;GAC3B;EACF;EACA;EACA,cAAc;GACZ,IAAI,OAAO,GAAG,MAAM;QACf,IAAI,MAAM,WAAW,KAAA,GACxB,MAAM,eAAe,IAAI;QACpB,IAAI,gBACT,eAAe,MAAM,OAAO;QACvB,IAAI,sBACT,qBAAqB,MAAM,OAAO;QAC7B;IACL,gBAAgB,IAAI;IACpB,MAAM,eAAe,IAAI;GAC3B;EACF;CACF,CACF;CAEA,MAAM,eAAe,kBAAsC;EACzD,SAAS,gBAAgB,KAAK;EAC9B,WAAW,YAAY,UAAU;EACjC,YAAY,MAAM,cAAc;EAChC,WAAW,MAAM,aAAa;CAChC,EAAE;CAEF,MAAM,cAAc,eAClB;EAQE,IAAI,WAAW;GACb,OAAO,MAAM;EACf;EACA,OAAO,MAAM;EACb,OAAO,MAAM;EACb,kBAAkB;CACpB,GACA,YACF;CAEA,MAAM,CAAC,cAAc,mBAAmB,aAAiC;CACzE,MAAM,gCAAgC;EAEpC,OADc,YAAY,MACf,CAAC,GAAG,sBAAsB;CACvC;CACA,MAAM,2BAA2B;EAC/B,MAAM,UAAU,cAAc;EAC9B,IAAI,CAAC,WAAW,wBAAwB,GAAG;EAC3C,gBAAgB,GAAG,QAAQ,sBAAsB,CAAC,CAAC,MAAM,GAAG;CAC9D;CACA,mBAAmB;EACjB,IAAI,CAAC,OAAO,GAAG;EACf,mBAAmB;EAEnB,MAAM,UAAU,cAAc;EAC9B,IAAI,CAAC,WAAW,wBAAwB,KAAK,OAAO,mBAAmB,aAAa;EAEpF,MAAM,WAAW,IAAI,eAAe,kBAAkB;EACtD,SAAS,QAAQ,OAAO;EACxB,gBAAgB,SAAS,WAAW,CAAC;CACvC,CAAC;CAED,MAAM,WAAW,iBACf,eAAe,MAAiC,EAAE,QAAQ,KAAK,CAAC,CAClE;CACA,MAAM,kBAAkB;EAEtB,OADgB,KAAiC,MAG9C,gBAAgB,cAAc,MAC9B,sBAAsB,cAAc;CAEzC;CAEA,MAAM,0BAA0B;EAC9B,MAAM,EACJ,OAAO,QACP,KAAK,MACL,GAAG,cACD,YAAY;EAChB,OAAO;CACT;CAEA,MAAM,oBAAuC;EAC3C,MAAM,YAAa,YAAY,aAAyC;EAGxE,MAAM,cAAe,YAAY,MAAM,KAAK,CAAC;EAC7C,OAAO;GACL,GAAG;GACH,GAAG;GACH,mBAAmB,YAAY,sBAAsB,aAAa;EACpE;CACF;CAEA,MAAM,uBAAuB,CAAC,MAAM,cAAc,gBAAgB,MAAM;CACxE,MAAM,2BAA2B;EAC/B,IAAI,CAAC,eAAe,GAClB,OAAO;EAGT,MAAM,UAAU,gBAAgB;EAChC,OAAO,YAAY,iBAAiB,YAAY;CAClD;CACA,MAAM,gBAAgB,wBAAwB;CAC9C,MAAM,wBAAwB;EAC5B,IAAI,aAAa,GACf,OAAO,sBAAsB,KAAK,cAAc,eAAe,KAAK,KAAA;EAEtE,OAAO,cAAc,eAAe,KAAK,KAAA;CAC3C;CAIA,mBAAmB;EACjB,IAAI,CAAC,OAAO,KAAK,CAAC,eAAe,GAAG;EACpC,KAAK,MAAM,aAAa,UAAU,OAAO;EACzC,IAAI,CAAC,WAAW,GAAG;EACnB,IAAI,gBAAgB,MAAM,kBAAkB;EAE5C,IAAI;EACJ,IAAI;EAEJ,MAAM,sBAAsB;GAC1B,IAAI,CAAC,OAAO,KAAK,CAAC,eAAe,GAAG;GACpC,MAAM,OAAO,WAAW;GACxB,IAAI,CAAC,QAAQ,gBAAgB,MAAM,kBAAkB;GACrD,IAAI,SAAS,kBAAkB,QAAQ,KAAK,SAAS,SAAS,aAAa,GACzE;GAEF,KAAK,MAAM;EACb;EAEA,MAAM,sBAAsB;GAC1B,UAAU,OAAO,WAAW,eAAe,CAAC;EAC9C;EAEA,IAAI,OAAO,OAAO,0BAA0B,YAC1C,QAAQ,OAAO,sBAAsB,aAAa;OAElD,cAAc;EAGhB,gBAAgB;GACd,IAAI,UAAU,KAAA,GACZ,OAAO,qBAAqB,KAAK;GAEnC,IAAI,YAAY,KAAA,GACd,OAAO,aAAa,OAAO;EAE/B,CAAC;CACH,CAAC;CAGD,mBAAmB;EACjB,IAAI,CAAC,OAAO,GAAG;EACf,IAAI,MAAM,2BAA2B;EAErC,MAAM,aAAa,UAAyB;GAC1C,IAAI,MAAM,QAAQ,UAAU;GAC5B,IAAI,MAAM,kBAAkB;GAC5B,MAAM;EACR;EAEA,SAAS,iBAAiB,WAAW,SAAS;EAC9C,gBAAgB,SAAS,oBAAoB,WAAW,SAAS,CAAC;CACpE,CAAC;CAED,MAAM,gBACJ,CAAC,eAAe,SACd,OAAO;EAAE,WAAW,YAAY;EAAW,kBAAkB,YAAY;CAAW,GACrF;MACC,CAAC,WAAW,SAAS,mBAAmB,GAAG,aAAa;QACtD,CAAC,QACK,SAAS,OACT,kBAAkB,GACtB,KAAK,eACL,IAAI,UAAU,GACd,MAAM,eAAe,IAAI,WAAW,KAAA,GACpC,UAAU,eAAe,IAAI,KAAK,KAAA,GAClC,OAAO,YAAY,MAAM,GACzB,OAAO,YAAY,GACnB,MAAM,OAAO,CAAC,CAAC,QACf,KAAK,OAAO,CAAC,CAAC,WACd,cAAc,gBAAgB,GAC9B,gBAAgB,YAAY,UAAU,GACtC,eAAe,SAAS,MAAM,UAAU,GACxC,cAAc,SAAS,MAAM,SAAS,GACvC;UACC,CAAC,KAAK,MAAM,CAAC,MAAM,YAAY;YAC7B,CAAC,qBAAqB,WAAW,SAAS;UAC5C,EAAE,KAAK;WACN,YAAY,eAAe,EAAE;UAC9B,CAAC,qBAAqB,WAAW,SAAS;QAC5C,EAAE,IAAI;MACR,EAAE,WAAW;IACf,EAAE,eAAe;CAGnB,MAAM,iBACJ,CAAC,IACC,2BACK,YAAY,eACjB,OAAO;EAAE,UAAU;EAAS,OAAO;CAAE;CAIzC,OACE,CAAC,KAAK,MAAM,WAAW,MAAM,OAAO,KAAK,MAAM,YAAY;MACzD,CAAC,OAAO,OAAO,gBAAgB,GAAG;QAChC,CAAC,KAAK,MAAM,CAAC,MAAM,cAAc,CAAC,aAAa,KAAK,OAAO,IAAI,SAAS,EAAE,EAAE,KAAK;QACjF,CAAC,KACC,MAAM,aAAa,GACnB,UACE,CAAC,IAAI,KAAK,aAAa,OAAO,EAAE,SAAS,WAAW,GAAG;cACrD,CAAC,oBAAoB,SAAS,aAAa,SAAS,GAAG;iBACpD,QAAQ,EAAE;cACb,EAAE,oBAAoB,SAAS;YACjC,EAAE,MAEL;WACE,QAAQ,EAAE;QACb,EAAE,KAAK;MACT,EAAE,OAAO;IACX,EAAE;AAEN;;;;AAgBA,SAAgB,aAAa,OAAuC;CAClE,MAAM,iBAAiB,WAAW,cAAc;CAChD,MAAM,kBAAkB,gBAAgB,UAAU,KAAK;CASvD,MAAM,oBAAuC;EAC3C,MAAM,mBAAmB,UAAU;EAMnC,MAAM,QAA2B;GAC/B,UAAU;GACV,WACE,qBAAqB,SAAS,qBAAqB,WAC/C,qBACA;EACR;EACA,IAAI,oBAAoB,MACtB,MAAkC,oBAAoB;EAGxD,MAAM,gBAAgB,gBAAgB,WAAW,EAAA,EAC7C;EACJ,IAAI,OAAO,cAAc,SAAS,UAChC,MAAM,OAAO,aAAa;EAE5B,IAAI,OAAO,cAAc,QAAQ,UAC/B,MAAM,MAAM,aAAa;EAG3B,MAAM,aACJ,MAAM,SACN,EAAE,OAAO,wBAAwB,eAAe,MAAM,iBAAiB,uBACnE,MAAM,QACN,KAAA;EAEN,OAAO;GACL,GAAG;GACH,GAAG;EACL;CACF;CAEA,OACE,CAAC,IAAI,OAAO,MAAM,OAAO,OAAO,YAAY,GAAG,gBAAgB,UAAU,GAAG;OACzE,MAAM,SAAS,MAAM,OAAO,IAAI,MAAM,SAAS;IAClD,EAAE;AAEN"}
1
+ {"version":3,"file":"Popover.jsx","names":[],"sources":["../src/Popover.tsx"],"sourcesContent":["/*\n * Copyright 2022 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n// Ported to SolidJS for Proyecto Viviana; based on packages/react-aria-components/src/Popover.tsx\n\n/**\n * Popover component for solidaria-components\n *\n * A headless popover component that positions relative to a trigger element.\n * Port of react-aria-components Popover.\n */\n\nimport {\n createContext,\n createEffect,\n createMemo,\n createSignal,\n createUniqueId,\n onCleanup,\n useContext,\n Show,\n createTrackedEffect,\n} from \"solid-js\";\nimport type { JSX } from \"@solidjs/web\";\nimport { Portal } from \"@solidjs/web\";\nimport {\n createOverlayTrigger,\n createPopover,\n createEnterAnimation,\n createExitAnimation,\n FocusScope,\n useIsHidden,\n useLocale,\n useUNSAFE_PortalContext,\n visuallyHiddenStyles,\n createStringFormatter,\n overlaysIntlStrings,\n FocusableContext,\n type AriaLabelingProps,\n type Placement,\n type PlacementAxis,\n} from \"@proyecto-viviana/solidaria\";\nimport { createOverlayTriggerState } from \"@proyecto-viviana/solid-stately\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n dataAttr,\n useIsHydrated,\n} from \"./utils\";\nimport {\n DialogTriggerContext,\n OverlayTriggerStateContext,\n PopoverTriggerContext,\n} from \"./contexts\";\nimport { SelectContext } from \"./Select\";\nimport { splitProps } from \"@proyecto-viviana/solidaria/utils\";\n\nexport interface PopoverRenderProps {\n /**\n * The name of the component that triggered the popover.\n */\n trigger: string | null;\n /**\n * The placement of the popover relative to the trigger.\n */\n placement: PlacementAxis | null;\n /**\n * Whether the popover is currently entering (for animations).\n */\n isEntering: boolean;\n /**\n * Whether the popover is currently exiting (for animations).\n */\n isExiting: boolean;\n}\n\nexport interface PopoverProps extends SlotProps, AriaLabelingProps {\n /** The children of the component - can be JSX or render function. */\n children?: RenderChildren<PopoverRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<PopoverRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<PopoverRenderProps>;\n /**\n * The name of the component that triggered the popover.\n */\n trigger?: string;\n /**\n * The ref for the element which the popover positions itself with respect to.\n * Required when used standalone (not within a trigger component).\n */\n triggerRef?: () => Element | null;\n /**\n * The placement of the element with respect to its anchor element.\n * @default 'bottom'\n */\n placement?: Placement;\n /**\n * The placement padding that should be applied between the element and its\n * surrounding container.\n * @default 12\n */\n containerPadding?: number;\n /**\n * The additional offset applied along the main axis between the element and its\n * anchor element.\n * @default 8\n */\n offset?: number;\n /**\n * The additional offset applied along the cross axis between the element and its\n * anchor element.\n * @default 0\n */\n crossOffset?: number;\n /**\n * Whether the element should flip its orientation when there is insufficient room.\n * @default true\n */\n shouldFlip?: boolean;\n /**\n * The max height of the popover.\n */\n maxHeight?: number;\n /**\n * A boundary element for placement calculations.\n */\n boundaryElement?: Element;\n /**\n * Overrides the target element's bounding rectangle. Useful for positioning relative to\n * a specific point such as the mouse cursor (e.g. context menus) or text selection.\n *\n * @default target.getBoundingClientRect()\n * @param target - The target element.\n */\n getTargetRect?: (target: Element) => DOMRect | null | undefined;\n /**\n * A ref for the popover arrow element.\n */\n arrowRef?: () => Element | null;\n /**\n * A ref for the scrollable popover element.\n */\n scrollRef?: () => Element | null;\n /**\n * Whether the popover is non-modal (allows interaction outside).\n */\n isNonModal?: boolean;\n /**\n * Whether pressing Escape to close should be disabled.\n */\n isKeyboardDismissDisabled?: boolean;\n /**\n * Filter for which outside interactions should close the popover.\n */\n shouldCloseOnInteractOutside?: (element: Element) => boolean;\n /** Whether the popover is open (controlled). */\n isOpen?: boolean;\n /** Whether the popover opens by default (uncontrolled). */\n defaultOpen?: boolean;\n /** Handler called when the popover's open state changes. */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Whether focus should move to the popover container on open.\n * @default true\n */\n autoFocus?: boolean;\n /** Whether the popover is entering (for animations). */\n isEntering?: boolean;\n /** Whether the popover is exiting (for animations). */\n isExiting?: boolean;\n /**\n * Whether the popover should appear and disappear without an entry or exit animation.\n * Used by PreviewTrigger to skip animations when quickly swapping between overlays.\n */\n shouldSkipAnimation?: boolean;\n}\n\nexport interface PopoverTriggerProps {\n /** The children - should include a trigger and popover content. */\n children: JSX.Element;\n /** Whether the popover is open (controlled). */\n isOpen?: boolean;\n /** Whether the popover is open by default (uncontrolled). */\n defaultOpen?: boolean;\n /** Callback when open state changes. */\n onOpenChange?: (isOpen: boolean) => void;\n}\n\nexport {\n PopoverTriggerContext,\n usePopoverTrigger,\n type PopoverTriggerContextValue,\n} from \"./contexts\";\n\ninterface PopoverContextValue {\n placement: () => PlacementAxis | null;\n arrowProps: () => JSX.HTMLAttributes<HTMLElement>;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue | null>(null);\nconst PopoverGroupContext = createContext<(() => HTMLElement | null) | null>(null);\n\n/**\n * RAC Overlay.tsx OverlayContext. Dialog's useOverlayFocusContain equivalent\n * sets contain so a nested Dialog still traps Tab when the Popover itself is\n * not the dialog (DatePicker / DateRangePicker CalendarPopover).\n */\nexport interface OverlayContextValue {\n setContain: (contain: boolean) => void;\n}\n\nexport const OverlayContext = createContext<OverlayContextValue | null>(null);\n\nfunction resolveTriggerElement(value: unknown): Element | null {\n if (value == null) return null;\n if (typeof value === \"function\") {\n return resolveTriggerElement((value as () => unknown)());\n }\n if (value instanceof Element) {\n return value;\n }\n return null;\n}\n\nfunction preferredPlacementAxis(placement: Placement | undefined): PlacementAxis {\n const axis = (placement ?? \"bottom\").split(\" \")[0];\n if (axis === \"top\" || axis === \"bottom\" || axis === \"left\" || axis === \"right\") {\n return axis;\n }\n return \"bottom\";\n}\n\nfunction PopoverDismissButton(props: { onDismiss: () => void }): JSX.Element {\n const stringFormatter = createStringFormatter(overlaysIntlStrings, \"@react-aria/overlays\");\n return (\n <button\n type=\"button\"\n aria-label={stringFormatter().format(\"dismiss\")}\n tabindex={-1}\n onClick={props.onDismiss}\n style={visuallyHiddenStyles}\n />\n );\n}\n\n/**\n * A PopoverTrigger opens a popover when a trigger element is pressed.\n * Children should include a trigger element (e.g. Button) and the Popover.\n */\nexport function PopoverTrigger(props: PopoverTriggerProps): JSX.Element {\n const [local] = splitProps(props, [\"isOpen\", \"defaultOpen\", \"onOpenChange\"]);\n\n const state = createOverlayTriggerState({\n get isOpen() {\n return local.isOpen;\n },\n get defaultOpen() {\n return local.defaultOpen;\n },\n onOpenChange: local.onOpenChange,\n });\n\n let triggerRef: HTMLElement | null = null;\n const triggerId = createUniqueId();\n\n const triggerAria = createOverlayTrigger({ type: \"dialog\" }, state, () => triggerRef);\n\n const contextValue = createMemo(() => ({\n state: {\n isOpen: () => state.isOpen(),\n open: () => state.open(),\n close: () => state.close(),\n toggle: () => state.toggle(),\n setOpen: (next: boolean) => state.setOpen(next),\n point: () => state.point(),\n setPoint: (next: { x: number; y: number }) => state.setPoint(next),\n },\n triggerRef: () => triggerRef,\n setTriggerRef: (el: HTMLElement | null) => {\n if (!el) return;\n if (!triggerRef || !triggerRef.isConnected) {\n triggerRef = el;\n }\n },\n triggerId,\n triggerProps: triggerAria.triggerProps,\n overlayProps: triggerAria.overlayProps,\n trigger: \"PopoverTrigger\",\n }));\n\n return <PopoverTriggerContext value={contextValue()}>{props.children}</PopoverTriggerContext>;\n}\n\n/**\n * A popover is an overlay element positioned relative to a trigger.\n */\nexport function Popover(props: PopoverProps): JSX.Element {\n // Note: do NOT early-return on the server. Returning `null` on the server and a\n // full <Show>/<Portal> tree on the client desyncs Solid's hydration walk (the\n // server emits no marker for the <Show>), which surfaces as \"Hydration Mismatch /\n // getNextElement\" in the parent (e.g. Picker). Instead, run the same structure on\n // both and gate the Portal on `useIsHydrated()` so the overlay only mounts on the\n // client after hydration — the server + first client render both produce an empty\n // <Show> marker, so hydration aligns.\n const [local, rest] = splitProps(props, [\n \"class\",\n \"style\",\n \"trigger\",\n \"triggerRef\",\n \"placement\",\n \"containerPadding\",\n \"offset\",\n \"crossOffset\",\n \"shouldFlip\",\n \"maxHeight\",\n \"boundaryElement\",\n \"getTargetRect\",\n \"arrowRef\",\n \"scrollRef\",\n \"isNonModal\",\n \"isKeyboardDismissDisabled\",\n \"shouldCloseOnInteractOutside\",\n \"isOpen\",\n \"defaultOpen\",\n \"onOpenChange\",\n \"autoFocus\",\n \"isEntering\",\n \"isExiting\",\n \"shouldSkipAnimation\",\n ]);\n\n // A reactive ref (not a plain `let`) so the overlay-position effect in\n // createOverlayPosition — which tracks `overlayRef()` as a dependency —\n // re-runs once the portal node actually mounts. React gets this timing for\n // free from useLayoutEffect (the ref is populated before the position effect\n // fires); in Solid the portal node is created lazily on open, AFTER the\n // position effect first ran with a null ref, so a non-reactive ref left the\n // popover stranded at the createOverlayPosition fallback (position:fixed;\n // top:0; left:0) whenever no other dependency happened to re-fire the effect\n // after mount. Mirrors the sibling groupRef signal below.\n const [popoverRef, setPopoverRef] = createSignal<HTMLDivElement | null>(null, {\n ownedWrite: true,\n });\n const [groupRef, setGroupRef] = createSignal<HTMLDivElement | null>(null, { ownedWrite: true });\n // False on the server and during hydration; true after onMount. Gates the Portal\n // so overlay content only ever renders client-side, post-hydration.\n const isHydrated = useIsHydrated();\n\n // Mirrors upstream S2 Popover (Popover.mjs: `el.lang = locale; el.dir =\n // direction`): the overlay portals out of the app root, so it must carry both\n // the locale `lang` AND writing `direction` — otherwise the portaled\n // listbox/dialog stays LTR and keeps the Latin font under an RTL Provider (the\n // `:lang(ar)` font swap needs a `lang` ancestor the portal would otherwise\n // escape). RAC's own Popover only threads `dir`; S2 adds `lang` on top.\n const locale = useLocale();\n\n const triggerContext = useContext(PopoverTriggerContext);\n const dialogTriggerContext = useContext(DialogTriggerContext);\n const overlayTriggerState = useContext(OverlayTriggerStateContext);\n const popoverGroupContext = useContext(PopoverGroupContext);\n const selectContext = useContext(SelectContext);\n const overlayLabelledBy = () =>\n props[\"aria-labelledby\"] ??\n (selectContext?.menuProps as { \"aria-labelledby\"?: string } | undefined)?.[\"aria-labelledby\"] ??\n (triggerContext?.overlayProps as { \"aria-labelledby\"?: string } | undefined)?.[\n \"aria-labelledby\"\n ];\n const resolvedTrigger = () =>\n local.trigger ??\n triggerContext?.trigger ??\n (dialogTriggerContext ? \"DialogTrigger\" : undefined);\n const isSubPopover = () => resolvedTrigger() === \"SubmenuTrigger\" && popoverGroupContext != null;\n\n const [internalOpen, setInternalOpen] = createSignal(local.defaultOpen ?? false);\n\n const isOpen = (): boolean => {\n if (local.isOpen !== undefined) return local.isOpen;\n if (triggerContext) {\n return triggerContext.state.isOpen();\n }\n if (dialogTriggerContext) {\n return dialogTriggerContext.state.isOpen();\n }\n if (overlayTriggerState) {\n return overlayTriggerState.isOpen;\n }\n return internalOpen();\n };\n\n const close = () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(false);\n } else if (triggerContext) {\n triggerContext.state.close();\n local.onOpenChange?.(false);\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.close();\n local.onOpenChange?.(false);\n } else if (overlayTriggerState) {\n overlayTriggerState.close();\n local.onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n local.onOpenChange?.(false);\n }\n };\n\n const getTriggerRef = () => {\n if (local.triggerRef !== undefined) {\n // Compiled JSX passes `() => element`. Comparison `hc` unwraps zero-arg\n // function props into getters, so `triggerRef` can already be the node\n // (`get triggerRef() { return el }`). Calling a node is a TypeError and\n // leaves the overlay at the origin frame (#275).\n return resolveTriggerElement(local.triggerRef);\n }\n if (triggerContext) return triggerContext.triggerRef();\n if (dialogTriggerContext) return dialogTriggerContext.triggerRef();\n return null;\n };\n\n const popoverAria = createPopover(\n {\n triggerRef: getTriggerRef,\n popoverRef: () => popoverRef(),\n groupRef: () => (isSubPopover() ? (popoverGroupContext?.() ?? null) : groupRef()),\n get placement() {\n return local.placement;\n },\n get containerPadding() {\n return local.containerPadding;\n },\n get offset() {\n return local.offset ?? 8;\n },\n get crossOffset() {\n return local.crossOffset;\n },\n get shouldFlip() {\n return local.shouldFlip;\n },\n get maxHeight() {\n return local.maxHeight;\n },\n get boundaryElement() {\n return local.boundaryElement;\n },\n get getTargetRect() {\n return local.getTargetRect;\n },\n get arrowRef() {\n return local.arrowRef;\n },\n get scrollRef() {\n return local.scrollRef;\n },\n get isNonModal() {\n return local.isNonModal ?? resolvedTrigger() === \"PreviewTrigger\";\n },\n get isKeyboardDismissDisabled() {\n return local.isKeyboardDismissDisabled;\n },\n get shouldCloseOnInteractOutside() {\n return local.shouldCloseOnInteractOutside;\n },\n get trigger() {\n return resolvedTrigger();\n },\n },\n {\n isOpen,\n open: () => {\n if (local.isOpen !== undefined) {\n local.onOpenChange?.(true);\n } else if (triggerContext) {\n triggerContext.state.open();\n local.onOpenChange?.(true);\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.open();\n local.onOpenChange?.(true);\n } else if (overlayTriggerState) {\n overlayTriggerState.open();\n local.onOpenChange?.(true);\n } else {\n setInternalOpen(true);\n local.onOpenChange?.(true);\n }\n },\n close,\n toggle: () => {\n if (isOpen()) close();\n else if (local.isOpen !== undefined) {\n local.onOpenChange?.(true);\n } else if (triggerContext) {\n triggerContext.state.toggle();\n } else if (dialogTriggerContext) {\n dialogTriggerContext.state.toggle();\n } else if (overlayTriggerState) {\n overlayTriggerState.toggle();\n } else {\n setInternalOpen(true);\n local.onOpenChange?.(true);\n }\n },\n point: () => triggerContext?.state.point?.() ?? dialogTriggerContext?.state.point?.() ?? null,\n },\n );\n\n // RAC: `useExitAnimation(ref, state.isOpen)` lives on the outer Popover so the\n // `'closed' | 'open' | 'exiting'` machine survives Inner unmount. Enter lives\n // on PopoverInner (below) so it re-initializes per open, matching\n // `useEnterAnimation(ref, !!placement)` in RAC's PopoverInner.\n const skipAnimation = () =>\n local.shouldSkipAnimation ?? triggerContext?.shouldSkipAnimation?.() ?? false;\n const exitAnimation = createExitAnimation(() => popoverRef(), isOpen);\n const isExiting = () => Boolean(local.isExiting) || (!skipAnimation() && exitAnimation());\n const isHidden = useIsHidden();\n\n const [triggerWidth, setTriggerWidth] = createSignal<string | undefined>();\n const hasExplicitTriggerWidth = () => {\n const style = typeof local.style === \"function\" ? undefined : local.style;\n return (\n (style as (JSX.CSSProperties & Record<string, unknown>) | undefined)?.[\"--trigger-width\"] !=\n null\n );\n };\n const updateTriggerWidth = () => {\n const trigger = getTriggerRef();\n if (!trigger || hasExplicitTriggerWidth()) return;\n // Layout width, not getBoundingClientRect: S2 `pressScale` applies\n // `perspective + translate3d(0,0,-2px)` while the trigger is pressed, which\n // shrinks the transformed rect (~5.84px on size-S/M Picker). RAC measures\n // in `useLayoutEffect` after pointer-up so the transform is already gone;\n // Solid's `createEffect` can run on the pressed frame, and ResizeObserver\n // does not fire for CSS transforms. `offsetWidth` is the box `--trigger-width`\n // is supposed to copy (RAC `Popover.tsx:309-331`).\n const width =\n trigger instanceof HTMLElement ? trigger.offsetWidth : trigger.getBoundingClientRect().width;\n setTriggerWidth(`${width}px`);\n };\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n if (!isOpen()) return;\n updateTriggerWidth();\n\n const trigger = getTriggerRef();\n if (!trigger || hasExplicitTriggerWidth() || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(updateTriggerWidth);\n observer.observe(trigger);\n _s2Cleanups.push(() => observer.disconnect());\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n const domProps = createMemo(() =>\n filterDOMProps(rest as Record<string, unknown>, { global: true }),\n );\n const overlayId = () => {\n const restId = (rest as Record<string, unknown>).id as string | undefined;\n return (\n restId ??\n (triggerContext?.overlayProps?.id as string | undefined) ??\n (dialogTriggerContext?.overlayProps?.id as string | undefined)\n );\n };\n\n const cleanPopoverProps = () => {\n const {\n style: _style,\n ref: _ref,\n ...remaining\n } = popoverAria.popoverProps as Record<string, unknown>;\n return remaining;\n };\n\n const shouldBeDialogBase = () =>\n !local.isNonModal ||\n resolvedTrigger() === \"SubmenuTrigger\" ||\n resolvedTrigger() === \"PreviewTrigger\";\n const [isDialog, setIsDialog] = createSignal(shouldBeDialogBase());\n const [overlayContain, setOverlayContain] = createSignal(false);\n createEffect(\n () => {\n const node = popoverRef();\n const dialogBase = shouldBeDialogBase();\n return { node, dialogBase };\n },\n ({ node, dialogBase }) => {\n if (!node) return;\n setIsDialog(dialogBase && node.querySelector(\"[role=dialog]\") == null);\n },\n );\n\n const shouldBeDialog = () => isDialog();\n const shouldContainFocus = () => {\n // RAC Popover.tsx:368 — `shouldContainFocus={isDialog && trigger !== 'PreviewTrigger'}`.\n // MenuTrigger must contain Tab; excluding it leaked focus to document.body\n // while the overlay stayed open (#267).\n if (!shouldBeDialog()) {\n return false;\n }\n return resolvedTrigger() !== \"PreviewTrigger\";\n };\n const portalContext = useUNSAFE_PortalContext();\n const portalContainer = () => {\n if (isSubPopover()) {\n return popoverGroupContext?.() ?? portalContext.getContainer?.() ?? undefined;\n }\n return portalContext.getContainer?.() ?? undefined;\n };\n\n // Caller `dir`/`lang` ride `filterDOMProps(..., { global: true })`. Overlay\n // locale wins when the caller omitted them (S2 callback-ref / Tooltip).\n const callerDir = (): \"ltr\" | \"rtl\" | \"auto\" | undefined => {\n const value = (rest as { dir?: string }).dir;\n if (value === \"ltr\" || value === \"rtl\" || value === \"auto\") {\n return value;\n }\n return undefined;\n };\n const callerLang = () => (rest as { lang?: string }).lang;\n const stampOverlayLocale = (el: HTMLDivElement | null) => {\n if (!el) {\n return;\n }\n const loc = locale();\n const dir = callerDir();\n const lang = callerLang();\n if (!dir) {\n el.dir = loc.direction;\n } else {\n el.dir = dir;\n }\n if (!lang) {\n el.lang = loc.locale;\n } else {\n el.lang = lang;\n }\n };\n // Spreads + portal attach can drop JSX `dir`/`lang`. Re-stamp after those\n // writes, matching S2's callback ref `[locale, direction]` deps.\n createEffect(\n () => {\n const el = popoverRef();\n void domProps();\n void cleanPopoverProps();\n void (triggerContext?.overlayProps ?? {});\n void locale();\n return el;\n },\n (el) => {\n if (!el) {\n return;\n }\n stampOverlayLocale(el);\n },\n );\n\n // Match React Aria Components: focus the popover container only when no\n // descendant has already moved focus during mount.\n createEffect(\n () => {\n const open = isOpen();\n const dialog = shouldBeDialog();\n const autoFocus = local.autoFocus ?? true;\n const node = popoverRef();\n const trigger = resolvedTrigger();\n return { open, dialog, autoFocus, node, trigger };\n },\n ({ open, dialog, autoFocus, node, trigger }) => {\n if (!open || !dialog) return;\n if (autoFocus === false) return;\n if (!node) return;\n if (trigger === \"SubmenuTrigger\") return;\n // RAC Overlay does not auto-focus a PreviewTrigger popover — focus stays\n // on the trigger so Tab can move into the preview (usePreviewTrigger\n // onKeyDown). Stealing focus here blurs the link and either closes the\n // preview or leaves Tab landing on the next page control.\n if (trigger === \"PreviewTrigger\") return;\n\n let timeout: number | undefined;\n let frame: number | undefined;\n\n const focusIfNeeded = () => {\n if (!isOpen() || !shouldBeDialog()) return;\n const current = popoverRef();\n if (!current || resolvedTrigger() === \"SubmenuTrigger\") return;\n if (resolvedTrigger() === \"PreviewTrigger\") return;\n // Nested Dialog (DatePicker) owns initial focus via createDialog —\n // RAC PopoverInner skips focusSafely when isDialog is false.\n if (current.querySelector(\"[role=dialog]\")) return;\n if (document.activeElement === current || current.contains(document.activeElement)) {\n return;\n }\n current.focus();\n };\n\n const scheduleFocus = () => {\n timeout = window.setTimeout(focusIfNeeded, 0);\n };\n\n if (typeof window.requestAnimationFrame === \"function\") {\n frame = window.requestAnimationFrame(scheduleFocus);\n } else {\n scheduleFocus();\n }\n\n return () => {\n if (frame !== undefined) {\n window.cancelAnimationFrame(frame);\n }\n if (timeout !== undefined) {\n window.clearTimeout(timeout);\n }\n };\n },\n );\n\n // Fallback Escape handling for environments where focus is not moved into the popover.\n createEffect(\n () => ({\n open: isOpen(),\n keyboardDismissDisabled: !!local.isKeyboardDismissDisabled,\n }),\n ({ open, keyboardDismissDisabled }) => {\n if (!open) return;\n if (keyboardDismissDisabled) return;\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\") return;\n if (event.defaultPrevented) return;\n close();\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n },\n );\n\n const isNonModal = () => local.isNonModal ?? resolvedTrigger() === \"PreviewTrigger\";\n\n // Enter animation is owned by this inner tree so it remounts on each full\n // open (RAC PopoverInner + useEnterAnimation). It stays mounted while\n // `isExiting` so a reopen-during-exit does not start a second enter.\n //\n // Local addition (documented deviation): RAC's `useEnterAnimation(ref,\n // !!placement)` reports `isEntering === false` while the popover is still\n // unplaced (`animation.ts:22`), relying on `useLayoutEffect` positioning so\n // that state never paints. Here the open-but-unplaced state is also reported\n // as entering, so if positioning ever lands after a paint the `top:0;left:0`\n // frame stays at the entering opacity instead of flashing at the origin.\n function PopoverInner(): JSX.Element {\n const enterAnimation = createEnterAnimation(\n () => popoverRef(),\n () => popoverAria.placement() != null,\n );\n const isEntering = () =>\n Boolean(local.isEntering) ||\n (!skipAnimation() && (enterAnimation() || (isOpen() && popoverAria.placement() == null)));\n\n const renderValues = createMemo<PopoverRenderProps>(() => {\n const preferred = preferredPlacementAxis(local.placement);\n const entering = isEntering();\n return {\n trigger: resolvedTrigger() ?? null,\n // RAC usePopover reports placement from useLayoutEffect before paint.\n // Until Solid's createEffect positioning lands, seed the preferred axis\n // so S2 `translateY: { placement: { bottom: { isEntering: -4 } } }` does\n // not miss the bottom branch. Once measured, the measured axis wins even\n // mid-enter, as RAC's does: a flipped popover enters from its flipped\n // side (DatePicker D2 flipped to `top`: both stacks `0px 4px`, #582).\n placement: popoverAria.placement() ?? preferred,\n isEntering: entering,\n isExiting: isExiting(),\n };\n });\n\n const renderProps = useRenderProps(\n {\n get children() {\n return props.children;\n },\n class: local.class,\n style: local.style,\n defaultClassName: \"solidaria-Popover\",\n },\n renderValues,\n );\n\n const mergedStyle = (): JSX.CSSProperties => {\n const ariaStyle = (popoverAria.popoverProps as Record<string, unknown>).style as\n | JSX.CSSProperties\n | undefined;\n const renderStyle = (renderProps.style() || {}) as JSX.CSSProperties &\n Record<string, unknown>;\n return {\n ...ariaStyle,\n ...renderStyle,\n \"--trigger-width\": renderStyle[\"--trigger-width\"] ?? triggerWidth(),\n };\n };\n\n return (\n <PopoverContext\n value={{ placement: popoverAria.placement, arrowProps: () => popoverAria.arrowProps }}\n >\n <OverlayContext value={{ setContain: setOverlayContain }}>\n <div\n {...domProps()}\n {...cleanPopoverProps()}\n {...(triggerContext?.overlayProps ?? {})}\n ref={(el) => {\n setPopoverRef(el);\n triggerContext?.setOverlayRef?.(el);\n stampOverlayLocale(el);\n }}\n id={overlayId()}\n role={shouldBeDialog() ? \"dialog\" : undefined}\n tabindex={shouldBeDialog() ? -1 : undefined}\n aria-labelledby={overlayLabelledBy()}\n class={renderProps.class()}\n style={mergedStyle()}\n lang={callerLang() ?? locale().locale}\n dir={callerDir() ?? locale().direction}\n data-trigger={resolvedTrigger()}\n data-placement={renderValues().placement}\n data-entering={dataAttr(isEntering())}\n data-exiting={dataAttr(isExiting())}\n >\n <Show when={!isNonModal()}>\n <PopoverDismissButton onDismiss={close} />\n </Show>\n {/* A render-prop child runs once over a getter view of the render\n values. RAC re-invokes it on every placement / isEntering /\n isExiting change and React reconciles onto the same DOM; Solid\n would recreate the subtree, discarding a Menu's tree state and\n DOM focus when the enter animation settles (Tabs has the same\n contract for press flips). */}\n {renderProps.renderChildrenStable()}\n <PopoverDismissButton onDismiss={close} />\n </div>\n </OverlayContext>\n </PopoverContext>\n );\n }\n\n const underlay = () => (\n <div\n data-testid=\"underlay\"\n {...(popoverAria.underlayProps as unknown as JSX.HTMLAttributes<HTMLDivElement>)}\n style={{ position: \"fixed\", inset: 0 }}\n />\n );\n\n const hiddenChildren = () => {\n const children = props.children;\n if (typeof children === \"function\") {\n return children({\n trigger: resolvedTrigger() ?? null,\n placement: \"bottom\",\n isEntering: false,\n isExiting: false,\n });\n }\n return children;\n };\n\n return (\n <Show when={!isHidden()} fallback={hiddenChildren()}>\n <Show when={isHydrated() && (isOpen() || isExiting())}>\n {/* Solid 2's Portal splices its children into the mount between two\n text markers, so there is no wrapper element to style — the same\n shape as RAC's `createPortal`. */}\n <Portal mount={portalContainer()}>\n <FocusableContext value={null}>\n {/* RAC Overlay.tsx:76-81 wraps portal children in FocusScope so the\n start/end sentinels sit beside the display:contents group, not\n as siblings of [data-placement]. ComboBox hide-outside would\n otherwise aria-hide those sentinels. */}\n <FocusScope\n contain={(shouldContainFocus() || overlayContain()) && !isExiting()}\n restoreFocus\n >\n <Show when={!isNonModal() && !isSubPopover() && isOpen()}>{underlay()}</Show>\n <Show\n when={isSubPopover()}\n fallback={\n <div ref={setGroupRef} style={{ display: \"contents\" }}>\n <PopoverGroupContext value={() => groupRef()}>\n <PopoverInner />\n </PopoverGroupContext>\n </div>\n }\n >\n <PopoverInner />\n </Show>\n </FocusScope>\n </FocusableContext>\n </Portal>\n </Show>\n </Show>\n );\n}\n\nexport interface OverlayArrowProps {\n /** The children - should be an SVG or element for the arrow. */\n children?: JSX.Element;\n /** Render function used when Solid children accessors would be ambiguous. */\n render?: () => JSX.Element;\n /** The CSS className. */\n class?: string;\n /** The inline style. */\n style?: JSX.CSSProperties;\n}\n\n/**\n * An arrow element that points towards the trigger.\n */\nexport function OverlayArrow(props: OverlayArrowProps): JSX.Element {\n const popoverContext = useContext(PopoverContext);\n const placement = () => popoverContext?.placement() ?? null;\n\n // Mirror react-aria-components' OverlayArrow: the wrapper positions itself\n // absolutely against the popover edge (`[placement]: '100%'`) and takes the\n // cross-axis offset (`left`/`top`) from the overlay's computed `arrowProps`.\n // No `aria-hidden`/`role=\"presentation\"` — upstream leaves the arrow in the\n // accessibility tree (the arrow SVG surfaces as an unlabeled `img`), matching\n // S2's `<OverlayArrow className=\"\">`. The styled layer therefore passes no\n // positioning class of its own.\n const mergedStyle = (): JSX.CSSProperties => {\n const currentPlacement = placement();\n // Mirror react-aria-components' OverlayArrow: the reported `arrowProps`\n // offset (`left`/`top`) points at the arrow's CENTER, so the wrapper must be\n // pulled back by half its size to center on that point — horizontally for\n // top/bottom placements, vertically for left/right. Omitting this shifts the\n // arrow off by half its width/height (a self-inflicted divergence).\n const style: JSX.CSSProperties = {\n position: \"absolute\",\n transform:\n currentPlacement === \"top\" || currentPlacement === \"bottom\"\n ? \"translateX(-50%)\"\n : \"translateY(-50%)\",\n };\n if (currentPlacement != null) {\n (style as Record<string, string>)[currentPlacement] = \"100%\";\n }\n\n const contextStyle = (popoverContext?.arrowProps() as Record<string, unknown> | undefined)\n ?.style as (JSX.CSSProperties & Record<string, unknown>) | undefined;\n if (typeof contextStyle?.left === \"string\") {\n style.left = contextStyle.left;\n }\n if (typeof contextStyle?.top === \"string\") {\n style.top = contextStyle.top;\n }\n\n const localStyle =\n props.style &&\n !(typeof CSSStyleDeclaration !== \"undefined\" && props.style instanceof CSSStyleDeclaration)\n ? props.style\n : undefined;\n\n return {\n ...style,\n ...localStyle,\n };\n };\n\n return (\n <div class={props.class} style={mergedStyle()} data-placement={placement()}>\n {props.render ? props.render() : props.children}\n </div>\n );\n}\n\nexport default Popover;\n"],"mappings":"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"}