@ikas/component-cli 0.103.0 → 0.105.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (387) hide show
  1. package/dist/commands/config.d.ts.map +1 -1
  2. package/dist/commands/config.js +385 -5
  3. package/dist/commands/config.js.map +1 -1
  4. package/dist/commands/create.d.ts.map +1 -1
  5. package/dist/commands/create.js +118 -43
  6. package/dist/commands/create.js.map +1 -1
  7. package/dist/commands/dev.d.ts.map +1 -1
  8. package/dist/commands/dev.js +135 -5
  9. package/dist/commands/dev.js.map +1 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +2 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/utils/component-helpers.d.ts +5 -0
  14. package/dist/utils/component-helpers.d.ts.map +1 -1
  15. package/dist/utils/component-helpers.js +14 -1
  16. package/dist/utils/component-helpers.js.map +1 -1
  17. package/dist/utils/template.d.ts +12 -0
  18. package/dist/utils/template.d.ts.map +1 -1
  19. package/dist/utils/template.js +44 -0
  20. package/dist/utils/template.js.map +1 -1
  21. package/dist/utils/websocket-server.d.ts +26 -0
  22. package/dist/utils/websocket-server.d.ts.map +1 -1
  23. package/dist/utils/websocket-server.js +42 -0
  24. package/dist/utils/websocket-server.js.map +1 -1
  25. package/package.json +3 -2
  26. package/templates/create/claude-md +2 -1
  27. package/templates/create/cursorrules +1 -1
  28. package/templates/create/package.json +1 -0
  29. package/templates/create/src/components/ExampleComponent/types.ts +1 -1
  30. package/templates/create/src/components/ExampleSection/types.ts +1 -1
  31. package/templates/create-full/README.md +78 -0
  32. package/templates/create-full/claude-md +721 -0
  33. package/templates/create-full/cursorrules +103 -0
  34. package/templates/create-full/gitignore +4 -0
  35. package/templates/create-full/ikas.config.json +5007 -0
  36. package/templates/create-full/mcp.json +10 -0
  37. package/templates/create-full/package.json +22 -0
  38. package/templates/create-full/src/components/AccountAddresses/components/AddressCard/index.tsx +55 -0
  39. package/templates/create-full/src/components/AccountAddresses/components/AddressCard/styles.css +46 -0
  40. package/templates/create-full/src/components/AccountAddresses/components/AddressModal/index.tsx +301 -0
  41. package/templates/create-full/src/components/AccountAddresses/components/AddressModal/styles.css +22 -0
  42. package/templates/create-full/src/components/AccountAddresses/index.tsx +127 -0
  43. package/templates/create-full/src/components/AccountAddresses/styles.css +41 -0
  44. package/templates/create-full/src/components/AccountAddresses/types.ts +15 -0
  45. package/templates/create-full/src/components/AccountFavorites/index.tsx +82 -0
  46. package/templates/create-full/src/components/AccountFavorites/styles.css +52 -0
  47. package/templates/create-full/src/components/AccountFavorites/types.ts +7 -0
  48. package/templates/create-full/src/components/AccountInfo/components/AccountSidebar/index.tsx +171 -0
  49. package/templates/create-full/src/components/AccountInfo/components/AccountSidebar/styles.css +144 -0
  50. package/templates/create-full/src/components/AccountInfo/index.tsx +91 -0
  51. package/templates/create-full/src/components/AccountInfo/styles.css +35 -0
  52. package/templates/create-full/src/components/AccountInfo/types.ts +9 -0
  53. package/templates/create-full/src/components/AccountInfoContent/index.tsx +134 -0
  54. package/templates/create-full/src/components/AccountInfoContent/styles.css +57 -0
  55. package/templates/create-full/src/components/AccountInfoContent/types.ts +8 -0
  56. package/templates/create-full/src/components/AccountOrderDetail/components/OrderHeader/index.tsx +78 -0
  57. package/templates/create-full/src/components/AccountOrderDetail/components/OrderHeader/styles.css +46 -0
  58. package/templates/create-full/src/components/AccountOrderDetail/components/OrderItemRow/index.tsx +20 -0
  59. package/templates/create-full/src/components/AccountOrderDetail/components/OrderItemRow/styles.css +16 -0
  60. package/templates/create-full/src/components/AccountOrderDetail/components/OrderLineItemDisplay/index.tsx +112 -0
  61. package/templates/create-full/src/components/AccountOrderDetail/components/OrderLineItemDisplay/styles.css +86 -0
  62. package/templates/create-full/src/components/AccountOrderDetail/components/OrderSidebar/index.tsx +195 -0
  63. package/templates/create-full/src/components/AccountOrderDetail/components/OrderSidebar/styles.css +93 -0
  64. package/templates/create-full/src/components/AccountOrderDetail/components/PackageGroup/index.tsx +156 -0
  65. package/templates/create-full/src/components/AccountOrderDetail/components/PackageGroup/styles.css +100 -0
  66. package/templates/create-full/src/components/AccountOrderDetail/components/ReturnItemRow/index.tsx +56 -0
  67. package/templates/create-full/src/components/AccountOrderDetail/components/ReturnItemRow/styles.css +57 -0
  68. package/templates/create-full/src/components/AccountOrderDetail/components/ReturnView/index.tsx +159 -0
  69. package/templates/create-full/src/components/AccountOrderDetail/components/ReturnView/styles.css +29 -0
  70. package/templates/create-full/src/components/AccountOrderDetail/index.tsx +244 -0
  71. package/templates/create-full/src/components/AccountOrderDetail/styles.css +125 -0
  72. package/templates/create-full/src/components/AccountOrderDetail/types.ts +32 -0
  73. package/templates/create-full/src/components/AccountOrders/components/OrderCard/index.tsx +122 -0
  74. package/templates/create-full/src/components/AccountOrders/components/OrderCard/styles.css +114 -0
  75. package/templates/create-full/src/components/AccountOrders/index.tsx +105 -0
  76. package/templates/create-full/src/components/AccountOrders/styles.css +36 -0
  77. package/templates/create-full/src/components/AccountOrders/types.ts +11 -0
  78. package/templates/create-full/src/components/Announcement/index.tsx +11 -0
  79. package/templates/create-full/src/components/Announcement/styles.css +4 -0
  80. package/templates/create-full/src/components/Announcement/types.ts +4 -0
  81. package/templates/create-full/src/components/Announcements/index.tsx +91 -0
  82. package/templates/create-full/src/components/Announcements/styles.css +45 -0
  83. package/templates/create-full/src/components/Announcements/types.ts +8 -0
  84. package/templates/create-full/src/components/BlogHome/components/BlogCard/index.tsx +89 -0
  85. package/templates/create-full/src/components/BlogHome/components/BlogCard/styles.css +121 -0
  86. package/templates/create-full/src/components/BlogHome/index.tsx +124 -0
  87. package/templates/create-full/src/components/BlogHome/styles.css +118 -0
  88. package/templates/create-full/src/components/BlogHome/types.ts +15 -0
  89. package/templates/create-full/src/components/BlogPost/index.tsx +128 -0
  90. package/templates/create-full/src/components/BlogPost/styles.css +120 -0
  91. package/templates/create-full/src/components/BlogPost/types.ts +12 -0
  92. package/templates/create-full/src/components/CardProductName/index.tsx +25 -0
  93. package/templates/create-full/src/components/CardProductName/styles.css +22 -0
  94. package/templates/create-full/src/components/CardProductName/types.ts +7 -0
  95. package/templates/create-full/src/components/CardProductPrice/index.tsx +30 -0
  96. package/templates/create-full/src/components/CardProductPrice/styles.css +13 -0
  97. package/templates/create-full/src/components/CardProductPrice/types.ts +6 -0
  98. package/templates/create-full/src/components/CardProductVariants/index.tsx +10 -0
  99. package/templates/create-full/src/components/CardProductVariants/styles.css +1 -0
  100. package/templates/create-full/src/components/CardProductVariants/types.ts +6 -0
  101. package/templates/create-full/src/components/CartPage/components/CouponCode/index.tsx +108 -0
  102. package/templates/create-full/src/components/CartPage/components/CouponCode/styles.css +68 -0
  103. package/templates/create-full/src/components/CartPage/components/EmptyState/index.tsx +31 -0
  104. package/templates/create-full/src/components/CartPage/components/EmptyState/styles.css +18 -0
  105. package/templates/create-full/src/components/CartPage/components/OrderSummary/index.tsx +106 -0
  106. package/templates/create-full/src/components/CartPage/components/OrderSummary/styles.css +70 -0
  107. package/templates/create-full/src/components/CartPage/index.tsx +107 -0
  108. package/templates/create-full/src/components/CartPage/styles.css +54 -0
  109. package/templates/create-full/src/components/CartPage/types.ts +16 -0
  110. package/templates/create-full/src/components/CategoryImageItem/components/Card/index.tsx +64 -0
  111. package/templates/create-full/src/components/CategoryImageItem/components/Card/styles.css +56 -0
  112. package/templates/create-full/src/components/CategoryImageItem/index.tsx +64 -0
  113. package/templates/create-full/src/components/CategoryImageItem/styles.css +10 -0
  114. package/templates/create-full/src/components/CategoryImageItem/types.ts +16 -0
  115. package/templates/create-full/src/components/CategoryImages/index.tsx +62 -0
  116. package/templates/create-full/src/components/CategoryImages/styles.css +38 -0
  117. package/templates/create-full/src/components/CategoryImages/types.ts +11 -0
  118. package/templates/create-full/src/components/CategoryList/components/CategoryListControls/index.tsx +129 -0
  119. package/templates/create-full/src/components/CategoryList/components/CategoryListControls/styles.css +99 -0
  120. package/templates/create-full/src/components/CategoryList/components/FilterBoxValues/index.tsx +42 -0
  121. package/templates/create-full/src/components/CategoryList/components/FilterBoxValues/styles.css +27 -0
  122. package/templates/create-full/src/components/CategoryList/components/FilterCategoryList/index.tsx +43 -0
  123. package/templates/create-full/src/components/CategoryList/components/FilterCategoryList/styles.css +20 -0
  124. package/templates/create-full/src/components/CategoryList/components/FilterGroupValues/index.tsx +114 -0
  125. package/templates/create-full/src/components/CategoryList/components/FilterGroupValues/styles.css +1 -0
  126. package/templates/create-full/src/components/CategoryList/components/FilterListValues/index.tsx +54 -0
  127. package/templates/create-full/src/components/CategoryList/components/FilterListValues/styles.css +22 -0
  128. package/templates/create-full/src/components/CategoryList/components/FilterRangeListValues/index.tsx +50 -0
  129. package/templates/create-full/src/components/CategoryList/components/FilterRangeListValues/styles.css +25 -0
  130. package/templates/create-full/src/components/CategoryList/components/FilterRangeValues/index.tsx +189 -0
  131. package/templates/create-full/src/components/CategoryList/components/FilterRangeValues/styles.css +89 -0
  132. package/templates/create-full/src/components/CategoryList/components/FilterSidebar/index.tsx +92 -0
  133. package/templates/create-full/src/components/CategoryList/components/FilterSidebar/styles.css +27 -0
  134. package/templates/create-full/src/components/CategoryList/components/FilterSwatchValues/index.tsx +63 -0
  135. package/templates/create-full/src/components/CategoryList/components/FilterSwatchValues/styles.css +48 -0
  136. package/templates/create-full/src/components/CategoryList/components/MobileFilterModal/index.tsx +146 -0
  137. package/templates/create-full/src/components/CategoryList/components/MobileFilterModal/styles.css +133 -0
  138. package/templates/create-full/src/components/CategoryList/index.tsx +333 -0
  139. package/templates/create-full/src/components/CategoryList/styles.css +110 -0
  140. package/templates/create-full/src/components/CategoryList/types.ts +30 -0
  141. package/templates/create-full/src/components/CollapsibleContent/index.tsx +23 -0
  142. package/templates/create-full/src/components/CollapsibleContent/styles.css +11 -0
  143. package/templates/create-full/src/components/CollapsibleContent/types.ts +6 -0
  144. package/templates/create-full/src/components/CookieBar/index.tsx +78 -0
  145. package/templates/create-full/src/components/CookieBar/styles.css +111 -0
  146. package/templates/create-full/src/components/CookieBar/types.ts +10 -0
  147. package/templates/create-full/src/components/CustomerEmailVerification/index.tsx +168 -0
  148. package/templates/create-full/src/components/CustomerEmailVerification/styles.css +118 -0
  149. package/templates/create-full/src/components/CustomerEmailVerification/types.ts +17 -0
  150. package/templates/create-full/src/components/FeatureItem/index.tsx +27 -0
  151. package/templates/create-full/src/components/FeatureItem/styles.css +19 -0
  152. package/templates/create-full/src/components/FeatureItem/types.ts +7 -0
  153. package/templates/create-full/src/components/Features/index.tsx +25 -0
  154. package/templates/create-full/src/components/Features/styles.css +39 -0
  155. package/templates/create-full/src/components/Features/types.ts +5 -0
  156. package/templates/create-full/src/components/Footer/index.tsx +154 -0
  157. package/templates/create-full/src/components/Footer/styles.css +175 -0
  158. package/templates/create-full/src/components/Footer/types.ts +15 -0
  159. package/templates/create-full/src/components/ForgotPassword/components/ForgotPasswordForm/index.tsx +129 -0
  160. package/templates/create-full/src/components/ForgotPassword/components/ForgotPasswordForm/styles.css +0 -0
  161. package/templates/create-full/src/components/ForgotPassword/index.tsx +30 -0
  162. package/templates/create-full/src/components/ForgotPassword/styles.css +85 -0
  163. package/templates/create-full/src/components/ForgotPassword/types.ts +13 -0
  164. package/templates/create-full/src/components/Header/index.tsx +53 -0
  165. package/templates/create-full/src/components/Header/styles.css +6 -0
  166. package/templates/create-full/src/components/Header/types.ts +6 -0
  167. package/templates/create-full/src/components/HeroSlider/index.tsx +110 -0
  168. package/templates/create-full/src/components/HeroSlider/styles.css +129 -0
  169. package/templates/create-full/src/components/HeroSlider/types.ts +9 -0
  170. package/templates/create-full/src/components/HeroSliderItem/index.tsx +231 -0
  171. package/templates/create-full/src/components/HeroSliderItem/styles.css +152 -0
  172. package/templates/create-full/src/components/HeroSliderItem/types.ts +34 -0
  173. package/templates/create-full/src/components/Login/components/LoginForm/index.tsx +181 -0
  174. package/templates/create-full/src/components/Login/components/LoginForm/styles.css +0 -0
  175. package/templates/create-full/src/components/Login/index.tsx +37 -0
  176. package/templates/create-full/src/components/Login/styles.css +129 -0
  177. package/templates/create-full/src/components/Login/types.ts +18 -0
  178. package/templates/create-full/src/components/Navbar/components/CartSidebar/index.tsx +203 -0
  179. package/templates/create-full/src/components/Navbar/components/CartSidebar/styles.css +175 -0
  180. package/templates/create-full/src/components/Navbar/components/MobileMenu/index.tsx +198 -0
  181. package/templates/create-full/src/components/Navbar/components/MobileMenu/styles.css +122 -0
  182. package/templates/create-full/src/components/Navbar/components/NavItem/index.tsx +65 -0
  183. package/templates/create-full/src/components/Navbar/components/SearchModal/index.tsx +267 -0
  184. package/templates/create-full/src/components/Navbar/components/SearchModal/styles.css +182 -0
  185. package/templates/create-full/src/components/Navbar/index.tsx +250 -0
  186. package/templates/create-full/src/components/Navbar/styles.css +243 -0
  187. package/templates/create-full/src/components/Navbar/types.ts +37 -0
  188. package/templates/create-full/src/components/NotFound/index.tsx +39 -0
  189. package/templates/create-full/src/components/NotFound/styles.css +46 -0
  190. package/templates/create-full/src/components/NotFound/types.ts +8 -0
  191. package/templates/create-full/src/components/ProductDetail/components/ProductGallery/index.tsx +316 -0
  192. package/templates/create-full/src/components/ProductDetail/components/ProductGallery/styles.css +213 -0
  193. package/templates/create-full/src/components/ProductDetail/index.tsx +92 -0
  194. package/templates/create-full/src/components/ProductDetail/styles.css +58 -0
  195. package/templates/create-full/src/components/ProductDetail/types.ts +12 -0
  196. package/templates/create-full/src/components/ProductDetailAddToCart/components/PayWithIkas/index.tsx +34 -0
  197. package/templates/create-full/src/components/ProductDetailAddToCart/components/PayWithIkas/styles.css +4 -0
  198. package/templates/create-full/src/components/ProductDetailAddToCart/index.tsx +146 -0
  199. package/templates/create-full/src/components/ProductDetailAddToCart/styles.css +27 -0
  200. package/templates/create-full/src/components/ProductDetailAddToCart/types.ts +18 -0
  201. package/templates/create-full/src/components/ProductDetailBundleFurniture/components/BundleFurnitureRow/index.tsx +164 -0
  202. package/templates/create-full/src/components/ProductDetailBundleFurniture/components/BundleFurnitureSection/index.tsx +134 -0
  203. package/templates/create-full/src/components/ProductDetailBundleFurniture/components/BundleFurnitureSection/styles.css +188 -0
  204. package/templates/create-full/src/components/ProductDetailBundleFurniture/index.tsx +61 -0
  205. package/templates/create-full/src/components/ProductDetailBundleFurniture/styles.css +12 -0
  206. package/templates/create-full/src/components/ProductDetailBundleFurniture/types.ts +21 -0
  207. package/templates/create-full/src/components/ProductDetailBundleProduct/components/BundleProductItem/index.tsx +169 -0
  208. package/templates/create-full/src/components/ProductDetailBundleProduct/components/BundleProductItem/styles.css +141 -0
  209. package/templates/create-full/src/components/ProductDetailBundleProduct/components/BundleSkeletonLoading/index.tsx +35 -0
  210. package/templates/create-full/src/components/ProductDetailBundleProduct/components/BundleSkeletonLoading/styles.css +85 -0
  211. package/templates/create-full/src/components/ProductDetailBundleProduct/components/FurnitureRow/index.tsx +51 -0
  212. package/templates/create-full/src/components/ProductDetailBundleProduct/components/FurnitureRow/styles.css +30 -0
  213. package/templates/create-full/src/components/ProductDetailBundleProduct/components/FurnitureView/index.tsx +54 -0
  214. package/templates/create-full/src/components/ProductDetailBundleProduct/components/FurnitureView/styles.css +22 -0
  215. package/templates/create-full/src/components/ProductDetailBundleProduct/index.tsx +101 -0
  216. package/templates/create-full/src/components/ProductDetailBundleProduct/styles.css +20 -0
  217. package/templates/create-full/src/components/ProductDetailBundleProduct/types.ts +18 -0
  218. package/templates/create-full/src/components/ProductDetailDescription/index.tsx +56 -0
  219. package/templates/create-full/src/components/ProductDetailDescription/styles.css +21 -0
  220. package/templates/create-full/src/components/ProductDetailDescription/types.ts +13 -0
  221. package/templates/create-full/src/components/ProductDetailFeatureItem/index.tsx +28 -0
  222. package/templates/create-full/src/components/ProductDetailFeatureItem/styles.css +22 -0
  223. package/templates/create-full/src/components/ProductDetailFeatureItem/types.ts +7 -0
  224. package/templates/create-full/src/components/ProductDetailFeatures/index.tsx +40 -0
  225. package/templates/create-full/src/components/ProductDetailFeatures/styles.css +17 -0
  226. package/templates/create-full/src/components/ProductDetailFeatures/types.ts +10 -0
  227. package/templates/create-full/src/components/ProductDetailNameFavorite/index.tsx +66 -0
  228. package/templates/create-full/src/components/ProductDetailNameFavorite/styles.css +45 -0
  229. package/templates/create-full/src/components/ProductDetailNameFavorite/types.ts +11 -0
  230. package/templates/create-full/src/components/ProductDetailOffer/components/OfferCard/index.tsx +209 -0
  231. package/templates/create-full/src/components/ProductDetailOffer/components/OfferCard/styles.css +146 -0
  232. package/templates/create-full/src/components/ProductDetailOffer/components/OfferSummary/index.tsx +175 -0
  233. package/templates/create-full/src/components/ProductDetailOffer/index.tsx +199 -0
  234. package/templates/create-full/src/components/ProductDetailOffer/styles.css +211 -0
  235. package/templates/create-full/src/components/ProductDetailOffer/types.ts +24 -0
  236. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionCheckbox/index.tsx +52 -0
  237. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionCheckbox/styles.css +19 -0
  238. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/components/ChoiceBox/index.tsx +60 -0
  239. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/components/ChoiceBox/styles.css +38 -0
  240. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/components/ChoiceSelect/index.tsx +102 -0
  241. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/components/ChoiceSelect/styles.css +34 -0
  242. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/components/ChoiceSwatch/index.tsx +121 -0
  243. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/components/ChoiceSwatch/styles.css +87 -0
  244. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionChoice/index.tsx +57 -0
  245. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionColorPicker/index.tsx +54 -0
  246. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionColorPicker/styles.css +0 -0
  247. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionDatePicker/index.tsx +124 -0
  248. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionDatePicker/styles.css +1 -0
  249. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionFile/index.tsx +217 -0
  250. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionFile/styles.css +87 -0
  251. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionRenderer/index.tsx +133 -0
  252. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionText/index.tsx +60 -0
  253. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionText/styles.css +1 -0
  254. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionTextarea/index.tsx +74 -0
  255. package/templates/create-full/src/components/ProductDetailOptionSet/components/OptionTextarea/styles.css +10 -0
  256. package/templates/create-full/src/components/ProductDetailOptionSet/index.tsx +99 -0
  257. package/templates/create-full/src/components/ProductDetailOptionSet/styles.css +30 -0
  258. package/templates/create-full/src/components/ProductDetailOptionSet/types.ts +21 -0
  259. package/templates/create-full/src/components/ProductDetailPrices/index.tsx +62 -0
  260. package/templates/create-full/src/components/ProductDetailPrices/styles.css +32 -0
  261. package/templates/create-full/src/components/ProductDetailPrices/types.ts +10 -0
  262. package/templates/create-full/src/components/ProductDetailProductGroup/index.tsx +74 -0
  263. package/templates/create-full/src/components/ProductDetailProductGroup/styles.css +33 -0
  264. package/templates/create-full/src/components/ProductDetailProductGroup/types.ts +10 -0
  265. package/templates/create-full/src/components/ProductDetailReviews/index.tsx +205 -0
  266. package/templates/create-full/src/components/ProductDetailReviews/styles.css +43 -0
  267. package/templates/create-full/src/components/ProductDetailReviews/types.ts +19 -0
  268. package/templates/create-full/src/components/ProductDetailSku/index.tsx +38 -0
  269. package/templates/create-full/src/components/ProductDetailSku/styles.css +16 -0
  270. package/templates/create-full/src/components/ProductDetailSku/types.ts +11 -0
  271. package/templates/create-full/src/components/ProductDetailVariant/index.tsx +38 -0
  272. package/templates/create-full/src/components/ProductDetailVariant/styles.css +14 -0
  273. package/templates/create-full/src/components/ProductDetailVariant/types.ts +12 -0
  274. package/templates/create-full/src/components/ProductSlider/index.tsx +151 -0
  275. package/templates/create-full/src/components/ProductSlider/styles.css +105 -0
  276. package/templates/create-full/src/components/ProductSlider/types.ts +17 -0
  277. package/templates/create-full/src/components/RecoverPassword/components/RecoverPasswordForm/index.tsx +133 -0
  278. package/templates/create-full/src/components/RecoverPassword/components/RecoverPasswordForm/styles.css +0 -0
  279. package/templates/create-full/src/components/RecoverPassword/index.tsx +30 -0
  280. package/templates/create-full/src/components/RecoverPassword/styles.css +93 -0
  281. package/templates/create-full/src/components/RecoverPassword/types.ts +13 -0
  282. package/templates/create-full/src/components/Register/components/RegisterForm/index.tsx +326 -0
  283. package/templates/create-full/src/components/Register/components/RegisterForm/styles.css +0 -0
  284. package/templates/create-full/src/components/Register/index.tsx +30 -0
  285. package/templates/create-full/src/components/Register/styles.css +152 -0
  286. package/templates/create-full/src/components/Register/types.ts +27 -0
  287. package/templates/create-full/src/components/RichText/index.tsx +25 -0
  288. package/templates/create-full/src/components/RichText/styles.css +51 -0
  289. package/templates/create-full/src/components/RichText/types.ts +5 -0
  290. package/templates/create-full/src/components/SocialMediaIcon/index.tsx +26 -0
  291. package/templates/create-full/src/components/SocialMediaIcon/styles.css +17 -0
  292. package/templates/create-full/src/components/SocialMediaIcon/types.ts +7 -0
  293. package/templates/create-full/src/components/index.ts +50 -0
  294. package/templates/create-full/src/global-types.ts +13 -0
  295. package/templates/create-full/src/global.css +582 -0
  296. package/templates/create-full/src/hooks/useBundleProducts.ts +75 -0
  297. package/templates/create-full/src/hooks/useColumnPreference.ts +26 -0
  298. package/templates/create-full/src/hooks/useInfiniteScroll.ts +49 -0
  299. package/templates/create-full/src/hooks/usePageTracking.ts +56 -0
  300. package/templates/create-full/src/hooks/usePayWithIkas.ts +114 -0
  301. package/templates/create-full/src/hooks/useRedirectIfLoggedIn.ts +35 -0
  302. package/templates/create-full/src/hooks/useScrollLock.ts +20 -0
  303. package/templates/create-full/src/hooks/useToast.ts +27 -0
  304. package/templates/create-full/src/ikas-component-utils.d.ts +3 -0
  305. package/templates/create-full/src/sub-components/Badge/index.tsx +208 -0
  306. package/templates/create-full/src/sub-components/Badge/styles.css +129 -0
  307. package/templates/create-full/src/sub-components/Breadcrumb/index.tsx +57 -0
  308. package/templates/create-full/src/sub-components/Breadcrumb/styles.css +49 -0
  309. package/templates/create-full/src/sub-components/BundleMedia/index.tsx +72 -0
  310. package/templates/create-full/src/sub-components/BundleQuantityBox/index.tsx +73 -0
  311. package/templates/create-full/src/sub-components/BundleQuantityBox/styles.css +43 -0
  312. package/templates/create-full/src/sub-components/Button/index.tsx +52 -0
  313. package/templates/create-full/src/sub-components/Button/styles.css +114 -0
  314. package/templates/create-full/src/sub-components/CartItem/components/BundleProductItem/index.tsx +59 -0
  315. package/templates/create-full/src/sub-components/CartItem/components/BundleProductItem/styles.css +24 -0
  316. package/templates/create-full/src/sub-components/CartItem/components/BundleProducts/index.tsx +55 -0
  317. package/templates/create-full/src/sub-components/CartItem/components/BundleProducts/styles.css +30 -0
  318. package/templates/create-full/src/sub-components/CartItem/components/ItemOptions/index.tsx +31 -0
  319. package/templates/create-full/src/sub-components/CartItem/components/ItemOptions/styles.css +6 -0
  320. package/templates/create-full/src/sub-components/CartItem/components/OptionValueDisplay/index.tsx +79 -0
  321. package/templates/create-full/src/sub-components/CartItem/components/OptionValueDisplay/styles.css +28 -0
  322. package/templates/create-full/src/sub-components/CartItem/index.tsx +216 -0
  323. package/templates/create-full/src/sub-components/CartItem/styles.css +170 -0
  324. package/templates/create-full/src/sub-components/Checkbox/index.tsx +42 -0
  325. package/templates/create-full/src/sub-components/Checkbox/styles.css +65 -0
  326. package/templates/create-full/src/sub-components/CollapsibleGroup/index.tsx +52 -0
  327. package/templates/create-full/src/sub-components/CollapsibleGroup/styles.css +51 -0
  328. package/templates/create-full/src/sub-components/ColorInput/index.tsx +33 -0
  329. package/templates/create-full/src/sub-components/ColorInput/styles.css +53 -0
  330. package/templates/create-full/src/sub-components/ConfirmModal/index.tsx +60 -0
  331. package/templates/create-full/src/sub-components/ConfirmModal/styles.css +20 -0
  332. package/templates/create-full/src/sub-components/FormItem/index.tsx +66 -0
  333. package/templates/create-full/src/sub-components/FormItem/styles.css +38 -0
  334. package/templates/create-full/src/sub-components/ImagePreviewModal/index.tsx +55 -0
  335. package/templates/create-full/src/sub-components/ImagePreviewModal/styles.css +50 -0
  336. package/templates/create-full/src/sub-components/Input/index.tsx +69 -0
  337. package/templates/create-full/src/sub-components/Input/styles.css +162 -0
  338. package/templates/create-full/src/sub-components/Modal/index.tsx +118 -0
  339. package/templates/create-full/src/sub-components/Modal/styles.css +70 -0
  340. package/templates/create-full/src/sub-components/PageLoader/index.tsx +14 -0
  341. package/templates/create-full/src/sub-components/PageLoader/styles.css +12 -0
  342. package/templates/create-full/src/sub-components/Pagination/index.tsx +107 -0
  343. package/templates/create-full/src/sub-components/Pagination/styles.css +88 -0
  344. package/templates/create-full/src/sub-components/ProductCard/index.tsx +276 -0
  345. package/templates/create-full/src/sub-components/ProductCard/styles.css +99 -0
  346. package/templates/create-full/src/sub-components/QuantitySelector/index.tsx +41 -0
  347. package/templates/create-full/src/sub-components/QuantitySelector/styles.css +51 -0
  348. package/templates/create-full/src/sub-components/ReviewCard/index.tsx +103 -0
  349. package/templates/create-full/src/sub-components/ReviewCard/styles.css +95 -0
  350. package/templates/create-full/src/sub-components/ReviewForm/index.tsx +115 -0
  351. package/templates/create-full/src/sub-components/ReviewForm/styles.css +11 -0
  352. package/templates/create-full/src/sub-components/ReviewSummary/index.tsx +65 -0
  353. package/templates/create-full/src/sub-components/ReviewSummary/styles.css +86 -0
  354. package/templates/create-full/src/sub-components/Select/index.tsx +86 -0
  355. package/templates/create-full/src/sub-components/Select/styles.css +110 -0
  356. package/templates/create-full/src/sub-components/SkeletonField/index.tsx +12 -0
  357. package/templates/create-full/src/sub-components/SkeletonField/styles.css +29 -0
  358. package/templates/create-full/src/sub-components/SliderArrow/index.tsx +26 -0
  359. package/templates/create-full/src/sub-components/SliderArrow/styles.css +24 -0
  360. package/templates/create-full/src/sub-components/SocialLoginButton/index.tsx +24 -0
  361. package/templates/create-full/src/sub-components/SocialLoginButton/styles.css +19 -0
  362. package/templates/create-full/src/sub-components/SpinnerIcon/index.tsx +10 -0
  363. package/templates/create-full/src/sub-components/SpinnerIcon/styles.css +8 -0
  364. package/templates/create-full/src/sub-components/StarRating/index.tsx +76 -0
  365. package/templates/create-full/src/sub-components/StarRating/styles.css +40 -0
  366. package/templates/create-full/src/sub-components/Tag/index.tsx +21 -0
  367. package/templates/create-full/src/sub-components/Tag/styles.css +30 -0
  368. package/templates/create-full/src/sub-components/Textarea/index.tsx +45 -0
  369. package/templates/create-full/src/sub-components/Textarea/styles.css +82 -0
  370. package/templates/create-full/src/sub-components/Toast/index.tsx +257 -0
  371. package/templates/create-full/src/sub-components/Toast/styles.css +3 -0
  372. package/templates/create-full/src/sub-components/Toggle/index.tsx +46 -0
  373. package/templates/create-full/src/sub-components/Toggle/styles.css +86 -0
  374. package/templates/create-full/src/sub-components/VariantBadge/index.tsx +153 -0
  375. package/templates/create-full/src/sub-components/VariantBadge/styles.css +47 -0
  376. package/templates/create-full/src/sub-components/icons/index.tsx +981 -0
  377. package/templates/create-full/src/utils/bundle.ts +70 -0
  378. package/templates/create-full/src/utils/cx.ts +4 -0
  379. package/templates/create-full/src/utils/fullName.ts +6 -0
  380. package/templates/create-full/src/utils/media.ts +36 -0
  381. package/templates/create-full/src/utils/optionPrice.ts +19 -0
  382. package/templates/create-full/src/utils/optionSet.ts +17 -0
  383. package/templates/create-full/src/utils/orderStatus.ts +28 -0
  384. package/templates/create-full/src/utils/pagination.ts +29 -0
  385. package/templates/create-full/src/utils/toast.ts +5 -0
  386. package/templates/create-full/tsconfig.json +30 -0
  387. package/templates/create-full/vite.config.ts +15 -0
