@anker-in/headless-ui 1.1.17-alpha.1766026822963 → 1.1.17-alpha.1766030104268
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/biz-components/AccordionCards/index.d.ts +17 -0
- package/dist/cjs/biz-components/AccordionCards/index.js +1 -1
- package/dist/cjs/biz-components/AccordionCards/index.js.map +3 -3
- package/dist/cjs/biz-components/AnchorNavigation/index.d.ts +22 -0
- package/dist/cjs/biz-components/AnchorNavigation/index.js +2 -0
- package/dist/cjs/biz-components/AnchorNavigation/index.js.map +7 -0
- package/dist/cjs/biz-components/AnchorNavigation/useAnchorPosition.d.ts +2 -0
- package/dist/cjs/biz-components/AnchorNavigation/useAnchorPosition.js +2 -0
- package/dist/cjs/biz-components/AnchorNavigation/useAnchorPosition.js.map +7 -0
- package/dist/cjs/biz-components/BrandEquity/BrandEquity.js +1 -1
- package/dist/cjs/biz-components/BrandEquity/BrandEquity.js.map +2 -2
- package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.d.ts +83 -0
- package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.js +2 -0
- package/dist/cjs/biz-components/BuyOneGetOneShelf/ProductCard.js.map +7 -0
- package/dist/cjs/biz-components/BuyOneGetOneShelf/index.d.ts +40 -0
- package/dist/cjs/biz-components/BuyOneGetOneShelf/index.js +2 -0
- package/dist/cjs/biz-components/BuyOneGetOneShelf/index.js.map +7 -0
- package/dist/cjs/biz-components/Category/index.js +1 -1
- package/dist/cjs/biz-components/Category/index.js.map +3 -3
- package/dist/cjs/biz-components/CollectionShelves/index.js +1 -1
- package/dist/cjs/biz-components/CollectionShelves/index.js.map +2 -2
- package/dist/cjs/biz-components/CollectionsFilters/FilterCardWrap.js +1 -1
- package/dist/cjs/biz-components/CollectionsFilters/FilterCardWrap.js.map +2 -2
- package/dist/cjs/biz-components/CollectionsFilters/FilterCardWrapItem.js +1 -1
- package/dist/cjs/biz-components/CollectionsFilters/FilterCardWrapItem.js.map +2 -2
- package/dist/cjs/biz-components/Evaluate/index.js +1 -1
- package/dist/cjs/biz-components/Evaluate/index.js.map +2 -2
- package/dist/cjs/biz-components/EventSchedule/index.d.ts +39 -0
- package/dist/cjs/biz-components/EventSchedule/index.js +2 -0
- package/dist/cjs/biz-components/EventSchedule/index.js.map +7 -0
- package/dist/cjs/biz-components/FooterNavigation/icons/Subtract.js +1 -1
- package/dist/cjs/biz-components/FooterNavigation/icons/Subtract.js.map +2 -2
- package/dist/cjs/biz-components/FooterNavigation/index.js +1 -1
- package/dist/cjs/biz-components/FooterNavigation/index.js.map +2 -2
- package/dist/cjs/biz-components/GraphicAttractionBlock/index.js +1 -1
- package/dist/cjs/biz-components/GraphicAttractionBlock/index.js.map +2 -2
- package/dist/cjs/biz-components/HeaderNavigation/icons/Close.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/icons/Close.js.map +2 -2
- package/dist/cjs/biz-components/HeaderNavigation/icons/DownArrow.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/icons/DownArrow.js.map +2 -2
- package/dist/cjs/biz-components/HeaderNavigation/icons/LeftArrow.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/icons/LeftArrow.js.map +2 -2
- package/dist/cjs/biz-components/HeaderNavigation/icons/RightArrow.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/icons/RightArrow.js.map +2 -2
- package/dist/cjs/biz-components/HeaderNavigation/index.d.ts +5 -2
- package/dist/cjs/biz-components/HeaderNavigation/index.js +1 -1
- package/dist/cjs/biz-components/HeaderNavigation/index.js.map +3 -3
- package/dist/cjs/biz-components/HeroBanner/Countdown.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/Countdown.js.map +2 -2
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.d.ts +4 -1
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/cjs/biz-components/HeroBanner/HeroBanner.js.map +3 -3
- package/dist/cjs/biz-components/Listing/components/PaidShipping/ShippingPolicyModal.js +1 -1
- package/dist/cjs/biz-components/Listing/components/PaidShipping/ShippingPolicyModal.js.map +2 -2
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/BenefitsTab.js +4 -4
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/BenefitsTab.js.map +2 -2
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js.map +2 -2
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/ProductCard/ProductGallery/index.js.map +2 -2
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/index.js +1 -1
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/index.js.map +3 -3
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/useScrollSpy.js +1 -1
- package/dist/cjs/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/useScrollSpy.js.map +2 -2
- package/dist/cjs/biz-components/Media/index.d.ts +32 -0
- package/dist/cjs/biz-components/Media/index.js +2 -0
- package/dist/cjs/biz-components/Media/index.js.map +7 -0
- package/dist/cjs/biz-components/MediaPlayerBase/index.backup.js +1 -1
- package/dist/cjs/biz-components/MediaPlayerBase/index.backup.js.map +2 -2
- package/dist/cjs/biz-components/MediaPlayerBase/index.js +1 -1
- package/dist/cjs/biz-components/MediaPlayerBase/index.js.map +2 -2
- package/dist/cjs/biz-components/MediaPlayerMulti/index.js +1 -1
- package/dist/cjs/biz-components/MediaPlayerMulti/index.js.map +2 -2
- package/dist/cjs/biz-components/MediaPlayerSticky/index.js +1 -1
- package/dist/cjs/biz-components/MediaPlayerSticky/index.js.map +3 -3
- package/dist/cjs/biz-components/MemberEquity/index.js +2 -2
- package/dist/cjs/biz-components/MemberEquity/index.js.map +2 -2
- package/dist/cjs/biz-components/NavigationSearch/index.js +2 -2
- package/dist/cjs/biz-components/NavigationSearch/index.js.map +2 -2
- package/dist/cjs/biz-components/ProductCompare/index.js.map +2 -2
- package/dist/cjs/biz-components/PromotionalBar/index.d.ts +35 -0
- package/dist/cjs/biz-components/PromotionalBar/index.js +2 -0
- package/dist/cjs/biz-components/PromotionalBar/index.js.map +7 -0
- package/dist/cjs/biz-components/SearchPage/index.js +1 -1
- package/dist/cjs/biz-components/SearchPage/index.js.map +3 -3
- package/dist/cjs/biz-components/SecondaryBanner/index.d.ts +61 -0
- package/dist/cjs/biz-components/SecondaryBanner/index.js +2 -0
- package/dist/cjs/biz-components/SecondaryBanner/index.js.map +7 -0
- package/dist/cjs/biz-components/ShelfDisplay/index.js +1 -1
- package/dist/cjs/biz-components/ShelfDisplay/index.js.map +2 -2
- package/dist/cjs/biz-components/Slogan/index.js +1 -1
- package/dist/cjs/biz-components/Slogan/index.js.map +1 -1
- package/dist/cjs/biz-components/Specs/index.js +1 -1
- package/dist/cjs/biz-components/Specs/index.js.map +2 -2
- package/dist/cjs/biz-components/StockShelf/index.d.ts +21 -0
- package/dist/cjs/biz-components/StockShelf/index.js +2 -0
- package/dist/cjs/biz-components/StockShelf/index.js.map +7 -0
- package/dist/cjs/biz-components/Subscribe/index.js.map +2 -2
- package/dist/cjs/biz-components/Tabs/Tabs.js +1 -1
- package/dist/cjs/biz-components/Tabs/Tabs.js.map +2 -2
- package/dist/cjs/biz-components/TabsGroup/index.js +1 -1
- package/dist/cjs/biz-components/TabsGroup/index.js.map +2 -2
- package/dist/cjs/biz-components/TextModal/index.js +1 -1
- package/dist/cjs/biz-components/TextModal/index.js.map +2 -2
- package/dist/cjs/biz-components/VideoModal/index.js +1 -1
- package/dist/cjs/biz-components/VideoModal/index.js.map +2 -2
- package/dist/cjs/biz-components/index.d.ts +5 -0
- package/dist/cjs/biz-components/index.js +1 -1
- package/dist/cjs/biz-components/index.js.map +3 -3
- package/dist/cjs/components/container.js +1 -1
- package/dist/cjs/components/container.js.map +2 -2
- package/dist/cjs/components/drop-down.js +1 -1
- package/dist/cjs/components/drop-down.js.map +2 -2
- package/dist/cjs/components/picture.d.ts +2 -0
- package/dist/cjs/components/picture.js +1 -1
- package/dist/cjs/components/picture.js.map +3 -3
- package/dist/cjs/helpers/ScrollLoadVideo.d.ts +5 -1
- package/dist/cjs/helpers/ScrollLoadVideo.js +1 -1
- package/dist/cjs/helpers/ScrollLoadVideo.js.map +3 -3
- package/dist/cjs/stories/HeroBanner.stories.js +2 -2
- package/dist/cjs/stories/HeroBanner.stories.js.map +3 -3
- package/dist/cjs/stories/accordionCards.stories.js +1 -1
- package/dist/cjs/stories/accordionCards.stories.js.map +3 -3
- package/dist/cjs/stories/anchorNavigation.stories.js +2 -0
- package/dist/cjs/stories/anchorNavigation.stories.js.map +7 -0
- package/dist/cjs/stories/buyOneGetOneShelf.stories.js +2 -0
- package/dist/cjs/stories/buyOneGetOneShelf.stories.js.map +7 -0
- package/dist/cjs/stories/eventSchedule.stories.js +2 -0
- package/dist/cjs/stories/eventSchedule.stories.js.map +7 -0
- package/dist/cjs/stories/picture.stories.js +2 -2
- package/dist/cjs/stories/picture.stories.js.map +3 -3
- package/dist/cjs/stories/promotionalBar.stories.js +2 -0
- package/dist/cjs/stories/promotionalBar.stories.js.map +7 -0
- package/dist/cjs/stories/secondaryBanner.stories.js +2 -0
- package/dist/cjs/stories/secondaryBanner.stories.js.map +7 -0
- package/dist/cjs/stories/stockShelf.stories.js +2 -0
- package/dist/cjs/stories/stockShelf.stories.js.map +7 -0
- package/dist/esm/biz-components/AccordionCards/index.d.ts +17 -0
- package/dist/esm/biz-components/AccordionCards/index.js +1 -1
- package/dist/esm/biz-components/AccordionCards/index.js.map +3 -3
- package/dist/esm/biz-components/AnchorNavigation/index.d.ts +22 -0
- package/dist/esm/biz-components/AnchorNavigation/index.js +2 -0
- package/dist/esm/biz-components/AnchorNavigation/index.js.map +7 -0
- package/dist/esm/biz-components/AnchorNavigation/useAnchorPosition.d.ts +2 -0
- package/dist/esm/biz-components/AnchorNavigation/useAnchorPosition.js +2 -0
- package/dist/esm/biz-components/AnchorNavigation/useAnchorPosition.js.map +7 -0
- package/dist/esm/biz-components/BrandEquity/BrandEquity.js +1 -1
- package/dist/esm/biz-components/BrandEquity/BrandEquity.js.map +2 -2
- package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.d.ts +83 -0
- package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.js +2 -0
- package/dist/esm/biz-components/BuyOneGetOneShelf/ProductCard.js.map +7 -0
- package/dist/esm/biz-components/BuyOneGetOneShelf/index.d.ts +40 -0
- package/dist/esm/biz-components/BuyOneGetOneShelf/index.js +2 -0
- package/dist/esm/biz-components/BuyOneGetOneShelf/index.js.map +7 -0
- package/dist/esm/biz-components/Category/index.js +1 -1
- package/dist/esm/biz-components/Category/index.js.map +3 -3
- package/dist/esm/biz-components/CollectionShelves/index.js +1 -1
- package/dist/esm/biz-components/CollectionShelves/index.js.map +2 -2
- package/dist/esm/biz-components/CollectionsFilters/FilterCardWrap.js +1 -1
- package/dist/esm/biz-components/CollectionsFilters/FilterCardWrap.js.map +2 -2
- package/dist/esm/biz-components/CollectionsFilters/FilterCardWrapItem.js +1 -1
- package/dist/esm/biz-components/CollectionsFilters/FilterCardWrapItem.js.map +2 -2
- package/dist/esm/biz-components/Evaluate/index.js +1 -1
- package/dist/esm/biz-components/Evaluate/index.js.map +2 -2
- package/dist/esm/biz-components/EventSchedule/index.d.ts +39 -0
- package/dist/esm/biz-components/EventSchedule/index.js +2 -0
- package/dist/esm/biz-components/EventSchedule/index.js.map +7 -0
- package/dist/esm/biz-components/FooterNavigation/icons/Subtract.js +1 -1
- package/dist/esm/biz-components/FooterNavigation/icons/Subtract.js.map +2 -2
- package/dist/esm/biz-components/FooterNavigation/index.js +1 -1
- package/dist/esm/biz-components/FooterNavigation/index.js.map +2 -2
- package/dist/esm/biz-components/GraphicAttractionBlock/index.js +1 -1
- package/dist/esm/biz-components/GraphicAttractionBlock/index.js.map +2 -2
- package/dist/esm/biz-components/HeaderNavigation/icons/Close.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/icons/Close.js.map +2 -2
- package/dist/esm/biz-components/HeaderNavigation/icons/DownArrow.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/icons/DownArrow.js.map +2 -2
- package/dist/esm/biz-components/HeaderNavigation/icons/LeftArrow.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/icons/LeftArrow.js.map +2 -2
- package/dist/esm/biz-components/HeaderNavigation/icons/RightArrow.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/icons/RightArrow.js.map +2 -2
- package/dist/esm/biz-components/HeaderNavigation/index.d.ts +5 -2
- package/dist/esm/biz-components/HeaderNavigation/index.js +1 -1
- package/dist/esm/biz-components/HeaderNavigation/index.js.map +3 -3
- package/dist/esm/biz-components/HeroBanner/Countdown.js +1 -1
- package/dist/esm/biz-components/HeroBanner/Countdown.js.map +2 -2
- package/dist/esm/biz-components/HeroBanner/HeroBanner.d.ts +4 -1
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js +1 -1
- package/dist/esm/biz-components/HeroBanner/HeroBanner.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/PaidShipping/ShippingPolicyModal.js +1 -1
- package/dist/esm/biz-components/Listing/components/PaidShipping/ShippingPolicyModal.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/BenefitsTab.js +4 -4
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/BenefitsTab.js.map +2 -2
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductDetail/ProductBenefitsTabs/index.js.map +2 -2
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/ProductCard/ProductGallery/index.js.map +2 -2
- package/dist/esm/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/index.js +1 -1
- package/dist/esm/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/index.js.map +3 -3
- package/dist/esm/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/useScrollSpy.js +1 -1
- package/dist/esm/biz-components/Listing/components/PurchaseBar/ScrollSpyNav/useScrollSpy.js.map +2 -2
- package/dist/esm/biz-components/Media/index.d.ts +32 -0
- package/dist/esm/biz-components/Media/index.js +2 -0
- package/dist/esm/biz-components/Media/index.js.map +7 -0
- package/dist/esm/biz-components/MediaPlayerBase/index.backup.js +1 -1
- package/dist/esm/biz-components/MediaPlayerBase/index.backup.js.map +2 -2
- package/dist/esm/biz-components/MediaPlayerBase/index.js +1 -1
- package/dist/esm/biz-components/MediaPlayerBase/index.js.map +2 -2
- package/dist/esm/biz-components/MediaPlayerMulti/index.js +1 -1
- package/dist/esm/biz-components/MediaPlayerMulti/index.js.map +2 -2
- package/dist/esm/biz-components/MediaPlayerSticky/index.js +1 -1
- package/dist/esm/biz-components/MediaPlayerSticky/index.js.map +3 -3
- package/dist/esm/biz-components/MemberEquity/index.js +2 -2
- package/dist/esm/biz-components/MemberEquity/index.js.map +2 -2
- package/dist/esm/biz-components/NavigationSearch/index.js +2 -2
- package/dist/esm/biz-components/NavigationSearch/index.js.map +2 -2
- package/dist/esm/biz-components/ProductCompare/index.js.map +2 -2
- package/dist/esm/biz-components/PromotionalBar/index.d.ts +35 -0
- package/dist/esm/biz-components/PromotionalBar/index.js +2 -0
- package/dist/esm/biz-components/PromotionalBar/index.js.map +7 -0
- package/dist/esm/biz-components/SearchPage/index.js +1 -1
- package/dist/esm/biz-components/SearchPage/index.js.map +3 -3
- package/dist/esm/biz-components/SecondaryBanner/index.d.ts +61 -0
- package/dist/esm/biz-components/SecondaryBanner/index.js +2 -0
- package/dist/esm/biz-components/SecondaryBanner/index.js.map +7 -0
- package/dist/esm/biz-components/ShelfDisplay/index.js +1 -1
- package/dist/esm/biz-components/ShelfDisplay/index.js.map +2 -2
- package/dist/esm/biz-components/Slogan/index.js +1 -1
- package/dist/esm/biz-components/Slogan/index.js.map +1 -1
- package/dist/esm/biz-components/Specs/index.js +1 -1
- package/dist/esm/biz-components/Specs/index.js.map +2 -2
- package/dist/esm/biz-components/StockShelf/index.d.ts +21 -0
- package/dist/esm/biz-components/StockShelf/index.js +2 -0
- package/dist/esm/biz-components/StockShelf/index.js.map +7 -0
- package/dist/esm/biz-components/Subscribe/index.js.map +2 -2
- package/dist/esm/biz-components/Tabs/Tabs.js +1 -1
- package/dist/esm/biz-components/Tabs/Tabs.js.map +2 -2
- package/dist/esm/biz-components/TabsGroup/index.js +1 -1
- package/dist/esm/biz-components/TabsGroup/index.js.map +2 -2
- package/dist/esm/biz-components/TextModal/index.js +1 -1
- package/dist/esm/biz-components/TextModal/index.js.map +2 -2
- package/dist/esm/biz-components/VideoModal/index.js +1 -1
- package/dist/esm/biz-components/VideoModal/index.js.map +2 -2
- package/dist/esm/biz-components/index.d.ts +5 -0
- package/dist/esm/biz-components/index.js +1 -1
- package/dist/esm/biz-components/index.js.map +2 -2
- package/dist/esm/components/container.js +1 -1
- package/dist/esm/components/container.js.map +2 -2
- package/dist/esm/components/drop-down.js +1 -1
- package/dist/esm/components/drop-down.js.map +2 -2
- package/dist/esm/components/picture.d.ts +2 -0
- package/dist/esm/components/picture.js +1 -1
- package/dist/esm/components/picture.js.map +3 -3
- package/dist/esm/helpers/ScrollLoadVideo.d.ts +5 -1
- package/dist/esm/helpers/ScrollLoadVideo.js +1 -1
- package/dist/esm/helpers/ScrollLoadVideo.js.map +3 -3
- package/dist/esm/stories/HeroBanner.stories.js +2 -2
- package/dist/esm/stories/HeroBanner.stories.js.map +3 -3
- package/dist/esm/stories/accordionCards.stories.js +1 -1
- package/dist/esm/stories/accordionCards.stories.js.map +3 -3
- package/dist/esm/stories/anchorNavigation.stories.js +2 -0
- package/dist/esm/stories/anchorNavigation.stories.js.map +7 -0
- package/dist/esm/stories/buyOneGetOneShelf.stories.js +2 -0
- package/dist/esm/stories/buyOneGetOneShelf.stories.js.map +7 -0
- package/dist/esm/stories/eventSchedule.stories.js +2 -0
- package/dist/esm/stories/eventSchedule.stories.js.map +7 -0
- package/dist/esm/stories/picture.stories.js +2 -2
- package/dist/esm/stories/picture.stories.js.map +3 -3
- package/dist/esm/stories/promotionalBar.stories.js +2 -0
- package/dist/esm/stories/promotionalBar.stories.js.map +7 -0
- package/dist/esm/stories/secondaryBanner.stories.js +2 -0
- package/dist/esm/stories/secondaryBanner.stories.js.map +7 -0
- package/dist/esm/stories/stockShelf.stories.js +2 -0
- package/dist/esm/stories/stockShelf.stories.js.map +7 -0
- package/package.json +2 -1
- package/style.css +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/stories/stockShelf.stories.tsx"],
|
|
4
|
+
"sourcesContent": ["import type { Meta, StoryObj } from '@storybook/react'\nimport React from 'react'\n\nimport StockShelf, { type StockShelfData } from '../biz-components/StockShelf/index.js'\n\n// \u6A21\u62DF\u4E1A\u52A1\u6570\u636E\nconst mockData: StockShelfData = {\n title: '\u5E93\u5B58\u8D27\u67B6',\n description: '\u80FD\u591F\u5B9E\u65F6\u663E\u793A\u5546\u54C1\u5E93\u5B58\u4FE1\u606F\u548C\u4F1A\u5458\u4EF7\u7684\u8D27\u67B6',\n // \u6839\u636E\u5B9E\u9645\u4E1A\u52A1\u9700\u6C42\u6DFB\u52A0\u66F4\u591A\u6570\u636E\u5B57\u6BB5\n}\n\nconst meta = {\n title: 'Biz Components/StockShelf',\n component: StockShelf,\n parameters: {\n layout: 'centered',\n docs: {\n description: {\n component: '\u5E93\u5B58\u8D27\u67B6 - \u80FD\u591F\u5B9E\u65F6\u663E\u793A\u5546\u54C1\u5E93\u5B58\u4FE1\u606F\u548C\u4F1A\u5458\u4EF7\u7684\u8D27\u67B6',\n },\n },\n },\n tags: ['autodocs'],\n argTypes: {\n data: {\n description: '\u4E1A\u52A1\u6570\u636E',\n },\n },\n args: {\n data: mockData,\n },\n} satisfies Meta<typeof StockShelf>\n\nexport default meta\ntype Story = StoryObj<typeof meta>\n\nexport const Default: Story = {\n args: {},\n}"],
|
|
5
|
+
"mappings": "0jBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,aAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAAkB,iBAElBC,EAAgD,oDAGhD,MAAMC,EAA2B,CAC/B,MAAO,2BACP,YAAa,oHAEf,EAEMC,EAAO,CACX,MAAO,4BACP,UAAW,EAAAC,QACX,WAAY,CACV,OAAQ,WACR,KAAM,CACJ,YAAa,CACX,UAAW,+IACb,CACF,CACF,EACA,KAAM,CAAC,UAAU,EACjB,SAAU,CACR,KAAM,CACJ,YAAa,0BACf,CACF,EACA,KAAM,CACJ,KAAMF,CACR,CACF,EAEA,IAAOJ,EAAQK,EAGR,MAAMN,EAAiB,CAC5B,KAAM,CAAC,CACT",
|
|
6
|
+
"names": ["stockShelf_stories_exports", "__export", "Default", "stockShelf_stories_default", "__toCommonJS", "import_react", "import_StockShelf", "mockData", "meta", "StockShelf"]
|
|
7
|
+
}
|
|
@@ -26,6 +26,23 @@ export type AccordionCardsType = {
|
|
|
26
26
|
primaryButton?: string;
|
|
27
27
|
theme?: 'light' | 'dark';
|
|
28
28
|
};
|
|
29
|
+
/**
|
|
30
|
+
* 自动播放配置
|
|
31
|
+
*/
|
|
32
|
+
autoplay?: {
|
|
33
|
+
/**
|
|
34
|
+
* 是否开启自动播放
|
|
35
|
+
*/
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
/**
|
|
38
|
+
* 是否循环播放
|
|
39
|
+
*/
|
|
40
|
+
loop?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 自动播放间隔时间,单位毫秒
|
|
43
|
+
*/
|
|
44
|
+
interval?: number;
|
|
45
|
+
};
|
|
29
46
|
/** 按钮事件*/
|
|
30
47
|
event?: {
|
|
31
48
|
primaryButton?: (_v: any, _index: number) => void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{Fragment as
|
|
1
|
+
"use client";import{Fragment as V,jsx as r,jsxs as d}from"react/jsx-runtime";import M from"../Title/index.js";import{cn as o}from"../../helpers/utils.js";import I from"../../components/picture.js";import N from"../../components/button.js";import H from"../SwiperBox/index.js";import{withLayout as C}from"../../shared/Styles.js";import S,{useState as _,useRef as y,useCallback as D,useImperativeHandle as j,useEffect as R}from"react";import{useExposure as B}from"../../hooks/useExposure.js";import{trackUrlRef as x}from"../../shared/trackUrlRef.js";import A from"../../shared/throttle.js";import{Heading as E}from"../../components/heading.js";const l="image",s="scene_banner",z=({item:e,idx:t,itemShape:m,hoverIndex:h,getRef:g,handleSwiperItemClick:c,contentWidth:f,primaryButton:a,event:p,data:T,accordionRef:w})=>{const b=h===t,k=b?8:1;return B({current:w.current[t]},{componentType:l,componentName:s,componentTitle:e?.title,position:t+1,componentDescription:e?.subTitle}),d("div",{style:{flex:`${k} 1 0%`,transition:"all 0.6s"},ref:v=>{v&&g(t,v)},className:o("relative cursor-pointer overflow-hidden",m==="round"?"rounded-2xl":""),onMouseEnter:()=>c(t),onClick:()=>{c(t)},children:[r("a",{href:x(e?.imgLink,`${l}_${s}`),"data-headless-type-name":`${l}#${s}`,"data-headless-title-desc-button":`${e?.title}#${e?.subTitle}`,children:r(I,{source:e?.img?.url,className:"size-full object-cover [&_img]:h-full [&_img]:object-cover",alt:e?.img?.alt||""})}),d("div",{style:{width:f},className:o("absolute inset-x-0 bottom-0 flex w-full items-end justify-between overflow-hidden px-8 pb-8 opacity-0 transition-opacity duration-[600ms] ease-in",b&&f?"opacity-100":"opacity-0"),children:[d("div",{className:"mr-16 flex-1 overflow-hidden",children:[r(E,{as:"h3",className:"laptop:text-2xl desktop:text-[32px] text-info-primary mb-1 text-xl font-bold",children:e?.title}),r(E,{as:"h4",className:"lg-desktop:text-[18px] desktop:text-[16px] text-info-primary line-clamp-2 text-[14px] font-[700]",children:e?.subTitle})]}),a&&d(N,{className:o("mb-1.5 font-bold"),as:"a",href:x(e?.link,`${l}_${s}`),"data-headless-type-name":`${l}#${s}`,"data-headless-title-desc-button":`${e?.title}#${e?.subTitle}#${a}`,onClick:()=>p?.primaryButton?.(T,t),children:[a,r("span",{className:"sr-only",children:e?.title??e?.subTitle})]})]})]},t)},P=({data:e,configuration:t})=>{const m=y(null);return B(m,{componentType:l,componentName:s,componentTitle:e?.title,position:t?.index+1,componentDescription:e?.subTitle}),d("div",{ref:m,className:o("bg-container-secondary-1 relative w-full shrink-0 grow-0 overflow-hidden border border-solid",t?.itemShape==="round"?"rounded-2xl":""),children:[r("a",{href:x(e?.imgLink,`${l}_${s}`),"data-headless-type-name":`${l}#${s}`,"data-headless-title-desc-button":`${e?.title}@${e?.subTitle}`,"data-headless-nav-postion":`''#${t?.index+1}`,children:r(I,{className:"size-full object-cover [&_img]:h-full [&_img]:object-cover",source:e?.mobileImg?.url||"",alt:e?.mobileImg?.alt||""})}),d("div",{className:o("absolute inset-x-0 bottom-0 overflow-hidden px-4 pb-4"),children:[d("div",{className:"tablet:mb-6 mb-4 flex-1 overflow-hidden",children:[r("p",{className:"text-info-primary text-2xl font-bold leading-[1.2]",children:e?.title}),r("h3",{className:"text-info-primary line-clamp-2 text-sm font-semibold",children:e?.subTitle})]}),t?.primaryButton&&r(N,{as:"a",variant:"secondary","aria-label":e?.title??e?.subTitle,className:o("text-info-primary text-sm font-bold"),href:x(e.link,`${l}_${s}`),"data-headless-type-name":`${l}#${s}`,"data-headless-nav-postion":`''#${t?.index+1}`,"data-headless-title-desc-button":`${e?.title}#${e?.subTitle}#${t?.primaryButton}`,children:t?.primaryButton})]})]})},L=S.forwardRef(({data:e,autoplay:t={enabled:!1,loop:!1,interval:1500},className:m="",event:h},g)=>{const[c,f]=_(0),a=y(0),p=y([]),[T,w]=_(0),b=y(null);j(g,()=>b.current);const k=(n,i)=>{i&&(p.current[n]=i)};R(()=>{const n=()=>{p.current[a.current]&&w(p.current[a.current].offsetWidth)};n();const i=A(n,300);return window.addEventListener("resize",i),()=>window.removeEventListener("resize",i)},[]);const v=D(n=>{c!==n&&(f(n),a.current=n)},[e?.products,c]);return R(()=>{let n;return t?.enabled&&(n=setInterval(()=>{f(i=>{const $=i??0;let u;if(t.loop!==!1)u=($+1)%e?.products?.length;else if(u=$+1,u>=e?.products?.length)return u=e?.products?.length-1,n&&clearInterval(n),$;return a.current=u,u})},t?.interval)),()=>{n&&clearInterval(n)}},[t?.enabled,t?.interval,t?.loop,e?.products?.length,v]),d(V,{children:[e?.title&&r(M,{data:{title:e?.title}}),r("div",{ref:b,className:o("laptop:block hidden",{"aiui-dark":e?.theme==="dark"}),children:r("div",{className:o("lg-desktop:h-[calc(560_/_1920*100vw)] desktop:h-[calc(448_/_1440*100vw)] laptop:h-[calc(336_/_1025*100vw)] flex max-h-[560px] min-h-[336px] w-full gap-4 overflow-hidden",m),children:e?.products?.map((n,i)=>r(z,{item:n,idx:i,itemShape:e?.itemShape,hoverIndex:c,getRef:k,handleSwiperItemClick:v,contentWidth:T,primaryButton:e?.primaryButton,event:h,data:e,accordionRef:p},i))})}),r("div",{className:o("laptop:hidden block",{"aiui-dark":e?.theme==="dark"}),children:r(H,{className:o("h-[400px] !overflow-visible",m),id:"AccordionCards"+e?.key,data:{list:e?.products,configuration:{shape:e?.shape,itemShape:e?.itemShape,primaryButton:e?.primaryButton,event:h,title:e?.title}},Slide:P,breakpoints:{0:{spaceBetween:12,freeMode:!1,slidesPerView:1},374:{spaceBetween:12,freeMode:!1,slidesPerView:1.2},768:{spaceBetween:16,freeMode:!1,slidesPerView:2.3}}})})]})});L.displayName="AccordionCards";var Z=C(L);export{Z as default};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/AccordionCards/index.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\nimport Title from '../Title/index.js'\nimport { cn } from '../../helpers/utils.js'\nimport Picture from '../../components/picture.js'\nimport Button from '../../components/button.js'\nimport SwiperBox from '../SwiperBox/index.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport React, { useState, useRef, useCallback, useImperativeHandle, useEffect, type RefObject } from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { trackUrlRef } from '../../shared/trackUrlRef.js'\nimport type { Img } from '../../types/props.js'\nimport throttle from '../../shared/throttle.js'\nimport { Heading } from '../../components/heading.js'\n\nconst componentType = 'image'\nconst componentName = 'scene_banner'\n\n/** Hook\uFF1A\u76D1\u542C\u7A97\u53E3\u5BBD\u5EA6 */\ntype ItemType = {\n /** \u6807\u9898\u6587\u672C */\n title: string\n /** \u56FE\u7247*/\n img: Img\n mobileImg?: Img\n /** \u5185\u5BB9\u8282\u70B9 */\n subTitle: string\n link?: string\n imgLink?: string\n}\n\nexport type AccordionCardsType = {\n className?: string\n data: {\n key?: string\n title?: string\n products: Array<ItemType>\n /** \u6309\u94AE\u5F62\u72B6 */\n shape?: 'round' | 'square'\n /** \u5361\u7247\u5F62\u72B6 */\n itemShape?: 'round' | 'square'\n /** \u4E3B\u6309\u94AE\u914D\u7F6E */\n primaryButton?: string\n theme?: 'light' | 'dark'\n }\n /** \u6309\u94AE\u4E8B\u4EF6*/\n event?: {\n primaryButton?: (_v: any, _index: number) => void\n }\n}\n\nconst AccordionCardsPcItem = ({\n item,\n idx,\n itemShape,\n hoverIndex,\n getRef,\n handleSwiperItemClick,\n isAnimation,\n contentWidth,\n primaryButton,\n event,\n data,\n accordionRef,\n}: {\n item: ItemType\n idx: number\n itemShape: 'round' | 'square' | undefined\n hoverIndex: number | null\n getRef: (_idx: number, _el: HTMLDivElement) => void\n handleSwiperItemClick: (_idx: number) => void\n isAnimation: any\n contentWidth: number\n primaryButton: string | undefined\n event: any\n data: AccordionCardsType['data']\n accordionRef: React.MutableRefObject<HTMLDivElement[]>\n}) => {\n const isExpanded = hoverIndex === idx\n const flexValue = isExpanded ? 8 : 1\n\n useExposure({ current: accordionRef.current[idx] } as RefObject<HTMLDivElement>, {\n componentType,\n componentName,\n componentTitle: item?.title,\n position: idx + 1,\n componentDescription: item?.subTitle,\n })\n\n return (\n <div\n key={idx}\n style={{\n flex: `${flexValue} 1 0%`,\n transition: 'all 0.6s',\n }}\n ref={(el: HTMLDivElement | null) => {\n if (el) getRef(idx, el)\n }}\n className={cn('relative cursor-pointer overflow-hidden', itemShape === 'round' ? 'rounded-2xl' : '')}\n onMouseEnter={() => handleSwiperItemClick(idx)}\n onMouseLeave={() => {\n isAnimation.current = false\n }}\n onClick={() => {\n handleSwiperItemClick(idx)\n }}\n >\n <a\n href={trackUrlRef(item?.imgLink, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${item?.title}#${item?.subTitle}`}\n >\n <Picture\n source={item?.img?.url}\n className=\"size-full object-cover [&_img]:h-full [&_img]:object-cover\"\n alt={item?.img?.alt || ''}\n />\n </a>\n <div\n style={{\n width: contentWidth,\n }}\n className={cn(\n 'absolute inset-x-0 bottom-0 flex w-full items-end justify-between overflow-hidden px-8 pb-8 opacity-0 transition-opacity duration-[600ms] ease-in',\n isExpanded && contentWidth ? 'opacity-100' : 'opacity-0'\n )}\n >\n <div className=\"mr-16 flex-1 overflow-hidden\">\n <Heading as=\"h3\" className=\"laptop:text-2xl desktop:text-[32px] text-info-primary mb-1 text-xl font-bold\">\n {item?.title}\n </Heading>\n <Heading\n as=\"h4\"\n className=\"lg-desktop:text-[18px] desktop:text-[16px] text-info-primary line-clamp-2 text-[14px] font-[700]\"\n >\n {item?.subTitle}\n </Heading>\n </div>\n <Button\n className={cn('mb-1.5 font-bold')}\n as=\"a\"\n href={trackUrlRef(item?.link, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${item?.title}#${item?.subTitle}#${primaryButton}`}\n onClick={() => event?.primaryButton?.(data, idx)}\n >\n {primaryButton}\n <span className=\"sr-only\">{item?.title ?? item?.subTitle}</span>\n </Button>\n </div>\n </div>\n )\n}\n\nconst MobileItem = ({ data, configuration }: { data: ItemType; configuration?: any }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useExposure(ref, {\n componentType,\n componentName,\n componentTitle: data?.title,\n position: configuration?.index + 1,\n componentDescription: data?.subTitle,\n })\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-secondary-1 relative w-full shrink-0 grow-0 overflow-hidden border border-solid',\n configuration?.itemShape === 'round' ? 'rounded-2xl' : ''\n )}\n >\n <a\n href={trackUrlRef(data?.imgLink, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${data?.title}@${data?.subTitle}`}\n data-headless-nav-postion={`''#${configuration?.index + 1}`}\n >\n <Picture\n className=\"size-full object-cover [&_img]:h-full [&_img]:object-cover\"\n source={data?.mobileImg?.url || ''}\n alt={data?.mobileImg?.alt || ''}\n />\n </a>\n <div className={cn('absolute inset-x-0 bottom-0 overflow-hidden px-4 pb-4')}>\n <div className=\"tablet:mb-6 mb-4 flex-1 overflow-hidden\">\n <p className=\"text-info-primary text-2xl font-bold leading-[1.2]\">{data?.title}</p>\n <h3 className=\"text-info-primary line-clamp-2 text-sm font-semibold\">{data?.subTitle}</h3>\n </div>\n\n <Button\n as=\"a\"\n variant=\"secondary\"\n aria-label={data?.title ?? data?.subTitle}\n className={cn('text-info-primary text-sm font-bold')}\n href={trackUrlRef(data.link, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-nav-postion={`''#${configuration?.index + 1}`}\n data-headless-title-desc-button={`${data?.title}#${data?.subTitle}#${configuration?.primaryButton}`}\n >\n {configuration?.primaryButton}\n </Button>\n </div>\n </div>\n )\n}\n\nconst AccordionCards = React.forwardRef<HTMLDivElement, AccordionCardsType>(({ data, className = '', event }, ref) => {\n const [hoverIndex, setHoverIndex] = useState<number | null>(0)\n\n const hoverIndexRef = useRef<number>(0)\n const accordionRef = useRef<HTMLDivElement[]>([])\n const isAnimation = useRef<boolean>(false)\n const [contentWidth, setContentWidth] = useState<number>(0)\n\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n const getRef = (index: number, el: HTMLDivElement) => {\n if (el) {\n accordionRef.current[index] = el\n }\n }\n\n useEffect(() => {\n const handleResize = () => {\n if (accordionRef.current[hoverIndexRef.current]) {\n setContentWidth(accordionRef.current[hoverIndexRef.current].offsetWidth)\n }\n }\n handleResize()\n const throttleResize = throttle(handleResize, 300)\n window.addEventListener('resize', throttleResize)\n return () => window.removeEventListener('resize', throttleResize)\n }, [])\n\n const handleSwiperItemClick = useCallback(\n (idx: number) => {\n if (hoverIndex === idx || isAnimation.current) return\n isAnimation.current = true\n // \u66F4\u65B0\u5BBD\u5EA6\u76F8\u5173\u72B6\u6001\n setHoverIndex(idx)\n hoverIndexRef.current = idx\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data?.products, hoverIndex]\n )\n\n return (\n <>\n {data?.title && <Title data={{ title: data?.title }} />}\n <div ref={innerRef} className={cn('laptop:block hidden', { 'aiui-dark': data?.theme === 'dark' })}>\n <div\n className={cn(\n 'lg-desktop:h-[calc(560_/_1920*100vw)] desktop:h-[calc(448_/_1440*100vw)] laptop:h-[calc(336_/_1025*100vw)] flex max-h-[560px] min-h-[336px] w-full gap-4 overflow-hidden',\n className\n )}\n >\n {data?.products?.map((item, idx) => (\n <AccordionCardsPcItem\n key={idx}\n item={item}\n idx={idx}\n itemShape={data?.itemShape}\n hoverIndex={hoverIndex}\n getRef={getRef}\n handleSwiperItemClick={handleSwiperItemClick}\n isAnimation={isAnimation}\n contentWidth={contentWidth}\n primaryButton={data?.primaryButton}\n event={event}\n data={data}\n accordionRef={accordionRef}\n />\n ))}\n </div>\n </div>\n <div className={cn('laptop:hidden block', { 'aiui-dark': data?.theme === 'dark' })}>\n <SwiperBox\n className={cn('h-[400px] !overflow-visible', className)}\n id={'AccordionCards' + data?.key}\n data={{\n list: data?.products,\n configuration: {\n shape: data?.shape,\n itemShape: data?.itemShape,\n primaryButton: data?.primaryButton,\n event: event,\n title: data?.title,\n },\n }}\n Slide={MobileItem}\n breakpoints={{\n 0: {\n spaceBetween: 12,\n freeMode: false,\n slidesPerView: 1,\n },\n 374: {\n spaceBetween: 12,\n freeMode: false,\n slidesPerView: 1.2,\n },\n 768: {\n spaceBetween: 16,\n freeMode: false,\n slidesPerView: 2.3,\n },\n }}\n />\n </div>\n </>\n )\n})\nexport default withLayout(AccordionCards)\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["Fragment", "jsx", "jsxs", "Title", "cn", "Picture", "Button", "SwiperBox", "withLayout", "React", "useState", "useRef", "useCallback", "useImperativeHandle", "useEffect", "useExposure", "trackUrlRef", "throttle", "Heading", "componentType", "componentName", "AccordionCardsPcItem", "item", "idx", "itemShape", "hoverIndex", "getRef", "handleSwiperItemClick", "
|
|
4
|
+
"sourcesContent": ["'use client'\nimport Title from '../Title/index.js'\nimport { cn } from '../../helpers/utils.js'\nimport Picture from '../../components/picture.js'\nimport Button from '../../components/button.js'\nimport SwiperBox from '../SwiperBox/index.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport React, { useState, useRef, useCallback, useImperativeHandle, useEffect, type RefObject } from 'react'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { trackUrlRef } from '../../shared/trackUrlRef.js'\nimport type { Img } from '../../types/props.js'\nimport throttle from '../../shared/throttle.js'\nimport { Heading } from '../../components/heading.js'\n\nconst componentType = 'image'\nconst componentName = 'scene_banner'\n\n/** Hook\uFF1A\u76D1\u542C\u7A97\u53E3\u5BBD\u5EA6 */\ntype ItemType = {\n /** \u6807\u9898\u6587\u672C */\n title: string\n /** \u56FE\u7247*/\n img: Img\n mobileImg?: Img\n /** \u5185\u5BB9\u8282\u70B9 */\n subTitle: string\n link?: string\n imgLink?: string\n}\n\nexport type AccordionCardsType = {\n className?: string\n data: {\n key?: string\n title?: string\n products: Array<ItemType>\n /** \u6309\u94AE\u5F62\u72B6 */\n shape?: 'round' | 'square'\n /** \u5361\u7247\u5F62\u72B6 */\n itemShape?: 'round' | 'square'\n /** \u4E3B\u6309\u94AE\u914D\u7F6E */\n primaryButton?: string\n theme?: 'light' | 'dark'\n }\n /**\n * \u81EA\u52A8\u64AD\u653E\u914D\u7F6E\n */\n autoplay?: {\n /**\n * \u662F\u5426\u5F00\u542F\u81EA\u52A8\u64AD\u653E\n */\n enabled: boolean\n /**\n * \u662F\u5426\u5FAA\u73AF\u64AD\u653E\n */\n loop?: boolean\n /**\n * \u81EA\u52A8\u64AD\u653E\u95F4\u9694\u65F6\u95F4\uFF0C\u5355\u4F4D\u6BEB\u79D2\n */\n interval?: number\n }\n /** \u6309\u94AE\u4E8B\u4EF6*/\n event?: {\n primaryButton?: (_v: any, _index: number) => void\n }\n}\n\nconst AccordionCardsPcItem = ({\n item,\n idx,\n itemShape,\n hoverIndex,\n getRef,\n handleSwiperItemClick,\n contentWidth,\n primaryButton,\n event,\n data,\n accordionRef,\n}: {\n item: ItemType\n idx: number\n itemShape: 'round' | 'square' | undefined\n hoverIndex: number | null\n getRef: (_idx: number, _el: HTMLDivElement) => void\n handleSwiperItemClick: (_idx: number) => void\n contentWidth: number\n primaryButton: string | undefined\n event: any\n data: AccordionCardsType['data']\n accordionRef: React.MutableRefObject<HTMLDivElement[]>\n}) => {\n const isExpanded = hoverIndex === idx\n const flexValue = isExpanded ? 8 : 1\n\n useExposure({ current: accordionRef.current[idx] } as RefObject<HTMLDivElement>, {\n componentType,\n componentName,\n componentTitle: item?.title,\n position: idx + 1,\n componentDescription: item?.subTitle,\n })\n\n return (\n <div\n key={idx}\n style={{\n flex: `${flexValue} 1 0%`,\n transition: 'all 0.6s',\n }}\n ref={(el: HTMLDivElement | null) => {\n if (el) getRef(idx, el)\n }}\n className={cn('relative cursor-pointer overflow-hidden', itemShape === 'round' ? 'rounded-2xl' : '')}\n onMouseEnter={() => handleSwiperItemClick(idx)}\n onClick={() => {\n handleSwiperItemClick(idx)\n }}\n >\n <a\n href={trackUrlRef(item?.imgLink, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${item?.title}#${item?.subTitle}`}\n >\n <Picture\n source={item?.img?.url}\n className=\"size-full object-cover [&_img]:h-full [&_img]:object-cover\"\n alt={item?.img?.alt || ''}\n />\n </a>\n <div\n style={{\n width: contentWidth,\n }}\n className={cn(\n 'absolute inset-x-0 bottom-0 flex w-full items-end justify-between overflow-hidden px-8 pb-8 opacity-0 transition-opacity duration-[600ms] ease-in',\n isExpanded && contentWidth ? 'opacity-100' : 'opacity-0'\n )}\n >\n <div className=\"mr-16 flex-1 overflow-hidden\">\n <Heading as=\"h3\" className=\"laptop:text-2xl desktop:text-[32px] text-info-primary mb-1 text-xl font-bold\">\n {item?.title}\n </Heading>\n <Heading\n as=\"h4\"\n className=\"lg-desktop:text-[18px] desktop:text-[16px] text-info-primary line-clamp-2 text-[14px] font-[700]\"\n >\n {item?.subTitle}\n </Heading>\n </div>\n {primaryButton && (\n <Button\n className={cn('mb-1.5 font-bold')}\n as=\"a\"\n href={trackUrlRef(item?.link, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${item?.title}#${item?.subTitle}#${primaryButton}`}\n onClick={() => event?.primaryButton?.(data, idx)}\n >\n {primaryButton}\n <span className=\"sr-only\">{item?.title ?? item?.subTitle}</span>\n </Button>\n )}\n </div>\n </div>\n )\n}\n\nconst MobileItem = ({ data, configuration }: { data: ItemType; configuration?: any }) => {\n const ref = useRef<HTMLDivElement>(null)\n\n useExposure(ref, {\n componentType,\n componentName,\n componentTitle: data?.title,\n position: configuration?.index + 1,\n componentDescription: data?.subTitle,\n })\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-secondary-1 relative w-full shrink-0 grow-0 overflow-hidden border border-solid',\n configuration?.itemShape === 'round' ? 'rounded-2xl' : ''\n )}\n >\n <a\n href={trackUrlRef(data?.imgLink, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${data?.title}@${data?.subTitle}`}\n data-headless-nav-postion={`''#${configuration?.index + 1}`}\n >\n <Picture\n className=\"size-full object-cover [&_img]:h-full [&_img]:object-cover\"\n source={data?.mobileImg?.url || ''}\n alt={data?.mobileImg?.alt || ''}\n />\n </a>\n <div className={cn('absolute inset-x-0 bottom-0 overflow-hidden px-4 pb-4')}>\n <div className=\"tablet:mb-6 mb-4 flex-1 overflow-hidden\">\n <p className=\"text-info-primary text-2xl font-bold leading-[1.2]\">{data?.title}</p>\n <h3 className=\"text-info-primary line-clamp-2 text-sm font-semibold\">{data?.subTitle}</h3>\n </div>\n\n {configuration?.primaryButton && (\n <Button\n as=\"a\"\n variant=\"secondary\"\n aria-label={data?.title ?? data?.subTitle}\n className={cn('text-info-primary text-sm font-bold')}\n href={trackUrlRef(data.link, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-nav-postion={`''#${configuration?.index + 1}`}\n data-headless-title-desc-button={`${data?.title}#${data?.subTitle}#${configuration?.primaryButton}`}\n >\n {configuration?.primaryButton}\n </Button>\n )}\n </div>\n </div>\n )\n}\n\nconst AccordionCards = React.forwardRef<HTMLDivElement, AccordionCardsType>(\n ({ data, autoplay = { enabled: false, loop: false, interval: 1500 }, className = '', event }, ref) => {\n const [hoverIndex, setHoverIndex] = useState<number | null>(0)\n\n const hoverIndexRef = useRef<number>(0)\n const accordionRef = useRef<HTMLDivElement[]>([])\n const [contentWidth, setContentWidth] = useState<number>(0)\n\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n const getRef = (index: number, el: HTMLDivElement) => {\n if (el) {\n accordionRef.current[index] = el\n }\n }\n\n useEffect(() => {\n const handleResize = () => {\n if (accordionRef.current[hoverIndexRef.current]) {\n setContentWidth(accordionRef.current[hoverIndexRef.current].offsetWidth)\n }\n }\n handleResize()\n const throttleResize = throttle(handleResize, 300)\n window.addEventListener('resize', throttleResize)\n return () => window.removeEventListener('resize', throttleResize)\n }, [])\n\n const handleSwiperItemClick = useCallback(\n (idx: number) => {\n if (hoverIndex === idx) return\n // \u66F4\u65B0\u5BBD\u5EA6\u76F8\u5173\u72B6\u6001\n setHoverIndex(idx)\n hoverIndexRef.current = idx\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [data?.products, hoverIndex]\n )\n\n useEffect(() => {\n let autoPlayTimer: NodeJS.Timeout\n if (autoplay?.enabled) {\n autoPlayTimer = setInterval(() => {\n setHoverIndex(prev => {\n const currentIndex = prev ?? 0\n let nextIndex: number\n\n if (autoplay.loop !== false) {\n // \u9ED8\u8BA4\u5FAA\u73AF\u64AD\u653E\n nextIndex = (currentIndex + 1) % data?.products?.length\n } else {\n // \u4E0D\u5FAA\u73AF\uFF1A\u64AD\u653E\u5230\u6700\u540E\u4E00\u4E2A\u540E\u505C\u6B62\n nextIndex = currentIndex + 1\n if (nextIndex >= data?.products?.length) {\n nextIndex = data?.products?.length - 1\n // \u505C\u6B62\u81EA\u52A8\u64AD\u653E\n if (autoPlayTimer) {\n clearInterval(autoPlayTimer)\n }\n return currentIndex // \u4FDD\u6301\u5728\u6700\u540E\u4E00\u4E2A\n }\n }\n\n hoverIndexRef.current = nextIndex\n return nextIndex\n })\n }, autoplay?.interval)\n }\n return () => {\n if (autoPlayTimer) {\n clearInterval(autoPlayTimer)\n }\n }\n }, [autoplay?.enabled, autoplay?.interval, autoplay?.loop, data?.products?.length, handleSwiperItemClick])\n\n return (\n <>\n {data?.title && <Title data={{ title: data?.title }} />}\n <div ref={innerRef} className={cn('laptop:block hidden', { 'aiui-dark': data?.theme === 'dark' })}>\n <div\n className={cn(\n 'lg-desktop:h-[calc(560_/_1920*100vw)] desktop:h-[calc(448_/_1440*100vw)] laptop:h-[calc(336_/_1025*100vw)] flex max-h-[560px] min-h-[336px] w-full gap-4 overflow-hidden',\n className\n )}\n >\n {data?.products?.map((item, idx) => (\n <AccordionCardsPcItem\n key={idx}\n item={item}\n idx={idx}\n itemShape={data?.itemShape}\n hoverIndex={hoverIndex}\n getRef={getRef}\n handleSwiperItemClick={handleSwiperItemClick}\n contentWidth={contentWidth}\n primaryButton={data?.primaryButton}\n event={event}\n data={data}\n accordionRef={accordionRef}\n />\n ))}\n </div>\n </div>\n <div className={cn('laptop:hidden block', { 'aiui-dark': data?.theme === 'dark' })}>\n <SwiperBox\n className={cn('h-[400px] !overflow-visible', className)}\n id={'AccordionCards' + data?.key}\n data={{\n list: data?.products,\n configuration: {\n shape: data?.shape,\n itemShape: data?.itemShape,\n primaryButton: data?.primaryButton,\n event: event,\n title: data?.title,\n },\n }}\n Slide={MobileItem}\n breakpoints={{\n 0: {\n spaceBetween: 12,\n freeMode: false,\n slidesPerView: 1,\n },\n 374: {\n spaceBetween: 12,\n freeMode: false,\n slidesPerView: 1.2,\n },\n 768: {\n spaceBetween: 16,\n freeMode: false,\n slidesPerView: 2.3,\n },\n }}\n />\n </div>\n </>\n )\n }\n)\n\nAccordionCards.displayName = 'AccordionCards'\nexport default withLayout(AccordionCards)\n"],
|
|
5
|
+
"mappings": "aA4HQ,OAiLF,YAAAA,EAjLE,OAAAC,EAeA,QAAAC,MAfA,oBA3HR,OAAOC,MAAW,oBAClB,OAAS,MAAAC,MAAU,yBACnB,OAAOC,MAAa,8BACpB,OAAOC,MAAY,6BACnB,OAAOC,MAAe,wBACtB,OAAS,cAAAC,MAAkB,yBAC3B,OAAOC,GAAS,YAAAC,EAAU,UAAAC,EAAQ,eAAAC,EAAa,uBAAAC,EAAqB,aAAAC,MAAiC,QACrG,OAAS,eAAAC,MAAmB,6BAC5B,OAAS,eAAAC,MAAmB,8BAE5B,OAAOC,MAAc,2BACrB,OAAS,WAAAC,MAAe,8BAExB,MAAMC,EAAgB,QAChBC,EAAgB,eAoDhBC,EAAuB,CAAC,CAC5B,KAAAC,EACA,IAAAC,EACA,UAAAC,EACA,WAAAC,EACA,OAAAC,EACA,sBAAAC,EACA,aAAAC,EACA,cAAAC,EACA,MAAAC,EACA,KAAAC,EACA,aAAAC,CACF,IAYM,CACJ,MAAMC,EAAaR,IAAeF,EAC5BW,EAAYD,EAAa,EAAI,EAEnC,OAAAlB,EAAY,CAAE,QAASiB,EAAa,QAAQT,CAAG,CAAE,EAAgC,CAC/E,cAAAJ,EACA,cAAAC,EACA,eAAgBE,GAAM,MACtB,SAAUC,EAAM,EAChB,qBAAsBD,GAAM,QAC9B,CAAC,EAGCpB,EAAC,OAEC,MAAO,CACL,KAAM,GAAGgC,CAAS,QAClB,WAAY,UACd,EACA,IAAMC,GAA8B,CAC9BA,GAAIT,EAAOH,EAAKY,CAAE,CACxB,EACA,UAAW/B,EAAG,0CAA2CoB,IAAc,QAAU,cAAgB,EAAE,EACnG,aAAc,IAAMG,EAAsBJ,CAAG,EAC7C,QAAS,IAAM,CACbI,EAAsBJ,CAAG,CAC3B,EAEA,UAAAtB,EAAC,KACC,KAAMe,EAAYM,GAAM,QAAS,GAAGH,CAAa,IAAIC,CAAa,EAAE,EACpE,0BAAyB,GAAGD,CAAa,IAAIC,CAAa,GAC1D,kCAAiC,GAAGE,GAAM,KAAK,IAAIA,GAAM,QAAQ,GAEjE,SAAArB,EAACI,EAAA,CACC,OAAQiB,GAAM,KAAK,IACnB,UAAU,6DACV,IAAKA,GAAM,KAAK,KAAO,GACzB,EACF,EACApB,EAAC,OACC,MAAO,CACL,MAAO0B,CACT,EACA,UAAWxB,EACT,oJACA6B,GAAcL,EAAe,cAAgB,WAC/C,EAEA,UAAA1B,EAAC,OAAI,UAAU,+BACb,UAAAD,EAACiB,EAAA,CAAQ,GAAG,KAAK,UAAU,+EACxB,SAAAI,GAAM,MACT,EACArB,EAACiB,EAAA,CACC,GAAG,KACH,UAAU,mGAET,SAAAI,GAAM,SACT,GACF,EACCO,GACC3B,EAACI,EAAA,CACC,UAAWF,EAAG,kBAAkB,EAChC,GAAG,IACH,KAAMY,EAAYM,GAAM,KAAM,GAAGH,CAAa,IAAIC,CAAa,EAAE,EACjE,0BAAyB,GAAGD,CAAa,IAAIC,CAAa,GAC1D,kCAAiC,GAAGE,GAAM,KAAK,IAAIA,GAAM,QAAQ,IAAIO,CAAa,GAClF,QAAS,IAAMC,GAAO,gBAAgBC,EAAMR,CAAG,EAE9C,UAAAM,EACD5B,EAAC,QAAK,UAAU,UAAW,SAAAqB,GAAM,OAASA,GAAM,SAAS,GAC3D,GAEJ,IA1DKC,CA2DP,CAEJ,EAEMa,EAAa,CAAC,CAAE,KAAAL,EAAM,cAAAM,CAAc,IAA+C,CACvF,MAAMC,EAAM3B,EAAuB,IAAI,EAEvC,OAAAI,EAAYuB,EAAK,CACf,cAAAnB,EACA,cAAAC,EACA,eAAgBW,GAAM,MACtB,SAAUM,GAAe,MAAQ,EACjC,qBAAsBN,GAAM,QAC9B,CAAC,EAGC7B,EAAC,OACC,IAAKoC,EACL,UAAWlC,EACT,+FACAiC,GAAe,YAAc,QAAU,cAAgB,EACzD,EAEA,UAAApC,EAAC,KACC,KAAMe,EAAYe,GAAM,QAAS,GAAGZ,CAAa,IAAIC,CAAa,EAAE,EACpE,0BAAyB,GAAGD,CAAa,IAAIC,CAAa,GAC1D,kCAAiC,GAAGW,GAAM,KAAK,IAAIA,GAAM,QAAQ,GACjE,4BAA2B,MAAMM,GAAe,MAAQ,CAAC,GAEzD,SAAApC,EAACI,EAAA,CACC,UAAU,6DACV,OAAQ0B,GAAM,WAAW,KAAO,GAChC,IAAKA,GAAM,WAAW,KAAO,GAC/B,EACF,EACA7B,EAAC,OAAI,UAAWE,EAAG,uDAAuD,EACxE,UAAAF,EAAC,OAAI,UAAU,0CACb,UAAAD,EAAC,KAAE,UAAU,qDAAsD,SAAA8B,GAAM,MAAM,EAC/E9B,EAAC,MAAG,UAAU,uDAAwD,SAAA8B,GAAM,SAAS,GACvF,EAECM,GAAe,eACdpC,EAACK,EAAA,CACC,GAAG,IACH,QAAQ,YACR,aAAYyB,GAAM,OAASA,GAAM,SACjC,UAAW3B,EAAG,qCAAqC,EACnD,KAAMY,EAAYe,EAAK,KAAM,GAAGZ,CAAa,IAAIC,CAAa,EAAE,EAChE,0BAAyB,GAAGD,CAAa,IAAIC,CAAa,GAC1D,4BAA2B,MAAMiB,GAAe,MAAQ,CAAC,GACzD,kCAAiC,GAAGN,GAAM,KAAK,IAAIA,GAAM,QAAQ,IAAIM,GAAe,aAAa,GAEhG,SAAAA,GAAe,cAClB,GAEJ,GACF,CAEJ,EAEME,EAAiB9B,EAAM,WAC3B,CAAC,CAAE,KAAAsB,EAAM,SAAAS,EAAW,CAAE,QAAS,GAAO,KAAM,GAAO,SAAU,IAAK,EAAG,UAAAC,EAAY,GAAI,MAAAX,CAAM,EAAGQ,IAAQ,CACpG,KAAM,CAACb,EAAYiB,CAAa,EAAIhC,EAAwB,CAAC,EAEvDiC,EAAgBhC,EAAe,CAAC,EAChCqB,EAAerB,EAAyB,CAAC,CAAC,EAC1C,CAACiB,EAAcgB,CAAe,EAAIlC,EAAiB,CAAC,EAEpDmC,EAAWlC,EAAuB,IAAI,EAC5CE,EAAoByB,EAAK,IAAMO,EAAS,OAAyB,EAEjE,MAAMnB,EAAS,CAACoB,EAAeX,IAAuB,CAChDA,IACFH,EAAa,QAAQc,CAAK,EAAIX,EAElC,EAEArB,EAAU,IAAM,CACd,MAAMiC,EAAe,IAAM,CACrBf,EAAa,QAAQW,EAAc,OAAO,GAC5CC,EAAgBZ,EAAa,QAAQW,EAAc,OAAO,EAAE,WAAW,CAE3E,EACAI,EAAa,EACb,MAAMC,EAAiB/B,EAAS8B,EAAc,GAAG,EACjD,cAAO,iBAAiB,SAAUC,CAAc,EACzC,IAAM,OAAO,oBAAoB,SAAUA,CAAc,CAClE,EAAG,CAAC,CAAC,EAEL,MAAMrB,EAAwBf,EAC3BW,GAAgB,CACXE,IAAeF,IAEnBmB,EAAcnB,CAAG,EACjBoB,EAAc,QAAUpB,EAC1B,EAEA,CAACQ,GAAM,SAAUN,CAAU,CAC7B,EAEA,OAAAX,EAAU,IAAM,CACd,IAAImC,EACJ,OAAIT,GAAU,UACZS,EAAgB,YAAY,IAAM,CAChCP,EAAcQ,GAAQ,CACpB,MAAMC,EAAeD,GAAQ,EAC7B,IAAIE,EAEJ,GAAIZ,EAAS,OAAS,GAEpBY,GAAaD,EAAe,GAAKpB,GAAM,UAAU,eAGjDqB,EAAYD,EAAe,EACvBC,GAAarB,GAAM,UAAU,OAC/B,OAAAqB,EAAYrB,GAAM,UAAU,OAAS,EAEjCkB,GACF,cAAcA,CAAa,EAEtBE,EAIX,OAAAR,EAAc,QAAUS,EACjBA,CACT,CAAC,CACH,EAAGZ,GAAU,QAAQ,GAEhB,IAAM,CACPS,GACF,cAAcA,CAAa,CAE/B,CACF,EAAG,CAACT,GAAU,QAASA,GAAU,SAAUA,GAAU,KAAMT,GAAM,UAAU,OAAQJ,CAAqB,CAAC,EAGvGzB,EAAAF,EAAA,CACG,UAAA+B,GAAM,OAAS9B,EAACE,EAAA,CAAM,KAAM,CAAE,MAAO4B,GAAM,KAAM,EAAG,EACrD9B,EAAC,OAAI,IAAK4C,EAAU,UAAWzC,EAAG,sBAAuB,CAAE,YAAa2B,GAAM,QAAU,MAAO,CAAC,EAC9F,SAAA9B,EAAC,OACC,UAAWG,EACT,2KACAqC,CACF,EAEC,SAAAV,GAAM,UAAU,IAAI,CAACT,EAAMC,IAC1BtB,EAACoB,EAAA,CAEC,KAAMC,EACN,IAAKC,EACL,UAAWQ,GAAM,UACjB,WAAYN,EACZ,OAAQC,EACR,sBAAuBC,EACvB,aAAcC,EACd,cAAeG,GAAM,cACrB,MAAOD,EACP,KAAMC,EACN,aAAcC,GAXTT,CAYP,CACD,EACH,EACF,EACAtB,EAAC,OAAI,UAAWG,EAAG,sBAAuB,CAAE,YAAa2B,GAAM,QAAU,MAAO,CAAC,EAC/E,SAAA9B,EAACM,EAAA,CACC,UAAWH,EAAG,8BAA+BqC,CAAS,EACtD,GAAI,iBAAmBV,GAAM,IAC7B,KAAM,CACJ,KAAMA,GAAM,SACZ,cAAe,CACb,MAAOA,GAAM,MACb,UAAWA,GAAM,UACjB,cAAeA,GAAM,cACrB,MAAOD,EACP,MAAOC,GAAM,KACf,CACF,EACA,MAAOK,EACP,YAAa,CACX,EAAG,CACD,aAAc,GACd,SAAU,GACV,cAAe,CACjB,EACA,IAAK,CACH,aAAc,GACd,SAAU,GACV,cAAe,GACjB,EACA,IAAK,CACH,aAAc,GACd,SAAU,GACV,cAAe,GACjB,CACF,EACF,EACF,GACF,CAEJ,CACF,EAEAG,EAAe,YAAc,iBAC7B,IAAOc,EAAQ7C,EAAW+B,CAAc",
|
|
6
|
+
"names": ["Fragment", "jsx", "jsxs", "Title", "cn", "Picture", "Button", "SwiperBox", "withLayout", "React", "useState", "useRef", "useCallback", "useImperativeHandle", "useEffect", "useExposure", "trackUrlRef", "throttle", "Heading", "componentType", "componentName", "AccordionCardsPcItem", "item", "idx", "itemShape", "hoverIndex", "getRef", "handleSwiperItemClick", "contentWidth", "primaryButton", "event", "data", "accordionRef", "isExpanded", "flexValue", "el", "MobileItem", "configuration", "ref", "AccordionCards", "autoplay", "className", "setHoverIndex", "hoverIndexRef", "setContentWidth", "innerRef", "index", "handleResize", "throttleResize", "autoPlayTimer", "prev", "currentIndex", "nextIndex", "AccordionCards_default"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* AnchorNavigation 业务组件数据接口
|
|
4
|
+
*/
|
|
5
|
+
export interface AnchorNavigationData {
|
|
6
|
+
/** 锚点列表 */
|
|
7
|
+
sectionIds: {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
}[];
|
|
11
|
+
}
|
|
12
|
+
export interface AnchorNavigationProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
13
|
+
/** 业务数据 */
|
|
14
|
+
data: AnchorNavigationData;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* AnchorNavigation - 锚点导航
|
|
18
|
+
*
|
|
19
|
+
* @description 锚点导航
|
|
20
|
+
*/
|
|
21
|
+
declare const AnchorNavigation: React.ForwardRefExoticComponent<AnchorNavigationProps & React.RefAttributes<HTMLDivElement>>;
|
|
22
|
+
export default AnchorNavigation;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{jsx as r}from"react/jsx-runtime";import*as n from"react";import{cn as l}from"../../helpers/utils.js";import{Container as h}from"../../components/container.js";import g from"./useAnchorPosition.js";const f=n.forwardRef(({className:d,data:a,...b},m)=>{const u=g(a.sectionIds?.map(t=>t.id)||[]),i=n.useRef(null),s=n.useRef([]),p=n.useCallback(t=>{const e=s.current[t];if(e&&i.current){const o=i.current,c=e,v=c.offsetLeft-o.offsetWidth/2+c.offsetWidth/2;o.scrollTo({left:v,behavior:"smooth"})}},[]);return r("div",{ref:m,className:l("sticky top-0 z-10 w-full bg-white",d),...b,children:r(h,{children:r("div",{ref:i,className:"anchor-navigation-content desktop:gap-6 flex items-center gap-4 overflow-x-auto [&::-webkit-scrollbar]:hidden",children:a.sectionIds?.map((t,e)=>r("button",{ref:o=>{o&&(s.current[e]=o)},onClick:()=>{p(e),document.getElementById(t.id)?.scrollIntoView({behavior:"smooth"})},className:l("anchor-navigation-item desktop:py-4 shrink-0 border-b-4 border-b-transparent py-3 text-base font-bold text-[#4A4C56]",{"border-b-brand text-[#080A0F]":u===t.id}),children:t.label},t.id))})})})});f.displayName="AnchorNavigation";var R=f;export{R as default};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/biz-components/AnchorNavigation/index.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/utils.js'\nimport { Container } from '../../components/container.js'\nimport useAnchorPosition from './useAnchorPosition.js'\n/**\n * AnchorNavigation \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3\n */\nexport interface AnchorNavigationData {\n /** \u951A\u70B9\u5217\u8868 */\n sectionIds: {\n id: string\n label: string\n }[]\n}\n\nexport interface AnchorNavigationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: AnchorNavigationData\n}\n\n/**\n * AnchorNavigation - \u951A\u70B9\u5BFC\u822A\n *\n * @description \u951A\u70B9\u5BFC\u822A\n */\nconst AnchorNavigation = React.forwardRef<HTMLDivElement, AnchorNavigationProps>(\n ({ className, data, ...props }, ref) => {\n const activeId = useAnchorPosition(data.sectionIds?.map(item => item.id) || [])\n const containerRef = React.useRef<HTMLDivElement>(null)\n const sectionRefs = React.useRef<HTMLButtonElement[]>([])\n\n const autoScrollToActiveItem = React.useCallback((activeIdIndex: number) => {\n const curRef = sectionRefs.current[activeIdIndex]\n\n if (curRef && containerRef.current) {\n const container = containerRef.current\n const button = curRef\n const scrollLeft = button.offsetLeft - container.offsetWidth / 2 + button.offsetWidth / 2\n\n container.scrollTo({\n left: scrollLeft,\n behavior: 'smooth',\n })\n }\n }, [])\n\n return (\n <div ref={ref} className={cn('sticky top-0 z-10 w-full bg-white', className)} {...props}>\n <Container>\n <div\n ref={containerRef}\n className=\"anchor-navigation-content desktop:gap-6 flex items-center gap-4 overflow-x-auto [&::-webkit-scrollbar]:hidden\"\n >\n {data.sectionIds?.map((item, index) => (\n <button\n key={item.id}\n ref={el => {\n if (el) {\n sectionRefs.current[index] = el\n }\n }}\n onClick={() => {\n autoScrollToActiveItem(index)\n document.getElementById(item.id)?.scrollIntoView({ behavior: 'smooth' })\n }}\n className={cn(\n 'anchor-navigation-item desktop:py-4 shrink-0 border-b-4 border-b-transparent py-3 text-base font-bold text-[#4A4C56]',\n {\n 'border-b-brand text-[#080A0F]': activeId === item.id,\n }\n )}\n >\n {item.label}\n </button>\n ))}\n </div>\n </Container>\n </div>\n )\n }\n)\n\nAnchorNavigation.displayName = 'AnchorNavigation'\nexport default AnchorNavigation\n"],
|
|
5
|
+
"mappings": "aAwDc,cAAAA,MAAA,oBAtDd,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAS,aAAAC,MAAiB,gCAC1B,OAAOC,MAAuB,yBAsB9B,MAAMC,EAAmBJ,EAAM,WAC7B,CAAC,CAAE,UAAAK,EAAW,KAAAC,EAAM,GAAGC,CAAM,EAAGC,IAAQ,CACtC,MAAMC,EAAWN,EAAkBG,EAAK,YAAY,IAAII,GAAQA,EAAK,EAAE,GAAK,CAAC,CAAC,EACxEC,EAAeX,EAAM,OAAuB,IAAI,EAChDY,EAAcZ,EAAM,OAA4B,CAAC,CAAC,EAElDa,EAAyBb,EAAM,YAAac,GAA0B,CAC1E,MAAMC,EAASH,EAAY,QAAQE,CAAa,EAEhD,GAAIC,GAAUJ,EAAa,QAAS,CAClC,MAAMK,EAAYL,EAAa,QACzBM,EAASF,EACTG,EAAaD,EAAO,WAAaD,EAAU,YAAc,EAAIC,EAAO,YAAc,EAExFD,EAAU,SAAS,CACjB,KAAME,EACN,SAAU,QACZ,CAAC,CACH,CACF,EAAG,CAAC,CAAC,EAEL,OACEnB,EAAC,OAAI,IAAKS,EAAK,UAAWP,EAAG,oCAAqCI,CAAS,EAAI,GAAGE,EAChF,SAAAR,EAACG,EAAA,CACC,SAAAH,EAAC,OACC,IAAKY,EACL,UAAU,gHAET,SAAAL,EAAK,YAAY,IAAI,CAACI,EAAMS,IAC3BpB,EAAC,UAEC,IAAKqB,GAAM,CACLA,IACFR,EAAY,QAAQO,CAAK,EAAIC,EAEjC,EACA,QAAS,IAAM,CACbP,EAAuBM,CAAK,EAC5B,SAAS,eAAeT,EAAK,EAAE,GAAG,eAAe,CAAE,SAAU,QAAS,CAAC,CACzE,EACA,UAAWT,EACT,uHACA,CACE,gCAAiCQ,IAAaC,EAAK,EACrD,CACF,EAEC,SAAAA,EAAK,OAjBDA,EAAK,EAkBZ,CACD,EACH,EACF,EACF,CAEJ,CACF,EAEAN,EAAiB,YAAc,mBAC/B,IAAOiB,EAAQjB",
|
|
6
|
+
"names": ["jsx", "React", "cn", "Container", "useAnchorPosition", "AnchorNavigation", "className", "data", "props", "ref", "activeId", "item", "containerRef", "sectionRefs", "autoScrollToActiveItem", "activeIdIndex", "curRef", "container", "button", "scrollLeft", "index", "el", "AnchorNavigation_default"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useState as f,useEffect as u}from"react";import{debounce as a}from"es-toolkit";const w=(o,t=100)=>{const[i,s]=f("");return u(()=>{const n=()=>{const d=Math.ceil(window.scrollY+t+10);for(let e=o.length-1;e>=0;e--){const c=document.getElementById(o[e]);if(c){const r=Math.ceil(c.getBoundingClientRect().top+window.scrollY);if(console.log(r,"offsetTop"),d>=r){s(o[e]);break}}}};n();const l=a(n,50);return window.addEventListener("scroll",l),()=>{window.removeEventListener("scroll",l)}},[o,t]),i};var p=w;export{p as default};
|
|
2
|
+
//# sourceMappingURL=useAnchorPosition.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/biz-components/AnchorNavigation/useAnchorPosition.tsx"],
|
|
4
|
+
"sourcesContent": ["import { useState, useEffect } from 'react'\nimport { debounce } from 'es-toolkit'\n\nconst useAnchorPosition = (sectionIds: string[], offset = 100) => {\n const [activeId, setActiveId] = useState('')\n\n useEffect(() => {\n const handleScroll = () => {\n const scrollPosition = Math.ceil(window.scrollY + offset + 10)\n\n // \u904D\u5386\u6240\u6709section\uFF0C\u627E\u5230\u5F53\u524D\u53EF\u89C6\u533A\u57DF\u5185\u7684section\n for (let i = sectionIds.length - 1; i >= 0; i--) {\n const section = document.getElementById(sectionIds[i])\n if (section) {\n const offsetTop = Math.ceil(section.getBoundingClientRect().top + window.scrollY)\n console.log(offsetTop, 'offsetTop')\n if (scrollPosition >= offsetTop) {\n setActiveId(sectionIds[i])\n break\n }\n }\n }\n }\n\n // \u521D\u59CB\u5316\u65F6\u6267\u884C\u4E00\u6B21\n handleScroll()\n\n // \u521B\u5EFAdebounce\u51FD\u6570\u5E76\u4FDD\u5B58\u5F15\u7528\uFF0C\u786E\u4FDD\u80FD\u6B63\u786E\u79FB\u9664\u76D1\u542C\u5668\n const debouncedHandleScroll = debounce(handleScroll, 50)\n window.addEventListener('scroll', debouncedHandleScroll)\n\n return () => {\n window.removeEventListener('scroll', debouncedHandleScroll)\n }\n }, [sectionIds, offset])\n\n return activeId\n}\n\nexport default useAnchorPosition\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,YAAAA,EAAU,aAAAC,MAAiB,QACpC,OAAS,YAAAC,MAAgB,aAEzB,MAAMC,EAAoB,CAACC,EAAsBC,EAAS,MAAQ,CAChE,KAAM,CAACC,EAAUC,CAAW,EAAIP,EAAS,EAAE,EAE3C,OAAAC,EAAU,IAAM,CACd,MAAMO,EAAe,IAAM,CACzB,MAAMC,EAAiB,KAAK,KAAK,OAAO,QAAUJ,EAAS,EAAE,EAG7D,QAASK,EAAIN,EAAW,OAAS,EAAGM,GAAK,EAAGA,IAAK,CAC/C,MAAMC,EAAU,SAAS,eAAeP,EAAWM,CAAC,CAAC,EACrD,GAAIC,EAAS,CACX,MAAMC,EAAY,KAAK,KAAKD,EAAQ,sBAAsB,EAAE,IAAM,OAAO,OAAO,EAEhF,GADA,QAAQ,IAAIC,EAAW,WAAW,EAC9BH,GAAkBG,EAAW,CAC/BL,EAAYH,EAAWM,CAAC,CAAC,EACzB,KACF,CACF,CACF,CACF,EAGAF,EAAa,EAGb,MAAMK,EAAwBX,EAASM,EAAc,EAAE,EACvD,cAAO,iBAAiB,SAAUK,CAAqB,EAEhD,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAqB,CAC5D,CACF,EAAG,CAACT,EAAYC,CAAM,CAAC,EAEhBC,CACT,EAEA,IAAOQ,EAAQX",
|
|
6
|
+
"names": ["useState", "useEffect", "debounce", "useAnchorPosition", "sectionIds", "offset", "activeId", "setActiveId", "handleScroll", "scrollPosition", "i", "section", "offsetTop", "debouncedHandleScroll", "useAnchorPosition_default"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{jsx as t,jsxs as p}from"react/jsx-runtime";import{forwardRef as
|
|
1
|
+
"use client";import{jsx as t,jsxs as p}from"react/jsx-runtime";import{forwardRef as k,useEffect as w,useRef as f,useState as N,useImperativeHandle as E}from"react";import{cn as i}from"../../helpers/utils.js";import x from"../../components/picture.js";import{withLayout as q}from"../../shared/Styles.js";import{useMediaQuery as M}from"react-responsive";import{useExposure as B}from"../../hooks/useExposure.js";import{Swiper as S,SwiperSlide as I}from"swiper/react";import{Pagination as j,FreeMode as A,Mousewheel as P}from"swiper/modules";import T from"../Title/index.js";const L="copy",H="store_benefits",D=(e,a)=>{const r=[];for(let o=0;o<e.length;o+=a)r.push(e.slice(o,o+a));return r},y=k(({data:{items:e=[],title:a},className:r},o)=>{const[d,g]=N(!1),c=M({query:"(max-width: 768px)"}),m=f(null),n=f(null);E(o,()=>n.current),B(n,{componentType:L,componentName:H}),w(()=>{g(c)},[c]);const b=d?D(e,3):e;return p("div",{ref:n,className:i("brand-equity-wrapper w-full",r),children:[a&&t(T,{data:{title:a}}),d?p(S,{className:i(r),modules:[A,P,j],freeMode:!0,mousewheel:{forceToAxis:!0},pagination:{clickable:!0,el:m.current},breakpoints:{0:{spaceBetween:12}},children:[b?.map((l,s)=>t(I,{className:"!flex flex-col gap-3",children:Array.isArray(l)&&l?.map((h,u)=>t(v,{data:h,index:u},u))},"SwiperSlide"+s)),t("div",{ref:m,className:"mt-3 flex justify-center"})]}):t("div",{className:i("grid grid-cols-1 gap-3","tablet:grid-cols-2","laptop:gap-4 laptop:grid-cols-10"),children:e.map((l,s)=>t(v,{data:l,index:s},s))})]})}),v=({data:e,index:a})=>p("div",{className:i("brand-equity-item","box-border flex w-full flex-col bg-white p-4","desktop:p-6 justify-between","laptop:col-span-3 lg-desktop:p-8","laptop:h-[192px] lg-desktop:h-[240px] h-[160px]",{"laptop:col-span-4":[0,5,6,11].includes(a)},"rounded-box"),children:[p("div",{className:"lg-desktop:h-[36px] flex h-[30px] items-center justify-between gap-3",children:[t("h3",{className:"lg-desktop:text-[18px] desktop:text-[16px] text-[14px] font-bold leading-[1.2] tracking-[-0.02em] text-[#080A0F]",children:e.title}),e.type==="avatar"?t("div",{className:"flex -space-x-2",children:e?.avatarList?.map((r,o)=>t("div",{className:i("size-[30px] overflow-hidden rounded-full border-2 border-white","relative inline-block","lg-desktop:size-[36px]"),children:t(x,{source:r.avatar?.url,alt:r.avatar?.alt,className:"size-full object-cover"})},o))}):t(x,{className:"lg-desktop:h-[36px] h-[30px] shrink-0 object-cover",source:e.icon?.url,alt:e.icon?.alt,imgClassName:"w-full h-full object-cover"})]}),t("p",{className:"lg-desktop:text-[24px] line-clamp-3 text-[20px] font-bold leading-[1.2] tracking-[-0.04em] text-[#080A0F]",children:e.description})]});y.displayName="BrandEquity";var O=q(y,{style:"overflow: hidden;"});export{O as default};
|
|
2
2
|
//# sourceMappingURL=BrandEquity.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/biz-components/BrandEquity/BrandEquity.tsx"],
|
|
4
|
-
"sourcesContent": ["'use client'\nimport { forwardRef, useEffect, useRef, useState, useImperativeHandle } from 'react'\n\nimport { cn } from '../../helpers/utils.js'\nimport Picture from '../../components/picture.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport type { BrandEquityProps, BrandEquityItemProps } from './types.js'\n\nimport type { Img } from '../../types/props.js'\nimport { useMediaQuery } from 'react-responsive'\nimport { useExposure } from '../../hooks/useExposure.js'\n\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { Pagination, FreeMode, Mousewheel } from 'swiper/modules'\nimport Title from '../Title/index.js'\n\nconst componentType = 'copy'\nconst componentName = 'store_benefits'\n\nconst chunkArray = (arr: BrandEquityItemProps[], size: number) => {\n const chunks = []\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n return chunks\n}\n\nconst BrandEquity = forwardRef<HTMLDivElement, BrandEquityProps>(({ data: { items = [], title }, className }, ref) => {\n const [isMobile, setIsMobile] = useState(false)\n const mediaQuery = useMediaQuery({ query: '(max-width: 768px)' })\n const paginationRef = useRef<HTMLDivElement>(null)\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n useExposure(innerRef, {\n componentType,\n componentName,\n })\n\n useEffect(() => {\n setIsMobile(mediaQuery)\n }, [mediaQuery])\n\n const itemsArray = isMobile ? chunkArray(items, 3) : items\n return (\n <div ref={innerRef} className={cn('brand-equity-wrapper w-full', className)}>\n {title && <Title data={{ title: title }} />}\n {isMobile ? (\n <Swiper\n className={cn(className)}\n modules={[FreeMode, Mousewheel, Pagination]}\n freeMode={true}\n mousewheel={{\n forceToAxis: true,\n }}\n pagination={{\n clickable: true,\n el: paginationRef.current,\n }}\n breakpoints={{\n 0: {\n spaceBetween: 12,\n },\n }}\n >\n {itemsArray?.map((item, jIndex) => (\n <SwiperSlide key={'SwiperSlide' + jIndex} className=\"!flex flex-col gap-3\">\n {Array.isArray(item) &&\n item?.map((item, index) => <BrandEquityItem key={index} data={item} index={index} />)}\n </SwiperSlide>\n ))}\n <div ref={paginationRef} className=\"mt-3 flex justify-center\"></div>\n </Swiper>\n ) : (\n <div className={cn('grid grid-cols-1 gap-3', 'tablet:grid-cols-2', 'laptop:gap-4 laptop:grid-cols-10')}>\n {items.map((item, index) => (\n <BrandEquityItem key={index} data={item} index={index} />\n ))}\n </div>\n )}\n </div>\n )\n})\n\nconst BrandEquityItem = ({ data, index }: { data: BrandEquityItemProps; index: number }) => {\n return (\n <div\n className={cn(\n 'brand-equity-item',\n 'box-border flex w-full flex-col bg-white p-4',\n 'desktop:p-6 justify-between',\n 'laptop:col-span-3 lg-desktop:p-8',\n 'laptop:h-[192px] lg-desktop:h-[240px] h-[160px]',\n {\n ['laptop:col-span-4']: [0, 5, 6, 11].includes(index),\n },\n 'rounded-box'\n )}\n >\n <div className=\"lg-desktop:h-[36px] flex h-[30px] items-center justify-between gap-3\">\n <h3 className=\"lg-desktop:text-[18px] desktop:text-[16px] text-[14px] font-bold leading-[1.2] tracking-[-0.02em] text-[#080A0F]\">\n {data.title}\n </h3>\n {data.type === 'avatar' ? (\n <div className=\"flex -space-x-2\">\n {data?.avatarList?.map((item: { avatar: Img }, index: number) => (\n <div\n key={index}\n className={cn(\n 'size-[30px] overflow-hidden rounded-full border-2 border-white',\n 'relative inline-block',\n 'lg-desktop:size-[36px]'\n )}\n >\n <Picture source={item.avatar?.url} alt={item.avatar?.alt} className=\"size-full object-cover\" />\n </div>\n ))}\n </div>\n ) : (\n <Picture\n className=\"lg-desktop:h-[36px] h-[30px] shrink-0 object-cover\"\n source={data.icon?.url}\n alt={data.icon?.alt}\n imgClassName=\"w-full h-full object-cover\"\n />\n )}\n </div>\n <p className=\"lg-desktop:text-[24px] line-clamp-3 text-[20px] font-bold leading-[1.2] tracking-[-0.04em] text-[#080A0F]\">\n {data.description}\n </p>\n </div>\n )\n}\n\nexport default withLayout(BrandEquity, { style: 'overflow: hidden;' })\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["'use client'\nimport { forwardRef, useEffect, useRef, useState, useImperativeHandle } from 'react'\n\nimport { cn } from '../../helpers/utils.js'\nimport Picture from '../../components/picture.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport type { BrandEquityProps, BrandEquityItemProps } from './types.js'\n\nimport type { Img } from '../../types/props.js'\nimport { useMediaQuery } from 'react-responsive'\nimport { useExposure } from '../../hooks/useExposure.js'\n\nimport { Swiper, SwiperSlide } from 'swiper/react'\nimport { Pagination, FreeMode, Mousewheel } from 'swiper/modules'\nimport Title from '../Title/index.js'\n\nconst componentType = 'copy'\nconst componentName = 'store_benefits'\n\nconst chunkArray = (arr: BrandEquityItemProps[], size: number) => {\n const chunks = []\n for (let i = 0; i < arr.length; i += size) {\n chunks.push(arr.slice(i, i + size))\n }\n return chunks\n}\n\nconst BrandEquity = forwardRef<HTMLDivElement, BrandEquityProps>(({ data: { items = [], title }, className }, ref) => {\n const [isMobile, setIsMobile] = useState(false)\n const mediaQuery = useMediaQuery({ query: '(max-width: 768px)' })\n const paginationRef = useRef<HTMLDivElement>(null)\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n useExposure(innerRef, {\n componentType,\n componentName,\n })\n\n useEffect(() => {\n setIsMobile(mediaQuery)\n }, [mediaQuery])\n\n const itemsArray = isMobile ? chunkArray(items, 3) : items\n return (\n <div ref={innerRef} className={cn('brand-equity-wrapper w-full', className)}>\n {title && <Title data={{ title: title }} />}\n {isMobile ? (\n <Swiper\n className={cn(className)}\n modules={[FreeMode, Mousewheel, Pagination]}\n freeMode={true}\n mousewheel={{\n forceToAxis: true,\n }}\n pagination={{\n clickable: true,\n el: paginationRef.current,\n }}\n breakpoints={{\n 0: {\n spaceBetween: 12,\n },\n }}\n >\n {itemsArray?.map((item, jIndex) => (\n <SwiperSlide key={'SwiperSlide' + jIndex} className=\"!flex flex-col gap-3\">\n {Array.isArray(item) &&\n item?.map((item, index) => <BrandEquityItem key={index} data={item} index={index} />)}\n </SwiperSlide>\n ))}\n <div ref={paginationRef} className=\"mt-3 flex justify-center\"></div>\n </Swiper>\n ) : (\n <div className={cn('grid grid-cols-1 gap-3', 'tablet:grid-cols-2', 'laptop:gap-4 laptop:grid-cols-10')}>\n {items.map((item, index) => (\n <BrandEquityItem key={index} data={item} index={index} />\n ))}\n </div>\n )}\n </div>\n )\n})\n\nconst BrandEquityItem = ({ data, index }: { data: BrandEquityItemProps; index: number }) => {\n return (\n <div\n className={cn(\n 'brand-equity-item',\n 'box-border flex w-full flex-col bg-white p-4',\n 'desktop:p-6 justify-between',\n 'laptop:col-span-3 lg-desktop:p-8',\n 'laptop:h-[192px] lg-desktop:h-[240px] h-[160px]',\n {\n ['laptop:col-span-4']: [0, 5, 6, 11].includes(index),\n },\n 'rounded-box'\n )}\n >\n <div className=\"lg-desktop:h-[36px] flex h-[30px] items-center justify-between gap-3\">\n <h3 className=\"lg-desktop:text-[18px] desktop:text-[16px] text-[14px] font-bold leading-[1.2] tracking-[-0.02em] text-[#080A0F]\">\n {data.title}\n </h3>\n {data.type === 'avatar' ? (\n <div className=\"flex -space-x-2\">\n {data?.avatarList?.map((item: { avatar: Img }, index: number) => (\n <div\n key={index}\n className={cn(\n 'size-[30px] overflow-hidden rounded-full border-2 border-white',\n 'relative inline-block',\n 'lg-desktop:size-[36px]'\n )}\n >\n <Picture source={item.avatar?.url} alt={item.avatar?.alt} className=\"size-full object-cover\" />\n </div>\n ))}\n </div>\n ) : (\n <Picture\n className=\"lg-desktop:h-[36px] h-[30px] shrink-0 object-cover\"\n source={data.icon?.url}\n alt={data.icon?.alt}\n imgClassName=\"w-full h-full object-cover\"\n />\n )}\n </div>\n <p className=\"lg-desktop:text-[24px] line-clamp-3 text-[20px] font-bold leading-[1.2] tracking-[-0.04em] text-[#080A0F]\">\n {data.description}\n </p>\n </div>\n )\n}\nBrandEquity.displayName = 'BrandEquity'\n\nexport default withLayout(BrandEquity, { style: 'overflow: hidden;' })\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["jsx", "jsxs", "forwardRef", "useEffect", "useRef", "useState", "useImperativeHandle", "cn", "Picture", "withLayout", "useMediaQuery", "useExposure", "Swiper", "SwiperSlide", "Pagination", "FreeMode", "Mousewheel", "Title", "componentType", "componentName", "chunkArray", "arr", "size", "chunks", "i", "BrandEquity", "items", "title", "className", "ref", "isMobile", "setIsMobile", "mediaQuery", "paginationRef", "innerRef", "itemsArray", "item", "jIndex", "index", "BrandEquityItem", "data", "BrandEquity_default"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* 产品标签接口
|
|
4
|
+
*/
|
|
5
|
+
export interface ProductTag {
|
|
6
|
+
/** 标签文本 */
|
|
7
|
+
text: string;
|
|
8
|
+
/** 标签类型 */
|
|
9
|
+
type?: 'discount' | 'new' | 'default';
|
|
10
|
+
/** 标签样式变体 */
|
|
11
|
+
variant?: 'filled' | 'outlined';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 免费赠品接口
|
|
15
|
+
*/
|
|
16
|
+
export interface FreeGift {
|
|
17
|
+
/** 赠品ID */
|
|
18
|
+
id: string;
|
|
19
|
+
/** 赠品图片URL */
|
|
20
|
+
image: string;
|
|
21
|
+
/** 赠品名称 */
|
|
22
|
+
name: string;
|
|
23
|
+
/** 原价 */
|
|
24
|
+
originalPrice: string;
|
|
25
|
+
/** 现价(通常为Free) */
|
|
26
|
+
currentPrice: string;
|
|
27
|
+
/** 是否为新品 */
|
|
28
|
+
isNew?: boolean;
|
|
29
|
+
/** 是否被选中 */
|
|
30
|
+
selected?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 产品卡片数据接口
|
|
34
|
+
*/
|
|
35
|
+
export interface ProductCardData {
|
|
36
|
+
/** 产品图片URL */
|
|
37
|
+
image: string;
|
|
38
|
+
/** 产品标签列表 */
|
|
39
|
+
tags?: ProductTag[];
|
|
40
|
+
/** 产品名称 */
|
|
41
|
+
name: string;
|
|
42
|
+
/** 产品描述 */
|
|
43
|
+
description: string;
|
|
44
|
+
/** 免费赠品说明文字 */
|
|
45
|
+
freeGiftLabel?: string;
|
|
46
|
+
/** 免费赠品列表 */
|
|
47
|
+
freeGifts?: FreeGift[];
|
|
48
|
+
/** 赠品选择模式:单选或多选 */
|
|
49
|
+
giftSelectionMode?: 'single' | 'multiple';
|
|
50
|
+
/** 当前价格 */
|
|
51
|
+
currentPrice: string;
|
|
52
|
+
/** 原价 */
|
|
53
|
+
originalPrice?: string;
|
|
54
|
+
/** Learn More按钮文本 */
|
|
55
|
+
learnMoreText?: string;
|
|
56
|
+
/** Shop Now按钮文本 */
|
|
57
|
+
shopNowText?: string;
|
|
58
|
+
}
|
|
59
|
+
export interface ProductCardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
60
|
+
/** 产品数据 */
|
|
61
|
+
data: ProductCardData;
|
|
62
|
+
/** 布局模式:一排一个或一排两个 */
|
|
63
|
+
layout?: 'single' | 'double';
|
|
64
|
+
/** 产品卡片点击事件 */
|
|
65
|
+
onProductClick?: (product: ProductCardData) => void;
|
|
66
|
+
/** 产品图片点击事件 */
|
|
67
|
+
onProductImageClick?: (product: ProductCardData) => void;
|
|
68
|
+
/** Learn More按钮点击事件 */
|
|
69
|
+
onLearnMore?: (product: ProductCardData) => void;
|
|
70
|
+
/** Shop Now按钮点击事件 */
|
|
71
|
+
onShopNow?: (product: ProductCardData) => void;
|
|
72
|
+
/** 赠品点击事件 */
|
|
73
|
+
onGiftClick?: (gift: FreeGift, product: ProductCardData) => void;
|
|
74
|
+
/** 赠品选择变化事件 */
|
|
75
|
+
onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* ProductCard - 买赠货架产品卡片
|
|
79
|
+
*
|
|
80
|
+
* @description 用于买一赠一活动的产品展示卡片,左侧展示产品图片和标签,右侧展示产品信息、赠品和购买按钮
|
|
81
|
+
*/
|
|
82
|
+
declare const ProductCard: React.ForwardRefExoticComponent<ProductCardProps & React.RefAttributes<HTMLDivElement>>;
|
|
83
|
+
export default ProductCard;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{jsx as t,jsxs as n}from"react/jsx-runtime";import*as g from"react";import{cn as r}from"../../helpers/index.js";import x from"../../components/picture.js";import u from"../../components/button.js";import{Text as d}from"../../components/text.js";import{Heading as H}from"../../components/heading.js";import b from"../../components/badge.js";const v=i=>i.type==="discount"||i.type==="new"?i.variant==="outlined"?"border-[1.6px] border-brand-0 text-brand-0 bg-container-primary":"bg-brand-0 text-info-white border-none":"bg-info-primary text-info-white border-none",w=g.forwardRef(({image:i,name:e,tags:a,layout:l="single",className:o,onClick:s},c)=>n("div",{ref:c,className:r("rounded-l-box laptop:rounded-l-box tablet:rounded-t-box tablet:rounded-r-none relative flex items-start gap-6 overflow-hidden p-6",l==="single"?"w-[964px]":"w-[482px]",l==="single"?" tablet:w-full tablet:p-4":"",s?"cursor-pointer":"",o),onClick:s,children:[t(x,{source:i,alt:e,className:"absolute inset-0 w-full max-w-none",imgClassName:"h-full object-cover"}),a&&a.length>0&&t("div",{className:"relative z-10 flex flex-wrap items-start gap-1",children:a.map((f,p)=>t(b,{size:"lg",className:r(v(f),"tracking-[-0.64px]","tablet:text-sm tablet:px-[6px] tablet:py-[3px] tablet:tracking-[-0.56px]"),children:f.text},p))})]}));w.displayName="ProductImage";const N=g.forwardRef(({name:i,description:e,layout:a="single",className:l},o)=>n("div",{ref:o,className:r("flex w-full flex-col gap-1",l),children:[t(H,{as:"h4",size:4,weight:"semibold",className:r("text-info-primary w-full text-2xl leading-[1.2] tracking-[-0.96px]","tablet:text-[20px] tablet:tracking-[-0.8px]"),children:i}),t(d,{size:4,weight:"semibold",className:r("text-info-primary w-full leading-[1.4] tracking-[-0.36px]","tablet:text-sm tablet:tracking-[-0.28px]"),children:e})]}));N.displayName="ProductInfo";const h=g.forwardRef(({gift:i,onClick:e,className:a},l)=>t("div",{ref:l,className:r("bg-container-primary rounded-box relative flex w-full cursor-pointer flex-col border-2 transition-all hover:shadow-sm",i.selected?"border-brand-0":"border-container-secondary-1",a),onClick:()=>e?.(i),children:n("div",{className:"flex w-full flex-col items-end",children:[i.isNew&&t("div",{className:"absolute right-0 top-0 flex items-start",children:t(b,{size:"lg",className:r(v({text:"New",type:"new",variant:"filled"}),"tracking-[-0.64px]"),children:"New"})}),n("div",{className:r("flex w-full items-center gap-4 p-4","tablet:p-2"),children:[t("div",{className:r("size-14 shrink-0","tablet:size-12"),children:t(x,{source:i.image,alt:i.name,className:"size-full object-cover"})}),n("div",{className:"flex min-w-0 flex-1 flex-col gap-1",children:[t(d,{size:4,weight:"semibold",className:r("text-info-primary truncate leading-[1.4] tracking-[-0.36px]","tablet:text-sm tablet:tracking-[-0.28px]"),children:i.name}),n("div",{className:"flex items-center gap-1",children:[t(d,{size:4,weight:"semibold",className:r(),children:i.currentPrice}),t(d,{size:4,weight:"semibold",className:r(),children:i.originalPrice})]})]})]})]})}));h.displayName="FreeGiftItem";const P=g.forwardRef(({freeGiftLabel:i,freeGifts:e,onGiftClick:a,layout:l="single",className:o},s)=>!e||e.length===0?null:n("div",{ref:s,className:r("flex w-full flex-col gap-2",o),children:[i&&t(d,{size:4,weight:"semibold",className:r("text-info-primary w-full leading-[1.4] tracking-[-0.36px]","tablet:text-sm tablet:tracking-[-0.28px]"),children:i}),t("div",{className:r("tablet:flex-row laptop:flex-col flex flex-col gap-2"),children:e.map((c,m)=>t("div",{children:t(h,{gift:c,onClick:a})},c.id||m))})]}));P.displayName="GiftSelection";const y=g.forwardRef(({currentPrice:i,originalPrice:e,learnMoreText:a="Learn More",shopNowText:l="Shop Now",onLearnMore:o,onShopNow:s,layout:c="single",className:m},f)=>n("div",{ref:f,className:r("flex w-full flex-col justify-center gap-2",m),children:[n("div",{className:"flex w-full items-center gap-1",children:[t(d,{size:4,weight:"semibold",className:r(),children:i}),e&&t(d,{size:4,weight:"semibold",className:r("line-through"),children:e})]}),n("div",{className:r("flex items-start gap-3","tablet:gap-2"),children:[t(u,{variant:"secondary",size:"lg",className:r("tablet:px-5 tablet:py-[10px] tablet:text-sm tablet:tracking-[-0.56px]"),onClick:o,children:a}),t(u,{variant:"primary",size:"lg",className:r("tablet:px-5 tablet:py-[10px] tablet:text-sm tablet:tracking-[-0.56px]"),onClick:s,children:l})]})]}));y.displayName="PriceAndActions";const k=g.forwardRef(({className:i,data:e,layout:a="single",onProductClick:l,onProductImageClick:o,onLearnMore:s,onShopNow:c,onGiftClick:m,onGiftSelectionChange:f,...p},C)=>{const T=a==="single"?"w-full max-w-[1664px]":"w-full",G=a==="single"?"w-[700px]":"w-[350px]",M=()=>{l?.(e)},z=()=>{o?.(e)},L=()=>{s?.(e)},D=()=>{c?.(e)},F=S=>{m?.(S,e)};return n("div",{ref:C,className:r("bg-container-primary laptop:flex-row rounded-box flex flex-col items-stretch",T,a==="single"?"tablet:flex-col tablet:max-w-[704px]":"",l?"cursor-pointer":"",i),onClick:M,...p,children:[t(w,{image:e.image,name:e.name,tags:e.tags,layout:a,onClick:z}),n("div",{className:r("bg-container-secondary-1 rounded-r-box laptop:rounded-r-box tablet:rounded-b-box tablet:rounded-l-none flex flex-col justify-between p-6",G,a==="single"?"tablet:w-full tablet:p-4 tablet:gap-4":""),children:[t(N,{name:e.name,description:e.description,layout:a}),t(P,{freeGiftLabel:e.freeGiftLabel,freeGifts:e.freeGifts,onGiftClick:F,layout:a}),t(y,{currentPrice:e.currentPrice,originalPrice:e.originalPrice,learnMoreText:e.learnMoreText,shopNowText:e.shopNowText,onLearnMore:L,onShopNow:D,layout:a})]})]})});k.displayName="ProductCard";var j=k;export{j as default};
|
|
2
|
+
//# sourceMappingURL=ProductCard.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/biz-components/BuyOneGetOneShelf/ProductCard.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport Picture from '../../components/picture.js'\nimport Button from '../../components/button.js'\nimport { Text } from '../../components/text.js'\nimport { Heading } from '../../components/heading.js'\nimport Badge from '../../components/badge.js'\n\n/**\n * \u4EA7\u54C1\u6807\u7B7E\u63A5\u53E3\n */\nexport interface ProductTag {\n /** \u6807\u7B7E\u6587\u672C */\n text: string\n /** \u6807\u7B7E\u7C7B\u578B */\n type?: 'discount' | 'new' | 'default'\n /** \u6807\u7B7E\u6837\u5F0F\u53D8\u4F53 */\n variant?: 'filled' | 'outlined'\n}\n\n/**\n * \u514D\u8D39\u8D60\u54C1\u63A5\u53E3\n */\nexport interface FreeGift {\n /** \u8D60\u54C1ID */\n id: string\n /** \u8D60\u54C1\u56FE\u7247URL */\n image: string\n /** \u8D60\u54C1\u540D\u79F0 */\n name: string\n /** \u539F\u4EF7 */\n originalPrice: string\n /** \u73B0\u4EF7\uFF08\u901A\u5E38\u4E3AFree\uFF09 */\n currentPrice: string\n /** \u662F\u5426\u4E3A\u65B0\u54C1 */\n isNew?: boolean\n /** \u662F\u5426\u88AB\u9009\u4E2D */\n selected?: boolean\n}\n\n/**\n * \u4EA7\u54C1\u5361\u7247\u6570\u636E\u63A5\u53E3\n */\nexport interface ProductCardData {\n /** \u4EA7\u54C1\u56FE\u7247URL */\n image: string\n /** \u4EA7\u54C1\u6807\u7B7E\u5217\u8868 */\n tags?: ProductTag[]\n /** \u4EA7\u54C1\u540D\u79F0 */\n name: string\n /** \u4EA7\u54C1\u63CF\u8FF0 */\n description: string\n /** \u514D\u8D39\u8D60\u54C1\u8BF4\u660E\u6587\u5B57 */\n freeGiftLabel?: string\n /** \u514D\u8D39\u8D60\u54C1\u5217\u8868 */\n freeGifts?: FreeGift[]\n /** \u8D60\u54C1\u9009\u62E9\u6A21\u5F0F\uFF1A\u5355\u9009\u6216\u591A\u9009 */\n giftSelectionMode?: 'single' | 'multiple'\n /** \u5F53\u524D\u4EF7\u683C */\n currentPrice: string\n /** \u539F\u4EF7 */\n originalPrice?: string\n /** Learn More\u6309\u94AE\u6587\u672C */\n learnMoreText?: string\n /** Shop Now\u6309\u94AE\u6587\u672C */\n shopNowText?: string\n}\n\nexport interface ProductCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4EA7\u54C1\u6570\u636E */\n data: ProductCardData\n /** \u5E03\u5C40\u6A21\u5F0F\uFF1A\u4E00\u6392\u4E00\u4E2A\u6216\u4E00\u6392\u4E24\u4E2A */\n layout?: 'single' | 'double'\n /** \u4EA7\u54C1\u5361\u7247\u70B9\u51FB\u4E8B\u4EF6 */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u4E8B\u4EF6 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onLearnMore?: (product: ProductCardData) => void\n /** Shop Now\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onShopNow?: (product: ProductCardData) => void\n /** \u8D60\u54C1\u70B9\u51FB\u4E8B\u4EF6 */\n onGiftClick?: (gift: FreeGift, product: ProductCardData) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u4E8B\u4EF6 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n}\n\n/**\n * \u83B7\u53D6\u6807\u7B7E\u6837\u5F0F\n */\nconst getTagStyles = (tag: ProductTag) => {\n if (tag.type === 'discount') {\n return tag.variant === 'outlined'\n ? 'border-[1.6px] border-brand-0 text-brand-0 bg-container-primary'\n : 'bg-brand-0 text-info-white border-none'\n }\n\n if (tag.type === 'new') {\n return tag.variant === 'outlined'\n ? 'border-[1.6px] border-brand-0 text-brand-0 bg-container-primary'\n : 'bg-brand-0 text-info-white border-none'\n }\n\n return 'bg-info-primary text-info-white border-none'\n}\n\n/**\n * ProductImage - \u4EA7\u54C1\u56FE\u7247\u533A\u57DF\n */\nconst ProductImage = React.forwardRef<\n HTMLDivElement,\n {\n image: string\n name: string\n tags?: ProductTag[]\n layout?: 'single' | 'double'\n className?: string\n onClick?: () => void\n }\n>(({ image, name, tags, layout = 'single', className, onClick }, ref) => {\n const imageWidth = layout === 'single' ? 'w-[964px]' : 'w-[482px]'\n\n return (\n <div\n ref={ref}\n className={cn(\n 'rounded-l-box laptop:rounded-l-box tablet:rounded-t-box tablet:rounded-r-none relative flex items-start gap-6 overflow-hidden p-6',\n imageWidth,\n // \u79FB\u52A8\u7AEF\u6837\u5F0F\n layout === 'single' ? ' tablet:w-full tablet:p-4' : '',\n onClick ? 'cursor-pointer' : '',\n className\n )}\n onClick={onClick}\n >\n {/* \u80CC\u666F\u56FE\u7247 */}\n\n <Picture\n source={image}\n alt={name}\n className=\"absolute inset-0 w-full max-w-none\"\n imgClassName=\"h-full object-cover\"\n />\n\n {/* \u4EA7\u54C1\u6807\u7B7E */}\n {tags && tags.length > 0 && (\n <div className=\"relative z-10 flex flex-wrap items-start gap-1\">\n {tags.map((tag, index) => (\n <Badge\n key={index}\n size=\"lg\"\n className={cn(\n getTagStyles(tag),\n 'tracking-[-0.64px]',\n 'tablet:text-sm tablet:px-[6px] tablet:py-[3px] tablet:tracking-[-0.56px]'\n )}\n >\n {tag.text}\n </Badge>\n ))}\n </div>\n )}\n </div>\n )\n})\n\nProductImage.displayName = 'ProductImage'\n\n/**\n * ProductInfo - \u4EA7\u54C1\u4FE1\u606F\u533A\u57DF\n */\nconst ProductInfo = React.forwardRef<\n HTMLDivElement,\n {\n name: string\n description: string\n layout?: 'single' | 'double'\n className?: string\n }\n>(({ name, description, layout = 'single', className }, ref) => {\n return (\n <div ref={ref} className={cn('flex w-full flex-col gap-1', className)}>\n <Heading\n as=\"h4\"\n size={4}\n weight=\"semibold\"\n className={cn(\n 'text-info-primary w-full text-2xl leading-[1.2] tracking-[-0.96px]',\n 'tablet:text-[20px] tablet:tracking-[-0.8px]'\n )}\n >\n {name}\n </Heading>\n <Text\n size={4}\n weight=\"semibold\"\n className={cn(\n 'text-info-primary w-full leading-[1.4] tracking-[-0.36px]',\n 'tablet:text-sm tablet:tracking-[-0.28px]'\n )}\n >\n {description}\n </Text>\n </div>\n )\n})\n\nProductInfo.displayName = 'ProductInfo'\n\n/**\n * FreeGiftItem - \u514D\u8D39\u8D60\u54C1\u9879\n */\nconst FreeGiftItem = React.forwardRef<\n HTMLDivElement,\n {\n gift: FreeGift\n onClick?: (gift: FreeGift) => void\n className?: string\n }\n>(({ gift, onClick, className }, ref) => {\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-primary rounded-box relative flex w-full cursor-pointer flex-col border-2 transition-all hover:shadow-sm',\n gift.selected ? 'border-brand-0' : 'border-container-secondary-1',\n className\n )}\n onClick={() => onClick?.(gift)}\n >\n <div className=\"flex w-full flex-col items-end\">\n {gift.isNew && (\n <div className=\"absolute right-0 top-0 flex items-start\">\n <Badge\n size=\"lg\"\n className={cn(getTagStyles({ text: 'New', type: 'new', variant: 'filled' }), 'tracking-[-0.64px]')}\n >\n New\n </Badge>\n </div>\n )}\n <div className={cn('flex w-full items-center gap-4 p-4', 'tablet:p-2')}>\n <div className={cn('size-14 shrink-0', 'tablet:size-12')}>\n <Picture source={gift.image} alt={gift.name} className=\"size-full object-cover\" />\n </div>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Text\n size={4}\n weight=\"semibold\"\n className={cn(\n 'text-info-primary truncate leading-[1.4] tracking-[-0.36px]',\n 'tablet:text-sm tablet:tracking-[-0.28px]'\n )}\n >\n {gift.name}\n </Text>\n <div className=\"flex items-center gap-1\">\n <Text size={4} weight=\"semibold\" className={cn()}>\n {gift.currentPrice}\n </Text>\n <Text size={4} weight=\"semibold\" className={cn()}>\n {gift.originalPrice}\n </Text>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n})\n\nFreeGiftItem.displayName = 'FreeGiftItem'\n\n/**\n * GiftSelection - \u8D60\u54C1\u9009\u62E9\u533A\u57DF\n */\nconst GiftSelection = React.forwardRef<\n HTMLDivElement,\n {\n freeGiftLabel?: string\n freeGifts?: FreeGift[]\n onGiftClick?: (gift: FreeGift) => void\n layout?: 'single' | 'double'\n className?: string\n }\n>(({ freeGiftLabel, freeGifts, onGiftClick, layout = 'single', className }, ref) => {\n if (!freeGifts || freeGifts.length === 0) {\n return null\n }\n\n return (\n <div ref={ref} className={cn('flex w-full flex-col gap-2', className)}>\n {freeGiftLabel && (\n <Text\n size={4}\n weight=\"semibold\"\n className={cn(\n 'text-info-primary w-full leading-[1.4] tracking-[-0.36px]',\n 'tablet:text-sm tablet:tracking-[-0.28px]'\n )}\n >\n {freeGiftLabel}\n </Text>\n )}\n <div className={cn('tablet:flex-row laptop:flex-col flex flex-col gap-2')}>\n {freeGifts.map((gift, index) => (\n <div key={gift.id || index}>\n <FreeGiftItem gift={gift} onClick={onGiftClick} />\n </div>\n ))}\n </div>\n </div>\n )\n})\n\nGiftSelection.displayName = 'GiftSelection'\n\n/**\n * PriceAndActions - \u4EF7\u683C\u548C\u64CD\u4F5C\u533A\u57DF\n */\nconst PriceAndActions = React.forwardRef<\n HTMLDivElement,\n {\n currentPrice: string\n originalPrice?: string\n learnMoreText?: string\n shopNowText?: string\n onLearnMore?: () => void\n onShopNow?: () => void\n layout?: 'single' | 'double'\n className?: string\n }\n>(\n (\n {\n currentPrice,\n originalPrice,\n learnMoreText = 'Learn More',\n shopNowText = 'Shop Now',\n onLearnMore,\n onShopNow,\n layout = 'single',\n className,\n },\n ref\n ) => {\n return (\n <div ref={ref} className={cn('flex w-full flex-col justify-center gap-2', className)}>\n {/* \u4EF7\u683C */}\n <div className=\"flex w-full items-center gap-1\">\n <Text size={4} weight=\"semibold\" className={cn()}>\n {currentPrice}\n </Text>\n {originalPrice && (\n <Text size={4} weight=\"semibold\" className={cn('line-through')}>\n {originalPrice}\n </Text>\n )}\n </div>\n\n {/* \u6309\u94AE\u7EC4 */}\n <div className={cn('flex items-start gap-3', 'tablet:gap-2')}>\n <Button\n variant=\"secondary\"\n size=\"lg\"\n className={cn('tablet:px-5 tablet:py-[10px] tablet:text-sm tablet:tracking-[-0.56px]')}\n onClick={onLearnMore}\n >\n {learnMoreText}\n </Button>\n <Button\n variant=\"primary\"\n size=\"lg\"\n className={cn('tablet:px-5 tablet:py-[10px] tablet:text-sm tablet:tracking-[-0.56px]')}\n onClick={onShopNow}\n >\n {shopNowText}\n </Button>\n </div>\n </div>\n )\n }\n)\n\nPriceAndActions.displayName = 'PriceAndActions'\n\n/**\n * ProductCard - \u4E70\u8D60\u8D27\u67B6\u4EA7\u54C1\u5361\u7247\n *\n * @description \u7528\u4E8E\u4E70\u4E00\u8D60\u4E00\u6D3B\u52A8\u7684\u4EA7\u54C1\u5C55\u793A\u5361\u7247\uFF0C\u5DE6\u4FA7\u5C55\u793A\u4EA7\u54C1\u56FE\u7247\u548C\u6807\u7B7E\uFF0C\u53F3\u4FA7\u5C55\u793A\u4EA7\u54C1\u4FE1\u606F\u3001\u8D60\u54C1\u548C\u8D2D\u4E70\u6309\u94AE\n */\nconst ProductCard = React.forwardRef<HTMLDivElement, ProductCardProps>(\n (\n {\n className,\n data,\n layout = 'single',\n onProductClick,\n onProductImageClick,\n onLearnMore,\n onShopNow,\n onGiftClick,\n onGiftSelectionChange,\n ...props\n },\n ref\n ) => {\n const containerWidth = layout === 'single' ? 'w-full max-w-[1664px]' : 'w-full'\n const contentWidth = layout === 'single' ? 'w-[700px]' : 'w-[350px]'\n\n const handleProductClick = () => {\n onProductClick?.(data)\n }\n\n const handleProductImageClick = () => {\n onProductImageClick?.(data)\n }\n\n const handleLearnMoreClick = () => {\n onLearnMore?.(data)\n }\n\n const handleShopNowClick = () => {\n onShopNow?.(data)\n }\n\n const handleGiftClick = (gift: FreeGift) => {\n onGiftClick?.(gift, data)\n }\n\n return (\n <div\n ref={ref}\n className={cn(\n 'bg-container-primary laptop:flex-row rounded-box flex flex-col items-stretch',\n containerWidth,\n layout === 'single' ? 'tablet:flex-col tablet:max-w-[704px]' : '',\n onProductClick ? 'cursor-pointer' : '',\n className\n )}\n onClick={handleProductClick}\n {...props}\n >\n {/* \u4EA7\u54C1\u56FE\u7247\u533A\u57DF */}\n <ProductImage\n image={data.image}\n name={data.name}\n tags={data.tags}\n layout={layout}\n onClick={handleProductImageClick}\n />\n\n {/* \u4EA7\u54C1\u4FE1\u606F\u533A\u57DF */}\n <div\n className={cn(\n 'bg-container-secondary-1 rounded-r-box laptop:rounded-r-box tablet:rounded-b-box tablet:rounded-l-none flex flex-col justify-between p-6',\n contentWidth,\n // \u79FB\u52A8\u7AEF\u6837\u5F0F\n layout === 'single' ? 'tablet:w-full tablet:p-4 tablet:gap-4' : ''\n )}\n >\n {/* \u4EA7\u54C1\u6807\u9898\u548C\u63CF\u8FF0 */}\n <ProductInfo name={data.name} description={data.description} layout={layout} />\n\n {/* \u514D\u8D39\u8D60\u54C1\u533A\u57DF */}\n <GiftSelection\n freeGiftLabel={data.freeGiftLabel}\n freeGifts={data.freeGifts}\n onGiftClick={handleGiftClick}\n layout={layout}\n />\n\n {/* \u4EF7\u683C\u548C\u6309\u94AE\u533A\u57DF */}\n <PriceAndActions\n currentPrice={data.currentPrice}\n originalPrice={data.originalPrice}\n learnMoreText={data.learnMoreText}\n shopNowText={data.shopNowText}\n onLearnMore={handleLearnMoreClick}\n onShopNow={handleShopNowClick}\n layout={layout}\n />\n </div>\n </div>\n )\n }\n)\n\nProductCard.displayName = 'ProductCard'\n\nexport default ProductCard\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["jsx", "jsxs", "React", "cn", "Picture", "Button", "Text", "Heading", "Badge", "getTagStyles", "tag", "ProductImage", "image", "name", "tags", "layout", "className", "onClick", "ref", "index", "ProductInfo", "description", "FreeGiftItem", "gift", "GiftSelection", "freeGiftLabel", "freeGifts", "onGiftClick", "PriceAndActions", "currentPrice", "originalPrice", "learnMoreText", "shopNowText", "onLearnMore", "onShopNow", "ProductCard", "data", "onProductClick", "onProductImageClick", "onGiftSelectionChange", "props", "containerWidth", "contentWidth", "handleProductClick", "handleProductImageClick", "handleLearnMoreClick", "handleShopNowClick", "handleGiftClick", "ProductCard_default"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type ProductCardData, type FreeGift } from './ProductCard.js';
|
|
3
|
+
export type BuyOneGetOneShelfSemanticName = 'root' | 'title' | 'description' | 'content' | 'productCard' | 'productCardImage' | 'productCardTitle' | 'productCardDescription' | 'productCardPrice' | 'productCardGiftsContainer' | 'productCardBtnGroup';
|
|
4
|
+
/**
|
|
5
|
+
* BuyOneGetOneShelf 业务组件数据接口
|
|
6
|
+
*/
|
|
7
|
+
export interface BuyOneGetOneShelfData {
|
|
8
|
+
/** 组件标题 */
|
|
9
|
+
title?: string;
|
|
10
|
+
/** 组件描述 */
|
|
11
|
+
description?: string;
|
|
12
|
+
/** 产品列表 */
|
|
13
|
+
products?: ProductCardData[];
|
|
14
|
+
/** 布局模式:一排一个或一排两个 */
|
|
15
|
+
layout?: 'single' | 'double';
|
|
16
|
+
}
|
|
17
|
+
export interface BuyOneGetOneShelfProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
18
|
+
/** 业务数据 */
|
|
19
|
+
data: BuyOneGetOneShelfData;
|
|
20
|
+
/** 产品卡片点击事件 */
|
|
21
|
+
onProductClick?: (product: ProductCardData) => void;
|
|
22
|
+
/** 产品图片点击事件 */
|
|
23
|
+
onProductImageClick?: (product: ProductCardData) => void;
|
|
24
|
+
/** Learn More按钮点击事件 */
|
|
25
|
+
onLearnMore?: (product: ProductCardData) => void;
|
|
26
|
+
/** Shop Now按钮点击事件 */
|
|
27
|
+
onShopNow?: (product: ProductCardData) => void;
|
|
28
|
+
/** 赠品点击事件 */
|
|
29
|
+
onGiftClick?: (gift: FreeGift, product: ProductCardData) => void;
|
|
30
|
+
/** 赠品选择变化事件 */
|
|
31
|
+
onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void;
|
|
32
|
+
classNames?: Partial<Record<BuyOneGetOneShelfSemanticName, string>>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* BuyOneGetOneShelf - 买赠货架
|
|
36
|
+
*
|
|
37
|
+
* @description 这是一个买主商品赠送赠品的活动组件,展示产品卡片,支持一排一个或一排两个的布局
|
|
38
|
+
*/
|
|
39
|
+
declare const BuyOneGetOneShelf: React.ForwardRefExoticComponent<BuyOneGetOneShelfProps & React.RefAttributes<HTMLDivElement>>;
|
|
40
|
+
export default BuyOneGetOneShelf;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use client";import{jsx as o,jsxs as g}from"react/jsx-runtime";import*as P from"react";import{cn as e}from"../../helpers/index.js";import O from"./ProductCard.js";const i=P.forwardRef(({className:d,classNames:r={},data:t,onProductClick:n,onProductImageClick:c,onLearnMore:l,onShopNow:p,onGiftClick:u,onGiftSelectionChange:f,...s},C)=>{const{products:m=[],layout:a="single"}=t;return g("div",{ref:C,className:e("w-full px-32 py-0",d,r?.root),...s,children:[t.title&&o("h2",{className:e("mb-4 text-2xl font-bold",r?.title),children:t.title}),t.description&&o("p",{className:e("mb-6 text-gray-600",r?.description),children:t.description}),o("div",{className:e("flex flex-wrap",a==="single"?"flex-col gap-6":"flex-row gap-6"),children:m.map((y,G)=>o(O,{data:y,layout:a,onProductClick:n,onProductImageClick:c,onLearnMore:l,onShopNow:p,onGiftClick:u,onGiftSelectionChange:f},G))})]})});i.displayName="BuyOneGetOneShelf";var D=i;export{D as default};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/biz-components/BuyOneGetOneShelf/index.tsx"],
|
|
4
|
+
"sourcesContent": ["'use client'\n\nimport * as React from 'react'\nimport { cn } from '../../helpers/index.js'\nimport ProductCard, { type ProductCardData, type FreeGift } from './ProductCard.js'\n\nexport type BuyOneGetOneShelfSemanticName =\n | 'root'\n | 'title'\n | 'description'\n | 'content'\n | 'productCard'\n | 'productCardImage'\n | 'productCardTitle'\n | 'productCardDescription'\n | 'productCardPrice'\n | 'productCardGiftsContainer'\n | 'productCardBtnGroup'\n\n/**\n * BuyOneGetOneShelf \u4E1A\u52A1\u7EC4\u4EF6\u6570\u636E\u63A5\u53E3\n */\nexport interface BuyOneGetOneShelfData {\n /** \u7EC4\u4EF6\u6807\u9898 */\n title?: string\n /** \u7EC4\u4EF6\u63CF\u8FF0 */\n description?: string\n /** \u4EA7\u54C1\u5217\u8868 */\n products?: ProductCardData[]\n /** \u5E03\u5C40\u6A21\u5F0F\uFF1A\u4E00\u6392\u4E00\u4E2A\u6216\u4E00\u6392\u4E24\u4E2A */\n layout?: 'single' | 'double'\n}\n\nexport interface BuyOneGetOneShelfProps extends React.HTMLAttributes<HTMLDivElement> {\n /** \u4E1A\u52A1\u6570\u636E */\n data: BuyOneGetOneShelfData\n /** \u4EA7\u54C1\u5361\u7247\u70B9\u51FB\u4E8B\u4EF6 */\n onProductClick?: (product: ProductCardData) => void\n /** \u4EA7\u54C1\u56FE\u7247\u70B9\u51FB\u4E8B\u4EF6 */\n onProductImageClick?: (product: ProductCardData) => void\n /** Learn More\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onLearnMore?: (product: ProductCardData) => void\n /** Shop Now\u6309\u94AE\u70B9\u51FB\u4E8B\u4EF6 */\n onShopNow?: (product: ProductCardData) => void\n /** \u8D60\u54C1\u70B9\u51FB\u4E8B\u4EF6 */\n onGiftClick?: (gift: FreeGift, product: ProductCardData) => void\n /** \u8D60\u54C1\u9009\u62E9\u53D8\u5316\u4E8B\u4EF6 */\n onGiftSelectionChange?: (selectedGifts: FreeGift[], product: ProductCardData) => void\n classNames?: Partial<Record<BuyOneGetOneShelfSemanticName, string>>\n}\n\n/**\n * BuyOneGetOneShelf - \u4E70\u8D60\u8D27\u67B6\n *\n * @description \u8FD9\u662F\u4E00\u4E2A\u4E70\u4E3B\u5546\u54C1\u8D60\u9001\u8D60\u54C1\u7684\u6D3B\u52A8\u7EC4\u4EF6\uFF0C\u5C55\u793A\u4EA7\u54C1\u5361\u7247\uFF0C\u652F\u6301\u4E00\u6392\u4E00\u4E2A\u6216\u4E00\u6392\u4E24\u4E2A\u7684\u5E03\u5C40\n */\nconst BuyOneGetOneShelf = React.forwardRef<HTMLDivElement, BuyOneGetOneShelfProps>(\n (\n {\n className,\n classNames = {},\n data,\n onProductClick,\n onProductImageClick,\n onLearnMore,\n onShopNow,\n onGiftClick,\n onGiftSelectionChange,\n ...props\n },\n ref\n ) => {\n const { products = [], layout = 'single' } = data\n\n return (\n <div ref={ref} className={cn('w-full px-32 py-0', className, classNames?.root)} {...props}>\n {data.title && <h2 className={cn('mb-4 text-2xl font-bold', classNames?.title)}>{data.title}</h2>}\n {data.description && <p className={cn('mb-6 text-gray-600', classNames?.description)}>{data.description}</p>}\n\n {/* \u4E70\u8D60\u8D27\u67B6\u4EA7\u54C1\u533A\u57DF */}\n <div className={cn('flex flex-wrap', layout === 'single' ? 'flex-col gap-6' : 'flex-row gap-6')}>\n {products.map((product, index) => (\n <ProductCard\n key={index}\n data={product}\n layout={layout}\n onProductClick={onProductClick}\n onProductImageClick={onProductImageClick}\n onLearnMore={onLearnMore}\n onShopNow={onShopNow}\n onGiftClick={onGiftClick}\n onGiftSelectionChange={onGiftSelectionChange}\n />\n ))}\n </div>\n </div>\n )\n }\n)\n\nBuyOneGetOneShelf.displayName = 'BuyOneGetOneShelf'\nexport default BuyOneGetOneShelf\n"],
|
|
5
|
+
"mappings": "aA2EM,OACiB,OAAAA,EADjB,QAAAC,MAAA,oBAzEN,UAAYC,MAAW,QACvB,OAAS,MAAAC,MAAU,yBACnB,OAAOC,MAA0D,mBAoDjE,MAAMC,EAAoBH,EAAM,WAC9B,CACE,CACE,UAAAI,EACA,WAAAC,EAAa,CAAC,EACd,KAAAC,EACA,eAAAC,EACA,oBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,YAAAC,EACA,sBAAAC,EACA,GAAGC,CACL,EACAC,IACG,CACH,KAAM,CAAE,SAAAC,EAAW,CAAC,EAAG,OAAAC,EAAS,QAAS,EAAIV,EAE7C,OACEP,EAAC,OAAI,IAAKe,EAAK,UAAWb,EAAG,oBAAqBG,EAAWC,GAAY,IAAI,EAAI,GAAGQ,EACjF,UAAAP,EAAK,OAASR,EAAC,MAAG,UAAWG,EAAG,0BAA2BI,GAAY,KAAK,EAAI,SAAAC,EAAK,MAAM,EAC3FA,EAAK,aAAeR,EAAC,KAAE,UAAWG,EAAG,qBAAsBI,GAAY,WAAW,EAAI,SAAAC,EAAK,YAAY,EAGxGR,EAAC,OAAI,UAAWG,EAAG,iBAAkBe,IAAW,SAAW,iBAAmB,gBAAgB,EAC3F,SAAAD,EAAS,IAAI,CAACE,EAASC,IACtBpB,EAACI,EAAA,CAEC,KAAMe,EACN,OAAQD,EACR,eAAgBT,EAChB,oBAAqBC,EACrB,YAAaC,EACb,UAAWC,EACX,YAAaC,EACb,sBAAuBC,GARlBM,CASP,CACD,EACH,GACF,CAEJ,CACF,EAEAf,EAAkB,YAAc,oBAChC,IAAOgB,EAAQhB",
|
|
6
|
+
"names": ["jsx", "jsxs", "React", "cn", "ProductCard", "BuyOneGetOneShelf", "className", "classNames", "data", "onProductClick", "onProductImageClick", "onLearnMore", "onShopNow", "onGiftClick", "onGiftSelectionChange", "props", "ref", "products", "layout", "product", "index", "BuyOneGetOneShelf_default"]
|
|
7
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use client";import{jsx as a,jsxs as
|
|
1
|
+
"use client";import{jsx as a,jsxs as u}from"react/jsx-runtime";import w,{useImperativeHandle as I,useRef as c}from"react";import{cn as s}from"../../helpers/utils.js";import f from"../../components/picture.js";import{withLayout as N}from"../../shared/Styles.js";import _ from"../Title/index.js";import y from"./SwiperCategory.js";import{useExposure as v}from"../../hooks/useExposure.js";import{trackUrlRef as b}from"../../shared/trackUrlRef.js";import{Heading as $}from"../../components/heading.js";const l="image",m="category_banner",d=5,E=3,L=(e,o)=>{const t=[];for(let r=0;r<e.length;r+=o)t.push(e.slice(r,r+o));return t},S=({data:e,configuration:o})=>{const t=c(null);return v(t,{componentType:l,componentName:m,componentTitle:e?.name,position:o?.index+1}),u("div",{ref:t,className:s("tablet:h-[120px] laptop:h-[144px] desktop:h-[192px] lg-desktop:h-[240px]","tablet:p-3 laptop:p-4 desktop:p-6 lg-desktop:p-8","bg-container-secondary-1 hover:bg-info-white group box-border flex size-full cursor-pointer flex-col overflow-hidden duration-300",o?.shape==="round"?"rounded-2xl":"rounded-none"),children:[a("div",{className:"transition-all duration-300 group-hover:scale-110",children:a("a",{"aria-label":e?.name,href:b(e?.link,`${l}_${m}`),"data-headless-type-name":`${l}#${m}`,"data-headless-title-desc-button":`${e?.name}`,onClick:()=>o?.event?.primaryButton(e,o?.index),children:a(f,{alt:e?.image?.alt||"",source:e?.image?.url||"",className:"laptop:size-[88px] tablet:size-[72px] desktop:size-[116px] lg-desktop:size-[146px] m-auto flex justify-center object-cover [&_img]:h-full [&_img]:w-auto [&_img]:object-cover"})})}),a($,{as:"h3",className:"lg-desktop:text-[18px] text-info-primary box-border line-clamp-2 flex-1 text-center text-[14px] font-bold",children:e?.name})]})},T=({data:e,configuration:o,index:t,isFirstItemLarger:r})=>{const i=c(null);v(i,{componentType:l,componentName:m,componentTitle:e?.name,position:o?.index+1});const n=t===0;return u("div",{ref:i,className:s("bg-container-secondary-1 box-border flex w-full shrink-0 flex-col items-center justify-center overflow-hidden","hover:bg-info-white cursor-pointer duration-300",r?s("p-4",n?"aspect-h-[252] row-span-2":"aspect-h-[120]"):"max-h-[126px] px-3 py-4",o?.shape==="round"?"rounded-2xl":"rounded-none"),children:[a("a",{href:b(e?.link,`${l}_${m}`),"data-headless-type-name":`${l}#${m}`,"data-headless-title-desc-button":`${e?.name}`,"data-headless-nav-postion":`''#${o?.index+1}`,onClick:()=>o?.event?.primaryButton(e,o?.index+1),children:a(f,{source:e?.image?.url||"",alt:e?.image?.alt||"",className:s("m-auto mb-2 flex justify-center object-cover [&_img]:h-full [&_img]:w-auto [&_img]:object-cover",r?s(n?"max-h-[146px] overflow-hidden":"max-h-[72px] max-w-[72px]"):"size-[72px]")})}),a("p",{className:s("text-info-primary text-center text-sm font-bold",r?"line-clamp-2":"shrink-0 truncate"),children:e?.name})]})},M=({data:e,configuration:o})=>{const r=(o?.totalCategories??0)<=d;return a("div",{className:`gap-3 ${r?"grid grid-cols-2":"flex h-full flex-col"}`,children:e?.map((i,n)=>a(T,{index:n,data:i,configuration:o,isFirstItemLarger:r},n))})},k=w.forwardRef((e,o)=>{const{data:t,className:r="",key:i,event:n}=e,p=(t?.isShowSelect?t?.products:t?.productData)||[],g=p.length>d,h=p.length,C=L(p,g?E:d),x=c(null);return I(o,()=>x.current),u("div",{ref:x,className:s("w-full overflow-hidden",r,{"aiui-dark":t?.theme==="dark"}),children:[t?.title&&a(_,{data:{title:t?.title},className:"text-4xl"}),a("div",{className:"tablet:block hidden",children:a(y,{id:`Category${i}`,Slide:S,data:{list:p,configuration:{shape:t?.shape,event:n,title:t?.title,totalCategories:h}}})}),a("div",{className:"tablet:hidden block",children:a(y,{id:`Category1${i}`,Slide:M,data:{list:C,configuration:{shape:t?.shape,event:n,title:t?.title,totalCategories:h}},isHalf:g})}),a("div",{className:"h-7"})]})});k.displayName="Category";var O=N(k);export{O as default};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|