@searchspring/snap-preact-components 0.63.5 → 0.65.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 (60) hide show
  1. package/dist/cjs/components/Atoms/Dropdown/Dropdown.d.ts +4 -0
  2. package/dist/cjs/components/Atoms/Dropdown/Dropdown.d.ts.map +1 -1
  3. package/dist/cjs/components/Atoms/Dropdown/Dropdown.js +53 -18
  4. package/dist/cjs/components/Molecules/OverlayBadge/OverlayBadge.d.ts.map +1 -1
  5. package/dist/cjs/components/Molecules/OverlayBadge/OverlayBadge.js +1 -1
  6. package/dist/cjs/components/Organisms/Recommendation/Recommendation.js +5 -5
  7. package/dist/cjs/components/Organisms/RecommendationBundle/BundleSelector.d.ts +1 -1
  8. package/dist/cjs/components/Organisms/RecommendationBundle/BundleSelector.d.ts.map +1 -1
  9. package/dist/cjs/components/Organisms/RecommendationBundle/RecommendationBundle.d.ts.map +1 -1
  10. package/dist/cjs/components/Organisms/RecommendationBundle/RecommendationBundle.js +33 -15
  11. package/dist/cjs/components/Organisms/Results/Results.d.ts.map +1 -1
  12. package/dist/cjs/components/Organisms/Results/Results.js +14 -25
  13. package/dist/cjs/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.d.ts +3 -1
  14. package/dist/cjs/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.d.ts.map +1 -1
  15. package/dist/cjs/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.js +2 -12
  16. package/dist/cjs/components/Trackers/ResultTracker/ResultTracker.d.ts +18 -0
  17. package/dist/cjs/components/Trackers/ResultTracker/ResultTracker.d.ts.map +1 -0
  18. package/dist/cjs/components/Trackers/ResultTracker/ResultTracker.js +68 -0
  19. package/dist/cjs/components/Trackers/ResultTracker/index.d.ts +2 -0
  20. package/dist/cjs/components/Trackers/ResultTracker/index.d.ts.map +1 -0
  21. package/dist/cjs/components/Trackers/{Recommendation/ResultTracker → ResultTracker}/index.js +1 -1
  22. package/dist/cjs/index.d.ts +3 -2
  23. package/dist/cjs/index.d.ts.map +1 -1
  24. package/dist/cjs/index.js +6 -2
  25. package/dist/esm/components/Atoms/Dropdown/Dropdown.d.ts +4 -0
  26. package/dist/esm/components/Atoms/Dropdown/Dropdown.d.ts.map +1 -1
  27. package/dist/esm/components/Atoms/Dropdown/Dropdown.js +53 -18
  28. package/dist/esm/components/Molecules/OverlayBadge/OverlayBadge.d.ts.map +1 -1
  29. package/dist/esm/components/Molecules/OverlayBadge/OverlayBadge.js +1 -0
  30. package/dist/esm/components/Organisms/Recommendation/Recommendation.js +5 -5
  31. package/dist/esm/components/Organisms/RecommendationBundle/BundleSelector.d.ts +1 -1
  32. package/dist/esm/components/Organisms/RecommendationBundle/BundleSelector.d.ts.map +1 -1
  33. package/dist/esm/components/Organisms/RecommendationBundle/RecommendationBundle.d.ts.map +1 -1
  34. package/dist/esm/components/Organisms/RecommendationBundle/RecommendationBundle.js +33 -15
  35. package/dist/esm/components/Organisms/Results/Results.d.ts.map +1 -1
  36. package/dist/esm/components/Organisms/Results/Results.js +3 -10
  37. package/dist/esm/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.d.ts +3 -1
  38. package/dist/esm/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.d.ts.map +1 -1
  39. package/dist/esm/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.js +2 -12
  40. package/dist/esm/components/Trackers/ResultTracker/ResultTracker.d.ts +18 -0
  41. package/dist/esm/components/Trackers/ResultTracker/ResultTracker.d.ts.map +1 -0
  42. package/dist/esm/components/Trackers/ResultTracker/ResultTracker.js +58 -0
  43. package/dist/esm/components/Trackers/ResultTracker/index.d.ts +2 -0
  44. package/dist/esm/components/Trackers/ResultTracker/index.d.ts.map +1 -0
  45. package/dist/esm/components/Trackers/ResultTracker/index.js +1 -0
  46. package/dist/esm/index.d.ts +3 -2
  47. package/dist/esm/index.d.ts.map +1 -1
  48. package/dist/esm/index.js +4 -2
  49. package/package.json +11 -11
  50. package/dist/cjs/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.d.ts +0 -15
  51. package/dist/cjs/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.d.ts.map +0 -1
  52. package/dist/cjs/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.js +0 -59
  53. package/dist/cjs/components/Trackers/Recommendation/ResultTracker/index.d.ts +0 -2
  54. package/dist/cjs/components/Trackers/Recommendation/ResultTracker/index.d.ts.map +0 -1
  55. package/dist/esm/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.d.ts +0 -15
  56. package/dist/esm/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.d.ts.map +0 -1
  57. package/dist/esm/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.js +0 -51
  58. package/dist/esm/components/Trackers/Recommendation/ResultTracker/index.d.ts +0 -2
  59. package/dist/esm/components/Trackers/Recommendation/ResultTracker/index.d.ts.map +0 -1
  60. package/dist/esm/components/Trackers/Recommendation/ResultTracker/index.js +0 -1
