@12-apps/ui 1.0.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/components-catalog.md +806 -0
- package/components-guidelines.md +347 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/eslint.config.js +77 -0
- package/package.json +247 -0
- package/src/__tests__/package-wiring.test.ts +37 -0
- package/src/__tests__/setup.ts +1 -0
- package/src/__tests__/social-login-button.test.tsx +186 -0
- package/src/__tests__/user-avatar.test.tsx +195 -0
- package/src/button.tsx +22 -0
- package/src/components/command/__tests__/command.test.tsx +112 -0
- package/src/components/data-display/Alert/Alert.md +209 -0
- package/src/components/data-display/Alert/Alert.stories.tsx +561 -0
- package/src/components/data-display/Alert/Alert.test.stories.tsx +709 -0
- package/src/components/data-display/Alert/Alert.tsx +449 -0
- package/src/components/data-display/Alert/Alert.types.ts +79 -0
- package/src/components/data-display/Alert/index.ts +2 -0
- package/src/components/data-display/AlertDialog/AlertDialog.md +408 -0
- package/src/components/data-display/AlertDialog/AlertDialog.stories.tsx +360 -0
- package/src/components/data-display/AlertDialog/AlertDialog.test.stories.tsx +753 -0
- package/src/components/data-display/AlertDialog/AlertDialog.tsx +273 -0
- package/src/components/data-display/AlertDialog/AlertDialog.types.ts +74 -0
- package/src/components/data-display/AlertDialog/index.ts +2 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.stories.tsx +230 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.test.stories.tsx +270 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +116 -0
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +70 -0
- package/src/components/data-display/AsyncStateContainer/index.ts +2 -0
- package/src/components/data-display/Avatar/Avatar.md +568 -0
- package/src/components/data-display/Avatar/Avatar.stories.tsx +718 -0
- package/src/components/data-display/Avatar/Avatar.test.stories.tsx +820 -0
- package/src/components/data-display/Avatar/Avatar.tsx +507 -0
- package/src/components/data-display/Avatar/Avatar.types.ts +88 -0
- package/src/components/data-display/Avatar/index.ts +2 -0
- package/src/components/data-display/Badge/Badge.md +469 -0
- package/src/components/data-display/Badge/Badge.stories.tsx +1136 -0
- package/src/components/data-display/Badge/Badge.test.stories.tsx +1193 -0
- package/src/components/data-display/Badge/Badge.tsx +606 -0
- package/src/components/data-display/Badge/Badge.types.ts +118 -0
- package/src/components/data-display/Badge/index.ts +2 -0
- package/src/components/data-display/Banner/Banner.stories.tsx +524 -0
- package/src/components/data-display/Banner/Banner.test.stories.tsx +503 -0
- package/src/components/data-display/Banner/Banner.tsx +350 -0
- package/src/components/data-display/Banner/Banner.types.ts +41 -0
- package/src/components/data-display/Banner/banner.md +141 -0
- package/src/components/data-display/Banner/index.ts +2 -0
- package/src/components/data-display/Carousel/Carousel.md +815 -0
- package/src/components/data-display/Carousel/Carousel.stories.tsx +607 -0
- package/src/components/data-display/Carousel/Carousel.test.stories.tsx +691 -0
- package/src/components/data-display/Carousel/Carousel.tsx +765 -0
- package/src/components/data-display/Carousel/Carousel.types.ts +79 -0
- package/src/components/data-display/Carousel/index.ts +8 -0
- package/src/components/data-display/Chart/Chart.md +352 -0
- package/src/components/data-display/Chart/Chart.stories.tsx +568 -0
- package/src/components/data-display/Chart/Chart.test.stories.tsx +174 -0
- package/src/components/data-display/Chart/Chart.tsx +520 -0
- package/src/components/data-display/Chart/Chart.types.ts +65 -0
- package/src/components/data-display/Chart/index.ts +2 -0
- package/src/components/data-display/Chip/Chip.stories.tsx +251 -0
- package/src/components/data-display/Chip/Chip.test.stories.tsx +263 -0
- package/src/components/data-display/Chip/Chip.tsx +134 -0
- package/src/components/data-display/Chip/Chip.types.ts +51 -0
- package/src/components/data-display/Chip/chip.md +395 -0
- package/src/components/data-display/Chip/index.ts +2 -0
- package/src/components/data-display/DataGrid/DataGrid.md +602 -0
- package/src/components/data-display/DataGrid/DataGrid.stories.tsx +515 -0
- package/src/components/data-display/DataGrid/DataGrid.test.stories.tsx +659 -0
- package/src/components/data-display/DataGrid/DataGrid.tsx +743 -0
- package/src/components/data-display/DataGrid/DataGrid.types.ts +171 -0
- package/src/components/data-display/DataGrid/index.ts +21 -0
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.tsx +197 -0
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.types.ts +46 -0
- package/src/components/data-display/DateTimeDisplay/index.ts +2 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.md +226 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.stories.tsx +254 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.tsx +100 -0
- package/src/components/data-display/DescriptionItem/DescriptionItem.types.ts +1 -0
- package/src/components/data-display/DescriptionItem/index.ts +2 -0
- package/src/components/data-display/EmptyState/EmptyState.md +265 -0
- package/src/components/data-display/EmptyState/EmptyState.stories.tsx +282 -0
- package/src/components/data-display/EmptyState/EmptyState.test.stories.tsx +441 -0
- package/src/components/data-display/EmptyState/EmptyState.tsx +180 -0
- package/src/components/data-display/EmptyState/EmptyState.types.ts +31 -0
- package/src/components/data-display/EmptyState/index.ts +2 -0
- package/src/components/data-display/ErrorState/ErrorState.stories.tsx +110 -0
- package/src/components/data-display/ErrorState/ErrorState.test.stories.tsx +133 -0
- package/src/components/data-display/ErrorState/ErrorState.tsx +118 -0
- package/src/components/data-display/ErrorState/ErrorState.types.ts +45 -0
- package/src/components/data-display/ErrorState/index.ts +2 -0
- package/src/components/data-display/HoverCard/HoverCard.md +389 -0
- package/src/components/data-display/HoverCard/HoverCard.stories.tsx +648 -0
- package/src/components/data-display/HoverCard/HoverCard.test.stories.tsx +929 -0
- package/src/components/data-display/HoverCard/HoverCard.tsx +657 -0
- package/src/components/data-display/HoverCard/HoverCard.types.ts +116 -0
- package/src/components/data-display/HoverCard/index.ts +2 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.md +532 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.stories.tsx +411 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +245 -0
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.types.ts +64 -0
- package/src/components/data-display/InteractiveTooltip/index.ts +2 -0
- package/src/components/data-display/LazyImage/LazyImage.md +356 -0
- package/src/components/data-display/LazyImage/LazyImage.stories.tsx +387 -0
- package/src/components/data-display/LazyImage/LazyImage.tsx +323 -0
- package/src/components/data-display/LazyImage/LazyImage.types.ts +205 -0
- package/src/components/data-display/LazyImage/index.ts +2 -0
- package/src/components/data-display/Lightbox/Lightbox.stories.tsx +315 -0
- package/src/components/data-display/Lightbox/Lightbox.test.stories.tsx +605 -0
- package/src/components/data-display/Lightbox/Lightbox.tsx +666 -0
- package/src/components/data-display/Lightbox/Lightbox.types.ts +49 -0
- package/src/components/data-display/Lightbox/index.ts +2 -0
- package/src/components/data-display/Lightbox/lightbox.md +298 -0
- package/src/components/data-display/LoadingState/LoadingState.stories.tsx +124 -0
- package/src/components/data-display/LoadingState/LoadingState.test.stories.tsx +99 -0
- package/src/components/data-display/LoadingState/LoadingState.tsx +103 -0
- package/src/components/data-display/LoadingState/LoadingState.types.ts +37 -0
- package/src/components/data-display/LoadingState/index.ts +2 -0
- package/src/components/data-display/MapPreview/MapPreview.md +154 -0
- package/src/components/data-display/MapPreview/MapPreview.stories.tsx +458 -0
- package/src/components/data-display/MapPreview/MapPreview.test.stories.tsx +390 -0
- package/src/components/data-display/MapPreview/MapPreview.tsx +922 -0
- package/src/components/data-display/MapPreview/MapPreview.types.ts +56 -0
- package/src/components/data-display/MapPreview/index.ts +2 -0
- package/src/components/data-display/Popover/Popover.md +245 -0
- package/src/components/data-display/Popover/Popover.stories.tsx +295 -0
- package/src/components/data-display/Popover/Popover.test.stories.tsx +1168 -0
- package/src/components/data-display/Popover/Popover.tsx +132 -0
- package/src/components/data-display/Popover/Popover.types.ts +33 -0
- package/src/components/data-display/Popover/index.ts +2 -0
- package/src/components/data-display/Progress/Progress.md +450 -0
- package/src/components/data-display/Progress/Progress.stories.tsx +481 -0
- package/src/components/data-display/Progress/Progress.test.stories.tsx +2070 -0
- package/src/components/data-display/Progress/Progress.tsx +332 -0
- package/src/components/data-display/Progress/Progress.types.ts +61 -0
- package/src/components/data-display/Progress/index.ts +2 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.md +108 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.stories.tsx +160 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.test.stories.tsx +190 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.tsx +224 -0
- package/src/components/data-display/SectionOnboarding/SectionOnboarding.types.ts +101 -0
- package/src/components/data-display/SectionOnboarding/index.ts +7 -0
- package/src/components/data-display/Sheet/Sheet.md +475 -0
- package/src/components/data-display/Sheet/Sheet.stories.tsx +883 -0
- package/src/components/data-display/Sheet/Sheet.test.stories.tsx +1101 -0
- package/src/components/data-display/Sheet/Sheet.tsx +978 -0
- package/src/components/data-display/Sheet/Sheet.types.ts +93 -0
- package/src/components/data-display/Sheet/index.ts +8 -0
- package/src/components/data-display/Stepper/Stepper.md +542 -0
- package/src/components/data-display/Stepper/Stepper.stories.tsx +540 -0
- package/src/components/data-display/Stepper/Stepper.test.stories.tsx +607 -0
- package/src/components/data-display/Stepper/Stepper.tsx +328 -0
- package/src/components/data-display/Stepper/Stepper.types.ts +97 -0
- package/src/components/data-display/Stepper/index.ts +2 -0
- package/src/components/data-display/Table/Table.md +243 -0
- package/src/components/data-display/Table/Table.stories.tsx +801 -0
- package/src/components/data-display/Table/Table.test.stories.tsx +369 -0
- package/src/components/data-display/Table/Table.tsx +831 -0
- package/src/components/data-display/Table/Table.types.ts +335 -0
- package/src/components/data-display/Table/index.ts +2 -0
- package/src/components/data-display/Timeline/Timeline.md +201 -0
- package/src/components/data-display/Timeline/Timeline.stories.tsx +444 -0
- package/src/components/data-display/Timeline/Timeline.test.stories.tsx +944 -0
- package/src/components/data-display/Timeline/Timeline.tsx +348 -0
- package/src/components/data-display/Timeline/Timeline.types.ts +26 -0
- package/src/components/data-display/Timeline/index.ts +2 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.md +162 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.stories.tsx +475 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.test.stories.tsx +734 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +399 -0
- package/src/components/data-display/TimingDiagram/TimingDiagram.types.ts +19 -0
- package/src/components/data-display/TimingDiagram/index.ts +2 -0
- package/src/components/data-display/Tooltip/Tooltip.md +397 -0
- package/src/components/data-display/Tooltip/Tooltip.stories.tsx +465 -0
- package/src/components/data-display/Tooltip/Tooltip.test.stories.tsx +1168 -0
- package/src/components/data-display/Tooltip/Tooltip.tsx +161 -0
- package/src/components/data-display/Tooltip/Tooltip.types.ts +33 -0
- package/src/components/data-display/Tooltip/index.ts +2 -0
- package/src/components/data-display/index.ts +29 -0
- package/src/components/feedback/Dialog/Dialog.md +527 -0
- package/src/components/feedback/Dialog/Dialog.stories.tsx +833 -0
- package/src/components/feedback/Dialog/Dialog.styles.ts +171 -0
- package/src/components/feedback/Dialog/Dialog.test.stories.tsx +955 -0
- package/src/components/feedback/Dialog/Dialog.tsx +256 -0
- package/src/components/feedback/Dialog/Dialog.types.ts +46 -0
- package/src/components/feedback/Dialog/index.ts +9 -0
- package/src/components/feedback/Modal/Modal.md +629 -0
- package/src/components/feedback/Modal/Modal.stories.tsx +765 -0
- package/src/components/feedback/Modal/Modal.test.stories.tsx +251 -0
- package/src/components/feedback/Modal/Modal.tsx +279 -0
- package/src/components/feedback/Modal/Modal.types.ts +26 -0
- package/src/components/feedback/Modal/index.ts +7 -0
- package/src/components/feedback/Sonner/Sonner.stories.tsx +698 -0
- package/src/components/feedback/Sonner/Sonner.test.stories.tsx +896 -0
- package/src/components/feedback/Sonner/Sonner.tsx +493 -0
- package/src/components/feedback/Sonner/Sonner.types.ts +65 -0
- package/src/components/feedback/Sonner/index.ts +8 -0
- package/src/components/feedback/StackedModal/StackedModal.md +273 -0
- package/src/components/feedback/StackedModal/StackedModal.stories.tsx +1785 -0
- package/src/components/feedback/StackedModal/StackedModal.test.stories.tsx +975 -0
- package/src/components/feedback/StackedModal/StackedModal.tsx +664 -0
- package/src/components/feedback/StackedModal/StackedModal.types.ts +70 -0
- package/src/components/feedback/StackedModal/index.ts +11 -0
- package/src/components/feedback/Toast/Toast.md +547 -0
- package/src/components/feedback/Toast/Toast.stories.tsx +548 -0
- package/src/components/feedback/Toast/Toast.test.stories.tsx +834 -0
- package/src/components/feedback/Toast/Toast.tsx +279 -0
- package/src/components/feedback/Toast/Toast.types.ts +59 -0
- package/src/components/feedback/Toast/index.ts +8 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.md +610 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.stories.tsx +691 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.test.stories.tsx +634 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +554 -0
- package/src/components/feedback/TutorialOverlay/TutorialOverlay.types.ts +30 -0
- package/src/components/feedback/TutorialOverlay/index.ts +2 -0
- package/src/components/feedback/index.ts +6 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.md +633 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.stories.tsx +663 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.test.stories.tsx +723 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.tsx +836 -0
- package/src/components/form/AddressAutocomplete/AddressAutocomplete.types.ts +37 -0
- package/src/components/form/AddressAutocomplete/index.ts +2 -0
- package/src/components/form/Autocomplete/Autocomplete.helpers.ts +115 -0
- package/src/components/form/Autocomplete/Autocomplete.keys.ts +134 -0
- package/src/components/form/Autocomplete/Autocomplete.parts.tsx +337 -0
- package/src/components/form/Autocomplete/Autocomplete.stories.tsx +715 -0
- package/src/components/form/Autocomplete/Autocomplete.test.stories.tsx +825 -0
- package/src/components/form/Autocomplete/Autocomplete.tsx +166 -0
- package/src/components/form/Autocomplete/Autocomplete.types.ts +116 -0
- package/src/components/form/Autocomplete/autocomplete.md +789 -0
- package/src/components/form/Autocomplete/index.ts +8 -0
- package/src/components/form/Autocomplete/useAutocomplete.ts +311 -0
- package/src/components/form/Button/Button.md +411 -0
- package/src/components/form/Button/Button.stories.tsx +362 -0
- package/src/components/form/Button/Button.test.stories.tsx +603 -0
- package/src/components/form/Button/Button.tsx +326 -0
- package/src/components/form/Button/Button.types.ts +74 -0
- package/src/components/form/Button/index.ts +2 -0
- package/src/components/form/Calendar/Calendar.md +807 -0
- package/src/components/form/Calendar/Calendar.stories.tsx +349 -0
- package/src/components/form/Calendar/Calendar.test.stories.tsx +465 -0
- package/src/components/form/Calendar/Calendar.tsx +571 -0
- package/src/components/form/Calendar/Calendar.types.ts +81 -0
- package/src/components/form/Calendar/index.ts +11 -0
- package/src/components/form/Checkbox/Checkbox.md +200 -0
- package/src/components/form/Checkbox/Checkbox.stories.tsx +265 -0
- package/src/components/form/Checkbox/Checkbox.test.stories.tsx +181 -0
- package/src/components/form/Checkbox/Checkbox.tsx +170 -0
- package/src/components/form/Checkbox/Checkbox.types.ts +20 -0
- package/src/components/form/Checkbox/index.ts +2 -0
- package/src/components/form/CodeEditor/CodeEditor.md +350 -0
- package/src/components/form/CodeEditor/CodeEditor.stories.tsx +871 -0
- package/src/components/form/CodeEditor/CodeEditor.test.stories.tsx +575 -0
- package/src/components/form/CodeEditor/CodeEditor.tsx +415 -0
- package/src/components/form/CodeEditor/CodeEditor.types.ts +38 -0
- package/src/components/form/CodeEditor/index.ts +2 -0
- package/src/components/form/Command/Command.md +468 -0
- package/src/components/form/Command/Command.stories.tsx +580 -0
- package/src/components/form/Command/Command.test.stories.tsx +215 -0
- package/src/components/form/Command/Command.tsx +545 -0
- package/src/components/form/Command/Command.types.ts +116 -0
- package/src/components/form/Command/index.ts +12 -0
- package/src/components/form/CreatableSelect/CreatableSelect.md +114 -0
- package/src/components/form/CreatableSelect/CreatableSelect.stories.tsx +112 -0
- package/src/components/form/CreatableSelect/CreatableSelect.test.stories.tsx +134 -0
- package/src/components/form/CreatableSelect/CreatableSelect.tsx +149 -0
- package/src/components/form/CreatableSelect/CreatableSelect.types.ts +37 -0
- package/src/components/form/CreatableSelect/index.ts +2 -0
- package/src/components/form/Form/Form.md +325 -0
- package/src/components/form/Form/Form.stories.tsx +687 -0
- package/src/components/form/Form/Form.test.stories.tsx +601 -0
- package/src/components/form/Form/Form.tsx +136 -0
- package/src/components/form/Form/Form.types.ts +42 -0
- package/src/components/form/Form/index.ts +8 -0
- package/src/components/form/Input/Input.md +252 -0
- package/src/components/form/Input/Input.stories.tsx +256 -0
- package/src/components/form/Input/Input.test.stories.tsx +1184 -0
- package/src/components/form/Input/Input.tsx +263 -0
- package/src/components/form/Input/Input.types.ts +24 -0
- package/src/components/form/Input/index.ts +2 -0
- package/src/components/form/InputOTP/InputOTP.md +419 -0
- package/src/components/form/InputOTP/InputOTP.stories.tsx +774 -0
- package/src/components/form/InputOTP/InputOTP.test.stories.tsx +596 -0
- package/src/components/form/InputOTP/InputOTP.tsx +231 -0
- package/src/components/form/InputOTP/InputOTP.types.ts +68 -0
- package/src/components/form/InputOTP/index.ts +2 -0
- package/src/components/form/Label/Label.md +426 -0
- package/src/components/form/Label/Label.stories.tsx +473 -0
- package/src/components/form/Label/Label.test.stories.tsx +909 -0
- package/src/components/form/Label/Label.tsx +367 -0
- package/src/components/form/Label/Label.types.ts +35 -0
- package/src/components/form/Label/index.ts +2 -0
- package/src/components/form/Menubar/Menubar.md +275 -0
- package/src/components/form/Menubar/Menubar.stories.tsx +472 -0
- package/src/components/form/Menubar/Menubar.test.stories.tsx +588 -0
- package/src/components/form/Menubar/Menubar.tsx +467 -0
- package/src/components/form/Menubar/Menubar.types.ts +71 -0
- package/src/components/form/Menubar/index.ts +8 -0
- package/src/components/form/PasswordStrength/PasswordStrength.md +139 -0
- package/src/components/form/PasswordStrength/PasswordStrength.stories.tsx +562 -0
- package/src/components/form/PasswordStrength/PasswordStrength.test.stories.tsx +327 -0
- package/src/components/form/PasswordStrength/PasswordStrength.tsx +419 -0
- package/src/components/form/PasswordStrength/PasswordStrength.types.ts +18 -0
- package/src/components/form/PasswordStrength/index.ts +2 -0
- package/src/components/form/PhoneInput/PhoneInput.md +578 -0
- package/src/components/form/PhoneInput/PhoneInput.stories.tsx +495 -0
- package/src/components/form/PhoneInput/PhoneInput.test.stories.tsx +666 -0
- package/src/components/form/PhoneInput/PhoneInput.tsx +376 -0
- package/src/components/form/PhoneInput/PhoneInput.types.ts +25 -0
- package/src/components/form/PhoneInput/index.ts +2 -0
- package/src/components/form/RadioGroup/RadioGroup.md +477 -0
- package/src/components/form/RadioGroup/RadioGroup.stories.tsx +518 -0
- package/src/components/form/RadioGroup/RadioGroup.test.stories.tsx +685 -0
- package/src/components/form/RadioGroup/RadioGroup.tsx +664 -0
- package/src/components/form/RadioGroup/RadioGroup.types.ts +82 -0
- package/src/components/form/RadioGroup/index.ts +2 -0
- package/src/components/form/RichTextEditor/RichTextEditor.md +710 -0
- package/src/components/form/RichTextEditor/RichTextEditor.stories.tsx +261 -0
- package/src/components/form/RichTextEditor/RichTextEditor.test.stories.tsx +498 -0
- package/src/components/form/RichTextEditor/RichTextEditor.tsx +468 -0
- package/src/components/form/RichTextEditor/RichTextEditor.types.ts +72 -0
- package/src/components/form/RichTextEditor/index.ts +2 -0
- package/src/components/form/SearchPalette/SearchPalette.md +69 -0
- package/src/components/form/SearchPalette/SearchPalette.parts.tsx +358 -0
- package/src/components/form/SearchPalette/SearchPalette.stories.tsx +135 -0
- package/src/components/form/SearchPalette/SearchPalette.tsx +141 -0
- package/src/components/form/SearchPalette/SearchPalette.types.ts +82 -0
- package/src/components/form/SearchPalette/index.ts +7 -0
- package/src/components/form/Select/Select.md +254 -0
- package/src/components/form/Select/Select.stories.tsx +364 -0
- package/src/components/form/Select/Select.test.stories.tsx +977 -0
- package/src/components/form/Select/Select.tsx +239 -0
- package/src/components/form/Select/Select.types.ts +57 -0
- package/src/components/form/Select/index.ts +2 -0
- package/src/components/form/Slider/Slider.md +326 -0
- package/src/components/form/Slider/Slider.stories.tsx +418 -0
- package/src/components/form/Slider/Slider.test.stories.tsx +1044 -0
- package/src/components/form/Slider/Slider.tsx +374 -0
- package/src/components/form/Slider/Slider.types.ts +113 -0
- package/src/components/form/Slider/index.ts +2 -0
- package/src/components/form/Switch/Switch.md +565 -0
- package/src/components/form/Switch/Switch.stories.tsx +697 -0
- package/src/components/form/Switch/Switch.test.stories.tsx +597 -0
- package/src/components/form/Switch/Switch.tsx +578 -0
- package/src/components/form/Switch/Switch.types.ts +130 -0
- package/src/components/form/Switch/index.ts +2 -0
- package/src/components/form/Textarea/Textarea.stories.tsx +473 -0
- package/src/components/form/Textarea/Textarea.test.stories.tsx +708 -0
- package/src/components/form/Textarea/Textarea.tsx +678 -0
- package/src/components/form/Textarea/Textarea.types.ts +84 -0
- package/src/components/form/Textarea/index.ts +2 -0
- package/src/components/form/Toggle/Toggle.md +234 -0
- package/src/components/form/Toggle/Toggle.stories.tsx +638 -0
- package/src/components/form/Toggle/Toggle.test.stories.tsx +1167 -0
- package/src/components/form/Toggle/Toggle.tsx +265 -0
- package/src/components/form/Toggle/Toggle.types.ts +79 -0
- package/src/components/form/Toggle/index.ts +2 -0
- package/src/components/form/ToggleGroup/ToggleGroup.md +329 -0
- package/src/components/form/ToggleGroup/ToggleGroup.stories.tsx +617 -0
- package/src/components/form/ToggleGroup/ToggleGroup.test.stories.tsx +918 -0
- package/src/components/form/ToggleGroup/ToggleGroup.tsx +129 -0
- package/src/components/form/ToggleGroup/ToggleGroup.types.ts +53 -0
- package/src/components/form/ToggleGroup/index.ts +2 -0
- package/src/components/form/UploadButton/UploadButton.md +44 -0
- package/src/components/form/UploadButton/UploadButton.stories.tsx +366 -0
- package/src/components/form/UploadButton/UploadButton.test.stories.tsx +454 -0
- package/src/components/form/UploadButton/UploadButton.tsx +312 -0
- package/src/components/form/UploadButton/UploadButton.types.ts +58 -0
- package/src/components/form/UploadButton/index.ts +2 -0
- package/src/components/form/index.ts +25 -0
- package/src/components/form/total-form/Fields/SelectField.tsx +57 -0
- package/src/components/form/total-form/Fields/TextField.tsx +58 -0
- package/src/components/form/total-form/Fields/index.ts +4 -0
- package/src/components/form/total-form/FormContainer.tsx +104 -0
- package/src/components/form/total-form/FormContext.tsx +38 -0
- package/src/components/form/total-form/FormErrorSnackbar.tsx +35 -0
- package/src/components/form/total-form/SubmitButton.tsx +27 -0
- package/src/components/form/total-form/index.ts +12 -0
- package/src/components/form/total-form/total-form.test.tsx +97 -0
- package/src/components/index.ts +7 -0
- package/src/components/layout/Accordion/Accordion.md +725 -0
- package/src/components/layout/Accordion/Accordion.stories.tsx +690 -0
- package/src/components/layout/Accordion/Accordion.test.stories.tsx +1362 -0
- package/src/components/layout/Accordion/Accordion.tsx +242 -0
- package/src/components/layout/Accordion/Accordion.types.ts +32 -0
- package/src/components/layout/Accordion/index.ts +8 -0
- package/src/components/layout/Card/Card.md +533 -0
- package/src/components/layout/Card/Card.stories.tsx +593 -0
- package/src/components/layout/Card/Card.test.stories.tsx +1134 -0
- package/src/components/layout/Card/Card.tsx +404 -0
- package/src/components/layout/Card/Card.types.ts +57 -0
- package/src/components/layout/Card/index.ts +8 -0
- package/src/components/layout/Collapsible/Collapsible.md +135 -0
- package/src/components/layout/Collapsible/Collapsible.stories.tsx +180 -0
- package/src/components/layout/Collapsible/Collapsible.test.stories.tsx +304 -0
- package/src/components/layout/Collapsible/Collapsible.tsx +198 -0
- package/src/components/layout/Collapsible/Collapsible.types.ts +35 -0
- package/src/components/layout/Collapsible/index.ts +6 -0
- package/src/components/layout/Container/Container.md +420 -0
- package/src/components/layout/Container/Container.stories.tsx +557 -0
- package/src/components/layout/Container/Container.test.stories.tsx +750 -0
- package/src/components/layout/Container/Container.tsx +72 -0
- package/src/components/layout/Container/Container.types.ts +11 -0
- package/src/components/layout/Container/index.ts +2 -0
- package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +99 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.md +75 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.stories.tsx +129 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.test.stories.tsx +251 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.tsx +108 -0
- package/src/components/layout/ContentToolbar/ContentToolbar.types.ts +229 -0
- package/src/components/layout/ContentToolbar/FilterTrigger.tsx +71 -0
- package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +297 -0
- package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +334 -0
- package/src/components/layout/ContentToolbar/SortByDropdown.tsx +213 -0
- package/src/components/layout/ContentToolbar/ViewSelector.tsx +98 -0
- package/src/components/layout/ContentToolbar/__tests__/ColumnsMenu.test.tsx +39 -0
- package/src/components/layout/ContentToolbar/__tests__/MultiSelectDropdown.test.tsx +110 -0
- package/src/components/layout/ContentToolbar/__tests__/SavedViewsMenu.test.tsx +99 -0
- package/src/components/layout/ContentToolbar/index.ts +24 -0
- package/src/components/layout/ContentToolbar/tests.md +42 -0
- package/src/components/layout/ContentToolbar/track.md +41 -0
- package/src/components/layout/Dashboard/Dashboard.md +71 -0
- package/src/components/layout/Dashboard/Dashboard.stories.tsx +104 -0
- package/src/components/layout/Dashboard/Dashboard.test.stories.tsx +164 -0
- package/src/components/layout/Dashboard/Dashboard.tsx +297 -0
- package/src/components/layout/Dashboard/Dashboard.types.ts +157 -0
- package/src/components/layout/Dashboard/DashboardContext.tsx +47 -0
- package/src/components/layout/Dashboard/DashboardParts.tsx +216 -0
- package/src/components/layout/Dashboard/index.ts +18 -0
- package/src/components/layout/Dashboard/tests.md +46 -0
- package/src/components/layout/Dashboard/track.md +50 -0
- package/src/components/layout/Drawer/Drawer.md +479 -0
- package/src/components/layout/Drawer/Drawer.stories.tsx +660 -0
- package/src/components/layout/Drawer/Drawer.test.stories.tsx +1339 -0
- package/src/components/layout/Drawer/Drawer.tsx +150 -0
- package/src/components/layout/Drawer/Drawer.types.ts +34 -0
- package/src/components/layout/Drawer/index.ts +2 -0
- package/src/components/layout/Resizable/Resizable.md +308 -0
- package/src/components/layout/Resizable/Resizable.stories.tsx +1039 -0
- package/src/components/layout/Resizable/Resizable.test.stories.tsx +750 -0
- package/src/components/layout/Resizable/Resizable.tsx +190 -0
- package/src/components/layout/Resizable/Resizable.types.ts +34 -0
- package/src/components/layout/Resizable/index.ts +2 -0
- package/src/components/layout/ScrollArea/ScrollArea.md +122 -0
- package/src/components/layout/ScrollArea/ScrollArea.stories.tsx +651 -0
- package/src/components/layout/ScrollArea/ScrollArea.test.stories.tsx +619 -0
- package/src/components/layout/ScrollArea/ScrollArea.tsx +449 -0
- package/src/components/layout/ScrollArea/ScrollArea.types.ts +80 -0
- package/src/components/layout/ScrollArea/index.ts +7 -0
- package/src/components/layout/Separator/Separator.stories.tsx +563 -0
- package/src/components/layout/Separator/Separator.test.stories.tsx +527 -0
- package/src/components/layout/Separator/Separator.tsx +187 -0
- package/src/components/layout/Separator/Separator.types.ts +17 -0
- package/src/components/layout/Separator/index.ts +2 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.md +139 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.parts.tsx +357 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.stories.tsx +194 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.test.stories.tsx +175 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.tsx +69 -0
- package/src/components/layout/SettingsLayout/SettingsLayout.types.ts +61 -0
- package/src/components/layout/SettingsLayout/index.ts +6 -0
- package/src/components/layout/Sidebar/Sidebar.md +367 -0
- package/src/components/layout/Sidebar/Sidebar.stories.tsx +611 -0
- package/src/components/layout/Sidebar/Sidebar.test.stories.tsx +1326 -0
- package/src/components/layout/Sidebar/Sidebar.tsx +131 -0
- package/src/components/layout/Sidebar/Sidebar.types.ts +30 -0
- package/src/components/layout/Sidebar/index.ts +7 -0
- package/src/components/layout/Skeleton/Skeleton.md +240 -0
- package/src/components/layout/Skeleton/Skeleton.stories.tsx +689 -0
- package/src/components/layout/Skeleton/Skeleton.test.stories.tsx +521 -0
- package/src/components/layout/Skeleton/Skeleton.tsx +166 -0
- package/src/components/layout/Skeleton/Skeleton.types.ts +19 -0
- package/src/components/layout/Skeleton/index.ts +2 -0
- package/src/components/layout/Spacer/Spacer.md +84 -0
- package/src/components/layout/Spacer/Spacer.stories.tsx +502 -0
- package/src/components/layout/Spacer/Spacer.test.stories.tsx +472 -0
- package/src/components/layout/Spacer/Spacer.tsx +68 -0
- package/src/components/layout/Spacer/Spacer.types.ts +12 -0
- package/src/components/layout/Spacer/index.ts +2 -0
- package/src/components/layout/TableFilter/TableFilter.md +55 -0
- package/src/components/layout/TableFilter/TableFilter.stories.tsx +82 -0
- package/src/components/layout/TableFilter/TableFilter.test.stories.tsx +87 -0
- package/src/components/layout/TableFilter/TableFilter.tsx +383 -0
- package/src/components/layout/TableFilter/TableFilter.types.ts +87 -0
- package/src/components/layout/TableFilter/TableFilterContext.tsx +29 -0
- package/src/components/layout/TableFilter/index.ts +15 -0
- package/src/components/layout/TableFilter/tests.md +37 -0
- package/src/components/layout/TableFilter/track.md +36 -0
- package/src/components/layout/index.ts +14 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.md +558 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.stories.tsx +640 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.test.stories.tsx +1007 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +516 -0
- package/src/components/navigation/Breadcrumbs/Breadcrumbs.types.ts +132 -0
- package/src/components/navigation/Breadcrumbs/index.ts +2 -0
- package/src/components/navigation/CommandPalette/CommandPalette.md +201 -0
- package/src/components/navigation/CommandPalette/CommandPalette.stories.tsx +384 -0
- package/src/components/navigation/CommandPalette/CommandPalette.test.stories.tsx +437 -0
- package/src/components/navigation/CommandPalette/CommandPalette.tsx +434 -0
- package/src/components/navigation/CommandPalette/CommandPalette.types.ts +25 -0
- package/src/components/navigation/CommandPalette/index.ts +2 -0
- package/src/components/navigation/ContextMenu/ContextMenu.md +535 -0
- package/src/components/navigation/ContextMenu/ContextMenu.stories.tsx +611 -0
- package/src/components/navigation/ContextMenu/ContextMenu.test.stories.tsx +850 -0
- package/src/components/navigation/ContextMenu/ContextMenu.tsx +254 -0
- package/src/components/navigation/ContextMenu/ContextMenu.types.ts +96 -0
- package/src/components/navigation/ContextMenu/index.ts +2 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.md +514 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.stories.tsx +580 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.test.stories.tsx +660 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +305 -0
- package/src/components/navigation/DropdownMenu/DropdownMenu.types.ts +116 -0
- package/src/components/navigation/DropdownMenu/index.ts +2 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.md +580 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +874 -0
- package/src/components/navigation/NavigationMenu/NavigationMenu.types.ts +135 -0
- package/src/components/navigation/NavigationMenu/index.ts +2 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.stories.tsx +518 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenu.test.stories.tsx +931 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuHorizontal.stories.tsx +503 -0
- package/src/components/navigation/NavigationMenu/stories/NavigationMenuVertical.stories.tsx +455 -0
- package/src/components/navigation/Pagination/Pagination.md +699 -0
- package/src/components/navigation/Pagination/Pagination.stories.tsx +604 -0
- package/src/components/navigation/Pagination/Pagination.test.stories.tsx +520 -0
- package/src/components/navigation/Pagination/Pagination.tsx +356 -0
- package/src/components/navigation/Pagination/Pagination.types.ts +129 -0
- package/src/components/navigation/Pagination/index.ts +2 -0
- package/src/components/navigation/Tabs/Tabs.md +774 -0
- package/src/components/navigation/Tabs/Tabs.stories.tsx +1006 -0
- package/src/components/navigation/Tabs/Tabs.test.stories.tsx +1225 -0
- package/src/components/navigation/Tabs/Tabs.tsx +433 -0
- package/src/components/navigation/Tabs/Tabs.types.ts +239 -0
- package/src/components/navigation/Tabs/index.ts +2 -0
- package/src/components/navigation/index.ts +7 -0
- package/src/components/typography/Blockquote/Blockquote.md +130 -0
- package/src/components/typography/Blockquote/Blockquote.stories.tsx +359 -0
- package/src/components/typography/Blockquote/Blockquote.test.stories.tsx +432 -0
- package/src/components/typography/Blockquote/Blockquote.tsx +166 -0
- package/src/components/typography/Blockquote/Blockquote.types.ts +11 -0
- package/src/components/typography/Blockquote/index.ts +2 -0
- package/src/components/typography/Code/Code.md +182 -0
- package/src/components/typography/Code/Code.stories.tsx +686 -0
- package/src/components/typography/Code/Code.test.stories.tsx +703 -0
- package/src/components/typography/Code/Code.tsx +228 -0
- package/src/components/typography/Code/Code.types.ts +12 -0
- package/src/components/typography/Code/index.ts +2 -0
- package/src/components/typography/Heading/Heading.md +143 -0
- package/src/components/typography/Heading/Heading.stories.tsx +451 -0
- package/src/components/typography/Heading/Heading.test.stories.tsx +830 -0
- package/src/components/typography/Heading/Heading.tsx +178 -0
- package/src/components/typography/Heading/Heading.types.ts +11 -0
- package/src/components/typography/Heading/index.ts +2 -0
- package/src/components/typography/Paragraph/Paragraph.md +80 -0
- package/src/components/typography/Paragraph/Paragraph.stories.tsx +280 -0
- package/src/components/typography/Paragraph/Paragraph.test.stories.tsx +238 -0
- package/src/components/typography/Paragraph/Paragraph.tsx +99 -0
- package/src/components/typography/Paragraph/Paragraph.types.ts +10 -0
- package/src/components/typography/Paragraph/index.ts +2 -0
- package/src/components/typography/Text/Text.md +129 -0
- package/src/components/typography/Text/Text.stories.tsx +359 -0
- package/src/components/typography/Text/Text.test.stories.tsx +762 -0
- package/src/components/typography/Text/Text.tsx +159 -0
- package/src/components/typography/Text/Text.types.ts +15 -0
- package/src/components/typography/Text/index.ts +2 -0
- package/src/components/typography/index.ts +5 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.md +359 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.stories.tsx +947 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.test.stories.tsx +596 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.tsx +595 -0
- package/src/components/utility/AnimatedIcon/AnimatedIcon.types.ts +98 -0
- package/src/components/utility/AnimatedIcon/index.ts +2 -0
- package/src/components/utility/AspectRatio/AspectRatio.md +200 -0
- package/src/components/utility/AspectRatio/AspectRatio.stories.tsx +414 -0
- package/src/components/utility/AspectRatio/AspectRatio.test.stories.tsx +859 -0
- package/src/components/utility/AspectRatio/AspectRatio.tsx +76 -0
- package/src/components/utility/AspectRatio/AspectRatio.types.ts +13 -0
- package/src/components/utility/AspectRatio/index.ts +2 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.md +531 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.stories.tsx +620 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.test.stories.tsx +358 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +204 -0
- package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +39 -0
- package/src/components/utility/InfiniteScroll/index.ts +6 -0
- package/src/components/utility/Portal/Portal.button-container.example.tsx +99 -0
- package/src/components/utility/Portal/Portal.md +593 -0
- package/src/components/utility/Portal/Portal.stories.tsx +340 -0
- package/src/components/utility/Portal/Portal.test.stories.tsx +2086 -0
- package/src/components/utility/Portal/Portal.tsx +39 -0
- package/src/components/utility/Portal/Portal.types.ts +7 -0
- package/src/components/utility/Portal/index.ts +2 -0
- package/src/components/utility/Transition/Transition.md +684 -0
- package/src/components/utility/Transition/Transition.stories.tsx +493 -0
- package/src/components/utility/Transition/Transition.test.stories.tsx +854 -0
- package/src/components/utility/Transition/Transition.tsx +140 -0
- package/src/components/utility/Transition/Transition.types.ts +14 -0
- package/src/components/utility/Transition/index.ts +6 -0
- package/src/components/utility/VirtualList/VirtualList.md +520 -0
- package/src/components/utility/VirtualList/VirtualList.stories.tsx +1073 -0
- package/src/components/utility/VirtualList/VirtualList.test.stories.tsx +1074 -0
- package/src/components/utility/VirtualList/VirtualList.tsx +369 -0
- package/src/components/utility/VirtualList/VirtualList.types.ts +56 -0
- package/src/components/utility/VirtualList/index.ts +7 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.md +187 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.stories.tsx +433 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.test.stories.tsx +364 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.tsx +506 -0
- package/src/components/utility/WorkflowStep/WorkflowStep.types.ts +133 -0
- package/src/components/utility/WorkflowStep/index.ts +13 -0
- package/src/components/utility/index.ts +7 -0
- package/src/index.ts +17 -0
- package/src/mui/AppBar.ts +2 -0
- package/src/mui/Box.ts +2 -0
- package/src/mui/CssBaseline.ts +2 -0
- package/src/mui/FormControl.ts +2 -0
- package/src/mui/FormControlLabel.ts +2 -0
- package/src/mui/Grid2.ts +2 -0
- package/src/mui/InputLabel.ts +2 -0
- package/src/mui/List.ts +2 -0
- package/src/mui/ListItem.ts +2 -0
- package/src/mui/ListItemButton.ts +2 -0
- package/src/mui/ListItemText.ts +2 -0
- package/src/mui/Stack.ts +2 -0
- package/src/mui/SvgIcon.ts +2 -0
- package/src/mui/Toolbar.ts +2 -0
- package/src/mui/styles.ts +2 -0
- package/src/mui/useMediaQuery.ts +1 -0
- package/src/social-login-button.tsx +199 -0
- package/src/user-avatar.tsx +102 -0
- package/src/utils/cn.ts +9 -0
- package/src/utils/index.ts +1 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { PopoverProps as MuiPopoverProps } from '@mui/material';
|
|
2
|
+
|
|
3
|
+
export type HoverCardPlacement =
|
|
4
|
+
| 'top' | 'top-start' | 'top-end'
|
|
5
|
+
| 'bottom' | 'bottom-start' | 'bottom-end'
|
|
6
|
+
| 'left' | 'left-start' | 'left-end'
|
|
7
|
+
| 'right' | 'right-start' | 'right-end';
|
|
8
|
+
|
|
9
|
+
export type HoverCardAnimation = 'fade' | 'scale' | 'slide-up' | 'slide-down' | 'slide-left' | 'slide-right';
|
|
10
|
+
|
|
11
|
+
export interface HoverCardProps extends Omit<MuiPopoverProps, 'variant' | 'open' | 'anchorEl'> {
|
|
12
|
+
/**
|
|
13
|
+
* The variant of the hover card
|
|
14
|
+
*/
|
|
15
|
+
variant?: 'default' | 'glass' | 'detailed' | 'minimal';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Whether the card should have a glow effect
|
|
19
|
+
*/
|
|
20
|
+
glow?: boolean;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Whether the card should have a pulse animation
|
|
24
|
+
*/
|
|
25
|
+
pulse?: boolean;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Title of the hover card
|
|
29
|
+
*/
|
|
30
|
+
title?: string;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Description text
|
|
34
|
+
*/
|
|
35
|
+
description?: string;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Avatar/image source or React element
|
|
39
|
+
*/
|
|
40
|
+
avatar?: string | React.ReactElement;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Custom trigger element
|
|
44
|
+
*/
|
|
45
|
+
trigger?: React.ReactElement;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Placement of the hover card relative to trigger
|
|
49
|
+
*/
|
|
50
|
+
placement?: HoverCardPlacement;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Whether to show an arrow pointing to trigger
|
|
54
|
+
*/
|
|
55
|
+
showArrow?: boolean;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Animation type for entrance/exit
|
|
59
|
+
*/
|
|
60
|
+
animation?: HoverCardAnimation;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Delay before showing hover card (ms)
|
|
64
|
+
*/
|
|
65
|
+
enterDelay?: number;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Delay before hiding hover card (ms)
|
|
69
|
+
*/
|
|
70
|
+
exitDelay?: number;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Maximum width of the card
|
|
74
|
+
*/
|
|
75
|
+
maxWidth?: number;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Whether the card is in loading state
|
|
79
|
+
*/
|
|
80
|
+
loading?: boolean;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Loading component to show when loading=true
|
|
84
|
+
*/
|
|
85
|
+
loadingComponent?: React.ReactNode;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Whether to enable touch/click interaction on mobile devices
|
|
89
|
+
*/
|
|
90
|
+
touchEnabled?: boolean;
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Custom offset from the trigger element
|
|
94
|
+
*/
|
|
95
|
+
offset?: number;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Whether to disable the hover card
|
|
99
|
+
*/
|
|
100
|
+
disabled?: boolean;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Callback when hover card opens
|
|
104
|
+
*/
|
|
105
|
+
onOpen?: () => void;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Callback when hover card closes
|
|
109
|
+
*/
|
|
110
|
+
onClose?: () => void;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Data test ID for testing purposes
|
|
114
|
+
*/
|
|
115
|
+
dataTestId?: string;
|
|
116
|
+
}
|
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
# InteractiveTooltip Component
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The InteractiveTooltip component displays contextual information with advanced interaction patterns. Unlike standard tooltips, it supports click-to-pin functionality and dual content modes - showing brief information on hover and detailed content when pinned. Built on MUI's Tooltip with custom styling and interactive behavior.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Click-to-Pin**: Click to keep tooltip open, click outside to close
|
|
10
|
+
- **Dual Content Modes**: Different content for hover vs pinned states
|
|
11
|
+
- **Multiple Variants**: Default, dark, light, and glass morphism styles with distinct appearances
|
|
12
|
+
- **Size Options**: Small, medium, and large sizes
|
|
13
|
+
- **Visual Effects**: Glow effect and pulse animation support
|
|
14
|
+
- **Outside Click Detection**: Automatically closes when clicking outside
|
|
15
|
+
- **Accessibility**: Full ARIA support and screen reader compatibility
|
|
16
|
+
- **Responsive**: Adapts to different screen sizes and viewport widths
|
|
17
|
+
- **Performance**: Optimized with minimal re-renders and smooth animations
|
|
18
|
+
|
|
19
|
+
## Variant Comparison
|
|
20
|
+
|
|
21
|
+
Each variant is designed for specific use cases with distinct visual characteristics:
|
|
22
|
+
|
|
23
|
+
| Variant | Background | Text Color | Border | Shadow | Best For |
|
|
24
|
+
| --------- | ----------------------- | ---------- | ------------ | ------------ | ---------------------------------- |
|
|
25
|
+
| `default` | Dark gray (92% opacity) | White | None | Medium | General use, neutral appearance |
|
|
26
|
+
| `dark` | Pure black (#000) | White | Subtle white | Strong | High contrast, emphasis |
|
|
27
|
+
| `light` | White | Dark gray | Gray border | Soft | Dark mode, light backgrounds |
|
|
28
|
+
| `glass` | Translucent (75%) | Theme text | Subtle | Soft + Blur | Modern UI, complex backgrounds |
|
|
29
|
+
|
|
30
|
+
## Use Cases
|
|
31
|
+
|
|
32
|
+
- **Data Visualizations**: Heatmaps, charts, and graphs where users need to compare detailed information
|
|
33
|
+
- **Complex Information**: Showing summary on hover, full details when pinned
|
|
34
|
+
- **Interactive Tables**: Cell tooltips that can be pinned for detailed inspection
|
|
35
|
+
- **Status Indicators**: Quick status on hover, detailed metrics when clicked
|
|
36
|
+
|
|
37
|
+
## Props
|
|
38
|
+
|
|
39
|
+
### Core Props
|
|
40
|
+
|
|
41
|
+
| Prop | Type | Default | Description |
|
|
42
|
+
| ---------------- | ----------------- | ----------- | -------------------------------------------------------- |
|
|
43
|
+
| `hoverContent` | `React.ReactNode` | - | **Required.** Content displayed when hovering (not pinned) |
|
|
44
|
+
| `pinnedContent` | `React.ReactNode` | - | **Required.** Content displayed when pinned (clicked) |
|
|
45
|
+
| `children` | `React.ReactElement` | - | **Required.** Element that triggers the tooltip |
|
|
46
|
+
| `clickable` | `boolean` | `true` | Whether tooltip can be pinned by clicking |
|
|
47
|
+
| `variant` | `'default' \| 'dark' \| 'light' \| 'glass'` | `'default'` | Visual style variant |
|
|
48
|
+
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Size of the tooltip |
|
|
49
|
+
| `glow` | `boolean` | `false` | Whether tooltip has glow effect |
|
|
50
|
+
| `pulse` | `boolean` | `false` | Whether tooltip has pulse animation |
|
|
51
|
+
| `maxWidth` | `number` | `300` | Maximum width of tooltip in pixels |
|
|
52
|
+
| `className` | `string` | - | Custom class name for wrapper |
|
|
53
|
+
| `dataTestId` | `string` | - | Test ID for testing (applied to trigger and content) |
|
|
54
|
+
|
|
55
|
+
### Callback Props
|
|
56
|
+
|
|
57
|
+
| Prop | Type | Description |
|
|
58
|
+
| --------- | ------------ | ---------------------------------- |
|
|
59
|
+
| `onPin` | `() => void` | Called when tooltip is pinned |
|
|
60
|
+
| `onUnpin` | `() => void` | Called when tooltip is unpinned |
|
|
61
|
+
|
|
62
|
+
### Additional Props
|
|
63
|
+
|
|
64
|
+
All MUI TooltipProps are supported except `variant` and `title` (replaced by our custom props).
|
|
65
|
+
|
|
66
|
+
## Usage Examples
|
|
67
|
+
|
|
68
|
+
### Basic Interactive Tooltip
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { InteractiveTooltip, Button } from '@app-services-monitoring/ui';
|
|
72
|
+
|
|
73
|
+
<InteractiveTooltip
|
|
74
|
+
hoverContent="Brief description"
|
|
75
|
+
pinnedContent={
|
|
76
|
+
<div>
|
|
77
|
+
<h4>Detailed Information</h4>
|
|
78
|
+
<p>More comprehensive details shown when pinned.</p>
|
|
79
|
+
</div>
|
|
80
|
+
}
|
|
81
|
+
>
|
|
82
|
+
<Button>Hover or Click</Button>
|
|
83
|
+
</InteractiveTooltip>;
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Heatmap Cell with Metrics
|
|
87
|
+
|
|
88
|
+
```tsx
|
|
89
|
+
import { InteractiveTooltip } from '@app-services-monitoring/ui';
|
|
90
|
+
|
|
91
|
+
<InteractiveTooltip
|
|
92
|
+
hoverContent="95.2% Success Rate"
|
|
93
|
+
pinnedContent={
|
|
94
|
+
<div>
|
|
95
|
+
<h4>Performance Metrics</h4>
|
|
96
|
+
<ul>
|
|
97
|
+
<li>Success Rate: 95.2%</li>
|
|
98
|
+
<li>Total Requests: 1,247</li>
|
|
99
|
+
<li>Avg Response: 145ms</li>
|
|
100
|
+
<li>Errors: 60</li>
|
|
101
|
+
</ul>
|
|
102
|
+
</div>
|
|
103
|
+
}
|
|
104
|
+
variant="glass"
|
|
105
|
+
size="md"
|
|
106
|
+
>
|
|
107
|
+
<div className="heatmap-cell">95.2%</div>
|
|
108
|
+
</InteractiveTooltip>;
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### With Callbacks
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
<InteractiveTooltip
|
|
115
|
+
hoverContent="Quick info"
|
|
116
|
+
pinnedContent="Detailed info"
|
|
117
|
+
onPin={() => console.log('Tooltip pinned')}
|
|
118
|
+
onUnpin={() => console.log('Tooltip unpinned')}
|
|
119
|
+
>
|
|
120
|
+
<Button>Interactive</Button>
|
|
121
|
+
</InteractiveTooltip>
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Non-Clickable (Standard Tooltip Behavior)
|
|
125
|
+
|
|
126
|
+
```tsx
|
|
127
|
+
<InteractiveTooltip
|
|
128
|
+
hoverContent="Hover-only tooltip"
|
|
129
|
+
pinnedContent="Never shown"
|
|
130
|
+
clickable={false}
|
|
131
|
+
>
|
|
132
|
+
<Button>Hover Only</Button>
|
|
133
|
+
</InteractiveTooltip>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Variant Examples
|
|
137
|
+
|
|
138
|
+
Each variant has distinct visual characteristics:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
// Default - Dark gray with medium opacity and subtle shadow
|
|
142
|
+
// Best for: General use, matches most UI contexts
|
|
143
|
+
<InteractiveTooltip
|
|
144
|
+
hoverContent="Default hover"
|
|
145
|
+
pinnedContent="Default pinned"
|
|
146
|
+
variant="default"
|
|
147
|
+
>
|
|
148
|
+
<Button>Default</Button>
|
|
149
|
+
</InteractiveTooltip>
|
|
150
|
+
|
|
151
|
+
// Dark - Pure black with stronger shadow and subtle border
|
|
152
|
+
// Best for: High contrast, emphasis on dark backgrounds
|
|
153
|
+
<InteractiveTooltip
|
|
154
|
+
hoverContent="Dark hover"
|
|
155
|
+
pinnedContent="Dark pinned"
|
|
156
|
+
variant="dark"
|
|
157
|
+
>
|
|
158
|
+
<Button>Dark</Button>
|
|
159
|
+
</InteractiveTooltip>
|
|
160
|
+
|
|
161
|
+
// Light - White background with dark text and visible border
|
|
162
|
+
// Best for: Dark mode UIs, high contrast against dark backgrounds
|
|
163
|
+
<InteractiveTooltip
|
|
164
|
+
hoverContent="Light hover"
|
|
165
|
+
pinnedContent="Light pinned"
|
|
166
|
+
variant="light"
|
|
167
|
+
>
|
|
168
|
+
<Button>Light</Button>
|
|
169
|
+
</InteractiveTooltip>
|
|
170
|
+
|
|
171
|
+
// Glass - Frosted glass effect with backdrop blur (75% opacity)
|
|
172
|
+
// Best for: Modern UIs, overlaying complex backgrounds
|
|
173
|
+
<InteractiveTooltip
|
|
174
|
+
hoverContent="Glass hover"
|
|
175
|
+
pinnedContent="Glass pinned"
|
|
176
|
+
variant="glass"
|
|
177
|
+
>
|
|
178
|
+
<Button>Glass</Button>
|
|
179
|
+
</InteractiveTooltip>
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Size Variations
|
|
183
|
+
|
|
184
|
+
```tsx
|
|
185
|
+
// Small tooltip
|
|
186
|
+
<InteractiveTooltip
|
|
187
|
+
hoverContent="Small"
|
|
188
|
+
pinnedContent="Small detailed"
|
|
189
|
+
size="sm"
|
|
190
|
+
>
|
|
191
|
+
<Button size="small">Small</Button>
|
|
192
|
+
</InteractiveTooltip>
|
|
193
|
+
|
|
194
|
+
// Large tooltip
|
|
195
|
+
<InteractiveTooltip
|
|
196
|
+
hoverContent="Large"
|
|
197
|
+
pinnedContent="Large detailed"
|
|
198
|
+
size="lg"
|
|
199
|
+
>
|
|
200
|
+
<Button size="large">Large</Button>
|
|
201
|
+
</InteractiveTooltip>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Visual Effects
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
// Glow effect
|
|
208
|
+
<InteractiveTooltip
|
|
209
|
+
hoverContent="Glowing"
|
|
210
|
+
pinnedContent="Still glowing"
|
|
211
|
+
glow
|
|
212
|
+
>
|
|
213
|
+
<Button>Glow</Button>
|
|
214
|
+
</InteractiveTooltip>
|
|
215
|
+
|
|
216
|
+
// Pulse animation
|
|
217
|
+
<InteractiveTooltip
|
|
218
|
+
hoverContent="Pulsing"
|
|
219
|
+
pinnedContent="Still pulsing"
|
|
220
|
+
pulse
|
|
221
|
+
>
|
|
222
|
+
<Button>Pulse</Button>
|
|
223
|
+
</InteractiveTooltip>
|
|
224
|
+
|
|
225
|
+
// Combined effects
|
|
226
|
+
<InteractiveTooltip
|
|
227
|
+
hoverContent="Glowing and pulsing"
|
|
228
|
+
pinnedContent="Still animated"
|
|
229
|
+
glow
|
|
230
|
+
pulse
|
|
231
|
+
>
|
|
232
|
+
<Button>Combined</Button>
|
|
233
|
+
</InteractiveTooltip>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Custom Placement
|
|
237
|
+
|
|
238
|
+
```tsx
|
|
239
|
+
<InteractiveTooltip
|
|
240
|
+
hoverContent="Top placement"
|
|
241
|
+
pinnedContent="Detailed top"
|
|
242
|
+
placement="top"
|
|
243
|
+
>
|
|
244
|
+
<Button>Top</Button>
|
|
245
|
+
</InteractiveTooltip>
|
|
246
|
+
|
|
247
|
+
<InteractiveTooltip
|
|
248
|
+
hoverContent="Right placement"
|
|
249
|
+
pinnedContent="Detailed right"
|
|
250
|
+
placement="right"
|
|
251
|
+
>
|
|
252
|
+
<Button>Right</Button>
|
|
253
|
+
</InteractiveTooltip>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Behavior
|
|
257
|
+
|
|
258
|
+
### Interaction Flow
|
|
259
|
+
|
|
260
|
+
1. **Hover**: Shows `hoverContent` on mouse enter
|
|
261
|
+
2. **Click**: Pins tooltip and switches to `pinnedContent`
|
|
262
|
+
3. **Click Trigger Again**: Unpins tooltip
|
|
263
|
+
4. **Click Outside**: Unpins tooltip
|
|
264
|
+
5. **Unhover (when not pinned)**: Hides tooltip
|
|
265
|
+
|
|
266
|
+
### Pinned State
|
|
267
|
+
|
|
268
|
+
When pinned:
|
|
269
|
+
- Tooltip remains open regardless of hover state
|
|
270
|
+
- Shows `pinnedContent` instead of `hoverContent`
|
|
271
|
+
- Click outside to close
|
|
272
|
+
- Click trigger again to toggle
|
|
273
|
+
|
|
274
|
+
### Non-Clickable Mode
|
|
275
|
+
|
|
276
|
+
When `clickable={false}`:
|
|
277
|
+
- Behaves like standard tooltip
|
|
278
|
+
- Only shows on hover
|
|
279
|
+
- Always displays `hoverContent`
|
|
280
|
+
- `pinnedContent` is never shown
|
|
281
|
+
|
|
282
|
+
## Accessibility
|
|
283
|
+
|
|
284
|
+
The InteractiveTooltip component includes comprehensive accessibility features:
|
|
285
|
+
|
|
286
|
+
- **ARIA Attributes**: Proper `role="tooltip"` and ARIA labeling
|
|
287
|
+
- **Keyboard Navigation**: Full keyboard support with focus management
|
|
288
|
+
- **Screen Reader**: Compatible with screen reader technologies
|
|
289
|
+
- **Focus Management**: Maintains focus on trigger elements
|
|
290
|
+
- **High Contrast**: Supports high contrast mode and theme variations
|
|
291
|
+
- **Interactive Content**: Pinned tooltips allow interaction with content
|
|
292
|
+
|
|
293
|
+
## Best Practices
|
|
294
|
+
|
|
295
|
+
1. **Keep hover content brief** - Show only essential info on hover
|
|
296
|
+
2. **Use pinned content for details** - Full information when user clicks
|
|
297
|
+
3. **Consider mobile users** - Pin functionality works well on touch devices
|
|
298
|
+
4. **Don't hide critical information** - Ensure important data is accessible without interaction
|
|
299
|
+
5. **Test accessibility** - Verify tooltips work with keyboard and screen readers
|
|
300
|
+
6. **Use appropriate variants** - Match tooltip style to your design system
|
|
301
|
+
7. **Provide clear indicators** - Make it obvious the tooltip is clickable
|
|
302
|
+
8. **Optimize content size** - Keep pinned content concise and scannable
|
|
303
|
+
|
|
304
|
+
## Theme Integration
|
|
305
|
+
|
|
306
|
+
The InteractiveTooltip component integrates with the MUI theme system:
|
|
307
|
+
|
|
308
|
+
```tsx
|
|
309
|
+
// Uses theme colors and spacing
|
|
310
|
+
<InteractiveTooltip
|
|
311
|
+
hoverContent="Themed"
|
|
312
|
+
pinnedContent="Fully themed"
|
|
313
|
+
variant="default"
|
|
314
|
+
>
|
|
315
|
+
<Button>Themed</Button>
|
|
316
|
+
</InteractiveTooltip>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
## Performance Notes
|
|
320
|
+
|
|
321
|
+
- Minimal re-renders with optimized state management
|
|
322
|
+
- Efficient outside click detection with cleanup
|
|
323
|
+
- Lightweight animations that don't impact performance
|
|
324
|
+
- Portal-based rendering for optimal z-index management
|
|
325
|
+
- Uses React.memo and useCallback for optimization
|
|
326
|
+
|
|
327
|
+
## Common Patterns
|
|
328
|
+
|
|
329
|
+
### Data Visualization Tooltips
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
<InteractiveTooltip
|
|
333
|
+
hoverContent={`${percentage}%`}
|
|
334
|
+
pinnedContent={
|
|
335
|
+
<div>
|
|
336
|
+
<h4>{database}</h4>
|
|
337
|
+
<p>Success Rate: {percentage}%</p>
|
|
338
|
+
<p>Total Queries: {total}</p>
|
|
339
|
+
<p>Errors: {errors}</p>
|
|
340
|
+
</div>
|
|
341
|
+
}
|
|
342
|
+
variant="glass"
|
|
343
|
+
>
|
|
344
|
+
<div className="chart-point" />
|
|
345
|
+
</InteractiveTooltip>
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
### Status Indicators
|
|
349
|
+
|
|
350
|
+
```tsx
|
|
351
|
+
<InteractiveTooltip
|
|
352
|
+
hoverContent="Healthy"
|
|
353
|
+
pinnedContent={
|
|
354
|
+
<div>
|
|
355
|
+
<h4>Service Status</h4>
|
|
356
|
+
<p>Status: Healthy</p>
|
|
357
|
+
<p>Uptime: 99.9%</p>
|
|
358
|
+
<p>Last Check: 2 minutes ago</p>
|
|
359
|
+
</div>
|
|
360
|
+
}
|
|
361
|
+
variant="default"
|
|
362
|
+
>
|
|
363
|
+
<StatusBadge status="healthy" />
|
|
364
|
+
</InteractiveTooltip>
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Table Cell Details
|
|
368
|
+
|
|
369
|
+
```tsx
|
|
370
|
+
<InteractiveTooltip
|
|
371
|
+
hoverContent={cellValue}
|
|
372
|
+
pinnedContent={
|
|
373
|
+
<div>
|
|
374
|
+
<h4>Cell Details</h4>
|
|
375
|
+
<p>Value: {cellValue}</p>
|
|
376
|
+
<p>Last Updated: {lastUpdated}</p>
|
|
377
|
+
<p>Source: {source}</p>
|
|
378
|
+
</div>
|
|
379
|
+
}
|
|
380
|
+
>
|
|
381
|
+
<td>{cellValue}</td>
|
|
382
|
+
</InteractiveTooltip>
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
## Testing
|
|
386
|
+
|
|
387
|
+
The InteractiveTooltip component provides comprehensive testIds for automated testing.
|
|
388
|
+
|
|
389
|
+
### Test IDs
|
|
390
|
+
|
|
391
|
+
When you provide a `dataTestId` prop, the following test IDs are automatically generated:
|
|
392
|
+
|
|
393
|
+
| Element | Test ID Pattern | Description |
|
|
394
|
+
| ---------------- | ---------------------- | ------------------------------------- |
|
|
395
|
+
| Trigger Element | `{dataTestId}-trigger` | The element that triggers the tooltip |
|
|
396
|
+
| Tooltip Content | `{dataTestId}-content` | The tooltip popup content |
|
|
397
|
+
|
|
398
|
+
### Testing Examples
|
|
399
|
+
|
|
400
|
+
#### Basic Interaction Test
|
|
401
|
+
|
|
402
|
+
```tsx
|
|
403
|
+
import { render, screen, waitFor } from '@testing-library/react';
|
|
404
|
+
import userEvent from '@testing-library/user-event';
|
|
405
|
+
import { InteractiveTooltip, Button } from '@app-services-monitoring/ui';
|
|
406
|
+
|
|
407
|
+
test('shows hover content on hover and pinned content on click', async () => {
|
|
408
|
+
const user = userEvent.setup();
|
|
409
|
+
|
|
410
|
+
render(
|
|
411
|
+
<InteractiveTooltip
|
|
412
|
+
hoverContent="Hover text"
|
|
413
|
+
pinnedContent="Pinned text"
|
|
414
|
+
dataTestId="interactive-tooltip"
|
|
415
|
+
>
|
|
416
|
+
<Button>Trigger</Button>
|
|
417
|
+
</InteractiveTooltip>
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
const trigger = screen.getByTestId('interactive-tooltip-trigger');
|
|
421
|
+
|
|
422
|
+
// Hover shows hover content
|
|
423
|
+
await user.hover(trigger);
|
|
424
|
+
await waitFor(() => {
|
|
425
|
+
expect(screen.getByText('Hover text')).toBeInTheDocument();
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
// Click shows pinned content
|
|
429
|
+
await user.click(trigger);
|
|
430
|
+
await waitFor(() => {
|
|
431
|
+
expect(screen.getByText('Pinned text')).toBeInTheDocument();
|
|
432
|
+
expect(screen.queryByText('Hover text')).not.toBeInTheDocument();
|
|
433
|
+
});
|
|
434
|
+
});
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
#### Outside Click Test
|
|
438
|
+
|
|
439
|
+
```tsx
|
|
440
|
+
test('closes tooltip when clicking outside', async () => {
|
|
441
|
+
const user = userEvent.setup();
|
|
442
|
+
|
|
443
|
+
render(
|
|
444
|
+
<div>
|
|
445
|
+
<InteractiveTooltip
|
|
446
|
+
hoverContent="Hover"
|
|
447
|
+
pinnedContent="Pinned"
|
|
448
|
+
dataTestId="tooltip"
|
|
449
|
+
>
|
|
450
|
+
<Button>Trigger</Button>
|
|
451
|
+
</InteractiveTooltip>
|
|
452
|
+
<div data-testid="outside">Outside</div>
|
|
453
|
+
</div>
|
|
454
|
+
);
|
|
455
|
+
|
|
456
|
+
const trigger = screen.getByTestId('tooltip-trigger');
|
|
457
|
+
const outside = screen.getByTestId('outside');
|
|
458
|
+
|
|
459
|
+
// Pin tooltip
|
|
460
|
+
await user.click(trigger);
|
|
461
|
+
await waitFor(() => {
|
|
462
|
+
expect(screen.getByText('Pinned')).toBeInTheDocument();
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
// Click outside
|
|
466
|
+
await user.click(outside);
|
|
467
|
+
await waitFor(() => {
|
|
468
|
+
expect(screen.queryByText('Pinned')).not.toBeInTheDocument();
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
#### Callback Test
|
|
474
|
+
|
|
475
|
+
```tsx
|
|
476
|
+
test('calls callbacks when pinning and unpinning', async () => {
|
|
477
|
+
const user = userEvent.setup();
|
|
478
|
+
const onPin = vi.fn();
|
|
479
|
+
const onUnpin = vi.fn();
|
|
480
|
+
|
|
481
|
+
render(
|
|
482
|
+
<InteractiveTooltip
|
|
483
|
+
hoverContent="Hover"
|
|
484
|
+
pinnedContent="Pinned"
|
|
485
|
+
onPin={onPin}
|
|
486
|
+
onUnpin={onUnpin}
|
|
487
|
+
dataTestId="tooltip"
|
|
488
|
+
>
|
|
489
|
+
<Button>Trigger</Button>
|
|
490
|
+
</InteractiveTooltip>
|
|
491
|
+
);
|
|
492
|
+
|
|
493
|
+
const trigger = screen.getByTestId('tooltip-trigger');
|
|
494
|
+
|
|
495
|
+
// Pin
|
|
496
|
+
await user.click(trigger);
|
|
497
|
+
expect(onPin).toHaveBeenCalledTimes(1);
|
|
498
|
+
|
|
499
|
+
// Unpin
|
|
500
|
+
await user.click(trigger);
|
|
501
|
+
expect(onUnpin).toHaveBeenCalledTimes(1);
|
|
502
|
+
});
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
## Comparison with Standard Tooltip
|
|
506
|
+
|
|
507
|
+
| Feature | Tooltip | InteractiveTooltip |
|
|
508
|
+
| ------------------------ | ------- | ------------------ |
|
|
509
|
+
| Hover to show | ✅ | ✅ |
|
|
510
|
+
| Click to pin | ❌ | ✅ |
|
|
511
|
+
| Dual content modes | ❌ | ✅ |
|
|
512
|
+
| Outside click detection | ❌ | ✅ |
|
|
513
|
+
| Callbacks (pin/unpin) | ❌ | ✅ |
|
|
514
|
+
| Visual variants | ✅ | ✅ |
|
|
515
|
+
| Size options | ✅ | ✅ |
|
|
516
|
+
| Effects (glow, pulse) | ✅ | ✅ |
|
|
517
|
+
| ARIA support | ✅ | ✅ |
|
|
518
|
+
|
|
519
|
+
## When to Use
|
|
520
|
+
|
|
521
|
+
### Use InteractiveTooltip when:
|
|
522
|
+
- Users need to compare multiple detailed views
|
|
523
|
+
- Content is too detailed for a standard tooltip
|
|
524
|
+
- Users benefit from keeping information visible
|
|
525
|
+
- Working with data visualizations
|
|
526
|
+
- Touch devices are primary interface
|
|
527
|
+
|
|
528
|
+
### Use standard Tooltip when:
|
|
529
|
+
- Information is brief and simple
|
|
530
|
+
- No interaction needed with content
|
|
531
|
+
- Quick hint or label is sufficient
|
|
532
|
+
- Standard hover behavior is desired
|