@seekora-ai/ui-sdk-react 0.2.13 → 0.2.15

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 (117) hide show
  1. package/dist/components/CurrentRefinements.d.ts +22 -2
  2. package/dist/components/CurrentRefinements.d.ts.map +1 -1
  3. package/dist/components/CurrentRefinements.js +259 -47
  4. package/dist/components/FacetDropdown.d.ts +92 -0
  5. package/dist/components/FacetDropdown.d.ts.map +1 -0
  6. package/dist/components/FacetDropdown.js +374 -0
  7. package/dist/components/Facets.d.ts +56 -1
  8. package/dist/components/Facets.d.ts.map +1 -1
  9. package/dist/components/Facets.js +602 -41
  10. package/dist/components/FederatedDropdown.d.ts.map +1 -1
  11. package/dist/components/FederatedDropdown.js +45 -31
  12. package/dist/components/HierarchicalMenu.d.ts.map +1 -1
  13. package/dist/components/HierarchicalMenu.js +112 -4
  14. package/dist/components/Pagination.d.ts +47 -1
  15. package/dist/components/Pagination.d.ts.map +1 -1
  16. package/dist/components/Pagination.js +166 -28
  17. package/dist/components/QuerySuggestionsDropdown.d.ts.map +1 -1
  18. package/dist/components/QuerySuggestionsDropdown.js +32 -18
  19. package/dist/components/RangeInput.d.ts.map +1 -1
  20. package/dist/components/RangeInput.js +6 -6
  21. package/dist/components/RangeSlider.d.ts.map +1 -1
  22. package/dist/components/RangeSlider.js +101 -32
  23. package/dist/components/RichQuerySuggestions.d.ts +7 -0
  24. package/dist/components/RichQuerySuggestions.d.ts.map +1 -1
  25. package/dist/components/RichQuerySuggestions.js +40 -26
  26. package/dist/components/SearchBar.d.ts +16 -0
  27. package/dist/components/SearchBar.d.ts.map +1 -1
  28. package/dist/components/SearchBar.js +139 -17
  29. package/dist/components/SearchBarWithSuggestions.js +3 -3
  30. package/dist/components/SearchLayout.d.ts.map +1 -1
  31. package/dist/components/SearchLayout.js +10 -1
  32. package/dist/components/SearchProvider.d.ts +8 -1
  33. package/dist/components/SearchProvider.d.ts.map +1 -1
  34. package/dist/components/SearchProvider.js +16 -4
  35. package/dist/components/SearchResults.d.ts +10 -0
  36. package/dist/components/SearchResults.d.ts.map +1 -1
  37. package/dist/components/SearchResults.js +46 -30
  38. package/dist/components/SortBy.d.ts +44 -4
  39. package/dist/components/SortBy.d.ts.map +1 -1
  40. package/dist/components/SortBy.js +154 -29
  41. package/dist/components/Stats.d.ts +14 -0
  42. package/dist/components/Stats.d.ts.map +1 -1
  43. package/dist/components/Stats.js +172 -23
  44. package/dist/components/primitives/ActionButtons.d.ts.map +1 -1
  45. package/dist/components/primitives/ActionButtons.js +34 -10
  46. package/dist/components/primitives/BadgeList.d.ts.map +1 -1
  47. package/dist/components/primitives/BadgeList.js +33 -13
  48. package/dist/components/primitives/ImageDisplay.d.ts.map +1 -1
  49. package/dist/components/primitives/ImageDisplay.js +11 -8
  50. package/dist/components/primitives/ImageZoom.js +26 -26
  51. package/dist/components/primitives/VariantSelector.js +10 -10
  52. package/dist/components/primitives/VariantSwatches.js +3 -3
  53. package/dist/components/product-page/ProductGallery.d.ts +8 -1
  54. package/dist/components/product-page/ProductGallery.d.ts.map +1 -1
  55. package/dist/components/product-page/ProductGallery.js +2 -2
  56. package/dist/components/section-primitives/SectionSearchProvider.d.ts +3 -1
  57. package/dist/components/section-primitives/SectionSearchProvider.d.ts.map +1 -1
  58. package/dist/components/section-primitives/SectionSearchProvider.js +3 -2
  59. package/dist/components/suggestions/AmazonDropdown.d.ts.map +1 -1
  60. package/dist/components/suggestions/AmazonDropdown.js +2 -4
  61. package/dist/components/suggestions/GoogleDropdown.d.ts.map +1 -1
  62. package/dist/components/suggestions/GoogleDropdown.js +2 -6
  63. package/dist/components/suggestions/MinimalDropdown.d.ts.map +1 -1
  64. package/dist/components/suggestions/MinimalDropdown.js +2 -4
  65. package/dist/components/suggestions/MobileSheetDropdown.d.ts.map +1 -1
  66. package/dist/components/suggestions/MobileSheetDropdown.js +20 -22
  67. package/dist/components/suggestions/PinterestDropdown.d.ts.map +1 -1
  68. package/dist/components/suggestions/PinterestDropdown.js +2 -6
  69. package/dist/components/suggestions/ShopifyDropdown.d.ts.map +1 -1
  70. package/dist/components/suggestions/ShopifyDropdown.js +39 -41
  71. package/dist/components/suggestions/SpotlightDropdown.d.ts.map +1 -1
  72. package/dist/components/suggestions/SpotlightDropdown.js +2 -4
  73. package/dist/components/suggestions/utils.d.ts +10 -1
  74. package/dist/components/suggestions/utils.d.ts.map +1 -1
  75. package/dist/components/suggestions/utils.js +36 -0
  76. package/dist/components/suggestions-primitives/DropdownPanel.d.ts.map +1 -1
  77. package/dist/components/suggestions-primitives/DropdownPanel.js +15 -2
  78. package/dist/components/suggestions-primitives/ItemCard.d.ts.map +1 -1
  79. package/dist/components/suggestions-primitives/ItemCard.js +21 -8
  80. package/dist/components/suggestions-primitives/ItemGrid.d.ts.map +1 -1
  81. package/dist/components/suggestions-primitives/ItemGrid.js +9 -3
  82. package/dist/components/suggestions-primitives/ProductCard.d.ts.map +1 -1
  83. package/dist/components/suggestions-primitives/ProductCard.js +25 -10
  84. package/dist/components/suggestions-primitives/ProductCardLayouts.d.ts.map +1 -1
  85. package/dist/components/suggestions-primitives/ProductCardLayouts.js +24 -12
  86. package/dist/components/suggestions-primitives/SearchInput.d.ts.map +1 -1
  87. package/dist/components/suggestions-primitives/SearchInput.js +28 -9
  88. package/dist/components/suggestions-primitives/SuggestionItem.d.ts.map +1 -1
  89. package/dist/components/suggestions-primitives/SuggestionItem.js +3 -0
  90. package/dist/components/suggestions-primitives/highlightMarkup.d.ts +16 -4
  91. package/dist/components/suggestions-primitives/highlightMarkup.d.ts.map +1 -1
  92. package/dist/components/suggestions-primitives/highlightMarkup.js +42 -4
  93. package/dist/hooks/useClickTracking.d.ts +36 -0
  94. package/dist/hooks/useClickTracking.d.ts.map +1 -0
  95. package/dist/hooks/useClickTracking.js +96 -0
  96. package/dist/hooks/useExperiment.d.ts +25 -0
  97. package/dist/hooks/useExperiment.d.ts.map +1 -0
  98. package/dist/hooks/useExperiment.js +146 -0
  99. package/dist/hooks/useKeyboardNavigation.d.ts +51 -0
  100. package/dist/hooks/useKeyboardNavigation.d.ts.map +1 -0
  101. package/dist/hooks/useKeyboardNavigation.js +113 -0
  102. package/dist/hooks/useQuerySuggestions.d.ts.map +1 -1
  103. package/dist/hooks/useQuerySuggestions.js +19 -3
  104. package/dist/hooks/useQuerySuggestionsEnhanced.d.ts.map +1 -1
  105. package/dist/hooks/useQuerySuggestionsEnhanced.js +23 -6
  106. package/dist/hooks/useSuggestionsAnalytics.d.ts.map +1 -1
  107. package/dist/hooks/useSuggestionsAnalytics.js +6 -1
  108. package/dist/index.d.ts +6 -1
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +1 -0
  111. package/dist/index.umd.js +1 -1
  112. package/dist/src/index.d.ts +345 -19
  113. package/dist/src/index.esm.js +2869 -787
  114. package/dist/src/index.esm.js.map +1 -1
  115. package/dist/src/index.js +2868 -785
  116. package/dist/src/index.js.map +1 -1
  117. package/package.json +6 -6
