@akinon/projectzero 2.0.0-beta.19 → 2.0.0-beta.20

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 (223) hide show
  1. package/CHANGELOG.md +9 -7
  2. package/app-template/CHANGELOG.md +251 -204
  3. package/app-template/akinon.json +1 -1
  4. package/app-template/package.json +28 -28
  5. package/app-template/public/amex.svg +12 -0
  6. package/app-template/public/apple-pay.svg +16 -0
  7. package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
  8. package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
  9. package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
  10. package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
  11. package/app-template/public/google-pay.svg +16 -0
  12. package/app-template/public/locales/en/account.json +6 -3
  13. package/app-template/public/locales/en/auth.json +6 -7
  14. package/app-template/public/locales/en/basket.json +6 -6
  15. package/app-template/public/locales/en/blog.json +7 -0
  16. package/app-template/public/locales/en/category.json +3 -1
  17. package/app-template/public/locales/en/checkout.json +5 -4
  18. package/app-template/public/locales/en/common.json +11 -2
  19. package/app-template/public/locales/en/forgot_password.json +6 -7
  20. package/app-template/public/locales/en/product.json +4 -3
  21. package/app-template/public/locales/tr/account.json +6 -3
  22. package/app-template/public/locales/tr/auth.json +16 -17
  23. package/app-template/public/locales/tr/basket.json +4 -4
  24. package/app-template/public/locales/tr/blog.json +7 -0
  25. package/app-template/public/locales/tr/category.json +3 -1
  26. package/app-template/public/locales/tr/checkout.json +39 -38
  27. package/app-template/public/locales/tr/common.json +10 -1
  28. package/app-template/public/locales/tr/forgot_password.json +12 -13
  29. package/app-template/public/locales/tr/product.json +1 -0
  30. package/app-template/public/logo.svg +3 -27
  31. package/app-template/public/mastercard.svg +14 -0
  32. package/app-template/public/promotion-banner.jpg +0 -0
  33. package/app-template/public/shop-pay.svg +12 -0
  34. package/app-template/public/visa.svg +12 -0
  35. package/app-template/src/app/[commerce]/[locale]/[currency]/blog/[slug]/page.tsx +118 -0
  36. package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +15 -0
  37. package/app-template/src/app/api/theme-settings/route.ts +12 -0
  38. package/app-template/src/assets/fonts/pz-icon.css +211 -49
  39. package/app-template/src/assets/fonts/pz-icon.eot +0 -0
  40. package/app-template/src/assets/fonts/pz-icon.html +486 -0
  41. package/app-template/src/assets/fonts/pz-icon.scss +373 -49
  42. package/app-template/src/assets/fonts/pz-icon.svg +215 -53
  43. package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
  44. package/app-template/src/assets/fonts/pz-icon.woff +0 -0
  45. package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
  46. package/app-template/src/assets/globals.scss +4 -0
  47. package/app-template/src/assets/icons/arrow-right.svg +3 -0
  48. package/app-template/src/assets/icons/cart.svg +4 -12
  49. package/app-template/src/assets/icons/check.svg +2 -18
  50. package/app-template/src/assets/icons/chevron-down.svg +2 -7
  51. package/app-template/src/assets/icons/delete.svg +3 -0
  52. package/app-template/src/assets/icons/facebook.svg +2 -8
  53. package/app-template/src/assets/icons/fav-off.svg +5 -0
  54. package/app-template/src/assets/icons/fav-on.svg +5 -0
  55. package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
  56. package/app-template/src/assets/icons/heart.svg +3 -0
  57. package/app-template/src/assets/icons/instagram.svg +2 -13
  58. package/app-template/src/assets/icons/materials.svg +3 -0
  59. package/app-template/src/assets/icons/person.svg +4 -0
  60. package/app-template/src/assets/icons/pinterest.svg +5 -11
  61. package/app-template/src/assets/icons/ruler.svg +3 -0
  62. package/app-template/src/assets/icons/search.svg +8 -11
  63. package/app-template/src/assets/icons/share.svg +2 -9
  64. package/app-template/src/assets/icons/snapchat.svg +3 -0
  65. package/app-template/src/assets/icons/tiktok.svg +3 -0
  66. package/app-template/src/assets/icons/tumblr.svg +6 -0
  67. package/app-template/src/assets/icons/twitter.svg +2 -10
  68. package/app-template/src/assets/icons/vimeo.svg +3 -0
  69. package/app-template/src/assets/icons/youtube.svg +3 -0
  70. package/app-template/src/assets/icons/zoom.svg +8 -0
  71. package/app-template/src/components/accordion.tsx +33 -11
  72. package/app-template/src/components/action-tooltip.tsx +160 -0
  73. package/app-template/src/components/currency-select.tsx +149 -4
  74. package/app-template/src/components/icon.tsx +5 -6
  75. package/app-template/src/components/index.ts +4 -1
  76. package/app-template/src/components/language-select.tsx +88 -2
  77. package/app-template/src/components/pagination.tsx +132 -20
  78. package/app-template/src/components/quantity-input.tsx +63 -0
  79. package/app-template/src/components/quantity-selector.tsx +203 -0
  80. package/app-template/src/components/route-handler.tsx +50 -0
  81. package/app-template/src/components/select.tsx +89 -69
  82. package/app-template/src/components/types/index.ts +26 -0
  83. package/app-template/src/components/widget-content.tsx +323 -0
  84. package/app-template/src/data/server/theme.ts +70 -0
  85. package/app-template/src/hooks/use-fav-button.tsx +5 -2
  86. package/app-template/src/hooks/use-product-cart.ts +11 -8
  87. package/app-template/src/hooks/use-theme-settings.ts +42 -0
  88. package/app-template/src/lib/fonts.ts +149 -0
  89. package/app-template/src/settings.js +2 -2
  90. package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
  91. package/app-template/src/types/widget.ts +169 -0
  92. package/app-template/src/utils/formatDate.ts +48 -0
  93. package/app-template/src/utils/styles.ts +71 -0
  94. package/app-template/src/views/account/contact-form.tsx +147 -130
  95. package/app-template/src/views/basket/basket-item.tsx +691 -107
  96. package/app-template/src/views/basket/basket-summary-context.tsx +560 -0
  97. package/app-template/src/views/basket/designer-context.tsx +617 -0
  98. package/app-template/src/views/basket/index.ts +2 -0
  99. package/app-template/src/views/basket/summary.tsx +496 -75
  100. package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +190 -0
  101. package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +286 -0
  102. package/app-template/src/views/breadcrumb/constants.ts +15 -0
  103. package/app-template/src/views/breadcrumb/index.tsx +127 -0
  104. package/app-template/src/views/breadcrumb.tsx +13 -38
  105. package/app-template/src/views/category/category-banner.tsx +4 -23
  106. package/app-template/src/views/category/category-header.tsx +289 -66
  107. package/app-template/src/views/category/category-info.tsx +173 -24
  108. package/app-template/src/views/category/filters/filter-item.tsx +138 -42
  109. package/app-template/src/views/category/filters/index.tsx +208 -48
  110. package/app-template/src/views/category/layout.tsx +7 -4
  111. package/app-template/src/views/category/native-widget-context.tsx +257 -0
  112. package/app-template/src/views/category/product-list-registrar.tsx +665 -0
  113. package/app-template/src/views/checkout/auth.tsx +64 -40
  114. package/app-template/src/views/checkout/checkout-address-registrar.tsx +254 -0
  115. package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +183 -0
  116. package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +259 -0
  117. package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +253 -0
  118. package/app-template/src/views/checkout/checkout-summary-registrar.tsx +183 -0
  119. package/app-template/src/views/checkout/constants.ts +5 -0
  120. package/app-template/src/views/checkout/index.tsx +5 -0
  121. package/app-template/src/views/checkout/layout/header.tsx +9 -5
  122. package/app-template/src/views/checkout/steps/payment/index.tsx +5 -2
  123. package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +72 -1
  124. package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +15 -0
  125. package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +18 -0
  126. package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +171 -40
  127. package/app-template/src/views/checkout/steps/shipping/address-box.tsx +74 -12
  128. package/app-template/src/views/checkout/steps/shipping/addresses.tsx +128 -45
  129. package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +232 -27
  130. package/app-template/src/views/checkout/summary.tsx +303 -29
  131. package/app-template/src/views/footer/footer-app-banner-context.tsx +326 -0
  132. package/app-template/src/views/footer/footer-bottom-context.tsx +215 -0
  133. package/app-template/src/views/footer/footer-bottom-wrapper.tsx +74 -0
  134. package/app-template/src/views/footer/footer-layout-constants.ts +35 -0
  135. package/app-template/src/views/footer/footer-layout-registrar.tsx +342 -0
  136. package/app-template/src/views/footer/footer-layout-switcher.tsx +110 -0
  137. package/app-template/src/views/footer/footer-menu-context.tsx +211 -0
  138. package/app-template/src/views/footer/footer-native-widgets.tsx +60 -0
  139. package/app-template/src/views/footer/footer-social-context.tsx +254 -0
  140. package/app-template/src/views/footer/footer-subscription-context.tsx +210 -0
  141. package/app-template/src/views/footer/footer-utils.ts +43 -0
  142. package/app-template/src/views/footer/footer-value-props-context.tsx +326 -0
  143. package/app-template/src/views/footer/logo-settings.ts +183 -0
  144. package/app-template/src/views/footer/native-widget-config.ts +262 -0
  145. package/app-template/src/views/footer/subscription-settings.ts +122 -0
  146. package/app-template/src/views/footer/use-footer-logo.ts +162 -0
  147. package/app-template/src/views/footer.tsx +415 -13
  148. package/app-template/src/views/guest-login/index.tsx +62 -58
  149. package/app-template/src/views/header/action-menu.tsx +277 -45
  150. package/app-template/src/views/header/band.tsx +6 -21
  151. package/app-template/src/views/header/designer-context.tsx +261 -0
  152. package/app-template/src/views/header/header-announcement-registrar.tsx +267 -0
  153. package/app-template/src/views/header/header-client-wrapper.tsx +496 -0
  154. package/app-template/src/views/header/header-content.tsx +1026 -0
  155. package/app-template/src/views/header/header-currency-registrar.tsx +348 -0
  156. package/app-template/src/views/header/header-icons-context.tsx +262 -0
  157. package/app-template/src/views/header/header-language-registrar.tsx +348 -0
  158. package/app-template/src/views/header/header-layout-context.tsx +143 -0
  159. package/app-template/src/views/header/header-layout-registrar.tsx +658 -0
  160. package/app-template/src/views/header/header-logo-context.tsx +228 -0
  161. package/app-template/src/views/header/header-logo.tsx +118 -0
  162. package/app-template/src/views/header/header-mini-basket-context.tsx +524 -0
  163. package/app-template/src/views/header/header-search-registrar.tsx +511 -0
  164. package/app-template/src/views/header/header-text-slider-registrar.tsx +382 -0
  165. package/app-template/src/views/header/index.tsx +109 -47
  166. package/app-template/src/views/header/inline-search.tsx +262 -0
  167. package/app-template/src/views/header/mini-basket.tsx +819 -44
  168. package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
  169. package/app-template/src/views/header/mobile-menu.tsx +12 -0
  170. package/app-template/src/views/header/navbar-menu-context.tsx +219 -0
  171. package/app-template/src/views/header/navbar.tsx +178 -111
  172. package/app-template/src/views/header/search/index.tsx +71 -32
  173. package/app-template/src/views/header/search/results.tsx +127 -65
  174. package/app-template/src/views/header/search/search-input.tsx +61 -0
  175. package/app-template/src/views/header/server-settings-parser.ts +1105 -0
  176. package/app-template/src/views/header/use-header-icons.ts +241 -0
  177. package/app-template/src/views/header/use-header-logo.ts +213 -0
  178. package/app-template/src/views/header/use-navbar-menu.ts +179 -0
  179. package/app-template/src/views/login/index.tsx +54 -46
  180. package/app-template/src/views/product/accordion-section.tsx +61 -0
  181. package/app-template/src/views/product/accordion-wrapper.tsx +135 -43
  182. package/app-template/src/views/product/custom-button-group.tsx +69 -0
  183. package/app-template/src/views/product/favorites-button-section.tsx +69 -0
  184. package/app-template/src/views/product/find-in-store-section.tsx +60 -0
  185. package/app-template/src/views/product/index.ts +1 -0
  186. package/app-template/src/views/product/layout.tsx +6 -5
  187. package/app-template/src/views/product/misc-buttons.tsx +339 -25
  188. package/app-template/src/views/product/price-wrapper.tsx +3 -29
  189. package/app-template/src/views/product/product-actions.tsx +137 -8
  190. package/app-template/src/views/product/product-info-section.tsx +140 -0
  191. package/app-template/src/views/product/product-info.tsx +69 -31
  192. package/app-template/src/views/product/product-share.tsx +13 -8
  193. package/app-template/src/views/product/product-variants.tsx +2 -2
  194. package/app-template/src/views/product/quantity-section.tsx +73 -0
  195. package/app-template/src/views/product/sale-tag.tsx +10 -0
  196. package/app-template/src/views/product/share-section.tsx +357 -0
  197. package/app-template/src/views/product/slider.tsx +117 -79
  198. package/app-template/src/views/product/variant.tsx +69 -41
  199. package/app-template/src/views/product/variants-section.tsx +126 -0
  200. package/app-template/src/views/product-detail/constants.ts +272 -0
  201. package/app-template/src/views/product-detail/index.ts +10 -0
  202. package/app-template/src/views/product-detail/product-detail-registrar.tsx +616 -0
  203. package/app-template/src/views/product-item/index.tsx +119 -46
  204. package/app-template/src/views/register/index.tsx +14 -25
  205. package/app-template/src/views/share/index.tsx +9 -6
  206. package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
  207. package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
  208. package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
  209. package/app-template/src/widgets/footer-app-banner.tsx +444 -0
  210. package/app-template/src/widgets/footer-bottom.tsx +127 -0
  211. package/app-template/src/widgets/footer-menu-compact.tsx +238 -0
  212. package/app-template/src/widgets/footer-menu-two.tsx +298 -0
  213. package/app-template/src/widgets/footer-social-client.tsx +251 -0
  214. package/app-template/src/widgets/footer-social.tsx +47 -16
  215. package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
  216. package/app-template/src/widgets/footer-subscription/index.tsx +183 -17
  217. package/app-template/src/widgets/footer-value-props.tsx +201 -0
  218. package/app-template/src/widgets/index.ts +7 -0
  219. package/app-template/src/widgets/schemas/about-us.json +46 -0
  220. package/app-template/src/widgets/schemas/blog-list.json +37 -0
  221. package/app-template/src/widgets/schemas/blog.json +29 -0
  222. package/app-template/tailwind.config.js +18 -2
  223. package/package.json +1 -1
