@swipefindercom/finder-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/finder-sdk.esm.js +11608 -0
  2. package/dist/finder-sdk.umd.js +1 -0
  3. package/dist/style.css +1 -0
  4. package/dist/types/components/CardList/CardList.d.ts +14 -0
  5. package/dist/types/components/CardWrapper/CardWrapper.d.ts +18 -0
  6. package/dist/types/components/CardWrapper/ImageWrapper/ImageWrapper.d.ts +18 -0
  7. package/dist/types/components/CardWrapper/VideoWrapper/VideoWrapper.d.ts +26 -0
  8. package/dist/types/components/CardsCounter/CardsCounter.d.ts +9 -0
  9. package/dist/types/components/Drawer/Drawer.d.ts +19 -0
  10. package/dist/types/components/FiltersButton/FiltersButton.d.ts +11 -0
  11. package/dist/types/components/FiltersDrawer/FiltersDrawer.d.ts +25 -0
  12. package/dist/types/components/HistoryButton/HistoryButton.d.ts +13 -0
  13. package/dist/types/components/HistoryDrawer/HistoryDrawer.d.ts +30 -0
  14. package/dist/types/components/HorizontalCtaTooltip/HorizontalCtaTooltip.d.ts +26 -0
  15. package/dist/types/components/Logo/Logo.d.ts +14 -0
  16. package/dist/types/components/Positioned/Positioned.d.ts +20 -0
  17. package/dist/types/components/SideArrowsButtons/SideArrowsButtons.d.ts +49 -0
  18. package/dist/types/components/SideEmojisButtons/SideEmojisButtons.d.ts +23 -0
  19. package/dist/types/components/Summary/Summary.d.ts +27 -0
  20. package/dist/types/components/SwipeTutorialOverlay/SwipeTutorialOverlay.d.ts +20 -0
  21. package/dist/types/components/SwipeableCard/SwipeableCard.d.ts +58 -0
  22. package/dist/types/components/SwipeableFeed/SwipeableFeed.d.ts +55 -0
  23. package/dist/types/components/VerticalCtaTooltip/VerticalCtaTooltip.d.ts +28 -0
  24. package/dist/types/components/VerticalEmojisButtons/VerticalEmojisButtons.d.ts +48 -0
  25. package/dist/types/components/VolumeControl/VolumeControl.d.ts +19 -0
  26. package/dist/types/containers/InteractiveFeed/InteractiveFeed.d.ts +42 -0
  27. package/dist/types/containers/MainBootstrap/MainBootstrap.d.ts +17 -0
  28. package/dist/types/containers/SwippingJourney/SwippingJourney.d.ts +21 -0
  29. package/dist/types/contexts/AppStateContext.d.ts +45 -0
  30. package/dist/types/contexts/DataContext.d.ts +32 -0
  31. package/dist/types/contexts/MonitoringContext.d.ts +23 -0
  32. package/dist/types/contexts/UIContext.d.ts +25 -0
  33. package/dist/types/contexts/index.d.ts +25 -0
  34. package/dist/types/guards/cardType.guard.d.ts +4 -0
  35. package/dist/types/sdk/SwipeFinderSDK.d.ts +28 -0
  36. package/dist/types/sdk/index.d.ts +20 -0
  37. package/dist/types/services/DataService.d.ts +16 -0
  38. package/dist/types/services/MonitorService.d.ts +17 -0
  39. package/dist/types/types/FeedUIConfig.d.ts +214 -0
  40. package/dist/types/types/api.d.ts +40 -0
  41. package/dist/types/types/card.d.ts +22 -0
  42. package/dist/types/types/category.d.ts +4 -0
  43. package/dist/types/types/swipe.d.ts +12 -0
  44. package/package.json +66 -0
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ ._card_doqsx_2{position:absolute;width:100%;height:100%;left:0;top:0;background-color:#fff;box-shadow:0 2px 8px #0003;overflow:hidden;transition:transform .3s ease;cursor:default;transform-origin:50% 100%;will-change:transform;z-index:1}._cardContent_doqsx_18{position:absolute;z-index:2;bottom:0;left:0;width:100%;height:100%;color:#fff}._gradientBottom_doqsx_29{position:absolute;z-index:1;bottom:0;left:0;width:100%;height:120px;background:linear-gradient(transparent,#000);pointer-events:none}._gradientTop_doqsx_41{position:absolute;z-index:1;top:0;left:0;width:100%;height:120px;background:linear-gradient(rgba(0,0,0,1),transparent);pointer-events:none}._cardName_doqsx_52{position:absolute;left:0;bottom:10%;font-weight:700;font-size:22px;padding:0 20px;text-shadow:1px 1px 2px rgba(0,0,0,.8);width:100%;text-align:left;white-space:pre-wrap}._image_trs4h_2{width:100%;height:100%;object-fit:cover}._videoContainer_119iz_3{width:100%;height:100%;position:relative;overflow:hidden}._cardVideo_119iz_10{width:100%;height:100%;object-fit:cover;position:absolute;top:0;left:0;z-index:1}._swipeableCard_14c6z_1{position:relative;width:100%;height:100%;will-change:transform,opacity;backface-visibility:hidden;-webkit-backface-visibility:hidden;touch-action:none;user-select:none;-webkit-user-select:none;pointer-events:auto}._swipeableCard_14c6z_1>*{pointer-events:none}._swipeableCard_14c6z_1 video,._swipeableCard_14c6z_1 img{pointer-events:none}._swipeHeadline_14c6z_25{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:24px;font-weight:700;color:#fff;z-index:200000}._ctaTooltip_1mai4_2{position:absolute;z-index:110;font-size:12px;top:0;right:-2px;background-color:#fff;color:#333;padding:10px 14px;border-radius:8px;font-weight:800;text-align:center;width:max-content;transition:opacity .3s ease;pointer-events:none;animation:_ctaTooltipBounce_1mai4_1 2s infinite;box-shadow:0 0 16px 1px #000;white-space:pre-line}._ctaTooltipArrow_1mai4_22{position:absolute;bottom:-8px;width:16px;height:16px;transform:translate(50%) rotate(45deg);z-index:0}@keyframes _ctaTooltipBounce_1mai4_1{0%,20%,50%,80%,to{transform:translateY(calc(-100% - 16px))}40%{transform:translateY(calc(-100% - 24px))}60%{transform:translateY(calc(-100% - 20px))}}._verticalEmojisButtons_14t5d_2{position:absolute;display:flex;flex-direction:column;align-items:center;z-index:100}._buttonContainer_14t5d_11{display:flex;flex-direction:column;align-items:center;justify-content:center;margin:8px 0}._button_14t5d_11{width:40px;height:40px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 2px 5px #0003;background-color:#fff;position:relative;-webkit-user-select:none;user-select:none;transition:transform .2s ease,background-color .2s ease;outline:none;border:none;-webkit-tap-highlight-color:transparent}._button_14t5d_11:focus,._button_14t5d_11:active{outline:none;border:none}._emojiIcon_14t5d_45{width:35px;height:35px;display:block;outline:none;pointer-events:none;position:relative;z-index:2}._buttonLabel_14t5d_56{white-space:pre-wrap;margin-top:5px}._buttonAnimation_14t5d_62{transform:scale(1.3);z-index:101;position:relative}._buttonAnimation_14t5d_62:before{content:"";position:absolute;top:-5px;left:-5px;right:-5px;bottom:-5px;border-radius:50%;border:5px solid rgba(255,255,255,.5);z-index:1}._buttonLikeAnimation_14t5d_80{background-color:#4cd964!important;transform:scale(1.3)!important}._buttonDislikeAnimation_14t5d_85{background-color:#ff3b30!important;transform:scale(1.3)!important}._buttonMaybeAnimation_14t5d_90{background-color:#fc0!important;transform:scale(1.3)!important}._buttonSeenAnimation_14t5d_95{background-color:#007aff!important;transform:scale(1.3)!important}._contrastMode_14t5d_101 ._buttonContainer_14t5d_11{display:flex;flex-direction:column;align-items:center;justify-content:center;margin:8px 0}._contrastModeButton_14t5d_109{background-color:#fffc!important;border:2px solid black!important;box-shadow:0 0 8px #00000080!important}._contrastModeButton_14t5d_109:hover{background-color:#fff!important}._contrastModeLabel_14t5d_119{color:#fff!important;text-shadow:1px 1px 3px black,-1px -1px 3px black,1px -1px 3px black,-1px 1px 3px black!important;font-weight:700!important;font-size:12px!important;text-align:center!important;display:block!important;margin-top:5px!important;text-transform:uppercase}._contrastModeLike_14t5d_130,._contrastModeDislike_14t5d_135,._contrastModeMaybe_14t5d_140,._contrastModeSeen_14t5d_145{color:#fff!important;filter:brightness(1.5)!important}._sideButtonsContainer_jjr9u_2{position:absolute;width:100%;height:100%;left:0;top:0;display:flex;justify-content:center;align-items:center;z-index:100;pointer-events:none}._sideButtonsWrapper_jjr9u_16{position:relative;width:100%;height:100%;display:grid;grid-template-columns:1fr auto 1fr;grid-template-rows:auto 1fr auto;padding:15px;box-sizing:border-box}._sideButtonContainer_jjr9u_28{display:flex;align-items:center;flex-direction:column;gap:4px}._sideButtonLeft_jjr9u_36{grid-column:1;grid-row:2;margin-right:auto;justify-self:start;align-self:center}._sideButtonRight_jjr9u_45{grid-column:3;grid-row:2;margin-left:auto;justify-self:end;align-self:center}._sideButtonTop_jjr9u_54{grid-column:2;grid-row:1;justify-self:center;align-self:start}._sideButtonBottom_jjr9u_62{grid-column:2;grid-row:3;justify-self:center;align-self:end}._sideButton_jjr9u_2{border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;border:2px solid rgba(255,255,255,.4);background-color:#ffffffb3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 12px #0000004d;transition:all .3s ease;-webkit-tap-highlight-color:transparent;pointer-events:auto;padding:0;margin:0;gap:4px}._sideButton_jjr9u_2:hover{border-color:#fff;background-color:#ffffffe6}._buttonContent_jjr9u_95{position:relative;display:flex;align-items:center;justify-content:center}._arrowWrapper_jjr9u_103,._emojiWrapper_jjr9u_104{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center}._arrowWrapper_jjr9u_103 svg{color:#000}._arrowRight_jjr9u_120{transform:rotate(0)}._arrowLeft_jjr9u_124{transform:rotate(180deg)}._arrowUp_jjr9u_128{transform:rotate(-90deg)}._arrowDown_jjr9u_132{transform:rotate(90deg)}._emojiIcon_jjr9u_137{pointer-events:none;user-select:none;-webkit-user-select:none}._buttonLabel_jjr9u_144{white-space:pre-wrap;text-align:center;color:#000;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;line-height:1.2;user-select:none;-webkit-user-select:none;margin-top:0}@keyframes _moveRight_jjr9u_1{0%{transform:rotate(0) translate(0);opacity:.7}10%{transform:rotate(0) translate(6px);opacity:1}15%{transform:rotate(0) translate(12px);opacity:1}20%{transform:rotate(0) translate(12px);opacity:1}25%{transform:rotate(0) translate(0);opacity:.7}25.01%,to{transform:rotate(0) translate(0);opacity:.7}}@keyframes _moveLeft_jjr9u_1{0%,24.99%{transform:rotate(180deg) translate(0);opacity:.7}25%{transform:rotate(180deg) translate(0);opacity:.7}35%{transform:rotate(180deg) translate(6px);opacity:1}40%{transform:rotate(180deg) translate(12px);opacity:1}45%{transform:rotate(180deg) translate(12px);opacity:1}50%{transform:rotate(180deg) translate(0);opacity:.7}50.01%,to{transform:rotate(180deg) translate(0);opacity:.7}}@keyframes _moveUp_jjr9u_1{0%,49.99%{transform:rotate(-90deg) translate(0);opacity:.7}50%{transform:rotate(-90deg) translate(0);opacity:.7}60%{transform:rotate(-90deg) translate(6px);opacity:1}65%{transform:rotate(-90deg) translate(12px);opacity:1}70%{transform:rotate(-90deg) translate(12px);opacity:1}75%{transform:rotate(-90deg) translate(0);opacity:.7}75.01%,to{transform:rotate(-90deg) translate(0);opacity:.7}}@keyframes _moveDown_jjr9u_1{0%,74.99%{transform:rotate(90deg) translate(0);opacity:.7}75%{transform:rotate(90deg) translate(0);opacity:.7}85%{transform:rotate(90deg) translate(6px);opacity:1}90%{transform:rotate(90deg) translate(12px);opacity:1}95%{transform:rotate(90deg) translate(12px);opacity:1}to{transform:rotate(90deg) translate(0);opacity:.7}}._sideButton_jjr9u_2.like-btn ._arrowWrapper_jjr9u_103 svg._arrowRight_jjr9u_120{animation:_moveRight_jjr9u_1 8s infinite}._sideButton_jjr9u_2.dislike-btn ._arrowWrapper_jjr9u_103 svg._arrowLeft_jjr9u_124{animation:_moveLeft_jjr9u_1 8s infinite}._sideButton_jjr9u_2.maybe-btn ._arrowWrapper_jjr9u_103 svg._arrowUp_jjr9u_128{animation:_moveUp_jjr9u_1 8s infinite}._sideButton_jjr9u_2.seen-btn ._arrowWrapper_jjr9u_103 svg._arrowDown_jjr9u_132{animation:_moveDown_jjr9u_1 8s infinite}._horizontalCtaTooltip_1slua_1{position:absolute;transform:translate(-50%) translateY(-25%);left:50%;padding:10px 15px;border-radius:6px;font-weight:500;text-align:center;z-index:100;transition:opacity .3s ease;box-shadow:0 2px 8px #0003;animation:_horizontalCtaTooltipPulse_1slua_1 2s infinite ease-in-out;white-space:pre-line;background-color:#fff;color:#333;font-size:12px}._contrastMode_1slua_19 ._horizontalCtaTooltip_1slua_1{background-color:#00000080;color:#fff;border:1px solid white;font-weight:600}@keyframes _horizontalCtaTooltipPulse_1slua_1{0%{transform:translate(-50%) translateY(-25%) scale(1)}50%{transform:translate(-50%) translateY(-25%) scale(1.1)}to{transform:translate(-50%) translateY(-25%) scale(1)}}._sideButtonsContainer_1kkly_2{position:absolute;width:100%;height:100%;left:0;top:0;display:flex;justify-content:center;align-items:center;z-index:100;pointer-events:none}._sideButtonsWrapper_1kkly_16{position:relative;width:100%;height:100%;display:grid;grid-template-columns:1fr auto 1fr;grid-template-rows:auto 1fr auto;padding:15px;box-sizing:border-box}._sideButtonContainer_1kkly_28{display:flex;align-items:center;flex-direction:column;gap:4px}._sideButtonLeft_1kkly_36{grid-column:1;grid-row:2;margin-right:auto;justify-self:start;align-self:center}._sideButtonRight_1kkly_45{grid-column:3;grid-row:2;margin-left:auto;justify-self:end;align-self:center}._sideButtonTop_1kkly_54{grid-column:2;grid-row:1;justify-self:center;align-self:start}._sideButtonBottom_1kkly_62{grid-column:2;grid-row:3;justify-self:center;align-self:end}._sideButton_1kkly_2{border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;border:2px solid rgba(255,255,255,.4);background-color:#ffffffb3;backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);box-shadow:0 4px 12px #0000004d;transition:all .3s ease;-webkit-tap-highlight-color:transparent;pointer-events:auto;padding:0;margin:0;gap:4px;-webkit-touch-callout:none;-webkit-user-select:none;touch-action:manipulation;cursor:pointer}._sideButton_1kkly_2:hover{border-color:#fff;background-color:#ffffffe6}._buttonContent_1kkly_99{position:relative;display:flex;align-items:center;justify-content:center}._buttonContent_1kkly_99 svg{color:#000}._buttonLabel_1kkly_111{white-space:pre-wrap;text-align:center;color:#000;font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;line-height:1.2;user-select:none;-webkit-user-select:none;margin-top:0}._arrowRight_1kkly_126{transform:rotate(0)}._arrowLeft_1kkly_130{transform:rotate(180deg)}._arrowUp_1kkly_134{transform:rotate(-90deg)}._arrowDown_1kkly_138{transform:rotate(90deg)}@keyframes _moveRight_1kkly_1{0%{transform:rotate(0) translate(0);opacity:.7}10%{transform:rotate(0) translate(6px);opacity:1}15%{transform:rotate(0) translate(12px);opacity:1}20%{transform:rotate(0) translate(12px);opacity:1}25%{transform:rotate(0) translate(0);opacity:.7}25.01%,to{transform:rotate(0) translate(0);opacity:.7}}@keyframes _moveLeft_1kkly_1{0%,24.99%{transform:rotate(180deg) translate(0);opacity:.7}25%{transform:rotate(180deg) translate(0);opacity:.7}35%{transform:rotate(180deg) translate(6px);opacity:1}40%{transform:rotate(180deg) translate(12px);opacity:1}45%{transform:rotate(180deg) translate(12px);opacity:1}50%{transform:rotate(180deg) translate(0);opacity:.7}50.01%,to{transform:rotate(180deg) translate(0);opacity:.7}}@keyframes _moveUp_1kkly_1{0%,49.99%{transform:rotate(-90deg) translate(0);opacity:.7}50%{transform:rotate(-90deg) translate(0);opacity:.7}60%{transform:rotate(-90deg) translate(6px);opacity:1}65%{transform:rotate(-90deg) translate(12px);opacity:1}70%{transform:rotate(-90deg) translate(12px);opacity:1}75%{transform:rotate(-90deg) translate(0);opacity:.7}75.01%,to{transform:rotate(-90deg) translate(0);opacity:.7}}@keyframes _moveDown_1kkly_1{0%,74.99%{transform:rotate(90deg) translate(0);opacity:.7}75%{transform:rotate(90deg) translate(0);opacity:.7}85%{transform:rotate(90deg) translate(6px);opacity:1}90%{transform:rotate(90deg) translate(12px);opacity:1}95%{transform:rotate(90deg) translate(12px);opacity:1}to{transform:rotate(90deg) translate(0);opacity:.7}}._sideButton_1kkly_2.like-btn ._buttonContent_1kkly_99 svg._arrowRight_1kkly_126{animation:_moveRight_1kkly_1 8s infinite}._sideButton_1kkly_2.dislike-btn ._buttonContent_1kkly_99 svg._arrowLeft_1kkly_130{animation:_moveLeft_1kkly_1 8s infinite}._sideButton_1kkly_2.maybe-btn ._buttonContent_1kkly_99 svg._arrowUp_1kkly_134{animation:_moveUp_1kkly_1 8s infinite}._sideButton_1kkly_2.seen-btn ._buttonContent_1kkly_99 svg._arrowDown_1kkly_138{animation:_moveDown_1kkly_1 8s infinite}._tooltipWrapper_1kkly_277{grid-column:2;grid-row:2;display:flex;align-items:center;justify-content:center}._swipeTutorialOverlay_jbb64_2{position:absolute;width:100%;height:100%;left:0;top:0;display:flex;justify-content:center;align-items:center;z-index:100;pointer-events:none}._handContainer_jbb64_16{display:flex;align-items:center;justify-content:center;pointer-events:none}._handIcon_jbb64_24{filter:drop-shadow(0 4px 8px rgba(0,0,0,.3));opacity:.9}._swipeableFeed_jamse_1{position:relative;width:100%;height:100%;overflow:hidden}._swipeableFeedCards_jamse_8{position:relative;width:100%;height:100%}._swipeableFeedCards_jamse_8>*{position:absolute;top:0;left:0;width:100%;height:100%}._swipeableFeedEmpty_jamse_22{display:flex;align-items:center;justify-content:center;width:100%;height:100%;color:#666;font-size:16px;text-align:center}._swipeTutorialContainer_jamse_33{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:150}._volumeControl_r52gg_2{position:absolute;z-index:1100;display:flex;align-items:center;gap:8px;margin:0}._volumeControlTopLeft_r52gg_12{top:10px;left:10px}._volumeControlTopRight_r52gg_17{top:10px;right:10px;flex-direction:row-reverse}._volumeControlBottomLeft_r52gg_23{bottom:80px;left:15px}._volumeControlBottomRight_r52gg_28{bottom:80px;right:15px;flex-direction:row-reverse}._volumeControlButton_r52gg_34{width:auto;height:30px;cursor:pointer;background-color:#0006;border-radius:50%;transition:background-color .2s ease;display:flex;align-items:center;justify-content:center;padding:4px;box-sizing:border-box;flex-shrink:0}._volumeControlButton_r52gg_34:hover{background-color:#000000b3}._volumeControlButton_r52gg_34 img{width:100%;height:100%;object-fit:contain}._volumeSlider_r52gg_60{background-color:#0006;border-radius:20px;padding:8px 12px;display:flex;align-items:center;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);opacity:0;pointer-events:none;transition:opacity .2s ease}._volumeSlider_r52gg_60:hover{background-color:#000000b3}._volumeControl_r52gg_2:hover ._volumeSlider_r52gg_60{opacity:1;pointer-events:auto}._volumeSliderInput_r52gg_81{width:100px;height:4px;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#ffffff4d;border-radius:2px;outline:none;cursor:pointer}._volumeSliderInput_r52gg_81::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:12px;height:12px;border-radius:50%;background:#fff;cursor:pointer;transition:transform .1s ease}._volumeSliderInput_r52gg_81::-webkit-slider-thumb:hover{transform:scale(1.2)}._volumeSliderInput_r52gg_81::-moz-range-thumb{width:12px;height:12px;border-radius:50%;background:#fff;cursor:pointer;border:none;transition:transform .1s ease}._volumeSliderInput_r52gg_81::-moz-range-thumb:hover{transform:scale(1.2)}._historyButton_1xf6c_1{border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;z-index:1000;box-shadow:16px 20px 8px #00000026,inset -4px -4px 10px #0003;background-image:linear-gradient(135deg,#fff3,#0003);outline:none;-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}._historyCardsContent_1xf6c_17{margin:12px 0}._historyButton_1xf6c_1:focus{outline:none}._historyButton_1xf6c_1:active{outline:none;-webkit-tap-highlight-color:transparent}._historyButton_1xf6c_1:focus-visible{outline:none}._historyButton_1xf6c_1 img{pointer-events:none}._tooltip_1xf6c_39{display:flex;z-index:110;line-height:1.2;padding:10px 14px;position:absolute;top:0;border-radius:8px;font-weight:800;text-align:center;width:max-content;transition:opacity .3s ease;box-shadow:0 0 16px 1px #000;left:50%;white-space:pre-line;transform:translate(-50%) translateY(calc(-100% - 16px));animation:_historyButtonTooltipBounce_1xf6c_1 2s infinite}._tooltipArrow_1xf6c_59{position:absolute;bottom:-8px;left:50%;width:16px;height:16px;transform:translate(-50%) rotate(45deg);z-index:0}@keyframes _historyButtonTooltipBounce_1xf6c_1{0%,20%,50%,80%,to{transform:translate(-50%) translateY(calc(-100% - 16px))}40%{transform:translate(-50%) translateY(calc(-100% - 24px))}60%{transform:translate(-50%) translateY(calc(-100% - 20px))}}._drawerOverlay_1eftt_2{position:fixed;top:0;left:0;right:0;bottom:0;background-color:#00000080;z-index:999;opacity:0;visibility:hidden;transition:opacity .5s ease,visibility .5s ease}._drawerOverlayScoped_1eftt_16{position:absolute;top:0;left:0;right:0;bottom:0}._drawerOverlayVisible_1eftt_24{opacity:1;visibility:visible}._drawer_1eftt_2{position:fixed;bottom:0;left:0;right:0;height:80%;background:#fff;border-radius:20px 20px 0 0;z-index:1000;transform:translateY(100%);transition:transform .6s cubic-bezier(.25,.46,.45,.94);box-shadow:0 -8px 32px #0003;display:flex;flex-direction:column;overflow:hidden}._drawerScoped_1eftt_48{position:absolute;bottom:0;left:0;right:0}._drawerOpen_1eftt_55{transform:translateY(0)}._drawerHandle_1eftt_60{width:40px;height:4px;background-color:#0003;border-radius:2px;margin:12px auto 8px;flex-shrink:0;transition:background-color .2s ease}._drawerHandle_1eftt_60:hover{background-color:#0000004d}._drawerEmojisContainer_1eftt_75{display:flex;justify-content:space-between;padding:16px 20px;border-bottom:1px solid rgba(0,0,0,.1);flex-shrink:0}._drawerEmojiItem_1eftt_84{display:flex;flex-direction:column;align-items:center;gap:8px}._drawerEmojiItemActive_1eftt_91 ._drawerEmojiLabel_1eftt_91{color:#000;font-weight:700}._drawerEmojiButton_1eftt_97{display:flex;align-items:center;justify-content:center;padding:0;border-radius:50%;background:#fffc;border:2px solid rgba(0,0,0,.2);cursor:pointer;transition:all .3s ease;width:50px;height:50px;box-shadow:0 2px 8px #00000026;-webkit-tap-highlight-color:transparent}._drawerEmojiButtonActive_1eftt_113{background:#fff;border:3px solid rgba(0,0,0,.6);box-shadow:0 4px 12px #00000040;transform:scale(1.1)}._drawerEmojiLikeActive_1eftt_125{border-color:#4caf50;background:#4caf5026;box-shadow:0 4px 12px #4caf504d}._drawerEmojiDislikeActive_1eftt_135{border-color:#f44336;background:#f4433626;box-shadow:0 4px 12px #f443364d}._drawerEmojiMaybeActive_1eftt_145{border-color:#ff9800;background:#ff980026;box-shadow:0 4px 12px #ff98004d}._drawerEmojiSeenActive_1eftt_155{border-color:#2196f3;background:#2196f326;box-shadow:0 4px 12px #2196f34d}._drawerEmojiIcon_1eftt_162{width:32px;height:32px;object-fit:contain}._drawerEmojiLabel_1eftt_91{font-size:11px;font-weight:600;color:#000c;text-align:center;line-height:1.2;text-transform:uppercase;letter-spacing:.5px;white-space:pre-wrap}._drawerEmojiLike_1eftt_121:hover{border-color:#4caf50;background:#4caf501a}._drawerEmojiDislike_1eftt_131:hover{border-color:#f44336;background:#f443361a}._drawerEmojiMaybe_1eftt_141:hover{border-color:#ff9800;background:#ff98001a}._drawerEmojiSeen_1eftt_151:hover{border-color:#2196f3;background:#2196f31a}._drawerContent_1eftt_202{flex:1;padding:20px;-webkit-overflow-scrolling:touch;overflow-y:auto}._drawerCloseButton_1eftt_210{background:linear-gradient(135deg,#ff6b6b,#ee5a52);color:#fff;border:none;padding:12px 24px;margin:20px;border-radius:25px;font-size:16px;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:8px;transition:all .3s ease;box-shadow:0 4px 16px #ff6b6b4d;outline:none;-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;align-self:center;min-height:48px;white-space:pre-wrap}._drawerCloseButton_1eftt_210:hover{transform:translateY(-2px);box-shadow:0 6px 20px #ff6b6b66}._drawerCloseButton_1eftt_210:active{transform:translateY(0);box-shadow:0 2px 8px #ff6b6b4d}._drawerCloseButton_1eftt_210:focus{outline:none}._drawerCloseButton_1eftt_210:focus-visible{outline:2px solid rgba(255,107,107,.5);outline-offset:2px}._drawerCloseIcon_1eftt_255{width:16px;height:16px;filter:brightness(0) invert(1)}@media (max-width: 768px){._drawer_1eftt_2{height:80%;border-radius:30px 30px 0 0}._drawerContent_1eftt_202{padding:16px}._drawerCloseButton_1eftt_210{margin:16px;padding:10px 20px;font-size:14px}}@media (max-width: 480px){._drawer_1eftt_2{height:80%;border-radius:30px 30px 0 0}._drawerContent_1eftt_202{padding:12px}._drawerCloseButton_1eftt_210{margin:12px;font-size:14px}}._cardListContainer_zrmnf_2{padding:20px;overscroll-behavior-y:contain;touch-action:pan-y;overflow-y:auto;height:100%;box-sizing:border-box}._cardListContainerNoPadding_zrmnf_11{padding:0;box-sizing:border-box}._summaryGridContainer_zrmnf_17{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:20px;box-sizing:border-box}._summaryGridItem_zrmnf_26{aspect-ratio:1;border-radius:8px;overflow:hidden;background:#0000000d;cursor:default}._summaryGridItemClickable_zrmnf_34{cursor:pointer}._gridPlaceholder_zrmnf_39{width:100%;height:100%;background:#f2f2f2;display:flex;align-items:center;justify-content:center;font-size:12px;color:#181818}._gridItemImage_zrmnf_51{width:100%;height:100%;object-fit:cover}._summaryCardItem_zrmnf_58{display:flex;gap:8px;padding:12px;border-radius:8px;background:#f2f2f2;color:#181818;margin-bottom:8px;align-items:center;cursor:default}._summaryCardItemClickable_zrmnf_70{cursor:pointer}._cardItemImage_zrmnf_75{width:60px;height:60px;border-radius:6px;object-fit:cover;flex-shrink:0}._cardItemPlaceholder_zrmnf_84{width:60px;height:60px;border-radius:6px;background:#d9d9d9;display:flex;align-items:center;justify-content:center;font-size:12px;color:#00000080;flex-shrink:0}._cardItemContent_zrmnf_98{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center}._cardItemTitle_zrmnf_107{margin:0 0 2px;font-size:14px;font-weight:600;line-height:1.2;text-align:left}._cardItemPrice_zrmnf_116{margin:0;font-size:12px;color:#000000b3;line-height:1.2}._summaryContainer_1gtok_3{display:flex;flex-direction:column;height:100%;width:100%;background-color:#fff;overflow:hidden;position:relative}._summaryShareButtonFixed_1gtok_14{position:absolute;bottom:10px;right:10px;width:45px;height:45px;font-size:12px;text-transform:uppercase;border-radius:50%;background-color:#2196f3;color:#fff;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 4px 12px #00000026;transition:all .3s ease;z-index:1000;-webkit-tap-highlight-color:transparent}._summaryShareButtonFixed_1gtok_14:hover{background-color:#1976d2;box-shadow:0 6px 16px #0003;transform:scale(1.05)}._summaryShareButtonFixed_1gtok_14:active{transform:scale(.95);box-shadow:0 2px 8px #00000026}._summaryShareButtonFixed_1gtok_14 ._shareIcon_1gtok_47{width:24px;height:24px;filter:brightness(0) invert(1)}._summaryExplaination_1gtok_54{gap:8px;padding:12px;border-radius:8px;align-items:center;margin:12px 20px 0;font-size:14px;font-weight:600;line-height:1.2;text-align:center;justify-content:center;white-space:pre-wrap;background:#f2f2f2;color:#181818}._summaryTabs_1gtok_71{display:flex;justify-content:center;padding:16px 20px;background-color:#f5f5f5;border-bottom:1px solid #e0e0e0}._summaryTab_1gtok_71{display:flex;flex-direction:column;align-items:center;cursor:pointer;transition:all .3s ease;text-align:center;padding:0 5px;-webkit-tap-highlight-color:transparent}._summaryEmojiItem_1gtok_96{display:flex;flex-direction:column;align-items:center;gap:8px}._summaryEmojiButton_1gtok_108{display:flex;align-items:center;justify-content:center;padding:0;border-radius:50%;background:#fffc;border:2px solid rgba(0,0,0,.2);cursor:pointer;transition:all .3s ease;width:40px;height:40px;box-shadow:0 2px 8px #00000026;-webkit-tap-highlight-color:transparent}._summaryEmojiButtonActive_1gtok_124{background:#fff;border:3px solid rgba(0,0,0,.6);box-shadow:0 4px 12px #00000040;transform:scale(1.1)}._summaryEmojiLikeActive_1gtok_136{border-color:#4caf50;background:#4caf5026;box-shadow:0 4px 12px #4caf504d}._summaryEmojiDislikeActive_1gtok_146{border-color:#f44336;background:#f4433626;box-shadow:0 4px 12px #f443364d}._summaryEmojiMaybeActive_1gtok_156{border-color:#ff9800;background:#ff980026;box-shadow:0 4px 12px #ff98004d}._summaryEmojiSeenActive_1gtok_166{border-color:#2196f3;background:#2196f326;box-shadow:0 4px 12px #2196f34d}._summaryEmojiLike_1gtok_132:hover{border-color:#4caf50;background:#4caf501a}._summaryEmojiDislike_1gtok_142:hover{border-color:#f44336;background:#f443361a}._summaryEmojiMaybe_1gtok_152:hover{border-color:#ff9800;background:#ff98001a}._summaryEmojiSeen_1gtok_162:hover{border-color:#2196f3;background:#2196f31a}._summaryEmojiIcon_1gtok_194{width:28px;height:28px;object-fit:contain}._summaryEmojiLabel_1gtok_201{font-size:11px;font-weight:600;color:#000c;text-align:center;line-height:1.2;text-transform:uppercase;letter-spacing:.5px}._summaryEmojiItemActive_1gtok_103 ._summaryEmojiLabel_1gtok_201{color:#000;font-weight:700}._summaryContent_1gtok_217{flex:1;overflow:hidden;position:relative;background-color:#fff;min-height:0}._summaryPanel_1gtok_226{display:none;position:absolute;top:0;left:0;right:0;bottom:0;height:100%;width:100%;overflow-y:auto;min-height:0;box-sizing:border-box;overscroll-behavior:contain}._summaryPanelActive_1gtok_241{display:block}._summaryEmptyState_1gtok_246{text-align:center;padding:40px 20px;color:#181818}._summaryEmptyStateText_1gtok_252{margin:0 0 16px;font-size:18px;font-weight:600}._historyDrawerContent_x0jj6_1,._historyDrawerContent_x0jj6_1 .summary-container{height:100%;display:flex;flex-direction:column;overflow:hidden}._historyDrawerEmpty_x0jj6_15{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:40px 20px;text-align:center;color:#666}._historyDrawerEmpty_x0jj6_15 p{margin:8px 0;font-size:16px}._historyDrawerEmptyHint_x0jj6_31{font-size:14px;color:#999}._historyDrawerTitle_x0jj6_36{margin:0 0 16px;padding:20px 20px 0;font-size:20px;font-weight:700;color:#333}._historyDrawerList_x0jj6_44{height:100%;display:flex;flex-direction:column;overflow:hidden}._historyDrawerList_x0jj6_44 .card-list-container{flex:1;overflow-y:auto}._historyDrawerGrouped_x0jj6_56{height:100%;display:flex;flex-direction:column;overflow-y:auto}._historyDrawerGroup_x0jj6_56{margin-bottom:24px}._historyDrawerGroup_x0jj6_56:last-child{margin-bottom:0}._historyDrawerGroupTitle_x0jj6_71{margin:0 0 12px;padding:20px 20px 0;font-size:18px;font-weight:700;color:#333}._historyDrawerGroup_x0jj6_56:first-child ._historyDrawerGroupTitle_x0jj6_71{padding-top:20px}._historyDrawerGroup_x0jj6_56 .card-list-container{padding-top:0}._historyDrawer_x0jj6_1 .drawer-content{padding:20px 0}._historyDrawer_x0jj6_1 .drawer-content .summary-tabs,._historyDrawer_x0jj6_1 .drawer-content .summary-content{background-color:transparent!important}._filtersButton_qio2f_1{position:absolute;z-index:1000;min-width:80px;height:40px;padding:8px 16px;border:none;border-radius:20px;cursor:pointer;display:flex;align-items:center;justify-content:center;outline:none;-webkit-tap-highlight-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-size:14px;font-weight:500;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;text-align:center;white-space:pre-wrap;background-image:linear-gradient(135deg,#ffffff1a,#0000001a);transition:all .3s ease;box-shadow:0 4px 8px #00000026}._filtersButton_qio2f_1:hover{box-shadow:0 6px 12px #0003;transform:translateY(-1px)}._filtersButton_qio2f_1:active{transform:translateY(1px);box-shadow:0 2px 4px #00000026}._filtersButton_qio2f_1:focus{outline:none}._filtersButton_qio2f_1:focus-visible{outline:none}._filtersLeft_qio2f_46{left:20px;right:auto}._filtersMiddle_qio2f_51{left:50%;right:auto;transform:translate(-50%)}._filtersRight_qio2f_57{left:auto;right:20px}._filtersIcon_qio2f_63{pointer-events:none;flex-shrink:0}._content_hci8k_2{padding:12px 20px}._title_hci8k_7{margin:0 0 12px;font-size:16px;font-weight:600;color:#333;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;white-space:pre-wrap}._categories_hci8k_17{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:0}._pill_hci8k_25{display:inline-flex;align-items:center;padding:6px 12px;border-radius:20px;cursor:pointer;font-size:13px;font-weight:500;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;transition:all .2s ease;-webkit-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}._noCategories_hci8k_40{width:100%;color:#999;font-style:italic;text-align:center;padding:20px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}._cardsCounter_1h26d_1{width:100%;text-align:left;font-size:14px;font-weight:700;color:#fff;text-shadow:1px 1px 2px rgba(0,0,0,.8);padding:5px 5px 5px 21px;pointer-events:none;white-space:pre-wrap}._logo_1rzq2_1{display:block;height:auto;max-width:100%;-webkit-user-select:none;user-select:none;pointer-events:none}._container_18bki_1{position:absolute}._interactiveFeed_1wsuw_1,._swippingJourney_15509_1{position:relative;width:100%;height:100%;overflow:hidden}._mainBootstrap_1rzog_1{width:100%;height:100%;position:relative}:root{--media-object-fit: cover}.swipefinder-root,.swipefinder-root *,.swipefinder-root *:before,.swipefinder-root *:after{margin:0;padding:0;box-sizing:border-box;font-family:Arial,sans-serif}.swipefinder-root{touch-action:pan-y;-webkit-user-select:none;user-select:none}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { Card } from '../../types/card';
3
+ export interface CardListProps {
4
+ cards: (Card | {
5
+ card: Card;
6
+ })[];
7
+ clickable?: boolean;
8
+ padding?: string;
9
+ layout?: 'list' | 'grid';
10
+ onCardClick?: (cardId: string | undefined, cardUrl: string | undefined, cardPosition: number | undefined) => void;
11
+ cardItemBackgroundColor?: string;
12
+ cardItemTextColor?: string;
13
+ }
14
+ export declare const CardList: React.FC<CardListProps>;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { CardBase } from '../../types/card';
3
+ import { CardUIConfig } from '../../types/FeedUIConfig';
4
+ export interface CardProps {
5
+ /** Card data for id and title */
6
+ card: CardBase;
7
+ /** Card UI configuration */
8
+ cardUIConfig: CardUIConfig;
9
+ /** Additional CSS class name */
10
+ className?: string;
11
+ /** Children to render inside the card (image or video) */
12
+ children: React.ReactNode;
13
+ }
14
+ /**
15
+ * Card component - Wrapper component for card content (image or video)
16
+ * Handles common card features: gradients, title, and styling
17
+ */
18
+ export declare const CardWrapper: React.FC<CardProps>;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { ImageCard as ImageCardType } from '../../../types/card';
3
+ export interface ImageWrapperProps {
4
+ card: ImageCardType;
5
+ /** Callback when image is loaded */
6
+ onImageReady?: (imageElement: HTMLImageElement | null) => void;
7
+ /** Whether the image should start loading */
8
+ ready?: boolean;
9
+ /** Whether to lazy load the image */
10
+ lazyLoad?: boolean;
11
+ /** Additional CSS class name */
12
+ className?: string;
13
+ }
14
+ /**
15
+ * ImageComponent - Pure component that renders an image
16
+ * This is a pure component that receives all data via props and communicates through callback functions
17
+ */
18
+ export declare const ImageWrapper: React.FC<ImageWrapperProps>;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import { VideoCard as VideoCardType } from '../../../types/card';
3
+ export interface VideoWrapperProps {
4
+ card: VideoCardType;
5
+ cardIndex?: number;
6
+ /** Whether the card is currently active/visible */
7
+ isActive?: boolean;
8
+ /** Whether the video is muted */
9
+ isMuted: boolean;
10
+ /** Video volume (0-1) */
11
+ volume?: number;
12
+ /** Whether the video should start loading */
13
+ ready?: boolean;
14
+ /** Additional CSS class name */
15
+ className?: string;
16
+ /** Callback when video is ready to play */
17
+ onVideoReady?: (videoElement: HTMLVideoElement | null) => void;
18
+ /** Callback when video should start playing */
19
+ onPlayRequested?: (videoElement: HTMLVideoElement | null) => void;
20
+ }
21
+ /**
22
+ * VideoComponent - Only supports HLS format videos (.m3u8)
23
+ * The component uses the hls-video custom element which requires HLS video streams
24
+ * This is a pure component that receives all configuration via props
25
+ */
26
+ export declare const VideoWrapper: React.FC<VideoWrapperProps>;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import { CardsCounterUIConfig } from '../../types/FeedUIConfig';
3
+ export interface CardsCounterProps {
4
+ cardsCounterUIConfig: CardsCounterUIConfig;
5
+ currentCardIndex: number;
6
+ totalCards: number;
7
+ className?: string;
8
+ }
9
+ export declare const CardsCounter: React.FC<CardsCounterProps>;
@@ -0,0 +1,19 @@
1
+ import React, { ReactNode } from 'react';
2
+ export interface DrawerProps {
3
+ isOpen: boolean;
4
+ onClose: () => void;
5
+ height?: string;
6
+ maxHeight?: string;
7
+ showHandle?: boolean;
8
+ showCloseButton?: boolean;
9
+ className?: string;
10
+ closeButtonText?: string;
11
+ /** Whether to handle ESC key press (default: true) */
12
+ handleEscKey?: boolean;
13
+ /** Whether to lock body scroll when drawer is open (default: true) */
14
+ lockBodyScroll?: boolean;
15
+ /** Whether drawer should be positioned relative to parent container (default: false, uses fixed positioning) */
16
+ scoped?: boolean;
17
+ children?: ReactNode;
18
+ }
19
+ export declare const Drawer: React.FC<DrawerProps>;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { FiltersUIConfig } from '../../types/FeedUIConfig';
3
+ export interface FiltersButtonProps {
4
+ /** Filters UI configuration */
5
+ filtersUIConfig: FiltersUIConfig;
6
+ /** Callback when button is clicked */
7
+ onClick?: () => void;
8
+ /** Additional CSS class name */
9
+ className?: string;
10
+ }
11
+ export declare const FiltersButton: React.FC<FiltersButtonProps>;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import { Category } from '../../types/category';
3
+ import { FiltersUIConfig } from '../../types/FeedUIConfig';
4
+ export interface FiltersDrawerProps {
5
+ /** Whether the drawer is open */
6
+ isOpen: boolean;
7
+ /** Callback when drawer should be closed */
8
+ onClose: () => void;
9
+ /** Filters UI configuration */
10
+ filtersUIConfig: FiltersUIConfig;
11
+ /** Available categories */
12
+ categories?: Category[];
13
+ /** Currently selected category IDs */
14
+ selectedCategories?: string[];
15
+ /** Callback when filter selection changes */
16
+ onFilterChange?: (selectedCategories: string[]) => void;
17
+ /** Whether drawer should be scoped to parent container */
18
+ scoped?: boolean;
19
+ /** Additional CSS class name */
20
+ className?: string;
21
+ }
22
+ /**
23
+ * FiltersDrawer - Pure component for displaying filter categories in a drawer
24
+ */
25
+ export declare const FiltersDrawer: React.FC<FiltersDrawerProps>;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { HistoryUIConfig } from '../../types/FeedUIConfig';
3
+ export interface HistoryButtonProps {
4
+ /** History UI configuration */
5
+ historyUIConfig: HistoryUIConfig;
6
+ /** Whether the button should be shown */
7
+ show?: boolean;
8
+ /** Callback when history button is clicked */
9
+ onOpenHistory?: () => void;
10
+ /** Additional CSS class name */
11
+ className?: string;
12
+ }
13
+ export declare const HistoryButton: React.FC<HistoryButtonProps>;
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import { SwipeHistoryEntry, SwipeDirection } from '../../types/swipe';
3
+ import { NavigationUIConfig, SummaryUIConfig, HistoryUIConfig } from '../../types/FeedUIConfig';
4
+ export interface HistoryDrawerProps {
5
+ /** Whether the drawer is open */
6
+ isOpen: boolean;
7
+ /** Callback when drawer should be closed */
8
+ onClose: () => void;
9
+ /** Swipe history entries to display */
10
+ swipeHistory: SwipeHistoryEntry[];
11
+ /** Function to get cards by direction */
12
+ getCardsByDirection: (direction: SwipeDirection) => any[];
13
+ /** History UI configuration */
14
+ historyUIConfig: HistoryUIConfig;
15
+ /** Navigation UI configuration */
16
+ navigationUIConfig: NavigationUIConfig;
17
+ /** Summary UI configuration */
18
+ summaryUIConfig: SummaryUIConfig;
19
+ /** Callback when a card is clicked */
20
+ onCardClick?: (cardId: string | undefined, cardUrl: string | undefined, cardPosition: number | undefined) => void;
21
+ /** Additional CSS class name */
22
+ className?: string;
23
+ /** Whether drawer should be scoped to parent container */
24
+ scoped?: boolean;
25
+ }
26
+ /**
27
+ * HistoryDrawer - Dumb component that displays swipe history in a drawer
28
+ * Uses Summary component to display cards divided by reaction types
29
+ */
30
+ export declare const HistoryDrawer: React.FC<HistoryDrawerProps>;
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ export interface HorizontalCtaTooltipProps {
3
+ /** Current card ID (optional, for per-card tooltip settings) */
4
+ currentCardId?: string | null;
5
+ /** Current card index */
6
+ currentCardIndex?: number;
7
+ /** Tooltip text */
8
+ tooltipText?: string;
9
+ /** Tooltip text color */
10
+ tooltipTextColor?: string;
11
+ /** Tooltip text size in pixels */
12
+ tooltipTextSize?: number;
13
+ /** Tooltip background color */
14
+ tooltipBackgroundColor?: string;
15
+ /** Whether tooltip should stay visible after first swipe */
16
+ tooltipKeep?: boolean;
17
+ /** Tooltip bottom offset in pixels */
18
+ tooltipBottomOffset?: number;
19
+ /** Per-card tooltip settings (keyed by card ID) */
20
+ assetTooltips?: Record<string, any>;
21
+ /** Callback when first swipe occurs */
22
+ onFirstSwipe?: () => void;
23
+ /** Additional CSS class name */
24
+ className?: string;
25
+ }
26
+ export declare const HorizontalCtaTooltip: React.FC<HorizontalCtaTooltipProps>;
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { LogoUIConfig } from '../../types/FeedUIConfig';
3
+ export interface LogoProps {
4
+ /** Logo UI configuration */
5
+ logoUIConfig: LogoUIConfig;
6
+ /** Whether the logo is visible (managed by context/state) */
7
+ visible: boolean;
8
+ /** Additional CSS class name */
9
+ className?: string;
10
+ }
11
+ /**
12
+ * Logo - Pure component that displays a logo image
13
+ */
14
+ export declare const Logo: React.FC<LogoProps>;
@@ -0,0 +1,20 @@
1
+ import React, { ReactNode } from 'react';
2
+ export interface PositionedProps {
3
+ /** Children to wrap */
4
+ children: ReactNode;
5
+ /** X position (left) in pixels or percentage */
6
+ x?: number | string;
7
+ /** Y position (top) in pixels or percentage */
8
+ y?: number | string;
9
+ /** Whether to center the content using transform */
10
+ centered?: boolean;
11
+ /** Z-index for stacking */
12
+ zIndex?: number;
13
+ /** Additional CSS class name */
14
+ className?: string;
15
+ }
16
+ /**
17
+ * Positioned - Wrapper component that positions children absolutely
18
+ * Allows positioning via x/y coordinates and optional centering
19
+ */
20
+ export declare const Positioned: React.FC<PositionedProps>;
@@ -0,0 +1,49 @@
1
+ import React from 'react';
2
+ export interface SideArrowsButton {
3
+ id: string;
4
+ action: 'like' | 'dislike' | 'maybe' | 'seen';
5
+ label: string;
6
+ icon: string;
7
+ altText: string;
8
+ enabled: boolean;
9
+ }
10
+ export interface SideArrowsButtonsProps {
11
+ buttons: SideArrowsButton[];
12
+ /** CTA tooltip text (shown in demo mode) */
13
+ ctaText?: string;
14
+ /** Whether to show tooltip in demo mode */
15
+ isDemoMode?: boolean;
16
+ /** Tooltip text color */
17
+ tooltipTextColor?: string;
18
+ /** Tooltip text size in pixels */
19
+ tooltipTextSize?: number;
20
+ /** Tooltip background color */
21
+ tooltipBackgroundColor?: string;
22
+ /** Whether tooltip should stay visible after first swipe */
23
+ tooltipKeep?: boolean;
24
+ /** Tooltip bottom offset in pixels */
25
+ tooltipBottomOffset?: number;
26
+ /** Current card index for tooltip (optional) */
27
+ currentCardIndex?: number;
28
+ /** Callback when first swipe occurs (for tooltip) */
29
+ onFirstSwipe?: () => void;
30
+ /** Additional CSS class for buttons */
31
+ buttonClass?: string;
32
+ /** Additional CSS class for container */
33
+ containerClass?: string;
34
+ /** Additional CSS class for labels */
35
+ labelClass?: string;
36
+ /** Button size in pixels */
37
+ buttonSize?: number;
38
+ /** Callback when a button is clicked */
39
+ onButtonClick?: (action: 'like' | 'dislike' | 'maybe' | 'seen', buttonId: string) => void;
40
+ /** Whether buttons are currently animating */
41
+ isAnimating?: boolean;
42
+ /** Whether the component is visible */
43
+ visible?: boolean;
44
+ /** Additional CSS class name */
45
+ className?: string;
46
+ /** Container element ID */
47
+ id?: string;
48
+ }
49
+ export declare const SideArrowsButtons: React.FC<SideArrowsButtonsProps>;
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ export interface SideEmojisButton {
3
+ id: string;
4
+ action: 'like' | 'dislike' | 'maybe' | 'seen';
5
+ label: string;
6
+ icon: string;
7
+ altText: string;
8
+ enabled?: boolean;
9
+ }
10
+ export interface SideEmojisButtonsProps {
11
+ buttons: SideEmojisButton[];
12
+ buttonClass?: string;
13
+ containerClass?: string;
14
+ labelClass?: string;
15
+ /** Button size in pixels */
16
+ buttonSize?: number;
17
+ onButtonClick?: (action: 'like' | 'dislike' | 'maybe' | 'seen', buttonId: string) => void;
18
+ isAnimating?: boolean;
19
+ visible?: boolean;
20
+ className?: string;
21
+ id?: string;
22
+ }
23
+ export declare const SideEmojisButtons: React.FC<SideEmojisButtonsProps>;
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import { Card } from '../../types/card';
3
+ import { SwipeDirection } from '../../types/swipe';
4
+ import { NavigationUIConfig, SummaryUIConfig } from '../../types/FeedUIConfig';
5
+ export interface SummaryProps {
6
+ /** Cards grouped by swipe direction */
7
+ cardsByDirection: {
8
+ [key in SwipeDirection]: Card[];
9
+ };
10
+ /** Navigation UI configuration */
11
+ navigationUIConfig: NavigationUIConfig;
12
+ /** Summary UI configuration */
13
+ summaryUIConfig: SummaryUIConfig;
14
+ /** Callback when card is clicked */
15
+ onCardClick?: (cardId: string | undefined, cardUrl: string | undefined, cardPosition: number | undefined) => void;
16
+ /** Callback for share button */
17
+ onShareClick?: (rightCardIds: string[], upCardIds: string[]) => void;
18
+ /** Whether component should be visible */
19
+ visible?: boolean;
20
+ /** Additional CSS class */
21
+ className?: string;
22
+ }
23
+ /**
24
+ * Summary component - Pure component that receives all configuration via props
25
+ * This is a pure component that receives all data via props and communicates through callback functions
26
+ */
27
+ export declare const Summary: React.FC<SummaryProps>;
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ export interface SwipeTutorialOverlayProps {
3
+ /** Whether the overlay is visible */
4
+ visible?: boolean;
5
+ /** Callback to move the card asset (receives x offset) */
6
+ onCardMove?: (x: number) => void;
7
+ /** Animation duration in milliseconds */
8
+ animationDuration?: number;
9
+ /** Delay before starting animation in milliseconds */
10
+ startDelay?: number;
11
+ /** Additional CSS class name */
12
+ className?: string;
13
+ /** Container element ID */
14
+ id?: string;
15
+ }
16
+ /**
17
+ * SwipeTutorialOverlay - Animated overlay showing swipe tutorial
18
+ * Displays a hand with two arrows and animates to demonstrate swiping gestures
19
+ */
20
+ export declare const SwipeTutorialOverlay: React.FC<SwipeTutorialOverlayProps>;
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import { Card } from '../../types/card';
3
+ import { SwipeOptionConfig } from '../../types/swipe';
4
+ import { CardUIConfig } from '../../types/FeedUIConfig';
5
+ export interface SwipeableCardProps {
6
+ /** Card data to render */
7
+ card: Card;
8
+ /** Card index in the stack */
9
+ cardIndex?: number;
10
+ /** Card UI configuration */
11
+ cardUIConfig: CardUIConfig;
12
+ /** Whether the card is currently active/visible */
13
+ isActive?: boolean;
14
+ /** Swipe options configuration */
15
+ swipeOptions?: {
16
+ right: SwipeOptionConfig;
17
+ left: SwipeOptionConfig;
18
+ up: SwipeOptionConfig;
19
+ down: SwipeOptionConfig;
20
+ };
21
+ /** Creation configuration (deprecated, use swipeOptions instead) */
22
+ creation?: any | null;
23
+ /** Whether swipe animation is currently in progress */
24
+ isAnimating?: boolean;
25
+ /** Direction to animate the card (triggers programmatic swipe animation) */
26
+ animateDirection?: 'left' | 'right' | 'up' | 'down' | null;
27
+ /** Callback when card is swiped left */
28
+ onSwipeLeft?: () => void;
29
+ /** Callback when card is swiped right */
30
+ onSwipeRight?: () => void;
31
+ /** Callback when card is swiped up */
32
+ onSwipeUp?: () => void;
33
+ /** Callback when card is swiped down */
34
+ onSwipeDown?: () => void;
35
+ /** Whether video is muted (for video cards) */
36
+ isMuted?: boolean;
37
+ /** Video volume (0-1, for video cards) */
38
+ volume?: number;
39
+ /** Callback when video is ready (for preloading) */
40
+ onVideoReady?: (videoElement: HTMLVideoElement | null, cardId?: string) => void;
41
+ /** Callback when video should start playing (when card becomes active) */
42
+ onPlayRequested?: (videoElement: HTMLVideoElement | null, cardId?: string) => void;
43
+ /** Callback when image is ready */
44
+ onImageReady?: (imageElement: HTMLImageElement | null, cardId?: string) => void;
45
+ /** Whether the card should start loading */
46
+ ready?: boolean;
47
+ /** Additional CSS class name */
48
+ className?: string;
49
+ /** Z-index for the card */
50
+ zIndex?: number;
51
+ /** Tutorial X offset (for swipe tutorial overlay) */
52
+ tutorialXOffset?: number;
53
+ }
54
+ /**
55
+ * SwipeableCard - Pure React component that renders a card with swipe functionality
56
+ * Based on showfinder project implementation using motion/react
57
+ */
58
+ export declare const SwipeableCard: React.ForwardRefExoticComponent<SwipeableCardProps & React.RefAttributes<any>>;
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { Card } from '../../types/card';
3
+ import { SwipeDirection } from '../../types/swipe';
4
+ import { FinderUIConfig } from '../../types/FeedUIConfig';
5
+ export type ButtonStyle = 'vertical-emojis' | 'side-emojis' | 'side-arrows';
6
+ export interface SwipeableFeedProps {
7
+ /** Cards to display */
8
+ cards: Card[];
9
+ /** Finder UI configuration */
10
+ finderUiConfig: FinderUIConfig;
11
+ /** Button style to use */
12
+ buttonStyle?: ButtonStyle;
13
+ /** Maximum number of visible cards in the stack */
14
+ maxVisibleCards?: number;
15
+ /** Whether video is muted (for video cards) */
16
+ isMuted?: boolean;
17
+ /** Video volume (0-1, for video cards) */
18
+ volume?: number;
19
+ /** Current card index */
20
+ currentCardIndex: number;
21
+ /** Set current card index */
22
+ setCurrentCardIndex: (index: number) => void;
23
+ /** Add swipe to history */
24
+ addSwipeToHistory: (direction: SwipeDirection, card: Card) => void;
25
+ /** Set animating state */
26
+ setIsAnimating: (value: boolean) => void;
27
+ /** Whether animation is in progress */
28
+ isAnimating: boolean;
29
+ /** Set no more cards state */
30
+ setNoMoreCards: (value: boolean) => void;
31
+ /** Send swipe event for monitoring */
32
+ sendSwipeEvent: (cardId: string, direction: string) => void;
33
+ /** Send impression event for monitoring */
34
+ sendImpressionEvent: (cardId: string) => void;
35
+ /** Start card impression tracking */
36
+ startCardImpression: (cardId: string) => void;
37
+ /** Callback when all cards are swiped */
38
+ onAllCardsSwiped?: () => void;
39
+ /** Callback when a card is swiped */
40
+ onCardSwiped?: (card: Card, direction: SwipeDirection) => void;
41
+ /** Whether swipe tutorial overlay is enabled */
42
+ swipeTutorialEnabled?: boolean;
43
+ /** Swipe tutorial animation duration in milliseconds */
44
+ swipeTutorialDuration?: number;
45
+ /** Swipe tutorial start delay in milliseconds */
46
+ swipeTutorialStartDelay?: number;
47
+ /** Container element ID */
48
+ id?: string;
49
+ }
50
+ /**
51
+ * SwipeableFeed - Container component that manages card display and swipe interactions
52
+ * Only allows forward navigation (no backward)
53
+ * Integrates one of the button interaction methods
54
+ */
55
+ export declare const SwipeableFeed: React.FC<SwipeableFeedProps>;
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ export interface VerticalCtaTooltipProps {
3
+ /** Current card ID (optional, for per-card tooltip settings) */
4
+ currentCardId?: string | null;
5
+ /** Current card index */
6
+ currentCardIndex?: number;
7
+ /** Total number of cards */
8
+ totalCards?: number;
9
+ /** Tooltip text */
10
+ tooltipText?: string;
11
+ /** Tooltip text color */
12
+ tooltipTextColor?: string;
13
+ /** Tooltip text size in pixels */
14
+ tooltipTextSize?: number;
15
+ /** Tooltip background color */
16
+ tooltipBackgroundColor?: string;
17
+ /** Whether tooltip should stay visible after first swipe */
18
+ tooltipKeep?: boolean;
19
+ /** Per-card tooltip settings (keyed by card ID) */
20
+ assetTooltips?: Record<string, any>;
21
+ /** Button container element ID */
22
+ buttonContainerId?: string;
23
+ /** Callback when first swipe occurs */
24
+ onFirstSwipe?: () => void;
25
+ /** Additional CSS class name */
26
+ className?: string;
27
+ }
28
+ export declare const VerticalCtaTooltip: React.FC<VerticalCtaTooltipProps>;
@@ -0,0 +1,48 @@
1
+ import React from 'react';
2
+ export interface VerticalEmojisButton {
3
+ id: string;
4
+ action: 'like' | 'dislike' | 'maybe' | 'seen';
5
+ label: string;
6
+ icon: string;
7
+ altText: string;
8
+ }
9
+ export interface VerticalEmojisButtonsProps {
10
+ buttons: VerticalEmojisButton[];
11
+ /** Tooltip text */
12
+ tooltipText?: string;
13
+ /** Tooltip text color */
14
+ tooltipTextColor?: string;
15
+ /** Tooltip text size */
16
+ tooltipTextSize?: number;
17
+ /** Tooltip background color */
18
+ tooltipBackgroundColor?: string;
19
+ /** Whether tooltip should stay visible after first swipe */
20
+ tooltipKeep?: boolean;
21
+ /** Vertical position from top in pixels */
22
+ verticalPosition?: number;
23
+ /** Horizontal position from right in pixels */
24
+ horizontalPosition?: number;
25
+ /** Additional CSS class for buttons */
26
+ buttonClass?: string;
27
+ /** Additional CSS class for container */
28
+ containerClass?: string;
29
+ /** Additional CSS class for labels */
30
+ labelClass?: string;
31
+ /** Callback when a button is clicked */
32
+ onButtonClick?: (action: 'like' | 'dislike' | 'maybe' | 'seen', buttonId: string) => void;
33
+ /** Whether buttons are currently animating */
34
+ isAnimating?: boolean;
35
+ /** Whether the component is visible */
36
+ visible?: boolean;
37
+ /** Additional CSS class name */
38
+ className?: string;
39
+ /** Container element ID */
40
+ id?: string;
41
+ /** Current card index for tooltip (optional) */
42
+ currentCardIndex?: number;
43
+ /** Total cards count for tooltip (optional) */
44
+ totalCards?: number;
45
+ /** Callback when first swipe occurs (for tooltip) */
46
+ onFirstSwipe?: () => void;
47
+ }
48
+ export declare const VerticalEmojisButtons: React.FC<VerticalEmojisButtonsProps>;