@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.
- package/LICENSE-APACHE-2.0 +201 -0
- package/NOTICE +91 -0
- package/README.md +4 -7
- package/dist/ActionBar.d.ts +2 -10
- package/dist/ActionBar.d.ts.map +1 -1
- package/dist/ActionBar.js +95 -59
- package/dist/ActionBar.js.map +1 -1
- package/dist/ActionBar.jsx +42 -15
- package/dist/ActionBar.jsx.map +1 -1
- package/dist/ActionGroup.d.ts +1 -12
- package/dist/ActionGroup.d.ts.map +1 -1
- package/dist/ActionGroup.js +66 -44
- package/dist/ActionGroup.js.map +1 -1
- package/dist/ActionGroup.jsx +25 -10
- package/dist/ActionGroup.jsx.map +1 -1
- package/dist/Alert.d.ts +4 -1
- package/dist/Alert.d.ts.map +1 -1
- package/dist/Alert.js +25 -17
- package/dist/Alert.js.map +1 -1
- package/dist/Alert.jsx +9 -5
- package/dist/Alert.jsx.map +1 -1
- package/dist/Autocomplete.d.ts +2 -9
- package/dist/Autocomplete.d.ts.map +1 -1
- package/dist/Autocomplete.js +18 -5
- package/dist/Autocomplete.js.map +1 -1
- package/dist/Autocomplete.jsx +20 -7
- package/dist/Autocomplete.jsx.map +1 -1
- package/dist/Breadcrumbs.d.ts +2 -7
- package/dist/Breadcrumbs.d.ts.map +1 -1
- package/dist/Breadcrumbs.js +71 -51
- package/dist/Breadcrumbs.js.map +1 -1
- package/dist/Breadcrumbs.jsx +25 -12
- package/dist/Breadcrumbs.jsx.map +1 -1
- package/dist/Button.d.ts +1 -7
- package/dist/Button.d.ts.map +1 -1
- package/dist/Button.js +125 -72
- package/dist/Button.js.map +1 -1
- package/dist/Button.jsx +105 -43
- package/dist/Button.jsx.map +1 -1
- package/dist/Calendar.d.ts +1 -7
- package/dist/Calendar.d.ts.map +1 -1
- package/dist/Calendar.js +297 -221
- package/dist/Calendar.js.map +1 -1
- package/dist/Calendar.jsx +52 -32
- package/dist/Calendar.jsx.map +1 -1
- package/dist/CalendarPicker.d.ts +1 -10
- package/dist/CalendarPicker.d.ts.map +1 -1
- package/dist/CalendarPicker.js +12 -0
- package/dist/CalendarPicker.js.map +1 -1
- package/dist/CalendarPicker.jsx +12 -0
- package/dist/CalendarPicker.jsx.map +1 -1
- package/dist/Checkbox.d.ts +2 -7
- package/dist/Checkbox.d.ts.map +1 -1
- package/dist/Checkbox.js +332 -270
- package/dist/Checkbox.js.map +1 -1
- package/dist/Checkbox.jsx +70 -77
- package/dist/Checkbox.jsx.map +1 -1
- package/dist/Collection.d.ts +33 -7
- package/dist/Collection.d.ts.map +1 -1
- package/dist/Collection.js +128 -74
- package/dist/Collection.js.map +1 -1
- package/dist/Collection.jsx +46 -7
- package/dist/Collection.jsx.map +1 -1
- package/dist/Color.d.ts +15 -20
- package/dist/Color.d.ts.map +1 -1
- package/dist/Color.js +572 -334
- package/dist/Color.js.map +1 -1
- package/dist/Color.jsx +205 -85
- package/dist/Color.jsx.map +1 -1
- package/dist/ColorEditor.d.ts +3 -1
- package/dist/ColorEditor.d.ts.map +1 -1
- package/dist/ColorEditor.js +147 -124
- package/dist/ColorEditor.js.map +1 -1
- package/dist/ColorEditor.jsx +4 -1
- package/dist/ColorEditor.jsx.map +1 -1
- package/dist/ComboBox.d.ts +31 -10
- package/dist/ComboBox.d.ts.map +1 -1
- package/dist/ComboBox.js +539 -274
- package/dist/ComboBox.js.map +1 -1
- package/dist/ComboBox.jsx +213 -70
- package/dist/ComboBox.jsx.map +1 -1
- package/dist/ContextualHelpTrigger.d.ts +1 -7
- package/dist/ContextualHelpTrigger.d.ts.map +1 -1
- package/dist/ContextualHelpTrigger.js +102 -72
- package/dist/ContextualHelpTrigger.js.map +1 -1
- package/dist/ContextualHelpTrigger.jsx +36 -16
- package/dist/ContextualHelpTrigger.jsx.map +1 -1
- package/dist/DateField.d.ts +2 -7
- package/dist/DateField.d.ts.map +1 -1
- package/dist/DateField.js +0 -2
- package/dist/DateField.jsx +0 -2
- package/dist/DateField2.js +194 -179
- package/dist/DateField2.js.map +1 -1
- package/dist/DateField2.jsx +58 -55
- package/dist/DateField2.jsx.map +1 -1
- package/dist/DatePicker.d.ts +7 -7
- package/dist/DatePicker.d.ts.map +1 -1
- package/dist/DatePicker.js +2 -2
- package/dist/DatePicker.jsx +2 -2
- package/dist/DatePicker2.js +357 -435
- package/dist/DatePicker2.js.map +1 -1
- package/dist/DatePicker2.jsx +109 -178
- package/dist/DatePicker2.jsx.map +1 -1
- package/dist/DateRangePickerContext.d.ts +7 -0
- package/dist/DateRangePickerContext.d.ts.map +1 -1
- package/dist/Dialog.d.ts +4 -9
- package/dist/Dialog.d.ts.map +1 -1
- package/dist/Dialog.js +168 -101
- package/dist/Dialog.js.map +1 -1
- package/dist/Dialog.jsx +75 -27
- package/dist/Dialog.jsx.map +1 -1
- package/dist/Disclosure.d.ts +1 -9
- package/dist/Disclosure.d.ts.map +1 -1
- package/dist/Disclosure.js +121 -79
- package/dist/Disclosure.js.map +1 -1
- package/dist/Disclosure.jsx +32 -19
- package/dist/Disclosure.jsx.map +1 -1
- package/dist/DragAndDrop.d.ts +9 -6
- package/dist/DragAndDrop.d.ts.map +1 -1
- package/dist/DragAndDrop.js +37 -22
- package/dist/DragAndDrop.js.map +1 -1
- package/dist/DragAndDrop.jsx +20 -4
- package/dist/DragAndDrop.jsx.map +1 -1
- package/dist/DragPreview.d.ts +1 -1
- package/dist/DragPreview.d.ts.map +1 -1
- package/dist/DropZone.d.ts +1 -7
- package/dist/DropZone.d.ts.map +1 -1
- package/dist/DropZone.js +74 -40
- package/dist/DropZone.js.map +1 -1
- package/dist/DropZone.jsx +24 -8
- package/dist/DropZone.jsx.map +1 -1
- package/dist/ElementTag.d.ts +9 -20
- package/dist/ElementTag.d.ts.map +1 -1
- package/dist/ElementTag.js +8 -210
- package/dist/ElementTag.js.map +1 -1
- package/dist/ElementTag.jsx +8 -57
- package/dist/ElementTag.jsx.map +1 -1
- package/dist/FieldError.d.ts +8 -7
- package/dist/FieldError.d.ts.map +1 -1
- package/dist/FieldError.js +33 -13
- package/dist/FieldError.js.map +1 -1
- package/dist/FieldError.jsx +20 -5
- package/dist/FieldError.jsx.map +1 -1
- package/dist/FileTrigger.d.ts +1 -7
- package/dist/FileTrigger.d.ts.map +1 -1
- package/dist/FileTrigger.js +30 -12
- package/dist/FileTrigger.js.map +1 -1
- package/dist/FileTrigger.jsx +15 -2
- package/dist/FileTrigger.jsx.map +1 -1
- package/dist/Focusable.d.ts +2 -8
- package/dist/Focusable.d.ts.map +1 -1
- package/dist/Focusable.js +23 -6
- package/dist/Focusable.js.map +1 -1
- package/dist/Focusable.jsx +22 -5
- package/dist/Focusable.jsx.map +1 -1
- package/dist/Form.d.ts +9 -8
- package/dist/Form.d.ts.map +1 -1
- package/dist/Form.js +66 -43
- package/dist/Form.js.map +1 -1
- package/dist/Form.jsx +36 -16
- package/dist/Form.jsx.map +1 -1
- package/dist/GridList.d.ts +5 -10
- package/dist/GridList.d.ts.map +1 -1
- package/dist/GridList.js +372 -243
- package/dist/GridList.js.map +1 -1
- package/dist/GridList.jsx +177 -99
- package/dist/GridList.jsx.map +1 -1
- package/dist/HiddenDateInput.d.ts +1 -7
- package/dist/HiddenDateInput.d.ts.map +1 -1
- package/dist/Icon.d.ts +4 -1
- package/dist/Icon.d.ts.map +1 -1
- package/dist/Icon.js +41 -37
- package/dist/Icon.js.map +1 -1
- package/dist/Icon.jsx +7 -3
- package/dist/Icon.jsx.map +1 -1
- package/dist/Keyboard.d.ts +1 -7
- package/dist/Keyboard.d.ts.map +1 -1
- package/dist/Keyboard.js +24 -11
- package/dist/Keyboard.js.map +1 -1
- package/dist/Keyboard.jsx +15 -2
- package/dist/Keyboard.jsx.map +1 -1
- package/dist/Label.d.ts +20 -0
- package/dist/Label.d.ts.map +1 -0
- package/dist/Label.js +60 -0
- package/dist/Label.js.map +1 -0
- package/dist/Label.jsx +47 -0
- package/dist/Label.jsx.map +1 -0
- package/dist/Landmark.d.ts +4 -1
- package/dist/Landmark.d.ts.map +1 -1
- package/dist/Landmark.js +10 -4
- package/dist/Landmark.js.map +1 -1
- package/dist/Landmark.jsx +5 -1
- package/dist/Landmark.jsx.map +1 -1
- package/dist/Link.d.ts +2 -7
- package/dist/Link.d.ts.map +1 -1
- package/dist/Link.js +56 -36
- package/dist/Link.js.map +1 -1
- package/dist/Link.jsx +52 -10
- package/dist/Link.jsx.map +1 -1
- package/dist/ListBox.d.ts +17 -13
- package/dist/ListBox.d.ts.map +1 -1
- package/dist/ListBox.js +647 -348
- package/dist/ListBox.js.map +1 -1
- package/dist/ListBox.jsx +339 -236
- package/dist/ListBox.jsx.map +1 -1
- package/dist/ListDropTargetDelegate.d.ts +3 -0
- package/dist/ListDropTargetDelegate.d.ts.map +1 -1
- package/dist/Menu.d.ts +39 -30
- package/dist/Menu.d.ts.map +1 -1
- package/dist/Menu.js +547 -368
- package/dist/Menu.js.map +1 -1
- package/dist/Menu.jsx +328 -230
- package/dist/Menu.jsx.map +1 -1
- package/dist/Meter.d.ts +6 -13
- package/dist/Meter.d.ts.map +1 -1
- package/dist/Meter.js +55 -18
- package/dist/Meter.js.map +1 -1
- package/dist/Meter.jsx +33 -8
- package/dist/Meter.jsx.map +1 -1
- package/dist/Modal.d.ts +1 -7
- package/dist/Modal.d.ts.map +1 -1
- package/dist/Modal.js +104 -56
- package/dist/Modal.js.map +1 -1
- package/dist/Modal.jsx +68 -38
- package/dist/Modal.jsx.map +1 -1
- package/dist/NumberField.d.ts +4 -7
- package/dist/NumberField.d.ts.map +1 -1
- package/dist/NumberField.js +243 -124
- package/dist/NumberField.js.map +1 -1
- package/dist/NumberField.jsx +115 -26
- package/dist/NumberField.jsx.map +1 -1
- package/dist/Popover.d.ts +15 -7
- package/dist/Popover.d.ts.map +1 -1
- package/dist/Popover.js +370 -181
- package/dist/Popover.js.map +1 -1
- package/dist/Popover.jsx +215 -82
- package/dist/Popover.jsx.map +1 -1
- package/dist/Pressable.d.ts +2 -8
- package/dist/Pressable.d.ts.map +1 -1
- package/dist/Pressable.js +23 -6
- package/dist/Pressable.js.map +1 -1
- package/dist/Pressable.jsx +22 -5
- package/dist/Pressable.jsx.map +1 -1
- package/dist/PreviewTrigger.d.ts +24 -0
- package/dist/PreviewTrigger.d.ts.map +1 -0
- package/dist/PreviewTrigger.js +128 -0
- package/dist/PreviewTrigger.js.map +1 -0
- package/dist/PreviewTrigger.jsx +117 -0
- package/dist/PreviewTrigger.jsx.map +1 -0
- package/dist/ProgressBar.d.ts +1 -7
- package/dist/ProgressBar.d.ts.map +1 -1
- package/dist/ProgressBar.js +34 -14
- package/dist/ProgressBar.js.map +1 -1
- package/dist/ProgressBar.jsx +17 -3
- package/dist/ProgressBar.jsx.map +1 -1
- package/dist/RadioGroup.d.ts +2 -7
- package/dist/RadioGroup.d.ts.map +1 -1
- package/dist/RadioGroup.js +388 -269
- package/dist/RadioGroup.js.map +1 -1
- package/dist/RadioGroup.jsx +110 -99
- package/dist/RadioGroup.jsx.map +1 -1
- package/dist/RangeCalendar.d.ts +3 -7
- package/dist/RangeCalendar.d.ts.map +1 -1
- package/dist/RangeCalendar.js +271 -202
- package/dist/RangeCalendar.js.map +1 -1
- package/dist/RangeCalendar.jsx +56 -37
- package/dist/RangeCalendar.jsx.map +1 -1
- package/dist/RouterProvider.d.ts +3 -9
- package/dist/RouterProvider.d.ts.map +1 -1
- package/dist/RouterProvider.js +15 -14
- package/dist/RouterProvider.js.map +1 -1
- package/dist/RouterProvider.jsx +14 -13
- package/dist/RouterProvider.jsx.map +1 -1
- package/dist/SearchField.d.ts +4 -7
- package/dist/SearchField.d.ts.map +1 -1
- package/dist/SearchField.js +191 -164
- package/dist/SearchField.js.map +1 -1
- package/dist/SearchField.jsx +69 -62
- package/dist/SearchField.jsx.map +1 -1
- package/dist/Select.d.ts +5 -10
- package/dist/Select.d.ts.map +1 -1
- package/dist/Select.js +565 -359
- package/dist/Select.js.map +1 -1
- package/dist/Select.jsx +281 -161
- package/dist/Select.jsx.map +1 -1
- package/dist/SelectionIndicator.d.ts +1 -4
- package/dist/SelectionIndicator.d.ts.map +1 -1
- package/dist/SelectionIndicator.js +29 -13
- package/dist/SelectionIndicator.js.map +1 -1
- package/dist/SelectionIndicator.jsx +18 -4
- package/dist/SelectionIndicator.jsx.map +1 -1
- package/dist/Separator.d.ts +1 -7
- package/dist/Separator.d.ts.map +1 -1
- package/dist/Separator.js +22 -6
- package/dist/Separator.js.map +1 -1
- package/dist/Separator.jsx +16 -3
- package/dist/Separator.jsx.map +1 -1
- package/dist/SharedElementTransition.d.ts +1 -10
- package/dist/SharedElementTransition.d.ts.map +1 -1
- package/dist/SharedElementTransition.js +68 -40
- package/dist/SharedElementTransition.js.map +1 -1
- package/dist/SharedElementTransition.jsx +49 -25
- package/dist/SharedElementTransition.jsx.map +1 -1
- package/dist/Slider.d.ts +2 -8
- package/dist/Slider.d.ts.map +1 -1
- package/dist/Slider.js +155 -97
- package/dist/Slider.js.map +1 -1
- package/dist/Slider.jsx +25 -12
- package/dist/Slider.jsx.map +1 -1
- package/dist/StepList.d.ts +1 -7
- package/dist/StepList.d.ts.map +1 -1
- package/dist/StepList.js +112 -68
- package/dist/StepList.js.map +1 -1
- package/dist/StepList.jsx +58 -20
- package/dist/StepList.jsx.map +1 -1
- package/dist/Switch.d.ts +2 -9
- package/dist/Switch.d.ts.map +1 -1
- package/dist/Switch.js +164 -114
- package/dist/Switch.js.map +1 -1
- package/dist/Switch.jsx +26 -13
- package/dist/Switch.jsx.map +1 -1
- package/dist/Table.d.ts +2 -1
- package/dist/Table.d.ts.map +1 -1
- package/dist/Table.js +689 -592
- package/dist/Table.js.map +1 -1
- package/dist/Table.jsx +317 -237
- package/dist/Table.jsx.map +1 -1
- package/dist/Tabs.d.ts +2 -7
- package/dist/Tabs.d.ts.map +1 -1
- package/dist/Tabs.js +278 -293
- package/dist/Tabs.js.map +1 -1
- package/dist/Tabs.jsx +68 -66
- package/dist/Tabs.jsx.map +1 -1
- package/dist/TagGroup.d.ts +4 -11
- package/dist/TagGroup.d.ts.map +1 -1
- package/dist/TagGroup.js +153 -115
- package/dist/TagGroup.js.map +1 -1
- package/dist/TagGroup.jsx +37 -24
- package/dist/TagGroup.jsx.map +1 -1
- package/dist/Text.d.ts +3 -3
- package/dist/Text.d.ts.map +1 -1
- package/dist/Text.js +24 -7
- package/dist/Text.js.map +1 -1
- package/dist/Text.jsx +17 -5
- package/dist/Text.jsx.map +1 -1
- package/dist/TextField.d.ts +3 -16
- package/dist/TextField.d.ts.map +1 -1
- package/dist/TextField.js +104 -129
- package/dist/TextField.js.map +1 -1
- package/dist/TextField.jsx +76 -102
- package/dist/TextField.jsx.map +1 -1
- package/dist/TimeField.d.ts +2 -15
- package/dist/TimeField.d.ts.map +1 -1
- package/dist/TimeField.js +86 -102
- package/dist/TimeField.js.map +1 -1
- package/dist/TimeField.jsx +32 -49
- package/dist/TimeField.jsx.map +1 -1
- package/dist/Toast.d.ts +10 -13
- package/dist/Toast.d.ts.map +1 -1
- package/dist/Toast.js +209 -108
- package/dist/Toast.js.map +1 -1
- package/dist/Toast.jsx +127 -22
- package/dist/Toast.jsx.map +1 -1
- package/dist/ToggleButton.d.ts +1 -7
- package/dist/ToggleButton.d.ts.map +1 -1
- package/dist/ToggleButton.js +57 -35
- package/dist/ToggleButton.js.map +1 -1
- package/dist/ToggleButton.jsx +26 -12
- package/dist/ToggleButton.jsx.map +1 -1
- package/dist/ToggleButtonGroup.d.ts +1 -7
- package/dist/ToggleButtonGroup.d.ts.map +1 -1
- package/dist/ToggleButtonGroup.js +59 -44
- package/dist/ToggleButtonGroup.js.map +1 -1
- package/dist/ToggleButtonGroup.jsx +25 -12
- package/dist/ToggleButtonGroup.jsx.map +1 -1
- package/dist/TokenField.d.ts +52 -0
- package/dist/TokenField.d.ts.map +1 -0
- package/dist/TokenField.js +301 -0
- package/dist/TokenField.js.map +1 -0
- package/dist/TokenField.jsx +197 -0
- package/dist/TokenField.jsx.map +1 -0
- package/dist/Toolbar.d.ts +2 -7
- package/dist/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar.js +35 -16
- package/dist/Toolbar.js.map +1 -1
- package/dist/Toolbar.jsx +15 -2
- package/dist/Toolbar.jsx.map +1 -1
- package/dist/Tooltip.d.ts +2 -7
- package/dist/Tooltip.d.ts.map +1 -1
- package/dist/Tooltip.js +105 -68
- package/dist/Tooltip.js.map +1 -1
- package/dist/Tooltip.jsx +60 -36
- package/dist/Tooltip.jsx.map +1 -1
- package/dist/Tree.d.ts +8 -11
- package/dist/Tree.d.ts.map +1 -1
- package/dist/Tree.js +486 -339
- package/dist/Tree.js.map +1 -1
- package/dist/Tree.jsx +155 -107
- package/dist/Tree.jsx.map +1 -1
- package/dist/Virtualizer.d.ts +39 -9
- package/dist/Virtualizer.d.ts.map +1 -1
- package/dist/Virtualizer.js +2 -2
- package/dist/Virtualizer.jsx +2 -2
- package/dist/Virtualizer2.js +491 -136
- package/dist/Virtualizer2.js.map +1 -1
- package/dist/Virtualizer2.jsx +455 -122
- package/dist/Virtualizer2.jsx.map +1 -1
- package/dist/VirtualizerLayouts.d.ts +55 -2
- package/dist/VirtualizerLayouts.d.ts.map +1 -1
- package/dist/VisuallyHidden.d.ts +4 -3
- package/dist/VisuallyHidden.d.ts.map +1 -1
- package/dist/VisuallyHidden.js +18 -11
- package/dist/VisuallyHidden.js.map +1 -1
- package/dist/VisuallyHidden.jsx +15 -9
- package/dist/VisuallyHidden.jsx.map +1 -1
- package/dist/contexts.d.ts +25 -0
- package/dist/contexts.d.ts.map +1 -1
- package/dist/contexts.js +3 -0
- package/dist/contexts.js.map +1 -1
- package/dist/contexts.jsx +3 -0
- package/dist/contexts.jsx.map +1 -1
- package/dist/index.d.ts +11 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -11
- package/dist/index.jsx +14 -11
- package/dist/intl/index.d.ts +16 -0
- package/dist/intl/index.d.ts.map +1 -0
- package/dist/intl.js +212 -0
- package/dist/intl.js.map +1 -0
- package/dist/intl.jsx +212 -0
- package/dist/intl.jsx.map +1 -0
- package/dist/useDragAndDrop.d.ts +4 -2
- package/dist/useDragAndDrop.d.ts.map +1 -1
- package/dist/useDragAndDrop2.js +39 -21
- package/dist/useDragAndDrop2.js.map +1 -1
- package/dist/useDragAndDrop2.jsx +39 -21
- package/dist/useDragAndDrop2.jsx.map +1 -1
- package/dist/utils.d.ts +28 -9
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +96 -24
- package/dist/utils.js.map +1 -1
- package/dist/utils.jsx +81 -24
- package/dist/utils.jsx.map +1 -1
- package/dist/virtualizer/Layout.d.ts +9 -0
- package/dist/virtualizer/Layout.d.ts.map +1 -1
- package/dist/virtualizer/Layout.js +23 -2
- package/dist/virtualizer/Layout.js.map +1 -1
- package/dist/virtualizer/Layout.jsx +23 -2
- package/dist/virtualizer/Layout.jsx.map +1 -1
- package/package.json +29 -10
- package/src/ActionBar.tsx +50 -24
- package/src/ActionGroup.tsx +31 -19
- package/src/Alert.tsx +10 -4
- package/src/Autocomplete.tsx +24 -15
- package/src/Breadcrumbs.tsx +32 -16
- package/src/Button.tsx +182 -67
- package/src/Calendar.tsx +65 -47
- package/src/CalendarPicker.tsx +16 -1
- package/src/Checkbox.tsx +84 -116
- package/src/Collection.tsx +84 -3
- package/src/Color.tsx +282 -104
- package/src/ColorEditor.tsx +5 -1
- package/src/ComboBox.tsx +384 -109
- package/src/ContextualHelpTrigger.tsx +47 -41
- package/src/DateField.tsx +74 -106
- package/src/DatePicker.tsx +156 -352
- package/src/DateRangePickerContext.tsx +8 -0
- package/src/Dialog.tsx +105 -38
- package/src/Disclosure.tsx +29 -19
- package/src/DragAndDrop.tsx +43 -8
- package/src/DragPreview.tsx +20 -1
- package/src/DropZone.tsx +32 -18
- package/src/ElementTag.tsx +14 -104
- package/src/FieldError.tsx +39 -7
- package/src/FileTrigger.tsx +18 -3
- package/src/Focusable.tsx +27 -6
- package/src/Form.tsx +57 -11
- package/src/GridList.tsx +233 -141
- package/src/HiddenDateInput.tsx +19 -3
- package/src/Icon.tsx +8 -2
- package/src/Keyboard.tsx +18 -2
- package/src/Label.tsx +77 -0
- package/src/Landmark.tsx +6 -1
- package/src/Link.tsx +65 -19
- package/src/ListBox.tsx +645 -468
- package/src/ListDropTargetDelegate.ts +4 -0
- package/src/Menu.tsx +512 -349
- package/src/Meter.tsx +42 -8
- package/src/Modal.tsx +85 -42
- package/src/NumberField.tsx +161 -48
- package/src/Popover.tsx +424 -148
- package/src/Pressable.tsx +27 -6
- package/src/PreviewTrigger.tsx +171 -0
- package/src/ProgressBar.tsx +25 -3
- package/src/RadioGroup.tsx +230 -161
- package/src/RangeCalendar.tsx +75 -63
- package/src/RouterProvider.tsx +24 -14
- package/src/SearchField.tsx +118 -121
- package/src/Select.tsx +454 -274
- package/src/SelectionIndicator.tsx +21 -3
- package/src/Separator.tsx +17 -1
- package/src/SharedElementTransition.tsx +115 -97
- package/src/Slider.tsx +35 -17
- package/src/StepList.tsx +71 -32
- package/src/Switch.tsx +45 -29
- package/src/Table.tsx +446 -380
- package/src/Tabs.tsx +132 -155
- package/src/TagGroup.tsx +53 -40
- package/src/Text.tsx +23 -6
- package/src/TextField.tsx +118 -159
- package/src/TimeField.tsx +34 -95
- package/src/Toast.tsx +141 -67
- package/src/ToggleButton.tsx +33 -15
- package/src/ToggleButtonGroup.tsx +27 -9
- package/src/TokenField.tsx +379 -0
- package/src/Toolbar.tsx +19 -9
- package/src/Tooltip.tsx +126 -84
- package/src/Tree.tsx +233 -173
- package/src/Virtualizer.tsx +400 -138
- package/src/VirtualizerLayouts.ts +211 -26
- package/src/VisuallyHidden.tsx +22 -8
- package/src/contexts.ts +13 -0
- package/src/index.ts +32 -11
- package/src/intl/ar-AE.json +6 -0
- package/src/intl/bg-BG.json +6 -0
- package/src/intl/cs-CZ.json +6 -0
- package/src/intl/da-DK.json +6 -0
- package/src/intl/de-DE.json +6 -0
- package/src/intl/el-GR.json +6 -0
- package/src/intl/en-US.json +6 -0
- package/src/intl/es-ES.json +6 -0
- package/src/intl/et-EE.json +6 -0
- package/src/intl/fi-FI.json +6 -0
- package/src/intl/fr-FR.json +6 -0
- package/src/intl/he-IL.json +6 -0
- package/src/intl/hr-HR.json +6 -0
- package/src/intl/hu-HU.json +6 -0
- package/src/intl/index.ts +125 -0
- package/src/intl/it-IT.json +6 -0
- package/src/intl/ja-JP.json +6 -0
- package/src/intl/ko-KR.json +6 -0
- package/src/intl/lt-LT.json +6 -0
- package/src/intl/lv-LV.json +6 -0
- package/src/intl/nb-NO.json +6 -0
- package/src/intl/nl-NL.json +6 -0
- package/src/intl/pl-PL.json +6 -0
- package/src/intl/pt-BR.json +6 -0
- package/src/intl/pt-PT.json +6 -0
- package/src/intl/ro-RO.json +6 -0
- package/src/intl/ru-RU.json +6 -0
- package/src/intl/sk-SK.json +6 -0
- package/src/intl/sl-SI.json +6 -0
- package/src/intl/sr-SP.json +6 -0
- package/src/intl/sv-SE.json +6 -0
- package/src/intl/tr-TR.json +6 -0
- package/src/intl/uk-UA.json +6 -0
- package/src/intl/zh-CN.json +6 -0
- package/src/intl/zh-TW.json +6 -0
- package/src/useDragAndDrop.ts +30 -32
- package/src/utils.tsx +124 -68
- 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 {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
|
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
|
-
|
|
251
|
+
const width = trigger instanceof HTMLElement ? trigger.offsetWidth : trigger.getBoundingClientRect().width;
|
|
252
|
+
setTriggerWidth(`${width}px`);
|
|
221
253
|
};
|
|
222
|
-
|
|
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
|
-
|
|
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
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
244
|
-
|
|
245
|
-
"--trigger-width": renderStyle["--trigger-width"] ?? triggerWidth()
|
|
280
|
+
node: popoverRef(),
|
|
281
|
+
dialogBase: shouldBeDialogBase()
|
|
246
282
|
};
|
|
247
|
-
}
|
|
248
|
-
|
|
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
|
-
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
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
|
|
269
|
-
if (!
|
|
270
|
-
if (
|
|
271
|
-
|
|
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
|
-
|
|
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
|
-
|
|
285
|
-
|
|
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
|
-
|
|
370
|
+
return () => document.removeEventListener("keydown", onKeyDown);
|
|
293
371
|
});
|
|
294
|
-
const
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
</
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
package/dist/Popover.jsx.map
CHANGED
|
@@ -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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"}
|