@@ -9,10 +9,14 @@ export interface DropdownProps extends ComponentProps {
9
9
  children?: ComponentChildren;
10
10
  disabled?: boolean;
11
11
  open?: boolean;
12
+ disableClick?: boolean;
12
13
  disableOverlay?: boolean;
13
14
  onClick?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
15
+ onMouseEnter?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
16
+ onMouseLeave?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
14
17
  onToggle?: (event: React.MouseEvent<HTMLDivElement, MouseEvent>, showContent: boolean) => void;
15
18
  startOpen?: boolean;
19
+ toggleOnHover?: boolean;
16
20
  disableClickOutside?: boolean;
17
21
  disableA11y?: boolean;
18
22
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../../../src/components/Atoms/Dropdown/Dropdown.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAK,MAAM,QAAQ,CAAC;AAO9C,OAAO,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AA+B5D,eAAO,MAAM,QAAQ,eAAyB,aAAa,KAAG,WAiG5D,CAAC;AAEH,MAAM,WAAW,aAAc,SAAQ,cAAc;IACpD,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB"}
1
+ {"version":3,"file":"Dropdown.d.ts","sourceRoot":"","sources":["../../../../../src/components/Atoms/Dropdown/Dropdown.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAK,MAAM,QAAQ,CAAC;AAO9C,OAAO,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AA+B5D,eAAO,MAAM,QAAQ,eAAyB,aAAa,KAAG,WAmJ5D,CAAC;AAEH,MAAM,WAAW,aAAc,SAAQ,cAAc;IACpD,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACxE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IAC7E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB"}
@@ -41,32 +41,37 @@ export const Dropdown = observer((properties) => {
41
41
  ...properties,
42
42
  ...properties.theme?.components?.dropdown,
43
43
  };
44
- const { button, content, children, disabled, open, disableOverlay, onClick, onToggle, startOpen, disableClickOutside, disableA11y, disableStyles, className, style, } = props;
45
- let showContent, setShowContent;
44
+ const { button, content, children, disabled, open, toggleOnHover, onMouseEnter, onMouseLeave, disableClick, disableOverlay, onClick, onToggle, startOpen, disableClickOutside, disableA11y, disableStyles, className, style, } = props;
45
+ let dropdownOpen, setDropdownOpen;
46
46
  const stateful = open === undefined;
47
47
  if (stateful) {
48
- [showContent, setShowContent] = useState(startOpen);
48
+ [dropdownOpen, setDropdownOpen] = useState(startOpen);
49
49
  }
50
50
  else {
51
- showContent = open;
51
+ dropdownOpen = open;
52
52
  }
53
+ // state to track touch interactions
54
+ const [isTouchInteraction, setIsTouchInteraction] = useState(false);
53
55
  let innerRef;
54
56
  if (!disableClickOutside) {
55
57
  innerRef = useClickOutside((e) => {
56
- if (showContent) {
58
+ if (dropdownOpen) {
57
59
  if (!disabled) {
58
- stateful && setShowContent && setShowContent(false);
60
+ stateful && setDropdownOpen && setDropdownOpen(false);
59
61
  onToggle && onToggle(e, false);
60
62
  }
61
63
  }
62
64
  });
63
65
  }
64
- const toggleShowContent = (e) => {
66
+ const toggleOpenDropdown = (e, state) => {
65
67
  if (stateful) {
66
- setShowContent &&
67
- setShowContent((prev) => {
68
- onToggle && onToggle(e, !prev);
69
- return !prev;
68
+ setDropdownOpen &&
69
+ setDropdownOpen((prev) => {
70
+ const newState = state ?? !prev;
71
+ if (newState != prev) {
72
+ onToggle && onToggle(e, newState);
73
+ }
74
+ return newState;
70
75
  });
71
76
  }
72
77
  };
@@ -77,15 +82,45 @@ export const Dropdown = observer((properties) => {
77
82
  else if (style) {
78
83
  styling.css = [style];
79
84
  }
85
+ const hoverProps = {
86
+ onMouseEnter: (toggleOnHover || onMouseEnter) &&
87
+ ((e) => {
88
+ // skip if it's a touch interaction
89
+ if (isTouchInteraction)
90
+ return;
91
+ if (toggleOnHover && !disabled) {
92
+ toggleOpenDropdown(e, true);
93
+ }
94
+ onMouseEnter && onMouseEnter(e);
95
+ }),
96
+ onMouseLeave: (toggleOnHover || onMouseLeave) &&
97
+ ((e) => {
98
+ // skip if it's a touch interaction
99
+ if (isTouchInteraction)
100
+ return;
101
+ if (toggleOnHover && !disabled) {
102
+ toggleOpenDropdown(e, false);
103
+ }
104
+ onMouseLeave && onMouseLeave(e);
105
+ }),
106
+ };
80
107
  return (jsx(CacheProvider, null,
81
- jsx("div", { ...styling, className: classnames('ss__dropdown', { 'ss__dropdown--open': showContent }, className), ref: innerRef },
82
- jsx("div", { className: "ss__dropdown__button", ref: (e) => (!disableA11y ? useA11y(e) : null), "aria-expanded": showContent, role: "button", onClick: (e) => {
83
- if (!disabled) {
84
- toggleShowContent(e);
108
+ jsx("div", { ...styling, className: classnames('ss__dropdown', { 'ss__dropdown--open': dropdownOpen }, className), ref: innerRef, ...hoverProps },
109
+ jsx("div", { className: "ss__dropdown__button", ref: (e) => (!disableA11y ? useA11y(e) : null), "aria-expanded": dropdownOpen, role: "button", onTouchStart: () => {
110
+ // mark this as a touch interaction to avoid hover state conflicts
111
+ setIsTouchInteraction(true);
112
+ }, onClick: (e) => {
113
+ if (!disabled && !disableClick) {
114
+ toggleOpenDropdown(e);
85
115
  onClick && onClick(e);
86
116
  }
87
- } }, cloneWithProps(button, { open: showContent, toggleOpen: toggleShowContent })),
117
+ // reset touch interaction after a short delay
118
+ // this gives time for the click handler to complete before allowing hover events again
119
+ setTimeout(() => {
120
+ setIsTouchInteraction(false);
121
+ }, 300);
122
+ } }, cloneWithProps(button, { open: dropdownOpen, toggleOpen: toggleOpenDropdown })),
88
123
  jsx("div", { className: "ss__dropdown__content" },
89
- cloneWithProps(content, { open: showContent, toggleOpen: toggleShowContent }),
90
- cloneWithProps(children, { open: showContent, toggleOpen: toggleShowContent })))));
124
+ cloneWithProps(content, { open: dropdownOpen, toggleOpen: toggleOpenDropdown }),
125
+ cloneWithProps(children, { open: dropdownOpen, toggleOpen: toggleOpenDropdown })))));
91
126
  });
@@ -1 +1 @@
1
- {"version":3,"file":"OverlayBadge.d.ts","sourceRoot":"","sources":["../../../../../src/components/Molecules/OverlayBadge/OverlayBadge.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAe,MAAM,QAAQ,CAAC;AAOxD,OAAO,EAAE,cAAc,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AA8C7D,eAAO,MAAM,YAAY,eAAyB,iBAAiB,KAAG,WAuFpE,CAAC;AAEH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;IACjF,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"OverlayBadge.d.ts","sourceRoot":"","sources":["../../../../../src/components/Molecules/OverlayBadge/OverlayBadge.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAE,iBAAiB,EAAe,MAAM,QAAQ,CAAC;AAOxD,OAAO,EAAE,cAAc,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG1E,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AA+C7D,eAAO,MAAM,YAAY,eAAyB,iBAAiB,KAAG,WAuFpE,CAAC;AAEH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACxD,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;IACjF,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf"}
@@ -21,6 +21,7 @@ const CSS = {
21
21
  return css({
22
22
  position: 'relative',
23
23
  '& .ss__overlay-badge__grid-wrapper': {
24
+ pointerEvents: 'none',
24
25
  display: 'grid',
25
26
  position: 'absolute',
26
27
  top: 0,
@@ -12,7 +12,7 @@ import { useIntersection } from '../../../hooks';
12
12
  import { useTheme, CacheProvider } from '../../../providers';
13
13
  import { useDisplaySettings } from '../../../hooks/useDisplaySettings';
14
14
  import { RecommendationProfileTracker } from '../../Trackers/Recommendation/ProfileTracker';
15
- import { RecommendationResultTracker } from '../../Trackers/Recommendation/ResultTracker';
15
+ import { ResultTracker } from '../../Trackers/ResultTracker';
16
16
  const CSS = {
17
17
  recommendation: ({ vertical }) => css({
18
18
  height: vertical ? '100%' : undefined,
@@ -103,11 +103,11 @@ export const Recommendation = observer((properties) => {
103
103
  jsx("div", { ...styling, className: classnames('ss__recommendation', className), ref: recsRef }, isVisible ? (jsx(RecommendationProfileTracker, { controller: controller },
104
104
  title && jsx("h3", { className: "ss__recommendation__title" }, title),
105
105
  jsx(Carousel, { prevButton: prevButton, nextButton: nextButton, hideButtons: hideButtons, loop: loop, pagination: pagination, breakpoints: breakpoints, ...subProps.carousel, ...additionalProps, ...displaySettings }, Array.isArray(children) && children.length
106
- ? children.map((child, idx) => (jsx(RecommendationResultTracker, { controller: controller, result: resultsToRender[idx] }, child)))
107
- : resultsToRender.map((result) => (jsx(RecommendationResultTracker, { controller: controller, result: result },
106
+ ? children.map((child, idx) => (jsx(ResultTracker, { controller: controller, result: resultsToRender[idx] }, child)))
107
+ : resultsToRender.map((result) => (jsx(ResultTracker, { controller: controller, result: result },
108
108
  jsx(Result, { ...subProps.result, controller: controller, result: result }))))))) : (jsx(RecommendationProfileTracker, { controller: controller }, Array.isArray(children) && children.length
109
- ? children.map((child, idx) => (jsx(RecommendationResultTracker, { controller: controller, result: resultsToRender[idx] },
109
+ ? children.map((child, idx) => (jsx(ResultTracker, { controller: controller, result: resultsToRender[idx] },
110
110
  jsx(Fragment, null))))
111
- : resultsToRender.map((result) => (jsx(RecommendationResultTracker, { controller: controller, result: result },
111
+ : resultsToRender.map((result) => (jsx(ResultTracker, { controller: controller, result: result },
112
112
  jsx(Fragment, null))))))))) : (jsx(Fragment, null));
113
113
  });
@@ -15,7 +15,7 @@ export interface BundleSelectorProps extends ComponentProps {
15
15
  seedText?: string;
16
16
  seed?: boolean;
17
17
  hideCheckboxes?: boolean;
18
- onCheck?: () => void;
18
+ onCheck?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;
19
19
  icon?: string | Partial<IconProps> | boolean;
20
20
  }
21
21
  //# sourceMappingURL=BundleSelector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BundleSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/Organisms/RecommendationBundle/BundleSelector.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAK9C,OAAO,EAAY,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAQ,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,eAAO,MAAM,cAAc,eAAyB,mBAAmB,KAAG,WAmDxE,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IAC1D,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;CAC7C"}
1
+ {"version":3,"file":"BundleSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/Organisms/RecommendationBundle/BundleSelector.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAK9C,OAAO,EAAY,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAQ,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,eAAO,MAAM,cAAc,eAAyB,mBAAmB,KAAG,WAmDxE,CAAC;AAEH,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IAC1D,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,KAAK,IAAI,CAAC;IACjE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;CAC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationBundle.d.ts","sourceRoot":"","sources":["../../../../../src/components/Organisms/RecommendationBundle/RecommendationBundle.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAY,aAAa,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIpF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAc,MAAM,gBAAgB,CAAC;AAI9E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAyG7D,eAAO,MAAM,oBAAoB,eAAyB,yBAAyB,KAAG,WA4epF,CAAC;AAEH,KAAK,mBAAmB,GAAG;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE3B,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAChE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,wBAAwB,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvD,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,eAAe,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACF"}
1
+ {"version":3,"file":"RecommendationBundle.d.ts","sourceRoot":"","sources":["../../../../../src/components/Organisms/RecommendationBundle/RecommendationBundle.tsx"],"names":[],"mappings":";AAOA,OAAO,EAAY,aAAa,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIpF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAc,MAAM,gBAAgB,CAAC;AAI9E,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAyG7D,eAAO,MAAM,oBAAoB,eAAyB,yBAAyB,KAAG,WA8fpF,CAAC;AAEH,KAAK,mBAAmB,GAAG;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAE3B,MAAM,WAAW,yBAA0B,SAAQ,cAAc;IAChE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,wBAAwB,CAAC;IACrC,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACvD,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,eAAe,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IACtD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;IAC/B,UAAU,CAAC,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACF"}
@@ -11,7 +11,7 @@ import { cloneWithProps, defined } from '../../../utilities';
11
11
  import { useTheme, CacheProvider } from '../../../providers';
12
12
  import { useDisplaySettings } from '../../../hooks/useDisplaySettings';
13
13
  import { RecommendationProfileTracker } from '../../Trackers/Recommendation/ProfileTracker';
14
- import { RecommendationResultTracker } from '../../Trackers/Recommendation/ResultTracker';
14
+ import { ResultTracker } from '../../Trackers/ResultTracker';
15
15
  import { BundleSelector } from './BundleSelector';
16
16
  import { BundledCTA } from './BundleCTA';
17
17
  import { useIntersection } from '../../../hooks';
@@ -276,7 +276,7 @@ export const RecommendationBundle = observer((properties) => {
276
276
  };
277
277
  const addToCart = (e) => {
278
278
  // add to cart tracking
279
- controller.track.addBundle(e, selectedItems);
279
+ controller.track.bundle.addToCart(selectedItems);
280
280
  //call the function passed
281
281
  onAddToCart && onAddToCart(e, selectedItems);
282
282
  };
@@ -311,8 +311,11 @@ export const RecommendationBundle = observer((properties) => {
311
311
  }) },
312
312
  carouselEnabled ? (jsx(Fragment, null,
313
313
  !seedInCarousel && !hideSeed && (jsx("div", { className: "ss__recommendation-bundle__wrapper__seed-container" },
314
- jsx(RecommendationResultTracker, { controller: controller, result: seed, track: { impression: false } },
315
- jsx(BundleSelector, { seedText: seedText, seed: true, onCheck: () => onProductSelect(seed), checked: selectedItems.findIndex((item) => item.id == seed.id) > -1, icon: separatorIcon, hideCheckboxes: hideCheckboxes, theme: props.theme, ref: seedRef }, resultComponent ? (cloneWithProps(resultComponent, {
314
+ jsx(ResultTracker, { controller: controller, result: seed, track: { impression: false } },
315
+ jsx(BundleSelector, { seedText: seedText, seed: true, onCheck: (e) => {
316
+ e.stopPropagation();
317
+ onProductSelect(seed);
318
+ }, checked: selectedItems.findIndex((item) => item.id == seed.id) > -1, icon: separatorIcon, hideCheckboxes: hideCheckboxes, theme: props.theme, ref: seedRef }, resultComponent ? (cloneWithProps(resultComponent, {
316
319
  result: seed,
317
320
  seed: true,
318
321
  selected: selectedItems.findIndex((item) => item.id == seed.id) > -1,
@@ -325,35 +328,50 @@ export const RecommendationBundle = observer((properties) => {
325
328
  .map((result, idx) => {
326
329
  const selected = selectedItems.findIndex((item) => item.id == result.id) > -1;
327
330
  if (idx == 0 && !hideSeed) {
328
- return (jsx(RecommendationResultTracker, { controller: controller, result: result, track: { impression: false } },
329
- jsx(BundleSelector, { seedText: seedText, seed: true, icon: separatorIcon, onCheck: () => onProductSelect(result), checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: true, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
331
+ return (jsx(ResultTracker, { controller: controller, result: result, track: { impression: false } },
332
+ jsx(BundleSelector, { seedText: seedText, seed: true, icon: separatorIcon, onCheck: (e) => {
333
+ e.stopPropagation();
334
+ onProductSelect(result);
335
+ }, checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: true, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
330
336
  }
331
337
  else {
332
- return (jsx(RecommendationResultTracker, { controller: controller, result: result },
333
- jsx(BundleSelector, { icon: separatorIconSeedOnly ? false : separatorIcon, onCheck: () => onProductSelect(result), checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme, className: idx + 1 == resultsToRender.length ? 'ss__recommendation-bundle__wrapper__selector--last' : '' }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: false, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
338
+ return (jsx(ResultTracker, { controller: controller, result: result },
339
+ jsx(BundleSelector, { icon: separatorIconSeedOnly ? false : separatorIcon, onCheck: (e) => {
340
+ e.stopPropagation();
341
+ onProductSelect(result);
342
+ }, checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme, className: idx + 1 == resultsToRender.length ? 'ss__recommendation-bundle__wrapper__selector--last' : '' }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: false, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
334
343
  }
335
344
  })
336
345
  : resultsToRender
337
346
  .filter((result, idx) => idx !== 0)
338
347
  .map((result, idx, results) => {
339
348
  const selected = selectedItems.findIndex((item) => item.id == result.id) > -1;
340
- return (jsx(RecommendationResultTracker, { controller: controller, result: result },
341
- jsx(BundleSelector, { icon: separatorIconSeedOnly ? false : separatorIcon, onCheck: () => onProductSelect(result), checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme, className: idx + 1 == results.length ? 'ss__recommendation-bundle__wrapper__selector--last' : '' }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: false, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
349
+ return (jsx(ResultTracker, { controller: controller, result: result },
350
+ jsx(BundleSelector, { icon: separatorIconSeedOnly ? false : separatorIcon, onCheck: (e) => {
351
+ e.stopPropagation();
352
+ onProductSelect(result);
353
+ }, checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme, className: idx + 1 == results.length ? 'ss__recommendation-bundle__wrapper__selector--last' : '' }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: false, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
342
354
  }))))) : (resultsToRender
343
355
  .filter((result, idx) => (hideSeed && idx == 0 ? false : true))
344
356
  .map((result, idx) => {
345
357
  const selected = selectedItems.findIndex((item) => item.id == result.id) > -1;
346
358
  if (idx == 0 && !hideSeed) {
347
- return (jsx(RecommendationResultTracker, { controller: controller, result: result, track: { impression: false } },
348
- jsx(BundleSelector, { seedText: seedText, seed: true, icon: separatorIcon, onCheck: () => onProductSelect(result), checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: true, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
359
+ return (jsx(ResultTracker, { controller: controller, result: result, track: { impression: false } },
360
+ jsx(BundleSelector, { seedText: seedText, seed: true, icon: separatorIcon, onCheck: (e) => {
361
+ e.stopPropagation();
362
+ onProductSelect(result);
363
+ }, checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: true, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
349
364
  }
350
365
  else {
351
- return (jsx(RecommendationResultTracker, { controller: controller, result: result },
352
- jsx(BundleSelector, { icon: separatorIconSeedOnly ? false : separatorIcon, onCheck: () => onProductSelect(result), checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme, className: idx + 1 == resultsToRender.length ? 'ss__recommendation-bundle__wrapper__selector--last' : '' }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: false, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
366
+ return (jsx(ResultTracker, { controller: controller, result: result },
367
+ jsx(BundleSelector, { icon: separatorIconSeedOnly ? false : separatorIcon, onCheck: (e) => {
368
+ e.stopPropagation();
369
+ onProductSelect(result);
370
+ }, checked: selected, hideCheckboxes: hideCheckboxes, theme: props.theme, className: idx + 1 == resultsToRender.length ? 'ss__recommendation-bundle__wrapper__selector--last' : '' }, resultComponent ? (cloneWithProps(resultComponent, { result: result, seed: false, selected, onProductSelect })) : (jsx(Result, { ...subProps.result, controller: controller, result: result })))));
353
371
  }
354
372
  })),
355
373
  ctaInline && (jsx(BundledCTA, { ctaSlot: ctaSlot, cartStore: cartStore, onAddToCart: (e) => addToCart(e), ctaButtonText: ctaButtonText, ctaButtonSuccessText: ctaButtonSuccessText, ctaButtonSuccessTimeout: ctaButtonSuccessTimeout, ctaIcon: ctaIcon }))),
356
- !ctaInline && (jsx(BundledCTA, { ctaSlot: ctaSlot, cartStore: cartStore, onAddToCart: (e) => addToCart(e), ctaButtonText: ctaButtonText, ctaButtonSuccessText: ctaButtonSuccessText, ctaButtonSuccessTimeout: ctaButtonSuccessTimeout, ctaIcon: ctaIcon })))) : (jsx(RecommendationProfileTracker, { controller: controller }, resultsToRender.map((result) => (jsx(RecommendationResultTracker, { controller: controller, result: result },
374
+ !ctaInline && (jsx(BundledCTA, { ctaSlot: ctaSlot, cartStore: cartStore, onAddToCart: (e) => addToCart(e), ctaButtonText: ctaButtonText, ctaButtonSuccessText: ctaButtonSuccessText, ctaButtonSuccessTimeout: ctaButtonSuccessTimeout, ctaIcon: ctaIcon })))) : (jsx(RecommendationProfileTracker, { controller: controller }, resultsToRender.map((result) => (jsx(ResultTracker, { controller: controller, result: result },
357
375
  jsx(Fragment, null))))))))) : (jsx(Fragment, null));
358
376
  return jsx(Fragment, null);
359
377
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Results.d.ts","sourceRoot":"","sources":["../../../../../src/components/Organisms/Results/Results.tsx"],"names":[],"mappings":";AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,+BAA+B,CAAC;AAIxF,OAAO,EAAE,cAAc,EAAU,UAAU,EAAE,gBAAgB,EAAc,MAAM,gBAAgB,CAAC;AAuClG,eAAO,MAAM,OAAO,eAAyB,WAAW,KAAG,WA4GzD,CAAC;AAEH,MAAM,WAAW,WAAY,SAAQ,cAAc;IAClD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,UAAU,CAAC,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;CAClF"}
1
+ {"version":3,"file":"Results.d.ts","sourceRoot":"","sources":["../../../../../src/components/Organisms/Results/Results.tsx"],"names":[],"mappings":";AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,+BAA+B,CAAC;AAIxF,OAAO,EAAE,cAAc,EAAU,UAAU,EAAE,gBAAgB,EAAc,MAAM,gBAAgB,CAAC;AA+BlG,eAAO,MAAM,OAAO,eAAyB,WAAW,KAAG,WA8GzD,CAAC;AAEH,MAAM,WAAW,WAAY,SAAQ,cAAc;IAClD,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,UAAU,CAAC,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;CAClF"}
@@ -11,6 +11,7 @@ import { Layout } from '../../../types';
11
11
  import { defined } from '../../../utilities';
12
12
  import { useTheme, CacheProvider } from '../../../providers';
13
13
  import { useDisplaySettings } from '../../../hooks/useDisplaySettings';
14
+ import { ResultTracker } from '../../Trackers/ResultTracker';
14
15
  const CSS = {
15
16
  results: ({ columns, gapSize }) => css({
16
17
  display: 'flex',
@@ -22,14 +23,6 @@ const CSS = {
22
23
  boxSizing: 'border-box',
23
24
  flex: '0 1 auto',
24
25
  width: `calc(${100 / columns}% - (${columns - 1} * ${gapSize} / ${columns} ) )`,
25
- marginRight: gapSize,
26
- marginBottom: gapSize,
27
- [`&:nth-of-type(${columns}n)`]: {
28
- marginRight: '0',
29
- },
30
- [`&:nth-last-of-type(-n+${columns})`]: {
31
- marginBottom: '0',
32
- },
33
26
  },
34
27
  '@supports (display: grid)': {
35
28
  display: 'grid',
@@ -115,12 +108,12 @@ export const Results = observer((properties) => {
115
108
  styling.css = [style];
116
109
  }
117
110
  return results?.length ? (jsx(CacheProvider, null,
118
- jsx("div", { ...styling, className: classnames('ss__results', `ss__results-${props.layout}`, className) }, results.map((result) => (() => {
111
+ jsx("div", { ...styling, className: classnames('ss__results', `ss__results-${props.layout}`, className) }, results.map((result) => (jsx(ResultTracker, { result: result, controller: controller }, (() => {
119
112
  switch (result.type) {
120
113
  case ContentType.BANNER:
121
114
  return jsx(InlineBanner, { ...subProps.inlineBanner, key: result.id, banner: result, layout: props.layout });
122
115
  default:
123
116
  return (jsx(Result, { key: result.id, ...subProps.result, result: result, layout: props.layout, controller: controller }));
124
117
  }
125
- })())))) : (jsx(Fragment, null));
118
+ })())))))) : (jsx(Fragment, null));
126
119
  });
@@ -1,9 +1,11 @@
1
1
  /// <reference types="react" />
2
+ /** @jsx jsx */
3
+ import { ComponentChildren } from 'preact';
2
4
  import type { RecommendationController } from '@searchspring/snap-controller';
3
5
  import { ComponentProps } from '../../../../types';
4
6
  export declare const RecommendationProfileTracker: (properties: RecommendationProfileTrackerProps) => JSX.Element;
5
7
  export interface RecommendationProfileTrackerProps extends ComponentProps {
6
- children: any;
8
+ children: ComponentChildren;
7
9
  controller: RecommendationController;
8
10
  }
9
11
  //# sourceMappingURL=RecommendationProfileTracker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RecommendationProfileTracker.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.tsx"],"names":[],"mappings":";AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAO/D,eAAO,MAAM,4BAA4B,eAAyB,iCAAiC,KAAG,WA+CpG,CAAC;AAEH,MAAM,WAAW,iCAAkC,SAAQ,cAAc;IACxE,QAAQ,EAAE,GAAG,CAAC;IACd,UAAU,EAAE,wBAAwB,CAAC;CACrC"}
1
+ {"version":3,"file":"RecommendationProfileTracker.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Trackers/Recommendation/ProfileTracker/RecommendationProfileTracker.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAE,iBAAiB,EAA6B,MAAM,QAAQ,CAAC;AAItE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAO/D,eAAO,MAAM,4BAA4B,eAAyB,iCAAiC,KAAG,WA8BpG,CAAC;AAEH,MAAM,WAAW,iCAAkC,SAAQ,cAAc;IACxE,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,EAAE,wBAAwB,CAAC;CACrC"}
@@ -1,10 +1,8 @@
1
1
  /** @jsx jsx */
2
2
  import { Fragment, toChildArray } from 'preact';
3
3
  import { jsx, css } from '@emotion/react';
4
- import { useRef } from 'preact/hooks';
5
4
  import { observer } from 'mobx-react';
6
5
  import { useTheme } from '../../../../providers';
7
- import { useIntersection } from '../../../../hooks';
8
6
  import classnames from 'classnames';
9
7
  const CSS = {
10
8
  RecommendationProfileTracker: () => css({}),
@@ -19,16 +17,8 @@ export const RecommendationProfileTracker = observer((properties) => {
19
17
  ...properties,
20
18
  ...properties.theme?.components?.RecommendationProfileTracker,
21
19
  };
22
- const { children, controller, className, style, disableStyles } = props;
20
+ const { children, className, style, disableStyles } = props;
23
21
  const childs = toChildArray(children);
24
- // do impression tracking for "profile"
25
- const componentRef = useRef(null);
26
- const inViewport = useIntersection(componentRef, '0px');
27
- if (inViewport) {
28
- controller.track.impression();
29
- }
30
- // takes care of rendering profile
31
- childs.length && controller.track.render();
32
22
  const styling = {};
33
23
  if (!disableStyles) {
34
24
  styling.css = [CSS.RecommendationProfileTracker(), style];
@@ -36,5 +26,5 @@ export const RecommendationProfileTracker = observer((properties) => {
36
26
  else if (style) {
37
27
  styling.css = [style];
38
28
  }
39
- return childs.length ? (jsx("div", { className: classnames('ss__recommendation-profile-tracker', className), onClick: (e) => controller.track.click(e), ref: componentRef, ...styling }, children)) : (jsx(Fragment, null));
29
+ return childs.length ? (jsx("div", { className: classnames('ss__recommendation-profile-tracker', className), ...styling }, children)) : (jsx(Fragment, null));
40
30
  });
@@ -0,0 +1,18 @@
1
+ /// <reference types="react" />
2
+ /** @jsx jsx */
3
+ import { ComponentChildren } from 'preact';
4
+ import type { AutocompleteController, RecommendationController, SearchController } from '@searchspring/snap-controller';
5
+ import { ComponentProps } from '../../../types';
6
+ import type { Banner, Product } from '@searchspring/snap-store-mobx';
7
+ export declare const ResultTracker: (properties: ResultTrackerProps) => JSX.Element;
8
+ export interface ResultTrackerProps extends ComponentProps {
9
+ children: ComponentChildren;
10
+ result: Product | Banner;
11
+ controller: SearchController | AutocompleteController | RecommendationController;
12
+ track?: {
13
+ render?: boolean;
14
+ impression?: boolean;
15
+ click?: boolean;
16
+ };
17
+ }
18
+ //# sourceMappingURL=ResultTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultTracker.d.ts","sourceRoot":"","sources":["../../../../../src/components/Trackers/ResultTracker/ResultTracker.tsx"],"names":[],"mappings":";AAAA,eAAe;AACf,OAAO,EAAK,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAM9C,OAAO,KAAK,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACxH,OAAO,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAOrE,eAAO,MAAM,aAAa,eAAyB,kBAAkB,KAAG,WA+DtE,CAAC;AAEH,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACzD,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,UAAU,EAAE,gBAAgB,GAAG,sBAAsB,GAAG,wBAAwB,CAAC;IACjF,KAAK,CAAC,EAAE;QACP,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ import { jsx, css } from '@emotion/react';
2
+ import { useRef, useEffect } from 'preact/hooks';
3
+ import { observer } from 'mobx-react';
4
+ import { useTheme } from '../../../providers';
5
+ import { useIntersection } from '../../../hooks';
6
+ import classnames from 'classnames';
7
+ const CSS = {
8
+ ResultTracker: () => css({}),
9
+ };
10
+ export const ResultTracker = observer((properties) => {
11
+ const globalTheme = useTheme();
12
+ const defaultTrack = {
13
+ render: true,
14
+ impression: true,
15
+ click: true,
16
+ };
17
+ const props = {
18
+ // default props
19
+ // global theme
20
+ ...globalTheme?.components?.ResultTracker,
21
+ // props
22
+ ...properties,
23
+ ...properties.theme?.components?.ResultTracker,
24
+ };
25
+ const { children, result, track, controller, className, disableStyles, style } = props;
26
+ const mergedTrack = {
27
+ ...defaultTrack,
28
+ ...track,
29
+ };
30
+ const resultRef = useRef(null);
31
+ const resultInViewport = useIntersection(resultRef, '0px');
32
+ useEffect(() => {
33
+ if (mergedTrack.render) {
34
+ if (result.type === 'product') {
35
+ controller?.track?.product?.render(result);
36
+ }
37
+ }
38
+ }, [result]);
39
+ if (resultInViewport && mergedTrack.impression) {
40
+ if (result.type === 'product' && controller?.track) {
41
+ controller?.track?.product?.impression(result);
42
+ }
43
+ }
44
+ const styling = {};
45
+ if (!disableStyles) {
46
+ styling.css = [CSS.ResultTracker(), style];
47
+ }
48
+ else if (style) {
49
+ styling.css = [style];
50
+ }
51
+ return (jsx("div", { className: classnames('ss__result-tracker', `ss__${controller?.type}-result-tracker`, className), onClick: (e) => {
52
+ if (mergedTrack.click) {
53
+ if (result.type === 'product') {
54
+ controller?.track?.product?.click(e, result);
55
+ }
56
+ }
57
+ }, ref: resultRef, ...styling }, children));
58
+ });
@@ -0,0 +1,2 @@
1
+ export * from './ResultTracker';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/components/Trackers/ResultTracker/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './ResultTracker';
@@ -13,8 +13,6 @@ export * from './components/Atoms/Merchandising';
13
13
  export * from './components/Atoms/Overlay';
14
14
  export * from './components/Atoms/Price';
15
15
  export * from './components/Atoms/Skeleton';
16
- export * from './components/Trackers/Recommendation/ResultTracker';
17
- export * from './components/Trackers/Recommendation/ProfileTracker';
18
16
  export * from './components/Molecules/CalloutBadge';
19
17
  export * from './components/Molecules/Carousel';
20
18
  export * from './components/Molecules/Checkbox';
@@ -42,6 +40,9 @@ export * from './components/Organisms/FilterSummary';
42
40
  export * from './components/Organisms/Recommendation';
43
41
  export * from './components/Organisms/RecommendationBundle';
44
42
  export * from './components/Organisms/Results';
43
+ export * from './components/Trackers/Recommendation/ProfileTracker';
44
+ export * from './components/Trackers/ResultTracker';
45
+ export { ResultTracker as RecommendationResultTracker, ResultTrackerProps as RecommendationResultTrackerProps, } from './components/Trackers/ResultTracker';
45
46
  export * from './hooks';
46
47
  export * from './providers';
47
48
  export * from './toolbox';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oDAAoD,CAAC;AACnE,cAAc,qDAAqD,CAAC;AAGpE,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,gCAAgC,CAAC;AAG/C,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAG5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AACxD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,oCAAoC,CAAC;AACnD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,gCAAgC,CAAC;AAG/C,cAAc,qDAAqD,CAAC;AACpE,cAAc,qCAAqC,CAAC;AACpD,OAAO,EACN,aAAa,IAAI,2BAA2B,EAC5C,kBAAkB,IAAI,gCAAgC,GACtD,MAAM,qCAAqC,CAAC;AAG7C,cAAc,SAAS,CAAC;AAGxB,cAAc,aAAa,CAAC;AAG5B,cAAc,WAAW,CAAC"}
package/dist/esm/index.js CHANGED
@@ -14,8 +14,6 @@ export * from './components/Atoms/Merchandising';
14
14
  export * from './components/Atoms/Overlay';
15
15
  export * from './components/Atoms/Price';
16
16
  export * from './components/Atoms/Skeleton';
17
- export * from './components/Trackers/Recommendation/ResultTracker';
18
- export * from './components/Trackers/Recommendation/ProfileTracker';
19
17
  // MOLECULES
20
18
  export * from './components/Molecules/CalloutBadge';
21
19
  export * from './components/Molecules/Carousel';
@@ -45,6 +43,10 @@ export * from './components/Organisms/FilterSummary';
45
43
  export * from './components/Organisms/Recommendation';
46
44
  export * from './components/Organisms/RecommendationBundle';
47
45
  export * from './components/Organisms/Results';
46
+ // TRACKERS
47
+ export * from './components/Trackers/Recommendation/ProfileTracker';
48
+ export * from './components/Trackers/ResultTracker';
49
+ export { ResultTracker as RecommendationResultTracker, } from './components/Trackers/ResultTracker';
48
50
  // HOOKS
49
51
  export * from './hooks';
50
52
  // PROVIDERS
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@searchspring/snap-preact-components",
3
- "version": "0.63.5",
3
+ "version": "0.65.0",
4
4
  "description": "Snap Preact Component Library",
5
5
  "author": "Searchspring",
6
6
  "license": "MIT",
@@ -29,7 +29,7 @@
29
29
  "dependencies": {
30
30
  "@cypress/react": "^8.0.0",
31
31
  "@emotion/react": "11.9.0",
32
- "@searchspring/snap-toolbox": "^0.63.5",
32
+ "@searchspring/snap-toolbox": "^0.65.0",
33
33
  "classnames": "^2.3.2",
34
34
  "cypress": "^13.7.1",
35
35
  "cypress-wait-until": "^1.7.2",
@@ -52,14 +52,14 @@
52
52
  "@babel/preset-env": "^7.21.4",
53
53
  "@babel/preset-react": "^7.18.6",
54
54
  "@babel/runtime": "^7.21.0",
55
- "@searchspring/snap-client": "^0.63.5",
56
- "@searchspring/snap-controller": "^0.63.5",
57
- "@searchspring/snap-event-manager": "^0.63.5",
58
- "@searchspring/snap-logger": "^0.63.5",
59
- "@searchspring/snap-profiler": "^0.63.5",
60
- "@searchspring/snap-store-mobx": "^0.63.5",
61
- "@searchspring/snap-tracker": "^0.63.5",
62
- "@searchspring/snap-url-manager": "^0.63.5",
55
+ "@searchspring/snap-client": "^0.65.0",
56
+ "@searchspring/snap-controller": "^0.65.0",
57
+ "@searchspring/snap-event-manager": "^0.65.0",
58
+ "@searchspring/snap-logger": "^0.65.0",
59
+ "@searchspring/snap-profiler": "^0.65.0",
60
+ "@searchspring/snap-store-mobx": "^0.65.0",
61
+ "@searchspring/snap-tracker": "^0.65.0",
62
+ "@searchspring/snap-url-manager": "^0.65.0",
63
63
  "@storybook/addon-actions": "6.4.22",
64
64
  "@storybook/addon-controls": "6.4.22",
65
65
  "@storybook/addon-docs": "6.4.22",
@@ -84,5 +84,5 @@
84
84
  "webpack-merge": "^5.8.0"
85
85
  },
86
86
  "sideEffects": false,
87
- "gitHead": "d35f838dc0f3b254b524e858cbcc1c728db2b610"
87
+ "gitHead": "e96fc4426a64178a94a8ca603ec834bdca020fdb"
88
88
  }
@@ -1,15 +0,0 @@
1
- /// <reference types="react" />
2
- import type { RecommendationController } from '@searchspring/snap-controller';
3
- import { ComponentProps } from '../../../../types';
4
- import type { Product } from '@searchspring/snap-store-mobx';
5
- export declare const RecommendationResultTracker: (properties: RecommendationResultTrackerProps) => JSX.Element;
6
- export interface RecommendationResultTrackerProps extends ComponentProps {
7
- children: any;
8
- result: Product;
9
- controller: RecommendationController;
10
- track?: {
11
- impression?: boolean;
12
- click?: boolean;
13
- };
14
- }
15
- //# sourceMappingURL=RecommendationResultTracker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RecommendationResultTracker.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Trackers/Recommendation/ResultTracker/RecommendationResultTracker.tsx"],"names":[],"mappings":";AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAc,MAAM,mBAAmB,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAO7D,eAAO,MAAM,2BAA2B,eAAyB,gCAAgC,KAAG,WAwDlG,CAAC;AAEH,MAAM,WAAW,gCAAiC,SAAQ,cAAc;IACvE,QAAQ,EAAE,GAAG,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,wBAAwB,CAAC;IACrC,KAAK,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACF"}