@studio-helga/once-ui-core 1.7.8
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/README.md +54 -0
- package/dist/README.md +54 -0
- package/dist/components/Accordion.d.ts +25 -0
- package/dist/components/Accordion.d.ts.map +1 -0
- package/dist/components/Accordion.js +75 -0
- package/dist/components/Accordion.js.map +1 -0
- package/dist/components/Accordion.module.scss +5 -0
- package/dist/components/AccordionGroup.d.ts +16 -0
- package/dist/components/AccordionGroup.d.ts.map +1 -0
- package/dist/components/AccordionGroup.js +27 -0
- package/dist/components/AccordionGroup.js.map +1 -0
- package/dist/components/Animation.d.ts +34 -0
- package/dist/components/Animation.d.ts.map +1 -0
- package/dist/components/Animation.js +230 -0
- package/dist/components/Animation.js.map +1 -0
- package/dist/components/Arrow.d.ts +11 -0
- package/dist/components/Arrow.d.ts.map +1 -0
- package/dist/components/Arrow.js +33 -0
- package/dist/components/Arrow.js.map +1 -0
- package/dist/components/Arrow.module.scss +39 -0
- package/dist/components/ArrowNavigationContext.d.ts +33 -0
- package/dist/components/ArrowNavigationContext.d.ts.map +1 -0
- package/dist/components/ArrowNavigationContext.js +60 -0
- package/dist/components/ArrowNavigationContext.js.map +1 -0
- package/dist/components/AutoScroll.d.ts +14 -0
- package/dist/components/AutoScroll.d.ts.map +1 -0
- package/dist/components/AutoScroll.js +178 -0
- package/dist/components/AutoScroll.js.map +1 -0
- package/dist/components/AutoScroll.module.scss +9 -0
- package/dist/components/Avatar.d.ts +21 -0
- package/dist/components/Avatar.d.ts.map +1 -0
- package/dist/components/Avatar.js +54 -0
- package/dist/components/Avatar.js.map +1 -0
- package/dist/components/Avatar.module.scss +56 -0
- package/dist/components/AvatarGroup.d.ts +14 -0
- package/dist/components/AvatarGroup.d.ts.map +1 -0
- package/dist/components/AvatarGroup.js +20 -0
- package/dist/components/AvatarGroup.js.map +1 -0
- package/dist/components/AvatarGroup.module.scss +11 -0
- package/dist/components/Background.d.ts +49 -0
- package/dist/components/Background.d.ts.map +1 -0
- package/dist/components/Background.js +72 -0
- package/dist/components/Background.js.map +1 -0
- package/dist/components/Background.module.scss +23 -0
- package/dist/components/Badge.d.ts +17 -0
- package/dist/components/Badge.d.ts.map +1 -0
- package/dist/components/Badge.js +21 -0
- package/dist/components/Badge.js.map +1 -0
- package/dist/components/Badge.module.scss +67 -0
- package/dist/components/Banner.d.ts +6 -0
- package/dist/components/Banner.d.ts.map +1 -0
- package/dist/components/Banner.js +7 -0
- package/dist/components/Banner.js.map +1 -0
- package/dist/components/BlobFx.d.ts +8 -0
- package/dist/components/BlobFx.d.ts.map +1 -0
- package/dist/components/BlobFx.js +82 -0
- package/dist/components/BlobFx.js.map +1 -0
- package/dist/components/BlockQuote.d.ts +21 -0
- package/dist/components/BlockQuote.d.ts.map +1 -0
- package/dist/components/BlockQuote.js +10 -0
- package/dist/components/BlockQuote.js.map +1 -0
- package/dist/components/Button.d.ts +27 -0
- package/dist/components/Button.d.ts.map +1 -0
- package/dist/components/Button.js +25 -0
- package/dist/components/Button.js.map +1 -0
- package/dist/components/Button.module.scss +154 -0
- package/dist/components/Card.d.ts +13 -0
- package/dist/components/Card.d.ts.map +1 -0
- package/dist/components/Card.js +13 -0
- package/dist/components/Card.js.map +1 -0
- package/dist/components/Card.module.scss +7 -0
- package/dist/components/Carousel.d.ts +32 -0
- package/dist/components/Carousel.d.ts.map +1 -0
- package/dist/components/Carousel.js +156 -0
- package/dist/components/Carousel.js.map +1 -0
- package/dist/components/Carousel.module.scss +48 -0
- package/dist/components/CelebrationFx.d.ts +17 -0
- package/dist/components/CelebrationFx.d.ts.map +1 -0
- package/dist/components/CelebrationFx.js +314 -0
- package/dist/components/CelebrationFx.js.map +1 -0
- package/dist/components/Checkbox.d.ts +11 -0
- package/dist/components/Checkbox.d.ts.map +1 -0
- package/dist/components/Checkbox.js +56 -0
- package/dist/components/Checkbox.js.map +1 -0
- package/dist/components/Chip.d.ts +17 -0
- package/dist/components/Chip.d.ts.map +1 -0
- package/dist/components/Chip.js +43 -0
- package/dist/components/Chip.js.map +1 -0
- package/dist/components/Chip.module.scss +39 -0
- package/dist/components/ClientFlex.d.ts +13 -0
- package/dist/components/ClientFlex.d.ts.map +1 -0
- package/dist/components/ClientFlex.js +110 -0
- package/dist/components/ClientFlex.js.map +1 -0
- package/dist/components/ClientGrid.d.ts +13 -0
- package/dist/components/ClientGrid.d.ts.map +1 -0
- package/dist/components/ClientGrid.js +110 -0
- package/dist/components/ClientGrid.js.map +1 -0
- package/dist/components/ColorInput.d.ts +11 -0
- package/dist/components/ColorInput.d.ts.map +1 -0
- package/dist/components/ColorInput.js +78 -0
- package/dist/components/ColorInput.js.map +1 -0
- package/dist/components/Column.d.ts +7 -0
- package/dist/components/Column.d.ts.map +1 -0
- package/dist/components/Column.js +10 -0
- package/dist/components/Column.js.map +1 -0
- package/dist/components/CompareImage.d.ts +16 -0
- package/dist/components/CompareImage.d.ts.map +1 -0
- package/dist/components/CompareImage.js +58 -0
- package/dist/components/CompareImage.js.map +1 -0
- package/dist/components/CompareImage.module.scss +14 -0
- package/dist/components/ContextMenu.d.ts +22 -0
- package/dist/components/ContextMenu.d.ts.map +1 -0
- package/dist/components/ContextMenu.js +224 -0
- package/dist/components/ContextMenu.js.map +1 -0
- package/dist/components/ContextMenu.module.scss +15 -0
- package/dist/components/CountFx.d.ts +15 -0
- package/dist/components/CountFx.d.ts.map +1 -0
- package/dist/components/CountFx.js +203 -0
- package/dist/components/CountFx.js.map +1 -0
- package/dist/components/CountdownFx.d.ts +11 -0
- package/dist/components/CountdownFx.d.ts.map +1 -0
- package/dist/components/CountdownFx.js +49 -0
- package/dist/components/CountdownFx.js.map +1 -0
- package/dist/components/Cursor.d.ts +8 -0
- package/dist/components/Cursor.d.ts.map +1 -0
- package/dist/components/Cursor.js +79 -0
- package/dist/components/Cursor.js.map +1 -0
- package/dist/components/CursorCard.d.ts +13 -0
- package/dist/components/CursorCard.d.ts.map +1 -0
- package/dist/components/CursorCard.js +63 -0
- package/dist/components/CursorCard.js.map +1 -0
- package/dist/components/CursorCard.module.scss +12 -0
- package/dist/components/DateInput.d.ts +18 -0
- package/dist/components/DateInput.d.ts.map +1 -0
- package/dist/components/DateInput.js +43 -0
- package/dist/components/DateInput.js.map +1 -0
- package/dist/components/DatePicker.d.ts +33 -0
- package/dist/components/DatePicker.d.ts.map +1 -0
- package/dist/components/DatePicker.js +487 -0
- package/dist/components/DatePicker.js.map +1 -0
- package/dist/components/DatePicker.module.scss +194 -0
- package/dist/components/DateRangeInput.d.ts +15 -0
- package/dist/components/DateRangeInput.d.ts.map +1 -0
- package/dist/components/DateRangeInput.js +45 -0
- package/dist/components/DateRangeInput.js.map +1 -0
- package/dist/components/DateRangePicker.d.ts +17 -0
- package/dist/components/DateRangePicker.d.ts.map +1 -0
- package/dist/components/DateRangePicker.js +78 -0
- package/dist/components/DateRangePicker.js.map +1 -0
- package/dist/components/Dialog.d.ts +21 -0
- package/dist/components/Dialog.d.ts.map +1 -0
- package/dist/components/Dialog.js +230 -0
- package/dist/components/Dialog.js.map +1 -0
- package/dist/components/Dialog.module.scss +33 -0
- package/dist/components/Dropdown.d.ts +13 -0
- package/dist/components/Dropdown.d.ts.map +1 -0
- package/dist/components/Dropdown.js +21 -0
- package/dist/components/Dropdown.js.map +1 -0
- package/dist/components/DropdownWrapper.d.ts +29 -0
- package/dist/components/DropdownWrapper.d.ts.map +1 -0
- package/dist/components/DropdownWrapper.js +505 -0
- package/dist/components/DropdownWrapper.js.map +1 -0
- package/dist/components/DropdownWrapper.module.scss +15 -0
- package/dist/components/ElementType.d.ts +14 -0
- package/dist/components/ElementType.d.ts.map +1 -0
- package/dist/components/ElementType.js +21 -0
- package/dist/components/ElementType.js.map +1 -0
- package/dist/components/EmojiPicker.d.ts +16 -0
- package/dist/components/EmojiPicker.d.ts.map +1 -0
- package/dist/components/EmojiPicker.js +178 -0
- package/dist/components/EmojiPicker.js.map +1 -0
- package/dist/components/EmojiPicker.module.scss +14 -0
- package/dist/components/EmojiPickerDropdown.d.ts +11 -0
- package/dist/components/EmojiPickerDropdown.d.ts.map +1 -0
- package/dist/components/EmojiPickerDropdown.js +14 -0
- package/dist/components/EmojiPickerDropdown.js.map +1 -0
- package/dist/components/Fade.d.ts +19 -0
- package/dist/components/Fade.d.ts.map +1 -0
- package/dist/components/Fade.js +43 -0
- package/dist/components/Fade.js.map +1 -0
- package/dist/components/Fade.module.scss +6 -0
- package/dist/components/FadingLettersFx.d.ts +15 -0
- package/dist/components/FadingLettersFx.d.ts.map +1 -0
- package/dist/components/FadingLettersFx.js +27 -0
- package/dist/components/FadingLettersFx.js.map +1 -0
- package/dist/components/FadingLettersFx.module.scss +71 -0
- package/dist/components/Feedback.d.ts +16 -0
- package/dist/components/Feedback.d.ts.map +1 -0
- package/dist/components/Feedback.js +16 -0
- package/dist/components/Feedback.js.map +1 -0
- package/dist/components/Flex.d.ts +11 -0
- package/dist/components/Flex.d.ts.map +1 -0
- package/dist/components/Flex.js +31 -0
- package/dist/components/Flex.js.map +1 -0
- package/dist/components/FlipFx.d.ts +17 -0
- package/dist/components/FlipFx.d.ts.map +1 -0
- package/dist/components/FlipFx.js +76 -0
- package/dist/components/FlipFx.js.map +1 -0
- package/dist/components/FocusTrap.d.ts +16 -0
- package/dist/components/FocusTrap.d.ts.map +1 -0
- package/dist/components/FocusTrap.js +87 -0
- package/dist/components/FocusTrap.js.map +1 -0
- package/dist/components/GlitchFx.d.ts +12 -0
- package/dist/components/GlitchFx.d.ts.map +1 -0
- package/dist/components/GlitchFx.js +41 -0
- package/dist/components/GlitchFx.js.map +1 -0
- package/dist/components/GlitchFx.module.scss +92 -0
- package/dist/components/Grid.d.ts +11 -0
- package/dist/components/Grid.d.ts.map +1 -0
- package/dist/components/Grid.js +32 -0
- package/dist/components/Grid.js.map +1 -0
- package/dist/components/Heading.d.ts +9 -0
- package/dist/components/Heading.d.ts.map +1 -0
- package/dist/components/Heading.js +50 -0
- package/dist/components/Heading.js.map +1 -0
- package/dist/components/HoloFx.d.ts +32 -0
- package/dist/components/HoloFx.d.ts.map +1 -0
- package/dist/components/HoloFx.js +90 -0
- package/dist/components/HoloFx.js.map +1 -0
- package/dist/components/HoloFx.module.scss +32 -0
- package/dist/components/Hover.d.ts +14 -0
- package/dist/components/Hover.d.ts.map +1 -0
- package/dist/components/Hover.js +99 -0
- package/dist/components/Hover.js.map +1 -0
- package/dist/components/Hover.module.scss +12 -0
- package/dist/components/HoverCard.d.ts +5 -0
- package/dist/components/HoverCard.d.ts.map +1 -0
- package/dist/components/HoverCard.js +10 -0
- package/dist/components/HoverCard.js.map +1 -0
- package/dist/components/HoverCard.module.scss +12 -0
- package/dist/components/Icon.d.ts +18 -0
- package/dist/components/Icon.d.ts.map +1 -0
- package/dist/components/Icon.js +35 -0
- package/dist/components/Icon.js.map +1 -0
- package/dist/components/Icon.module.scss +19 -0
- package/dist/components/IconButton.d.ts +23 -0
- package/dist/components/IconButton.d.ts.map +1 -0
- package/dist/components/IconButton.js +23 -0
- package/dist/components/IconButton.js.map +1 -0
- package/dist/components/IconButton.module.scss +34 -0
- package/dist/components/InfiniteScroll.d.ts +16 -0
- package/dist/components/InfiniteScroll.d.ts.map +1 -0
- package/dist/components/InfiniteScroll.js +52 -0
- package/dist/components/InfiniteScroll.js.map +1 -0
- package/dist/components/InlineCode.d.ts +10 -0
- package/dist/components/InlineCode.d.ts.map +1 -0
- package/dist/components/InlineCode.js +12 -0
- package/dist/components/InlineCode.js.map +1 -0
- package/dist/components/InlineCode.module.scss +5 -0
- package/dist/components/Input.d.ts +24 -0
- package/dist/components/Input.d.ts.map +1 -0
- package/dist/components/Input.js +82 -0
- package/dist/components/Input.js.map +1 -0
- package/dist/components/Input.module.scss +196 -0
- package/dist/components/InteractiveDetails.d.ts +15 -0
- package/dist/components/InteractiveDetails.d.ts.map +1 -0
- package/dist/components/InteractiveDetails.js +10 -0
- package/dist/components/InteractiveDetails.js.map +1 -0
- package/dist/components/Kbd.d.ts +12 -0
- package/dist/components/Kbd.d.ts.map +1 -0
- package/dist/components/Kbd.js +7 -0
- package/dist/components/Kbd.js.map +1 -0
- package/dist/components/LetterFx.d.ts +13 -0
- package/dist/components/LetterFx.d.ts.map +1 -0
- package/dist/components/LetterFx.js +80 -0
- package/dist/components/LetterFx.js.map +1 -0
- package/dist/components/Line.d.ts +9 -0
- package/dist/components/Line.d.ts.map +1 -0
- package/dist/components/Line.js +10 -0
- package/dist/components/Line.js.map +1 -0
- package/dist/components/List.d.ts +11 -0
- package/dist/components/List.d.ts.map +1 -0
- package/dist/components/List.js +13 -0
- package/dist/components/List.js.map +1 -0
- package/dist/components/List.module.scss +5 -0
- package/dist/components/ListItem.d.ts +10 -0
- package/dist/components/ListItem.d.ts.map +1 -0
- package/dist/components/ListItem.js +13 -0
- package/dist/components/ListItem.js.map +1 -0
- package/dist/components/Logo.d.ts +18 -0
- package/dist/components/Logo.d.ts.map +1 -0
- package/dist/components/Logo.js +99 -0
- package/dist/components/Logo.js.map +1 -0
- package/dist/components/LogoCloud.d.ts +14 -0
- package/dist/components/LogoCloud.d.ts.map +1 -0
- package/dist/components/LogoCloud.js +38 -0
- package/dist/components/LogoCloud.js.map +1 -0
- package/dist/components/LogoCloud.module.scss +42 -0
- package/dist/components/Mask.d.ts +15 -0
- package/dist/components/Mask.d.ts.map +1 -0
- package/dist/components/Mask.js +107 -0
- package/dist/components/Mask.js.map +1 -0
- package/dist/components/Mask.module.scss +8 -0
- package/dist/components/MasonryGrid.d.ts +22 -0
- package/dist/components/MasonryGrid.d.ts.map +1 -0
- package/dist/components/MasonryGrid.js +53 -0
- package/dist/components/MasonryGrid.js.map +1 -0
- package/dist/components/MasonryGrid.module.scss +199 -0
- package/dist/components/MatrixFx.d.ts +27 -0
- package/dist/components/MatrixFx.d.ts.map +1 -0
- package/dist/components/MatrixFx.js +799 -0
- package/dist/components/MatrixFx.js.map +1 -0
- package/dist/components/Media.d.ts +26 -0
- package/dist/components/Media.d.ts.map +1 -0
- package/dist/components/Media.js +112 -0
- package/dist/components/Media.js.map +1 -0
- package/dist/components/Modal.d.ts +11 -0
- package/dist/components/Modal.d.ts.map +1 -0
- package/dist/components/Modal.js +72 -0
- package/dist/components/Modal.js.map +1 -0
- package/dist/components/NavIcon.d.ts +11 -0
- package/dist/components/NavIcon.d.ts.map +1 -0
- package/dist/components/NavIcon.js +11 -0
- package/dist/components/NavIcon.js.map +1 -0
- package/dist/components/NavIcon.module.scss +25 -0
- package/dist/components/NumberInput.d.ts +13 -0
- package/dist/components/NumberInput.d.ts.map +1 -0
- package/dist/components/NumberInput.js +44 -0
- package/dist/components/NumberInput.js.map +1 -0
- package/dist/components/NumberInput.module.scss +18 -0
- package/dist/components/OTPInput.d.ts +13 -0
- package/dist/components/OTPInput.d.ts.map +1 -0
- package/dist/components/OTPInput.js +71 -0
- package/dist/components/OTPInput.js.map +1 -0
- package/dist/components/OTPInput.module.scss +26 -0
- package/dist/components/OgCard.d.ts +34 -0
- package/dist/components/OgCard.d.ts.map +1 -0
- package/dist/components/OgCard.js +102 -0
- package/dist/components/OgCard.js.map +1 -0
- package/dist/components/Option.d.ts +21 -0
- package/dist/components/Option.d.ts.map +1 -0
- package/dist/components/Option.js +93 -0
- package/dist/components/Option.js.map +1 -0
- package/dist/components/Option.module.scss +47 -0
- package/dist/components/Particle.d.ts +21 -0
- package/dist/components/Particle.d.ts.map +1 -0
- package/dist/components/Particle.js +140 -0
- package/dist/components/Particle.js.map +1 -0
- package/dist/components/PasswordInput.d.ts +4 -0
- package/dist/components/PasswordInput.d.ts.map +1 -0
- package/dist/components/PasswordInput.js +12 -0
- package/dist/components/PasswordInput.js.map +1 -0
- package/dist/components/ProgressBar.d.ts +15 -0
- package/dist/components/ProgressBar.d.ts.map +1 -0
- package/dist/components/ProgressBar.js +12 -0
- package/dist/components/ProgressBar.js.map +1 -0
- package/dist/components/Pulse.d.ts +13 -0
- package/dist/components/Pulse.d.ts.map +1 -0
- package/dist/components/Pulse.js +11 -0
- package/dist/components/Pulse.js.map +1 -0
- package/dist/components/Pulse.module.scss +22 -0
- package/dist/components/RadioButton.d.ts +15 -0
- package/dist/components/RadioButton.d.ts.map +1 -0
- package/dist/components/RadioButton.js +45 -0
- package/dist/components/RadioButton.js.map +1 -0
- package/dist/components/RevealFx.d.ts +16 -0
- package/dist/components/RevealFx.d.ts.map +1 -0
- package/dist/components/RevealFx.js +83 -0
- package/dist/components/RevealFx.js.map +1 -0
- package/dist/components/RevealFx.module.scss +27 -0
- package/dist/components/Row.d.ts +7 -0
- package/dist/components/Row.d.ts.map +1 -0
- package/dist/components/Row.js +10 -0
- package/dist/components/Row.js.map +1 -0
- package/dist/components/ScrollContainer.d.ts +9 -0
- package/dist/components/ScrollContainer.d.ts.map +1 -0
- package/dist/components/ScrollContainer.js +67 -0
- package/dist/components/ScrollContainer.js.map +1 -0
- package/dist/components/ScrollLock.d.ts +8 -0
- package/dist/components/ScrollLock.d.ts.map +1 -0
- package/dist/components/ScrollLock.js +112 -0
- package/dist/components/ScrollLock.js.map +1 -0
- package/dist/components/ScrollToTop.d.ts +7 -0
- package/dist/components/ScrollToTop.d.ts.map +1 -0
- package/dist/components/ScrollToTop.js +24 -0
- package/dist/components/ScrollToTop.js.map +1 -0
- package/dist/components/ScrollToTop.module.scss +11 -0
- package/dist/components/Scroller.d.ts +14 -0
- package/dist/components/Scroller.d.ts.map +1 -0
- package/dist/components/Scroller.js +100 -0
- package/dist/components/Scroller.js.map +1 -0
- package/dist/components/Scroller.module.scss +20 -0
- package/dist/components/SegmentedControl.d.ts +18 -0
- package/dist/components/SegmentedControl.d.ts.map +1 -0
- package/dist/components/SegmentedControl.js +70 -0
- package/dist/components/SegmentedControl.js.map +1 -0
- package/dist/components/Select.d.ts +19 -0
- package/dist/components/Select.d.ts.map +1 -0
- package/dist/components/Select.js +170 -0
- package/dist/components/Select.js.map +1 -0
- package/dist/components/ServerFlex.d.ts +12 -0
- package/dist/components/ServerFlex.d.ts.map +1 -0
- package/dist/components/ServerFlex.js +282 -0
- package/dist/components/ServerFlex.js.map +1 -0
- package/dist/components/ServerGrid.d.ts +13 -0
- package/dist/components/ServerGrid.d.ts.map +1 -0
- package/dist/components/ServerGrid.js +207 -0
- package/dist/components/ServerGrid.js.map +1 -0
- package/dist/components/SharedInteractiveStyles.module.scss +91 -0
- package/dist/components/ShineFx.d.ts +13 -0
- package/dist/components/ShineFx.d.ts.map +1 -0
- package/dist/components/ShineFx.js +19 -0
- package/dist/components/ShineFx.js.map +1 -0
- package/dist/components/ShineFx.module.scss +50 -0
- package/dist/components/Skeleton.d.ts +13 -0
- package/dist/components/Skeleton.d.ts.map +1 -0
- package/dist/components/Skeleton.js +12 -0
- package/dist/components/Skeleton.js.map +1 -0
- package/dist/components/Skeleton.module.scss +120 -0
- package/dist/components/Slider.d.ts +17 -0
- package/dist/components/Slider.d.ts.map +1 -0
- package/dist/components/Slider.js +29 -0
- package/dist/components/Slider.js.map +1 -0
- package/dist/components/Slider.module.scss +75 -0
- package/dist/components/SmartLink.d.ts +18 -0
- package/dist/components/SmartLink.d.ts.map +1 -0
- package/dist/components/SmartLink.js +36 -0
- package/dist/components/SmartLink.js.map +1 -0
- package/dist/components/Spinner.d.ts +11 -0
- package/dist/components/Spinner.d.ts.map +1 -0
- package/dist/components/Spinner.js +11 -0
- package/dist/components/Spinner.js.map +1 -0
- package/dist/components/Spinner.module.scss +71 -0
- package/dist/components/SplitView.d.ts +16 -0
- package/dist/components/SplitView.d.ts.map +1 -0
- package/dist/components/SplitView.js +80 -0
- package/dist/components/SplitView.js.map +1 -0
- package/dist/components/SplitView.module.scss +18 -0
- package/dist/components/StatusIndicator.d.ts +12 -0
- package/dist/components/StatusIndicator.d.ts.map +1 -0
- package/dist/components/StatusIndicator.js +11 -0
- package/dist/components/StatusIndicator.js.map +1 -0
- package/dist/components/StatusIndicator.module.scss +72 -0
- package/dist/components/StyleOverlay.d.ts +10 -0
- package/dist/components/StyleOverlay.d.ts.map +1 -0
- package/dist/components/StyleOverlay.js +17 -0
- package/dist/components/StyleOverlay.js.map +1 -0
- package/dist/components/StyleOverlay.module.scss +18 -0
- package/dist/components/StylePanel.d.ts +8 -0
- package/dist/components/StylePanel.d.ts.map +1 -0
- package/dist/components/StylePanel.js +193 -0
- package/dist/components/StylePanel.js.map +1 -0
- package/dist/components/StylePanel.module.scss +127 -0
- package/dist/components/Swiper.d.ts +17 -0
- package/dist/components/Swiper.d.ts.map +1 -0
- package/dist/components/Swiper.js +170 -0
- package/dist/components/Swiper.js.map +1 -0
- package/dist/components/Swiper.module.scss +31 -0
- package/dist/components/Switch.d.ts +17 -0
- package/dist/components/Switch.d.ts.map +1 -0
- package/dist/components/Switch.js +33 -0
- package/dist/components/Switch.js.map +1 -0
- package/dist/components/Switch.module.scss +102 -0
- package/dist/components/Table.d.ts +16 -0
- package/dist/components/Table.d.ts.map +1 -0
- package/dist/components/Table.js +44 -0
- package/dist/components/Table.js.map +1 -0
- package/dist/components/Table.module.scss +5 -0
- package/dist/components/Tag.d.ts +16 -0
- package/dist/components/Tag.d.ts.map +1 -0
- package/dist/components/Tag.js +14 -0
- package/dist/components/Tag.js.map +1 -0
- package/dist/components/Tag.module.scss +10 -0
- package/dist/components/TagInput.d.ts +9 -0
- package/dist/components/TagInput.d.ts.map +1 -0
- package/dist/components/TagInput.js +36 -0
- package/dist/components/TagInput.js.map +1 -0
- package/dist/components/Text.d.ts +9 -0
- package/dist/components/Text.d.ts.map +1 -0
- package/dist/components/Text.js +50 -0
- package/dist/components/Text.js.map +1 -0
- package/dist/components/Textarea.d.ts +24 -0
- package/dist/components/Textarea.d.ts.map +1 -0
- package/dist/components/Textarea.js +109 -0
- package/dist/components/Textarea.js.map +1 -0
- package/dist/components/ThemeInit.d.ts +20 -0
- package/dist/components/ThemeInit.d.ts.map +1 -0
- package/dist/components/ThemeInit.js +46 -0
- package/dist/components/ThemeInit.js.map +1 -0
- package/dist/components/ThemeSwitcher.d.ts +4 -0
- package/dist/components/ThemeSwitcher.d.ts.map +1 -0
- package/dist/components/ThemeSwitcher.js +21 -0
- package/dist/components/ThemeSwitcher.js.map +1 -0
- package/dist/components/TiltFx.d.ts +10 -0
- package/dist/components/TiltFx.d.ts.map +1 -0
- package/dist/components/TiltFx.js +67 -0
- package/dist/components/TiltFx.js.map +1 -0
- package/dist/components/TiltFx.module.scss +11 -0
- package/dist/components/Timeline.d.ts +18 -0
- package/dist/components/Timeline.d.ts.map +1 -0
- package/dist/components/Timeline.js +72 -0
- package/dist/components/Timeline.js.map +1 -0
- package/dist/components/Toast.d.ts +12 -0
- package/dist/components/Toast.d.ts.map +1 -0
- package/dist/components/Toast.js +29 -0
- package/dist/components/Toast.js.map +1 -0
- package/dist/components/Toast.module.scss +11 -0
- package/dist/components/Toaster.d.ts +19 -0
- package/dist/components/Toaster.d.ts.map +1 -0
- package/dist/components/Toaster.js +47 -0
- package/dist/components/Toaster.js.map +1 -0
- package/dist/components/Toaster.module.scss +58 -0
- package/dist/components/ToggleButton.d.ts +25 -0
- package/dist/components/ToggleButton.d.ts.map +1 -0
- package/dist/components/ToggleButton.js +20 -0
- package/dist/components/ToggleButton.js.map +1 -0
- package/dist/components/ToggleButton.module.scss +73 -0
- package/dist/components/Tooltip.d.ts +13 -0
- package/dist/components/Tooltip.d.ts.map +1 -0
- package/dist/components/Tooltip.js +15 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/Tooltip.module.scss +14 -0
- package/dist/components/TypeFx.d.ts +15 -0
- package/dist/components/TypeFx.d.ts.map +1 -0
- package/dist/components/TypeFx.js +84 -0
- package/dist/components/TypeFx.js.map +1 -0
- package/dist/components/User.d.ts +16 -0
- package/dist/components/User.d.ts.map +1 -0
- package/dist/components/User.js +13 -0
- package/dist/components/User.js.map +1 -0
- package/dist/components/UserMenu.d.ts +13 -0
- package/dist/components/UserMenu.d.ts.map +1 -0
- package/dist/components/UserMenu.js +13 -0
- package/dist/components/UserMenu.js.map +1 -0
- package/dist/components/UserMenu.module.scss +14 -0
- package/dist/components/WeatherFx.d.ts +18 -0
- package/dist/components/WeatherFx.d.ts.map +1 -0
- package/dist/components/WeatherFx.js +864 -0
- package/dist/components/WeatherFx.js.map +1 -0
- package/dist/components/index.d.ts +121 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +121 -0
- package/dist/components/index.js.map +1 -0
- package/dist/contexts/DataThemeProvider.d.ts +26 -0
- package/dist/contexts/DataThemeProvider.d.ts.map +1 -0
- package/dist/contexts/DataThemeProvider.js +103 -0
- package/dist/contexts/DataThemeProvider.js.map +1 -0
- package/dist/contexts/IconProvider.d.ts +12 -0
- package/dist/contexts/IconProvider.d.ts.map +1 -0
- package/dist/contexts/IconProvider.js +20 -0
- package/dist/contexts/IconProvider.js.map +1 -0
- package/dist/contexts/LayoutProvider.d.ts +27 -0
- package/dist/contexts/LayoutProvider.d.ts.map +1 -0
- package/dist/contexts/LayoutProvider.js +96 -0
- package/dist/contexts/LayoutProvider.js.map +1 -0
- package/dist/contexts/ThemeProvider.d.ts +49 -0
- package/dist/contexts/ThemeProvider.d.ts.map +1 -0
- package/dist/contexts/ThemeProvider.js +285 -0
- package/dist/contexts/ThemeProvider.js.map +1 -0
- package/dist/contexts/ToastProvider.d.ts +24 -0
- package/dist/contexts/ToastProvider.d.ts.map +1 -0
- package/dist/contexts/ToastProvider.js +34 -0
- package/dist/contexts/ToastProvider.js.map +1 -0
- package/dist/contexts/index.d.ts +6 -0
- package/dist/contexts/index.d.ts.map +1 -0
- package/dist/contexts/index.js +6 -0
- package/dist/contexts/index.js.map +1 -0
- package/dist/css/styles.css +1 -0
- package/dist/css/styles.css.map +1 -0
- package/dist/css/tokens.css +1 -0
- package/dist/css/tokens.css.map +1 -0
- package/dist/data/emoji-data.json +16062 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +8 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useArrowNavigation.d.ts +23 -0
- package/dist/hooks/useArrowNavigation.d.ts.map +1 -0
- package/dist/hooks/useArrowNavigation.js +205 -0
- package/dist/hooks/useArrowNavigation.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +2 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useDebounce.js +15 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useFetchOg.d.ts +17 -0
- package/dist/hooks/useFetchOg.d.ts.map +1 -0
- package/dist/hooks/useFetchOg.js +63 -0
- package/dist/hooks/useFetchOg.js.map +1 -0
- package/dist/hooks/useHeadingLinks.d.ts +6 -0
- package/dist/hooks/useHeadingLinks.d.ts.map +1 -0
- package/dist/hooks/useHeadingLinks.js +17 -0
- package/dist/hooks/useHeadingLinks.js.map +1 -0
- package/dist/hooks/useInViewport.d.ts +3 -0
- package/dist/hooks/useInViewport.d.ts.map +1 -0
- package/dist/hooks/useInViewport.js +19 -0
- package/dist/hooks/useInViewport.js.map +1 -0
- package/dist/hooks/useReducedMotion.d.ts +8 -0
- package/dist/hooks/useReducedMotion.d.ts.map +1 -0
- package/dist/hooks/useReducedMotion.js +44 -0
- package/dist/hooks/useReducedMotion.js.map +1 -0
- package/dist/hooks/useResponsiveClasses.d.ts +9 -0
- package/dist/hooks/useResponsiveClasses.d.ts.map +1 -0
- package/dist/hooks/useResponsiveClasses.js +250 -0
- package/dist/hooks/useResponsiveClasses.js.map +1 -0
- package/dist/hooks/useStreamingData.d.ts +24 -0
- package/dist/hooks/useStreamingData.d.ts.map +1 -0
- package/dist/hooks/useStreamingData.js +89 -0
- package/dist/hooks/useStreamingData.js.map +1 -0
- package/dist/hooks/useStreamingViewport.d.ts +25 -0
- package/dist/hooks/useStreamingViewport.d.ts.map +1 -0
- package/dist/hooks/useStreamingViewport.js +120 -0
- package/dist/hooks/useStreamingViewport.js.map +1 -0
- package/dist/icons.d.ts +5 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +56 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +177 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +2 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/modules/code/CodeBlock.d.ts +6 -0
- package/dist/modules/code/CodeBlock.d.ts.map +1 -0
- package/dist/modules/code/CodeBlock.impl.d.ts +34 -0
- package/dist/modules/code/CodeBlock.impl.d.ts.map +1 -0
- package/dist/modules/code/CodeBlock.impl.js +497 -0
- package/dist/modules/code/CodeBlock.impl.js.map +1 -0
- package/dist/modules/code/CodeBlock.js +14 -0
- package/dist/modules/code/CodeBlock.js.map +1 -0
- package/dist/modules/code/CodeBlock.module.scss +43 -0
- package/dist/modules/code/CodeDiff.css +175 -0
- package/dist/modules/code/CodeHighlight.css +116 -0
- package/dist/modules/code/LineNumber.css +34 -0
- package/dist/modules/data/BarChart.d.ts +6 -0
- package/dist/modules/data/BarChart.d.ts.map +1 -0
- package/dist/modules/data/BarChart.impl.d.ts +12 -0
- package/dist/modules/data/BarChart.impl.d.ts.map +1 -0
- package/dist/modules/data/BarChart.impl.js +129 -0
- package/dist/modules/data/BarChart.impl.js.map +1 -0
- package/dist/modules/data/BarChart.js +14 -0
- package/dist/modules/data/BarChart.js.map +1 -0
- package/dist/modules/data/ChartHeader.d.ts +14 -0
- package/dist/modules/data/ChartHeader.d.ts.map +1 -0
- package/dist/modules/data/ChartHeader.js +116 -0
- package/dist/modules/data/ChartHeader.js.map +1 -0
- package/dist/modules/data/ChartStatus.d.ts +10 -0
- package/dist/modules/data/ChartStatus.d.ts.map +1 -0
- package/dist/modules/data/ChartStatus.js +10 -0
- package/dist/modules/data/ChartStatus.js.map +1 -0
- package/dist/modules/data/DataTooltip.d.ts +16 -0
- package/dist/modules/data/DataTooltip.d.ts.map +1 -0
- package/dist/modules/data/DataTooltip.js +16 -0
- package/dist/modules/data/DataTooltip.js.map +1 -0
- package/dist/modules/data/Gauge.module.css +27 -0
- package/dist/modules/data/Gradient.d.ts +32 -0
- package/dist/modules/data/Gradient.d.ts.map +1 -0
- package/dist/modules/data/Gradient.js +56 -0
- package/dist/modules/data/Gradient.js.map +1 -0
- package/dist/modules/data/Legend.d.ts +15 -0
- package/dist/modules/data/Legend.d.ts.map +1 -0
- package/dist/modules/data/Legend.js +69 -0
- package/dist/modules/data/Legend.js.map +1 -0
- package/dist/modules/data/LineBarChart.d.ts +6 -0
- package/dist/modules/data/LineBarChart.d.ts.map +1 -0
- package/dist/modules/data/LineBarChart.impl.d.ts +12 -0
- package/dist/modules/data/LineBarChart.impl.d.ts.map +1 -0
- package/dist/modules/data/LineBarChart.impl.js +124 -0
- package/dist/modules/data/LineBarChart.impl.js.map +1 -0
- package/dist/modules/data/LineBarChart.js +14 -0
- package/dist/modules/data/LineBarChart.js.map +1 -0
- package/dist/modules/data/LineChart.d.ts +6 -0
- package/dist/modules/data/LineChart.d.ts.map +1 -0
- package/dist/modules/data/LineChart.impl.d.ts +17 -0
- package/dist/modules/data/LineChart.impl.d.ts.map +1 -0
- package/dist/modules/data/LineChart.impl.js +137 -0
- package/dist/modules/data/LineChart.impl.js.map +1 -0
- package/dist/modules/data/LineChart.js +14 -0
- package/dist/modules/data/LineChart.js.map +1 -0
- package/dist/modules/data/LinearGauge.d.ts +18 -0
- package/dist/modules/data/LinearGauge.d.ts.map +1 -0
- package/dist/modules/data/LinearGauge.js +78 -0
- package/dist/modules/data/LinearGauge.js.map +1 -0
- package/dist/modules/data/PieChart.d.ts +6 -0
- package/dist/modules/data/PieChart.d.ts.map +1 -0
- package/dist/modules/data/PieChart.impl.d.ts +18 -0
- package/dist/modules/data/PieChart.impl.d.ts.map +1 -0
- package/dist/modules/data/PieChart.impl.js +100 -0
- package/dist/modules/data/PieChart.impl.js.map +1 -0
- package/dist/modules/data/PieChart.js +14 -0
- package/dist/modules/data/PieChart.js.map +1 -0
- package/dist/modules/data/RadialGauge.d.ts +25 -0
- package/dist/modules/data/RadialGauge.d.ts.map +1 -0
- package/dist/modules/data/RadialGauge.js +94 -0
- package/dist/modules/data/RadialGauge.js.map +1 -0
- package/dist/modules/data/Swatch.d.ts +9 -0
- package/dist/modules/data/Swatch.d.ts.map +1 -0
- package/dist/modules/data/Swatch.js +44 -0
- package/dist/modules/data/Swatch.js.map +1 -0
- package/dist/modules/data/index.d.ts +14 -0
- package/dist/modules/data/index.d.ts.map +1 -0
- package/dist/modules/data/index.js +14 -0
- package/dist/modules/data/index.js.map +1 -0
- package/dist/modules/data/interfaces.d.ts +53 -0
- package/dist/modules/data/interfaces.d.ts.map +1 -0
- package/dist/modules/data/interfaces.js +2 -0
- package/dist/modules/data/interfaces.js.map +1 -0
- package/dist/modules/data/rechartsLoader.d.ts +2 -0
- package/dist/modules/data/rechartsLoader.d.ts.map +1 -0
- package/dist/modules/data/rechartsLoader.js +15 -0
- package/dist/modules/data/rechartsLoader.js.map +1 -0
- package/dist/modules/data/utils/colorDistribution.d.ts +10 -0
- package/dist/modules/data/utils/colorDistribution.d.ts.map +1 -0
- package/dist/modules/data/utils/colorDistribution.js +46 -0
- package/dist/modules/data/utils/colorDistribution.js.map +1 -0
- package/dist/modules/data/utils/formatDate.d.ts +12 -0
- package/dist/modules/data/utils/formatDate.d.ts.map +1 -0
- package/dist/modules/data/utils/formatDate.js +30 -0
- package/dist/modules/data/utils/formatDate.js.map +1 -0
- package/dist/modules/index.d.ts +6 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +7 -0
- package/dist/modules/index.js.map +1 -0
- package/dist/modules/media/MediaUpload.d.ts +6 -0
- package/dist/modules/media/MediaUpload.d.ts.map +1 -0
- package/dist/modules/media/MediaUpload.impl.d.ts +24 -0
- package/dist/modules/media/MediaUpload.impl.d.ts.map +1 -0
- package/dist/modules/media/MediaUpload.impl.js +106 -0
- package/dist/modules/media/MediaUpload.impl.js.map +1 -0
- package/dist/modules/media/MediaUpload.js +14 -0
- package/dist/modules/media/MediaUpload.js.map +1 -0
- package/dist/modules/media/MediaUpload.module.scss +24 -0
- package/dist/modules/navigation/HeadingLink.d.ts +11 -0
- package/dist/modules/navigation/HeadingLink.d.ts.map +1 -0
- package/dist/modules/navigation/HeadingLink.js +39 -0
- package/dist/modules/navigation/HeadingLink.js.map +1 -0
- package/dist/modules/navigation/HeadingLink.module.scss +15 -0
- package/dist/modules/navigation/HeadingNav.d.ts +8 -0
- package/dist/modules/navigation/HeadingNav.d.ts.map +1 -0
- package/dist/modules/navigation/HeadingNav.js +168 -0
- package/dist/modules/navigation/HeadingNav.js.map +1 -0
- package/dist/modules/navigation/Kbar.d.ts +34 -0
- package/dist/modules/navigation/Kbar.d.ts.map +1 -0
- package/dist/modules/navigation/Kbar.js +192 -0
- package/dist/modules/navigation/Kbar.js.map +1 -0
- package/dist/modules/navigation/Kbar.module.scss +60 -0
- package/dist/modules/navigation/MegaMenu.d.ts +28 -0
- package/dist/modules/navigation/MegaMenu.d.ts.map +1 -0
- package/dist/modules/navigation/MegaMenu.js +182 -0
- package/dist/modules/navigation/MegaMenu.js.map +1 -0
- package/dist/modules/navigation/MegaMenu.module.scss +14 -0
- package/dist/modules/navigation/MobileMegaMenu.d.ts +28 -0
- package/dist/modules/navigation/MobileMegaMenu.d.ts.map +1 -0
- package/dist/modules/navigation/MobileMegaMenu.js +22 -0
- package/dist/modules/navigation/MobileMegaMenu.js.map +1 -0
- package/dist/modules/navigation/index.d.ts +6 -0
- package/dist/modules/navigation/index.d.ts.map +1 -0
- package/dist/modules/navigation/index.js +6 -0
- package/dist/modules/navigation/index.js.map +1 -0
- package/dist/modules/seo/Meta.d.ts +29 -0
- package/dist/modules/seo/Meta.d.ts.map +1 -0
- package/dist/modules/seo/Meta.js +53 -0
- package/dist/modules/seo/Meta.js.map +1 -0
- package/dist/modules/seo/Schema.d.ts +19 -0
- package/dist/modules/seo/Schema.d.ts.map +1 -0
- package/dist/modules/seo/Schema.js +65 -0
- package/dist/modules/seo/Schema.js.map +1 -0
- package/dist/package.json +130 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/og-utils.d.ts +20 -0
- package/dist/server/og-utils.d.ts.map +1 -0
- package/dist/server/og-utils.js +125 -0
- package/dist/server/og-utils.js.map +1 -0
- package/dist/styles/background.scss +423 -0
- package/dist/styles/border.scss +546 -0
- package/dist/styles/breakpoints.scss +28 -0
- package/dist/styles/color.scss +183 -0
- package/dist/styles/display.scss +391 -0
- package/dist/styles/flex.scss +518 -0
- package/dist/styles/global.scss +36 -0
- package/dist/styles/grid.scss +293 -0
- package/dist/styles/index.scss +14 -0
- package/dist/styles/position.scss +1549 -0
- package/dist/styles/shadow.scss +19 -0
- package/dist/styles/size.scss +53 -0
- package/dist/styles/spacing.scss +1505 -0
- package/dist/styles/typography.scss +215 -0
- package/dist/styles/utilities.scss +23 -0
- package/dist/test/dialogTestUtils.d.ts +2 -0
- package/dist/test/dialogTestUtils.d.ts.map +1 -0
- package/dist/test/dialogTestUtils.js +12 -0
- package/dist/test/dialogTestUtils.js.map +1 -0
- package/dist/test/setup.d.ts +2 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +59 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/tokens/border.scss +95 -0
- package/dist/tokens/data.scss +107 -0
- package/dist/tokens/function.scss +742 -0
- package/dist/tokens/index.scss +8 -0
- package/dist/tokens/layout.scss +275 -0
- package/dist/tokens/scheme.scss +352 -0
- package/dist/tokens/shadow.scss +7 -0
- package/dist/tokens/theme.scss +639 -0
- package/dist/tokens/typography.scss +116 -0
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/MissingDependency.d.ts +7 -0
- package/dist/utils/MissingDependency.d.ts.map +1 -0
- package/dist/utils/MissingDependency.js +6 -0
- package/dist/utils/MissingDependency.js.map +1 -0
- package/dist/utils/devLogger.d.ts +13 -0
- package/dist/utils/devLogger.d.ts.map +1 -0
- package/dist/utils/devLogger.js +34 -0
- package/dist/utils/devLogger.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +155 -0
|
@@ -0,0 +1,864 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React, { useEffect, useRef } from "react";
|
|
4
|
+
import { Flex } from ".";
|
|
5
|
+
import { useReducedMotion } from "../hooks/useReducedMotion";
|
|
6
|
+
const WeatherFx = React.forwardRef(({ type = "rain", speed = 1, colors = ["brand-solid-medium"], intensity = 50, angle = 0, duration, trigger = "mount", active = false, reducedMotion = "auto", children, ...rest }, forwardedRef) => {
|
|
7
|
+
const { shouldAnimate } = useReducedMotion(reducedMotion);
|
|
8
|
+
const containerRef = useRef(null);
|
|
9
|
+
const canvasRef = useRef(null);
|
|
10
|
+
const animationRef = useRef(undefined);
|
|
11
|
+
const particlesRef = useRef([]);
|
|
12
|
+
const timeRef = useRef(0);
|
|
13
|
+
const isEmittingRef = useRef(trigger === "mount" || (trigger === "manual" && active));
|
|
14
|
+
const emitStartTimeRef = useRef(Date.now());
|
|
15
|
+
const isHoveredRef = useRef(false);
|
|
16
|
+
const lastLightningTimeRef = useRef(0);
|
|
17
|
+
const lastBoltCountRef = useRef(0);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
if (forwardedRef) {
|
|
20
|
+
if ("current" in forwardedRef) {
|
|
21
|
+
forwardedRef.current = containerRef.current;
|
|
22
|
+
}
|
|
23
|
+
else if (typeof forwardedRef === "function") {
|
|
24
|
+
forwardedRef(containerRef.current);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}, [forwardedRef]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const canvas = canvasRef.current;
|
|
30
|
+
const container = containerRef.current;
|
|
31
|
+
if (!canvas || !container)
|
|
32
|
+
return;
|
|
33
|
+
const ctx = canvas.getContext("2d");
|
|
34
|
+
if (!ctx)
|
|
35
|
+
return;
|
|
36
|
+
// Set canvas size
|
|
37
|
+
let canvasWidth = 0;
|
|
38
|
+
let canvasHeight = 0;
|
|
39
|
+
const updateSize = () => {
|
|
40
|
+
const rect = container.getBoundingClientRect();
|
|
41
|
+
canvasWidth = rect.width;
|
|
42
|
+
canvasHeight = rect.height;
|
|
43
|
+
canvas.width = rect.width * 2; // 2x for retina
|
|
44
|
+
canvas.height = rect.height * 2;
|
|
45
|
+
canvas.style.width = `${rect.width}px`;
|
|
46
|
+
canvas.style.height = `${rect.height}px`;
|
|
47
|
+
ctx.scale(2, 2); // Scale for retina
|
|
48
|
+
};
|
|
49
|
+
updateSize();
|
|
50
|
+
window.addEventListener("resize", updateSize);
|
|
51
|
+
// Parse colors - convert token names to CSS variables
|
|
52
|
+
const parsedColors = colors.map((color) => {
|
|
53
|
+
const computedColor = getComputedStyle(container).getPropertyValue(`--${color}`);
|
|
54
|
+
return computedColor || color;
|
|
55
|
+
});
|
|
56
|
+
// Initialize particles based on type
|
|
57
|
+
const initializeRain = () => {
|
|
58
|
+
const particles = [];
|
|
59
|
+
// Calculate spawn area based on angle
|
|
60
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
61
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
62
|
+
// Create initial rain drops
|
|
63
|
+
for (let i = 0; i < intensity; i++) {
|
|
64
|
+
// Expand spawn width to account for angle
|
|
65
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
66
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
67
|
+
particles.push({
|
|
68
|
+
x: spawnX,
|
|
69
|
+
y: Math.random() * canvasHeight - canvasHeight, // Start above canvas
|
|
70
|
+
length: 10 + Math.random() * 20, // Varying lengths
|
|
71
|
+
speed: (2 + Math.random() * 3) * speed, // Varying speeds
|
|
72
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
73
|
+
opacity: 0.3 + Math.random() * 0.5,
|
|
74
|
+
thickness: 1 + Math.random() * 1.5,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return particles;
|
|
78
|
+
};
|
|
79
|
+
// Initialize snow particles
|
|
80
|
+
const initializeSnow = () => {
|
|
81
|
+
const particles = [];
|
|
82
|
+
// Calculate spawn area based on angle
|
|
83
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
84
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
85
|
+
for (let i = 0; i < intensity; i++) {
|
|
86
|
+
const depth = Math.random(); // 0 = far, 1 = near
|
|
87
|
+
const size = 2 + depth * 4; // 2-6px, bigger = closer
|
|
88
|
+
// Expand spawn width to account for angle
|
|
89
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
90
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
91
|
+
particles.push({
|
|
92
|
+
x: spawnX,
|
|
93
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
94
|
+
size,
|
|
95
|
+
speed: (0.3 + depth * 0.7) * speed, // 0.3-1.0x speed, closer = faster
|
|
96
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
97
|
+
opacity: 0.4 + depth * 0.5, // 0.4-0.9, closer = more opaque
|
|
98
|
+
swayAmplitude: 20 + Math.random() * 30, // 20-50px horizontal sway
|
|
99
|
+
swaySpeed: 0.5 + Math.random() * 1, // Varying sway speeds
|
|
100
|
+
swayOffset: Math.random() * Math.PI * 2, // Random starting phase
|
|
101
|
+
depth,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return particles;
|
|
105
|
+
};
|
|
106
|
+
// Initialize leaves particles
|
|
107
|
+
const initializeLeaves = () => {
|
|
108
|
+
const particles = [];
|
|
109
|
+
// Calculate spawn area based on angle
|
|
110
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
111
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
112
|
+
for (let i = 0; i < intensity; i++) {
|
|
113
|
+
const depth = Math.random(); // 0 = far, 1 = near
|
|
114
|
+
const width = 8 + depth * 12; // 8-20px, bigger = closer
|
|
115
|
+
const height = width * (0.6 + Math.random() * 0.4); // Leaf aspect ratio
|
|
116
|
+
// Expand spawn width to account for angle
|
|
117
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
118
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
119
|
+
// Pick two colors for gradient (either from same color or adjacent colors)
|
|
120
|
+
const colorIndex = Math.floor(Math.random() * parsedColors.length);
|
|
121
|
+
const color1 = parsedColors[colorIndex];
|
|
122
|
+
const color2 = parsedColors[Math.min(colorIndex + 1, parsedColors.length - 1)];
|
|
123
|
+
particles.push({
|
|
124
|
+
x: spawnX,
|
|
125
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
126
|
+
width,
|
|
127
|
+
height,
|
|
128
|
+
speed: (0.4 + depth * 0.8) * speed, // 0.4-1.2x speed
|
|
129
|
+
color1,
|
|
130
|
+
color2,
|
|
131
|
+
opacity: 0.6 + depth * 0.3, // 0.6-0.9
|
|
132
|
+
swayAmplitude: 30 + Math.random() * 50, // 30-80px stronger sway
|
|
133
|
+
swaySpeed: 0.3 + Math.random() * 0.7, // Slower sway for leaves
|
|
134
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
135
|
+
rotation: Math.random() * Math.PI * 2, // Random starting rotation
|
|
136
|
+
rotationSpeed: (Math.random() - 0.5) * 0.08, // -0.04 to 0.04 rad/frame
|
|
137
|
+
rotation3D: Math.random() * Math.PI * 2, // Random 3D flip angle
|
|
138
|
+
rotation3DSpeed: (Math.random() - 0.5) * 0.06, // 3D tumbling speed
|
|
139
|
+
depth,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return particles;
|
|
143
|
+
};
|
|
144
|
+
// Recursive function to generate chaotic, organic branches
|
|
145
|
+
const generateBranch = (startX, startY, baseSegmentLength, branchLevel, maxLevel, angle, parentThickness) => {
|
|
146
|
+
const segments = [];
|
|
147
|
+
const children = [];
|
|
148
|
+
// Longer branches that decrease more gradually with depth
|
|
149
|
+
const lengthMultiplier = Math.pow(0.7, branchLevel);
|
|
150
|
+
const branchLength = 3 + Math.floor(Math.random() * 4); // 3-6 segments
|
|
151
|
+
let currentX = startX;
|
|
152
|
+
let currentY = startY;
|
|
153
|
+
let currentAngle = angle;
|
|
154
|
+
for (let i = 0; i < branchLength; i++) {
|
|
155
|
+
// Larger segments for longer branches
|
|
156
|
+
const segmentLength = baseSegmentLength * lengthMultiplier * (0.6 + Math.random() * 0.6);
|
|
157
|
+
// Add angular variation for organic chaos
|
|
158
|
+
currentAngle += (Math.random() - 0.5) * 0.8;
|
|
159
|
+
// Move in the current angle direction
|
|
160
|
+
currentX += Math.cos(currentAngle) * segmentLength;
|
|
161
|
+
currentY += Math.sin(currentAngle) * segmentLength;
|
|
162
|
+
segments.push({ x: currentX, y: currentY });
|
|
163
|
+
// Moderate probability of branching
|
|
164
|
+
if (branchLevel < maxLevel && i > 0) {
|
|
165
|
+
// Only primary branches get multiple attempts
|
|
166
|
+
const branchAttempts = branchLevel === 1 ? 1 : 1;
|
|
167
|
+
for (let attempt = 0; attempt < branchAttempts; attempt++) {
|
|
168
|
+
// Lower probability: 35% at level 1, 25% at level 2, etc.
|
|
169
|
+
const branchProbability = 0.35 - branchLevel * 0.1;
|
|
170
|
+
if (Math.random() < branchProbability) {
|
|
171
|
+
// Random angle deviation from current direction (-90 to +90 degrees)
|
|
172
|
+
const angleDeviation = (Math.random() - 0.5) * Math.PI;
|
|
173
|
+
const childAngle = currentAngle + angleDeviation;
|
|
174
|
+
const childBranch = generateBranch(currentX, currentY, baseSegmentLength, branchLevel + 1, maxLevel, childAngle, parentThickness);
|
|
175
|
+
if (childBranch.segments.length > 0) {
|
|
176
|
+
children.push({
|
|
177
|
+
startIndex: i,
|
|
178
|
+
segments: childBranch.segments,
|
|
179
|
+
thickness: parentThickness * Math.pow(0.6, branchLevel + 1),
|
|
180
|
+
children: childBranch.children,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { segments, children };
|
|
188
|
+
};
|
|
189
|
+
// Generate lightning bolt with chaotic branches
|
|
190
|
+
const generateLightningBolt = (startX, startY, endY) => {
|
|
191
|
+
const segments = [];
|
|
192
|
+
const branches = [];
|
|
193
|
+
let currentX = startX;
|
|
194
|
+
let currentY = startY;
|
|
195
|
+
const baseSegmentLength = 12 + Math.random() * 15; // Smaller segments for detail
|
|
196
|
+
const mainThickness = 2.5 + Math.random() * 1.5;
|
|
197
|
+
segments.push({ x: currentX, y: currentY });
|
|
198
|
+
// Main bolt with more erratic path
|
|
199
|
+
let currentAngle = Math.PI / 2; // Start going down (90 degrees)
|
|
200
|
+
while (currentY < endY) {
|
|
201
|
+
// Vary segment length significantly
|
|
202
|
+
const segmentLength = baseSegmentLength * (0.5 + Math.random() * 0.8);
|
|
203
|
+
// Add significant angular variation for jagged appearance
|
|
204
|
+
currentAngle += (Math.random() - 0.5) * 0.6;
|
|
205
|
+
// Ensure we're generally moving downward
|
|
206
|
+
if (currentAngle < Math.PI / 4)
|
|
207
|
+
currentAngle = Math.PI / 4; // Min 45 degrees
|
|
208
|
+
if (currentAngle > (3 * Math.PI) / 4)
|
|
209
|
+
currentAngle = (3 * Math.PI) / 4; // Max 135 degrees
|
|
210
|
+
currentX += Math.cos(currentAngle) * segmentLength;
|
|
211
|
+
currentY += Math.sin(currentAngle) * segmentLength;
|
|
212
|
+
segments.push({ x: currentX, y: currentY });
|
|
213
|
+
// Moderate chance of branching (35%) for balanced appearance
|
|
214
|
+
if (Math.random() < 0.35 && segments.length > 2) {
|
|
215
|
+
// Random angle deviation (-120 to +120 degrees from current)
|
|
216
|
+
const angleDeviation = (Math.random() - 0.5) * (2 * Math.PI / 3);
|
|
217
|
+
const branchAngle = currentAngle + angleDeviation;
|
|
218
|
+
const primaryBranch = generateBranch(currentX, currentY, baseSegmentLength, 1, 3, // Max 3 levels to reduce chaos
|
|
219
|
+
branchAngle, mainThickness);
|
|
220
|
+
if (primaryBranch.segments.length > 0) {
|
|
221
|
+
branches.push({
|
|
222
|
+
startIndex: segments.length - 1,
|
|
223
|
+
segments: primaryBranch.segments,
|
|
224
|
+
thickness: mainThickness * 0.6,
|
|
225
|
+
children: primaryBranch.children,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
x: startX,
|
|
232
|
+
y: startY,
|
|
233
|
+
segments,
|
|
234
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
235
|
+
opacity: 0.8 + Math.random() * 0.2,
|
|
236
|
+
thickness: mainThickness,
|
|
237
|
+
lifetime: 0.4 + Math.random() * 0.2,
|
|
238
|
+
age: 0,
|
|
239
|
+
branches,
|
|
240
|
+
revealDuration: 0.08 + Math.random() * 0.04,
|
|
241
|
+
};
|
|
242
|
+
};
|
|
243
|
+
// Initialize lightning (empty array, lightning spawns dynamically)
|
|
244
|
+
const initializeLightning = () => {
|
|
245
|
+
return [];
|
|
246
|
+
};
|
|
247
|
+
// Initialize particles only for mount trigger (manual/click handled by their respective handlers)
|
|
248
|
+
// Only initialize if particles don't already exist to preserve active particles across re-renders
|
|
249
|
+
if (particlesRef.current.length === 0) {
|
|
250
|
+
const shouldInitialize = trigger === "mount";
|
|
251
|
+
particlesRef.current = shouldInitialize
|
|
252
|
+
? (type === "rain" ? initializeRain() :
|
|
253
|
+
type === "snow" ? initializeSnow() :
|
|
254
|
+
type === "leaves" ? initializeLeaves() :
|
|
255
|
+
type === "lightning" ? initializeLightning() :
|
|
256
|
+
[])
|
|
257
|
+
: [];
|
|
258
|
+
}
|
|
259
|
+
// Animation loop
|
|
260
|
+
const angleRad = (angle * Math.PI) / 180; // Convert angle to radians
|
|
261
|
+
const dx = Math.sin(angleRad); // Horizontal component
|
|
262
|
+
const dy = Math.cos(angleRad); // Vertical component
|
|
263
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
264
|
+
const animate = () => {
|
|
265
|
+
timeRef.current += 0.016; // Approximate frame time
|
|
266
|
+
ctx.clearRect(0, 0, canvasWidth, canvasHeight);
|
|
267
|
+
// Check if we should still be emitting new particles
|
|
268
|
+
const shouldEmit = trigger === "hover" ? isHoveredRef.current : isEmittingRef.current;
|
|
269
|
+
// Check duration limit
|
|
270
|
+
if (duration && isEmittingRef.current) {
|
|
271
|
+
const elapsed = (Date.now() - emitStartTimeRef.current) / 1000;
|
|
272
|
+
if (elapsed > duration) {
|
|
273
|
+
isEmittingRef.current = false;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (type === "rain") {
|
|
277
|
+
// Update and draw rain drops
|
|
278
|
+
particlesRef.current.forEach((drop) => {
|
|
279
|
+
// Update position with angle
|
|
280
|
+
drop.y += drop.speed * dy;
|
|
281
|
+
drop.x += drop.speed * dx;
|
|
282
|
+
// Reset if it goes below canvas or off the sides (with expanded bounds)
|
|
283
|
+
const leftBound = -horizontalOffset - 50;
|
|
284
|
+
const rightBound = canvasWidth + horizontalOffset + 50;
|
|
285
|
+
if (drop.y > canvasHeight || drop.x < leftBound || drop.x > rightBound) {
|
|
286
|
+
if (shouldEmit) {
|
|
287
|
+
// Respawn at top
|
|
288
|
+
drop.y = -drop.length;
|
|
289
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
290
|
+
drop.x = Math.random() * spawnWidth - horizontalOffset;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
// Mark for removal by moving far off screen
|
|
294
|
+
drop.y = canvasHeight + 1000;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// Draw rain drop as an angled line with gradient
|
|
298
|
+
const x1 = drop.x;
|
|
299
|
+
const y1 = drop.y;
|
|
300
|
+
const x2 = drop.x + dx * drop.length;
|
|
301
|
+
const y2 = drop.y + dy * drop.length;
|
|
302
|
+
// Create gradient from solid to transparent
|
|
303
|
+
const gradient = ctx.createLinearGradient(x1, y1, x2, y2);
|
|
304
|
+
gradient.addColorStop(0, 'transparent');
|
|
305
|
+
gradient.addColorStop(1, drop.color);
|
|
306
|
+
ctx.beginPath();
|
|
307
|
+
ctx.strokeStyle = gradient;
|
|
308
|
+
ctx.globalAlpha = drop.opacity;
|
|
309
|
+
ctx.lineWidth = drop.thickness;
|
|
310
|
+
ctx.lineCap = "round";
|
|
311
|
+
ctx.moveTo(x1, y1);
|
|
312
|
+
ctx.lineTo(x2, y2);
|
|
313
|
+
ctx.stroke();
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
else if (type === "snow") {
|
|
317
|
+
// Update and draw snowflakes
|
|
318
|
+
particlesRef.current.forEach((flake) => {
|
|
319
|
+
// Calculate sway motion (sine wave)
|
|
320
|
+
const swayX = Math.sin(timeRef.current * flake.swaySpeed + flake.swayOffset) * flake.swayAmplitude;
|
|
321
|
+
// Update position with angle and sway
|
|
322
|
+
flake.y += flake.speed * dy;
|
|
323
|
+
flake.x += flake.speed * dx;
|
|
324
|
+
// Reset if it goes below canvas or off the sides
|
|
325
|
+
const leftBound = -horizontalOffset - 100;
|
|
326
|
+
const rightBound = canvasWidth + horizontalOffset + 100;
|
|
327
|
+
if (flake.y > canvasHeight || flake.x < leftBound || flake.x > rightBound) {
|
|
328
|
+
if (shouldEmit) {
|
|
329
|
+
flake.y = -flake.size;
|
|
330
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
331
|
+
flake.x = Math.random() * spawnWidth - horizontalOffset;
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
flake.y = canvasHeight + 1000;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// Draw snowflake (no blur filter for performance)
|
|
338
|
+
ctx.globalAlpha = flake.opacity;
|
|
339
|
+
ctx.fillStyle = flake.color;
|
|
340
|
+
// Draw as circle with sway applied
|
|
341
|
+
ctx.beginPath();
|
|
342
|
+
ctx.arc(flake.x + swayX, flake.y, flake.size / 2, 0, Math.PI * 2);
|
|
343
|
+
ctx.fill();
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
else if (type === "leaves") {
|
|
347
|
+
// Update and draw leaves
|
|
348
|
+
particlesRef.current.forEach((leaf) => {
|
|
349
|
+
// Calculate sway motion
|
|
350
|
+
const swayX = Math.sin(timeRef.current * leaf.swaySpeed + leaf.swayOffset) * leaf.swayAmplitude;
|
|
351
|
+
// Update rotation (2D spin)
|
|
352
|
+
leaf.rotation += leaf.rotationSpeed;
|
|
353
|
+
// Update 3D rotation (flip/tumble)
|
|
354
|
+
leaf.rotation3D += leaf.rotation3DSpeed;
|
|
355
|
+
// Update position with angle and sway
|
|
356
|
+
leaf.y += leaf.speed * dy;
|
|
357
|
+
leaf.x += leaf.speed * dx;
|
|
358
|
+
// Reset if it goes below canvas or off the sides
|
|
359
|
+
const leftBound = -horizontalOffset - 100;
|
|
360
|
+
const rightBound = canvasWidth + horizontalOffset + 100;
|
|
361
|
+
if (leaf.y > canvasHeight || leaf.x < leftBound || leaf.x > rightBound) {
|
|
362
|
+
if (shouldEmit) {
|
|
363
|
+
leaf.y = -leaf.height;
|
|
364
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
365
|
+
leaf.x = Math.random() * spawnWidth - horizontalOffset;
|
|
366
|
+
leaf.rotation = Math.random() * Math.PI * 2;
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
leaf.y = canvasHeight + 1000;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Calculate 3D scale effect (flipping around vertical axis)
|
|
373
|
+
const scaleXRaw = Math.cos(leaf.rotation3D);
|
|
374
|
+
// Clamp scale to minimum 0.15 so leaves stay visible when edge-on
|
|
375
|
+
const scaleX = scaleXRaw > 0
|
|
376
|
+
? Math.max(0.15, scaleXRaw)
|
|
377
|
+
: Math.min(-0.15, scaleXRaw);
|
|
378
|
+
// Draw leaf with rotation and gradient
|
|
379
|
+
ctx.save();
|
|
380
|
+
ctx.translate(leaf.x + swayX, leaf.y);
|
|
381
|
+
ctx.rotate(leaf.rotation);
|
|
382
|
+
ctx.scale(scaleX, 1); // Apply 3D flip effect with minimum width
|
|
383
|
+
// Fade when edge-on but maintain minimum 50% opacity
|
|
384
|
+
const opacityMultiplier = Math.max(0.5, Math.abs(scaleXRaw * 0.3 + 0.7));
|
|
385
|
+
ctx.globalAlpha = leaf.opacity * opacityMultiplier;
|
|
386
|
+
// Create gradient from color1 to color2
|
|
387
|
+
const gradient = ctx.createLinearGradient(-leaf.width / 2, 0, leaf.width / 2, 0);
|
|
388
|
+
gradient.addColorStop(0, leaf.color1);
|
|
389
|
+
gradient.addColorStop(0.5, leaf.color2);
|
|
390
|
+
gradient.addColorStop(1, leaf.color1);
|
|
391
|
+
// Draw leaf shape (pointed oval using bezier curves)
|
|
392
|
+
ctx.fillStyle = gradient;
|
|
393
|
+
ctx.beginPath();
|
|
394
|
+
const w = leaf.width / 2;
|
|
395
|
+
const h = leaf.height / 2;
|
|
396
|
+
// Start at top tip
|
|
397
|
+
ctx.moveTo(0, -h);
|
|
398
|
+
// Curve to right side (widest point)
|
|
399
|
+
ctx.bezierCurveTo(w * 0.7, -h * 0.5, w * 0.7, h * 0.5, 0, h);
|
|
400
|
+
// Curve to left side and back to top
|
|
401
|
+
ctx.bezierCurveTo(-w * 0.7, h * 0.5, -w * 0.7, -h * 0.5, 0, -h);
|
|
402
|
+
ctx.fill();
|
|
403
|
+
ctx.restore();
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
else if (type === "lightning") {
|
|
407
|
+
// Lightning spawning logic
|
|
408
|
+
const currentTime = Date.now();
|
|
409
|
+
const timeSinceLastLightning = (currentTime - lastLightningTimeRef.current) / 1000;
|
|
410
|
+
// Reduced frequency: intensity 1 = ~15s, intensity 10 = ~3s, intensity 50 = ~0.6s, intensity 100 = ~0.3s
|
|
411
|
+
const spawnInterval = Math.max(0.3, 15 / intensity);
|
|
412
|
+
if (shouldEmit && timeSinceLastLightning > spawnInterval) {
|
|
413
|
+
// Calculate number of simultaneous bolts based on intensity
|
|
414
|
+
// After a multi-bolt strike, force a single bolt for variation
|
|
415
|
+
let boltCount = 1;
|
|
416
|
+
if (lastBoltCountRef.current > 1) {
|
|
417
|
+
// Previous strike was multi-bolt, do single bolt this time
|
|
418
|
+
boltCount = 1;
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
// Previous was single, can do multi-bolt based on intensity
|
|
422
|
+
if (intensity > 60) {
|
|
423
|
+
// 60% chance of multi-bolt at high intensity
|
|
424
|
+
boltCount = Math.random() < 0.6 ? (2 + Math.floor(Math.random() * 3)) : 1; // 2-4 bolts or 1
|
|
425
|
+
}
|
|
426
|
+
else if (intensity > 30) {
|
|
427
|
+
// 50% chance of multi-bolt at medium intensity
|
|
428
|
+
boltCount = Math.random() < 0.5 ? (2 + Math.floor(Math.random() * 2)) : 1; // 2-3 bolts or 1
|
|
429
|
+
}
|
|
430
|
+
else if (intensity > 15) {
|
|
431
|
+
// 30% chance of double bolt at low-medium intensity
|
|
432
|
+
boltCount = Math.random() < 0.3 ? 2 : 1;
|
|
433
|
+
}
|
|
434
|
+
// intensity <= 15: always single bolt
|
|
435
|
+
}
|
|
436
|
+
// Store bolt count for next iteration
|
|
437
|
+
lastBoltCountRef.current = boltCount;
|
|
438
|
+
// Spawn multiple bolts with slight time offset for realism
|
|
439
|
+
for (let i = 0; i < boltCount; i++) {
|
|
440
|
+
const startX = Math.random() * canvasWidth;
|
|
441
|
+
const bolt = generateLightningBolt(startX, 0, canvasHeight);
|
|
442
|
+
// Add slight age offset for staggered appearance
|
|
443
|
+
bolt.age = -i * 0.025; // 25ms offset between bolts
|
|
444
|
+
particlesRef.current.push(bolt);
|
|
445
|
+
}
|
|
446
|
+
lastLightningTimeRef.current = currentTime;
|
|
447
|
+
}
|
|
448
|
+
// Update and draw lightning bolts
|
|
449
|
+
particlesRef.current.forEach((bolt, index) => {
|
|
450
|
+
bolt.age += 0.016; // Increment age
|
|
451
|
+
// Skip if not yet started (negative age for staggered bolts)
|
|
452
|
+
if (bolt.age < 0)
|
|
453
|
+
return;
|
|
454
|
+
// Remove expired bolts
|
|
455
|
+
if (bolt.age > bolt.lifetime) {
|
|
456
|
+
particlesRef.current.splice(index, 1);
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
// Calculate reveal progress (how much of the bolt to draw)
|
|
460
|
+
const revealProgress = Math.min(1, bolt.age / bolt.revealDuration);
|
|
461
|
+
// Calculate opacity fade (flash effect)
|
|
462
|
+
const lifeProgress = bolt.age / bolt.lifetime;
|
|
463
|
+
let currentOpacity = bolt.opacity;
|
|
464
|
+
// During reveal: full brightness
|
|
465
|
+
// After reveal: hold briefly, then fade out
|
|
466
|
+
if (lifeProgress < bolt.revealDuration / bolt.lifetime) {
|
|
467
|
+
currentOpacity *= revealProgress; // Fade in during reveal
|
|
468
|
+
}
|
|
469
|
+
else if (lifeProgress < 0.3) {
|
|
470
|
+
currentOpacity *= 1; // Hold at full brightness
|
|
471
|
+
}
|
|
472
|
+
else {
|
|
473
|
+
// Fade out in the remaining time
|
|
474
|
+
const fadeProgress = (lifeProgress - 0.3) / 0.7;
|
|
475
|
+
currentOpacity *= (1 - fadeProgress);
|
|
476
|
+
}
|
|
477
|
+
// Calculate how many segments to draw based on reveal progress
|
|
478
|
+
const totalSegments = bolt.segments.length;
|
|
479
|
+
const segmentsToDraw = Math.ceil(totalSegments * revealProgress);
|
|
480
|
+
// Draw main bolt with reveal effect
|
|
481
|
+
ctx.globalAlpha = currentOpacity;
|
|
482
|
+
ctx.strokeStyle = bolt.color;
|
|
483
|
+
ctx.lineWidth = bolt.thickness;
|
|
484
|
+
ctx.lineCap = "round";
|
|
485
|
+
ctx.lineJoin = "round";
|
|
486
|
+
// Draw glow effect
|
|
487
|
+
ctx.shadowBlur = 15;
|
|
488
|
+
ctx.shadowColor = bolt.color;
|
|
489
|
+
ctx.beginPath();
|
|
490
|
+
for (let i = 0; i < segmentsToDraw; i++) {
|
|
491
|
+
const segment = bolt.segments[i];
|
|
492
|
+
if (i === 0) {
|
|
493
|
+
ctx.moveTo(segment.x, segment.y);
|
|
494
|
+
}
|
|
495
|
+
else {
|
|
496
|
+
ctx.lineTo(segment.x, segment.y);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
ctx.stroke();
|
|
500
|
+
// Recursive function to draw hierarchical branches
|
|
501
|
+
const drawBranch = (branch, parentSegments, parentSegmentsToDraw) => {
|
|
502
|
+
// Only draw if parent bolt has reached this branch point
|
|
503
|
+
if (branch.startIndex < parentSegmentsToDraw) {
|
|
504
|
+
const startSegment = parentSegments[branch.startIndex];
|
|
505
|
+
// Calculate how much of this branch to reveal
|
|
506
|
+
const segmentsPastBranch = parentSegmentsToDraw - branch.startIndex;
|
|
507
|
+
const branchRevealProgress = Math.min(1, segmentsPastBranch / 3);
|
|
508
|
+
const branchSegmentsToDraw = Math.ceil(branch.segments.length * branchRevealProgress);
|
|
509
|
+
// Draw this branch
|
|
510
|
+
ctx.beginPath();
|
|
511
|
+
ctx.moveTo(startSegment.x, startSegment.y);
|
|
512
|
+
for (let i = 0; i < branchSegmentsToDraw; i++) {
|
|
513
|
+
const segment = branch.segments[i];
|
|
514
|
+
ctx.lineTo(segment.x, segment.y);
|
|
515
|
+
}
|
|
516
|
+
ctx.lineWidth = branch.thickness;
|
|
517
|
+
ctx.stroke();
|
|
518
|
+
// Recursively draw child branches
|
|
519
|
+
if (branch.children && branch.children.length > 0) {
|
|
520
|
+
branch.children.forEach((childBranch) => {
|
|
521
|
+
drawBranch(childBranch, branch.segments, branchSegmentsToDraw);
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
// Draw all primary branches and their hierarchies
|
|
527
|
+
bolt.branches.forEach((branch) => {
|
|
528
|
+
drawBranch(branch, bolt.segments, segmentsToDraw);
|
|
529
|
+
});
|
|
530
|
+
// Reset shadow
|
|
531
|
+
ctx.shadowBlur = 0;
|
|
532
|
+
});
|
|
533
|
+
}
|
|
534
|
+
ctx.globalAlpha = 1;
|
|
535
|
+
animationRef.current = requestAnimationFrame(animate);
|
|
536
|
+
};
|
|
537
|
+
if (!shouldAnimate) {
|
|
538
|
+
// When reduced motion is active, don't start the animation loop at all
|
|
539
|
+
return () => {
|
|
540
|
+
window.removeEventListener("resize", updateSize);
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
animate();
|
|
544
|
+
return () => {
|
|
545
|
+
window.removeEventListener("resize", updateSize);
|
|
546
|
+
if (animationRef.current) {
|
|
547
|
+
cancelAnimationFrame(animationRef.current);
|
|
548
|
+
}
|
|
549
|
+
};
|
|
550
|
+
}, [type, colors, speed, intensity, angle, duration, trigger, shouldAnimate]);
|
|
551
|
+
// Respond to external control in manual mode
|
|
552
|
+
useEffect(() => {
|
|
553
|
+
if (trigger !== "manual")
|
|
554
|
+
return;
|
|
555
|
+
if (active && !isEmittingRef.current) {
|
|
556
|
+
// Initialize particles if starting emission
|
|
557
|
+
if (particlesRef.current.length === 0) {
|
|
558
|
+
const canvas = canvasRef.current;
|
|
559
|
+
const container = containerRef.current;
|
|
560
|
+
if (canvas && container) {
|
|
561
|
+
const canvasWidth = canvas.width / 2;
|
|
562
|
+
const canvasHeight = canvas.height / 2;
|
|
563
|
+
const parsedColors = colors.map((color) => {
|
|
564
|
+
const computedColor = getComputedStyle(container).getPropertyValue(`--${color}`);
|
|
565
|
+
return computedColor || color;
|
|
566
|
+
});
|
|
567
|
+
if (type === "rain") {
|
|
568
|
+
const particles = [];
|
|
569
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
570
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
571
|
+
for (let i = 0; i < intensity; i++) {
|
|
572
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
573
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
574
|
+
particles.push({
|
|
575
|
+
x: spawnX,
|
|
576
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
577
|
+
length: 10 + Math.random() * 20,
|
|
578
|
+
speed: (2 + Math.random() * 3) * speed,
|
|
579
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
580
|
+
opacity: 0.3 + Math.random() * 0.5,
|
|
581
|
+
thickness: 1 + Math.random() * 1.5,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
particlesRef.current = particles;
|
|
585
|
+
}
|
|
586
|
+
else if (type === "snow") {
|
|
587
|
+
const particles = [];
|
|
588
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
589
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
590
|
+
for (let i = 0; i < intensity; i++) {
|
|
591
|
+
const depth = Math.random();
|
|
592
|
+
const size = 2 + depth * 4;
|
|
593
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
594
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
595
|
+
particles.push({
|
|
596
|
+
x: spawnX,
|
|
597
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
598
|
+
size,
|
|
599
|
+
speed: (0.3 + depth * 0.7) * speed,
|
|
600
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
601
|
+
opacity: 0.4 + depth * 0.5,
|
|
602
|
+
swayAmplitude: 20 + Math.random() * 30,
|
|
603
|
+
swaySpeed: 0.5 + Math.random() * 1,
|
|
604
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
605
|
+
depth,
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
particlesRef.current = particles;
|
|
609
|
+
}
|
|
610
|
+
else if (type === "leaves") {
|
|
611
|
+
const particles = [];
|
|
612
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
613
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
614
|
+
for (let i = 0; i < intensity; i++) {
|
|
615
|
+
const depth = Math.random();
|
|
616
|
+
const width = 8 + depth * 12;
|
|
617
|
+
const height = width * (0.6 + Math.random() * 0.4);
|
|
618
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
619
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
620
|
+
const colorIndex = Math.floor(Math.random() * parsedColors.length);
|
|
621
|
+
const color1 = parsedColors[colorIndex];
|
|
622
|
+
const color2 = parsedColors[Math.min(colorIndex + 1, parsedColors.length - 1)];
|
|
623
|
+
particles.push({
|
|
624
|
+
x: spawnX,
|
|
625
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
626
|
+
width,
|
|
627
|
+
height,
|
|
628
|
+
speed: (0.4 + depth * 0.8) * speed,
|
|
629
|
+
color1,
|
|
630
|
+
color2,
|
|
631
|
+
opacity: 0.6 + depth * 0.3,
|
|
632
|
+
swayAmplitude: 30 + Math.random() * 50,
|
|
633
|
+
swaySpeed: 0.3 + Math.random() * 0.7,
|
|
634
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
635
|
+
rotation: Math.random() * Math.PI * 2,
|
|
636
|
+
rotationSpeed: (Math.random() - 0.5) * 0.08,
|
|
637
|
+
rotation3D: Math.random() * Math.PI * 2,
|
|
638
|
+
rotation3DSpeed: (Math.random() - 0.5) * 0.06,
|
|
639
|
+
depth,
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
particlesRef.current = particles;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
isEmittingRef.current = true;
|
|
647
|
+
emitStartTimeRef.current = Date.now();
|
|
648
|
+
}
|
|
649
|
+
else if (!active && isEmittingRef.current) {
|
|
650
|
+
isEmittingRef.current = false;
|
|
651
|
+
}
|
|
652
|
+
}, [active, trigger]);
|
|
653
|
+
const handleMouseEnter = () => {
|
|
654
|
+
if (trigger === "hover" && !isHoveredRef.current) {
|
|
655
|
+
isHoveredRef.current = true;
|
|
656
|
+
isEmittingRef.current = true;
|
|
657
|
+
emitStartTimeRef.current = Date.now();
|
|
658
|
+
// Initialize particles if none exist yet
|
|
659
|
+
if (particlesRef.current.length === 0) {
|
|
660
|
+
const canvas = canvasRef.current;
|
|
661
|
+
const container = containerRef.current;
|
|
662
|
+
if (canvas && container) {
|
|
663
|
+
const cw = canvas.width / 2;
|
|
664
|
+
const ch = canvas.height / 2;
|
|
665
|
+
const parsedColors = colors.map((color) => {
|
|
666
|
+
const computedColor = getComputedStyle(container).getPropertyValue(`--${color}`);
|
|
667
|
+
return computedColor || color;
|
|
668
|
+
});
|
|
669
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
670
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * ch);
|
|
671
|
+
if (type === "rain") {
|
|
672
|
+
const particles = [];
|
|
673
|
+
for (let i = 0; i < intensity; i++) {
|
|
674
|
+
const spawnWidth = cw + horizontalOffset * 2;
|
|
675
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
676
|
+
particles.push({
|
|
677
|
+
x: spawnX,
|
|
678
|
+
y: Math.random() * ch - ch,
|
|
679
|
+
length: 10 + Math.random() * 20,
|
|
680
|
+
speed: (2 + Math.random() * 3) * speed,
|
|
681
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
682
|
+
opacity: 0.3 + Math.random() * 0.5,
|
|
683
|
+
thickness: 1 + Math.random() * 1.5,
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
particlesRef.current = particles;
|
|
687
|
+
}
|
|
688
|
+
else if (type === "snow") {
|
|
689
|
+
const particles = [];
|
|
690
|
+
for (let i = 0; i < intensity; i++) {
|
|
691
|
+
const depth = Math.random();
|
|
692
|
+
const size = 2 + depth * 4;
|
|
693
|
+
const spawnWidth = cw + horizontalOffset * 2;
|
|
694
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
695
|
+
particles.push({
|
|
696
|
+
x: spawnX,
|
|
697
|
+
y: Math.random() * ch - ch,
|
|
698
|
+
size,
|
|
699
|
+
speed: (0.3 + depth * 0.7) * speed,
|
|
700
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
701
|
+
opacity: 0.4 + depth * 0.5,
|
|
702
|
+
swayAmplitude: 20 + Math.random() * 30,
|
|
703
|
+
swaySpeed: 0.5 + Math.random() * 1,
|
|
704
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
705
|
+
depth,
|
|
706
|
+
});
|
|
707
|
+
}
|
|
708
|
+
particlesRef.current = particles;
|
|
709
|
+
}
|
|
710
|
+
else if (type === "leaves") {
|
|
711
|
+
const particles = [];
|
|
712
|
+
for (let i = 0; i < intensity; i++) {
|
|
713
|
+
const depth = Math.random();
|
|
714
|
+
const width = 8 + depth * 12;
|
|
715
|
+
const height = width * (0.6 + Math.random() * 0.4);
|
|
716
|
+
const spawnWidth = cw + horizontalOffset * 2;
|
|
717
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
718
|
+
const colorIndex = Math.floor(Math.random() * parsedColors.length);
|
|
719
|
+
const color1 = parsedColors[colorIndex];
|
|
720
|
+
const color2 = parsedColors[Math.min(colorIndex + 1, parsedColors.length - 1)];
|
|
721
|
+
particles.push({
|
|
722
|
+
x: spawnX,
|
|
723
|
+
y: Math.random() * ch - ch,
|
|
724
|
+
width,
|
|
725
|
+
height,
|
|
726
|
+
speed: (0.4 + depth * 0.8) * speed,
|
|
727
|
+
color1,
|
|
728
|
+
color2,
|
|
729
|
+
opacity: 0.6 + depth * 0.3,
|
|
730
|
+
swayAmplitude: 30 + Math.random() * 50,
|
|
731
|
+
swaySpeed: 0.3 + Math.random() * 0.7,
|
|
732
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
733
|
+
rotation: Math.random() * Math.PI * 2,
|
|
734
|
+
rotationSpeed: (Math.random() - 0.5) * 0.08,
|
|
735
|
+
rotation3D: Math.random() * Math.PI * 2,
|
|
736
|
+
rotation3DSpeed: (Math.random() - 0.5) * 0.06,
|
|
737
|
+
depth,
|
|
738
|
+
});
|
|
739
|
+
}
|
|
740
|
+
particlesRef.current = particles;
|
|
741
|
+
}
|
|
742
|
+
// Lightning doesn't need pre-initialization (spawns dynamically)
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
};
|
|
747
|
+
const handleMouseLeave = () => {
|
|
748
|
+
if (trigger === "hover" && isHoveredRef.current) {
|
|
749
|
+
isHoveredRef.current = false;
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
const handleClick = () => {
|
|
753
|
+
if (trigger !== "click")
|
|
754
|
+
return;
|
|
755
|
+
if (!isEmittingRef.current) {
|
|
756
|
+
// Initialize particles if starting emission
|
|
757
|
+
if (particlesRef.current.length === 0) {
|
|
758
|
+
const canvas = canvasRef.current;
|
|
759
|
+
const container = containerRef.current;
|
|
760
|
+
if (canvas && container) {
|
|
761
|
+
const canvasWidth = canvas.width / 2;
|
|
762
|
+
const canvasHeight = canvas.height / 2;
|
|
763
|
+
const parsedColors = colors.map((color) => {
|
|
764
|
+
const computedColor = getComputedStyle(container).getPropertyValue(`--${color}`);
|
|
765
|
+
return computedColor || color;
|
|
766
|
+
});
|
|
767
|
+
if (type === "rain") {
|
|
768
|
+
const particles = [];
|
|
769
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
770
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
771
|
+
for (let i = 0; i < intensity; i++) {
|
|
772
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
773
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
774
|
+
particles.push({
|
|
775
|
+
x: spawnX,
|
|
776
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
777
|
+
length: 10 + Math.random() * 20,
|
|
778
|
+
speed: (2 + Math.random() * 3) * speed,
|
|
779
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
780
|
+
opacity: 0.3 + Math.random() * 0.5,
|
|
781
|
+
thickness: 1 + Math.random() * 1.5,
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
particlesRef.current = particles;
|
|
785
|
+
}
|
|
786
|
+
else if (type === "snow") {
|
|
787
|
+
const particles = [];
|
|
788
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
789
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
790
|
+
for (let i = 0; i < intensity; i++) {
|
|
791
|
+
const depth = Math.random();
|
|
792
|
+
const size = 2 + depth * 4;
|
|
793
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
794
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
795
|
+
particles.push({
|
|
796
|
+
x: spawnX,
|
|
797
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
798
|
+
size,
|
|
799
|
+
speed: (0.3 + depth * 0.7) * speed,
|
|
800
|
+
color: parsedColors[Math.floor(Math.random() * parsedColors.length)],
|
|
801
|
+
opacity: 0.4 + depth * 0.5,
|
|
802
|
+
swayAmplitude: 20 + Math.random() * 30,
|
|
803
|
+
swaySpeed: 0.5 + Math.random() * 1,
|
|
804
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
805
|
+
depth,
|
|
806
|
+
});
|
|
807
|
+
}
|
|
808
|
+
particlesRef.current = particles;
|
|
809
|
+
}
|
|
810
|
+
else if (type === "leaves") {
|
|
811
|
+
const particles = [];
|
|
812
|
+
const angleRad = (angle * Math.PI) / 180;
|
|
813
|
+
const horizontalOffset = Math.abs(Math.tan(angleRad) * canvasHeight);
|
|
814
|
+
for (let i = 0; i < intensity; i++) {
|
|
815
|
+
const depth = Math.random();
|
|
816
|
+
const width = 8 + depth * 12;
|
|
817
|
+
const height = width * (0.6 + Math.random() * 0.4);
|
|
818
|
+
const spawnWidth = canvasWidth + horizontalOffset * 2;
|
|
819
|
+
const spawnX = Math.random() * spawnWidth - horizontalOffset;
|
|
820
|
+
const colorIndex = Math.floor(Math.random() * parsedColors.length);
|
|
821
|
+
const color1 = parsedColors[colorIndex];
|
|
822
|
+
const color2 = parsedColors[Math.min(colorIndex + 1, parsedColors.length - 1)];
|
|
823
|
+
particles.push({
|
|
824
|
+
x: spawnX,
|
|
825
|
+
y: Math.random() * canvasHeight - canvasHeight,
|
|
826
|
+
width,
|
|
827
|
+
height,
|
|
828
|
+
speed: (0.4 + depth * 0.8) * speed,
|
|
829
|
+
color1,
|
|
830
|
+
color2,
|
|
831
|
+
opacity: 0.6 + depth * 0.3,
|
|
832
|
+
swayAmplitude: 30 + Math.random() * 50,
|
|
833
|
+
swaySpeed: 0.3 + Math.random() * 0.7,
|
|
834
|
+
swayOffset: Math.random() * Math.PI * 2,
|
|
835
|
+
rotation: Math.random() * Math.PI * 2,
|
|
836
|
+
rotationSpeed: (Math.random() - 0.5) * 0.08,
|
|
837
|
+
rotation3D: Math.random() * Math.PI * 2,
|
|
838
|
+
rotation3DSpeed: (Math.random() - 0.5) * 0.06,
|
|
839
|
+
depth,
|
|
840
|
+
});
|
|
841
|
+
}
|
|
842
|
+
particlesRef.current = particles;
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
isEmittingRef.current = true;
|
|
847
|
+
emitStartTimeRef.current = Date.now();
|
|
848
|
+
}
|
|
849
|
+
else {
|
|
850
|
+
isEmittingRef.current = false;
|
|
851
|
+
}
|
|
852
|
+
};
|
|
853
|
+
return (_jsxs(Flex, { ref: containerRef, fill: true, overflow: "hidden", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, onClick: handleClick, ...rest, children: [_jsx("canvas", { ref: canvasRef, style: {
|
|
854
|
+
position: "absolute",
|
|
855
|
+
top: 0,
|
|
856
|
+
left: 0,
|
|
857
|
+
width: "100%",
|
|
858
|
+
height: "100%",
|
|
859
|
+
pointerEvents: "none",
|
|
860
|
+
} }), children] }));
|
|
861
|
+
});
|
|
862
|
+
WeatherFx.displayName = "WeatherFx";
|
|
863
|
+
export { WeatherFx };
|
|
864
|
+
//# sourceMappingURL=WeatherFx.js.map
|