@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,610 @@
|
|
|
1
|
+
# TutorialOverlay Component
|
|
2
|
+
|
|
3
|
+
An interactive tutorial overlay component for creating product tours, onboarding flows, and feature highlights. Provides step-by-step walkthroughs with highlighted elements, tooltips, navigation controls, and customizable styling.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Interactive step-by-step tutorials
|
|
8
|
+
- Element highlighting and spotlighting
|
|
9
|
+
- Multiple visual variants (tooltip, modal, highlight, spotlight)
|
|
10
|
+
- Progress indicators and navigation controls
|
|
11
|
+
- Customizable positioning and styling
|
|
12
|
+
- Skip functionality and completion callbacks
|
|
13
|
+
- Responsive design and mobile support
|
|
14
|
+
- Accessibility compliance with ARIA attributes
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
```tsx
|
|
19
|
+
import { TutorialOverlay } from '@procurement/ui';
|
|
20
|
+
|
|
21
|
+
const steps = [
|
|
22
|
+
{
|
|
23
|
+
id: '1',
|
|
24
|
+
target: '#welcome-section',
|
|
25
|
+
title: 'Welcome',
|
|
26
|
+
content: 'This is your dashboard overview.',
|
|
27
|
+
position: 'bottom',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: '2',
|
|
31
|
+
target: '#navigation',
|
|
32
|
+
title: 'Navigation',
|
|
33
|
+
content: 'Use this menu to navigate between sections.',
|
|
34
|
+
position: 'right',
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
function App() {
|
|
39
|
+
const [showTutorial, setShowTutorial] = useState(false);
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<>
|
|
43
|
+
<button onClick={() => setShowTutorial(true)}>Start Tutorial</button>
|
|
44
|
+
|
|
45
|
+
{showTutorial && (
|
|
46
|
+
<TutorialOverlay
|
|
47
|
+
steps={steps}
|
|
48
|
+
onComplete={() => setShowTutorial(false)}
|
|
49
|
+
onSkip={() => setShowTutorial(false)}
|
|
50
|
+
variant="spotlight"
|
|
51
|
+
showProgress
|
|
52
|
+
allowSkip
|
|
53
|
+
animated
|
|
54
|
+
/>
|
|
55
|
+
)}
|
|
56
|
+
</>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Props
|
|
62
|
+
|
|
63
|
+
### Required Props
|
|
64
|
+
|
|
65
|
+
- `steps`: Array of tutorial step definitions
|
|
66
|
+
- `onComplete`: Callback function when tutorial completes
|
|
67
|
+
|
|
68
|
+
### Optional Props
|
|
69
|
+
|
|
70
|
+
- `variant`: Visual style variant ('tooltip' | 'modal' | 'highlight' | 'spotlight')
|
|
71
|
+
- `position`: Tooltip positioning ('top' | 'bottom' | 'left' | 'right' | 'center')
|
|
72
|
+
- `showProgress`: Show progress indicator (boolean)
|
|
73
|
+
- `allowSkip`: Allow users to skip tutorial (boolean)
|
|
74
|
+
- `animated`: Enable animations (boolean)
|
|
75
|
+
- `onSkip`: Callback when tutorial is skipped
|
|
76
|
+
- `onStepChange`: Callback when step changes
|
|
77
|
+
- `onStepComplete`: Callback when individual step completes
|
|
78
|
+
|
|
79
|
+
### Step Object Structure
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
interface TutorialStep {
|
|
83
|
+
id: string;
|
|
84
|
+
target: string; // CSS selector for target element
|
|
85
|
+
title: string;
|
|
86
|
+
content: string;
|
|
87
|
+
position?: 'top' | 'bottom' | 'left' | 'right' | 'center';
|
|
88
|
+
action?: string; // Custom action button text
|
|
89
|
+
requiresAction?: boolean; // Wait for user action
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Variants
|
|
94
|
+
|
|
95
|
+
### Tooltip
|
|
96
|
+
|
|
97
|
+
Standard tooltip-style overlay with arrow pointing to target element.
|
|
98
|
+
|
|
99
|
+
### Modal
|
|
100
|
+
|
|
101
|
+
Full-screen modal with highlighted target element.
|
|
102
|
+
|
|
103
|
+
### Highlight
|
|
104
|
+
|
|
105
|
+
Highlighted target element with subtle overlay.
|
|
106
|
+
|
|
107
|
+
### Spotlight
|
|
108
|
+
|
|
109
|
+
Dramatic spotlight effect focusing on target element.
|
|
110
|
+
|
|
111
|
+
## Accessibility
|
|
112
|
+
|
|
113
|
+
- ARIA landmarks and labels
|
|
114
|
+
- Keyboard navigation support (Tab, Escape, Enter)
|
|
115
|
+
- Screen reader compatibility
|
|
116
|
+
- Focus management and restoration
|
|
117
|
+
- High contrast support
|
|
118
|
+
|
|
119
|
+
## Best Practices
|
|
120
|
+
|
|
121
|
+
1. **Keep steps concise**: Limit tutorial steps to essential information
|
|
122
|
+
2. **Logical flow**: Order steps in natural user workflow
|
|
123
|
+
3. **Allow skipping**: Always provide skip option for returning users
|
|
124
|
+
4. **Progressive disclosure**: Break complex features into multiple tutorials
|
|
125
|
+
5. **Test on devices**: Verify functionality on mobile and tablet
|
|
126
|
+
6. **Provide context**: Ensure target elements are visible and accessible
|
|
127
|
+
|
|
128
|
+
## Examples
|
|
129
|
+
|
|
130
|
+
### Onboarding Flow
|
|
131
|
+
|
|
132
|
+
Guide new users through initial setup and key features.
|
|
133
|
+
|
|
134
|
+
### Feature Highlights
|
|
135
|
+
|
|
136
|
+
Introduce new functionality or updates to existing users.
|
|
137
|
+
|
|
138
|
+
### Interactive Tours
|
|
139
|
+
|
|
140
|
+
Multi-step tutorials requiring user interaction at each step.
|
|
141
|
+
|
|
142
|
+
### Contextual Help
|
|
143
|
+
|
|
144
|
+
Just-in-time assistance for specific workflows or features.
|
|
145
|
+
|
|
146
|
+
## Testing
|
|
147
|
+
|
|
148
|
+
This document describes all `data-testid` attributes available in the TutorialOverlay component for testing purposes.
|
|
149
|
+
|
|
150
|
+
### Test IDs
|
|
151
|
+
|
|
152
|
+
#### Container Elements
|
|
153
|
+
|
|
154
|
+
##### `tutorial-overlay`
|
|
155
|
+
- **Element:** Main overlay container
|
|
156
|
+
- **Location:** Root Overlay component that covers the entire viewport
|
|
157
|
+
- **Usage:** Query the main container to verify TutorialOverlay is rendered
|
|
158
|
+
```typescript
|
|
159
|
+
const overlay = await canvas.findByTestId('tutorial-overlay');
|
|
160
|
+
expect(overlay).toBeInTheDocument();
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
##### `tutorial-step-${currentStep}`
|
|
164
|
+
- **Element:** Step container (TooltipContainer)
|
|
165
|
+
- **Location:** The tooltip Paper component that displays the current step
|
|
166
|
+
- **Usage:** Query specific step by index to verify it's rendered
|
|
167
|
+
```typescript
|
|
168
|
+
// Query first step (index 0)
|
|
169
|
+
const step = await canvas.findByTestId('tutorial-step-0');
|
|
170
|
+
expect(step).toBeInTheDocument();
|
|
171
|
+
|
|
172
|
+
// Query third step (index 2)
|
|
173
|
+
const step3 = await canvas.findByTestId('tutorial-step-2');
|
|
174
|
+
expect(step3).toBeInTheDocument();
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
#### Content Elements
|
|
178
|
+
|
|
179
|
+
##### `tutorial-step-title`
|
|
180
|
+
- **Element:** Step title Typography
|
|
181
|
+
- **Location:** The title text at the top of each step
|
|
182
|
+
- **Usage:** Query to verify the step title is displayed
|
|
183
|
+
```typescript
|
|
184
|
+
const title = await canvas.findByTestId('tutorial-step-title');
|
|
185
|
+
expect(title).toHaveTextContent('Welcome to the Tutorial');
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
##### `tutorial-step-content`
|
|
189
|
+
- **Element:** Step content Typography
|
|
190
|
+
- **Location:** The descriptive text content of the step
|
|
191
|
+
- **Usage:** Query to verify the step content is displayed
|
|
192
|
+
```typescript
|
|
193
|
+
const content = await canvas.findByTestId('tutorial-step-content');
|
|
194
|
+
expect(content).toHaveTextContent('This is the main content description');
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
#### Navigation Elements
|
|
198
|
+
|
|
199
|
+
##### `tutorial-navigation`
|
|
200
|
+
- **Element:** Navigation buttons container
|
|
201
|
+
- **Location:** Stack container that holds all navigation buttons
|
|
202
|
+
- **Usage:** Query the navigation area to verify buttons are rendered
|
|
203
|
+
```typescript
|
|
204
|
+
const navigation = await canvas.findByTestId('tutorial-navigation');
|
|
205
|
+
expect(navigation).toBeInTheDocument();
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
##### `tutorial-prev-button`
|
|
209
|
+
- **Element:** Previous button
|
|
210
|
+
- **Location:** Button to navigate to the previous step
|
|
211
|
+
- **Usage:** Click to move to previous step
|
|
212
|
+
- **Note:** Only appears when currentStep > 0 and steps.length > 1
|
|
213
|
+
```typescript
|
|
214
|
+
const prevButton = await canvas.findByTestId('tutorial-prev-button');
|
|
215
|
+
await userEvent.click(prevButton);
|
|
216
|
+
expect(args.onStepComplete).toHaveBeenCalled();
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
##### `tutorial-next-button`
|
|
220
|
+
- **Element:** Next/Finish button
|
|
221
|
+
- **Location:** Button to navigate to the next step or complete tutorial
|
|
222
|
+
- **Usage:** Click to advance to next step or finish
|
|
223
|
+
- **Note:** Label changes to "Finish" or "Complete" on last step
|
|
224
|
+
```typescript
|
|
225
|
+
const nextButton = await canvas.findByTestId('tutorial-next-button');
|
|
226
|
+
expect(nextButton).toHaveTextContent('Next');
|
|
227
|
+
await userEvent.click(nextButton);
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
##### `tutorial-close-button`
|
|
231
|
+
- **Element:** Close/Skip button (IconButton)
|
|
232
|
+
- **Location:** Close icon in the top-right corner of the step
|
|
233
|
+
- **Usage:** Click to skip/close the tutorial
|
|
234
|
+
- **Note:** Only appears when allowSkip prop is true
|
|
235
|
+
```typescript
|
|
236
|
+
const closeButton = await canvas.findByTestId('tutorial-close-button');
|
|
237
|
+
await userEvent.click(closeButton);
|
|
238
|
+
expect(args.onSkip).toHaveBeenCalled();
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
#### Progress Indicators
|
|
242
|
+
|
|
243
|
+
##### `tutorial-step-indicators`
|
|
244
|
+
- **Element:** Step indicators container
|
|
245
|
+
- **Location:** Container holding all step indicator dots
|
|
246
|
+
- **Usage:** Query the indicator container to verify progress display
|
|
247
|
+
```typescript
|
|
248
|
+
const indicators = await canvas.findByTestId('tutorial-step-indicators');
|
|
249
|
+
expect(indicators).toBeInTheDocument();
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
##### `tutorial-indicator-${index}`
|
|
253
|
+
- **Element:** Individual indicator dot
|
|
254
|
+
- **Location:** Each dot representing a step in the tutorial
|
|
255
|
+
- **Usage:** Query specific indicators to verify progress state
|
|
256
|
+
```typescript
|
|
257
|
+
// Check first indicator (index 0)
|
|
258
|
+
const indicator0 = await canvas.findByTestId('tutorial-indicator-0');
|
|
259
|
+
expect(indicator0).toBeInTheDocument();
|
|
260
|
+
|
|
261
|
+
// Verify all indicators are rendered
|
|
262
|
+
const allIndicators = await canvas.findAllByTestId(/tutorial-indicator-/);
|
|
263
|
+
expect(allIndicators).toHaveLength(steps.length);
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
#### Highlight Elements
|
|
267
|
+
|
|
268
|
+
##### `tutorial-highlight`
|
|
269
|
+
- **Element:** Target highlight overlay (Spotlight)
|
|
270
|
+
- **Location:** The pulsing highlight box around the target element
|
|
271
|
+
- **Usage:** Verify spotlight/highlight is displayed when variant is 'spotlight' or 'highlight'
|
|
272
|
+
- **Note:** Only appears when variant='spotlight' or variant='highlight' and target is visible
|
|
273
|
+
```typescript
|
|
274
|
+
const highlight = await canvas.findByTestId('tutorial-highlight');
|
|
275
|
+
expect(highlight).toBeInTheDocument();
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
### Test Patterns
|
|
279
|
+
|
|
280
|
+
#### Wait for Tutorial to Render
|
|
281
|
+
```typescript
|
|
282
|
+
import { waitFor, within } from 'storybook/test';
|
|
283
|
+
|
|
284
|
+
// Wait for overlay to appear
|
|
285
|
+
const overlay = await canvas.findByTestId('tutorial-overlay');
|
|
286
|
+
expect(overlay).toBeInTheDocument();
|
|
287
|
+
|
|
288
|
+
// Wait for first step
|
|
289
|
+
const step = await canvas.findByTestId('tutorial-step-0');
|
|
290
|
+
expect(step).toBeInTheDocument();
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
#### Verify Step Content
|
|
294
|
+
```typescript
|
|
295
|
+
// Check title and content
|
|
296
|
+
const title = await canvas.findByTestId('tutorial-step-title');
|
|
297
|
+
expect(title).toHaveTextContent(expectedTitle);
|
|
298
|
+
|
|
299
|
+
const content = await canvas.findByTestId('tutorial-step-content');
|
|
300
|
+
expect(content).toHaveTextContent(expectedContent);
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
#### Navigate Through Steps
|
|
304
|
+
```typescript
|
|
305
|
+
// Start at step 0
|
|
306
|
+
const step0 = await canvas.findByTestId('tutorial-step-0');
|
|
307
|
+
expect(step0).toBeInTheDocument();
|
|
308
|
+
|
|
309
|
+
// Click next
|
|
310
|
+
const nextButton = await canvas.findByTestId('tutorial-next-button');
|
|
311
|
+
await userEvent.click(nextButton);
|
|
312
|
+
|
|
313
|
+
// Verify we're on step 1
|
|
314
|
+
await waitFor(async () => {
|
|
315
|
+
const step1 = await canvas.findByTestId('tutorial-step-1');
|
|
316
|
+
expect(step1).toBeInTheDocument();
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
// Click previous
|
|
320
|
+
const prevButton = await canvas.findByTestId('tutorial-prev-button');
|
|
321
|
+
await userEvent.click(prevButton);
|
|
322
|
+
|
|
323
|
+
// Verify we're back on step 0
|
|
324
|
+
await waitFor(async () => {
|
|
325
|
+
const step0Again = await canvas.findByTestId('tutorial-step-0');
|
|
326
|
+
expect(step0Again).toBeInTheDocument();
|
|
327
|
+
});
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
#### Verify Progress Indicators
|
|
331
|
+
```typescript
|
|
332
|
+
// Get all indicators
|
|
333
|
+
const indicators = await canvas.findAllByTestId(/tutorial-indicator-/);
|
|
334
|
+
expect(indicators).toHaveLength(steps.length);
|
|
335
|
+
|
|
336
|
+
// Check specific indicator states
|
|
337
|
+
const indicator0 = await canvas.findByTestId('tutorial-indicator-0');
|
|
338
|
+
const indicator1 = await canvas.findByTestId('tutorial-indicator-1');
|
|
339
|
+
|
|
340
|
+
// Verify current step indicator is active
|
|
341
|
+
const step0Style = window.getComputedStyle(indicator0);
|
|
342
|
+
// Active indicators have transform: scale(1.5)
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
#### Test Skip/Close Functionality
|
|
346
|
+
```typescript
|
|
347
|
+
// Find close button (only if allowSkip=true)
|
|
348
|
+
const closeButton = await canvas.findByTestId('tutorial-close-button');
|
|
349
|
+
await userEvent.click(closeButton);
|
|
350
|
+
|
|
351
|
+
// Verify onSkip callback was called
|
|
352
|
+
expect(args.onSkip).toHaveBeenCalled();
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
#### Test Highlight/Spotlight
|
|
356
|
+
```typescript
|
|
357
|
+
// When variant is 'spotlight' or 'highlight'
|
|
358
|
+
await waitFor(async () => {
|
|
359
|
+
const highlight = await canvas.findByTestId('tutorial-highlight');
|
|
360
|
+
expect(highlight).toBeInTheDocument();
|
|
361
|
+
}, { timeout: 3000 });
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Props That Affect Test Behavior
|
|
365
|
+
|
|
366
|
+
#### `variant`
|
|
367
|
+
- **Values:** `'tooltip' | 'modal' | 'spotlight' | 'highlight'`
|
|
368
|
+
- **Impact:**
|
|
369
|
+
- `tooltip`: Basic tooltip without backdrop
|
|
370
|
+
- `modal`: Full modal with backdrop
|
|
371
|
+
- `spotlight`/`highlight`: Shows backdrop and pulsing highlight around target
|
|
372
|
+
- Only `spotlight` and `highlight` render `tutorial-highlight`
|
|
373
|
+
|
|
374
|
+
#### `active`
|
|
375
|
+
- **Values:** `boolean`
|
|
376
|
+
- **Impact:** When false, component returns null (nothing rendered)
|
|
377
|
+
|
|
378
|
+
#### `allowSkip`
|
|
379
|
+
- **Values:** `boolean`
|
|
380
|
+
- **Impact:** Controls visibility of `tutorial-close-button`
|
|
381
|
+
- **Test Tip:** Only query close button when allowSkip=true
|
|
382
|
+
|
|
383
|
+
#### `showProgress`
|
|
384
|
+
- **Values:** `boolean`
|
|
385
|
+
- **Impact:** Shows/hides progress bar and step counter text
|
|
386
|
+
|
|
387
|
+
#### `steps`
|
|
388
|
+
- **Values:** `TutorialStep[]`
|
|
389
|
+
- **Impact:** Determines number of indicators and step containers
|
|
390
|
+
- **Test Tip:** Use steps.length to verify indicator count
|
|
391
|
+
|
|
392
|
+
#### `animated`
|
|
393
|
+
- **Values:** `boolean`
|
|
394
|
+
- **Impact:** Enables/disables float animation on tooltip
|
|
395
|
+
- **Test Tip:** Use `waitFor()` when testing animated tutorials
|
|
396
|
+
|
|
397
|
+
#### `allowKeyboardNavigation`
|
|
398
|
+
- **Values:** `boolean`
|
|
399
|
+
- **Impact:** Enables keyboard shortcuts (ArrowLeft, ArrowRight, Escape)
|
|
400
|
+
|
|
401
|
+
### Common Test Scenarios
|
|
402
|
+
|
|
403
|
+
#### 1. Basic Rendering Test
|
|
404
|
+
```typescript
|
|
405
|
+
play: async ({ canvasElement }) => {
|
|
406
|
+
const canvas = within(canvasElement);
|
|
407
|
+
|
|
408
|
+
// Wait for overlay to render
|
|
409
|
+
const overlay = await canvas.findByTestId('tutorial-overlay');
|
|
410
|
+
expect(overlay).toBeInTheDocument();
|
|
411
|
+
|
|
412
|
+
// Verify first step is visible
|
|
413
|
+
const step = await canvas.findByTestId('tutorial-step-0');
|
|
414
|
+
expect(step).toBeInTheDocument();
|
|
415
|
+
|
|
416
|
+
// Verify indicators match step count
|
|
417
|
+
const indicators = await canvas.findAllByTestId(/tutorial-indicator-/);
|
|
418
|
+
expect(indicators).toHaveLength(steps.length);
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
#### 2. Navigation Test
|
|
423
|
+
```typescript
|
|
424
|
+
play: async ({ canvasElement }) => {
|
|
425
|
+
const canvas = within(canvasElement);
|
|
426
|
+
|
|
427
|
+
// Wait for tutorial to render
|
|
428
|
+
await canvas.findByTestId('tutorial-overlay');
|
|
429
|
+
|
|
430
|
+
// Click next button
|
|
431
|
+
const nextButton = await canvas.findByTestId('tutorial-next-button');
|
|
432
|
+
await userEvent.click(nextButton);
|
|
433
|
+
|
|
434
|
+
// Verify we moved to next step
|
|
435
|
+
await waitFor(async () => {
|
|
436
|
+
const step1 = await canvas.findByTestId('tutorial-step-1');
|
|
437
|
+
expect(step1).toBeInTheDocument();
|
|
438
|
+
}, { timeout: 3000 });
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
#### 3. Complete Tutorial Test
|
|
443
|
+
```typescript
|
|
444
|
+
play: async ({ canvasElement, args }) => {
|
|
445
|
+
const canvas = within(canvasElement);
|
|
446
|
+
|
|
447
|
+
await canvas.findByTestId('tutorial-overlay');
|
|
448
|
+
|
|
449
|
+
// Navigate to last step
|
|
450
|
+
for (let i = 0; i < steps.length - 1; i++) {
|
|
451
|
+
const nextButton = await canvas.findByTestId('tutorial-next-button');
|
|
452
|
+
await userEvent.click(nextButton);
|
|
453
|
+
|
|
454
|
+
await waitFor(async () => {
|
|
455
|
+
const currentStep = await canvas.findByTestId(`tutorial-step-${i + 1}`);
|
|
456
|
+
expect(currentStep).toBeInTheDocument();
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Click finish on last step
|
|
461
|
+
const finishButton = await canvas.findByTestId('tutorial-next-button');
|
|
462
|
+
expect(finishButton).toHaveTextContent(/Complete|Finish/);
|
|
463
|
+
await userEvent.click(finishButton);
|
|
464
|
+
|
|
465
|
+
// Verify onComplete callback
|
|
466
|
+
expect(args.onComplete).toHaveBeenCalled();
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
#### 4. Skip Tutorial Test
|
|
471
|
+
```typescript
|
|
472
|
+
play: async ({ canvasElement, args }) => {
|
|
473
|
+
const canvas = within(canvasElement);
|
|
474
|
+
|
|
475
|
+
await canvas.findByTestId('tutorial-overlay');
|
|
476
|
+
|
|
477
|
+
// Click close button (only if allowSkip=true)
|
|
478
|
+
const closeButton = await canvas.findByTestId('tutorial-close-button');
|
|
479
|
+
await userEvent.click(closeButton);
|
|
480
|
+
|
|
481
|
+
// Verify skip callback
|
|
482
|
+
expect(args.onSkip).toHaveBeenCalled();
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
#### 5. Highlight/Spotlight Test
|
|
487
|
+
```typescript
|
|
488
|
+
play: async ({ canvasElement }) => {
|
|
489
|
+
const canvas = within(canvasElement);
|
|
490
|
+
|
|
491
|
+
// Wait for overlay
|
|
492
|
+
await canvas.findByTestId('tutorial-overlay');
|
|
493
|
+
|
|
494
|
+
// Verify highlight is shown (for spotlight/highlight variants)
|
|
495
|
+
await waitFor(async () => {
|
|
496
|
+
const highlight = await canvas.findByTestId('tutorial-highlight');
|
|
497
|
+
expect(highlight).toBeInTheDocument();
|
|
498
|
+
}, { timeout: 3000 });
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
#### 6. Progress Indicator Test
|
|
503
|
+
```typescript
|
|
504
|
+
play: async ({ canvasElement }) => {
|
|
505
|
+
const canvas = within(canvasElement);
|
|
506
|
+
|
|
507
|
+
await canvas.findByTestId('tutorial-overlay');
|
|
508
|
+
|
|
509
|
+
// Get all indicators
|
|
510
|
+
const indicators = await canvas.findAllByTestId(/tutorial-indicator-/);
|
|
511
|
+
expect(indicators).toHaveLength(steps.length);
|
|
512
|
+
|
|
513
|
+
// Navigate through steps and verify indicator updates
|
|
514
|
+
for (let i = 0; i < steps.length - 1; i++) {
|
|
515
|
+
const nextButton = await canvas.findByTestId('tutorial-next-button');
|
|
516
|
+
await userEvent.click(nextButton);
|
|
517
|
+
|
|
518
|
+
await waitFor(async () => {
|
|
519
|
+
const currentStepIndicator = await canvas.findByTestId(`tutorial-indicator-${i + 1}`);
|
|
520
|
+
expect(currentStepIndicator).toBeInTheDocument();
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
### Troubleshooting
|
|
527
|
+
|
|
528
|
+
#### Issue: "Unable to find element with testId tutorial-close-button"
|
|
529
|
+
|
|
530
|
+
**Solution:** Close button only appears when `allowSkip` prop is true:
|
|
531
|
+
```typescript
|
|
532
|
+
// Wrong - will fail if allowSkip=false
|
|
533
|
+
const closeButton = await canvas.findByTestId('tutorial-close-button');
|
|
534
|
+
|
|
535
|
+
// Correct - check prop first
|
|
536
|
+
if (args.allowSkip) {
|
|
537
|
+
const closeButton = await canvas.findByTestId('tutorial-close-button');
|
|
538
|
+
expect(closeButton).toBeInTheDocument();
|
|
539
|
+
}
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
#### Issue: "Unable to find element with testId tutorial-highlight"
|
|
543
|
+
|
|
544
|
+
**Solution:** Highlight only appears with spotlight/highlight variants:
|
|
545
|
+
```typescript
|
|
546
|
+
// Only query highlight for these variants
|
|
547
|
+
if (variant === 'spotlight' || variant === 'highlight') {
|
|
548
|
+
const highlight = await canvas.findByTestId('tutorial-highlight');
|
|
549
|
+
expect(highlight).toBeInTheDocument();
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
#### Issue: Test fails intermittently with animations
|
|
554
|
+
|
|
555
|
+
**Solution:** Use `waitFor` with proper timeout:
|
|
556
|
+
```typescript
|
|
557
|
+
await waitFor(async () => {
|
|
558
|
+
const step = await canvas.findByTestId('tutorial-step-1');
|
|
559
|
+
expect(step).toBeInTheDocument();
|
|
560
|
+
}, { timeout: 3000 });
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
#### Issue: "Unable to find element with testId tutorial-prev-button"
|
|
564
|
+
|
|
565
|
+
**Solution:** Previous button only appears after first step when steps.length > 1:
|
|
566
|
+
```typescript
|
|
567
|
+
// Previous button only exists when currentStep > 0 and steps.length > 1
|
|
568
|
+
if (currentStep > 0 && steps.length > 1) {
|
|
569
|
+
const prevButton = await canvas.findByTestId('tutorial-prev-button');
|
|
570
|
+
expect(prevButton).toBeInTheDocument();
|
|
571
|
+
}
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
#### Issue: Step number doesn't update after clicking next
|
|
575
|
+
|
|
576
|
+
**Solution:** Wait for new step to render:
|
|
577
|
+
```typescript
|
|
578
|
+
const nextButton = await canvas.findByTestId('tutorial-next-button');
|
|
579
|
+
await userEvent.click(nextButton);
|
|
580
|
+
|
|
581
|
+
// Wait for new step with timeout
|
|
582
|
+
await waitFor(async () => {
|
|
583
|
+
const newStep = await canvas.findByTestId(`tutorial-step-${currentStep + 1}`);
|
|
584
|
+
expect(newStep).toBeInTheDocument();
|
|
585
|
+
}, { timeout: 3000 });
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### Testing Best Practices
|
|
589
|
+
|
|
590
|
+
1. **Always use async/await** with testId queries in Storybook tests
|
|
591
|
+
2. **Use `waitFor`** when testing components with animations or transitions
|
|
592
|
+
3. **Scope queries** with `within()` when looking inside specific containers
|
|
593
|
+
4. **Use regex patterns** for dynamic testIds: `/tutorial-step-/` or `/tutorial-indicator-/`
|
|
594
|
+
5. **Add timeouts** for slow-rendering components: `{ timeout: 3000 }`
|
|
595
|
+
6. **Check conditional rendering** - some elements only appear with specific props (allowSkip, variant)
|
|
596
|
+
7. **Test step transitions** - always wait for new step to render after navigation
|
|
597
|
+
|
|
598
|
+
### Accessibility Testing
|
|
599
|
+
|
|
600
|
+
The component includes proper ARIA attributes for accessibility:
|
|
601
|
+
- `role="dialog"` on the step container
|
|
602
|
+
- `aria-labelledby` pointing to the step title
|
|
603
|
+
- `aria-describedby` pointing to the step content
|
|
604
|
+
|
|
605
|
+
These can be used in tests as alternative query methods:
|
|
606
|
+
```typescript
|
|
607
|
+
const dialog = await canvas.findByRole('dialog');
|
|
608
|
+
expect(dialog).toHaveAccessibleName(expectedTitle);
|
|
609
|
+
expect(dialog).toHaveAccessibleDescription(expectedContent);
|
|
610
|
+
```
|