@@ -0,0 +1,267 @@
1
+ import { useState, useEffect, useRef, useCallback } from "preact/hooks";
2
+ import { observer } from "@ikas/component-utils";
3
+ import { useScrollLock } from "../../../../hooks/useScrollLock";
4
+ import {
5
+ IkasProductList,
6
+ IkasImage,
7
+ searchProductList,
8
+ getDefaultSrc,
9
+ isEmpty,
10
+ Router,
11
+ createMediaSrcset,
12
+ getProductOptionSet,
13
+ IkasComponentRenderer,
14
+ } from "@ikas/bp-storefront";
15
+ import { cx } from "../../../../utils/cx";
16
+ import { MagnifyingGlass1SVG, XSVG } from "../../../../sub-components/icons";
17
+ import SpinnerIcon from "../../../../sub-components/SpinnerIcon";
18
+ import ProductCard from "../../../../sub-components/ProductCard";
19
+ import Button from "../../../../sub-components/Button";
20
+ import Input from "../../../../sub-components/Input";
21
+ import type { AspectRatio, ObjectFit } from "../../../../global-types";
22
+
23
+ interface Props {
24
+ productList: IkasProductList;
25
+ logo?: IkasImage;
26
+
27
+ logoSizeDesktop: string;
28
+ logoSizeMobile: string;
29
+ searchPlaceholder: string;
30
+ searchingText: string;
31
+ noResultsText: string;
32
+ resultCountText: string;
33
+ addToCartText: string;
34
+ addedToCartText: string;
35
+ outOfStockText: string;
36
+ goToProductText: string;
37
+ viewAllText: string;
38
+ hideAddToCartButton?: boolean;
39
+ components?: any;
40
+ parentProps?: Record<string, any>;
41
+ aspectRatio?: AspectRatio;
42
+ objectFit?: ObjectFit;
43
+ onClose: () => void;
44
+ }
45
+
46
+ const SearchModal = observer(function SearchModal({
47
+ productList,
48
+ logo,
49
+ logoSizeDesktop,
50
+ logoSizeMobile,
51
+ searchPlaceholder,
52
+ searchingText,
53
+ noResultsText,
54
+ resultCountText,
55
+ addToCartText,
56
+ addedToCartText,
57
+ outOfStockText,
58
+ goToProductText,
59
+ viewAllText,
60
+ hideAddToCartButton,
61
+ aspectRatio,
62
+ objectFit,
63
+ onClose,
64
+ components,
65
+ parentProps,
66
+ }: Props) {
67
+ const [open, setOpen] = useState(false);
68
+ const [query, setQuery] = useState("");
69
+ const [pendingSearch, setPendingSearch] = useState(false);
70
+ const inputRef = useRef<HTMLInputElement>(null);
71
+
72
+ const products = productList.data ?? [];
73
+
74
+ useEffect(() => {
75
+ products.forEach((p) => {
76
+ if (!p.productOptionSet) getProductOptionSet(p);
77
+ });
78
+ }, [products.length]);
79
+
80
+ const isLoading = productList.isLoading;
81
+ const totalCount = productList.count ?? 0;
82
+
83
+ useEffect(() => {
84
+ if (!isLoading) setPendingSearch(false);
85
+ }, [isLoading]);
86
+
87
+ useScrollLock();
88
+
89
+ useEffect(() => {
90
+ requestAnimationFrame(() => setOpen(true));
91
+ setTimeout(() => inputRef.current?.focus(), 100);
92
+ }, []);
93
+
94
+ const handleClose = useCallback(() => {
95
+ setOpen(false);
96
+ setTimeout(onClose, 300);
97
+ }, [onClose]);
98
+
99
+ useEffect(() => {
100
+ const handleKeyDown = (e: KeyboardEvent) => {
101
+ if (e.key === "Escape") handleClose();
102
+ };
103
+ document.addEventListener("keydown", handleKeyDown);
104
+ return () => document.removeEventListener("keydown", handleKeyDown);
105
+ }, [handleClose]);
106
+
107
+ const handleInput = useCallback(
108
+ (e: Event) => {
109
+ const value = (e.target as HTMLInputElement).value;
110
+ setQuery(value);
111
+ setPendingSearch(true);
112
+ searchProductList(productList, value);
113
+ },
114
+ [productList],
115
+ );
116
+
117
+ const showResults = !isLoading && !isEmpty(products);
118
+ const showNoResults =
119
+ !isLoading && isEmpty(products) && query.trim().length > 0;
120
+
121
+ return (
122
+ <div
123
+ className={cx(
124
+ "kombos-search-overlay",
125
+ open && "kombos-search-overlay--open",
126
+ )}
127
+ onClick={handleClose}
128
+ >
129
+ {/* Panel */}
130
+ <div
131
+ className="kombos-search__panel"
132
+ onClick={(e) => e.stopPropagation()}
133
+ >
134
+ {/* Header */}
135
+ <div className="kombos-search__header">
136
+ {/* Logo */}
137
+ <div className="kombos-search__logo-area">
138
+ {logo && (
139
+ <a
140
+ href="/"
141
+ className="kombos-search__logo"
142
+ style={{
143
+ "--search-logo-h-desktop": logoSizeDesktop,
144
+ "--search-logo-h-mobile": logoSizeMobile,
145
+ }}
146
+ >
147
+ <img
148
+ src={getDefaultSrc(logo)}
149
+ srcSet={createMediaSrcset(logo)}
150
+ sizes="120px"
151
+ alt={logo?.altText || "Logo"}
152
+ className="kombos-search__logo-img"
153
+ />
154
+ </a>
155
+ )}
156
+ </div>
157
+
158
+ {/* Search Input */}
159
+ <Input
160
+ className="kombos-search__input-wrap"
161
+ leftIcon={<MagnifyingGlass1SVG />}
162
+ inputRef={inputRef}
163
+ placeholder={searchPlaceholder}
164
+ value={query}
165
+ onInput={handleInput}
166
+ />
167
+
168
+ {/* Close */}
169
+ <div className="kombos-search__close-area">
170
+ <button
171
+ className="kombos-search__close"
172
+ onClick={handleClose}
173
+ aria-label="Close"
174
+ >
175
+ <XSVG />
176
+ </button>
177
+ </div>
178
+ </div>
179
+
180
+ {/* Body */}
181
+ <div className="kombos-search__body">
182
+ {/* Searching */}
183
+ {isLoading && (
184
+ <div className="kombos-search__status">
185
+ <SpinnerIcon className="kombos-search__spinner" />
186
+ <span className="text-xl-medium md:display-xs-medium">
187
+ {searchingText}
188
+ </span>
189
+ </div>
190
+ )}
191
+
192
+ {/* No Results */}
193
+ {showNoResults && (
194
+ <div className="kombos-search__status">
195
+ <span className="text-xl-medium md:display-xs-medium">
196
+ {noResultsText}
197
+ </span>
198
+ </div>
199
+ )}
200
+
201
+ {/* Result Count */}
202
+ {!isLoading &&
203
+ !pendingSearch &&
204
+ query.trim().length > 0 &&
205
+ !isEmpty(products) && (
206
+ <div className="kombos-search__result-count">
207
+ <span className="text-xl-medium md:display-xs-medium">
208
+ {totalCount} {resultCountText}
209
+ </span>
210
+ </div>
211
+ )}
212
+
213
+ {/* Results */}
214
+ {showResults && (
215
+ <>
216
+ <div className="kombos-search__grid">
217
+ {products.map((product) => (
218
+ <div key={product.id} className="kombos-search__card">
219
+ <ProductCard
220
+ product={product}
221
+ addToCartText={addToCartText}
222
+ addedToCartText={addedToCartText}
223
+ outOfStockText={outOfStockText}
224
+ goToProductText={goToProductText}
225
+ hideAddToCartButton={hideAddToCartButton}
226
+ openCartOnAdd={false}
227
+ aspectRatio={aspectRatio}
228
+ objectFit={objectFit}
229
+ sizes="(max-width: 767px) calc((100vw - 44px) / 2), (max-width: 1023px) calc((100vw - 48px) / 2), calc((100vw - 240px) / 5)"
230
+ />
231
+ <IkasComponentRenderer
232
+ id={`search-modal-product-${product.id}`}
233
+ components={components}
234
+ parentProps={parentProps}
235
+ map={{
236
+ product,
237
+ }}
238
+ className="kombos-search__card-content"
239
+ />
240
+ </div>
241
+ ))}
242
+ </div>
243
+ {query.trim().length > 0 && (
244
+ <div className="kombos-search__view-all">
245
+ <Button
246
+ variant="primary"
247
+ className="kombos-search__view-all-btn"
248
+ onClick={() => {
249
+ Router.navigateToPage("SEARCH", undefined, {
250
+ q: query.trim(),
251
+ });
252
+ handleClose();
253
+ }}
254
+ >
255
+ {viewAllText}
256
+ </Button>
257
+ </div>
258
+ )}
259
+ </>
260
+ )}
261
+ </div>
262
+ </div>
263
+ </div>
264
+ );
265
+ });
266
+
267
+ export default SearchModal;
@@ -0,0 +1,182 @@
1
+
2
+ /* ===== Search Modal ===== */
3
+ .kombos-search-overlay {
4
+ position: fixed;
5
+ inset: 0;
6
+ z-index: var(--kombos-z-overlay);
7
+ background: rgba(0, 0, 0, 0.35);
8
+ opacity: 0;
9
+ transition: opacity 0.3s ease;
10
+ }
11
+
12
+ .kombos-search-overlay--open {
13
+ opacity: 1;
14
+ }
15
+
16
+ .kombos-search__panel {
17
+ display: flex;
18
+ flex-direction: column;
19
+ max-height: 100%;
20
+ background: var(--kombos-white);
21
+ }
22
+
23
+ /* Header */
24
+ .kombos-search__header {
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: space-between;
28
+ gap: 0.75rem;
29
+ padding: 1rem;
30
+ border-bottom: 1px solid var(--kombos-gray-200);
31
+ flex-shrink: 0;
32
+ }
33
+
34
+ .kombos-search__logo-area {
35
+ flex-shrink: 0;
36
+ width: 7.5rem;
37
+ display: none;
38
+ }
39
+
40
+ .kombos-search__logo {
41
+ display: flex;
42
+ align-items: center;
43
+ text-decoration: none;
44
+ height: var(--search-logo-h-mobile, 3rem);
45
+ overflow: hidden;
46
+ }
47
+
48
+ .kombos-search__logo-img {
49
+ width: 100%;
50
+ height: 100%;
51
+ object-fit: contain;
52
+ }
53
+
54
+ .kombos-search__input-wrap {
55
+ flex: 1;
56
+ max-width: 59.5rem;
57
+ }
58
+
59
+ .kombos-search__close-area {
60
+ flex-shrink: 0;
61
+ width: auto;
62
+ display: flex;
63
+ justify-content: flex-end;
64
+ }
65
+
66
+ .kombos-search__close {
67
+ background: var(--kombos-gray-50);
68
+ border: 1px solid var(--kombos-gray-200);
69
+ border-radius: 6px;
70
+ cursor: pointer;
71
+ padding: 0.6875rem;
72
+ display: flex;
73
+ align-items: center;
74
+ justify-content: center;
75
+ color: var(--kombos-gray-900);
76
+ font-size: 1.25rem;
77
+ transition: background-color 0.15s ease;
78
+ }
79
+
80
+ .kombos-search__close:hover {
81
+ background: var(--kombos-gray-100);
82
+ }
83
+
84
+ /* Body */
85
+ .kombos-search__body {
86
+ overflow-y: auto;
87
+ padding: 1.5rem 1rem 0;
88
+ }
89
+
90
+ /* Status (searching / no results) */
91
+ .kombos-search__status {
92
+ display: flex;
93
+ flex-direction: row;
94
+ align-items: center;
95
+ justify-content: center;
96
+ gap: 0.75rem;
97
+ padding: 0 0 3rem;
98
+ color: var(--kombos-gray-900);
99
+ }
100
+
101
+ .kombos-search__spinner {
102
+ font-size: 2rem;
103
+ }
104
+
105
+ /* Result Count */
106
+ .kombos-search__result-count {
107
+ text-align: center;
108
+ padding: 0 0 1.5rem;
109
+ color: var(--kombos-gray-900);
110
+ }
111
+
112
+ /* Product Grid */
113
+ .kombos-search__grid {
114
+ display: grid;
115
+ grid-template-columns: repeat(2, 1fr);
116
+ gap: 0.75rem;
117
+ padding-bottom: 3rem;
118
+ }
119
+
120
+ /* View All */
121
+ .kombos-search__view-all {
122
+ display: flex;
123
+ justify-content: center;
124
+ padding-bottom: 3rem;
125
+ }
126
+
127
+ .kombos-search__view-all-btn {
128
+ min-width: 12.5rem;
129
+ }
130
+
131
+ .kombos-search__card {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: 0.5rem;
135
+ min-width: 0;
136
+ }
137
+
138
+ .kombos-search__card-content {
139
+ display: flex;
140
+ flex-direction: column;
141
+ gap: 0.5rem;
142
+ }
143
+
144
+ /* ===== Responsive — Tablet ===== */
145
+ @media (min-width: 768px) {
146
+ .kombos-search__grid {
147
+ gap: 1rem;
148
+ }
149
+ }
150
+
151
+ /* ===== Responsive — Desktop ===== */
152
+ @media (min-width: 1024px) {
153
+ .kombos-search__header {
154
+ padding: 1.25rem 3.5rem;
155
+ gap: 1.5rem;
156
+ }
157
+
158
+ .kombos-search__logo-area {
159
+ display: block;
160
+ }
161
+
162
+ .kombos-search__close-area {
163
+ width: 7.5rem;
164
+ }
165
+
166
+ .kombos-search__body {
167
+ padding: 3rem 4.5rem 0;
168
+ }
169
+
170
+ .kombos-search__result-count {
171
+ padding-bottom: 3rem;
172
+ }
173
+
174
+ .kombos-search__grid {
175
+ grid-template-columns: repeat(5, 1fr);
176
+ gap: 1.5rem;
177
+ }
178
+
179
+ .kombos-search__logo {
180
+ height: var(--search-logo-h-desktop, 3.75rem);
181
+ }
182
+ }
@@ -0,0 +1,250 @@
1
+ import { useState, useEffect } from "preact/hooks";
2
+ import {
3
+ cartStore,
4
+ customerStore,
5
+ hasCustomer,
6
+ getIkasOrderTotalItemCount,
7
+ getDefaultSrc,
8
+ getFormattedHeightSize,
9
+ Router,
10
+ createMediaSrcset,
11
+ } from "@ikas/bp-storefront";
12
+ import { Props } from "./types";
13
+ import CartSidebar from "./components/CartSidebar";
14
+ import MobileMenu from "./components/MobileMenu";
15
+ import SearchModal from "./components/SearchModal";
16
+ import NavItem from "./components/NavItem";
17
+ import {
18
+ List1SVG,
19
+ MagnifyingGlass1SVG,
20
+ User1SVG,
21
+ ShoppingBag1SVG,
22
+ } from "../../sub-components/icons";
23
+ export function Navbar(props: Props) {
24
+ const {
25
+ logo,
26
+ navigationLinks,
27
+ logoSizeDesktop: rawLogoSizeDesktop,
28
+ logoSizeMobile: rawLogoSizeMobile,
29
+ cartTitle = "Alışveriş Sepetim",
30
+ emptyCartText = "Sepetinizde Ürün Bulunmamaktadır",
31
+ checkoutButtonText = "Ödemeye Geç",
32
+ totalText = "Toplam",
33
+ navigationLinkColor,
34
+ coloredLinks,
35
+ coloredLinkColor,
36
+ registerButtonText = "Üye Ol",
37
+ loginButtonText = "Giriş Yap",
38
+ logoutButtonText = "Çıkış Yap",
39
+ freeShippingText = "150 TL ve üzeri siparişlerde kargo bedava",
40
+ emptyCartButtonText = "Alışverişe Başla",
41
+ searchPlaceholder = "Ne Aramıştınız?",
42
+ searchingText = "Aranıyor...",
43
+ noResultsText = "Aradığınız ürün bulunamadı",
44
+ resultCountText = "Sonuç",
45
+ addToCartText = "Sepete Ekle",
46
+ addedToCartText = "Sepete Eklendi",
47
+ outOfStockText = "Tükendi",
48
+ goToProductText = "Ürüne Git",
49
+ viewAllText = "Tümünü Gör",
50
+ viewCartButtonText = "Sepeti Görüntüle",
51
+ searchProductList,
52
+ hideAddToCartButton,
53
+ imageAspectRatio,
54
+ imageObjectFit,
55
+ components,
56
+ } = props;
57
+
58
+ const logoSizeDesktop = getFormattedHeightSize(rawLogoSizeDesktop) || "60px";
59
+ const logoSizeMobile = getFormattedHeightSize(rawLogoSizeMobile) || "48px";
60
+
61
+ const [mobileMenuOpen, setMobileMenuOpen] = useState(false);
62
+ const [cartOpen, setCartOpen] = useState(false);
63
+ const [searchOpen, setSearchOpen] = useState(false);
64
+
65
+ useEffect(() => {
66
+ const openCart = () => setCartOpen(true);
67
+ window.addEventListener("ikas:open-cart-sidebar", openCart);
68
+ return () => window.removeEventListener("ikas:open-cart-sidebar", openCart);
69
+ }, []);
70
+
71
+ const cart = cartStore.cart;
72
+ const itemCount = cart ? getIkasOrderTotalItemCount(cart) : 0;
73
+ const isLoggedIn = hasCustomer(customerStore);
74
+
75
+ const links = navigationLinks?.links ?? [];
76
+ const coloredLinksList = coloredLinks?.links ?? [];
77
+
78
+ return (
79
+ <div
80
+ className="kombos-navbar"
81
+ style={{
82
+ "--logo-h-desktop": logoSizeDesktop,
83
+ "--logo-h-mobile": logoSizeMobile,
84
+ }}
85
+ >
86
+ <div className="kombos-navbar__inner kombos-container">
87
+ {/* Hamburger - mobile only */}
88
+ <button
89
+ className="kombos-navbar__hamburger"
90
+ onClick={() => setMobileMenuOpen(true)}
91
+ aria-label="Menu"
92
+ >
93
+ <List1SVG />
94
+ </button>
95
+
96
+ {/* Logo */}
97
+ {logo && (
98
+ <a
99
+ className="kombos-navbar__logo"
100
+ href="/"
101
+ onClick={(e) => {
102
+ e.preventDefault();
103
+ Router.navigate("/");
104
+ }}
105
+ style={{
106
+ "--logo-h-desktop": logoSizeDesktop,
107
+ "--logo-h-mobile": logoSizeMobile,
108
+ }}
109
+ >
110
+ <img
111
+ src={getDefaultSrc(logo)}
112
+ srcSet={createMediaSrcset(logo)}
113
+ sizes="200px"
114
+ alt={logo?.altText || "Logo"}
115
+ className="kombos-navbar__logo-img"
116
+ width={200}
117
+ height={60}
118
+ fetchpriority="high"
119
+ loading="eager"
120
+ />
121
+ </a>
122
+ )}
123
+
124
+ {/* Desktop Navigation */}
125
+ <nav
126
+ className={`kombos-navbar__nav${!logo ? " kombos-navbar__nav--no-logo" : ""}`}
127
+ >
128
+ {links.map((link, i) => (
129
+ <NavItem key={i} link={link} linkColor={navigationLinkColor} />
130
+ ))}
131
+ {coloredLinksList.map((link, i) => (
132
+ <NavItem key={`cl-${i}`} link={link} linkColor={coloredLinkColor} />
133
+ ))}
134
+ </nav>
135
+
136
+ {/* Action Icons */}
137
+ <div className="kombos-navbar__actions">
138
+ {/* Search */}
139
+ <a
140
+ className="kombos-navbar__icon-btn"
141
+ href="/search"
142
+ onClick={(e) => {
143
+ e.preventDefault();
144
+ e.stopPropagation();
145
+ if (searchProductList) {
146
+ setSearchOpen(true);
147
+ } else {
148
+ Router.navigateToPage("SEARCH");
149
+ }
150
+ }}
151
+ aria-label="Search"
152
+ >
153
+ <MagnifyingGlass1SVG />
154
+ </a>
155
+
156
+ {/* Account */}
157
+ <a
158
+ className="kombos-navbar__icon-btn"
159
+ href={isLoggedIn ? "/account" : "/login"}
160
+ onClick={(e) => {
161
+ e.preventDefault();
162
+ e.stopPropagation();
163
+ Router.navigateToPage(isLoggedIn ? "ACCOUNT" : "LOGIN");
164
+ }}
165
+ aria-label="Account"
166
+ >
167
+ <User1SVG />
168
+ </a>
169
+
170
+ {/* Cart */}
171
+ <a
172
+ className="kombos-navbar__icon-btn kombos-navbar__cart-trigger"
173
+ href="/cart"
174
+ onClick={(e) => {
175
+ e.preventDefault();
176
+ e.stopPropagation();
177
+ setCartOpen(true);
178
+ }}
179
+ aria-label="Cart"
180
+ >
181
+ <ShoppingBag1SVG />
182
+ {itemCount > 0 && (
183
+ <span className="kombos-navbar__badge">{itemCount}</span>
184
+ )}
185
+ </a>
186
+ </div>
187
+ </div>
188
+
189
+ {/* Cart Sidebar */}
190
+ {cartOpen && (
191
+ <CartSidebar
192
+ cartTitle={cartTitle}
193
+ emptyCartText={emptyCartText}
194
+ checkoutButtonText={checkoutButtonText}
195
+ viewCartButtonText={viewCartButtonText}
196
+ totalText={totalText}
197
+ freeShippingText={freeShippingText}
198
+ emptyCartButtonText={emptyCartButtonText}
199
+ imageAspectRatio={imageAspectRatio}
200
+ imageObjectFit={imageObjectFit}
201
+ onClose={() => setCartOpen(false)}
202
+ />
203
+ )}
204
+
205
+ {/* Search Modal */}
206
+ {searchOpen && searchProductList && (
207
+ <SearchModal
208
+ productList={searchProductList}
209
+ logo={logo ?? undefined}
210
+ logoSizeDesktop={logoSizeDesktop}
211
+ logoSizeMobile={logoSizeMobile}
212
+ searchPlaceholder={searchPlaceholder}
213
+ searchingText={searchingText}
214
+ noResultsText={noResultsText}
215
+ resultCountText={resultCountText}
216
+ addToCartText={addToCartText}
217
+ addedToCartText={addedToCartText}
218
+ outOfStockText={outOfStockText}
219
+ goToProductText={goToProductText}
220
+ viewAllText={viewAllText}
221
+ hideAddToCartButton={hideAddToCartButton}
222
+ aspectRatio={imageAspectRatio}
223
+ objectFit={imageObjectFit}
224
+ onClose={() => setSearchOpen(false)}
225
+ components={components}
226
+ parentProps={props}
227
+ />
228
+ )}
229
+
230
+ {/* Mobile Menu */}
231
+ {mobileMenuOpen && (
232
+ <MobileMenu
233
+ linkGroups={[
234
+ { links, color: navigationLinkColor },
235
+ ...(coloredLinksList.length > 0
236
+ ? [{ links: coloredLinksList, color: coloredLinkColor }]
237
+ : []),
238
+ ]}
239
+ registerButtonText={registerButtonText}
240
+ loginButtonText={loginButtonText}
241
+ logoutButtonText={logoutButtonText}
242
+ onClose={() => setMobileMenuOpen(false)}
243
+ onCartOpen={() => setCartOpen(true)}
244
+ />
245
+ )}
246
+ </div>
247
+ );
248
+ }
249
+
250
+ export default Navbar;