@neut/ui 0.0.12 → 0.0.14
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/dist/components/calendar/Calendar/Calendar.d.ts +10 -0
- package/dist/components/calendar/Calendar/Calendar.js +306 -0
- package/dist/components/calendar/Calendar/Calendar.js.map +1 -0
- package/dist/components/calendar/Calendar/Calendar.types.d.ts +62 -0
- package/dist/components/calendar/Calendar/Calendar.utils.d.ts +21 -0
- package/dist/components/calendar/Calendar/Calendar.utils.js +68 -0
- package/dist/components/calendar/Calendar/Calendar.utils.js.map +1 -0
- package/dist/components/calendar/Calendar/index.d.ts +2 -0
- package/dist/components/calendar/index.d.ts +2 -0
- package/dist/components/calendar/index.js +2 -0
- package/dist/components/combobox/Combobox/Combobox.context.d.ts +3 -0
- package/dist/components/combobox/Combobox/Combobox.context.js +12 -0
- package/dist/components/combobox/Combobox/Combobox.context.js.map +1 -0
- package/dist/components/combobox/Combobox/Combobox.d.ts +3 -0
- package/dist/components/combobox/Combobox/Combobox.js +60 -0
- package/dist/components/combobox/Combobox/Combobox.js.map +1 -0
- package/dist/components/combobox/Combobox/Combobox.types.d.ts +40 -0
- package/dist/components/combobox/Combobox/index.d.ts +2 -0
- package/dist/components/combobox/ComboboxChip/ComboboxChip.d.ts +7 -0
- package/dist/components/combobox/ComboboxChip/ComboboxChip.js +35 -0
- package/dist/components/combobox/ComboboxChip/ComboboxChip.js.map +1 -0
- package/dist/components/combobox/ComboboxChip/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxChips/ComboboxChips.d.ts +5 -0
- package/dist/components/combobox/ComboboxChips/ComboboxChips.js +16 -0
- package/dist/components/combobox/ComboboxChips/ComboboxChips.js.map +1 -0
- package/dist/components/combobox/ComboboxChips/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.d.ts +4 -0
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js +27 -0
- package/dist/components/combobox/ComboboxChipsInput/ComboboxChipsInput.js.map +1 -0
- package/dist/components/combobox/ComboboxChipsInput/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxClear/ComboboxClear.d.ts +4 -0
- package/dist/components/combobox/ComboboxClear/ComboboxClear.js +30 -0
- package/dist/components/combobox/ComboboxClear/ComboboxClear.js.map +1 -0
- package/dist/components/combobox/ComboboxClear/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxCollection/ComboboxCollection.d.ts +5 -0
- package/dist/components/combobox/ComboboxCollection/ComboboxCollection.js +20 -0
- package/dist/components/combobox/ComboboxCollection/ComboboxCollection.js.map +1 -0
- package/dist/components/combobox/ComboboxCollection/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.d.ts +2 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.js +49 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.js.map +1 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.types.d.ts +12 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.utils.d.ts +2 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.utils.js +6 -0
- package/dist/components/combobox/ComboboxContent/ComboboxContent.utils.js.map +1 -0
- package/dist/components/combobox/ComboboxContent/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxContent/useComboboxContent.d.ts +13 -0
- package/dist/components/combobox/ComboboxContent/useComboboxContent.js +48 -0
- package/dist/components/combobox/ComboboxContent/useComboboxContent.js.map +1 -0
- package/dist/components/combobox/ComboboxEmpty/ComboboxEmpty.d.ts +5 -0
- package/dist/components/combobox/ComboboxEmpty/ComboboxEmpty.js +14 -0
- package/dist/components/combobox/ComboboxEmpty/ComboboxEmpty.js.map +1 -0
- package/dist/components/combobox/ComboboxEmpty/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxGroup/ComboboxGroup.d.ts +5 -0
- package/dist/components/combobox/ComboboxGroup/ComboboxGroup.js +13 -0
- package/dist/components/combobox/ComboboxGroup/ComboboxGroup.js.map +1 -0
- package/dist/components/combobox/ComboboxGroup/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxInput/ComboboxInput.d.ts +9 -0
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js +85 -0
- package/dist/components/combobox/ComboboxInput/ComboboxInput.js.map +1 -0
- package/dist/components/combobox/ComboboxInput/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxItem/ComboboxItem.d.ts +7 -0
- package/dist/components/combobox/ComboboxItem/ComboboxItem.js +40 -0
- package/dist/components/combobox/ComboboxItem/ComboboxItem.js.map +1 -0
- package/dist/components/combobox/ComboboxItem/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxLabel/ComboboxLabel.d.ts +5 -0
- package/dist/components/combobox/ComboboxLabel/ComboboxLabel.js +14 -0
- package/dist/components/combobox/ComboboxLabel/ComboboxLabel.js.map +1 -0
- package/dist/components/combobox/ComboboxLabel/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxList/ComboboxList.d.ts +5 -0
- package/dist/components/combobox/ComboboxList/ComboboxList.js +22 -0
- package/dist/components/combobox/ComboboxList/ComboboxList.js.map +1 -0
- package/dist/components/combobox/ComboboxList/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxSeparator/ComboboxSeparator.d.ts +3 -0
- package/dist/components/combobox/ComboboxSeparator/ComboboxSeparator.js +14 -0
- package/dist/components/combobox/ComboboxSeparator/ComboboxSeparator.js.map +1 -0
- package/dist/components/combobox/ComboboxSeparator/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.d.ts +6 -0
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js +34 -0
- package/dist/components/combobox/ComboboxTrigger/ComboboxTrigger.js.map +1 -0
- package/dist/components/combobox/ComboboxTrigger/index.d.ts +1 -0
- package/dist/components/combobox/ComboboxValue/ComboboxValue.d.ts +5 -0
- package/dist/components/combobox/ComboboxValue/ComboboxValue.js +15 -0
- package/dist/components/combobox/ComboboxValue/ComboboxValue.js.map +1 -0
- package/dist/components/combobox/ComboboxValue/index.d.ts +1 -0
- package/dist/components/combobox/index.d.ts +18 -0
- package/dist/components/combobox/index.js +18 -0
- package/dist/components/combobox/useComboboxAnchor/index.d.ts +1 -0
- package/dist/components/combobox/useComboboxAnchor/useComboboxAnchor.d.ts +1 -0
- package/dist/components/combobox/useComboboxAnchor/useComboboxAnchor.js +9 -0
- package/dist/components/combobox/useComboboxAnchor/useComboboxAnchor.js.map +1 -0
- package/dist/components/date-picker/DatePicker/DatePicker.d.ts +11 -0
- package/dist/components/date-picker/DatePicker/DatePicker.js +136 -0
- package/dist/components/date-picker/DatePicker/DatePicker.js.map +1 -0
- package/dist/components/date-picker/DatePicker/DatePicker.types.d.ts +32 -0
- package/dist/components/date-picker/DatePicker/index.d.ts +2 -0
- package/dist/components/date-picker/index.d.ts +2 -0
- package/dist/components/date-picker/index.js +2 -0
- package/dist/components/dialog/Dialog/Dialog.context.d.ts +2 -1
- package/dist/components/dialog/Dialog/Dialog.context.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.js +21 -12
- package/dist/components/dialog/Dialog/Dialog.js.map +1 -1
- package/dist/components/dialog/Dialog/Dialog.types.d.ts +13 -1
- package/dist/components/dialog/Dialog/index.d.ts +1 -0
- package/dist/components/dialog/DialogTrigger/DialogTrigger.d.ts +4 -2
- package/dist/components/dialog/DialogTrigger/DialogTrigger.js +27 -6
- package/dist/components/dialog/DialogTrigger/DialogTrigger.js.map +1 -1
- package/dist/components/dialog/DialogTrigger/DialogTrigger.types.d.ts +3 -0
- package/dist/components/dialog/DialogTrigger/index.d.ts +3 -0
- package/dist/components/dialog/DialogTrigger/useDialogTrigger.d.ts +13 -2
- package/dist/components/dialog/DialogTrigger/useDialogTrigger.js +15 -19
- package/dist/components/dialog/DialogTrigger/useDialogTrigger.js.map +1 -1
- package/dist/components/dialog/index.js +3 -2
- package/dist/components/empty/Empty/Empty.d.ts +2 -0
- package/dist/components/empty/Empty/Empty.js +18 -0
- package/dist/components/empty/Empty/Empty.js.map +1 -0
- package/dist/components/empty/Empty/index.d.ts +1 -0
- package/dist/components/empty/EmptyContent/EmptyContent.d.ts +2 -0
- package/dist/components/empty/EmptyContent/EmptyContent.js +18 -0
- package/dist/components/empty/EmptyContent/EmptyContent.js.map +1 -0
- package/dist/components/empty/EmptyContent/index.d.ts +1 -0
- package/dist/components/empty/EmptyDescription/EmptyDescription.d.ts +2 -0
- package/dist/components/empty/EmptyDescription/EmptyDescription.js +18 -0
- package/dist/components/empty/EmptyDescription/EmptyDescription.js.map +1 -0
- package/dist/components/empty/EmptyDescription/index.d.ts +1 -0
- package/dist/components/empty/EmptyHeader/EmptyHeader.d.ts +2 -0
- package/dist/components/empty/EmptyHeader/EmptyHeader.js +18 -0
- package/dist/components/empty/EmptyHeader/EmptyHeader.js.map +1 -0
- package/dist/components/empty/EmptyHeader/index.d.ts +1 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.d.ts +4 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.js +27 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.js.map +1 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.styles.d.ts +3 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.styles.js +13 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.styles.js.map +1 -0
- package/dist/components/empty/EmptyMedia/EmptyMedia.types.d.ts +3 -0
- package/dist/components/empty/EmptyMedia/index.d.ts +2 -0
- package/dist/components/empty/EmptyTitle/EmptyTitle.d.ts +2 -0
- package/dist/components/empty/EmptyTitle/EmptyTitle.js +18 -0
- package/dist/components/empty/EmptyTitle/EmptyTitle.js.map +1 -0
- package/dist/components/empty/EmptyTitle/index.d.ts +1 -0
- package/dist/components/empty/index.d.ts +7 -0
- package/dist/components/empty/index.js +7 -0
- package/dist/components/image/Image.utils.js.map +1 -1
- package/dist/components/popover/Popover/Popover.context.d.ts +3 -0
- package/dist/components/popover/Popover/Popover.context.js +12 -0
- package/dist/components/popover/Popover/Popover.context.js.map +1 -0
- package/dist/components/popover/Popover/Popover.d.ts +18 -0
- package/dist/components/popover/Popover/Popover.js +37 -0
- package/dist/components/popover/Popover/Popover.js.map +1 -0
- package/dist/components/popover/Popover/Popover.types.d.ts +24 -0
- package/dist/components/popover/Popover/index.d.ts +3 -0
- package/dist/components/popover/PopoverContent/PopoverContent.d.ts +6 -0
- package/dist/components/popover/PopoverContent/PopoverContent.js +72 -0
- package/dist/components/popover/PopoverContent/PopoverContent.js.map +1 -0
- package/dist/components/popover/PopoverContent/PopoverContent.types.d.ts +16 -0
- package/dist/components/popover/PopoverContent/PopoverContent.utils.d.ts +20 -0
- package/dist/components/popover/PopoverContent/PopoverContent.utils.js +36 -0
- package/dist/components/popover/PopoverContent/PopoverContent.utils.js.map +1 -0
- package/dist/components/popover/PopoverContent/index.d.ts +6 -0
- package/dist/components/popover/PopoverContent/usePopoverContent.d.ts +11 -0
- package/dist/components/popover/PopoverContent/usePopoverContent.js +42 -0
- package/dist/components/popover/PopoverContent/usePopoverContent.js.map +1 -0
- package/dist/components/popover/PopoverDescription/PopoverDescription.d.ts +2 -0
- package/dist/components/popover/PopoverDescription/PopoverDescription.js +18 -0
- package/dist/components/popover/PopoverDescription/PopoverDescription.js.map +1 -0
- package/dist/components/popover/PopoverDescription/index.d.ts +1 -0
- package/dist/components/popover/PopoverHeader/PopoverHeader.d.ts +2 -0
- package/dist/components/popover/PopoverHeader/PopoverHeader.js +18 -0
- package/dist/components/popover/PopoverHeader/PopoverHeader.js.map +1 -0
- package/dist/components/popover/PopoverHeader/index.d.ts +1 -0
- package/dist/components/popover/PopoverTitle/PopoverTitle.d.ts +2 -0
- package/dist/components/popover/PopoverTitle/PopoverTitle.js +18 -0
- package/dist/components/popover/PopoverTitle/PopoverTitle.js.map +1 -0
- package/dist/components/popover/PopoverTitle/index.d.ts +1 -0
- package/dist/components/popover/PopoverTrigger/PopoverTrigger.d.ts +4 -0
- package/dist/components/popover/PopoverTrigger/PopoverTrigger.js +35 -0
- package/dist/components/popover/PopoverTrigger/PopoverTrigger.js.map +1 -0
- package/dist/components/popover/PopoverTrigger/PopoverTrigger.types.d.ts +3 -0
- package/dist/components/popover/PopoverTrigger/index.d.ts +4 -0
- package/dist/components/popover/PopoverTrigger/usePopoverTrigger.d.ts +14 -0
- package/dist/components/popover/PopoverTrigger/usePopoverTrigger.js +35 -0
- package/dist/components/popover/PopoverTrigger/usePopoverTrigger.js.map +1 -0
- package/dist/components/popover/index.d.ts +9 -0
- package/dist/components/popover/index.js +7 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.context.d.ts +3 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.context.js +12 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.context.js.map +1 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.d.ts +15 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.js +56 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.js.map +1 -0
- package/dist/components/radio-group/RadioGroup/RadioGroup.types.d.ts +22 -0
- package/dist/components/radio-group/RadioGroup/index.d.ts +3 -0
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.d.ts +6 -0
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js +80 -0
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.js.map +1 -0
- package/dist/components/radio-group/RadioGroupItem/RadioGroupItem.types.d.ts +9 -0
- package/dist/components/radio-group/RadioGroupItem/index.d.ts +2 -0
- package/dist/components/radio-group/index.d.ts +4 -0
- package/dist/components/radio-group/index.js +3 -0
- package/dist/components/select/Select/Select.context.d.ts +3 -3
- package/dist/components/select/Select/Select.context.js.map +1 -1
- package/dist/components/select/Select/Select.d.ts +5 -2
- package/dist/components/select/Select/Select.js +1 -1
- package/dist/components/select/Select/Select.js.map +1 -1
- package/dist/components/select/Select/Select.types.d.ts +19 -15
- package/dist/components/select/Select/index.d.ts +1 -1
- package/dist/components/select/SelectContent/SelectContent.js +2 -2
- package/dist/components/select/SelectContent/SelectContent.js.map +1 -1
- package/dist/components/select/SelectContent/SelectContent.utils.d.ts +2 -1
- package/dist/components/select/SelectContent/SelectContent.utils.js +2 -2
- package/dist/components/select/SelectContent/SelectContent.utils.js.map +1 -1
- package/dist/components/select/SelectContent/useSelectContent.js +6 -2
- package/dist/components/select/SelectContent/useSelectContent.js.map +1 -1
- package/dist/components/select/SelectItem/SelectItem.js +1 -1
- package/dist/components/select/SelectItem/SelectItem.js.map +1 -1
- package/dist/components/select/SelectItem/SelectItem.types.d.ts +3 -2
- package/dist/components/select/SelectItem/useSelectItem.d.ts +2 -1
- package/dist/components/select/SelectItem/useSelectItem.js +1 -1
- package/dist/components/select/SelectItem/useSelectItem.js.map +1 -1
- package/dist/components/select/SelectValue/SelectValue.js +1 -1
- package/dist/components/select/SelectValue/SelectValue.js.map +1 -1
- package/dist/components/toast/Toast/Toast.d.ts +3 -0
- package/dist/components/toast/Toast/Toast.js +181 -0
- package/dist/components/toast/Toast/Toast.js.map +1 -0
- package/dist/components/toast/Toast/Toast.styles.d.ts +6 -0
- package/dist/components/toast/Toast/Toast.styles.js +27 -0
- package/dist/components/toast/Toast/Toast.styles.js.map +1 -0
- package/dist/components/toast/Toast/Toast.types.d.ts +90 -0
- package/dist/components/toast/Toast/Toast.types.js +6 -0
- package/dist/components/toast/Toast/Toast.types.js.map +1 -0
- package/dist/components/toast/Toast/index.d.ts +2 -0
- package/dist/components/toast/{components → Toaster}/Toaster.d.ts +1 -1
- package/dist/components/toast/Toaster/Toaster.js +102 -0
- package/dist/components/toast/Toaster/Toaster.js.map +1 -0
- package/dist/components/toast/Toaster/Toaster.styles.d.ts +1 -0
- package/dist/components/toast/Toaster/Toaster.styles.js +6 -0
- package/dist/components/toast/Toaster/Toaster.styles.js.map +1 -0
- package/dist/components/toast/Toaster/Toaster.types.d.ts +44 -0
- package/dist/components/toast/Toaster/Toaster.utils.d.ts +7 -0
- package/dist/components/toast/Toaster/Toaster.utils.js +33 -0
- package/dist/components/toast/Toaster/Toaster.utils.js.map +1 -0
- package/dist/components/toast/Toaster/index.d.ts +3 -0
- package/dist/components/toast/index.d.ts +5 -10
- package/dist/components/toast/index.js +4 -5
- package/dist/components/toast/state/index.d.ts +1 -0
- package/dist/components/toast/state/toast.d.ts +24 -0
- package/dist/components/toast/state/toast.js +116 -0
- package/dist/components/toast/state/toast.js.map +1 -0
- package/dist/components/toggle/Toggle/Toggle.d.ts +3 -0
- package/dist/components/toggle/Toggle/Toggle.js +49 -0
- package/dist/components/toggle/Toggle/Toggle.js.map +1 -0
- package/dist/components/toggle/Toggle/Toggle.styles.d.ts +4 -0
- package/dist/components/toggle/Toggle/Toggle.styles.js +23 -0
- package/dist/components/toggle/Toggle/Toggle.styles.js.map +1 -0
- package/dist/components/toggle/Toggle/Toggle.types.d.ts +12 -0
- package/dist/components/toggle/Toggle/index.d.ts +3 -0
- package/dist/components/toggle/index.d.ts +2 -0
- package/dist/components/toggle/index.js +3 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.d.ts +36 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js +40 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.context.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.d.ts +18 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js +94 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.d.ts +8 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js +7 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.styles.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroup/ToggleGroup.types.d.ts +104 -0
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.d.ts +8 -0
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js +25 -0
- package/dist/components/toggle-group/ToggleGroup/create-change-event-details.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroup/index.d.ts +3 -0
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.d.ts +17 -0
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js +47 -0
- package/dist/components/toggle-group/ToggleGroup/useToggleGroupKeyboard.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.d.ts +11 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js +88 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.d.ts +12 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js +7 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.js.map +1 -0
- package/dist/components/toggle-group/ToggleGroupItem/ToggleGroupItem.types.d.ts +20 -0
- package/dist/components/toggle-group/ToggleGroupItem/index.d.ts +2 -0
- package/dist/components/toggle-group/call-event-handler.d.ts +5 -0
- package/dist/components/toggle-group/call-event-handler.js +9 -0
- package/dist/components/toggle-group/call-event-handler.js.map +1 -0
- package/dist/components/toggle-group/index.d.ts +4 -0
- package/dist/components/toggle-group/index.js +3 -0
- package/dist/components/tooltip/Tooltip/Tooltip.js +51 -50
- package/dist/components/tooltip/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/tooltip/TooltipArrow/TooltipArrow.d.ts +3 -28
- package/dist/components/tooltip/TooltipArrow/TooltipArrow.js +13 -45
- package/dist/components/tooltip/TooltipArrow/TooltipArrow.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/TooltipContent.context.d.ts +2 -0
- package/dist/components/tooltip/TooltipContent/TooltipContent.context.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/TooltipContent.js +2 -1
- package/dist/components/tooltip/TooltipContent/TooltipContent.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/TooltipContent.types.d.ts +3 -2
- package/dist/components/tooltip/TooltipContent/TooltipContent.utils.d.ts +2 -1
- package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js +8 -4
- package/dist/components/tooltip/TooltipContent/TooltipContent.utils.js.map +1 -1
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js +20 -19
- package/dist/components/tooltip/TooltipContent/useTooltipContent.js.map +1 -1
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.context.d.ts +3 -0
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.context.js +10 -0
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.context.js.map +1 -0
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.d.ts +3 -0
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.js +20 -0
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.js.map +1 -0
- package/dist/components/tooltip/TooltipProvider/TooltipProvider.types.d.ts +11 -0
- package/dist/components/tooltip/TooltipProvider/index.d.ts +3 -0
- package/dist/components/tooltip/index.d.ts +2 -0
- package/dist/components/tooltip/index.js +7 -6
- package/dist/index.d.ts +8 -0
- package/dist/index.js +153 -115
- package/dist/ui.css +1 -1
- package/package.json +7 -6
- package/dist/components/toast/components/Assets.d.ts +0 -9
- package/dist/components/toast/components/Assets.js +0 -32
- package/dist/components/toast/components/Assets.js.map +0 -1
- package/dist/components/toast/components/Toast.d.ts +0 -3
- package/dist/components/toast/components/Toast.js +0 -152
- package/dist/components/toast/components/Toast.js.map +0 -1
- package/dist/components/toast/components/ToastActions.d.ts +0 -12
- package/dist/components/toast/components/ToastActions.js +0 -62
- package/dist/components/toast/components/ToastActions.js.map +0 -1
- package/dist/components/toast/components/ToastContent.d.ts +0 -9
- package/dist/components/toast/components/ToastContent.js +0 -36
- package/dist/components/toast/components/ToastContent.js.map +0 -1
- package/dist/components/toast/components/ToastIcon.d.ts +0 -9
- package/dist/components/toast/components/ToastIcon.js +0 -59
- package/dist/components/toast/components/ToastIcon.js.map +0 -1
- package/dist/components/toast/components/Toaster.js +0 -163
- package/dist/components/toast/components/Toaster.js.map +0 -1
- package/dist/components/toast/constants.d.ts +0 -16
- package/dist/components/toast/constants.js +0 -6
- package/dist/components/toast/constants.js.map +0 -1
- package/dist/components/toast/hooks/useSwipe.d.ts +0 -23
- package/dist/components/toast/hooks/useSwipe.js +0 -59
- package/dist/components/toast/hooks/useSwipe.js.map +0 -1
- package/dist/components/toast/hooks/useTheme.d.ts +0 -2
- package/dist/components/toast/hooks/useTheme.js +0 -22
- package/dist/components/toast/hooks/useTheme.js.map +0 -1
- package/dist/components/toast/hooks/useToastHeight.d.ts +0 -11
- package/dist/components/toast/hooks/useToastHeight.js +0 -35
- package/dist/components/toast/hooks/useToastHeight.js.map +0 -1
- package/dist/components/toast/hooks/useToastSubscription.d.ts +0 -5
- package/dist/components/toast/hooks/useToastSubscription.js +0 -38
- package/dist/components/toast/hooks/useToastSubscription.js.map +0 -1
- package/dist/components/toast/hooks/useToastTimer.d.ts +0 -11
- package/dist/components/toast/hooks/useToastTimer.js +0 -22
- package/dist/components/toast/hooks/useToastTimer.js.map +0 -1
- package/dist/components/toast/hooks/useToasterKeyboard.d.ts +0 -7
- package/dist/components/toast/hooks/useToasterKeyboard.js +0 -14
- package/dist/components/toast/hooks/useToasterKeyboard.js.map +0 -1
- package/dist/components/toast/hooks.d.ts +0 -13
- package/dist/components/toast/hooks.js +0 -37
- package/dist/components/toast/hooks.js.map +0 -1
- package/dist/components/toast/state.d.ts +0 -52
- package/dist/components/toast/state.js +0 -170
- package/dist/components/toast/state.js.map +0 -1
- package/dist/components/toast/types.d.ts +0 -168
- package/dist/components/toast/types.js +0 -6
- package/dist/components/toast/types.js.map +0 -1
- package/dist/components/toast/utils.d.ts +0 -10
- package/dist/components/toast/utils.js +0 -39
- package/dist/components/toast/utils.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleGroupItem.js","names":["mergeProps","onCleanup","onMount","splitProps","JSX","clsx","toggleVariants","callEventHandler","useToggleGroupContext","ToggleGroupValue","toggleGroupItemVariants","ToggleGroupItemProps","ToggleGroupItem","props","TValue","Element","ctx","merged","type","const","local","rest","elementRef","HTMLButtonElement","variant","size","pressed","isPressed","value","disabled","tabIndex","highlighted","highlightedValue","isUsable","undefined","isFirstEnabled","registerItem","element","_el$","_tmpl$","addEventListener","e","setHighlightedValue","onFocus","$$click","onClick","defaultPrevented","toggleItem","currentTarget","_$use","el","_$spread","_$mergeProps","tabindex","data-variant","data-size","data-spacing","spacing","data-pressed","data-disabled","data-state","aria-pressed","class","classList","_$insert","children","_$delegateEvents"],"sources":["../../../../src/components/toggle-group/ToggleGroupItem/ToggleGroupItem.tsx"],"sourcesContent":["import { mergeProps, onCleanup, onMount, splitProps, type JSX } from \"solid-js\";\nimport { clsx } from \"~/utils\";\nimport { toggleVariants } from \"~/components/toggle/Toggle/Toggle.styles\";\nimport { callEventHandler } from \"../call-event-handler\";\nimport { useToggleGroupContext } from \"../ToggleGroup/ToggleGroup.context\";\nimport type { ToggleGroupValue } from \"../ToggleGroup/ToggleGroup.types\";\nimport { toggleGroupItemVariants } from \"./ToggleGroupItem.styles\";\nimport type { ToggleGroupItemProps } from \"./ToggleGroupItem.types\";\n\n/**\n * ToggleGroupItem:ToggleGroup 内的两态按钮。\n *\n * - 选中值由 ToggleGroup 统一持有,点击通过 `ctx.toggleItem` 触发变更\n * - disabled 继承整组状态,可在 item 上单独禁用\n * - roving tabindex:整组只有一个 tab 停靠点,方向键在同组内移动焦点\n */\nexport function ToggleGroupItem<\n TValue extends ToggleGroupValue = ToggleGroupValue,\n>(props: ToggleGroupItemProps<TValue>): JSX.Element {\n // context 用宽值类型读取:item 无法从父级推导 group 的值类型,\n // 自己的 TValue 始终可以传给宽类型参数\n const ctx = useToggleGroupContext(\"ToggleGroupItem\");\n const merged = mergeProps({ type: \"button\" as const }, props);\n\n const [local, rest] = splitProps(merged, [\n \"value\",\n \"variant\",\n \"size\",\n \"class\",\n \"classList\",\n \"disabled\",\n \"type\",\n \"onClick\",\n \"onFocus\",\n \"children\",\n ]);\n\n let elementRef: HTMLButtonElement | undefined;\n\n // 组级未显式指定 variant/size 时,item 可单独覆盖\n const variant = () => ctx.variant() ?? local.variant ?? \"default\";\n const size = () => ctx.size() ?? local.size ?? \"default\";\n const pressed = () => ctx.isPressed(local.value);\n const disabled = () => ctx.disabled() || !!local.disabled;\n\n // roving tabindex:高亮 item 持 0;高亮缺失或指向不可用 item(disabled/卸载)时,\n // 首个可用 item 持 0 作为键盘起点,避免整组键盘不可达\n const tabIndex = () => {\n if (disabled()) return -1;\n const highlighted = ctx.highlightedValue();\n if (highlighted === local.value && ctx.isUsable(local.value)) return 0;\n if (\n (highlighted === undefined || !ctx.isUsable(highlighted)) &&\n ctx.isFirstEnabled(local.value)\n ) {\n return 0;\n }\n return -1;\n };\n\n onMount(() => {\n onCleanup(\n ctx.registerItem({\n value: local.value,\n disabled,\n element: elementRef!,\n }),\n );\n });\n\n return (\n <button\n ref={(el) => {\n elementRef = el;\n }}\n type={local.type}\n disabled={disabled()}\n tabindex={tabIndex()}\n data-slot=\"toggle-group-item\"\n data-variant={variant()}\n data-size={size()}\n data-spacing={ctx.spacing()}\n data-pressed={pressed() ? \"\" : null}\n data-disabled={disabled() ? \"\" : null}\n data-state={pressed() ? \"on\" : \"off\"}\n aria-pressed={pressed()}\n class={clsx(\n toggleVariants({ variant: variant(), size: size() }),\n toggleGroupItemVariants(),\n local.class,\n )}\n classList={local.classList}\n onClick={(e) => {\n // 用户回调优先,可用 preventDefault() 阻止本次选中\n callEventHandler(local.onClick, e);\n if (!e.defaultPrevented && !disabled()) {\n ctx.toggleItem(local.value, e, e.currentTarget);\n }\n }}\n onFocus={(e) => {\n // 聚焦更新高亮(roving focus 起点)\n if (!disabled()) ctx.setHighlightedValue(local.value);\n callEventHandler(local.onFocus, e);\n }}\n {...rest}\n >\n {local.children}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;AAgBA,SAAgBY,EAEdC,GAAkD;CAGlD,IAAMG,IAAMR,EAAsB,iBAAiB,GAC7CS,IAASjB,EAAW,EAAEkB,MAAM,SAAkB,GAAGL,CAAK,GAEtD,CAACO,GAAOC,KAAQlB,EAAWc,GAAQ;EACvC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX,GAEGK,GAGEE,UAAgBR,EAAIQ,QAAQ,KAAKJ,EAAMI,WAAW,WAClDC,UAAaT,EAAIS,KAAK,KAAKL,EAAMK,QAAQ,WACzCC,UAAgBV,EAAIW,UAAUP,EAAMQ,KAAK,GACzCC,UAAiBb,EAAIa,SAAS,KAAK,CAAC,CAACT,EAAMS,UAI3CC,UAAiB;EACrB,IAAID,EAAS,GAAG,OAAO;EACvB,IAAME,IAAcf,EAAIgB,iBAAiB;EAQzC,OAPID,MAAgBX,EAAMQ,SAASZ,EAAIiB,SAASb,EAAMQ,KAAK,MAExDG,MAAgBG,KAAAA,KAAa,CAAClB,EAAIiB,SAASF,CAAW,MACvDf,EAAImB,eAAef,EAAMQ,KAAK,IAEvB,IAEF;CACT;CAYA,OAVA1B,QAAc;EACZD,EACEe,EAAIoB,aAAa;GACfR,OAAOR,EAAMQ;GACbC;GACAQ,SAASf;EACX,CAAC,CACH;CACF,CAAC,UAED;EAAA,IAAAgB,IAAAC,EAAA;EAoCmB,OApCnBD,EAAAE,iBAAA,UA6BcC,MAAM;GAGdlC,AADKsB,EAAS,KAAGb,EAAI0B,oBAAoBtB,EAAMQ,KAAK,GACpDrB,EAAiBa,EAAMuB,SAASF,CAAC;EACnC,CAAC,GAAAH,EAAAM,WAXSH,MAAM;GAGd,AADAlC,EAAiBa,EAAMyB,SAASJ,CAAC,GAC7B,CAACA,EAAEK,oBAAoB,CAACjB,EAAS,KACnCb,EAAI+B,WAAW3B,EAAMQ,OAAOa,GAAGA,EAAEO,aAAa;EAElD,GAACC,GA1BKC,MAAO;GACX5B,IAAa4B;EACf,GAACZ,CAAA,GAAAa,EAAAb,GAAAc,EAAA;GAAA,IACDlC,OAAI;IAAA,OAAEE,EAAMF;GAAI;GAAA,IAChBW,WAAQ;IAAA,OAAEA,EAAS;GAAC;GAAA,IACpBwB,WAAQ;IAAA,OAAEvB,EAAS;GAAC;GAAA,IAAA,iBAAA;IAAA,OAENN,EAAQ;GAAC;GAAA,IAAA,cAAA;IAAA,OACZC,EAAK;GAAC;GAAA,IAAA,iBAAA;IAAA,OACHT,EAAIyC,QAAQ;GAAC;GAAA,IAAA,iBAAA;IAAA,OACb/B,EAAQ,IAAI,KAAK;GAAI;GAAA,IAAA,kBAAA;IAAA,OACpBG,EAAS,IAAI,KAAK;GAAI;GAAA,IAAA,eAAA;IAAA,OACzBH,EAAQ,IAAI,OAAO;GAAK;GAAA,IAAA,iBAAA;IAAA,OACtBA,EAAQ;GAAC;GAAA,IAAA,QAAA;IAAA,OAChBrB,EACLC,EAAe;KAAEkB,SAASA,EAAQ;KAAGC,MAAMA,EAAK;IAAE,CAAC,GACnDf,EAAwB,GACxBU,EAAM0C,KACR;GAAC;GAAA,IACDC,YAAS;IAAA,OAAE3C,EAAM2C;GAAS;EAAA,GAatB1C,CAAI,GAAA,IAAA,EAAA,GAAA2C,EAAA1B,SAEPlB,EAAM6C,QAAQ,GAAA3B;CAAA,EAAA,CAAA;AAGrB;AAAC4B,EAAA,CAAA,OAAA,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ToggleGroupItem 位于 ToggleGroup 内时需要的“拼接态”样式。
|
|
3
|
+
*
|
|
4
|
+
* 依赖根元素上的钩子:
|
|
5
|
+
* - `group-data-[spacing=0]/toggle-group`:spacing 为 0 时相邻 item 拼接为整体
|
|
6
|
+
* - `data-[spacing=0]`:item 自身的 data-spacing(shadcn 同样在 item 上输出)
|
|
7
|
+
* - `group-data-horizontal|vertical/toggle-group`:按方向决定首尾圆角/边框
|
|
8
|
+
* - `data-[variant=outline]`:outline 拼接时只保留内侧边框
|
|
9
|
+
*
|
|
10
|
+
* variant / size 的基础样式仍由 `toggleVariants` 提供,这里只补“组合关系”。
|
|
11
|
+
*/
|
|
12
|
+
export declare const toggleGroupItemVariants: (props?: import('class-variance-authority/types').ClassProp | undefined) => string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { cva as e } from "class-variance-authority";
|
|
2
|
+
//#region src/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.ts
|
|
3
|
+
var t = e("shrink-0 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t");
|
|
4
|
+
//#endregion
|
|
5
|
+
export { t as toggleGroupItemVariants };
|
|
6
|
+
|
|
7
|
+
//# sourceMappingURL=ToggleGroupItem.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleGroupItem.styles.js","names":[],"sources":["../../../../src/components/toggle-group/ToggleGroupItem/ToggleGroupItem.styles.ts"],"sourcesContent":["import { cva } from \"class-variance-authority\";\n\n/**\n * ToggleGroupItem 位于 ToggleGroup 内时需要的“拼接态”样式。\n *\n * 依赖根元素上的钩子:\n * - `group-data-[spacing=0]/toggle-group`:spacing 为 0 时相邻 item 拼接为整体\n * - `data-[spacing=0]`:item 自身的 data-spacing(shadcn 同样在 item 上输出)\n * - `group-data-horizontal|vertical/toggle-group`:按方向决定首尾圆角/边框\n * - `data-[variant=outline]`:outline 拼接时只保留内侧边框\n *\n * variant / size 的基础样式仍由 `toggleVariants` 提供,这里只补“组合关系”。\n */\nexport const toggleGroupItemVariants = cva(\n \"shrink-0 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t\",\n);\n"],"mappings":";;AAaA,IAAa,IAA0B,EACrC,k4BACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { VariantProps } from 'class-variance-authority';
|
|
2
|
+
import { ComponentProps } from 'solid-js';
|
|
3
|
+
import { toggleVariants } from '../../toggle/Toggle/Toggle.styles';
|
|
4
|
+
import { HTMLAttributes, PolymorphicProps } from '../../../types';
|
|
5
|
+
import { ToggleGroupValue } from '../ToggleGroup/ToggleGroup.types';
|
|
6
|
+
type BaseToggleGroupItemProps<TValue extends ToggleGroupValue> = VariantProps<typeof toggleVariants> & HTMLAttributes<"button"> & {
|
|
7
|
+
/** 当前 item 的唯一值,类型由泛型参数决定(与所属 ToggleGroup 保持一致) */
|
|
8
|
+
value: TValue;
|
|
9
|
+
/** 组件内部会先处理选中,再调用用户回调(与 tabs 的 trigger 一致) */
|
|
10
|
+
onClick?: ComponentProps<"button">["onClick"];
|
|
11
|
+
/** 聚焦即更新 roving focus 高亮,用户回调会被一并调用 */
|
|
12
|
+
onFocus?: ComponentProps<"button">["onFocus"];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* 泛型参数约束 `value` 的类型(默认 `string | number`)。
|
|
16
|
+
* 子组件无法从父级 `ToggleGroup` 推导类型,因此这里由 `value` 自身推导,
|
|
17
|
+
* 或显式指定:`<ToggleGroupItem<"bold" | "italic"> value="bold" />`。
|
|
18
|
+
*/
|
|
19
|
+
export type ToggleGroupItemProps<TValue extends ToggleGroupValue = ToggleGroupValue> = PolymorphicProps<"button", BaseToggleGroupItemProps<TValue>, false>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/components/toggle-group/call-event-handler.ts
|
|
2
|
+
function e(e, t) {
|
|
3
|
+
let n = Array.isArray(e) ? e : [e];
|
|
4
|
+
for (let e of n) typeof e == "function" && e(t);
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { e as callEventHandler };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=call-event-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-event-handler.js","names":[],"sources":["../../../src/components/toggle-group/call-event-handler.ts"],"sourcesContent":["/**\n * 调用用户传入的事件处理器(兼容 Solid 的函数 / 函数数组 / bound 对象形式)。\n * splitProps 提取出的事件类型是 EventHandlerUnion,不能直接调用。\n */\nexport function callEventHandler<E extends Event>(\n handler: unknown,\n event: E,\n): void {\n const list = Array.isArray(handler) ? handler : [handler];\n for (const h of list) {\n if (typeof h === \"function\") (h as (e: E) => void)(event);\n }\n}\n"],"mappings":";AAIA,SAAgB,EACd,GACA,GACM;CACN,IAAM,IAAO,MAAM,QAAQ,CAAO,IAAI,IAAU,CAAC,CAAO;CACxD,KAAK,IAAM,KAAK,GACd,AAAI,OAAO,KAAM,cAAY,EAAsB,CAAK;AAE5D"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ToggleGroup } from './ToggleGroup';
|
|
2
|
+
export type { ToggleGroupProps, ToggleGroupValue, ToggleGroupContextValue, ToggleGroupItemEntry, ToggleGroupOrientation, ToggleGroupVariant, ToggleGroupSize, ToggleGroupChangeEventDetails, ToggleGroupChangeEventReason, } from './ToggleGroup';
|
|
3
|
+
export { ToggleGroupItem } from './ToggleGroupItem';
|
|
4
|
+
export type { ToggleGroupItemProps } from './ToggleGroupItem';
|
|
@@ -1,70 +1,71 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { useTooltipProviderContext as e } from "../TooltipProvider/TooltipProvider.context.js";
|
|
2
|
+
import { TooltipContext as t } from "./Tooltip.context.js";
|
|
3
|
+
import { useTooltipGroupContext as n } from "../TooltipGroup/TooltipGroup.context.js";
|
|
4
|
+
import { createComponent as r } from "solid-js/web";
|
|
5
|
+
import { createEffect as i, createMemo as a, createSignal as o, createUniqueId as s, onCleanup as c } from "solid-js";
|
|
5
6
|
//#region src/components/tooltip/Tooltip/Tooltip.tsx
|
|
6
|
-
var
|
|
7
|
-
function
|
|
8
|
-
let
|
|
9
|
-
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
},
|
|
13
|
-
if (
|
|
14
|
-
let e =
|
|
7
|
+
var l = 0, u = 150;
|
|
8
|
+
function d(d) {
|
|
9
|
+
let f = n(), p = e(), [m, h] = o(d.defaultOpen ?? !1), g = a(() => d.open === void 0 ? m() : d.open), _ = a(() => !!d.disabled), [v, y] = o(), [b, x] = o(), [S, C] = o(), [w, T] = o(!1), E = (e) => {
|
|
10
|
+
d.open === void 0 && h(e), d.onOpenChange?.(e);
|
|
11
|
+
}, D, O, k = () => {
|
|
12
|
+
D !== void 0 && (window.clearTimeout(D), D = void 0), O !== void 0 && (window.clearTimeout(O), O = void 0);
|
|
13
|
+
}, A = () => {
|
|
14
|
+
if (k(), _() || g()) return;
|
|
15
|
+
let e = f?.claim();
|
|
15
16
|
if (e) {
|
|
16
|
-
|
|
17
|
+
C(e), E(!0);
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
}, k = () => {
|
|
21
|
-
D(), E = window.setTimeout(() => w(!1), u.closeDelay ?? l);
|
|
22
|
-
}, A = () => {
|
|
23
|
-
h() || (D(), w(!0));
|
|
20
|
+
D = window.setTimeout(() => E(!0), d.openDelay ?? p?.delay() ?? l);
|
|
24
21
|
}, j = () => {
|
|
25
|
-
|
|
22
|
+
k(), O = window.setTimeout(() => E(!1), d.closeDelay ?? p?.closeDelay() ?? u);
|
|
26
23
|
}, M = () => {
|
|
27
|
-
|
|
24
|
+
_() || (k(), E(!0));
|
|
28
25
|
}, N = () => {
|
|
29
|
-
|
|
26
|
+
k(), E(!1);
|
|
27
|
+
}, P = () => {
|
|
28
|
+
T(!0), k(), E(!1);
|
|
29
|
+
}, F = () => {
|
|
30
|
+
O !== void 0 && (window.clearTimeout(O), O = void 0);
|
|
30
31
|
};
|
|
31
|
-
|
|
32
|
-
if (!
|
|
33
|
-
let e =
|
|
34
|
-
rect: () =>
|
|
35
|
-
forceClose:
|
|
32
|
+
c(k), i(() => {
|
|
33
|
+
if (!f || !g()) return;
|
|
34
|
+
let e = f.registerActive({
|
|
35
|
+
rect: () => b()?.getBoundingClientRect(),
|
|
36
|
+
forceClose: P
|
|
36
37
|
});
|
|
37
|
-
|
|
38
|
+
c(e);
|
|
38
39
|
});
|
|
39
|
-
let
|
|
40
|
-
open:
|
|
41
|
-
disabled:
|
|
42
|
-
contentId: `tooltip-${
|
|
43
|
-
reference:
|
|
44
|
-
setReference:
|
|
45
|
-
floating:
|
|
46
|
-
setFloating:
|
|
47
|
-
requestOpen:
|
|
48
|
-
requestClose:
|
|
49
|
-
openImmediate:
|
|
50
|
-
closeImmediate:
|
|
51
|
-
keepOpen:
|
|
52
|
-
pendingSlideFrom:
|
|
53
|
-
clearPendingSlideFrom: () =>
|
|
54
|
-
suppressExitAnimation:
|
|
40
|
+
let I = {
|
|
41
|
+
open: g,
|
|
42
|
+
disabled: _,
|
|
43
|
+
contentId: `tooltip-${s()}`,
|
|
44
|
+
reference: v,
|
|
45
|
+
setReference: y,
|
|
46
|
+
floating: b,
|
|
47
|
+
setFloating: x,
|
|
48
|
+
requestOpen: A,
|
|
49
|
+
requestClose: j,
|
|
50
|
+
openImmediate: M,
|
|
51
|
+
closeImmediate: N,
|
|
52
|
+
keepOpen: F,
|
|
53
|
+
pendingSlideFrom: S,
|
|
54
|
+
clearPendingSlideFrom: () => C(void 0),
|
|
55
|
+
suppressExitAnimation: w,
|
|
55
56
|
consumeSuppressExitAnimation: () => {
|
|
56
|
-
let e =
|
|
57
|
-
return e &&
|
|
57
|
+
let e = w();
|
|
58
|
+
return e && T(!1), e;
|
|
58
59
|
}
|
|
59
60
|
};
|
|
60
|
-
return
|
|
61
|
-
value:
|
|
61
|
+
return r(t.Provider, {
|
|
62
|
+
value: I,
|
|
62
63
|
get children() {
|
|
63
|
-
return
|
|
64
|
+
return d.children;
|
|
64
65
|
}
|
|
65
66
|
});
|
|
66
67
|
}
|
|
67
68
|
//#endregion
|
|
68
|
-
export {
|
|
69
|
+
export { d as Tooltip };
|
|
69
70
|
|
|
70
71
|
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.js","names":["createSignal","createMemo","createUniqueId","createEffect","onCleanup","JSX","TooltipContext","useTooltipGroupContext","TooltipContextValue","TooltipProps","Rect","DEFAULT_OPEN_DELAY","DEFAULT_CLOSE_DELAY","Tooltip","props","Element","group","internalOpen","setInternalOpen","defaultOpen","open","undefined","disabled","reference","setReference","floating","setFloating","HTMLElement","pendingSlideFrom","setPendingSlideFrom","suppressExitAnimation","setSuppressExitAnimation","commit","next","onOpenChange","openTimer","closeTimer","clearTimers","window","clearTimeout","requestOpen","claimedRect","claim","setTimeout","openDelay","requestClose","closeDelay","openImmediate","closeImmediate","forceCloseForGroup","keepOpen","unregister","registerActive","rect","getBoundingClientRect","forceClose","contentId","ctx","clearPendingSlideFrom","consumeSuppressExitAnimation","value","_$createComponent","Provider","children"],"sources":["../../../../src/components/tooltip/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n createSignal,\n createMemo,\n createUniqueId,\n createEffect,\n onCleanup,\n type JSX,\n} from \"solid-js\";\nimport { TooltipContext } from \"./Tooltip.context\";\nimport { useTooltipGroupContext } from \"../TooltipGroup/TooltipGroup.context\";\nimport type { TooltipContextValue, TooltipProps } from \"./Tooltip.types\";\nimport type { Rect } from \"~/lib\";\n\nconst DEFAULT_OPEN_DELAY =
|
|
1
|
+
{"version":3,"file":"Tooltip.js","names":["createSignal","createMemo","createUniqueId","createEffect","onCleanup","JSX","TooltipContext","useTooltipProviderContext","useTooltipGroupContext","TooltipContextValue","TooltipProps","Rect","DEFAULT_OPEN_DELAY","DEFAULT_CLOSE_DELAY","Tooltip","props","Element","group","provider","internalOpen","setInternalOpen","defaultOpen","open","undefined","disabled","reference","setReference","floating","setFloating","HTMLElement","pendingSlideFrom","setPendingSlideFrom","suppressExitAnimation","setSuppressExitAnimation","commit","next","onOpenChange","openTimer","closeTimer","clearTimers","window","clearTimeout","requestOpen","claimedRect","claim","setTimeout","openDelay","delay","requestClose","closeDelay","openImmediate","closeImmediate","forceCloseForGroup","keepOpen","unregister","registerActive","rect","getBoundingClientRect","forceClose","contentId","ctx","clearPendingSlideFrom","consumeSuppressExitAnimation","value","_$createComponent","Provider","children"],"sources":["../../../../src/components/tooltip/Tooltip/Tooltip.tsx"],"sourcesContent":["import {\n createSignal,\n createMemo,\n createUniqueId,\n createEffect,\n onCleanup,\n type JSX,\n} from \"solid-js\";\nimport { TooltipContext } from \"./Tooltip.context\";\nimport { useTooltipProviderContext } from \"../TooltipProvider/TooltipProvider.context\";\nimport { useTooltipGroupContext } from \"../TooltipGroup/TooltipGroup.context\";\nimport type { TooltipContextValue, TooltipProps } from \"./Tooltip.types\";\nimport type { Rect } from \"~/lib\";\n\nconst DEFAULT_OPEN_DELAY = 0;\nconst DEFAULT_CLOSE_DELAY = 150;\n\n/**\n * Tooltip 根组件:不渲染任何 DOM,只负责状态管理 + 提供 context。\n * 真正的展示交给 <TooltipTrigger>/<TooltipContent>/<TooltipArrow>。\n *\n * 如果外面包了 <TooltipGroup>,组内相邻 trigger 之间切换 hover 会跳过\n * openDelay,并触发\"从旧位置滑到新位置\"的过渡(细节见 TooltipGroup.context.ts)。\n *\n * @example\n * ```tsx\n * <Tooltip openDelay={300}>\n * <TooltipTrigger>悬停我</TooltipTrigger>\n * <TooltipContent>\n * 提示内容\n * <TooltipArrow />\n * </TooltipContent>\n * </Tooltip>\n * ```\n */\nexport function Tooltip(props: TooltipProps): JSX.Element {\n const group = useTooltipGroupContext(); // undefined 是正常情况,代表没用 TooltipGroup\n const provider = useTooltipProviderContext();\n\n const [internalOpen, setInternalOpen] = createSignal(\n props.defaultOpen ?? false,\n );\n const open = createMemo(() =>\n props.open !== undefined ? props.open : internalOpen(),\n );\n const disabled = createMemo(() => !!props.disabled);\n\n const [reference, setReference] = createSignal<Element>();\n const [floating, setFloating] = createSignal<HTMLElement>();\n const [pendingSlideFrom, setPendingSlideFrom] = createSignal<Rect>();\n const [suppressExitAnimation, setSuppressExitAnimation] = createSignal(false);\n\n const commit = (next: boolean) => {\n if (props.open === undefined) setInternalOpen(next);\n props.onOpenChange?.(next);\n };\n\n // 用 window.setTimeout/clearTimeout(而不是裸的全局 setTimeout)显式拿到\n // DOM lib 的重载(返回 number),避免和 @types/node 的 NodeJS.Timeout 重载冲突。\n let openTimer: number | undefined;\n let closeTimer: number | undefined;\n\n const clearTimers = () => {\n if (openTimer !== undefined) {\n window.clearTimeout(openTimer);\n openTimer = undefined;\n }\n if (closeTimer !== undefined) {\n window.clearTimeout(closeTimer);\n closeTimer = undefined;\n }\n };\n\n const requestOpen = () => {\n clearTimers();\n if (disabled() || open()) return;\n\n // 组内抢占:如果当前组里已经有一个活跃的 tooltip(哪怕它还在自己的\n // closeDelay 倒计时里,还没真正关闭),claim() 会立即强制关闭它、\n // 把它此刻的矩形要回来——这里直接跳过 openDelay,走\"滑入\"路径。\n const claimedRect = group?.claim();\n if (claimedRect) {\n setPendingSlideFrom(claimedRect);\n commit(true);\n return;\n }\n\n openTimer = window.setTimeout(\n () => commit(true),\n props.openDelay ?? provider?.delay() ?? DEFAULT_OPEN_DELAY,\n );\n };\n\n const requestClose = () => {\n clearTimers();\n closeTimer = window.setTimeout(\n () => commit(false),\n props.closeDelay ?? provider?.closeDelay() ?? DEFAULT_CLOSE_DELAY,\n );\n };\n\n const openImmediate = () => {\n if (disabled()) return;\n clearTimers();\n commit(true);\n };\n\n const closeImmediate = () => {\n clearTimers();\n commit(false);\n };\n\n /**\n * 专门给 <TooltipGroup> 抢占用的关闭方式:和 closeImmediate 的区别是,\n * 这里会额外标记 suppressExitAnimation,告诉 TooltipContent 的 Presence\n * 逻辑跳过退场动画、立即卸载——因为这次关闭是\"被新 tooltip 取代\",而不是\n * 用户主动关闭,旧的应该立刻让位,不该和正在滑入的新 tooltip 同时可见。\n * Escape/blur 等正常关闭场景依然走 closeImmediate,退场动画不受影响。\n */\n const forceCloseForGroup = () => {\n setSuppressExitAnimation(true);\n clearTimers();\n commit(false);\n };\n\n const keepOpen = () => {\n if (closeTimer !== undefined) {\n window.clearTimeout(closeTimer);\n closeTimer = undefined;\n }\n };\n\n onCleanup(clearTimers);\n\n // 打开期间把自己登记成\"组内当前活跃的 tooltip\",供其他 trigger 打开时\n // claim 走(触发平移过渡)。关闭或卸载时自动取消登记。\n createEffect(() => {\n if (!group || !open()) return;\n const unregister = group.registerActive({\n rect: () => floating()?.getBoundingClientRect(),\n forceClose: forceCloseForGroup,\n });\n onCleanup(unregister);\n });\n\n const contentId = `tooltip-${createUniqueId()}`;\n\n const ctx: TooltipContextValue = {\n open,\n disabled,\n contentId,\n reference,\n setReference,\n floating,\n setFloating,\n requestOpen,\n requestClose,\n openImmediate,\n closeImmediate,\n keepOpen,\n pendingSlideFrom,\n clearPendingSlideFrom: () => setPendingSlideFrom(undefined),\n suppressExitAnimation,\n consumeSuppressExitAnimation: () => {\n const value = suppressExitAnimation();\n if (value) setSuppressExitAnimation(false);\n return value;\n },\n };\n\n return (\n <TooltipContext.Provider value={ctx}>\n {props.children}\n </TooltipContext.Provider>\n );\n}\n"],"mappings":";;;;;;AAcA,IAAMY,IAAqB,GACrBC,IAAsB;AAoB5B,SAAgBC,EAAQC,GAAkC;CACxD,IAAME,IAAQT,EAAuB,GAC/BU,IAAWX,EAA0B,GAErC,CAACY,GAAcC,KAAmBpB,EACtCe,EAAMM,eAAe,EACvB,GACMC,IAAOrB,QACXc,EAAMO,SAASC,KAAAA,IAAyBJ,EAAa,IAA1BJ,EAAMO,IACnC,GACME,IAAWvB,QAAiB,CAAC,CAACc,EAAMS,QAAQ,GAE5C,CAACC,GAAWC,KAAgB1B,EAAsB,GAClD,CAAC2B,GAAUC,KAAe5B,EAA0B,GACpD,CAAC8B,GAAkBC,KAAuB/B,EAAmB,GAC7D,CAACgC,GAAuBC,KAA4BjC,EAAa,EAAK,GAEtEkC,KAAUC,MAAkB;EAEhCpB,AADIA,EAAMO,SAASC,KAAAA,KAAWH,EAAgBe,CAAI,GAClDpB,EAAMqB,eAAeD,CAAI;CAC3B,GAIIE,GACAC,GAEEC,UAAoB;EAKxB,AAJIF,MAAcd,KAAAA,MAChBiB,OAAOC,aAAaJ,CAAS,GAC7BA,IAAYd,KAAAA,IAEVe,MAAef,KAAAA,MACjBiB,OAAOC,aAAaH,CAAU,GAC9BA,IAAaf,KAAAA;CAEjB,GAEMmB,UAAoB;EAExB,IADAH,EAAY,GACRf,EAAS,KAAKF,EAAK,GAAG;EAK1B,IAAMqB,IAAc1B,GAAO2B,MAAM;EACjC,IAAID,GAAa;GAEfT,AADAH,EAAoBY,CAAW,GAC/BT,EAAO,EAAI;GACX;EACF;EAEAG,IAAYG,OAAOK,iBACXX,EAAO,EAAI,GACjBnB,EAAM+B,aAAa5B,GAAU6B,MAAM,KAAKnC,CAC1C;CACF,GAEMoC,UAAqB;EAEzBV,AADAC,EAAY,GACZD,IAAaE,OAAOK,iBACZX,EAAO,EAAK,GAClBnB,EAAMkC,cAAc/B,GAAU+B,WAAW,KAAKpC,CAChD;CACF,GAEMqC,UAAsB;EACtB1B,EAAS,MACbe,EAAY,GACZL,EAAO,EAAI;CACb,GAEMiB,UAAuB;EAE3BjB,AADAK,EAAY,GACZL,EAAO,EAAK;CACd,GASMkB,UAA2B;EAG/BlB,AAFAD,EAAyB,EAAI,GAC7BM,EAAY,GACZL,EAAO,EAAK;CACd,GAEMmB,UAAiB;EACrB,AAAIf,MAAef,KAAAA,MACjBiB,OAAOC,aAAaH,CAAU,GAC9BA,IAAaf,KAAAA;CAEjB;CAMApB,AAJAC,EAAUmC,CAAW,GAIrBpC,QAAmB;EACjB,IAAI,CAACc,KAAS,CAACK,EAAK,GAAG;EACvB,IAAMgC,IAAarC,EAAMsC,eAAe;GACtCC,YAAY7B,EAAS,CAAC,EAAE8B,sBAAsB;GAC9CC,YAAYN;EACd,CAAC;EACDhD,EAAUkD,CAAU;CACtB,CAAC;CAID,IAAMM,IAA2B;EAC/BtC;EACAE;EACAmC,WAAAA,WAL2BzD,EAAe;EAM1CuB;EACAC;EACAC;EACAC;EACAc;EACAM;EACAE;EACAC;EACAE;EACAvB;EACA+B,6BAA6B9B,EAAoBR,KAAAA,CAAS;EAC1DS;EACA8B,oCAAoC;GAClC,IAAMC,IAAQ/B,EAAsB;GAEpC,OADI+B,KAAO9B,EAAyB,EAAK,GAClC8B;EACT;CACF;CAEA,OAAAC,EACG1D,EAAe2D,UAAQ;EAACF,OAAOH;EAAG,IAAAM,WAAA;GAAA,OAChCnD,EAAMmD;EAAQ;CAAA,CAAA;AAGrB"}
|
|
@@ -1,34 +1,9 @@
|
|
|
1
1
|
export interface TooltipArrowProps {
|
|
2
|
-
/** 箭头沿 tooltip 边缘方向的长度(像素),默认 8 */
|
|
3
|
-
width?: number;
|
|
4
|
-
/** 箭头突出的深度(像素),默认 4 */
|
|
5
|
-
height?: number;
|
|
6
|
-
/**
|
|
7
|
-
* 箭头颜色(Tailwind text-* class,因为 SVG 用 fill="currentColor")。
|
|
8
|
-
* 不传的话默认跟 TooltipContent 的默认背景色一致;如果你自定义了
|
|
9
|
-
* TooltipContent 的背景色,记得这里也传一个匹配的颜色,两者不会自动同步。
|
|
10
|
-
*/
|
|
11
2
|
class?: string;
|
|
12
3
|
}
|
|
13
4
|
/**
|
|
14
|
-
* 箭头组件,必须渲染在 <TooltipContent>
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* 四个方向用四套独立坐标画三角形,而不是画一个形状再用 CSS rotate 复用——
|
|
19
|
-
* 这是有意的:arrow middleware 用 el.offsetWidth/offsetHeight 判断"沿边长度",
|
|
20
|
-
* 而 CSS transform 不会改变这两个值,如果靠 rotate(90deg) 让同一个 8x4 的形状
|
|
21
|
-
* "看起来"变成 4x8,offsetWidth/offsetHeight 读到的还是旋转前的 8x4,
|
|
22
|
-
* 会导致 left/right 方向的偏移计算对不上。直接让未旋转的 SVG 本身尺寸
|
|
23
|
-
* 就随方向切换(沿边方向用 width,突出方向用 height),从根上避免这个偏差。
|
|
24
|
-
*
|
|
25
|
-
* 进出场动画是箭头自己独立播放的一份(data-state + animate-in/out),
|
|
26
|
-
* 和 TooltipContent 内层元素用的是同一个 animationState 信号驱动,
|
|
27
|
-
* 保证两者严格同步开始/结束——而不是让箭头被动继承内层元素的动画。
|
|
28
|
-
* 后者看似更省事,但内层元素的 zoom-in-95 动画会给它加一个非 none 的
|
|
29
|
-
* transform,CSS 规范规定这会让内层变成子元素新的"包含块",这和箭头
|
|
30
|
-
* 故意跳过内层、以外层为基准定位的设计(避免触发滚动条那次的修复)相冲突,
|
|
31
|
-
* 动画播放期间"父子两层谁负责定位"这个假设会变得不可靠,箭头容易之前观察到
|
|
32
|
-
* "入场看起来比内容慢一拍"这类问题。独立播放同一份动画彻底避开这个耦合。
|
|
5
|
+
* 箭头组件,必须渲染在 <TooltipContent> 内部。
|
|
6
|
+
* 采用 shadcn Base UI 的定位方式:通过 data-side / data-align 和 CSS 变量
|
|
7
|
+
* 完成贴边与对齐,不手动计算 top/left。
|
|
33
8
|
*/
|
|
34
9
|
export declare function TooltipArrow(props: TooltipArrowProps): import("solid-js").JSX.Element;
|
|
@@ -1,58 +1,26 @@
|
|
|
1
1
|
import { clsx as e } from "../../../utils/clsx.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { getAlignment as t, getSide as n } from "../../../lib/positioner/core/placement.js";
|
|
3
|
+
import { useTooltipContentContext as r } from "../TooltipContent/TooltipContent.context.js";
|
|
4
|
+
import { className as i, effect as a, setAttribute as o, setStyleProperty as s, template as c, use as l } from "solid-js/web";
|
|
5
|
+
import { createMemo as u } from "solid-js";
|
|
4
6
|
//#region src/components/tooltip/TooltipArrow/TooltipArrow.tsx
|
|
5
|
-
var
|
|
6
|
-
function c
|
|
7
|
-
let
|
|
8
|
-
let e = l(), t = u();
|
|
9
|
-
switch (d()) {
|
|
10
|
-
case "top": return `0,0 ${e},0 ${e / 2},${t}`;
|
|
11
|
-
case "bottom": return `0,${t} ${e},${t} ${e / 2},0`;
|
|
12
|
-
case "left": return `0,0 0,${e} ${t},${e / 2}`;
|
|
13
|
-
default: return `${t},0 ${t},${e} 0,${e / 2}`;
|
|
14
|
-
}
|
|
15
|
-
}, h = () => {
|
|
16
|
-
let e = u(), t = f() ? p()?.x ?? 0 : p()?.y ?? 0;
|
|
17
|
-
switch (d()) {
|
|
18
|
-
case "top": return {
|
|
19
|
-
bottom: `-${e}px`,
|
|
20
|
-
left: `${t}px`
|
|
21
|
-
};
|
|
22
|
-
case "bottom": return {
|
|
23
|
-
top: `-${e}px`,
|
|
24
|
-
left: `${t}px`
|
|
25
|
-
};
|
|
26
|
-
case "left": return {
|
|
27
|
-
right: `-${e}px`,
|
|
28
|
-
top: `${t}px`
|
|
29
|
-
};
|
|
30
|
-
default: return {
|
|
31
|
-
left: `-${e}px`,
|
|
32
|
-
top: `${t}px`
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
};
|
|
7
|
+
var d = /*#__PURE__*/ c("<div aria-hidden=true>");
|
|
8
|
+
function f(c) {
|
|
9
|
+
let f = r("TooltipArrow"), p = u(() => n(f.placement())), m = u(() => t(f.placement()) ?? "center"), h = () => f.reference?.()?.getBoundingClientRect().width ?? 0;
|
|
36
10
|
return (() => {
|
|
37
|
-
var t =
|
|
38
|
-
return typeof
|
|
39
|
-
var
|
|
40
|
-
|
|
41
|
-
...h()
|
|
42
|
-
}, v = e("data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", "text-foreground", a.class), y = m();
|
|
43
|
-
return o !== n.e && r(t, "width", n.e = o), s !== n.t && r(t, "height", n.t = s), p !== n.a && r(t, "viewBox", n.a = p), g !== n.o && r(t, "data-state", n.o = g), n.i = i(t, _, n.i), v !== n.n && r(t, "class", n.n = v), y !== n.s && r(d, "points", n.s = y), n;
|
|
11
|
+
var t = d(), n = f.setArrowElement;
|
|
12
|
+
return typeof n == "function" ? l(n, t) : f.setArrowElement = t, a((n) => {
|
|
13
|
+
var r = p(), a = m(), l = `${h() / 2}px`, u = e("absolute size-2.5 z-50 translate-y-[calc(-50%-2px)] rotate-45 rounded-xs bg-foreground fill-foreground", "data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2", "data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2", "data-[side=left]:top-1/2! data-[side=left]:right-[-0.175rem] data-[side=left]:-translate-y-1/2", "data-[side=right]:top-1/2! data-[side=right]:left-[-0.175rem] data-[side=right]:-translate-y-1/2", "data-[side=top]:-bottom-2.5 data-[side=top]:data-[align=center]:left-1/2 data-[side=top]:data-[align=center]:-translate-x-1/2 data-[side=top]:data-[align=start]:left-(--arrow-offset) data-[side=top]:data-[align=start]:-translate-x-1/2 data-[side=top]:data-[align=end]:right-(--arrow-offset) data-[side=top]:data-[align=end]:translate-x-1/2", "data-[side=bottom]:top-1 data-[side=bottom]:data-[align=center]:left-1/2 data-[side=bottom]:data-[align=center]:-translate-x-1/2 data-[side=bottom]:data-[align=start]:left-(--arrow-offset) data-[side=bottom]:data-[align=start]:-translate-x-1/2 data-[side=bottom]:data-[align=end]:right-(--arrow-offset) data-[side=bottom]:data-[align=end]:translate-x-1/2", c.class);
|
|
14
|
+
return r !== n.e && o(t, "data-side", n.e = r), a !== n.t && o(t, "data-align", n.t = a), l !== n.a && s(t, "--arrow-offset", n.a = l), u !== n.o && i(t, n.o = u), n;
|
|
44
15
|
}, {
|
|
45
16
|
e: void 0,
|
|
46
17
|
t: void 0,
|
|
47
18
|
a: void 0,
|
|
48
|
-
o: void 0
|
|
49
|
-
i: void 0,
|
|
50
|
-
n: void 0,
|
|
51
|
-
s: void 0
|
|
19
|
+
o: void 0
|
|
52
20
|
}), t;
|
|
53
21
|
})();
|
|
54
22
|
}
|
|
55
23
|
//#endregion
|
|
56
|
-
export {
|
|
24
|
+
export { f as TooltipArrow };
|
|
57
25
|
|
|
58
26
|
//# sourceMappingURL=TooltipArrow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipArrow.js","names":["
|
|
1
|
+
{"version":3,"file":"TooltipArrow.js","names":["createMemo","getAlignment","getSide","clsx","useTooltipContentContext","TooltipArrowProps","class","TooltipArrow","props","ctx","side","placement","align","triggerWidth","reference","getBoundingClientRect","width","_el$","_tmpl$","_ref$","setArrowElement","_$use","_$effect","_p$","_v$","_v$2","_v$3","_v$4","e","_$setAttribute","t","a","_$setStyleProperty","o","_$className","undefined"],"sources":["../../../../src/components/tooltip/TooltipArrow/TooltipArrow.tsx"],"sourcesContent":["import { createMemo } from \"solid-js\";\nimport { getAlignment, getSide } from \"~/lib\";\nimport { clsx } from \"~/utils\";\nimport { useTooltipContentContext } from \"../TooltipContent/TooltipContent.context\";\n\nexport interface TooltipArrowProps {\n class?: string;\n}\n\n/**\n * 箭头组件,必须渲染在 <TooltipContent> 内部。\n * 采用 shadcn Base UI 的定位方式:通过 data-side / data-align 和 CSS 变量\n * 完成贴边与对齐,不手动计算 top/left。\n */\nexport function TooltipArrow(props: TooltipArrowProps) {\n const ctx = useTooltipContentContext(\"TooltipArrow\");\n\n const side = createMemo(() => getSide(ctx.placement()));\n const align = createMemo(() => getAlignment(ctx.placement()) ?? \"center\");\n\n const triggerWidth = () =>\n ctx.reference?.()?.getBoundingClientRect().width ?? 0;\n\n return (\n <div\n ref={ctx.setArrowElement}\n data-side={side()}\n data-align={align()}\n style={{ \"--arrow-offset\": `${triggerWidth() / 2}px` }}\n class={clsx(\n \"absolute size-2.5 z-50 translate-y-[calc(-50%-2px)] rotate-45 rounded-xs bg-foreground fill-foreground\",\n \"data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2\",\n \"data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2\",\n \"data-[side=left]:top-1/2! data-[side=left]:right-[-0.175rem] data-[side=left]:-translate-y-1/2\",\n \"data-[side=right]:top-1/2! data-[side=right]:left-[-0.175rem] data-[side=right]:-translate-y-1/2\",\n \"data-[side=top]:-bottom-2.5 data-[side=top]:data-[align=center]:left-1/2 data-[side=top]:data-[align=center]:-translate-x-1/2 data-[side=top]:data-[align=start]:left-(--arrow-offset) data-[side=top]:data-[align=start]:-translate-x-1/2 data-[side=top]:data-[align=end]:right-(--arrow-offset) data-[side=top]:data-[align=end]:translate-x-1/2\",\n \"data-[side=bottom]:top-1 data-[side=bottom]:data-[align=center]:left-1/2 data-[side=bottom]:data-[align=center]:-translate-x-1/2 data-[side=bottom]:data-[align=start]:left-(--arrow-offset) data-[side=bottom]:data-[align=start]:-translate-x-1/2 data-[side=bottom]:data-[align=end]:right-(--arrow-offset) data-[side=bottom]:data-[align=end]:translate-x-1/2\",\n props.class,\n )}\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":";;;;;;;AAcA,SAAgBO,EAAaC,GAA0B;CACrD,IAAMC,IAAML,EAAyB,cAAc,GAE7CM,IAAOV,QAAiBE,EAAQO,EAAIE,UAAU,CAAC,CAAC,GAChDC,IAAQZ,QAAiBC,EAAaQ,EAAIE,UAAU,CAAC,KAAK,QAAQ,GAElEE,UACJJ,EAAIK,YAAY,CAAC,EAAEC,sBAAsB,CAAC,CAACC,SAAS;CAEtD,cAAA;EAAA,IAAAC,IAAAC,EAAA,GAAAC,IAESV,EAAIW;EAaR,OAbuB,OAAAD,KAAA,aAAAE,EAAAF,GAAAF,CAAA,IAAnBR,EAAIW,kBAAeH,GAAAK,GAAAC,MAAA;GAAA,IAAAC,IACbd,EAAK,GAACe,IACLb,EAAM,GAACc,IACQ,GAAGb,EAAa,IAAI,EAAC,KAAIc,IAC7CxB,EACL,0GACA,0GACA,iHACA,kGACA,oGACA,uVACA,sWACAK,EAAMF,KACR;GAAC,OAAAkB,MAAAD,EAAAK,KAAAC,EAAAZ,GAAA,aAAAM,EAAAK,IAAAJ,CAAA,GAAAC,MAAAF,EAAAO,KAAAD,EAAAZ,GAAA,cAAAM,EAAAO,IAAAL,CAAA,GAAAC,MAAAH,EAAAQ,KAAAC,EAAAf,GAAA,kBAAAM,EAAAQ,IAAAL,CAAA,GAAAC,MAAAJ,EAAAU,KAAAC,EAAAjB,GAAAM,EAAAU,IAAAN,CAAA,GAAAJ;EAAA,GAAA;GAAAK,GAAAO,KAAAA;GAAAL,GAAAK,KAAAA;GAAAJ,GAAAI,KAAAA;GAAAF,GAAAE,KAAAA;EAAA,CAAA,GAAAlB;CAAA,EAAA,CAAA;AAIP"}
|
|
@@ -3,6 +3,8 @@ import { MiddlewareData, Placement } from '../../../lib';
|
|
|
3
3
|
export interface TooltipContentContextValue {
|
|
4
4
|
/** createPositioner 产出的 middlewareData,TooltipArrow 从里面取 arrow 中间件算好的偏移量 */
|
|
5
5
|
middlewareData: Accessor<MiddlewareData>;
|
|
6
|
+
/** 触发器元素访问器,TooltipArrow 用它计算 --arrow-offset */
|
|
7
|
+
reference: Accessor<Element | undefined>;
|
|
6
8
|
/** 经过 flip 调整后的最终 placement,决定箭头贴哪条边、朝哪个方向 */
|
|
7
9
|
placement: Accessor<Placement>;
|
|
8
10
|
/** TooltipArrow 挂载时用来把自己的 DOM 节点注册给 arrow middleware(Element 而不是 HTMLElement,兼容 SVG 箭头) */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipContent.context.js","names":[],"sources":["../../../../src/components/tooltip/TooltipContent/TooltipContent.context.ts"],"sourcesContent":["import { createContext, useContext, type Accessor } from \"solid-js\";\nimport type { MiddlewareData, Placement } from \"~/lib\";\n\nexport interface TooltipContentContextValue {\n /** createPositioner 产出的 middlewareData,TooltipArrow 从里面取 arrow 中间件算好的偏移量 */\n middlewareData: Accessor<MiddlewareData>;\n /** 经过 flip 调整后的最终 placement,决定箭头贴哪条边、朝哪个方向 */\n placement: Accessor<Placement>;\n /** TooltipArrow 挂载时用来把自己的 DOM 节点注册给 arrow middleware(Element 而不是 HTMLElement,兼容 SVG 箭头) */\n setArrowElement: (el: Element) => void;\n /**\n * 驱动进出场动画的状态,和 TooltipContent 内层元素的 data-state 用的是\n * 同一个信号——TooltipArrow 应该用它独立播放自己的一份动画,而不是依赖\n * \"作为内层元素的子节点、被动继承内层的 transform/opacity 动画\"这种隐式\n * 机制(内层的 zoom-in-95 动画会给它加一个非 none 的 transform,CSS 规范\n * 规定这会让内层变成子元素新的\"包含块\",和箭头故意跳过内层、以外层为\n * 基准的设计相冲突,动画播放期间会让\"父子两层谁负责什么\"变得不可靠)。\n */\n animationState: Accessor<\"open\" | \"closed\">;\n}\n\nexport const TooltipContentContext =\n createContext<TooltipContentContextValue>();\n\nexport function useTooltipContentContext(\n component: string,\n): TooltipContentContextValue {\n const ctx = useContext(TooltipContentContext);\n if (!ctx) {\n throw new Error(`<${component}> 必须渲染在 <TooltipContent> 内部`);\n }\n return ctx;\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"TooltipContent.context.js","names":[],"sources":["../../../../src/components/tooltip/TooltipContent/TooltipContent.context.ts"],"sourcesContent":["import { createContext, useContext, type Accessor } from \"solid-js\";\nimport type { MiddlewareData, Placement } from \"~/lib\";\n\nexport interface TooltipContentContextValue {\n /** createPositioner 产出的 middlewareData,TooltipArrow 从里面取 arrow 中间件算好的偏移量 */\n middlewareData: Accessor<MiddlewareData>;\n /** 触发器元素访问器,TooltipArrow 用它计算 --arrow-offset */\n reference: Accessor<Element | undefined>;\n /** 经过 flip 调整后的最终 placement,决定箭头贴哪条边、朝哪个方向 */\n placement: Accessor<Placement>;\n /** TooltipArrow 挂载时用来把自己的 DOM 节点注册给 arrow middleware(Element 而不是 HTMLElement,兼容 SVG 箭头) */\n setArrowElement: (el: Element) => void;\n /**\n * 驱动进出场动画的状态,和 TooltipContent 内层元素的 data-state 用的是\n * 同一个信号——TooltipArrow 应该用它独立播放自己的一份动画,而不是依赖\n * \"作为内层元素的子节点、被动继承内层的 transform/opacity 动画\"这种隐式\n * 机制(内层的 zoom-in-95 动画会给它加一个非 none 的 transform,CSS 规范\n * 规定这会让内层变成子元素新的\"包含块\",和箭头故意跳过内层、以外层为\n * 基准的设计相冲突,动画播放期间会让\"父子两层谁负责什么\"变得不可靠)。\n */\n animationState: Accessor<\"open\" | \"closed\">;\n}\n\nexport const TooltipContentContext =\n createContext<TooltipContentContextValue>();\n\nexport function useTooltipContentContext(\n component: string,\n): TooltipContentContextValue {\n const ctx = useContext(TooltipContentContext);\n if (!ctx) {\n throw new Error(`<${component}> 必须渲染在 <TooltipContent> 内部`);\n }\n return ctx;\n}\n"],"mappings":";;AAuBA,IAAa,IACX,EAA0C;AAE5C,SAAgB,EACd,GAC4B;CAC5B,IAAM,IAAM,EAAW,CAAqB;CAC5C,IAAI,CAAC,GACH,MAAU,MAAM,IAAI,EAAU,4BAA4B;CAE5D,OAAO;AACT"}
|
|
@@ -53,12 +53,13 @@ function b(m) {
|
|
|
53
53
|
};
|
|
54
54
|
},
|
|
55
55
|
get class() {
|
|
56
|
-
return e("max-w-xs rounded-md px-3 py-1.5 text-xs
|
|
56
|
+
return e("inline-flex w-fit max-w-xs items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background", "has-data-[slot=kbd]:pr-1.5", "data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95", "data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95", "data-[side=top]:slide-in-from-bottom-2", "data-[side=bottom]:slide-in-from-top-2", "data-[side=left]:slide-in-from-right-2", "data-[side=right]:slide-in-from-left-2", D.class);
|
|
57
57
|
}
|
|
58
58
|
}, O), !1, !0), l(m, s(a.Provider, {
|
|
59
59
|
get value() {
|
|
60
60
|
return {
|
|
61
61
|
middlewareData: x.middlewareData,
|
|
62
|
+
reference: b.reference,
|
|
62
63
|
placement: x.placement,
|
|
63
64
|
setArrowElement: w,
|
|
64
65
|
animationState: C
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TooltipContent.js","names":["Show","onCleanup","splitProps","Portal","useTooltipContent","TooltipContentContext","getTransformOrigin","getSide","getAlignment","TooltipContentProps","clsx","TooltipContent","props","ctx","pos","mounted","animationState","setArrowElement","setContentElement","slideStyle","local","rest","_$createComponent","when","children","_el$","_tmpl$","_el$2","firstChild","_el$3","_$use","el","setFloating","undefined","_$spread","_$mergeProps","id","contentId","data-state","data-side","placement","data-align","onMouseEnter","keepOpen","onMouseLeave","requestClose","style","class","_$insert","Provider","value","middlewareData","_$effect","_p$","_v$","_v$2","floatingStyles","opacity","isPositioned","_v$3","e","_$setAttribute","t","_$style","a"],"sources":["../../../../src/components/tooltip/TooltipContent/TooltipContent.tsx"],"sourcesContent":["import { Show, onCleanup, splitProps } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { useTooltipContent } from \"./useTooltipContent\";\nimport { TooltipContentContext } from \"./TooltipContent.context\";\nimport { getTransformOrigin } from \"./TooltipContent.utils\";\nimport { getSide, getAlignment } from \"~/lib\";\nimport type { TooltipContentProps } from \"./TooltipContent.types\";\nimport { clsx } from \"~/utils\";\n\n/**\n * Tooltip 的浮层内容。挂 Portal 到 body,用 position:fixed 定位。\n *\n * 内容本身默认是可以 hover 的(不是 pointer-events:none):鼠标移进 content\n * 会取消待执行的关闭计时器(ctx.keepOpen),移出才真正走 closeDelay 关闭——\n * 这样用户可以把鼠标从 trigger 移动到 tooltip 上选中里面的文字,不会因为\n * \"离开 trigger 就关闭\" 而选不到。如果你的 tooltip 内容很简单、不需要这个特性,\n * 可以自己在外面包一层设置 pointer-events: none。\n */\nexport function TooltipContent(props: TooltipContentProps) {\n const {\n ctx,\n pos,\n mounted,\n animationState,\n setArrowElement,\n setContentElement,\n slideStyle,\n } = useTooltipContent(() => props);\n\n // 只摘出内部要单独处理的几个字段,剩下的(style、data-*、onXxx 等任意原生\n // prop)原样透传给内层元素——和 TooltipTrigger 是同一套约定。\n const [local, rest] = splitProps(props, [\n \"side\",\n \"align\",\n \"sideOffset\",\n \"alignOffset\",\n \"collisionPadding\",\n \"class\",\n \"style\",\n \"children\",\n ]);\n\n return (\n <Show when={mounted()}>\n <Portal>\n {/*\n 外层:只负责定位(position:fixed 来自 floatingStyles),不设 overflow,\n 也不参与任何动画——它的 transform 已经被占用来做定位(translate(x,y)),\n 如果别的动画也要控制 transform 会互相冲突,所以动画都放在下面两层。\n */}\n <div\n ref={(el) => {\n ctx.setFloating(el);\n // Solid 的 ref 回调只在元素创建时触发一次,元素被移除时不会自动\n // 再调用一次传 undefined(这是 React 的约定,不是 Solid 的)。\n // 不手动清空的话,ctx.floating() 会一直指向一个已经从 DOM 里\n // 摘除的\"僵尸节点\",直到下次重新打开——期间如果被别处读取\n // (比如 TooltipGroup 抢占时读取矩形),getBoundingClientRect()\n // 对一个 detached 元素规范规定就是返回全 0 的矩形,会造成\n // \"滑动效果从左上角(0,0)滑入\"这种明显错误的观感。\n onCleanup(() => ctx.setFloating(undefined));\n }}\n data-placement={pos.placement()}\n style={{\n ...pos.floatingStyles(),\n \"z-index\": 1000,\n opacity: pos.isPositioned() ? 1 : 0,\n }}\n >\n {/*\n 滑动层:命中 <TooltipGroup> 抢占时,用来把整个 tooltip(内容+箭头)\n 从旧 tooltip 的位置平移过来(FLIP 技术,细节见 useTooltipContent 里\n 的 slideOffset 计算)。平时 slideStyle() 是空对象,这一层形同不存在。\n\n 这一层必须夹在\"定位层\"和\"样式/动画层\"之间、而不是随便找个地方加:\n 它自己也会用到 transform(滑动过程中),如果和定位层共用一个元素会\n 跟 translate(x,y) 冲突(原因同上);但它又不能在样式层(overflow:auto\n 那层)的下面/内部,因为箭头的 position:absolute 是故意跳过样式层、\n 以\"最近的已定位祖先\"为基准的(这是修复箭头戳出来触发滚动条那次的\n 设计),如果滑动层的 transform 出现在样式层内部,箭头的定位基准就会\n 变成滑动层而不是外层——效果上依然正确(滑动层的盒子和外层几乎重合),\n 但为了让\"定位基准\"这件事始终清晰、不产生\"技术上是谁、视觉上又是谁\"\n 的心智负担,把滑动层放在外层和样式层之间、维持这条链路的清晰顺序。\n */}\n <div style={slideStyle()}>\n {/*\n 内层:真正的视觉样式 + 进出场动画。\n data-state 跟着 animationState 走(不是 isVisible/mounted):\n - isVisible 变 false 的瞬间,animationState 立刻跟着变 closed,\n 触发退场动画的 class;\n - isVisible 变 true 时,animationState 会晚一帧才变 open,\n 留出时间让箭头(TooltipArrow)完成挂载、注册给 arrow middleware、\n 算出正确的位置偏移(细节见 useTooltipContent 里的注释);\n - mounted 会比 animationState 变 closed 更晚才变 false(见下面的\n Presence 逻辑),留出时间让退场动画播完。\n\n data-[state=open]/data-[state=closed] 这套 class 依赖 tailwindcss-animate\n 插件提供的 animate-in/animate-out/fade-in-0/zoom-in-95 等工具类——\n 如果你的项目还没装,`npm install tailwindcss-animate` 并在 tailwind\n config 里加上这个 plugin 即可;不想装的话,把这几个 data-[state=...]\n class 换成你自己写的 @keyframes + 对应 class 也一样能工作,\n Presence 逻辑(mounted 延迟卸载)不依赖具体用了哪套动画实现。\n\n 箭头(TooltipArrow)不依赖\"作为这个元素的子节点、被动继承这里的\n transform/opacity 动画\"这种隐式机制——它自己也从 context 里读到\n 同一个 animationState,独立播放一份自己的入场/退场动画,两者由\n 同一个信号同步触发。\n\n data-side/data-align 是从最终生效的 placement 拆出来的,驱动上面\n 这几条方向感知的 slide-in class,也顺带给 transform-origin 提供了\n 依据——缩放动画的锚点会落在\"贴近 trigger 的那条边\"上(细节见\n TooltipContent.utils.ts 里的 getTransformOrigin),而不是默认的\n 几何中心,这样整个入场效果才会像是\"从 trigger 那里长出来\",\n 贴近 shadcn 的实际观感。\n\n 特意没有 overflow:auto / max-height,tooltip 不支持内容超长时滚动——\n 宽度上限靠下面静态的 max-w-xs class 兜底,让文字自然换行;高度完全\n 不做限制。这不只是为了贴近 shadcn/Radix 的行为(它们的 tooltip 也不\n 允许滚动),还避免了一个真实踩过的坑:overflow:auto 配合这里的\n zoom-in-95 动画(会给这个元素加一个非 none 的 transform,CSS 规范\n 规定这会让它变成子元素新的包含块)曾经导致箭头戳出边缘的那部分被\n 误判成\"可滚动溢出\",表现为打开瞬间闪一下滚动条、箭头跟着被遮住,\n 动画播完滚动条消失、箭头才重新出现。去掉滚动能力后这个耦合从根上\n 就不存在了。\n */}\n <div\n ref={setContentElement}\n id={ctx.contentId}\n role=\"tooltip\"\n data-state={animationState()}\n data-side={getSide(pos.placement())}\n data-align={getAlignment(pos.placement()) ?? \"center\"}\n onMouseEnter={ctx.keepOpen}\n onMouseLeave={ctx.requestClose}\n style={{\n \"transform-origin\": getTransformOrigin(pos.placement()),\n ...(typeof local.style === \"object\" ? local.style : undefined),\n }}\n class={clsx(\n \"max-w-xs rounded-md px-3 py-1.5 text-xs
|
|
1
|
+
{"version":3,"file":"TooltipContent.js","names":["Show","onCleanup","splitProps","Portal","useTooltipContent","TooltipContentContext","getTransformOrigin","getSide","getAlignment","TooltipContentProps","clsx","TooltipContent","props","ctx","pos","mounted","animationState","setArrowElement","setContentElement","slideStyle","local","rest","_$createComponent","when","children","_el$","_tmpl$","_el$2","firstChild","_el$3","_$use","el","setFloating","undefined","_$spread","_$mergeProps","id","contentId","data-state","data-side","placement","data-align","onMouseEnter","keepOpen","onMouseLeave","requestClose","style","class","_$insert","Provider","value","middlewareData","reference","_$effect","_p$","_v$","_v$2","floatingStyles","opacity","isPositioned","_v$3","e","_$setAttribute","t","_$style","a"],"sources":["../../../../src/components/tooltip/TooltipContent/TooltipContent.tsx"],"sourcesContent":["import { Show, onCleanup, splitProps } from \"solid-js\";\nimport { Portal } from \"solid-js/web\";\nimport { useTooltipContent } from \"./useTooltipContent\";\nimport { TooltipContentContext } from \"./TooltipContent.context\";\nimport { getTransformOrigin } from \"./TooltipContent.utils\";\nimport { getSide, getAlignment } from \"~/lib\";\nimport type { TooltipContentProps } from \"./TooltipContent.types\";\nimport { clsx } from \"~/utils\";\n\n/**\n * Tooltip 的浮层内容。挂 Portal 到 body,用 position:fixed 定位。\n *\n * 内容本身默认是可以 hover 的(不是 pointer-events:none):鼠标移进 content\n * 会取消待执行的关闭计时器(ctx.keepOpen),移出才真正走 closeDelay 关闭——\n * 这样用户可以把鼠标从 trigger 移动到 tooltip 上选中里面的文字,不会因为\n * \"离开 trigger 就关闭\" 而选不到。如果你的 tooltip 内容很简单、不需要这个特性,\n * 可以自己在外面包一层设置 pointer-events: none。\n */\nexport function TooltipContent(props: TooltipContentProps) {\n const {\n ctx,\n pos,\n mounted,\n animationState,\n setArrowElement,\n setContentElement,\n slideStyle,\n } = useTooltipContent(() => props);\n\n // 只摘出内部要单独处理的几个字段,剩下的(style、data-*、onXxx 等任意原生\n // prop)原样透传给内层元素——和 TooltipTrigger 是同一套约定。\n const [local, rest] = splitProps(props, [\n \"side\",\n \"align\",\n \"sideOffset\",\n \"alignOffset\",\n \"collisionPadding\",\n \"class\",\n \"style\",\n \"children\",\n ]);\n\n return (\n <Show when={mounted()}>\n <Portal>\n {/*\n 外层:只负责定位(position:fixed 来自 floatingStyles),不设 overflow,\n 也不参与任何动画——它的 transform 已经被占用来做定位(translate(x,y)),\n 如果别的动画也要控制 transform 会互相冲突,所以动画都放在下面两层。\n */}\n <div\n ref={(el) => {\n ctx.setFloating(el);\n // Solid 的 ref 回调只在元素创建时触发一次,元素被移除时不会自动\n // 再调用一次传 undefined(这是 React 的约定,不是 Solid 的)。\n // 不手动清空的话,ctx.floating() 会一直指向一个已经从 DOM 里\n // 摘除的\"僵尸节点\",直到下次重新打开——期间如果被别处读取\n // (比如 TooltipGroup 抢占时读取矩形),getBoundingClientRect()\n // 对一个 detached 元素规范规定就是返回全 0 的矩形,会造成\n // \"滑动效果从左上角(0,0)滑入\"这种明显错误的观感。\n onCleanup(() => ctx.setFloating(undefined));\n }}\n data-placement={pos.placement()}\n style={{\n ...pos.floatingStyles(),\n \"z-index\": 1000,\n opacity: pos.isPositioned() ? 1 : 0,\n }}\n >\n {/*\n 滑动层:命中 <TooltipGroup> 抢占时,用来把整个 tooltip(内容+箭头)\n 从旧 tooltip 的位置平移过来(FLIP 技术,细节见 useTooltipContent 里\n 的 slideOffset 计算)。平时 slideStyle() 是空对象,这一层形同不存在。\n\n 这一层必须夹在\"定位层\"和\"样式/动画层\"之间、而不是随便找个地方加:\n 它自己也会用到 transform(滑动过程中),如果和定位层共用一个元素会\n 跟 translate(x,y) 冲突(原因同上);但它又不能在样式层(overflow:auto\n 那层)的下面/内部,因为箭头的 position:absolute 是故意跳过样式层、\n 以\"最近的已定位祖先\"为基准的(这是修复箭头戳出来触发滚动条那次的\n 设计),如果滑动层的 transform 出现在样式层内部,箭头的定位基准就会\n 变成滑动层而不是外层——效果上依然正确(滑动层的盒子和外层几乎重合),\n 但为了让\"定位基准\"这件事始终清晰、不产生\"技术上是谁、视觉上又是谁\"\n 的心智负担,把滑动层放在外层和样式层之间、维持这条链路的清晰顺序。\n */}\n <div style={slideStyle()}>\n {/*\n 内层:真正的视觉样式 + 进出场动画。\n data-state 跟着 animationState 走(不是 isVisible/mounted):\n - isVisible 变 false 的瞬间,animationState 立刻跟着变 closed,\n 触发退场动画的 class;\n - isVisible 变 true 时,animationState 会晚一帧才变 open,\n 留出时间让箭头(TooltipArrow)完成挂载、注册给 arrow middleware、\n 算出正确的位置偏移(细节见 useTooltipContent 里的注释);\n - mounted 会比 animationState 变 closed 更晚才变 false(见下面的\n Presence 逻辑),留出时间让退场动画播完。\n\n data-[state=open]/data-[state=closed] 这套 class 依赖 tailwindcss-animate\n 插件提供的 animate-in/animate-out/fade-in-0/zoom-in-95 等工具类——\n 如果你的项目还没装,`npm install tailwindcss-animate` 并在 tailwind\n config 里加上这个 plugin 即可;不想装的话,把这几个 data-[state=...]\n class 换成你自己写的 @keyframes + 对应 class 也一样能工作,\n Presence 逻辑(mounted 延迟卸载)不依赖具体用了哪套动画实现。\n\n 箭头(TooltipArrow)不依赖\"作为这个元素的子节点、被动继承这里的\n transform/opacity 动画\"这种隐式机制——它自己也从 context 里读到\n 同一个 animationState,独立播放一份自己的入场/退场动画,两者由\n 同一个信号同步触发。\n\n data-side/data-align 是从最终生效的 placement 拆出来的,驱动上面\n 这几条方向感知的 slide-in class,也顺带给 transform-origin 提供了\n 依据——缩放动画的锚点会落在\"贴近 trigger 的那条边\"上(细节见\n TooltipContent.utils.ts 里的 getTransformOrigin),而不是默认的\n 几何中心,这样整个入场效果才会像是\"从 trigger 那里长出来\",\n 贴近 shadcn 的实际观感。\n\n 特意没有 overflow:auto / max-height,tooltip 不支持内容超长时滚动——\n 宽度上限靠下面静态的 max-w-xs class 兜底,让文字自然换行;高度完全\n 不做限制。这不只是为了贴近 shadcn/Radix 的行为(它们的 tooltip 也不\n 允许滚动),还避免了一个真实踩过的坑:overflow:auto 配合这里的\n zoom-in-95 动画(会给这个元素加一个非 none 的 transform,CSS 规范\n 规定这会让它变成子元素新的包含块)曾经导致箭头戳出边缘的那部分被\n 误判成\"可滚动溢出\",表现为打开瞬间闪一下滚动条、箭头跟着被遮住,\n 动画播完滚动条消失、箭头才重新出现。去掉滚动能力后这个耦合从根上\n 就不存在了。\n */}\n <div\n ref={setContentElement}\n id={ctx.contentId}\n role=\"tooltip\"\n data-state={animationState()}\n data-side={getSide(pos.placement())}\n data-align={getAlignment(pos.placement()) ?? \"center\"}\n onMouseEnter={ctx.keepOpen}\n onMouseLeave={ctx.requestClose}\n style={{\n \"transform-origin\": getTransformOrigin(pos.placement()),\n ...(typeof local.style === \"object\" ? local.style : undefined),\n }}\n class={clsx(\n \"inline-flex w-fit max-w-xs items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background\",\n \"has-data-[slot=kbd]:pr-1.5\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95\",\n // 方向感知的滑入:不只是原地淡入缩放,还从\"贴近 trigger 的反方向\"\n // 轻微位移过来——比如 placement 是 top(content 在 trigger 上方),\n // 就从下方 8px(slide-in-from-bottom-2)滑上来,视觉上更像是从\n // trigger 那里\"冒出来\",而不是凭空原地出现。只在打开时生效,\n // 贴近 shadcn 的实际行为(它们的退场动画没有对应的滑出位移)。\n \"data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2\",\n local.class,\n )}\n {...rest}\n >\n <TooltipContentContext.Provider\n value={{\n middlewareData: pos.middlewareData,\n reference: ctx.reference,\n placement: pos.placement,\n setArrowElement,\n animationState,\n }}\n >\n {local.children}\n </TooltipContentContext.Provider>\n </div>\n </div>\n </div>\n </Portal>\n </Show>\n );\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgBW,EAAeC,GAA4B;CACzD,IAAM,EACJC,QACAC,QACAC,YACAC,mBACAC,oBACAC,sBACAC,kBACEf,QAAwBQ,CAAK,GAI3B,CAACQ,GAAOC,KAAQnB,EAAWU,GAAO;EACtC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAAU,CACX;CAED,OAAAU,EACGtB,GAAI;EAAA,IAACuB,OAAI;GAAA,OAAER,EAAQ;EAAC;EAAA,IAAAS,WAAA;GAAA,OAAAF,EAClBnB,GAAM,EAAA,IAAAqB,WAAA;IAAA,IAAAC,IAAAC,EAAA,GAAAC,IAAAF,EAAAG,YAAAC,IAAAF,EAAAC;IAwCqB,OAxCrBE,GAOGC,MAAO;KASX9B,AARAY,EAAImB,YAAYD,CAAE,GAQlB9B,QAAgBY,EAAImB,YAAYC,KAAAA,CAAS,CAAC;IAC5C,GAACR,CAAA,GAAAK,EAiEQZ,GAAiBW,CAAA,GAAAK,EAAAL,GAAAM,EAAA;KAAA,IACtBC,KAAE;MAAA,OAAEvB,EAAIwB;KAAS;KAAA,IAAA,eAAA;MAAA,OAELrB,EAAe;KAAC;KAAA,IAAA,cAAA;MAAA,OACjBT,EAAQO,EAAI0B,UAAU,CAAC;KAAC;KAAA,IAAA,eAAA;MAAA,OACvBhC,EAAaM,EAAI0B,UAAU,CAAC,KAAK;KAAQ;KAAA,IACrDE,eAAY;MAAA,OAAE7B,EAAI8B;KAAQ;KAAA,IAC1BC,eAAY;MAAA,OAAE/B,EAAIgC;KAAY;KAAA,IAC9BC,QAAK;MAAA,OAAE;OACL,oBAAoBxC,EAAmBQ,EAAI0B,UAAU,CAAC;OACtD,GAAI,OAAOpB,EAAM0B,SAAU,WAAW1B,EAAM0B,QAAQb,KAAAA;MACtD;KAAC;KAAA,IAAA,QAAA;MAAA,OACMvB,EACL,gHACA,8BACA,yFACA,kGAMA,0CACA,0CACA,0CACA,0CACAU,EAAM2B,KACR;KAAC;IAAA,GACG1B,CAAI,GAAA,IAAA,EAAA,GAAA2B,EAAAnB,GAAAP,EAEPjB,EAAsB4C,UAAQ;KAAA,IAC7BC,QAAK;MAAA,OAAE;OACLC,gBAAgBrC,EAAIqC;OACpBC,WAAWvC,EAAIuC;OACfZ,WAAW1B,EAAI0B;OACfvB;OACAD;MACF;KAAC;KAAA,IAAAQ,WAAA;MAAA,OAEAJ,EAAMI;KAAQ;IAAA,CAAA,CAAA,GAAA6B,GAAAC,MAAA;KAAA,IAAAC,IAvGLzC,EAAI0B,UAAU,GAACgB,IACxB;MACL,GAAG1C,EAAI2C,eAAe;MAEtBC,SAAS5C,KAAI6C,aAAa;KAC5B,GAACC,IAiBWzC,EAAW;KAAC,OAAAoC,MAAAD,EAAAO,KAAAC,EAAArC,GAAA,kBAAA6B,EAAAO,IAAAN,CAAA,GAAAD,EAAAS,IAAAC,EAAAvC,GAAA+B,GAAAF,EAAAS,CAAA,GAAAT,EAAAW,IAAAD,EAAArC,GAAAiC,GAAAN,EAAAW,CAAA,GAAAX;IAAA,GAAA;KAAAO,GAAA5B,KAAAA;KAAA8B,GAAA9B,KAAAA;KAAAgC,GAAAhC,KAAAA;IAAA,CAAA,GAAAR;GAAA,EAAA,CAAA;EAAA;CAAA,CAAA;AAyFlC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Alignment, Side } from '../../../lib';
|
|
2
2
|
import { BaseProps, PolymorphicProps } from '../../../types';
|
|
3
|
+
export type TooltipSide = Side | "inline-start" | "inline-end";
|
|
3
4
|
interface BaseTooltipContentProps extends BaseProps {
|
|
4
|
-
/** 贴 trigger 的哪一侧,默认 'top' */
|
|
5
|
-
side?:
|
|
5
|
+
/** 贴 trigger 的哪一侧,默认 'top'。支持 Base UI 的 logical side。 */
|
|
6
|
+
side?: TooltipSide;
|
|
6
7
|
/** 沿边对齐方式,默认 'center'(不偏移,居中对齐) */
|
|
7
8
|
align?: Alignment | "center";
|
|
8
9
|
/** 沿主轴(side 指向的方向)与 trigger 之间的间距(像素),默认 8 */
|
|
@@ -4,7 +4,8 @@ import { Middleware, Placement, Side, Alignment } from '../../../lib';
|
|
|
4
4
|
* `Placement` 字符串(比如 side='top' + align='start' → 'top-start')。
|
|
5
5
|
* align 是 'center'(默认对齐、不偏移)时不带后缀,直接是 side 本身。
|
|
6
6
|
*/
|
|
7
|
-
export declare function
|
|
7
|
+
export declare function toPhysicalSide(side: Side | "inline-start" | "inline-end", dir?: string): Side;
|
|
8
|
+
export declare function toPlacement(side: Side | "inline-start" | "inline-end", align: Alignment | "center", dir?: string): Placement;
|
|
8
9
|
/**
|
|
9
10
|
* 根据最终生效的 placement,算出缩放动画应该以哪个点为锚点(CSS transform-origin)。
|
|
10
11
|
* 锚点应该落在"贴近 trigger 的那条边"上——比如 placement 是 'top'(content 在
|