@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/Tooltip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.js","names":["JSX","ParentComponent","createContext","useContext","createMemo","createSignal","createEffect","onCleanup","Show","isServer","createTooltipTriggerState","TooltipTriggerState","TooltipTriggerProps","StateProps","createTooltip","createTooltipTrigger","AriaProps","OverlayContainer","RenderChildren","ClassNameOrFunction","StyleOrFunction","SlotProps","useRenderProps","filterDOMProps","TooltipRenderProps","isEntering","isExiting","placement","TooltipResolvedPlacement","TooltipPlacement","TooltipTriggerComponentProps","children","Element","containerPadding","crossOffset","shouldFlip","TooltipProps","id","class","style","isOpen","defaultOpen","offset","arrowSize","arrowBoundaryOffset","isDisabled","lang","dir","TooltipTriggerContextValue","state","tooltipProps","setTooltipId","triggerRef","HTMLElement","TooltipTriggerContext","TooltipContext","TooltipTriggerStateContext","TooltipTrigger","props","tooltipId","delay","closeDelay","onOpenChange","triggerProps","trigger","shouldCloseOnPress","context","processChildren","Array","isArray","rest","_$createComponent","TriggerWrapper","ref","el","Provider","value","HTMLAttributes","child","triggerElement","setTriggerElement","wrapperElement","setWrapperElement","HTMLSpanElement","getWrapperEventProps","Record","wrapperProps","eventPropNames","propName","handler","onPointerEnter","onMouseEnter","onPointerLeave","onMouseLeave","element","describedBy","setAttribute","removeAttribute","wrapper","targets","from","Set","filter","Boolean","listeners","EventListener","eventProps","const","eventName","listener","target","addEventListener","push","removeEventListener","getAttribute","handleRef","span","findElementChild","found","findVisibleChild","rect","getBoundingClientRect","width","height","resolveRef","elementChild","visibleChild","immediateChild","requestAnimationFrame","_el$","_$getNextElement","_tmpl$","_$use","_$spread","_$mergeProps","display","_$insert","_$runHydrationEvents","Tooltip","undefined","localState","exitState","setExitState","open","current","tooltipEl","setTooltipEl","HTMLDivElement","animations","getAnimations","length","canceled","Promise","all","map","a","finished","then","s","catch","shouldRender","when","TooltipContent","contextTooltipProps","onTooltipRef","tooltipRef","ariaTooltipProps","positionStyles","setPositionStyles","top","left","visibility","renderedPlacement","setRenderedPlacement","resolvePlacement","setIsEntering","anim","CSSTransition","cancel","values","renderProps","defaultClassName","updatePosition","triggerEl","triggerRect","tooltipWidth","offsetWidth","tooltipHeight","offsetHeight","viewportWidth","window","innerWidth","viewportHeight","innerHeight","maybeFlipPlacement","bottom","right","clamp","Math","floor","scrollY","scrollX","retryCount","maxRetries","pendingRaf","pendingTimeout","tryUpdatePosition","success","setTimeout","closeOnScroll","event","Event","Node","contains","HTMLInputElement","HTMLTextAreaElement","close","cancelAnimationFrame","clearTimeout","domProps","global","_ariaRef","cleanAriaProps","setRef","getDocumentDirection","documentLang","document","documentElement","navigatorLang","navigator","language","includes","_el$2","_tmpl$2","position","data-placement","data-entering","data-exiting","renderChildren","DOMRect","min","max"],"sources":["../src/Tooltip.tsx"],"sourcesContent":["/**\n * Tooltip component for solidaria-components\n *\n * A tooltip displays a description of an element on hover or focus.\n * Port of react-aria-components/src/Tooltip.tsx\n */\n\nimport {\n type JSX,\n type ParentComponent,\n createContext,\n useContext,\n createMemo,\n createSignal,\n createEffect,\n onCleanup,\n Show,\n} from \"solid-js\";\nimport { isServer } from \"solid-js/web\";\nimport {\n createTooltipTriggerState,\n type TooltipTriggerState,\n type TooltipTriggerProps as StateProps,\n} from \"@proyecto-viviana/solid-stately\";\nimport {\n createTooltip,\n createTooltipTrigger,\n type TooltipTriggerProps as AriaProps,\n OverlayContainer,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n} from \"./utils\";\n\nexport interface TooltipRenderProps {\n /** Whether the tooltip is currently entering (for animations). */\n isEntering: boolean;\n /** Whether the tooltip is currently exiting (for animations). */\n isExiting: boolean;\n /** The placement of the tooltip relative to the trigger. */\n placement: TooltipResolvedPlacement | null;\n}\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\" | \"start\" | \"end\";\nexport type TooltipResolvedPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipTriggerComponentProps extends StateProps, AriaProps {\n /** The children of the tooltip trigger (trigger element and tooltip). */\n children: JSX.Element;\n /** The placement of the tooltip relative to the trigger. */\n placement?: TooltipPlacement;\n /** The placement padding between the tooltip and viewport edge. */\n containerPadding?: number;\n /** The additional offset along the cross axis. */\n crossOffset?: number;\n /** Whether the tooltip should flip when there is insufficient room. */\n shouldFlip?: boolean;\n}\n\nexport interface TooltipProps extends SlotProps {\n /** The element id. */\n id?: string;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n /** ID of an element that provides details for the tooltip. */\n \"aria-details\"?: string;\n /** The children of the tooltip. A function may be provided to receive render props. */\n children?: RenderChildren<TooltipRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<TooltipRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<TooltipRenderProps>;\n /** Whether the tooltip is open (controlled). */\n isOpen?: boolean;\n /** Whether the tooltip is open by default (uncontrolled). */\n defaultOpen?: boolean;\n /** The placement of the tooltip relative to the trigger. */\n placement?: TooltipPlacement;\n /** The placement padding between the tooltip and viewport edge. */\n containerPadding?: number;\n /** The additional offset along the cross axis. */\n crossOffset?: number;\n /** Whether the tooltip should flip when there is insufficient room. */\n shouldFlip?: boolean;\n /** The offset between the tooltip and trigger. */\n offset?: number;\n /** The arrow size used to keep the arrow overlapping the trigger. */\n arrowSize?: number;\n /** The padding between the arrow and tooltip edge. */\n arrowBoundaryOffset?: number;\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /** The element language. */\n lang?: string;\n /** The text direction. */\n dir?: \"ltr\" | \"rtl\";\n}\n\ninterface TooltipTriggerContextValue {\n state: TooltipTriggerState;\n tooltipProps: { readonly id: string };\n setTooltipId: (id: string | undefined) => void;\n triggerRef: () => HTMLElement | null | undefined;\n placement: () => TooltipPlacement | undefined;\n containerPadding: () => number | undefined;\n crossOffset: () => number | undefined;\n shouldFlip: () => boolean | undefined;\n isDisabled: () => boolean | undefined;\n}\n\nconst TooltipTriggerContext = createContext<TooltipTriggerContextValue | null>(null);\nexport const TooltipContext = TooltipTriggerContext;\nexport const TooltipTriggerStateContext = createContext<TooltipTriggerState | null>(null);\n\n/**\n * TooltipTrigger wraps around a trigger element and a Tooltip.\n * It handles opening and closing the Tooltip when the user hovers\n * over or focuses the trigger.\n *\n * @example\n * ```tsx\n * <TooltipTrigger>\n * <Button>Hover me</Button>\n * <Tooltip>This is a tooltip</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const TooltipTrigger: ParentComponent<TooltipTriggerComponentProps> = (props) => {\n let triggerRef: HTMLElement | null = null;\n const [tooltipId, setTooltipId] = createSignal<string | undefined>();\n\n const state = createTooltipTriggerState({\n get delay() {\n return props.delay;\n },\n get closeDelay() {\n return props.closeDelay;\n },\n get isOpen() {\n return props.isOpen;\n },\n get defaultOpen() {\n return props.defaultOpen;\n },\n get onOpenChange() {\n return props.onOpenChange;\n },\n });\n\n const { triggerProps, tooltipProps } = createTooltipTrigger(\n {\n get isDisabled() {\n return props.isDisabled;\n },\n get trigger() {\n return props.trigger;\n },\n get shouldCloseOnPress() {\n return props.shouldCloseOnPress;\n },\n get tooltipId() {\n return tooltipId();\n },\n },\n state,\n () => triggerRef,\n );\n\n const context: TooltipTriggerContextValue = {\n state,\n tooltipProps,\n setTooltipId,\n triggerRef: () => triggerRef,\n placement: () => props.placement,\n containerPadding: () => props.containerPadding,\n crossOffset: () => props.crossOffset,\n shouldFlip: () => props.shouldFlip,\n isDisabled: () => props.isDisabled,\n };\n\n const processChildren = () => {\n const children = props.children;\n if (Array.isArray(children)) {\n const [trigger, ...rest] = children;\n return (\n <>\n <TriggerWrapper\n triggerProps={triggerProps}\n ref={(el) => {\n triggerRef = el;\n }}\n >\n {trigger}\n </TriggerWrapper>\n {rest}\n </>\n );\n }\n return children;\n };\n\n return (\n <TooltipTriggerStateContext.Provider value={state}>\n <TooltipTriggerContext.Provider value={context}>\n {processChildren()}\n </TooltipTriggerContext.Provider>\n </TooltipTriggerStateContext.Provider>\n );\n};\n\n/**\n * Wrapper component that spreads trigger props onto its child\n */\nconst TriggerWrapper: ParentComponent<{\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n ref: (el: HTMLElement) => void;\n}> = (props) => {\n const child = () => props.children as JSX.Element;\n const [triggerElement, setTriggerElement] = createSignal<HTMLElement | null>(null);\n const [wrapperElement, setWrapperElement] = createSignal<HTMLSpanElement | null>(null);\n const getWrapperEventProps = () => {\n const triggerProps = props.triggerProps as Record<string, unknown>;\n const wrapperProps: Record<string, unknown> = {};\n const eventPropNames = [\n \"onFocus\",\n \"onBlur\",\n \"onPointerEnter\",\n \"onPointerLeave\",\n \"onPointerOver\",\n \"onPointerOut\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n \"onTouchStart\",\n \"onPointerDown\",\n \"onKeyDown\",\n ];\n\n for (const propName of eventPropNames) {\n const handler = triggerProps[propName];\n if (typeof handler === \"function\") {\n wrapperProps[propName] = handler;\n }\n }\n\n if (!wrapperProps.onPointerEnter && typeof triggerProps.onMouseEnter === \"function\") {\n wrapperProps.onPointerEnter = triggerProps.onMouseEnter;\n }\n if (!wrapperProps.onPointerLeave && typeof triggerProps.onMouseLeave === \"function\") {\n wrapperProps.onPointerLeave = triggerProps.onMouseLeave;\n }\n\n return wrapperProps as JSX.HTMLAttributes<HTMLSpanElement>;\n };\n\n createEffect(() => {\n const element = triggerElement();\n if (!element) {\n return;\n }\n\n const triggerProps = props.triggerProps as Record<string, unknown>;\n const describedBy = triggerProps[\"aria-describedby\"] as string | undefined;\n if (describedBy) {\n element.setAttribute(\"aria-describedby\", describedBy);\n } else {\n element.removeAttribute(\"aria-describedby\");\n }\n\n const wrapper = wrapperElement();\n const targets = Array.from(new Set([element, wrapper].filter(Boolean))) as HTMLElement[];\n const listeners: Array<[HTMLElement, string, EventListener]> = [];\n const eventProps = [\n [\"onFocus\", \"focus\"],\n [\"onBlur\", \"blur\"],\n [\"onPointerEnter\", \"pointerenter\"],\n [\"onPointerLeave\", \"pointerleave\"],\n [\"onPointerOver\", \"pointerover\"],\n [\"onPointerOut\", \"pointerout\"],\n [\"onMouseEnter\", \"mouseenter\"],\n [\"onMouseLeave\", \"mouseleave\"],\n [\"onTouchStart\", \"touchstart\"],\n [\"onPointerDown\", \"pointerdown\"],\n [\"onKeyDown\", \"keydown\"],\n ] as const;\n\n for (const [propName, eventName] of eventProps) {\n let handler = triggerProps[propName];\n if (!handler && propName === \"onPointerEnter\") {\n handler = triggerProps.onMouseEnter;\n } else if (!handler && propName === \"onPointerLeave\") {\n handler = triggerProps.onMouseLeave;\n }\n if (typeof handler === \"function\") {\n const listener = handler as EventListener;\n for (const target of targets) {\n target.addEventListener(eventName, listener);\n listeners.push([target, eventName, listener]);\n }\n }\n }\n\n onCleanup(() => {\n for (const [target, eventName, listener] of listeners) {\n target.removeEventListener(eventName, listener);\n }\n if (describedBy && element.getAttribute(\"aria-describedby\") === describedBy) {\n element.removeAttribute(\"aria-describedby\");\n }\n });\n });\n\n // We wrap in a span with display:contents to not affect layout.\n // However, display:contents makes getBoundingClientRect return zeros,\n // so we pass a ref callback that finds the first actual element child.\n const handleRef = (span: HTMLSpanElement) => {\n setWrapperElement(span);\n\n const findElementChild = (el: Element): HTMLElement | null => {\n for (const child of el.children) {\n if (child instanceof HTMLElement) {\n return child;\n }\n const found = findElementChild(child);\n if (found) return found;\n }\n return null;\n };\n\n // Find the first element child that has dimensions (not display:contents)\n const findVisibleChild = (el: Element): HTMLElement | null => {\n if (el instanceof HTMLElement) {\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n return el;\n }\n for (const child of el.children) {\n const found = findVisibleChild(child);\n if (found) return found;\n }\n }\n return null;\n };\n\n // Use requestAnimationFrame to ensure children are rendered and have dimensions\n // This is necessary because SolidJS may not have computed child layout yet\n const resolveRef = () => {\n const elementChild = findElementChild(span);\n const visibleChild = findVisibleChild(span);\n setTriggerElement(elementChild ?? visibleChild ?? span);\n props.ref(visibleChild ?? elementChild ?? span);\n };\n\n const elementChild = findElementChild(span);\n if (elementChild) {\n setTriggerElement(elementChild);\n }\n\n const immediateChild = findVisibleChild(span);\n if (immediateChild) {\n setTriggerElement(elementChild ?? immediateChild);\n props.ref(immediateChild);\n } else {\n requestAnimationFrame(resolveRef);\n }\n };\n\n return (\n <span {...getWrapperEventProps()} ref={handleRef} style={{ display: \"contents\" }}>\n {child()}\n </span>\n );\n};\n\n/**\n * A tooltip displays a description of an element on hover or focus.\n *\n * @example\n * ```tsx\n * <TooltipTrigger>\n * <Button>Hover me</Button>\n * <Tooltip>This is helpful information</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport function Tooltip(props: TooltipProps): JSX.Element {\n const context = useContext(TooltipTriggerContext);\n\n createEffect(() => {\n context?.setTooltipId(props.id);\n onCleanup(() => {\n context?.setTooltipId(undefined);\n });\n });\n\n const localState = createTooltipTriggerState({\n get isOpen() {\n return props.isOpen;\n },\n get defaultOpen() {\n return props.defaultOpen;\n },\n });\n\n const state = () => context?.state ?? localState;\n const placement = () => props.placement ?? context?.placement() ?? \"top\";\n const containerPadding = () => props.containerPadding ?? context?.containerPadding() ?? 12;\n const crossOffset = () => props.crossOffset ?? context?.crossOffset() ?? 0;\n const shouldFlip = () => props.shouldFlip ?? context?.shouldFlip() ?? true;\n const offset = () => props.offset ?? 9;\n const arrowSize = () => props.arrowSize ?? 0;\n const arrowBoundaryOffset = () => props.arrowBoundaryOffset ?? 0;\n const isDisabled = () => props.isDisabled ?? context?.isDisabled() ?? false;\n\n const isOpen = () => !isDisabled() && state().isOpen();\n\n // Exit animation state machine: 'closed' | 'open' | 'exiting'\n // Keeps the tooltip mounted during exit animation so CSS transitions can play.\n const [exitState, setExitState] = createSignal<\"closed\" | \"open\" | \"exiting\">(\n isOpen() ? \"open\" : \"closed\",\n );\n\n createEffect(() => {\n const open = isOpen();\n const current = exitState();\n if (current === \"open\" && !open) {\n setExitState(\"exiting\");\n } else if ((current === \"closed\" || current === \"exiting\") && open) {\n setExitState(\"open\");\n }\n });\n\n // Signal for the tooltip ref so we can observe exit animations\n const [tooltipEl, setTooltipEl] = createSignal<HTMLDivElement | null>(null);\n\n // When exiting, wait for CSS animations to finish, then set state to closed\n createEffect(() => {\n if (exitState() !== \"exiting\") return;\n const el = tooltipEl();\n if (!el || !(\"getAnimations\" in el)) {\n setExitState(\"closed\");\n return;\n }\n const animations = el.getAnimations();\n if (animations.length === 0) {\n setExitState(\"closed\");\n return;\n }\n let canceled = false;\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (!canceled) setExitState((s) => (s === \"exiting\" ? \"closed\" : s));\n })\n .catch(() => {\n if (!canceled) setExitState((s) => (s === \"exiting\" ? \"closed\" : s));\n });\n onCleanup(() => {\n canceled = true;\n });\n });\n\n const shouldRender = () => isOpen() || exitState() === \"exiting\";\n const isExiting = () => exitState() === \"exiting\";\n\n return (\n <Show when={shouldRender()}>\n <TooltipContent\n {...props}\n state={state()}\n contextTooltipProps={context?.tooltipProps ?? {}}\n placement={placement()}\n containerPadding={containerPadding()}\n crossOffset={crossOffset()}\n shouldFlip={shouldFlip()}\n offset={offset()}\n arrowSize={arrowSize()}\n arrowBoundaryOffset={arrowBoundaryOffset()}\n triggerRef={context?.triggerRef ?? (() => null)}\n isExiting={isExiting()}\n onTooltipRef={setTooltipEl}\n />\n </Show>\n );\n}\n\n/**\n * Internal component that renders the tooltip content\n */\nfunction TooltipContent(\n props: TooltipProps & {\n state: TooltipTriggerState;\n contextTooltipProps: { readonly id?: string };\n placement: TooltipPlacement;\n containerPadding: number;\n crossOffset: number;\n shouldFlip: boolean;\n offset: number;\n arrowSize: number;\n arrowBoundaryOffset: number;\n triggerRef: () => HTMLElement | null | undefined;\n isExiting: boolean;\n onTooltipRef: (el: HTMLDivElement | null) => void;\n },\n): JSX.Element {\n if (isServer) {\n return null as unknown as JSX.Element;\n }\n\n let tooltipRef!: HTMLDivElement;\n const { tooltipProps: ariaTooltipProps } = createTooltip({}, props.state);\n\n // Start visible at 0,0 and update position asynchronously\n // This ensures the tooltip is immediately accessible (for screen readers and tests)\n // while the visual position gets calculated\n const [positionStyles, setPositionStyles] = createSignal({\n top: \"0px\",\n left: \"0px\",\n visibility: \"visible\" as \"hidden\" | \"visible\",\n });\n const [renderedPlacement, setRenderedPlacement] = createSignal<TooltipResolvedPlacement>(\n resolvePlacement(props.placement),\n );\n\n // Enter animation state: starts true on mount, clears after first animation frame.\n // Uses getAnimations() to detect CSS animations/transitions - if none exist (JSDOM,\n // no CSS defined, reduced-motion), clears immediately.\n const [isEntering, setIsEntering] = createSignal(true);\n\n createEffect(() => {\n if (!isEntering()) return;\n if (!tooltipRef || !(\"getAnimations\" in tooltipRef)) {\n setIsEntering(false);\n return;\n }\n // Cancel any premature CSS transitions triggered before layout\n for (const anim of tooltipRef.getAnimations()) {\n if (anim instanceof CSSTransition) {\n anim.cancel();\n }\n }\n const animations = tooltipRef.getAnimations();\n if (animations.length === 0) {\n setIsEntering(false);\n return;\n }\n let canceled = false;\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (!canceled) setIsEntering(false);\n })\n .catch(() => {\n if (!canceled) setIsEntering(false);\n });\n onCleanup(() => {\n canceled = true;\n });\n });\n\n const values = createMemo<TooltipRenderProps>(() => ({\n isEntering: isEntering(),\n isExiting: props.isExiting,\n placement: renderedPlacement(),\n }));\n\n const renderProps = useRenderProps(\n {\n class: props.class,\n style: props.style,\n get children() {\n return props.children;\n },\n defaultClassName: \"solidaria-Tooltip\",\n },\n values,\n );\n\n // Position the overlay in document coordinates, matching React Aria's\n // absolute overlay positioning when the portal container is the document.\n // Returns true if position was successfully updated, false if we need to retry\n const updatePosition = (): boolean => {\n const triggerEl = props.triggerRef();\n if (!triggerEl || !tooltipRef) return false;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n\n // Check if the trigger has valid dimensions (not display:contents or not rendered yet)\n if (triggerRect.width === 0 || triggerRect.height === 0) {\n return false; // Need to retry\n }\n\n // Use offsetWidth/offsetHeight which are more reliable than getBoundingClientRect\n // when the element might be positioned off-screen initially\n const tooltipWidth = tooltipRef.offsetWidth;\n const tooltipHeight = tooltipRef.offsetHeight;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const containerPadding = props.containerPadding;\n const crossOffset = props.crossOffset;\n const placement = maybeFlipPlacement(\n resolvePlacement(props.placement),\n triggerRect,\n tooltipWidth,\n tooltipHeight,\n viewportWidth,\n viewportHeight,\n containerPadding,\n props.offset,\n props.shouldFlip,\n );\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case \"top\":\n top = triggerRect.top - tooltipHeight - props.offset;\n left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;\n break;\n case \"bottom\":\n top = triggerRect.bottom + props.offset;\n left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;\n break;\n case \"left\":\n top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;\n left = triggerRect.left - tooltipWidth - props.offset;\n break;\n case \"right\":\n top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;\n left = triggerRect.right + props.offset;\n break;\n }\n\n if (placement === \"top\" || placement === \"bottom\") {\n left = clamp(\n left,\n triggerRect.left - tooltipWidth + props.arrowSize + props.arrowBoundaryOffset,\n triggerRect.left + triggerRect.width - props.arrowSize - props.arrowBoundaryOffset,\n );\n left = clamp(left, containerPadding, viewportWidth - tooltipWidth - containerPadding);\n } else {\n top = clamp(\n top,\n triggerRect.top - tooltipHeight + props.arrowSize + props.arrowBoundaryOffset,\n triggerRect.top + triggerRect.height - props.arrowSize - props.arrowBoundaryOffset,\n );\n top = clamp(top, containerPadding, viewportHeight - tooltipHeight - containerPadding);\n }\n setRenderedPlacement(placement);\n setPositionStyles({\n top: `${Math.floor(top + window.scrollY)}px`,\n left: `${Math.floor(left + window.scrollX)}px`,\n visibility: \"visible\",\n });\n\n return true;\n };\n\n // Set up positioning and scroll-close effects. Positioning retries while the\n // trigger ref resolves, and pending rAF/setTimeout IDs are canceled on cleanup.\n createEffect(() => {\n // Track positioning inputs synchronously so updates from controlled route\n // props reschedule measurement even though layout reads happen in rAF.\n props.placement;\n props.containerPadding;\n props.crossOffset;\n props.shouldFlip;\n props.offset;\n props.arrowSize;\n props.arrowBoundaryOffset;\n\n let retryCount = 0;\n const maxRetries = 5;\n let pendingRaf = 0;\n let pendingTimeout = 0;\n\n const tryUpdatePosition = () => {\n pendingRaf = 0;\n pendingTimeout = 0;\n const success = updatePosition();\n if (!success && retryCount < maxRetries) {\n retryCount++;\n pendingTimeout = window.setTimeout(tryUpdatePosition, 16);\n }\n };\n\n pendingRaf = requestAnimationFrame(tryUpdatePosition);\n\n const closeOnScroll = (event: Event) => {\n const trigger = props.triggerRef();\n const target = event.target;\n if (!trigger || (target instanceof Node && !target.contains(trigger))) {\n return;\n }\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n return;\n }\n\n props.state.close(true);\n };\n\n window.addEventListener(\"scroll\", closeOnScroll, true);\n window.addEventListener(\"resize\", updatePosition);\n\n onCleanup(() => {\n if (pendingRaf) cancelAnimationFrame(pendingRaf);\n if (pendingTimeout) clearTimeout(pendingTimeout);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n window.removeEventListener(\"resize\", updatePosition);\n });\n });\n\n const domProps = filterDOMProps(props, { global: true });\n const tooltipId = () => props.contextTooltipProps.id ?? (domProps as { id?: string }).id;\n\n // Extract ref from ariaTooltipProps to avoid type conflicts (SolidJS ref types are element-specific)\n const { ref: _ariaRef, ...cleanAriaProps } = ariaTooltipProps as Record<string, unknown>;\n\n const setRef = (el: HTMLDivElement) => {\n tooltipRef = el;\n if (!props.dir) {\n el.dir = getDocumentDirection();\n }\n if (!props.lang) {\n const documentLang = document.documentElement.lang;\n const navigatorLang = typeof navigator !== \"undefined\" ? navigator.language : \"\";\n el.lang = documentLang.includes(\"-\")\n ? documentLang\n : navigatorLang || documentLang || \"en-US\";\n }\n props.onTooltipRef(el);\n };\n\n onCleanup(() => {\n props.onTooltipRef(null);\n });\n\n return (\n <OverlayContainer>\n <div\n {...domProps}\n {...cleanAriaProps}\n id={tooltipId()}\n role=\"tooltip\"\n ref={setRef}\n class={renderProps.class()}\n style={{\n position: \"absolute\",\n \"z-index\": 100000,\n ...positionStyles(),\n ...renderProps.style(),\n }}\n data-placement={renderedPlacement()}\n data-entering={isEntering() || undefined}\n data-exiting={props.isExiting || undefined}\n >\n {renderProps.renderChildren()}\n </div>\n </OverlayContainer>\n );\n}\n\nfunction resolvePlacement(placement: TooltipPlacement): TooltipResolvedPlacement {\n if (placement === \"start\") {\n return getDocumentDirection() === \"rtl\" ? \"right\" : \"left\";\n }\n if (placement === \"end\") {\n return getDocumentDirection() === \"rtl\" ? \"left\" : \"right\";\n }\n return placement;\n}\n\nfunction getDocumentDirection(): \"ltr\" | \"rtl\" {\n if (typeof document === \"undefined\") {\n return \"ltr\";\n }\n\n return document.documentElement.dir === \"rtl\" ? \"rtl\" : \"ltr\";\n}\n\nfunction maybeFlipPlacement(\n placement: TooltipResolvedPlacement,\n triggerRect: DOMRect,\n tooltipWidth: number,\n tooltipHeight: number,\n viewportWidth: number,\n viewportHeight: number,\n containerPadding: number,\n offset: number,\n shouldFlip: boolean,\n): TooltipResolvedPlacement {\n if (!shouldFlip) {\n return placement;\n }\n\n switch (placement) {\n case \"top\":\n return triggerRect.top - tooltipHeight - offset < containerPadding ? \"bottom\" : placement;\n case \"bottom\":\n return triggerRect.bottom + tooltipHeight + offset > viewportHeight - containerPadding\n ? \"top\"\n : placement;\n case \"left\":\n return triggerRect.left - tooltipWidth - offset < containerPadding ? \"right\" : placement;\n case \"right\":\n return triggerRect.right + tooltipWidth + offset > viewportWidth - containerPadding\n ? \"left\"\n : placement;\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n\n return Math.min(Math.max(value, min), max);\n}\n\nexport type { TooltipTriggerState };\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tooltip.js","names":["<TriggerWrapper\n triggerProps={triggerProps}\n ref={(el) => {\n triggerRef = el;\n }}\n >\n {trigger}\n </TriggerWrapper>","ref={(el) => {\n triggerRef = el;\n }}","<TooltipTriggerStateContext value={state}>\n <TooltipTriggerContext value={context}>{processChildren()}</TooltipTriggerContext>\n </TooltipTriggerStateContext>","value={state}","<TooltipTriggerContext value={context}>{processChildren()}</TooltipTriggerContext>","value={context}","ref={handleRef}","style={{ display: \"contents\" }}","{child()}","<span {...getWrapperEventProps()} ref={handleRef} style={{ display: \"contents\" }}>\n {child()}\n </span>","<Show when={shouldRender()}>\n <TooltipContent\n {...props}\n state={state()}\n contextTooltipProps={context?.tooltipProps ?? {}}\n placement={placement()}\n containerPadding={containerPadding()}\n crossOffset={crossOffset()}\n shouldFlip={shouldFlip()}\n offset={offset()}\n arrowSize={arrowSize()}\n arrowBoundaryOffset={arrowBoundaryOffset()}\n triggerRef={context?.triggerRef ?? (() => null)}\n isExiting={isExiting()}\n onTooltipRef={setTooltipEl}\n />\n </Show>","<TooltipContent\n {...props}\n state={state()}\n contextTooltipProps={context?.tooltipProps ?? {}}\n placement={placement()}\n containerPadding={containerPadding()}\n crossOffset={crossOffset()}\n shouldFlip={shouldFlip()}\n offset={offset()}\n arrowSize={arrowSize()}\n arrowBoundaryOffset={arrowBoundaryOffset()}\n triggerRef={context?.triggerRef ?? (() => null)}\n isExiting={isExiting()}\n onTooltipRef={setTooltipEl}\n />","onTooltipRef={setTooltipEl}","<OverlayContainer>\n <div\n {...domProps}\n {...cleanAriaProps}\n id={tooltipId()}\n role=\"tooltip\"\n ref={setRef}\n class={renderProps.class()}\n style={{\n position: \"absolute\",\n \"z-index\": 100000,\n ...positionStyles(),\n ...renderProps.style(),\n }}\n data-placement={renderedPlacement()}\n data-entering={dataAttr(isEntering())}\n data-exiting={dataAttr(props.isExiting)}\n >\n {renderProps.renderChildren()}\n </div>\n </OverlayContainer>","ref={setRef}","role=\"tooltip\"","{renderProps.renderChildren()}","<div\n {...domProps}\n {...cleanAriaProps}\n id={tooltipId()}\n role=\"tooltip\"\n ref={setRef}\n class={renderProps.class()}\n style={{\n position: \"absolute\",\n \"z-index\": 100000,\n ...positionStyles(),\n ...renderProps.style(),\n }}\n data-placement={renderedPlacement()}\n data-entering={dataAttr(isEntering())}\n data-exiting={dataAttr(props.isExiting)}\n >\n {renderProps.renderChildren()}\n </div>"],"sources":["../src/Tooltip.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/Tooltip.tsx\n\n/**\n * Tooltip component for solidaria-components\n *\n * A tooltip displays a description of an element on hover or focus.\n * Port of react-aria-components/src/Tooltip.tsx\n */\n\nimport {\n createContext,\n useContext,\n createMemo,\n createSignal,\n createEffect,\n onCleanup,\n Show,\n createTrackedEffect,\n} from \"solid-js\";\nimport type { ParentComponent } from \"solid-js\";\nimport type { JSX } from \"@solidjs/web\";\nimport { isServer } from \"@solidjs/web\";\nimport {\n createTooltipTriggerState,\n type TooltipTriggerState,\n type TooltipTriggerProps as StateProps,\n} from \"@proyecto-viviana/solid-stately\";\nimport {\n createTooltip,\n createTooltipTrigger,\n type TooltipTriggerProps as AriaProps,\n OverlayContainer,\n useLocale,\n} from \"@proyecto-viviana/solidaria\";\nimport {\n type RenderChildren,\n type ClassNameOrFunction,\n type StyleOrFunction,\n type SlotProps,\n useRenderProps,\n filterDOMProps,\n dataAttr,\n} from \"./utils\";\n\nexport interface TooltipRenderProps {\n /** Whether the tooltip is currently entering (for animations). */\n isEntering: boolean;\n /** Whether the tooltip is currently exiting (for animations). */\n isExiting: boolean;\n /** The placement of the tooltip relative to the trigger. */\n placement: TooltipResolvedPlacement | null;\n}\n\nexport type TooltipPlacement = \"top\" | \"bottom\" | \"left\" | \"right\" | \"start\" | \"end\";\nexport type TooltipResolvedPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface TooltipTriggerComponentProps extends StateProps, AriaProps {\n /** The children of the tooltip trigger (trigger element and tooltip). */\n children: JSX.Element;\n /** The placement of the tooltip relative to the trigger. */\n placement?: TooltipPlacement;\n /** The placement padding between the tooltip and viewport edge. */\n containerPadding?: number;\n /** The additional offset along the cross axis. */\n crossOffset?: number;\n /** Whether the tooltip should flip when there is insufficient room. */\n shouldFlip?: boolean;\n}\n\nexport interface TooltipProps extends SlotProps {\n /** The element id. */\n id?: string;\n /** Custom aria-label for the tooltip. */\n \"aria-label\"?: string;\n /** ID of an element that labels the tooltip. */\n \"aria-labelledby\"?: string;\n /** ID of an element that describes the tooltip. */\n \"aria-describedby\"?: string;\n /** ID of an element that provides details for the tooltip. */\n \"aria-details\"?: string;\n /** The children of the tooltip. A function may be provided to receive render props. */\n children?: RenderChildren<TooltipRenderProps>;\n /** The CSS className for the element. */\n class?: ClassNameOrFunction<TooltipRenderProps>;\n /** The inline style for the element. */\n style?: StyleOrFunction<TooltipRenderProps>;\n /** Whether the tooltip is open (controlled). */\n isOpen?: boolean;\n /** Whether the tooltip is open by default (uncontrolled). */\n defaultOpen?: boolean;\n /** The placement of the tooltip relative to the trigger. */\n placement?: TooltipPlacement;\n /** The placement padding between the tooltip and viewport edge. */\n containerPadding?: number;\n /** The additional offset along the cross axis. */\n crossOffset?: number;\n /** Whether the tooltip should flip when there is insufficient room. */\n shouldFlip?: boolean;\n /** The offset between the tooltip and trigger. */\n offset?: number;\n /** The arrow size used to keep the arrow overlapping the trigger. */\n arrowSize?: number;\n /** The padding between the arrow and tooltip edge. */\n arrowBoundaryOffset?: number;\n /** Whether the tooltip should be disabled. */\n isDisabled?: boolean;\n /** The element language. */\n lang?: string;\n /** The text direction. */\n dir?: \"ltr\" | \"rtl\";\n}\n\ninterface TooltipTriggerContextValue {\n state: TooltipTriggerState;\n tooltipProps: { readonly id: string };\n setTooltipId: (id: string | undefined) => void;\n triggerRef: () => HTMLElement | null | undefined;\n placement: () => TooltipPlacement | undefined;\n containerPadding: () => number | undefined;\n crossOffset: () => number | undefined;\n shouldFlip: () => boolean | undefined;\n isDisabled: () => boolean | undefined;\n}\n\nconst TooltipTriggerContext = createContext<TooltipTriggerContextValue | null>(null);\nexport const TooltipContext = TooltipTriggerContext;\nexport const TooltipTriggerStateContext = createContext<TooltipTriggerState | null>(null);\n\n/**\n * TooltipTrigger wraps around a trigger element and a Tooltip.\n * It handles opening and closing the Tooltip when the user hovers\n * over or focuses the trigger.\n *\n * @example\n * ```tsx\n * <TooltipTrigger>\n * <Button>Hover me</Button>\n * <Tooltip>This is a tooltip</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport const TooltipTrigger: ParentComponent<TooltipTriggerComponentProps> = (props) => {\n let triggerRef: HTMLElement | null = null;\n const [tooltipId, setTooltipId] = createSignal<string | undefined>();\n\n const state = createTooltipTriggerState({\n get delay() {\n return props.delay;\n },\n get closeDelay() {\n return props.closeDelay;\n },\n get isOpen() {\n return props.isOpen;\n },\n get defaultOpen() {\n return props.defaultOpen;\n },\n get onOpenChange() {\n return props.onOpenChange;\n },\n });\n\n const { triggerProps, tooltipProps } = createTooltipTrigger(\n {\n get isDisabled() {\n return props.isDisabled;\n },\n get trigger() {\n return props.trigger;\n },\n get shouldCloseOnPress() {\n return props.shouldCloseOnPress;\n },\n get tooltipId() {\n return tooltipId();\n },\n },\n state,\n () => triggerRef,\n );\n\n const context: TooltipTriggerContextValue = {\n state,\n tooltipProps,\n setTooltipId,\n triggerRef: () => triggerRef,\n placement: () => props.placement,\n containerPadding: () => props.containerPadding,\n crossOffset: () => props.crossOffset,\n shouldFlip: () => props.shouldFlip,\n isDisabled: () => props.isDisabled,\n };\n\n const processChildren = () => {\n const children = props.children;\n if (Array.isArray(children)) {\n const [trigger, ...rest] = children;\n return (\n <>\n <TriggerWrapper\n triggerProps={triggerProps}\n ref={(el) => {\n triggerRef = el;\n }}\n >\n {trigger}\n </TriggerWrapper>\n {rest}\n </>\n );\n }\n return children;\n };\n\n return (\n <TooltipTriggerStateContext value={state}>\n <TooltipTriggerContext value={context}>{processChildren()}</TooltipTriggerContext>\n </TooltipTriggerStateContext>\n );\n};\n\n/**\n * Wrapper component that spreads trigger props onto its child\n */\nconst TriggerWrapper: ParentComponent<{\n triggerProps: JSX.HTMLAttributes<HTMLElement>;\n ref: (el: HTMLElement) => void;\n}> = (props) => {\n const child = () => props.children as JSX.Element;\n const [triggerElement, setTriggerElement] = createSignal<HTMLElement | null>(null);\n const [wrapperElement, setWrapperElement] = createSignal<HTMLSpanElement | null>(null);\n const getWrapperEventProps = () => {\n const triggerProps = props.triggerProps as Record<string, unknown>;\n const wrapperProps: Record<string, unknown> = {};\n const eventPropNames = [\n \"onFocus\",\n \"onBlur\",\n \"onPointerEnter\",\n \"onPointerLeave\",\n \"onPointerOver\",\n \"onPointerOut\",\n \"onMouseEnter\",\n \"onMouseLeave\",\n \"onTouchStart\",\n \"onPointerDown\",\n \"onKeyDown\",\n ];\n\n for (const propName of eventPropNames) {\n const handler = triggerProps[propName];\n if (typeof handler === \"function\") {\n wrapperProps[propName] = handler;\n }\n }\n\n if (!wrapperProps.onPointerEnter && typeof triggerProps.onMouseEnter === \"function\") {\n wrapperProps.onPointerEnter = triggerProps.onMouseEnter;\n }\n if (!wrapperProps.onPointerLeave && typeof triggerProps.onMouseLeave === \"function\") {\n wrapperProps.onPointerLeave = triggerProps.onMouseLeave;\n }\n\n return wrapperProps as JSX.HTMLAttributes<HTMLSpanElement>;\n };\n\n // Read refs and trigger state in the compute phase. A tracked callback can\n // miss refs written earlier in the same hydration flush before its first read.\n createEffect(\n () => ({\n element: triggerElement(),\n wrapper: wrapperElement(),\n triggerProps: { ...props.triggerProps } as Record<string, unknown>,\n }),\n ({ element, wrapper, triggerProps }) => {\n if (!element) {\n return;\n }\n\n const describedBy = triggerProps[\"aria-describedby\"] as string | undefined;\n if (describedBy) {\n element.setAttribute(\"aria-describedby\", describedBy);\n } else {\n element.removeAttribute(\"aria-describedby\");\n }\n\n const targets = Array.from(new Set([element, wrapper].filter(Boolean))) as HTMLElement[];\n const listeners: Array<[HTMLElement, string, EventListener]> = [];\n const eventProps = [\n [\"onFocus\", \"focus\"],\n [\"onBlur\", \"blur\"],\n [\"onPointerEnter\", \"pointerenter\"],\n [\"onPointerLeave\", \"pointerleave\"],\n [\"onPointerOver\", \"pointerover\"],\n [\"onPointerOut\", \"pointerout\"],\n [\"onMouseEnter\", \"mouseenter\"],\n [\"onMouseLeave\", \"mouseleave\"],\n [\"onTouchStart\", \"touchstart\"],\n [\"onPointerDown\", \"pointerdown\"],\n [\"onKeyDown\", \"keydown\"],\n ] as const;\n\n for (const [propName, eventName] of eventProps) {\n let handler = triggerProps[propName];\n if (!handler && propName === \"onPointerEnter\") {\n handler = triggerProps.onMouseEnter;\n } else if (!handler && propName === \"onPointerLeave\") {\n handler = triggerProps.onMouseLeave;\n }\n if (typeof handler === \"function\") {\n const listener = handler as EventListener;\n for (const target of targets) {\n target.addEventListener(eventName, listener);\n listeners.push([target, eventName, listener]);\n }\n }\n }\n\n return () => {\n for (const [target, eventName, listener] of listeners) {\n target.removeEventListener(eventName, listener);\n }\n if (describedBy && element.getAttribute(\"aria-describedby\") === describedBy) {\n element.removeAttribute(\"aria-describedby\");\n }\n };\n },\n );\n\n // We wrap in a span with display:contents to not affect layout.\n // However, display:contents makes getBoundingClientRect return zeros,\n // so we pass a ref callback that finds the first actual element child.\n const handleRef = (span: HTMLSpanElement) => {\n setWrapperElement(span);\n\n const findElementChild = (el: Element): HTMLElement | null => {\n for (const child of el.children) {\n if (child instanceof HTMLElement) {\n return child;\n }\n const found = findElementChild(child);\n if (found) return found;\n }\n return null;\n };\n\n // Find the first element child that has dimensions (not display:contents)\n const findVisibleChild = (el: Element): HTMLElement | null => {\n if (el instanceof HTMLElement) {\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) {\n return el;\n }\n for (const child of el.children) {\n const found = findVisibleChild(child);\n if (found) return found;\n }\n }\n return null;\n };\n\n // Use requestAnimationFrame to ensure children are rendered and have dimensions\n // This is necessary because SolidJS may not have computed child layout yet\n const resolveRef = () => {\n const elementChild = findElementChild(span);\n const visibleChild = findVisibleChild(span);\n setTriggerElement(elementChild ?? visibleChild ?? span);\n props.ref(visibleChild ?? elementChild ?? span);\n };\n\n const elementChild = findElementChild(span);\n if (elementChild) {\n setTriggerElement(elementChild);\n }\n\n const immediateChild = findVisibleChild(span);\n if (immediateChild) {\n setTriggerElement(elementChild ?? immediateChild);\n props.ref(immediateChild);\n } else {\n requestAnimationFrame(resolveRef);\n }\n };\n\n return (\n <span {...getWrapperEventProps()} ref={handleRef} style={{ display: \"contents\" }}>\n {child()}\n </span>\n );\n};\n\n/**\n * A tooltip displays a description of an element on hover or focus.\n *\n * @example\n * ```tsx\n * <TooltipTrigger>\n * <Button>Hover me</Button>\n * <Tooltip>This is helpful information</Tooltip>\n * </TooltipTrigger>\n * ```\n */\nexport function Tooltip(props: TooltipProps): JSX.Element {\n const context = useContext(TooltipTriggerContext);\n\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n context?.setTooltipId(props.id);\n _s2Cleanups.push(() => {\n context?.setTooltipId(undefined);\n });\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n const localState = createTooltipTriggerState({\n get isOpen() {\n return props.isOpen;\n },\n get defaultOpen() {\n return props.defaultOpen;\n },\n });\n\n const state = () => context?.state ?? localState;\n const placement = () => props.placement ?? context?.placement() ?? \"top\";\n const containerPadding = () => props.containerPadding ?? context?.containerPadding() ?? 12;\n const crossOffset = () => props.crossOffset ?? context?.crossOffset() ?? 0;\n const shouldFlip = () => props.shouldFlip ?? context?.shouldFlip() ?? true;\n const offset = () => props.offset ?? 9;\n const arrowSize = () => props.arrowSize ?? 0;\n const arrowBoundaryOffset = () => props.arrowBoundaryOffset ?? 0;\n const isDisabled = () => props.isDisabled ?? context?.isDisabled() ?? false;\n\n const isOpen = () => !isDisabled() && state().isOpen();\n\n // Exit animation state machine: 'closed' | 'open' | 'exiting'\n // Keeps the tooltip mounted during exit animation so CSS transitions can play.\n const [exitState, setExitState] = createSignal<\"closed\" | \"open\" | \"exiting\">(\n isOpen() ? \"open\" : \"closed\",\n );\n\n createTrackedEffect(() => {\n const open = isOpen();\n const current = exitState();\n if (current === \"open\" && !open) {\n setExitState(\"exiting\");\n } else if ((current === \"closed\" || current === \"exiting\") && open) {\n setExitState(\"open\");\n }\n });\n\n // Signal for the tooltip ref so we can observe exit animations\n const [tooltipEl, setTooltipEl] = createSignal<HTMLDivElement | null>(null);\n\n // When exiting, wait for CSS animations to finish, then set state to closed\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n if (exitState() !== \"exiting\") return;\n const el = tooltipEl();\n if (!el || !(\"getAnimations\" in el)) {\n setExitState(\"closed\");\n return;\n }\n const animations = el.getAnimations();\n if (animations.length === 0) {\n setExitState(\"closed\");\n return;\n }\n let canceled = false;\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (!canceled) setExitState((s) => (s === \"exiting\" ? \"closed\" : s));\n })\n .catch(() => {\n if (!canceled) setExitState((s) => (s === \"exiting\" ? \"closed\" : s));\n });\n _s2Cleanups.push(() => {\n canceled = true;\n });\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n const shouldRender = () => isOpen() || exitState() === \"exiting\";\n const isExiting = () => exitState() === \"exiting\";\n\n return (\n <Show when={shouldRender()}>\n <TooltipContent\n {...props}\n state={state()}\n contextTooltipProps={context?.tooltipProps ?? {}}\n placement={placement()}\n containerPadding={containerPadding()}\n crossOffset={crossOffset()}\n shouldFlip={shouldFlip()}\n offset={offset()}\n arrowSize={arrowSize()}\n arrowBoundaryOffset={arrowBoundaryOffset()}\n triggerRef={context?.triggerRef ?? (() => null)}\n isExiting={isExiting()}\n onTooltipRef={setTooltipEl}\n />\n </Show>\n );\n}\n\n/**\n * Internal component that renders the tooltip content\n */\nfunction TooltipContent(\n props: TooltipProps & {\n state: TooltipTriggerState;\n contextTooltipProps: { readonly id?: string };\n placement: TooltipPlacement;\n containerPadding: number;\n crossOffset: number;\n shouldFlip: boolean;\n offset: number;\n arrowSize: number;\n arrowBoundaryOffset: number;\n triggerRef: () => HTMLElement | null | undefined;\n isExiting: boolean;\n onTooltipRef: (el: HTMLDivElement | null) => void;\n },\n): JSX.Element {\n if (isServer) {\n return null as unknown as JSX.Element;\n }\n\n let tooltipRef!: HTMLDivElement;\n const locale = useLocale();\n const direction = () => locale().direction;\n const { tooltipProps: ariaTooltipProps } = createTooltip({}, props.state);\n\n // Start visible at 0,0 and update position asynchronously\n // This ensures the tooltip is immediately accessible (for screen readers and tests)\n // while the visual position gets calculated\n const [positionStyles, setPositionStyles] = createSignal({\n top: \"0px\",\n left: \"0px\",\n visibility: \"visible\" as \"hidden\" | \"visible\",\n });\n const [renderedPlacement, setRenderedPlacement] = createSignal<TooltipResolvedPlacement>(\n resolvePlacement(props.placement, direction()),\n );\n\n // Enter animation state: starts true on mount, clears after first animation frame.\n // Uses getAnimations() to detect CSS animations/transitions - if none exist (JSDOM,\n // no CSS defined, reduced-motion), clears immediately.\n const [isEntering, setIsEntering] = createSignal(true);\n\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n if (!isEntering()) return;\n if (!tooltipRef || !(\"getAnimations\" in tooltipRef)) {\n setIsEntering(false);\n return;\n }\n // Cancel any premature CSS transitions triggered before layout\n for (const anim of tooltipRef.getAnimations()) {\n if (anim instanceof CSSTransition) {\n anim.cancel();\n }\n }\n const animations = tooltipRef.getAnimations();\n if (animations.length === 0) {\n setIsEntering(false);\n return;\n }\n let canceled = false;\n Promise.all(animations.map((a) => a.finished))\n .then(() => {\n if (!canceled) setIsEntering(false);\n })\n .catch(() => {\n if (!canceled) setIsEntering(false);\n });\n _s2Cleanups.push(() => {\n canceled = true;\n });\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n const values = createMemo<TooltipRenderProps>(() => ({\n isEntering: isEntering(),\n isExiting: props.isExiting,\n placement: renderedPlacement(),\n }));\n\n const renderProps = useRenderProps(\n {\n class: props.class,\n style: props.style,\n get children() {\n return props.children;\n },\n defaultClassName: \"solidaria-Tooltip\",\n },\n values,\n );\n\n // Position the overlay in document coordinates, matching React Aria's\n // absolute overlay positioning when the portal container is the document.\n // Returns true if position was successfully updated, false if we need to retry\n const updatePosition = (): boolean => {\n const triggerEl = props.triggerRef();\n if (!triggerEl || !tooltipRef) return false;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n\n // Check if the trigger has valid dimensions (not display:contents or not rendered yet)\n if (triggerRect.width === 0 || triggerRect.height === 0) {\n return false; // Need to retry\n }\n\n // Use offsetWidth/offsetHeight which are more reliable than getBoundingClientRect\n // when the element might be positioned off-screen initially\n const tooltipWidth = tooltipRef.offsetWidth;\n const tooltipHeight = tooltipRef.offsetHeight;\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const containerPadding = props.containerPadding;\n const crossOffset = props.crossOffset;\n const placement = maybeFlipPlacement(\n resolvePlacement(props.placement, direction()),\n triggerRect,\n tooltipWidth,\n tooltipHeight,\n viewportWidth,\n viewportHeight,\n containerPadding,\n props.offset,\n props.shouldFlip,\n );\n\n let top = 0;\n let left = 0;\n\n switch (placement) {\n case \"top\":\n top = triggerRect.top - tooltipHeight - props.offset;\n left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;\n break;\n case \"bottom\":\n top = triggerRect.bottom + props.offset;\n left = triggerRect.left + (triggerRect.width - tooltipWidth) / 2 + crossOffset;\n break;\n case \"left\":\n top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;\n left = triggerRect.left - tooltipWidth - props.offset;\n break;\n case \"right\":\n top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;\n left = triggerRect.right + props.offset;\n break;\n }\n\n if (placement === \"top\" || placement === \"bottom\") {\n left = clamp(\n left,\n triggerRect.left - tooltipWidth + props.arrowSize + props.arrowBoundaryOffset,\n triggerRect.left + triggerRect.width - props.arrowSize - props.arrowBoundaryOffset,\n );\n left = clamp(left, containerPadding, viewportWidth - tooltipWidth - containerPadding);\n } else {\n top = clamp(\n top,\n triggerRect.top - tooltipHeight + props.arrowSize + props.arrowBoundaryOffset,\n triggerRect.top + triggerRect.height - props.arrowSize - props.arrowBoundaryOffset,\n );\n top = clamp(top, containerPadding, viewportHeight - tooltipHeight - containerPadding);\n }\n setRenderedPlacement(placement);\n setPositionStyles({\n top: `${Math.floor(top + window.scrollY)}px`,\n left: `${Math.floor(left + window.scrollX)}px`,\n visibility: \"visible\",\n });\n\n return true;\n };\n\n // Set up positioning and scroll-close effects. Positioning retries while the\n // trigger ref resolves, and pending rAF/setTimeout IDs are canceled on cleanup.\n createTrackedEffect(() => {\n const _s2Cleanups: Array<() => void> = [];\n\n // Track positioning inputs synchronously so updates from controlled route\n // props reschedule measurement even though layout reads happen in rAF.\n props.placement;\n props.containerPadding;\n props.crossOffset;\n props.shouldFlip;\n props.offset;\n props.arrowSize;\n props.arrowBoundaryOffset;\n\n let retryCount = 0;\n const maxRetries = 5;\n let pendingRaf = 0;\n let pendingTimeout = 0;\n\n const tryUpdatePosition = () => {\n pendingRaf = 0;\n pendingTimeout = 0;\n const success = updatePosition();\n if (!success && retryCount < maxRetries) {\n retryCount++;\n pendingTimeout = window.setTimeout(tryUpdatePosition, 16);\n }\n };\n\n pendingRaf = requestAnimationFrame(tryUpdatePosition);\n\n const closeOnScroll = (event: Event) => {\n const trigger = props.triggerRef();\n const target = event.target;\n if (!trigger || (target instanceof Node && !target.contains(trigger))) {\n return;\n }\n if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) {\n return;\n }\n\n props.state.close(true);\n };\n\n window.addEventListener(\"scroll\", closeOnScroll, true);\n window.addEventListener(\"resize\", updatePosition);\n\n _s2Cleanups.push(() => {\n if (pendingRaf) cancelAnimationFrame(pendingRaf);\n if (pendingTimeout) clearTimeout(pendingTimeout);\n window.removeEventListener(\"scroll\", closeOnScroll, true);\n window.removeEventListener(\"resize\", updatePosition);\n });\n\n return () => {\n for (const c of _s2Cleanups) c();\n };\n });\n\n const domProps = filterDOMProps(props, { global: true });\n const tooltipId = () => props.contextTooltipProps.id ?? (domProps as { id?: string }).id;\n\n // Extract ref from ariaTooltipProps to avoid type conflicts (SolidJS ref types are element-specific)\n const { ref: _ariaRef, ...cleanAriaProps } = ariaTooltipProps as Record<string, unknown>;\n\n const setRef = (el: HTMLDivElement) => {\n tooltipRef = el;\n if (!props.dir) {\n el.dir = direction();\n }\n if (!props.lang) {\n const documentLang = document.documentElement.lang;\n const navigatorLang = typeof navigator !== \"undefined\" ? navigator.language : \"\";\n el.lang = documentLang.includes(\"-\")\n ? documentLang\n : navigatorLang || documentLang || \"en-US\";\n }\n props.onTooltipRef(el);\n };\n\n onCleanup(() => {\n props.onTooltipRef(null);\n });\n\n return (\n <OverlayContainer>\n <div\n {...domProps}\n {...cleanAriaProps}\n id={tooltipId()}\n role=\"tooltip\"\n ref={setRef}\n class={renderProps.class()}\n style={{\n position: \"absolute\",\n \"z-index\": 100000,\n ...positionStyles(),\n ...renderProps.style(),\n }}\n data-placement={renderedPlacement()}\n data-entering={dataAttr(isEntering())}\n data-exiting={dataAttr(props.isExiting)}\n >\n {renderProps.renderChildren()}\n </div>\n </OverlayContainer>\n );\n}\n\nfunction resolvePlacement(\n placement: TooltipPlacement,\n direction: \"ltr\" | \"rtl\",\n): TooltipResolvedPlacement {\n if (placement === \"start\") {\n return direction === \"rtl\" ? \"right\" : \"left\";\n }\n if (placement === \"end\") {\n return direction === \"rtl\" ? \"left\" : \"right\";\n }\n return placement;\n}\n\nfunction maybeFlipPlacement(\n placement: TooltipResolvedPlacement,\n triggerRect: DOMRect,\n tooltipWidth: number,\n tooltipHeight: number,\n viewportWidth: number,\n viewportHeight: number,\n containerPadding: number,\n offset: number,\n shouldFlip: boolean,\n): TooltipResolvedPlacement {\n if (!shouldFlip) {\n return placement;\n }\n\n switch (placement) {\n case \"top\":\n return triggerRect.top - tooltipHeight - offset < containerPadding ? \"bottom\" : placement;\n case \"bottom\":\n return triggerRect.bottom + tooltipHeight + offset > viewportHeight - containerPadding\n ? \"top\"\n : placement;\n case \"left\":\n return triggerRect.left - tooltipWidth - offset < containerPadding ? \"right\" : placement;\n case \"right\":\n return triggerRect.right + tooltipWidth + offset > viewportWidth - containerPadding\n ? \"left\"\n : placement;\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n if (max < min) {\n return min;\n }\n\n return Math.min(Math.max(value, min), max);\n}\n\nexport type { TooltipTriggerState };\n"],"mappings":"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"}
|
package/dist/Tooltip.jsx
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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/Tooltip.tsx
|
|
13
|
+
import { dataAttr, filterDOMProps, useRenderProps } from "./utils.jsx";
|
|
14
|
+
import { Show, createContext, createEffect, createMemo, createSignal, createTrackedEffect, onCleanup, useContext } from "solid-js";
|
|
15
|
+
import { isServer } from "@solidjs/web";
|
|
16
|
+
import { OverlayContainer, createTooltip, createTooltipTrigger, useLocale } from "@proyecto-viviana/solidaria";
|
|
5
17
|
import { createTooltipTriggerState } from "@proyecto-viviana/solid-stately";
|
|
6
18
|
//#region src/Tooltip.tsx
|
|
7
19
|
/**
|
|
@@ -86,11 +98,9 @@ const TooltipTrigger = (props) => {
|
|
|
86
98
|
}
|
|
87
99
|
return children;
|
|
88
100
|
};
|
|
89
|
-
return <TooltipTriggerStateContext
|
|
90
|
-
<TooltipTriggerContext
|
|
91
|
-
|
|
92
|
-
</TooltipTriggerContext.Provider>
|
|
93
|
-
</TooltipTriggerStateContext.Provider>;
|
|
101
|
+
return <TooltipTriggerStateContext value={state}>
|
|
102
|
+
<TooltipTriggerContext value={context}>{processChildren()}</TooltipTriggerContext>
|
|
103
|
+
</TooltipTriggerStateContext>;
|
|
94
104
|
};
|
|
95
105
|
/**
|
|
96
106
|
* Wrapper component that spreads trigger props onto its child
|
|
@@ -122,14 +132,15 @@ const TriggerWrapper = (props) => {
|
|
|
122
132
|
if (!wrapperProps.onPointerLeave && typeof triggerProps.onMouseLeave === "function") wrapperProps.onPointerLeave = triggerProps.onMouseLeave;
|
|
123
133
|
return wrapperProps;
|
|
124
134
|
};
|
|
125
|
-
createEffect(() => {
|
|
126
|
-
|
|
135
|
+
createEffect(() => ({
|
|
136
|
+
element: triggerElement(),
|
|
137
|
+
wrapper: wrapperElement(),
|
|
138
|
+
triggerProps: { ...props.triggerProps }
|
|
139
|
+
}), ({ element, wrapper, triggerProps }) => {
|
|
127
140
|
if (!element) return;
|
|
128
|
-
const triggerProps = props.triggerProps;
|
|
129
141
|
const describedBy = triggerProps["aria-describedby"];
|
|
130
142
|
if (describedBy) element.setAttribute("aria-describedby", describedBy);
|
|
131
143
|
else element.removeAttribute("aria-describedby");
|
|
132
|
-
const wrapper = wrapperElement();
|
|
133
144
|
const targets = Array.from(new Set([element, wrapper].filter(Boolean)));
|
|
134
145
|
const listeners = [];
|
|
135
146
|
for (const [propName, eventName] of [
|
|
@@ -160,10 +171,10 @@ const TriggerWrapper = (props) => {
|
|
|
160
171
|
}
|
|
161
172
|
}
|
|
162
173
|
}
|
|
163
|
-
|
|
174
|
+
return () => {
|
|
164
175
|
for (const [target, eventName, listener] of listeners) target.removeEventListener(eventName, listener);
|
|
165
176
|
if (describedBy && element.getAttribute("aria-describedby") === describedBy) element.removeAttribute("aria-describedby");
|
|
166
|
-
}
|
|
177
|
+
};
|
|
167
178
|
});
|
|
168
179
|
const handleRef = (span) => {
|
|
169
180
|
setWrapperElement(span);
|
|
@@ -217,11 +228,15 @@ const TriggerWrapper = (props) => {
|
|
|
217
228
|
*/
|
|
218
229
|
function Tooltip(props) {
|
|
219
230
|
const context = useContext(TooltipTriggerContext);
|
|
220
|
-
|
|
231
|
+
createTrackedEffect(() => {
|
|
232
|
+
const _s2Cleanups = [];
|
|
221
233
|
context?.setTooltipId(props.id);
|
|
222
|
-
|
|
234
|
+
_s2Cleanups.push(() => {
|
|
223
235
|
context?.setTooltipId(void 0);
|
|
224
236
|
});
|
|
237
|
+
return () => {
|
|
238
|
+
for (const c of _s2Cleanups) c();
|
|
239
|
+
};
|
|
225
240
|
});
|
|
226
241
|
const localState = createTooltipTriggerState({
|
|
227
242
|
get isOpen() {
|
|
@@ -242,14 +257,15 @@ function Tooltip(props) {
|
|
|
242
257
|
const isDisabled = () => props.isDisabled ?? context?.isDisabled() ?? false;
|
|
243
258
|
const isOpen = () => !isDisabled() && state().isOpen();
|
|
244
259
|
const [exitState, setExitState] = createSignal(isOpen() ? "open" : "closed");
|
|
245
|
-
|
|
260
|
+
createTrackedEffect(() => {
|
|
246
261
|
const open = isOpen();
|
|
247
262
|
const current = exitState();
|
|
248
263
|
if (current === "open" && !open) setExitState("exiting");
|
|
249
264
|
else if ((current === "closed" || current === "exiting") && open) setExitState("open");
|
|
250
265
|
});
|
|
251
266
|
const [tooltipEl, setTooltipEl] = createSignal(null);
|
|
252
|
-
|
|
267
|
+
createTrackedEffect(() => {
|
|
268
|
+
const _s2Cleanups = [];
|
|
253
269
|
if (exitState() !== "exiting") return;
|
|
254
270
|
const el = tooltipEl();
|
|
255
271
|
if (!el || !("getAnimations" in el)) {
|
|
@@ -267,9 +283,12 @@ function Tooltip(props) {
|
|
|
267
283
|
}).catch(() => {
|
|
268
284
|
if (!canceled) setExitState((s) => s === "exiting" ? "closed" : s);
|
|
269
285
|
});
|
|
270
|
-
|
|
286
|
+
_s2Cleanups.push(() => {
|
|
271
287
|
canceled = true;
|
|
272
288
|
});
|
|
289
|
+
return () => {
|
|
290
|
+
for (const c of _s2Cleanups) c();
|
|
291
|
+
};
|
|
273
292
|
});
|
|
274
293
|
const shouldRender = () => isOpen() || exitState() === "exiting";
|
|
275
294
|
const isExiting = () => exitState() === "exiting";
|
|
@@ -283,15 +302,18 @@ function Tooltip(props) {
|
|
|
283
302
|
function TooltipContent(props) {
|
|
284
303
|
if (isServer) return null;
|
|
285
304
|
let tooltipRef;
|
|
305
|
+
const locale = useLocale();
|
|
306
|
+
const direction = () => locale().direction;
|
|
286
307
|
const { tooltipProps: ariaTooltipProps } = createTooltip({}, props.state);
|
|
287
308
|
const [positionStyles, setPositionStyles] = createSignal({
|
|
288
309
|
top: "0px",
|
|
289
310
|
left: "0px",
|
|
290
311
|
visibility: "visible"
|
|
291
312
|
});
|
|
292
|
-
const [renderedPlacement, setRenderedPlacement] = createSignal(resolvePlacement(props.placement));
|
|
313
|
+
const [renderedPlacement, setRenderedPlacement] = createSignal(resolvePlacement(props.placement, direction()));
|
|
293
314
|
const [isEntering, setIsEntering] = createSignal(true);
|
|
294
|
-
|
|
315
|
+
createTrackedEffect(() => {
|
|
316
|
+
const _s2Cleanups = [];
|
|
295
317
|
if (!isEntering()) return;
|
|
296
318
|
if (!tooltipRef || !("getAnimations" in tooltipRef)) {
|
|
297
319
|
setIsEntering(false);
|
|
@@ -309,9 +331,12 @@ function TooltipContent(props) {
|
|
|
309
331
|
}).catch(() => {
|
|
310
332
|
if (!canceled) setIsEntering(false);
|
|
311
333
|
});
|
|
312
|
-
|
|
334
|
+
_s2Cleanups.push(() => {
|
|
313
335
|
canceled = true;
|
|
314
336
|
});
|
|
337
|
+
return () => {
|
|
338
|
+
for (const c of _s2Cleanups) c();
|
|
339
|
+
};
|
|
315
340
|
});
|
|
316
341
|
const values = createMemo(() => ({
|
|
317
342
|
isEntering: isEntering(),
|
|
@@ -337,7 +362,7 @@ function TooltipContent(props) {
|
|
|
337
362
|
const viewportHeight = window.innerHeight;
|
|
338
363
|
const containerPadding = props.containerPadding;
|
|
339
364
|
const crossOffset = props.crossOffset;
|
|
340
|
-
const placement = maybeFlipPlacement(resolvePlacement(props.placement), triggerRect, tooltipWidth, tooltipHeight, viewportWidth, viewportHeight, containerPadding, props.offset, props.shouldFlip);
|
|
365
|
+
const placement = maybeFlipPlacement(resolvePlacement(props.placement, direction()), triggerRect, tooltipWidth, tooltipHeight, viewportWidth, viewportHeight, containerPadding, props.offset, props.shouldFlip);
|
|
341
366
|
let top = 0;
|
|
342
367
|
let left = 0;
|
|
343
368
|
switch (placement) {
|
|
@@ -356,7 +381,6 @@ function TooltipContent(props) {
|
|
|
356
381
|
case "right":
|
|
357
382
|
top = triggerRect.top + (triggerRect.height - tooltipHeight) / 2 + crossOffset;
|
|
358
383
|
left = triggerRect.right + props.offset;
|
|
359
|
-
break;
|
|
360
384
|
}
|
|
361
385
|
if (placement === "top" || placement === "bottom") {
|
|
362
386
|
left = clamp(left, triggerRect.left - tooltipWidth + props.arrowSize + props.arrowBoundaryOffset, triggerRect.left + triggerRect.width - props.arrowSize - props.arrowBoundaryOffset);
|
|
@@ -373,7 +397,8 @@ function TooltipContent(props) {
|
|
|
373
397
|
});
|
|
374
398
|
return true;
|
|
375
399
|
};
|
|
376
|
-
|
|
400
|
+
createTrackedEffect(() => {
|
|
401
|
+
const _s2Cleanups = [];
|
|
377
402
|
props.placement;
|
|
378
403
|
props.containerPadding;
|
|
379
404
|
props.crossOffset;
|
|
@@ -403,19 +428,22 @@ function TooltipContent(props) {
|
|
|
403
428
|
};
|
|
404
429
|
window.addEventListener("scroll", closeOnScroll, true);
|
|
405
430
|
window.addEventListener("resize", updatePosition);
|
|
406
|
-
|
|
431
|
+
_s2Cleanups.push(() => {
|
|
407
432
|
if (pendingRaf) cancelAnimationFrame(pendingRaf);
|
|
408
433
|
if (pendingTimeout) clearTimeout(pendingTimeout);
|
|
409
434
|
window.removeEventListener("scroll", closeOnScroll, true);
|
|
410
435
|
window.removeEventListener("resize", updatePosition);
|
|
411
436
|
});
|
|
437
|
+
return () => {
|
|
438
|
+
for (const c of _s2Cleanups) c();
|
|
439
|
+
};
|
|
412
440
|
});
|
|
413
441
|
const domProps = filterDOMProps(props, { global: true });
|
|
414
442
|
const tooltipId = () => props.contextTooltipProps.id ?? domProps.id;
|
|
415
443
|
const { ref: _ariaRef, ...cleanAriaProps } = ariaTooltipProps;
|
|
416
444
|
const setRef = (el) => {
|
|
417
445
|
tooltipRef = el;
|
|
418
|
-
if (!props.dir) el.dir =
|
|
446
|
+
if (!props.dir) el.dir = direction();
|
|
419
447
|
if (!props.lang) {
|
|
420
448
|
const documentLang = document.documentElement.lang;
|
|
421
449
|
const navigatorLang = typeof navigator !== "undefined" ? navigator.language : "";
|
|
@@ -432,20 +460,16 @@ function TooltipContent(props) {
|
|
|
432
460
|
"z-index": 1e5,
|
|
433
461
|
...positionStyles(),
|
|
434
462
|
...renderProps.style()
|
|
435
|
-
}} data-placement={renderedPlacement()} data-entering={isEntering()
|
|
463
|
+
}} data-placement={renderedPlacement()} data-entering={dataAttr(isEntering())} data-exiting={dataAttr(props.isExiting)}>
|
|
436
464
|
{renderProps.renderChildren()}
|
|
437
465
|
</div>
|
|
438
466
|
</OverlayContainer>;
|
|
439
467
|
}
|
|
440
|
-
function resolvePlacement(placement) {
|
|
441
|
-
if (placement === "start") return
|
|
442
|
-
if (placement === "end") return
|
|
468
|
+
function resolvePlacement(placement, direction) {
|
|
469
|
+
if (placement === "start") return direction === "rtl" ? "right" : "left";
|
|
470
|
+
if (placement === "end") return direction === "rtl" ? "left" : "right";
|
|
443
471
|
return placement;
|
|
444
472
|
}
|
|
445
|
-
function getDocumentDirection() {
|
|
446
|
-
if (typeof document === "undefined") return "ltr";
|
|
447
|
-
return document.documentElement.dir === "rtl" ? "rtl" : "ltr";
|
|
448
|
-
}
|
|
449
473
|
function maybeFlipPlacement(placement, triggerRect, tooltipWidth, tooltipHeight, viewportWidth, viewportHeight, containerPadding, offset, shouldFlip) {
|
|
450
474
|
if (!shouldFlip) return placement;
|
|
451
475
|
switch (placement) {
|