@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.
- package/CHANGELOG.md +9 -7
- package/app-template/CHANGELOG.md +251 -204
- package/app-template/akinon.json +1 -1
- package/app-template/package.json +28 -28
- package/app-template/public/amex.svg +12 -0
- package/app-template/public/apple-pay.svg +16 -0
- package/app-template/public/assets/images/product-placeholder-1.jpg +0 -0
- package/app-template/public/assets/images/product-placeholder-2.jpg +0 -0
- package/app-template/public/assets/images/product-placeholder-3.jpg +0 -0
- package/app-template/public/assets/images/product-placeholder-4.jpg +0 -0
- package/app-template/public/google-pay.svg +16 -0
- package/app-template/public/locales/en/account.json +6 -3
- package/app-template/public/locales/en/auth.json +6 -7
- package/app-template/public/locales/en/basket.json +6 -6
- package/app-template/public/locales/en/blog.json +7 -0
- package/app-template/public/locales/en/category.json +3 -1
- package/app-template/public/locales/en/checkout.json +5 -4
- package/app-template/public/locales/en/common.json +11 -2
- package/app-template/public/locales/en/forgot_password.json +6 -7
- package/app-template/public/locales/en/product.json +4 -3
- package/app-template/public/locales/tr/account.json +6 -3
- package/app-template/public/locales/tr/auth.json +16 -17
- package/app-template/public/locales/tr/basket.json +4 -4
- package/app-template/public/locales/tr/blog.json +7 -0
- package/app-template/public/locales/tr/category.json +3 -1
- package/app-template/public/locales/tr/checkout.json +39 -38
- package/app-template/public/locales/tr/common.json +10 -1
- package/app-template/public/locales/tr/forgot_password.json +12 -13
- package/app-template/public/locales/tr/product.json +1 -0
- package/app-template/public/logo.svg +3 -27
- package/app-template/public/mastercard.svg +14 -0
- package/app-template/public/promotion-banner.jpg +0 -0
- package/app-template/public/shop-pay.svg +12 -0
- package/app-template/public/visa.svg +12 -0
- package/app-template/src/app/[commerce]/[locale]/[currency]/blog/[slug]/page.tsx +118 -0
- package/app-template/src/app/[commerce]/[locale]/[currency]/pages/[slug]/page.tsx +15 -0
- package/app-template/src/app/api/theme-settings/route.ts +12 -0
- package/app-template/src/assets/fonts/pz-icon.css +211 -49
- package/app-template/src/assets/fonts/pz-icon.eot +0 -0
- package/app-template/src/assets/fonts/pz-icon.html +486 -0
- package/app-template/src/assets/fonts/pz-icon.scss +373 -49
- package/app-template/src/assets/fonts/pz-icon.svg +215 -53
- package/app-template/src/assets/fonts/pz-icon.ttf +0 -0
- package/app-template/src/assets/fonts/pz-icon.woff +0 -0
- package/app-template/src/assets/fonts/pz-icon.woff2 +0 -0
- package/app-template/src/assets/globals.scss +4 -0
- package/app-template/src/assets/icons/arrow-right.svg +3 -0
- package/app-template/src/assets/icons/cart.svg +4 -12
- package/app-template/src/assets/icons/check.svg +2 -18
- package/app-template/src/assets/icons/chevron-down.svg +2 -7
- package/app-template/src/assets/icons/delete.svg +3 -0
- package/app-template/src/assets/icons/facebook.svg +2 -8
- package/app-template/src/assets/icons/fav-off.svg +5 -0
- package/app-template/src/assets/icons/fav-on.svg +5 -0
- package/app-template/src/assets/icons/filter-and-sort.svg +3 -0
- package/app-template/src/assets/icons/heart.svg +3 -0
- package/app-template/src/assets/icons/instagram.svg +2 -13
- package/app-template/src/assets/icons/materials.svg +3 -0
- package/app-template/src/assets/icons/person.svg +4 -0
- package/app-template/src/assets/icons/pinterest.svg +5 -11
- package/app-template/src/assets/icons/ruler.svg +3 -0
- package/app-template/src/assets/icons/search.svg +8 -11
- package/app-template/src/assets/icons/share.svg +2 -9
- package/app-template/src/assets/icons/snapchat.svg +3 -0
- package/app-template/src/assets/icons/tiktok.svg +3 -0
- package/app-template/src/assets/icons/tumblr.svg +6 -0
- package/app-template/src/assets/icons/twitter.svg +2 -10
- package/app-template/src/assets/icons/vimeo.svg +3 -0
- package/app-template/src/assets/icons/youtube.svg +3 -0
- package/app-template/src/assets/icons/zoom.svg +8 -0
- package/app-template/src/components/accordion.tsx +33 -11
- package/app-template/src/components/action-tooltip.tsx +160 -0
- package/app-template/src/components/currency-select.tsx +149 -4
- package/app-template/src/components/icon.tsx +5 -6
- package/app-template/src/components/index.ts +4 -1
- package/app-template/src/components/language-select.tsx +88 -2
- package/app-template/src/components/pagination.tsx +132 -20
- package/app-template/src/components/quantity-input.tsx +63 -0
- package/app-template/src/components/quantity-selector.tsx +203 -0
- package/app-template/src/components/route-handler.tsx +50 -0
- package/app-template/src/components/select.tsx +89 -69
- package/app-template/src/components/types/index.ts +26 -0
- package/app-template/src/components/widget-content.tsx +323 -0
- package/app-template/src/data/server/theme.ts +70 -0
- package/app-template/src/hooks/use-fav-button.tsx +5 -2
- package/app-template/src/hooks/use-product-cart.ts +11 -8
- package/app-template/src/hooks/use-theme-settings.ts +42 -0
- package/app-template/src/lib/fonts.ts +149 -0
- package/app-template/src/settings.js +2 -2
- package/app-template/src/types/hookform-resolvers-yup.d.ts +28 -0
- package/app-template/src/types/widget.ts +169 -0
- package/app-template/src/utils/formatDate.ts +48 -0
- package/app-template/src/utils/styles.ts +71 -0
- package/app-template/src/views/account/contact-form.tsx +147 -130
- package/app-template/src/views/basket/basket-item.tsx +691 -107
- package/app-template/src/views/basket/basket-summary-context.tsx +560 -0
- package/app-template/src/views/basket/designer-context.tsx +617 -0
- package/app-template/src/views/basket/index.ts +2 -0
- package/app-template/src/views/basket/summary.tsx +496 -75
- package/app-template/src/views/breadcrumb/breadcrumb-client.tsx +190 -0
- package/app-template/src/views/breadcrumb/breadcrumb-registrar.tsx +286 -0
- package/app-template/src/views/breadcrumb/constants.ts +15 -0
- package/app-template/src/views/breadcrumb/index.tsx +127 -0
- package/app-template/src/views/breadcrumb.tsx +13 -38
- package/app-template/src/views/category/category-banner.tsx +4 -23
- package/app-template/src/views/category/category-header.tsx +289 -66
- package/app-template/src/views/category/category-info.tsx +173 -24
- package/app-template/src/views/category/filters/filter-item.tsx +138 -42
- package/app-template/src/views/category/filters/index.tsx +208 -48
- package/app-template/src/views/category/layout.tsx +7 -4
- package/app-template/src/views/category/native-widget-context.tsx +257 -0
- package/app-template/src/views/category/product-list-registrar.tsx +665 -0
- package/app-template/src/views/checkout/auth.tsx +64 -40
- package/app-template/src/views/checkout/checkout-address-registrar.tsx +254 -0
- package/app-template/src/views/checkout/checkout-buttons-registrar.tsx +183 -0
- package/app-template/src/views/checkout/checkout-delivery-method-registrar.tsx +259 -0
- package/app-template/src/views/checkout/checkout-payment-options-registrar.tsx +253 -0
- package/app-template/src/views/checkout/checkout-summary-registrar.tsx +183 -0
- package/app-template/src/views/checkout/constants.ts +5 -0
- package/app-template/src/views/checkout/index.tsx +5 -0
- package/app-template/src/views/checkout/layout/header.tsx +9 -5
- package/app-template/src/views/checkout/steps/payment/index.tsx +5 -2
- package/app-template/src/views/checkout/steps/payment/options/credit-card/index.tsx +72 -1
- package/app-template/src/views/checkout/steps/payment/options/masterpass-rest.tsx +15 -0
- package/app-template/src/views/checkout/steps/payment/options/saved-card.tsx +18 -0
- package/app-template/src/views/checkout/steps/payment/payment-option-buttons.tsx +171 -40
- package/app-template/src/views/checkout/steps/shipping/address-box.tsx +74 -12
- package/app-template/src/views/checkout/steps/shipping/addresses.tsx +128 -45
- package/app-template/src/views/checkout/steps/shipping/shipping-options.tsx +232 -27
- package/app-template/src/views/checkout/summary.tsx +303 -29
- package/app-template/src/views/footer/footer-app-banner-context.tsx +326 -0
- package/app-template/src/views/footer/footer-bottom-context.tsx +215 -0
- package/app-template/src/views/footer/footer-bottom-wrapper.tsx +74 -0
- package/app-template/src/views/footer/footer-layout-constants.ts +35 -0
- package/app-template/src/views/footer/footer-layout-registrar.tsx +342 -0
- package/app-template/src/views/footer/footer-layout-switcher.tsx +110 -0
- package/app-template/src/views/footer/footer-menu-context.tsx +211 -0
- package/app-template/src/views/footer/footer-native-widgets.tsx +60 -0
- package/app-template/src/views/footer/footer-social-context.tsx +254 -0
- package/app-template/src/views/footer/footer-subscription-context.tsx +210 -0
- package/app-template/src/views/footer/footer-utils.ts +43 -0
- package/app-template/src/views/footer/footer-value-props-context.tsx +326 -0
- package/app-template/src/views/footer/logo-settings.ts +183 -0
- package/app-template/src/views/footer/native-widget-config.ts +262 -0
- package/app-template/src/views/footer/subscription-settings.ts +122 -0
- package/app-template/src/views/footer/use-footer-logo.ts +162 -0
- package/app-template/src/views/footer.tsx +415 -13
- package/app-template/src/views/guest-login/index.tsx +62 -58
- package/app-template/src/views/header/action-menu.tsx +277 -45
- package/app-template/src/views/header/band.tsx +6 -21
- package/app-template/src/views/header/designer-context.tsx +261 -0
- package/app-template/src/views/header/header-announcement-registrar.tsx +267 -0
- package/app-template/src/views/header/header-client-wrapper.tsx +496 -0
- package/app-template/src/views/header/header-content.tsx +1026 -0
- package/app-template/src/views/header/header-currency-registrar.tsx +348 -0
- package/app-template/src/views/header/header-icons-context.tsx +262 -0
- package/app-template/src/views/header/header-language-registrar.tsx +348 -0
- package/app-template/src/views/header/header-layout-context.tsx +143 -0
- package/app-template/src/views/header/header-layout-registrar.tsx +658 -0
- package/app-template/src/views/header/header-logo-context.tsx +228 -0
- package/app-template/src/views/header/header-logo.tsx +118 -0
- package/app-template/src/views/header/header-mini-basket-context.tsx +524 -0
- package/app-template/src/views/header/header-search-registrar.tsx +511 -0
- package/app-template/src/views/header/header-text-slider-registrar.tsx +382 -0
- package/app-template/src/views/header/index.tsx +109 -47
- package/app-template/src/views/header/inline-search.tsx +262 -0
- package/app-template/src/views/header/mini-basket.tsx +819 -44
- package/app-template/src/views/header/mobile-hamburger-button.tsx +5 -8
- package/app-template/src/views/header/mobile-menu.tsx +12 -0
- package/app-template/src/views/header/navbar-menu-context.tsx +219 -0
- package/app-template/src/views/header/navbar.tsx +178 -111
- package/app-template/src/views/header/search/index.tsx +71 -32
- package/app-template/src/views/header/search/results.tsx +127 -65
- package/app-template/src/views/header/search/search-input.tsx +61 -0
- package/app-template/src/views/header/server-settings-parser.ts +1105 -0
- package/app-template/src/views/header/use-header-icons.ts +241 -0
- package/app-template/src/views/header/use-header-logo.ts +213 -0
- package/app-template/src/views/header/use-navbar-menu.ts +179 -0
- package/app-template/src/views/login/index.tsx +54 -46
- package/app-template/src/views/product/accordion-section.tsx +61 -0
- package/app-template/src/views/product/accordion-wrapper.tsx +135 -43
- package/app-template/src/views/product/custom-button-group.tsx +69 -0
- package/app-template/src/views/product/favorites-button-section.tsx +69 -0
- package/app-template/src/views/product/find-in-store-section.tsx +60 -0
- package/app-template/src/views/product/index.ts +1 -0
- package/app-template/src/views/product/layout.tsx +6 -5
- package/app-template/src/views/product/misc-buttons.tsx +339 -25
- package/app-template/src/views/product/price-wrapper.tsx +3 -29
- package/app-template/src/views/product/product-actions.tsx +137 -8
- package/app-template/src/views/product/product-info-section.tsx +140 -0
- package/app-template/src/views/product/product-info.tsx +69 -31
- package/app-template/src/views/product/product-share.tsx +13 -8
- package/app-template/src/views/product/product-variants.tsx +2 -2
- package/app-template/src/views/product/quantity-section.tsx +73 -0
- package/app-template/src/views/product/sale-tag.tsx +10 -0
- package/app-template/src/views/product/share-section.tsx +357 -0
- package/app-template/src/views/product/slider.tsx +117 -79
- package/app-template/src/views/product/variant.tsx +69 -41
- package/app-template/src/views/product/variants-section.tsx +126 -0
- package/app-template/src/views/product-detail/constants.ts +272 -0
- package/app-template/src/views/product-detail/index.ts +10 -0
- package/app-template/src/views/product-detail/product-detail-registrar.tsx +616 -0
- package/app-template/src/views/product-item/index.tsx +119 -46
- package/app-template/src/views/register/index.tsx +14 -25
- package/app-template/src/views/share/index.tsx +9 -6
- package/app-template/src/views/widgets/home-hero-slider-content.tsx +41 -39
- package/app-template/src/widgets/flatpages/about-us/index.tsx +78 -0
- package/app-template/src/widgets/flatpages/blog-list/index.tsx +129 -0
- package/app-template/src/widgets/footer-app-banner.tsx +444 -0
- package/app-template/src/widgets/footer-bottom.tsx +127 -0
- package/app-template/src/widgets/footer-menu-compact.tsx +238 -0
- package/app-template/src/widgets/footer-menu-two.tsx +298 -0
- package/app-template/src/widgets/footer-social-client.tsx +251 -0
- package/app-template/src/widgets/footer-social.tsx +47 -16
- package/app-template/src/widgets/footer-subscription/footer-subscription-form.tsx +17 -14
- package/app-template/src/widgets/footer-subscription/index.tsx +183 -17
- package/app-template/src/widgets/footer-value-props.tsx +201 -0
- package/app-template/src/widgets/index.ts +7 -0
- package/app-template/src/widgets/schemas/about-us.json +46 -0
- package/app-template/src/widgets/schemas/blog-list.json +37 -0
- package/app-template/src/widgets/schemas/blog.json +29 -0
- package/app-template/tailwind.config.js +18 -2
- 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
|
+
}
|