@@ -2,13 +2,48 @@
2
2
  * Stats Component
3
3
  *
4
4
  * Displays search statistics (total results, processing time, etc.)
5
+ * Supports inline, badge, and detailed display variants.
5
6
  */
6
- import React from 'react';
7
+ import React, { useEffect, useRef, useState } from 'react';
7
8
  import { useSearchContext } from './SearchProvider';
9
+ import { useSearchState } from '../hooks/useSearchState';
8
10
  import { clsx } from 'clsx';
9
- export const Stats = ({ results, renderStats, className, style, theme: customTheme, showProcessingTime = false, showQuery = false, separator = ' • ', }) => {
11
+ /** CSS class name used for the animated count fade transition */
12
+ const ANIMATE_CLASS = 'seekora-stats-animate';
13
+ /** Inline <style> for the count-change animation and CSS custom properties */
14
+ const statsStyleId = 'seekora-stats-styles';
15
+ function ensureStatsStyles() {
16
+ if (typeof document === 'undefined')
17
+ return;
18
+ if (document.getElementById(statsStyleId))
19
+ return;
20
+ const style = document.createElement('style');
21
+ style.id = statsStyleId;
22
+ style.textContent = `
23
+ .seekora-stats-root {
24
+ --seekora-stats-color: inherit;
25
+ --seekora-stats-bg: transparent;
26
+ --seekora-stats-font-size: inherit;
27
+ --seekora-stats-badge-bg: inherit;
28
+ --seekora-stats-badge-color: inherit;
29
+ }
30
+ .${ANIMATE_CLASS} {
31
+ opacity: 0;
32
+ transition: opacity 250ms ease-in-out;
33
+ }
34
+ `;
35
+ document.head.appendChild(style);
36
+ }
37
+ export const Stats = ({ results: resultsProp, renderStats, className, style, theme: customTheme, showProcessingTime = false, showQuery = false, separator = ' \u2022 ', variant = 'inline', showResultCount = true, formatNumber, }) => {
10
38
  const { theme } = useSearchContext();
39
+ const { results: stateResults } = useSearchState();
11
40
  const statsTheme = customTheme || {};
41
+ // Use results from prop if provided, otherwise from state manager
42
+ const results = resultsProp || stateResults;
43
+ // Inject keyframe / transition styles once
44
+ useEffect(() => {
45
+ ensureStatsStyles();
46
+ }, []);
12
47
  // Extract stats from results
13
48
  const res = results;
14
49
  const totalResults = res?.totalResults
@@ -19,34 +54,148 @@ export const Stats = ({ results, renderStats, className, style, theme: customThe
19
54
  || res?.data?.processingTimeMS
20
55
  || res?.data?.data?.processingTimeMS;
21
56
  const query = (res?.query ?? '');
22
- const defaultRenderStats = () => {
23
- const parts = [];
24
- if (totalResults > 0) {
25
- parts.push(`${totalResults.toLocaleString()} result${totalResults !== 1 ? 's' : ''}`);
57
+ // Number formatter
58
+ const fmt = formatNumber || ((n) => n.toLocaleString());
59
+ // Animated count change — toggle a CSS class briefly on totalResults change
60
+ const countRef = useRef(null);
61
+ const prevTotalRef = useRef(totalResults);
62
+ const [animating, setAnimating] = useState(false);
63
+ useEffect(() => {
64
+ if (prevTotalRef.current !== totalResults) {
65
+ prevTotalRef.current = totalResults;
66
+ setAnimating(true);
67
+ // After a frame, remove the class so the transition plays (opacity 0 -> 1)
68
+ const raf = requestAnimationFrame(() => {
69
+ setAnimating(false);
70
+ });
71
+ return () => cancelAnimationFrame(raf);
26
72
  }
27
- else {
28
- parts.push('No results');
73
+ }, [totalResults]);
74
+ // Helper: border radius value from theme
75
+ const borderRadiusSmall = typeof theme.borderRadius === 'string'
76
+ ? theme.borderRadius
77
+ : theme.borderRadius.small;
78
+ // ─── Custom render ────────────────────────────────────────
79
+ if (renderStats) {
80
+ return (React.createElement("div", { className: clsx('seekora-stats-root', statsTheme.container, className), style: style }, renderStats({
81
+ totalResults,
82
+ processingTime,
83
+ query,
84
+ })));
85
+ }
86
+ // ─── Inline variant (original behaviour) ──────────────────
87
+ if (variant === 'inline') {
88
+ const parts = [];
89
+ if (showResultCount) {
90
+ if (totalResults > 0) {
91
+ parts.push(React.createElement("span", { key: "count", className: statsTheme.text },
92
+ React.createElement("span", { ref: countRef, className: clsx(animating && ANIMATE_CLASS), style: { transition: 'opacity 250ms ease-in-out' } }, fmt(totalResults)),
93
+ ` result${totalResults !== 1 ? 's' : ''}`));
94
+ }
95
+ else {
96
+ parts.push(React.createElement("span", { key: "count", className: statsTheme.text }, "No results"));
97
+ }
29
98
  }
30
99
  if (showProcessingTime && processingTime !== undefined) {
31
- parts.push(`${processingTime}ms`);
100
+ parts.push(React.createElement("span", { key: "time", className: statsTheme.text },
101
+ fmt(processingTime),
102
+ "ms"));
32
103
  }
33
104
  if (showQuery && query) {
34
- parts.push(`for "${query}"`);
105
+ parts.push(React.createElement("span", { key: "query", className: statsTheme.text },
106
+ "for \"",
107
+ query,
108
+ "\""));
35
109
  }
36
- return (React.createElement("div", { className: clsx(statsTheme.container, className), style: {
37
- fontSize: theme.typography.fontSize.medium,
38
- color: theme.colors.text,
110
+ return (React.createElement("div", { className: clsx('seekora-stats-root', statsTheme.container, className), style: {
111
+ fontSize: 'var(--seekora-stats-font-size,' + theme.typography.fontSize.medium + ')',
112
+ color: 'var(--seekora-stats-color,' + theme.colors.text + ')',
113
+ backgroundColor: 'var(--seekora-stats-bg, transparent)',
39
114
  ...style,
40
115
  } }, parts.map((part, index) => (React.createElement("span", { key: index },
41
- index > 0 && React.createElement("span", { className: statsTheme.separator, style: { margin: `0 ${theme.spacing.small}` } }, separator),
42
- React.createElement("span", { className: statsTheme.text }, part))))));
43
- };
44
- if (renderStats) {
45
- return (React.createElement("div", { className: clsx(statsTheme.container, className), style: style }, renderStats({
46
- totalResults,
47
- processingTime,
48
- query,
49
- })));
116
+ index > 0 && (React.createElement("span", { className: statsTheme.separator, style: { margin: `0 ${theme.spacing.small}` } }, separator)),
117
+ part)))));
118
+ }
119
+ // ─── Badge variant ────────────────────────────────────────
120
+ if (variant === 'badge') {
121
+ const badges = [];
122
+ const badgeStyle = {
123
+ display: 'inline-flex',
124
+ alignItems: 'center',
125
+ gap: theme.spacing.small,
126
+ padding: `${theme.spacing.small} ${theme.spacing.medium}`,
127
+ borderRadius: borderRadiusSmall,
128
+ backgroundColor: `var(--seekora-stats-badge-bg, ${theme.colors.primary}1A)`, // 10 % opacity hex
129
+ color: `var(--seekora-stats-badge-color, ${theme.colors.primary})`,
130
+ fontSize: theme.typography.fontSize.small,
131
+ fontWeight: 500,
132
+ };
133
+ if (showResultCount) {
134
+ badges.push(React.createElement("span", { key: "count", className: clsx(statsTheme.badge), style: badgeStyle },
135
+ React.createElement("span", { className: statsTheme.badgeLabel }, "Results"),
136
+ React.createElement("span", { className: clsx(statsTheme.badgeValue, animating && ANIMATE_CLASS), style: { fontWeight: 600, transition: 'opacity 250ms ease-in-out' } }, totalResults > 0 ? fmt(totalResults) : '0')));
137
+ }
138
+ if (showQuery && query) {
139
+ badges.push(React.createElement("span", { key: "query", className: clsx(statsTheme.badge), style: badgeStyle },
140
+ React.createElement("span", { className: statsTheme.badgeLabel }, "Query"),
141
+ React.createElement("span", { className: statsTheme.badgeValue, style: { fontWeight: 600 } }, query)));
142
+ }
143
+ if (showProcessingTime && processingTime !== undefined) {
144
+ badges.push(React.createElement("span", { key: "time", className: clsx(statsTheme.badge), style: badgeStyle },
145
+ React.createElement("span", { className: statsTheme.badgeLabel }, "Time"),
146
+ React.createElement("span", { className: statsTheme.badgeValue, style: { fontWeight: 600 } },
147
+ fmt(processingTime),
148
+ "ms")));
149
+ }
150
+ return (React.createElement("div", { className: clsx('seekora-stats-root', statsTheme.container, className), style: {
151
+ display: 'flex',
152
+ flexWrap: 'wrap',
153
+ gap: theme.spacing.small,
154
+ fontSize: 'var(--seekora-stats-font-size,' + theme.typography.fontSize.small + ')',
155
+ color: 'var(--seekora-stats-color,' + theme.colors.text + ')',
156
+ backgroundColor: 'var(--seekora-stats-bg, transparent)',
157
+ ...style,
158
+ } }, badges));
159
+ }
160
+ // ─── Detailed variant ─────────────────────────────────────
161
+ if (variant === 'detailed') {
162
+ const rows = [];
163
+ if (showResultCount) {
164
+ rows.push({
165
+ label: 'Total Results',
166
+ value: (React.createElement("span", { className: clsx(animating && ANIMATE_CLASS), style: { transition: 'opacity 250ms ease-in-out' } }, fmt(totalResults))),
167
+ });
168
+ }
169
+ if (showQuery && query) {
170
+ rows.push({ label: 'Query', value: query });
171
+ }
172
+ if (showProcessingTime && processingTime !== undefined) {
173
+ rows.push({ label: 'Time', value: `${fmt(processingTime)}ms` });
174
+ }
175
+ return (React.createElement("div", { className: clsx('seekora-stats-root', statsTheme.detailed, statsTheme.container, className), style: {
176
+ display: 'flex',
177
+ flexDirection: 'column',
178
+ gap: theme.spacing.small,
179
+ fontSize: 'var(--seekora-stats-font-size,' + theme.typography.fontSize.medium + ')',
180
+ color: 'var(--seekora-stats-color,' + theme.colors.text + ')',
181
+ backgroundColor: 'var(--seekora-stats-bg, transparent)',
182
+ ...style,
183
+ } }, rows.map((row, index) => (React.createElement("div", { key: index, className: statsTheme.detailedRow, style: {
184
+ display: 'flex',
185
+ alignItems: 'center',
186
+ gap: theme.spacing.small,
187
+ } },
188
+ React.createElement("span", { className: statsTheme.detailedLabel, style: {
189
+ color: theme.colors.textSecondary,
190
+ fontWeight: 500,
191
+ } },
192
+ row.label,
193
+ ":"),
194
+ React.createElement("span", { className: statsTheme.detailedValue, style: {
195
+ color: theme.colors.text,
196
+ fontWeight: 600,
197
+ } }, row.value))))));
50
198
  }
51
- return defaultRenderStats();
199
+ // Fallback (should not be reached)
200
+ return null;
52
201
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ActionButtons.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/ActionButtons.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAwBD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,MAAqB,EACrB,QAAmB,EACnB,UAAkB,EAClB,IAAe,EACf,SAAS,EACT,KAAK,GACN,EAAE,kBAAkB,qBAqFpB"}
1
+ {"version":3,"file":"ActionButtons.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/ActionButtons.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AA+B1B,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;AAE7F,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,EAAE,WAAW,GAAG,eAAe,GAAG,QAAQ,CAAC;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAwBD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,MAAqB,EACrB,QAAmB,EACnB,UAAkB,EAClB,IAAe,EACf,SAAS,EACT,KAAK,GACN,EAAE,kBAAkB,qBAqFpB"}
@@ -6,6 +6,30 @@
6
6
  */
7
7
  import React from 'react';
8
8
  import { clsx } from 'clsx';
9
+ const SPACING = {
10
+ xs: 4,
11
+ sm: 8,
12
+ md: 12,
13
+ lg: 16,
14
+ xl: 24,
15
+ };
16
+ const TRANSITIONS = {
17
+ fast: '150ms ease-in-out',
18
+ normal: '200ms ease-in-out',
19
+ slow: '300ms ease-in-out',
20
+ };
21
+ const BORDER_RADIUS = {
22
+ sm: 4,
23
+ md: 6,
24
+ lg: 8,
25
+ full: 9999,
26
+ };
27
+ const SHADOWS = {
28
+ sm: '0 1px 2px rgba(0,0,0,0.05)',
29
+ md: '0 2px 4px rgba(0,0,0,0.1)',
30
+ lg: '0 4px 6px rgba(0,0,0,0.1)',
31
+ xl: '0 10px 15px rgba(0,0,0,0.1)',
32
+ };
9
33
  const DEFAULT_ICONS = {
10
34
  addToCart: '🛒',
11
35
  wishlist: '♡',
@@ -21,8 +45,8 @@ const DEFAULT_LABELS = {
21
45
  compare: 'Compare',
22
46
  };
23
47
  const BUTTON_SIZES = {
24
- small: { width: 28, height: 28, fontSize: '0.75rem', iconSize: '1rem' },
25
- medium: { width: 36, height: 36, fontSize: '0.875rem', iconSize: '1.25rem' },
48
+ small: { width: 44, height: 44, fontSize: '0.75rem', iconSize: '1rem' },
49
+ medium: { width: 44, height: 44, fontSize: '0.875rem', iconSize: '1.25rem' },
26
50
  large: { width: 44, height: 44, fontSize: '1rem', iconSize: '1.5rem' },
27
51
  };
28
52
  export function ActionButtons({ buttons, layout = 'horizontal', position = 'inline', showLabels = false, size = 'medium', className, style, }) {
@@ -31,11 +55,11 @@ export function ActionButtons({ buttons, layout = 'horizontal', position = 'inli
31
55
  const containerStyle = {
32
56
  display: 'flex',
33
57
  flexDirection: layout === 'vertical' ? 'column' : 'row',
34
- gap: 6,
58
+ gap: SPACING.sm,
35
59
  ...(isOverlay ? {
36
60
  position: 'absolute',
37
- ...(position === 'top-right' ? { top: 8, right: 8 } : {}),
38
- ...(position === 'bottom-center' ? { bottom: 8, left: '50%', transform: 'translateX(-50%)' } : {}),
61
+ ...(position === 'top-right' ? { top: SPACING.sm, right: SPACING.sm } : {}),
62
+ ...(position === 'bottom-center' ? { bottom: SPACING.sm, left: '50%', transform: 'translateX(-50%)' } : {}),
39
63
  } : {}),
40
64
  ...style,
41
65
  };
@@ -50,12 +74,12 @@ export function ActionButtons({ buttons, layout = 'horizontal', position = 'inli
50
74
  fontSize: sizeConfig.fontSize,
51
75
  fontWeight: 500,
52
76
  border: 'none',
53
- borderRadius: 6,
54
- backgroundColor: 'var(--seekora-bg-surface, #fff)',
55
- color: 'var(--seekora-text, #111827)',
77
+ borderRadius: BORDER_RADIUS.md,
78
+ backgroundColor: 'var(--seekora-bg-surface, transparent)',
79
+ color: 'var(--seekora-text, inherit)',
56
80
  cursor: 'pointer',
57
- transition: 'all 150ms ease',
58
- boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
81
+ transition: `all ${TRANSITIONS.fast}`,
82
+ boxShadow: SHADOWS.md,
59
83
  };
60
84
  const handleClick = (btn, e) => {
61
85
  e.stopPropagation();
@@ -1 +1 @@
1
- {"version":3,"file":"BadgeList.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/BadgeList.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAkBD,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,SAAS,EACT,QAAqB,EACrB,SAAS,EACT,KAAK,GACN,EAAE,cAAc,4BA4ChB"}
1
+ {"version":3,"file":"BadgeList.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/BadgeList.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAyB7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAkBD,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,SAAS,EACT,QAAqB,EACrB,SAAS,EACT,KAAK,GACN,EAAE,cAAc,4BA4ChB"}
@@ -3,19 +3,39 @@
3
3
  */
4
4
  import React from 'react';
5
5
  import { clsx } from 'clsx';
6
+ const SPACING = {
7
+ xs: 4,
8
+ sm: 8,
9
+ md: 12,
10
+ lg: 16,
11
+ xl: 24,
12
+ };
13
+ const BORDER_RADIUS = {
14
+ sm: 4,
15
+ md: 6,
16
+ lg: 8,
17
+ full: 9999,
18
+ };
19
+ // Z-index scale for consistent layering
20
+ const Z_INDEX = {
21
+ dropdown: 100,
22
+ modal: 200,
23
+ overlay: 300,
24
+ tooltip: 50,
25
+ };
6
26
  const positionStyles = {
7
- 'top-left': { position: 'absolute', top: 6, left: 6 },
8
- 'top-right': { position: 'absolute', top: 6, right: 6 },
9
- 'bottom-left': { position: 'absolute', bottom: 6, left: 6 },
10
- 'bottom-right': { position: 'absolute', bottom: 6, right: 6 },
27
+ 'top-left': { position: 'absolute', top: SPACING.sm, left: SPACING.sm },
28
+ 'top-right': { position: 'absolute', top: SPACING.sm, right: SPACING.sm },
29
+ 'bottom-left': { position: 'absolute', bottom: SPACING.sm, left: SPACING.sm },
30
+ 'bottom-right': { position: 'absolute', bottom: SPACING.sm, right: SPACING.sm },
11
31
  inline: {},
12
32
  };
13
33
  const typeColors = {
14
- sale: { bg: '#ef4444', text: '#fff' },
15
- new: { bg: '#3b82f6', text: '#fff' },
16
- soldOut: { bg: '#6b7280', text: '#fff' },
17
- limited: { bg: '#f59e0b', text: '#fff' },
18
- custom: { bg: '#111827', text: '#fff' },
34
+ sale: { bg: 'var(--seekora-badge-sale-bg, #ef4444)', text: 'var(--seekora-badge-sale-text, #fff)' },
35
+ new: { bg: 'var(--seekora-badge-new-bg, #3b82f6)', text: 'var(--seekora-badge-new-text, #fff)' },
36
+ soldOut: { bg: 'var(--seekora-badge-soldout-bg, #6b7280)', text: 'var(--seekora-badge-soldout-text, #fff)' },
37
+ limited: { bg: 'var(--seekora-badge-limited-bg, #f59e0b)', text: 'var(--seekora-badge-limited-text, #fff)' },
38
+ custom: { bg: 'var(--seekora-badge-custom-bg, #111827)', text: 'var(--seekora-badge-custom-text, #fff)' },
19
39
  };
20
40
  export function BadgeList({ badges, maxBadges, position = 'top-left', className, style, }) {
21
41
  if (!badges || badges.length === 0)
@@ -24,8 +44,8 @@ export function BadgeList({ badges, maxBadges, position = 'top-left', className,
24
44
  return (React.createElement("div", { className: clsx('seekora-badge-list', className), style: {
25
45
  display: 'flex',
26
46
  flexWrap: 'wrap',
27
- gap: 4,
28
- zIndex: 1,
47
+ gap: SPACING.xs,
48
+ zIndex: 2,
29
49
  ...positionStyles[position],
30
50
  ...style,
31
51
  } }, visible.map((badge, i) => {
@@ -33,10 +53,10 @@ export function BadgeList({ badges, maxBadges, position = 'top-left', className,
33
53
  return (React.createElement("span", { key: `${badge.text}-${i}`, className: clsx('seekora-badge', badge.type && `seekora-badge--${badge.type === 'soldOut' ? 'sold-out' : badge.type}`), style: {
34
54
  display: 'inline-block',
35
55
  padding: '2px 8px',
36
- borderRadius: 4,
56
+ borderRadius: BORDER_RADIUS.sm,
37
57
  fontSize: '0.6875rem',
38
58
  fontWeight: 600,
39
- lineHeight: 1.4,
59
+ lineHeight: 1.2,
40
60
  backgroundColor: badge.color ?? colors.bg,
41
61
  color: badge.textColor ?? colors.text,
42
62
  whiteSpace: 'nowrap',
@@ -1 +1 @@
1
- {"version":3,"file":"ImageDisplay.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/ImageDisplay.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,CAAC;AAE/F,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAUD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,OAAkB,EAClB,GAAQ,EACR,SAAS,EACT,KAAK,EACL,gBAAwB,EACxB,kBAAyB,EACzB,UAAkB,EAClB,QAAiB,EACjB,SAAe,EACf,QAAe,GAChB,EAAE,iBAAiB,qBAsNnB"}
1
+ {"version":3,"file":"ImageDisplay.d.ts","sourceRoot":"","sources":["../../../src/components/primitives/ImageDisplay.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,WAAW,CAAC;AAE/F,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAaD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,OAAkB,EAClB,GAAQ,EACR,SAAS,EACT,KAAK,EACL,gBAAwB,EACxB,kBAAyB,EACzB,UAAkB,EAClB,QAAiB,EACjB,SAAe,EACf,QAAe,GAChB,EAAE,iBAAiB,qBAsNnB"}
@@ -9,10 +9,13 @@ import { clsx } from 'clsx';
9
9
  import { ImageZoom } from './ImageZoom';
10
10
  const imgBaseStyle = {
11
11
  width: '100%',
12
+ height: 'auto',
12
13
  aspectRatio: '1',
13
14
  objectFit: 'cover',
14
15
  borderRadius: 4,
15
16
  backgroundColor: 'var(--seekora-bg-secondary, #f3f4f6)',
17
+ display: 'block',
18
+ overflow: 'hidden',
16
19
  };
17
20
  export function ImageDisplay({ images, variant = 'single', alt = '', className, style, carouselAutoplay = false, carouselIntervalMs = 4000, enableZoom = false, zoomMode = 'both', zoomLevel = 2.5, showDots = true, }) {
18
21
  const [index, setIndex] = useState(0);
@@ -55,8 +58,8 @@ export function ImageDisplay({ images, variant = 'single', alt = '', className,
55
58
  return (React.createElement("div", { className: clsx('seekora-img-display', 'seekora-img-carousel', className), style: { position: 'relative', ...style } },
56
59
  mainImage,
57
60
  safeImages.length > 1 && (React.createElement(React.Fragment, null,
58
- React.createElement("button", { type: "button", "aria-label": "Previous", className: "seekora-img-carousel-prev", style: arrowStyle(true), onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); go(-1); }, onClick: (e) => e.stopPropagation(), onMouseEnter: (e) => { e.currentTarget.style.backgroundColor = 'rgba(255,255,255,1)'; }, onMouseLeave: (e) => { e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.9)'; } }, "\u2039"),
59
- React.createElement("button", { type: "button", "aria-label": "Next", className: "seekora-img-carousel-next", style: arrowStyle(false), onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); go(1); }, onClick: (e) => e.stopPropagation(), onMouseEnter: (e) => { e.currentTarget.style.backgroundColor = 'rgba(255,255,255,1)'; }, onMouseLeave: (e) => { e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.9)'; } }, "\u203A"),
61
+ React.createElement("button", { type: "button", "aria-label": "Previous", className: "seekora-img-carousel-prev", style: arrowStyle(true), onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); go(-1); }, onClick: (e) => { e.stopPropagation(); e.preventDefault(); }, onMouseEnter: (e) => { e.currentTarget.style.backgroundColor = 'var(--seekora-carousel-btn-bg-hover, rgba(255,255,255,1))'; }, onMouseLeave: (e) => { e.currentTarget.style.backgroundColor = 'var(--seekora-carousel-btn-bg, rgba(255,255,255,0.9))'; } }, "\u2039"),
62
+ React.createElement("button", { type: "button", "aria-label": "Next", className: "seekora-img-carousel-next", style: arrowStyle(false), onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); go(1); }, onClick: (e) => { e.stopPropagation(); e.preventDefault(); }, onMouseEnter: (e) => { e.currentTarget.style.backgroundColor = 'var(--seekora-carousel-btn-bg-hover, rgba(255,255,255,1))'; }, onMouseLeave: (e) => { e.currentTarget.style.backgroundColor = 'var(--seekora-carousel-btn-bg, rgba(255,255,255,0.9))'; } }, "\u203A"),
60
63
  showDots && (React.createElement("div", { className: "seekora-img-carousel-dots", style: {
61
64
  position: 'absolute',
62
65
  bottom: 8,
@@ -65,16 +68,16 @@ export function ImageDisplay({ images, variant = 'single', alt = '', className,
65
68
  display: 'flex',
66
69
  gap: 6,
67
70
  padding: '6px 12px',
68
- backgroundColor: 'rgba(0,0,0,0.5)',
71
+ backgroundColor: 'var(--seekora-carousel-dots-bg, rgba(0,0,0,0.5))',
69
72
  borderRadius: 12,
70
73
  zIndex: 10,
71
- } }, safeImages.map((_, i) => (React.createElement("button", { key: i, type: "button", "aria-label": `Go to image ${i + 1}`, onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); }, onClick: (e) => { e.stopPropagation(); setIndex(i); }, style: {
74
+ } }, safeImages.map((_, i) => (React.createElement("button", { key: i, type: "button", "aria-label": `Go to image ${i + 1}`, onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); }, onClick: (e) => { e.stopPropagation(); e.preventDefault(); setIndex(i); }, style: {
72
75
  width: 8,
73
76
  height: 8,
74
77
  borderRadius: '50%',
75
78
  border: 'none',
76
79
  padding: 0,
77
- backgroundColor: i === index ? '#fff' : 'rgba(255,255,255,0.5)',
80
+ backgroundColor: i === index ? 'var(--seekora-carousel-dot-active, #fff)' : 'var(--seekora-carousel-dot, rgba(255,255,255,0.5))',
78
81
  cursor: 'pointer',
79
82
  transition: 'all 150ms ease',
80
83
  } })))))))));
@@ -84,7 +87,7 @@ export function ImageDisplay({ images, variant = 'single', alt = '', className,
84
87
  const mainImage = enableZoom ? (React.createElement(ImageZoom, { src: current, alt: alt, mode: zoomMode, zoomLevel: zoomLevel, images: safeImages, currentIndex: index, className: "seekora-img-thumb-main", style: thumbMainStyle })) : (React.createElement("img", { src: current, alt: alt, className: "seekora-img-thumb-main", style: thumbMainStyle, loading: "lazy" }));
85
88
  return (React.createElement("div", { className: clsx('seekora-img-display', 'seekora-img-thumbstrip', className), style: { display: 'flex', flexDirection: 'column', gap: 8, ...style } },
86
89
  mainImage,
87
- React.createElement("div", { className: "seekora-img-thumbs", style: { display: 'flex', gap: 4, overflowX: 'auto', paddingBottom: 4 } }, safeImages.map((src, i) => (React.createElement("button", { type: "button", key: i, className: clsx('seekora-img-thumb', i === index && 'seekora-img-thumb--active'), style: { flexShrink: 0, width: 48, height: 48, padding: 0, border: i === index ? '2px solid var(--seekora-primary)' : '1px solid transparent', borderRadius: 4, overflow: 'hidden', cursor: 'pointer', background: 'none' }, onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); setIndex(i); }, onClick: (e) => e.stopPropagation() },
90
+ React.createElement("div", { className: "seekora-img-thumbs", style: { display: 'flex', gap: 4, overflowX: 'auto', paddingBottom: 4 } }, safeImages.map((src, i) => (React.createElement("button", { type: "button", key: i, className: clsx('seekora-img-thumb', i === index && 'seekora-img-thumb--active'), style: { flexShrink: 0, width: 48, height: 48, padding: 0, border: i === index ? '2px solid var(--seekora-primary)' : '1px solid transparent', borderRadius: 4, overflow: 'hidden', cursor: 'pointer', background: 'none' }, onMouseDown: (e) => { e.stopPropagation(); e.preventDefault(); setIndex(i); }, onClick: (e) => { e.stopPropagation(); e.preventDefault(); } },
88
91
  React.createElement("img", { src: src, alt: "", style: { width: '100%', height: '100%', objectFit: 'cover' } })))))));
89
92
  }
90
93
  return React.createElement("img", { src: current, alt: alt, className: clsx('seekora-img-display', className), style: { ...imgBaseStyle, ...style }, loading: "lazy" });
@@ -99,8 +102,8 @@ function arrowStyle(left) {
99
102
  height: 32,
100
103
  borderRadius: '50%',
101
104
  border: 'none',
102
- backgroundColor: 'rgba(255, 255, 255, 0.9)',
103
- color: '#111',
105
+ backgroundColor: 'var(--seekora-carousel-btn-bg, rgba(255, 255, 255, 0.9))',
106
+ color: 'var(--seekora-carousel-btn-text, #111)',
104
107
  fontSize: '1.25rem',
105
108
  fontWeight: 'bold',
106
109
  cursor: 'pointer',
@@ -126,8 +126,8 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
126
126
  backgroundRepeat: 'no-repeat',
127
127
  border: '2px solid var(--seekora-border-color, #e5e7eb)',
128
128
  borderRadius: 8,
129
- boxShadow: '0 8px 24px rgba(0,0,0,0.2)',
130
- backgroundColor: '#fff',
129
+ boxShadow: 'var(--seekora-zoom-panel-shadow, 0 8px 24px rgba(0,0,0,0.2))',
130
+ backgroundColor: 'var(--seekora-zoom-panel-bg, #fff)',
131
131
  pointerEvents: 'none',
132
132
  zIndex: 9998,
133
133
  };
@@ -142,9 +142,9 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
142
142
  height: lensSize,
143
143
  left: cursorPos.x - lensSize / 2,
144
144
  top: cursorPos.y - lensSize / 2,
145
- border: '2px solid rgba(255,255,255,0.8)',
145
+ border: 'var(--seekora-lens-border, 2px solid rgba(255,255,255,0.8))',
146
146
  borderRadius: '50%',
147
- boxShadow: '0 0 0 1px rgba(0,0,0,0.3), inset 0 0 0 1px rgba(0,0,0,0.3)',
147
+ boxShadow: 'var(--seekora-lens-shadow, 0 0 0 1px rgba(0,0,0,0.3), inset 0 0 0 1px rgba(0,0,0,0.3))',
148
148
  pointerEvents: 'none',
149
149
  overflow: 'hidden',
150
150
  zIndex: 100,
@@ -174,8 +174,8 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
174
174
  width: 32,
175
175
  height: 32,
176
176
  borderRadius: '50%',
177
- backgroundColor: 'rgba(0,0,0,0.6)',
178
- color: '#fff',
177
+ backgroundColor: 'var(--seekora-zoom-indicator-bg, rgba(0,0,0,0.6))',
178
+ color: 'var(--seekora-zoom-indicator-text, #fff)',
179
179
  display: 'flex',
180
180
  alignItems: 'center',
181
181
  justifyContent: 'center',
@@ -192,8 +192,8 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
192
192
  top: cursorPos.y - 75,
193
193
  width: 150,
194
194
  height: 150,
195
- border: '2px solid rgba(0,0,0,0.3)',
196
- backgroundColor: 'rgba(255,255,255,0.1)',
195
+ border: 'var(--seekora-hover-area-border, 2px solid rgba(0,0,0,0.3))',
196
+ backgroundColor: 'var(--seekora-hover-area-bg, rgba(255,255,255,0.1))',
197
197
  pointerEvents: 'none',
198
198
  zIndex: 50,
199
199
  } })),
@@ -204,7 +204,7 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
204
204
  left: 0,
205
205
  right: 0,
206
206
  bottom: 0,
207
- backgroundColor: 'rgba(0,0,0,0.95)',
207
+ backgroundColor: 'var(--seekora-lightbox-bg, rgba(0,0,0,0.95))',
208
208
  zIndex: 9999,
209
209
  display: 'flex',
210
210
  alignItems: 'center',
@@ -220,8 +220,8 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
220
220
  height: 44,
221
221
  borderRadius: '50%',
222
222
  border: 'none',
223
- backgroundColor: 'rgba(255,255,255,0.2)',
224
- color: '#fff',
223
+ backgroundColor: 'var(--seekora-lightbox-btn-bg, rgba(255,255,255,0.2))',
224
+ color: 'var(--seekora-lightbox-btn-text, #fff)',
225
225
  fontSize: '1.5rem',
226
226
  cursor: 'pointer',
227
227
  display: 'flex',
@@ -233,9 +233,9 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
233
233
  e.stopPropagation();
234
234
  closeLightbox();
235
235
  }, onMouseEnter: (e) => {
236
- e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.3)';
236
+ e.currentTarget.style.backgroundColor = 'var(--seekora-lightbox-btn-bg-hover, rgba(255,255,255,0.3))';
237
237
  }, onMouseLeave: (e) => {
238
- e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.2)';
238
+ e.currentTarget.style.backgroundColor = 'var(--seekora-lightbox-btn-bg, rgba(255,255,255,0.2))';
239
239
  } }, "\u2715"),
240
240
  hasMultipleImages && (React.createElement(React.Fragment, null,
241
241
  React.createElement("button", { type: "button", "aria-label": "Previous image", style: {
@@ -247,8 +247,8 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
247
247
  height: 56,
248
248
  borderRadius: '50%',
249
249
  border: 'none',
250
- backgroundColor: 'rgba(255,255,255,0.2)',
251
- color: '#fff',
250
+ backgroundColor: 'var(--seekora-lightbox-btn-bg, rgba(255,255,255,0.2))',
251
+ color: 'var(--seekora-lightbox-btn-text, #fff)',
252
252
  fontSize: '2rem',
253
253
  fontWeight: 'bold',
254
254
  cursor: 'pointer',
@@ -261,9 +261,9 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
261
261
  e.stopPropagation();
262
262
  goToPrev();
263
263
  }, onMouseEnter: (e) => {
264
- e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.3)';
264
+ e.currentTarget.style.backgroundColor = 'var(--seekora-lightbox-btn-bg-hover, rgba(255,255,255,0.3))';
265
265
  }, onMouseLeave: (e) => {
266
- e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.2)';
266
+ e.currentTarget.style.backgroundColor = 'var(--seekora-lightbox-btn-bg, rgba(255,255,255,0.2))';
267
267
  } }, "\u2039"),
268
268
  React.createElement("button", { type: "button", "aria-label": "Next image", style: {
269
269
  position: 'absolute',
@@ -274,8 +274,8 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
274
274
  height: 56,
275
275
  borderRadius: '50%',
276
276
  border: 'none',
277
- backgroundColor: 'rgba(255,255,255,0.2)',
278
- color: '#fff',
277
+ backgroundColor: 'var(--seekora-lightbox-btn-bg, rgba(255,255,255,0.2))',
278
+ color: 'var(--seekora-lightbox-btn-text, #fff)',
279
279
  fontSize: '2rem',
280
280
  fontWeight: 'bold',
281
281
  cursor: 'pointer',
@@ -288,9 +288,9 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
288
288
  e.stopPropagation();
289
289
  goToNext();
290
290
  }, onMouseEnter: (e) => {
291
- e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.3)';
291
+ e.currentTarget.style.backgroundColor = 'var(--seekora-lightbox-btn-bg-hover, rgba(255,255,255,0.3))';
292
292
  }, onMouseLeave: (e) => {
293
- e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.2)';
293
+ e.currentTarget.style.backgroundColor = 'var(--seekora-lightbox-btn-bg, rgba(255,255,255,0.2))';
294
294
  } }, "\u203A"))),
295
295
  React.createElement("img", { src: allImages[lightboxIndex], alt: alt, style: {
296
296
  maxWidth: '90%',
@@ -316,7 +316,7 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
316
316
  width: 60,
317
317
  height: 60,
318
318
  padding: 0,
319
- border: i === lightboxIndex ? '3px solid #fff' : '2px solid rgba(255,255,255,0.3)',
319
+ border: i === lightboxIndex ? 'var(--seekora-lightbox-thumb-border-active, 3px solid #fff)' : 'var(--seekora-lightbox-thumb-border, 2px solid rgba(255,255,255,0.3))',
320
320
  borderRadius: 4,
321
321
  overflow: 'hidden',
322
322
  cursor: 'pointer',
@@ -332,10 +332,10 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
332
332
  } },
333
333
  React.createElement("img", { src: img, alt: "", style: { width: '100%', height: '100%', objectFit: 'cover' } }))))),
334
334
  React.createElement("div", { style: {
335
- color: 'rgba(255,255,255,0.9)',
335
+ color: 'var(--seekora-lightbox-counter-text, rgba(255,255,255,0.9))',
336
336
  fontSize: '0.875rem',
337
337
  textAlign: 'center',
338
- backgroundColor: 'rgba(0,0,0,0.5)',
338
+ backgroundColor: 'var(--seekora-lightbox-counter-bg, rgba(0,0,0,0.5))',
339
339
  padding: '4px 12px',
340
340
  borderRadius: 12,
341
341
  } },
@@ -347,10 +347,10 @@ export function ImageZoom({ src, alt = '', mode = 'both', zoomLevel = 2.5, class
347
347
  top: 20,
348
348
  left: '50%',
349
349
  transform: 'translateX(-50%)',
350
- color: 'rgba(255,255,255,0.7)',
350
+ color: 'var(--seekora-lightbox-instructions-text, rgba(255,255,255,0.7))',
351
351
  fontSize: '0.875rem',
352
352
  textAlign: 'center',
353
- backgroundColor: 'rgba(0,0,0,0.5)',
353
+ backgroundColor: 'var(--seekora-lightbox-instructions-bg, rgba(0,0,0,0.5))',
354
354
  padding: '8px 16px',
355
355
  borderRadius: 12,
356
356
  } }, hasMultipleImages ? 'Use arrow keys or click thumbnails to navigate • ESC to close' : 'Click outside or press ESC to close')))));