@@ -0,0 +1,262 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * Inline Search Component
5
+ *
6
+ * A simplified search input that appears directly in the header
7
+ * for the "two-row" layout. Unlike the modal search, this is always
8
+ * visible and expands inline results.
9
+ */
10
+
11
+ import { useState, useRef, useMemo, useCallback } from 'react';
12
+ import { useRouter } from '@akinon/next/hooks';
13
+ import { Icon } from '@theme/components';
14
+ import { ROUTES } from '@theme/routes';
15
+ import clsx from 'clsx';
16
+ import { useDesignerFeatures } from '@akinon/next/components/theme-editor/hooks/use-designer-features';
17
+
18
+ interface InlineSearchProps {
19
+ placeholder?: string;
20
+ className?: string;
21
+ style?: React.CSSProperties;
22
+ iconStyles?: Record<string, unknown>;
23
+ /** Block ID for theme editor selection */
24
+ blockId?: string;
25
+ /** Whether in designer mode (disables interactions) */
26
+ isDesigner?: boolean;
27
+ /** Placeholder ID for theme editor */
28
+ placeholderId?: string;
29
+ /** Section ID for theme editor */
30
+ sectionId?: string;
31
+ /** Whether this block is currently selected */
32
+ isSelected?: boolean;
33
+ }
34
+
35
+ /**
36
+ * Extract responsive style value for the current breakpoint
37
+ * Styles from theme editor come as { desktop: "value", tablet: "value", ... }
38
+ */
39
+ function extractStyleValue(
40
+ value: unknown,
41
+ breakpoint = 'desktop'
42
+ ): string | number | undefined {
43
+ if (value === null || value === undefined) return undefined;
44
+ if (typeof value === 'string' || typeof value === 'number') return value;
45
+ if (typeof value === 'object' && value !== null) {
46
+ const obj = value as Record<string, string | number>;
47
+ // Try current breakpoint, fallback to desktop, then first available value
48
+ return obj[breakpoint] ?? obj['desktop'] ?? Object.values(obj)[0];
49
+ }
50
+ return undefined;
51
+ }
52
+
53
+ /**
54
+ * Convert theme editor style object to CSS properties
55
+ * Supports both kebab-case (from theme editor) and camelCase (from server parser)
56
+ */
57
+ function convertStyles(
58
+ styles: Record<string, unknown> | undefined,
59
+ breakpoint = 'desktop'
60
+ ): React.CSSProperties {
61
+ if (!styles) return {};
62
+
63
+ const result: React.CSSProperties = {};
64
+
65
+ // Map theme editor keys (kebab-case) to CSS property names (camelCase)
66
+ const styleMap: Record<string, keyof React.CSSProperties> = {
67
+ // Kebab-case keys (from theme editor postMessage)
68
+ width: 'width',
69
+ 'max-width': 'maxWidth',
70
+ height: 'height',
71
+ 'background-color': 'backgroundColor',
72
+ 'border-color': 'borderColor',
73
+ 'border-width': 'borderWidth',
74
+ 'border-radius': 'borderRadius',
75
+ 'font-size': 'fontSize',
76
+ 'padding-left': 'paddingLeft',
77
+ 'padding-right': 'paddingRight',
78
+ // CamelCase keys (from server-side parser or direct style pass)
79
+ maxWidth: 'maxWidth',
80
+ backgroundColor: 'backgroundColor',
81
+ borderColor: 'borderColor',
82
+ borderWidth: 'borderWidth',
83
+ borderRadius: 'borderRadius',
84
+ fontSize: 'fontSize',
85
+ paddingLeft: 'paddingLeft',
86
+ paddingRight: 'paddingRight'
87
+ };
88
+
89
+ Object.entries(styles).forEach(([key, value]) => {
90
+ const cssKey = styleMap[key];
91
+ if (cssKey) {
92
+ const extracted = extractStyleValue(value, breakpoint);
93
+ if (extracted !== undefined) {
94
+ (result as Record<string, unknown>)[cssKey] = extracted;
95
+ }
96
+ }
97
+ });
98
+
99
+ return result;
100
+ }
101
+
102
+ export default function InlineSearch({
103
+ placeholder = 'Search...',
104
+ className,
105
+ style,
106
+ iconStyles,
107
+ blockId,
108
+ isDesigner = false,
109
+ placeholderId = 'header',
110
+ sectionId = 'header-search',
111
+ isSelected = false
112
+ }: InlineSearchProps) {
113
+ const router = useRouter();
114
+ const inputRef = useRef<HTMLInputElement>(null);
115
+ const [searchText, setSearchText] = useState('');
116
+
117
+ // Convert theme editor styles to CSS properties
118
+ const computedStyles = useMemo(
119
+ () => convertStyles(style as unknown as Record<string, unknown>),
120
+ [style]
121
+ );
122
+
123
+ // Extract font-size for the input element
124
+ const inputStyle = useMemo(() => {
125
+ const fontSize = computedStyles.fontSize;
126
+ return fontSize ? { fontSize } : {};
127
+ }, [computedStyles]);
128
+
129
+ // Extract icon color and size from block styles
130
+ const iconColor = useMemo(() => {
131
+ const color = extractStyleValue(iconStyles?.color);
132
+ return typeof color === 'string' ? color : undefined;
133
+ }, [iconStyles]);
134
+
135
+ const iconSize = useMemo(() => {
136
+ // iconSize comes from properties, not styles - check both
137
+ const size =
138
+ extractStyleValue(iconStyles?.iconSize) ||
139
+ extractStyleValue(iconStyles?.['icon-size']);
140
+ if (size === undefined) return 18;
141
+ const numSize = typeof size === 'string' ? parseInt(size, 10) : size;
142
+ return isNaN(numSize) ? 18 : numSize;
143
+ }, [iconStyles]);
144
+
145
+ // Extract custom icon SVG from block properties
146
+ const customIcon = useMemo(() => {
147
+ const icon = iconStyles?.icon;
148
+ if (!icon) return null;
149
+ // Handle responsive object format
150
+ const iconValue =
151
+ typeof icon === 'object' && icon !== null && 'desktop' in icon
152
+ ? (icon as { desktop?: string }).desktop
153
+ : icon;
154
+ // Check if it's SVG content
155
+ if (typeof iconValue === 'string' && iconValue.includes('<svg')) {
156
+ return iconValue;
157
+ }
158
+ return null;
159
+ }, [iconStyles]);
160
+
161
+ // Designer features for theme editor selection
162
+ const { handleClick: handleDesignerClick } = useDesignerFeatures({
163
+ blockId: blockId || 'header-search-icon',
164
+ placeholderId,
165
+ sectionId,
166
+ isDesigner,
167
+ blockInfo: {
168
+ id: blockId || 'header-search-icon',
169
+ type: 'icon-button',
170
+ label: 'Search Icon'
171
+ }
172
+ });
173
+
174
+ const handleSearch = () => {
175
+ if (searchText.trim() !== '') {
176
+ router.push(
177
+ `${ROUTES.LIST}/?search_text=${encodeURIComponent(searchText)}`
178
+ );
179
+ setSearchText('');
180
+ }
181
+ };
182
+
183
+ // Handle click - in designer mode, select the block; otherwise do nothing on container
184
+ const handleContainerClick = useCallback(
185
+ (e: React.MouseEvent) => {
186
+ if (isDesigner) {
187
+ e.preventDefault();
188
+ e.stopPropagation();
189
+ handleDesignerClick(e);
190
+ }
191
+ },
192
+ [isDesigner, handleDesignerClick]
193
+ );
194
+
195
+ const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
196
+ if (e.key === 'Enter') {
197
+ handleSearch();
198
+ }
199
+ };
200
+
201
+ return (
202
+ <div
203
+ data-block-id={blockId}
204
+ onClick={handleContainerClick}
205
+ className={clsx(
206
+ 'flex items-center border px-3 flex-shrink-0',
207
+ // Only apply default Tailwind classes if no inline style override
208
+ !computedStyles.height && 'h-10',
209
+ !computedStyles.borderRadius && 'rounded-md',
210
+ !computedStyles.backgroundColor && 'bg-white',
211
+ !computedStyles.borderColor && 'border-gray-300',
212
+ isDesigner && 'cursor-pointer',
213
+ isSelected && 'ring-2 ring-blue-500 ring-offset-1',
214
+ className
215
+ )}
216
+ style={computedStyles}
217
+ >
218
+ <input
219
+ ref={inputRef}
220
+ type="text"
221
+ value={searchText}
222
+ onChange={(e) => setSearchText(e.target.value)}
223
+ onKeyDown={handleKeyDown}
224
+ placeholder={placeholder}
225
+ className={clsx(
226
+ 'flex-1 text-sm text-black-750 bg-transparent border-none outline-none',
227
+ 'placeholder:text-gray-400',
228
+ isDesigner && 'pointer-events-none'
229
+ )}
230
+ style={inputStyle}
231
+ />
232
+ <button
233
+ type="button"
234
+ onClick={handleSearch}
235
+ className={clsx(
236
+ 'flex items-center justify-center ml-2 p-1 hover:bg-gray-100 rounded transition-colors',
237
+ isDesigner && 'pointer-events-none'
238
+ )}
239
+ aria-label="Search"
240
+ >
241
+ {customIcon ? (
242
+ <div
243
+ className="flex items-center justify-center"
244
+ style={{
245
+ width: iconSize,
246
+ height: iconSize,
247
+ color: iconColor || undefined
248
+ }}
249
+ dangerouslySetInnerHTML={{ __html: customIcon }}
250
+ />
251
+ ) : (
252
+ <Icon
253
+ name="search"
254
+ size={iconSize}
255
+ className={iconColor ? undefined : 'text-gray-600'}
256
+ style={iconColor ? { color: iconColor } : undefined}
257
+ />
258
+ )}
259
+ </button>
260
+ </div>
261
+ );
262
+ }