@salla.sa/twilight-theme-engine 1.0.128 → 1.0.129

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 (219) hide show
  1. package/dist/{AddToCartForm-NBU3MIEW.js → AddToCartForm-I2SZGGZK.js} +3 -3
  2. package/dist/{AddToCartForm-NBU3MIEW.js.map → AddToCartForm-I2SZGGZK.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-4HGFVIG2.js → BlogAuthorPage-JHZHLSIA.js} +17 -17
  4. package/dist/{BlogAuthorPage-4HGFVIG2.js.map → BlogAuthorPage-JHZHLSIA.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-67TZRH3C.js → BlogCategoryPage-F4264MQG.js} +17 -17
  6. package/dist/{BlogCategoryPage-67TZRH3C.js.map → BlogCategoryPage-F4264MQG.js.map} +1 -1
  7. package/dist/{BlogPage-HINCPIQO.js → BlogPage-3TELFUFM.js} +15 -15
  8. package/dist/{BlogPage-HINCPIQO.js.map → BlogPage-3TELFUFM.js.map} +1 -1
  9. package/dist/{BlogSinglePage-4BWHLJU6.js → BlogSinglePage-QBADHXXZ.js} +15 -15
  10. package/dist/{BlogSinglePage-4BWHLJU6.js.map → BlogSinglePage-QBADHXXZ.js.map} +1 -1
  11. package/dist/{BlogTagPage-BGPLVWGM.js → BlogTagPage-WEP37KDY.js} +17 -17
  12. package/dist/{BlogTagPage-BGPLVWGM.js.map → BlogTagPage-WEP37KDY.js.map} +1 -1
  13. package/dist/{BrandsPage-2NC3RCZK.js → BrandsPage-EENWKAIY.js} +16 -16
  14. package/dist/{BrandsPage-2NC3RCZK.js.map → BrandsPage-EENWKAIY.js.map} +1 -1
  15. package/dist/{Breadcrumb-CCYDVGCS.js → Breadcrumb-A2CNX5VU.js} +15 -15
  16. package/dist/{Breadcrumb-CCYDVGCS.js.map → Breadcrumb-A2CNX5VU.js.map} +1 -1
  17. package/dist/{CartItem-M5PC54CM.js → CartItem-X7UB2GZG.js} +15 -15
  18. package/dist/{CartItem-M5PC54CM.js.map → CartItem-X7UB2GZG.js.map} +1 -1
  19. package/dist/{CartSummary-YQI7XI4D.js → CartSummary-EEJ3JO6E.js} +15 -15
  20. package/dist/{CartSummary-YQI7XI4D.js.map → CartSummary-EEJ3JO6E.js.map} +1 -1
  21. package/dist/{Copyright-67E3ANPE.js → Copyright-VGOFMMIR.js} +3 -3
  22. package/dist/{Copyright-67E3ANPE.js.map → Copyright-VGOFMMIR.js.map} +1 -1
  23. package/dist/{CustomerLayout-HPLKOG7R.js → CustomerLayout-2E6ENXOH.js} +15 -15
  24. package/dist/{CustomerLayout-HPLKOG7R.js.map → CustomerLayout-2E6ENXOH.js.map} +1 -1
  25. package/dist/{Footer-56IXUTHF.js → Footer-5L3YKKPB.js} +4 -4
  26. package/dist/{Footer-56IXUTHF.js.map → Footer-5L3YKKPB.js.map} +1 -1
  27. package/dist/{Header-67Q5OA63.js → Header-KMURB263.js} +8 -8
  28. package/dist/{Header-67Q5OA63.js.map → Header-KMURB263.js.map} +1 -1
  29. package/dist/{LiveEditorBar-IQLFFBHE.js → LiveEditorBar-DOSRO35J.js} +3 -3
  30. package/dist/{LiveEditorBar-IQLFFBHE.js.map → LiveEditorBar-DOSRO35J.js.map} +1 -1
  31. package/dist/{LoyaltyPage-GC7B5FXF.js → LoyaltyPage-WI2SL6SR.js} +15 -15
  32. package/dist/{LoyaltyPage-GC7B5FXF.js.map → LoyaltyPage-WI2SL6SR.js.map} +1 -1
  33. package/dist/{LoyaltyPointsPage-UAZQ2GZT.js → LoyaltyPointsPage-RKGFGLL4.js} +6 -6
  34. package/dist/{LoyaltyPointsPage-UAZQ2GZT.js.map → LoyaltyPointsPage-RKGFGLL4.js.map} +1 -1
  35. package/dist/{MainMenu-7SXJ2DU4.js → MainMenu-VFI4SRRS.js} +5 -5
  36. package/dist/{MainMenu-7SXJ2DU4.js.map → MainMenu-VFI4SRRS.js.map} +1 -1
  37. package/dist/{MasterLayout-53MYQBTT.js → MasterLayout-AZSOVNPR.js} +15 -15
  38. package/dist/{MasterLayout-53MYQBTT.js.map → MasterLayout-AZSOVNPR.js.map} +1 -1
  39. package/dist/{MobileMenu-U6W2XQYI.js → MobileMenu-PRND3T3Z.js} +16 -16
  40. package/dist/{MobileMenu-U6W2XQYI.js.map → MobileMenu-PRND3T3Z.js.map} +1 -1
  41. package/dist/{NotificationsPage-2WFW7GCV.js → NotificationsPage-VPCF5TNJ.js} +15 -15
  42. package/dist/{NotificationsPage-2WFW7GCV.js.map → NotificationsPage-VPCF5TNJ.js.map} +1 -1
  43. package/dist/{OrderSinglePage-VN3IBWOO.js → OrderSinglePage-BIPGDSSI.js} +16 -16
  44. package/dist/{OrderSinglePage-VN3IBWOO.js.map → OrderSinglePage-BIPGDSSI.js.map} +1 -1
  45. package/dist/{OrdersPage-NOUGRTHI.js → OrdersPage-DTI5CYHH.js} +15 -15
  46. package/dist/{OrdersPage-NOUGRTHI.js.map → OrdersPage-DTI5CYHH.js.map} +1 -1
  47. package/dist/{PageSingle-MP5THOR4.js → PageSingle-VUKTKJKB.js} +3 -3
  48. package/dist/{PageSingle-MP5THOR4.js.map → PageSingle-VUKTKJKB.js.map} +1 -1
  49. package/dist/{ProductDetails-GONQFVV2.js → ProductDetails-CUSUV3YF.js} +4 -4
  50. package/dist/{ProductDetails-GONQFVV2.js.map → ProductDetails-CUSUV3YF.js.map} +1 -1
  51. package/dist/{ProfilePage-RHK3OHFF.js → ProfilePage-APTF4ZI3.js} +15 -15
  52. package/dist/{ProfilePage-RHK3OHFF.js.map → ProfilePage-APTF4ZI3.js.map} +1 -1
  53. package/dist/{ReviewsPage-3PODTNEP.js → ReviewsPage-Q5UUELM5.js} +3 -3
  54. package/dist/{ReviewsPage-3PODTNEP.js.map → ReviewsPage-Q5UUELM5.js.map} +1 -1
  55. package/dist/{SeoCartWidget-MHOPTGWV.js → SeoCartWidget-7BLWJVZ7.js} +15 -15
  56. package/dist/{SeoCartWidget-MHOPTGWV.js.map → SeoCartWidget-7BLWJVZ7.js.map} +1 -1
  57. package/dist/{SettingsPage-RLNSTOCG.js → SettingsPage-I6STBZ2M.js} +15 -15
  58. package/dist/{SettingsPage-RLNSTOCG.js.map → SettingsPage-I6STBZ2M.js.map} +1 -1
  59. package/dist/{StoreClosedNotification-AUQCK2MP.js → StoreClosedNotification-PNOFS2B5.js} +16 -16
  60. package/dist/{StoreClosedNotification-AUQCK2MP.js.map → StoreClosedNotification-PNOFS2B5.js.map} +1 -1
  61. package/dist/{TestimonialsPage-GXKXWGDA.js → TestimonialsPage-S64KZKPY.js} +3 -3
  62. package/dist/{TestimonialsPage-GXKXWGDA.js.map → TestimonialsPage-S64KZKPY.js.map} +1 -1
  63. package/dist/{ThankYouPage-GILEXBPL.js → ThankYouPage-VGNCUZTV.js} +15 -15
  64. package/dist/{ThankYouPage-GILEXBPL.js.map → ThankYouPage-VGNCUZTV.js.map} +1 -1
  65. package/dist/{WalletPage-4OOHX65H.js → WalletPage-MIXW2MTQ.js} +16 -16
  66. package/dist/{WalletPage-4OOHX65H.js.map → WalletPage-MIXW2MTQ.js.map} +1 -1
  67. package/dist/{WishlistPage-Z2TPPFFM.js → WishlistPage-RVWSOXRC.js} +17 -17
  68. package/dist/{WishlistPage-Z2TPPFFM.js.map → WishlistPage-RVWSOXRC.js.map} +1 -1
  69. package/dist/api/advertisement.js +2 -2
  70. package/dist/api/apps.js +2 -2
  71. package/dist/api/blog.js +3 -3
  72. package/dist/api/brands.js +3 -3
  73. package/dist/api/cart.js +3 -3
  74. package/dist/api/category.js +3 -3
  75. package/dist/api/client.js +1 -1
  76. package/dist/api/home.js +2 -2
  77. package/dist/api/loyalty.js +3 -3
  78. package/dist/api/menu.js +2 -2
  79. package/dist/api/notification.js +2 -2
  80. package/dist/api/order.js +3 -3
  81. package/dist/api/page.js +3 -3
  82. package/dist/api/product.js +3 -3
  83. package/dist/api/profile.js +1 -1
  84. package/dist/api/store.js +2 -2
  85. package/dist/api/translations.js +2 -2
  86. package/dist/api/user.js +2 -2
  87. package/dist/api/wallet.js +2 -2
  88. package/dist/api/wishlist.js +4 -4
  89. package/dist/{chunk-EXK6VVXU.js → chunk-2M5BICJK.js} +4 -4
  90. package/dist/{chunk-EXK6VVXU.js.map → chunk-2M5BICJK.js.map} +1 -1
  91. package/dist/{chunk-UGJ24VNF.js → chunk-2SCIGF3L.js} +4 -4
  92. package/dist/{chunk-UGJ24VNF.js.map → chunk-2SCIGF3L.js.map} +1 -1
  93. package/dist/{chunk-HRDCUTC6.js → chunk-3TKG3ORJ.js} +6 -6
  94. package/dist/{chunk-HRDCUTC6.js.map → chunk-3TKG3ORJ.js.map} +1 -1
  95. package/dist/{chunk-M6Z7KIDX.js → chunk-6I2J6V3S.js} +3 -3
  96. package/dist/{chunk-M6Z7KIDX.js.map → chunk-6I2J6V3S.js.map} +1 -1
  97. package/dist/{chunk-OOQTZ7N7.js → chunk-6VBXPDXM.js} +3 -3
  98. package/dist/{chunk-OOQTZ7N7.js.map → chunk-6VBXPDXM.js.map} +1 -1
  99. package/dist/{chunk-5U7LPEFE.js → chunk-747V3UL5.js} +3 -3
  100. package/dist/{chunk-5U7LPEFE.js.map → chunk-747V3UL5.js.map} +1 -1
  101. package/dist/{chunk-2VRMQZXF.js → chunk-763YWRXT.js} +3 -3
  102. package/dist/{chunk-2VRMQZXF.js.map → chunk-763YWRXT.js.map} +1 -1
  103. package/dist/{chunk-3OGFV27B.js → chunk-ASTCQSK6.js} +3 -3
  104. package/dist/{chunk-3OGFV27B.js.map → chunk-ASTCQSK6.js.map} +1 -1
  105. package/dist/{chunk-JUKKXGHR.js → chunk-AT3IL55G.js} +3 -3
  106. package/dist/{chunk-JUKKXGHR.js.map → chunk-AT3IL55G.js.map} +1 -1
  107. package/dist/{chunk-7SBSV5DD.js → chunk-CLZRX5TX.js} +3 -3
  108. package/dist/{chunk-7SBSV5DD.js.map → chunk-CLZRX5TX.js.map} +1 -1
  109. package/dist/{chunk-DJN6JAF7.js → chunk-D7IP4MVJ.js} +5 -5
  110. package/dist/{chunk-DJN6JAF7.js.map → chunk-D7IP4MVJ.js.map} +1 -1
  111. package/dist/{chunk-3U6BZUQL.js → chunk-DEDX3AIO.js} +7 -7
  112. package/dist/{chunk-3U6BZUQL.js.map → chunk-DEDX3AIO.js.map} +1 -1
  113. package/dist/chunk-DEZVFNN2.js +14 -0
  114. package/dist/{chunk-L4FKJ3ZN.js.map → chunk-DEZVFNN2.js.map} +1 -1
  115. package/dist/{chunk-U2UDXLAE.js → chunk-ECY5POOK.js} +3 -3
  116. package/dist/{chunk-U2UDXLAE.js.map → chunk-ECY5POOK.js.map} +1 -1
  117. package/dist/{chunk-ZWV6YNIB.js → chunk-EMOLTV77.js} +4 -4
  118. package/dist/{chunk-ZWV6YNIB.js.map → chunk-EMOLTV77.js.map} +1 -1
  119. package/dist/{chunk-RA5O7L7Q.js → chunk-EPTYC5H3.js} +4 -4
  120. package/dist/{chunk-RA5O7L7Q.js.map → chunk-EPTYC5H3.js.map} +1 -1
  121. package/dist/{chunk-GN5V4IQI.js → chunk-F5H7QF2T.js} +4 -4
  122. package/dist/{chunk-GN5V4IQI.js.map → chunk-F5H7QF2T.js.map} +1 -1
  123. package/dist/{chunk-QLFRNPPF.js → chunk-FBOWKMPX.js} +25 -19
  124. package/dist/chunk-FBOWKMPX.js.map +1 -0
  125. package/dist/{chunk-XCS62X6X.js → chunk-FFIONN5M.js} +7 -7
  126. package/dist/{chunk-XCS62X6X.js.map → chunk-FFIONN5M.js.map} +1 -1
  127. package/dist/{chunk-MVNWWZWQ.js → chunk-FHAHE46U.js} +7 -3
  128. package/dist/chunk-FHAHE46U.js.map +1 -0
  129. package/dist/{chunk-UWE2QL3O.js → chunk-G74DWDSJ.js} +3 -3
  130. package/dist/{chunk-UWE2QL3O.js.map → chunk-G74DWDSJ.js.map} +1 -1
  131. package/dist/{chunk-GFOAMXSO.js → chunk-GJFWNFMU.js} +3 -3
  132. package/dist/{chunk-GFOAMXSO.js.map → chunk-GJFWNFMU.js.map} +1 -1
  133. package/dist/{chunk-L36ZEKBI.js → chunk-IWBUTY3D.js} +4 -4
  134. package/dist/{chunk-L36ZEKBI.js.map → chunk-IWBUTY3D.js.map} +1 -1
  135. package/dist/{chunk-LIQHWHYV.js → chunk-L75KAYY5.js} +10 -10
  136. package/dist/{chunk-LIQHWHYV.js.map → chunk-L75KAYY5.js.map} +1 -1
  137. package/dist/{chunk-DI463VGL.js → chunk-NOVJ3US5.js} +3 -3
  138. package/dist/{chunk-DI463VGL.js.map → chunk-NOVJ3US5.js.map} +1 -1
  139. package/dist/{chunk-CN4U4EWY.js → chunk-OJ7YQEW7.js} +4 -4
  140. package/dist/{chunk-CN4U4EWY.js.map → chunk-OJ7YQEW7.js.map} +1 -1
  141. package/dist/{chunk-FWGHTOGZ.js → chunk-OOSLYT2L.js} +7 -7
  142. package/dist/{chunk-FWGHTOGZ.js.map → chunk-OOSLYT2L.js.map} +1 -1
  143. package/dist/{chunk-S7QZUBXM.js → chunk-OQTBHL5T.js} +3 -3
  144. package/dist/{chunk-S7QZUBXM.js.map → chunk-OQTBHL5T.js.map} +1 -1
  145. package/dist/{chunk-HAS46CRI.js → chunk-OYPE6432.js} +3 -3
  146. package/dist/{chunk-HAS46CRI.js.map → chunk-OYPE6432.js.map} +1 -1
  147. package/dist/{chunk-3FMJHVRY.js → chunk-PTSJOV2E.js} +4 -4
  148. package/dist/{chunk-3FMJHVRY.js.map → chunk-PTSJOV2E.js.map} +1 -1
  149. package/dist/{chunk-HZIQK63A.js → chunk-QPKK4LPK.js} +3 -3
  150. package/dist/{chunk-HZIQK63A.js.map → chunk-QPKK4LPK.js.map} +1 -1
  151. package/dist/{chunk-5GCOUJ7T.js → chunk-QRFYOEZY.js} +3 -3
  152. package/dist/{chunk-5GCOUJ7T.js.map → chunk-QRFYOEZY.js.map} +1 -1
  153. package/dist/{chunk-EZK2WD75.js → chunk-RDMEIF2O.js} +4 -4
  154. package/dist/{chunk-EZK2WD75.js.map → chunk-RDMEIF2O.js.map} +1 -1
  155. package/dist/{chunk-CGABIBZZ.js → chunk-RPRZYRPX.js} +4 -4
  156. package/dist/{chunk-CGABIBZZ.js.map → chunk-RPRZYRPX.js.map} +1 -1
  157. package/dist/{chunk-O3BZBI27.js → chunk-V4HOZSIW.js} +3 -3
  158. package/dist/{chunk-O3BZBI27.js.map → chunk-V4HOZSIW.js.map} +1 -1
  159. package/dist/{chunk-6NT6RC2H.js → chunk-VWZG5QKQ.js} +3 -3
  160. package/dist/{chunk-6NT6RC2H.js.map → chunk-VWZG5QKQ.js.map} +1 -1
  161. package/dist/{chunk-JAP5KTIG.js → chunk-WOMGFBX5.js} +4 -4
  162. package/dist/{chunk-JAP5KTIG.js.map → chunk-WOMGFBX5.js.map} +1 -1
  163. package/dist/{chunk-4LR7N76Q.js → chunk-WQJT663R.js} +3 -3
  164. package/dist/{chunk-4LR7N76Q.js.map → chunk-WQJT663R.js.map} +1 -1
  165. package/dist/{chunk-KNTHVSUL.js → chunk-XX4L34QI.js} +6 -6
  166. package/dist/{chunk-KNTHVSUL.js.map → chunk-XX4L34QI.js.map} +1 -1
  167. package/dist/{chunk-6GDNC6DS.js → chunk-ZWOD67SV.js} +3 -3
  168. package/dist/{chunk-6GDNC6DS.js.map → chunk-ZWOD67SV.js.map} +1 -1
  169. package/dist/components/cart/index.js +1 -1
  170. package/dist/components/common/index.js +1 -1
  171. package/dist/components/drawer/index.js +13 -13
  172. package/dist/components/home/index.js +17 -17
  173. package/dist/components/layout/index.js +4 -4
  174. package/dist/components/live-editor/frame.d.ts +6 -0
  175. package/dist/components/live-editor/frame.d.ts.map +1 -1
  176. package/dist/components/product/index.js +14 -14
  177. package/dist/components/store/index.js +14 -14
  178. package/dist/dev/editor/index.js +1 -1
  179. package/dist/dev/index.js +1 -1
  180. package/dist/{document-class-DSRV5LZK.js → document-class-7JZLKPFE.js} +11 -11
  181. package/dist/{document-class-DSRV5LZK.js.map → document-class-7JZLKPFE.js.map} +1 -1
  182. package/dist/hooks/index.js +13 -13
  183. package/dist/hooks/useGtm.js +13 -13
  184. package/dist/hooks/useMoney.js +13 -13
  185. package/dist/hooks/useStore.js +13 -13
  186. package/dist/hooks/useUser.js +3 -3
  187. package/dist/index.js +13 -13
  188. package/dist/{navigation-XCZMJSNS.js → navigation-IUHYIHIQ.js} +5 -5
  189. package/dist/{navigation-XCZMJSNS.js.map → navigation-IUHYIHIQ.js.map} +1 -1
  190. package/dist/{navigation-ATD4DRST.js → navigation-L77QYQHZ.js} +4 -4
  191. package/dist/{navigation-ATD4DRST.js.map → navigation-L77QYQHZ.js.map} +1 -1
  192. package/dist/{not-found-ZE4Y7RLW.js → not-found-YVGX5ST2.js} +16 -16
  193. package/dist/{not-found-ZE4Y7RLW.js.map → not-found-YVGX5ST2.js.map} +1 -1
  194. package/dist/providers/TwilightProvider.d.ts.map +1 -1
  195. package/dist/providers/index.js +13 -13
  196. package/dist/routes/account/orders.js +4 -4
  197. package/dist/routes/account.js +13 -13
  198. package/dist/routes/blog.js +8 -8
  199. package/dist/routes/brands.js +4 -4
  200. package/dist/routes/cart.js +21 -21
  201. package/dist/routes/home.js +18 -18
  202. package/dist/routes/index.js +3 -3
  203. package/dist/routes/loyalty.js +5 -5
  204. package/dist/routes/page.js +4 -4
  205. package/dist/routes/product-listing.js +19 -19
  206. package/dist/routes/product.js +17 -17
  207. package/dist/routes/seo-redirects.js +3 -3
  208. package/dist/routes/testimonials.js +2 -2
  209. package/dist/routes/thank-you.js +4 -4
  210. package/dist/skeleton.js +18 -18
  211. package/dist/{store-lookup-TG6RV6NV.js → store-lookup-F66OF7JS.js} +8 -8
  212. package/dist/{store-lookup-TG6RV6NV.js.map → store-lookup-F66OF7JS.js.map} +1 -1
  213. package/dist/tanstack.js +11 -11
  214. package/dist/utils/index.js +2 -2
  215. package/package.json +1 -1
  216. package/tailwind/components/live-editor/frame.ts.txt +10 -0
  217. package/dist/chunk-L4FKJ3ZN.js +0 -14
  218. package/dist/chunk-MVNWWZWQ.js.map +0 -1
  219. package/dist/chunk-QLFRNPPF.js.map +0 -1
package/dist/skeleton.js CHANGED
@@ -1,29 +1,29 @@
1
1
  export { BlogSkeleton, BreadcrumbSkeleton, CartSkeleton, CustomerLayoutSkeleton, CustomerPageSkeleton, PageSkeleton, ProductCardSkeleton, ProductDetailSkeleton, ProductGridSkeleton, SkeletonPulse } from './chunk-N7CCSGZF.js';
2
- export { HomeSkeleton } from './chunk-DJN6JAF7.js';
3
- import './chunk-KNTHVSUL.js';
4
- import './chunk-UWE2QL3O.js';
5
- import './chunk-CGABIBZZ.js';
6
- import './chunk-HRDCUTC6.js';
2
+ export { HomeSkeleton } from './chunk-D7IP4MVJ.js';
3
+ import './chunk-XX4L34QI.js';
4
+ import './chunk-G74DWDSJ.js';
5
+ import './chunk-RPRZYRPX.js';
6
+ import './chunk-3TKG3ORJ.js';
7
7
  import './chunk-Y32RHCOH.js';
8
- import './chunk-QLFRNPPF.js';
9
- import './chunk-MVNWWZWQ.js';
10
- import './chunk-XCS62X6X.js';
11
- import './chunk-5U7LPEFE.js';
8
+ import './chunk-FBOWKMPX.js';
9
+ import './chunk-FHAHE46U.js';
10
+ import './chunk-FFIONN5M.js';
11
+ import './chunk-747V3UL5.js';
12
12
  import './chunk-KQEBYXYB.js';
13
13
  import './chunk-JYV25VNZ.js';
14
- import './chunk-4LR7N76Q.js';
14
+ import './chunk-WQJT663R.js';
15
15
  import './chunk-OXMUPNMH.js';
16
- import './chunk-GFOAMXSO.js';
16
+ import './chunk-GJFWNFMU.js';
17
17
  import './chunk-VVZNW5CB.js';
18
18
  import './chunk-5FJFN3IW.js';
19
19
  import './chunk-GD26FI4J.js';
20
20
  import './chunk-OM2GRPDH.js';
21
- import './chunk-HZIQK63A.js';
21
+ import './chunk-QPKK4LPK.js';
22
22
  import './chunk-OUW6WESU.js';
23
23
  import './chunk-BK5TBUGG.js';
24
24
  import './chunk-HI5V5X3S.js';
25
- import './chunk-U2UDXLAE.js';
26
- import './chunk-6NT6RC2H.js';
25
+ import './chunk-ECY5POOK.js';
26
+ import './chunk-VWZG5QKQ.js';
27
27
  import './chunk-MVT5AF2A.js';
28
28
  import './chunk-Z653O7MX.js';
29
29
  import './chunk-ZCH7W7DZ.js';
@@ -34,16 +34,16 @@ import './chunk-7V36I5GT.js';
34
34
  import './chunk-6WI7R2BD.js';
35
35
  import './chunk-JGVEGQHJ.js';
36
36
  import './chunk-OAMIDZKW.js';
37
- import './chunk-2VRMQZXF.js';
37
+ import './chunk-763YWRXT.js';
38
38
  import './chunk-OQIIJRAS.js';
39
39
  import './chunk-V2ZDTY6H.js';
40
- import './chunk-5GCOUJ7T.js';
40
+ import './chunk-QRFYOEZY.js';
41
41
  import './chunk-5XDPAKF5.js';
42
42
  import './chunk-GCPEMNSU.js';
43
- import './chunk-S7QZUBXM.js';
43
+ import './chunk-OQTBHL5T.js';
44
44
  import './chunk-Z5M4YYWT.js';
45
45
  import './chunk-TYNZ5B2B.js';
46
- import './chunk-JUKKXGHR.js';
46
+ import './chunk-AT3IL55G.js';
47
47
  import './chunk-AXW67SY7.js';
48
48
  import './chunk-BYMOPN2S.js';
49
49
  import './chunk-SKLEJJ6M.js';
@@ -1,11 +1,11 @@
1
- import { category } from './chunk-RA5O7L7Q.js';
2
- import { blog } from './chunk-ZWV6YNIB.js';
3
- import { brand } from './chunk-CN4U4EWY.js';
4
- import { product } from './chunk-CGABIBZZ.js';
1
+ import { category } from './chunk-EPTYC5H3.js';
2
+ import { blog } from './chunk-EMOLTV77.js';
3
+ import { brand } from './chunk-OJ7YQEW7.js';
4
+ import { product } from './chunk-RPRZYRPX.js';
5
5
  import { DEV_LOOKUP_BUDGET_MS } from './chunk-OXMUPNMH.js';
6
- import './chunk-HZIQK63A.js';
6
+ import './chunk-QPKK4LPK.js';
7
7
  import './chunk-OUW6WESU.js';
8
- import './chunk-S7QZUBXM.js';
8
+ import './chunk-OQTBHL5T.js';
9
9
  import './chunk-Z5M4YYWT.js';
10
10
  import './chunk-2TLIULJZ.js';
11
11
  import './chunk-GYXUYHKO.js';
@@ -111,5 +111,5 @@ function lookupInStore(source, query) {
111
111
  }
112
112
 
113
113
  export { lookupInStore };
114
- //# sourceMappingURL=store-lookup-TG6RV6NV.js.map
115
- //# sourceMappingURL=store-lookup-TG6RV6NV.js.map
114
+ //# sourceMappingURL=store-lookup-F66OF7JS.js.map
115
+ //# sourceMappingURL=store-lookup-F66OF7JS.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/dev/store-lookup.ts"],"names":["categories"],"mappings":"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","file":"store-lookup-TG6RV6NV.js","sourcesContent":["/**\n * Runs in the editor's frame (the storefront), which has the engine's API\n * client set up for the dev store: answers the editor's pickers with the real\n * store's products, categories, brands and blog. Loaded with `import()` on the\n * first lookup, so a storefront never carries it.\n *\n * Each item's `data` is what a block receives for it, in the API's shape: a\n * product block reads only the ids and fetches the rest, while categories and\n * brands are drawn from what is saved.\n */\n\nimport { product } from '../api/product';\nimport { category } from '../api/category';\nimport { brand } from '../api/brands';\nimport { blog } from '../api/blog';\nimport type { Category } from '../types';\nimport { DEV_LOOKUP_BUDGET_MS, type DevLookupItem, type DevLookupSource } from './schema-types';\n\n/** Enough to choose from; a search narrows it further. */\nconst PER_PAGE = 20;\n/** How far a paged list is searched before giving up, so a big store can't stall the picker. */\nconst MAX_PAGES = 10;\n\ninterface Page<T> {\n items: T[];\n next: string | null;\n}\n\n/**\n * The matching items of a paged list, read page after page until there are\n * enough, the pages run out, or the time budget is spent: a brand or article on\n * page three is still found, and what was found so far always reaches the\n * editor before it stops waiting (`DEV_LOOKUP_BUDGET_MS` < its timeout).\n */\nasync function collect<T>(\n fetchPage: (page: number, cursor: string | null) => Promise<Page<T>>,\n keep: (item: T) => boolean\n): Promise<T[]> {\n const deadline = Date.now() + DEV_LOOKUP_BUDGET_MS;\n const found: T[] = [];\n let cursor: string | null = null;\n for (let page = 1; page <= MAX_PAGES; page += 1) {\n const { items, next } = await fetchPage(page, cursor);\n found.push(...items.filter(keep));\n if (found.length >= PER_PAGE || !next || Date.now() >= deadline) break;\n cursor = next;\n }\n return found.slice(0, PER_PAGE);\n}\n\nfunction matches(name: string, query: string): boolean {\n return !query || name.toLowerCase().includes(query.toLowerCase());\n}\n\n/** Categories with their subcategories, flattened, parents first. */\nfunction flatten(categories: Category[]): Category[] {\n return categories.flatMap((c) => [c, ...flatten(c.sub_categories ?? [])]);\n}\n\nasync function products(query: string): Promise<DevLookupItem[]> {\n const { items } = await product.list({\n source: query ? 'search' : 'latest',\n ...(query ? { keyword: query } : {}),\n perPage: PER_PAGE,\n });\n // List responses send the id as a numeric string; the block reads a number. Use it for both.\n return items.map((p) => ({\n id: Number(p.id),\n name: p.name,\n image: p.image?.url,\n url: p.url,\n data: { id: Number(p.id), name: p.name, url: p.url, image: p.image?.url ?? null },\n }));\n}\n\nasync function categories(query: string): Promise<DevLookupItem[]> {\n return flatten(await category.list())\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image ?? undefined,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url, image: c.image ?? null, icon: c.icon ?? null },\n }));\n}\n\nasync function brands(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n (page) => brand.list(page),\n (b) => matches(b.name, query)\n );\n return found.map((b) => ({\n id: b.id,\n name: b.name,\n image: b.logo,\n url: b.url,\n data: { id: b.id, name: b.name, url: b.url, logo: b.logo, banner: b.banner ?? null },\n }));\n}\n\nasync function blogArticles(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n async (_page, cursor) => {\n const { data, cursor: pages } = await blog.articles.list(cursor ? { cursor } : undefined);\n return { items: data, next: pages?.next ?? null };\n },\n (a) => matches(a.name, query)\n );\n return found.map((a) => ({\n id: a.id,\n name: a.name,\n image: a.image,\n url: a.url,\n data: { id: a.id, name: a.name, url: a.url },\n }));\n}\n\nasync function blogCategories(query: string): Promise<DevLookupItem[]> {\n const { categories: list } = await blog.get();\n return list\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url },\n }));\n}\n\nconst LOOKUPS: Record<DevLookupSource, (query: string) => Promise<DevLookupItem[]>> = {\n products,\n categories,\n brands,\n blog_articles: blogArticles,\n blog_categories: blogCategories,\n};\n\nexport function lookupInStore(source: DevLookupSource, query: string): Promise<DevLookupItem[]> {\n const lookup = LOOKUPS[source];\n if (!lookup) return Promise.reject(new Error(`no lookup for ${source}`));\n return lookup(query.trim());\n}\n"]}
1
+ {"version":3,"sources":["../src/dev/store-lookup.ts"],"names":["categories"],"mappings":"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","file":"store-lookup-F66OF7JS.js","sourcesContent":["/**\n * Runs in the editor's frame (the storefront), which has the engine's API\n * client set up for the dev store: answers the editor's pickers with the real\n * store's products, categories, brands and blog. Loaded with `import()` on the\n * first lookup, so a storefront never carries it.\n *\n * Each item's `data` is what a block receives for it, in the API's shape: a\n * product block reads only the ids and fetches the rest, while categories and\n * brands are drawn from what is saved.\n */\n\nimport { product } from '../api/product';\nimport { category } from '../api/category';\nimport { brand } from '../api/brands';\nimport { blog } from '../api/blog';\nimport type { Category } from '../types';\nimport { DEV_LOOKUP_BUDGET_MS, type DevLookupItem, type DevLookupSource } from './schema-types';\n\n/** Enough to choose from; a search narrows it further. */\nconst PER_PAGE = 20;\n/** How far a paged list is searched before giving up, so a big store can't stall the picker. */\nconst MAX_PAGES = 10;\n\ninterface Page<T> {\n items: T[];\n next: string | null;\n}\n\n/**\n * The matching items of a paged list, read page after page until there are\n * enough, the pages run out, or the time budget is spent: a brand or article on\n * page three is still found, and what was found so far always reaches the\n * editor before it stops waiting (`DEV_LOOKUP_BUDGET_MS` < its timeout).\n */\nasync function collect<T>(\n fetchPage: (page: number, cursor: string | null) => Promise<Page<T>>,\n keep: (item: T) => boolean\n): Promise<T[]> {\n const deadline = Date.now() + DEV_LOOKUP_BUDGET_MS;\n const found: T[] = [];\n let cursor: string | null = null;\n for (let page = 1; page <= MAX_PAGES; page += 1) {\n const { items, next } = await fetchPage(page, cursor);\n found.push(...items.filter(keep));\n if (found.length >= PER_PAGE || !next || Date.now() >= deadline) break;\n cursor = next;\n }\n return found.slice(0, PER_PAGE);\n}\n\nfunction matches(name: string, query: string): boolean {\n return !query || name.toLowerCase().includes(query.toLowerCase());\n}\n\n/** Categories with their subcategories, flattened, parents first. */\nfunction flatten(categories: Category[]): Category[] {\n return categories.flatMap((c) => [c, ...flatten(c.sub_categories ?? [])]);\n}\n\nasync function products(query: string): Promise<DevLookupItem[]> {\n const { items } = await product.list({\n source: query ? 'search' : 'latest',\n ...(query ? { keyword: query } : {}),\n perPage: PER_PAGE,\n });\n // List responses send the id as a numeric string; the block reads a number. Use it for both.\n return items.map((p) => ({\n id: Number(p.id),\n name: p.name,\n image: p.image?.url,\n url: p.url,\n data: { id: Number(p.id), name: p.name, url: p.url, image: p.image?.url ?? null },\n }));\n}\n\nasync function categories(query: string): Promise<DevLookupItem[]> {\n return flatten(await category.list())\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image ?? undefined,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url, image: c.image ?? null, icon: c.icon ?? null },\n }));\n}\n\nasync function brands(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n (page) => brand.list(page),\n (b) => matches(b.name, query)\n );\n return found.map((b) => ({\n id: b.id,\n name: b.name,\n image: b.logo,\n url: b.url,\n data: { id: b.id, name: b.name, url: b.url, logo: b.logo, banner: b.banner ?? null },\n }));\n}\n\nasync function blogArticles(query: string): Promise<DevLookupItem[]> {\n const found = await collect(\n async (_page, cursor) => {\n const { data, cursor: pages } = await blog.articles.list(cursor ? { cursor } : undefined);\n return { items: data, next: pages?.next ?? null };\n },\n (a) => matches(a.name, query)\n );\n return found.map((a) => ({\n id: a.id,\n name: a.name,\n image: a.image,\n url: a.url,\n data: { id: a.id, name: a.name, url: a.url },\n }));\n}\n\nasync function blogCategories(query: string): Promise<DevLookupItem[]> {\n const { categories: list } = await blog.get();\n return list\n .filter((c) => matches(c.name, query))\n .slice(0, PER_PAGE)\n .map((c) => ({\n id: c.id,\n name: c.name,\n url: c.url,\n data: { id: c.id, name: c.name, url: c.url },\n }));\n}\n\nconst LOOKUPS: Record<DevLookupSource, (query: string) => Promise<DevLookupItem[]>> = {\n products,\n categories,\n brands,\n blog_articles: blogArticles,\n blog_categories: blogCategories,\n};\n\nexport function lookupInStore(source: DevLookupSource, query: string): Promise<DevLookupItem[]> {\n const lookup = LOOKUPS[source];\n if (!lookup) return Promise.reject(new Error(`no lookup for ${source}`));\n return lookup(query.trim());\n}\n"]}
package/dist/tanstack.js CHANGED
@@ -1,25 +1,25 @@
1
- export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-LIQHWHYV.js';
2
- import { requestHostOf } from './chunk-OOQTZ7N7.js';
3
- export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-OOQTZ7N7.js';
1
+ export { tanstackDocumentAdapter as attrs, createRouter, createTwilightRootRoute, useTanstackDocumentAttrs as useAttrs } from './chunk-L75KAYY5.js';
2
+ import { requestHostOf } from './chunk-6VBXPDXM.js';
3
+ export { TanStackLinkAdapter, TanStackNavigationProvider, createTanStackLinkAdapter } from './chunk-6VBXPDXM.js';
4
4
  import './chunk-Z4Y55HWX.js';
5
5
  export { tanstackHeadAdapter as head, withHead } from './chunk-EHTLXK5F.js';
6
6
  import { CRITICAL_STYLE_HREF } from './chunk-4FJGZQD3.js';
7
- import './chunk-6GDNC6DS.js';
8
- import { readNativeAppHeaders } from './chunk-HAS46CRI.js';
9
- import './chunk-M6Z7KIDX.js';
10
- import './chunk-CGABIBZZ.js';
7
+ import './chunk-ZWOD67SV.js';
8
+ import { readNativeAppHeaders } from './chunk-OYPE6432.js';
9
+ import './chunk-6I2J6V3S.js';
10
+ import './chunk-RPRZYRPX.js';
11
11
  import { rootHead, maintenanceEvidence, MAINTENANCE_EVIDENCE_HEADER, maintenanceEvidenceHeader } from './chunk-KQEBYXYB.js';
12
12
  import './chunk-JYV25VNZ.js';
13
- import './chunk-GFOAMXSO.js';
13
+ import './chunk-GJFWNFMU.js';
14
14
  import './chunk-5FJFN3IW.js';
15
15
  import './chunk-GD26FI4J.js';
16
16
  import './chunk-OM2GRPDH.js';
17
- import './chunk-HZIQK63A.js';
17
+ import './chunk-QPKK4LPK.js';
18
18
  import './chunk-OUW6WESU.js';
19
19
  import './chunk-JWXJPJBO.js';
20
20
  export { mergeDocumentDescriptors as mergeAttrs } from './chunk-CW625T2E.js';
21
- import './chunk-5GCOUJ7T.js';
22
- import './chunk-S7QZUBXM.js';
21
+ import './chunk-QRFYOEZY.js';
22
+ import './chunk-OQTBHL5T.js';
23
23
  import './chunk-Z5M4YYWT.js';
24
24
  import './chunk-TYNZ5B2B.js';
25
25
  import './chunk-BYMOPN2S.js';
@@ -1,6 +1,6 @@
1
1
  export { stripUnsafeHtml } from '../chunk-RUHSV4Z6.js';
2
2
  export { formatSallaPlural } from '../chunk-BT6HEEAP.js';
3
- export { dispatchRouteChanged } from '../chunk-6GDNC6DS.js';
3
+ export { dispatchRouteChanged } from '../chunk-ZWOD67SV.js';
4
4
  export { sortOptions } from '../chunk-3LZJXKVO.js';
5
5
  export { color } from '../chunk-VVZNW5CB.js';
6
6
  export { applyAppScopeMocks, registerThemeHookSlots } from '../chunk-5FJFN3IW.js';
@@ -8,7 +8,7 @@ export { mergeHead, resolveHead, setHeadAdapter } from '../chunk-GD26FI4J.js';
8
8
  export { buildBaseHead, buildHreflangAlternates, localeToOgLocale } from '../chunk-OM2GRPDH.js';
9
9
  export { asset, cdn, isPlaceholder } from '../chunk-ZCH7W7DZ.js';
10
10
  export { mergeDocumentDescriptors, mergeElementAttrs, normalizeClasses, syncAttrsToElement, toReactProps } from '../chunk-CW625T2E.js';
11
- import '../chunk-S7QZUBXM.js';
11
+ import '../chunk-OQTBHL5T.js';
12
12
  import '../chunk-Z5M4YYWT.js';
13
13
  export { getSallaSDK, getStoreIdentifier, onSallaEvent, whenSallaLoaded, whenSallaReady } from '../chunk-GYXUYHKO.js';
14
14
  export { AUTH_TOKEN_COOKIE_NAME, clearAuthTokenCookie, extractTokenFromCookies } from '../chunk-FHU2MXZA.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salla.sa/twilight-theme-engine",
3
- "version": "1.0.128",
3
+ "version": "1.0.129",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { isEditorFrame } from '../../dev/schema-types';
9
+ import type { Theme } from '../../types';
9
10
 
10
11
  /** Where the theme editor runs. Messages go to the one that framed the page, never to `*`. */
11
12
  export const EDITOR_ORIGINS = [
@@ -92,6 +93,15 @@ export function editorFrame(): EditorFrame | null {
92
93
  return origin ? { origin, dev: false } : null;
93
94
  }
94
95
 
96
+ /**
97
+ * The theme as the editor's preview shows it: a sticky header would pin over the
98
+ * blocks scrolled under it and cover their action bar, so the header scrolls away.
99
+ */
100
+ export function previewTheme(theme: Theme): Theme {
101
+ if (theme.settings?.header_is_sticky === false) return theme;
102
+ return { ...theme, settings: { ...theme.settings, header_is_sticky: false } };
103
+ }
104
+
95
105
  export function postToEditor(
96
106
  origin: string,
97
107
  action: LiveEditorMessage | typeof FRAME_LOADED_ACTION,
@@ -1,14 +0,0 @@
1
- import { lazy } from 'react';
2
-
3
- // src/components/cart/lazy.ts
4
- var LazyCartItem = lazy(() => import('./CartItem-M5PC54CM.js').then((m) => ({ default: m.CartItem })));
5
- var LazyCartSummary = lazy(
6
- () => import('./CartSummary-YQI7XI4D.js').then((m) => ({ default: m.CartSummary }))
7
- );
8
- var LazySeoCartWidget = lazy(
9
- () => import('./SeoCartWidget-MHOPTGWV.js').then((m) => ({ default: m.SeoCartWidget }))
10
- );
11
-
12
- export { LazyCartItem, LazyCartSummary, LazySeoCartWidget };
13
- //# sourceMappingURL=chunk-L4FKJ3ZN.js.map
14
- //# sourceMappingURL=chunk-L4FKJ3ZN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/live-editor/frame.ts"],"names":[],"mappings":"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","file":"chunk-MVNWWZWQ.js","sourcesContent":["/**\n * The storefront's side of the merchant theme editor's live preview: the editor\n * (`s.salla.sa/themes/editor`) frames the store, and the store tells it which\n * block, header or footer the merchant acted on, with the same `postMessage`\n * protocol the twig themes' `live-themes-editor.js` speaks.\n */\n\nimport { isEditorFrame } from '../../dev/schema-types';\n\n/** Where the theme editor runs. Messages go to the one that framed the page, never to `*`. */\nexport const EDITOR_ORIGINS = [\n 'https://s.salla.sa',\n 'https://salla.design',\n 'https://demostore.salla.sa',\n] as const;\n\n/** Sent once the page has loaded; the editor's preview health check waits for it. */\nexport const FRAME_LOADED_ACTION = 'design::iframe.loaded';\n\nexport type BlockAction = 'edit' | 'hide' | 'moveup' | 'movedown' | 'duplicate' | 'add' | 'delete';\n\nexport type LiveEditorMessage =\n `preview::${BlockAction}.component` | 'preview::edit.header' | 'preview::edit.footer';\n\n/** A home block, rendered by `HomeComponentRenderer`, carries its id here. */\nexport const BLOCK_ATTRIBUTE = 'data-live-block';\n\n/** A theme can name its header or footer for the editor: `data-live-editor=\"header\"`. */\nexport const AREA_ATTRIBUTE = 'data-live-editor';\n\n/** Header and footer of themes that don't mark theirs: the engine's own, and Raed's. */\nexport const AREA_FALLBACKS = {\n header: 'header.store-header, header.site-header',\n footer: '.store-footer',\n} as const;\n\nexport type Area = keyof typeof AREA_FALLBACKS;\n\n/** The origin of the page that frames this one, or `null` at the top or when unknown. */\nfunction parentOrigin(): string | null {\n if (window.self === window.top) return null;\n // Chromium and Safari name it directly; Firefox only through the referrer.\n const ancestor = window.location.ancestorOrigins?.[0];\n if (ancestor) return ancestor;\n try {\n return document.referrer ? new URL(document.referrer).origin : null;\n } catch {\n return null;\n }\n}\n\n/**\n * On a dev server, a page on another localhost port (an editor run locally, or\n * a test harness) can frame the store too. Not its own origin: that is the\n * engine's dev editor, which has its own controls.\n */\nfunction isLocalEditor(origin: string): boolean {\n if (origin === window.location.origin) return false;\n try {\n const { protocol, hostname } = new URL(origin);\n return protocol === 'http:' && (hostname === 'localhost' || hostname === '127.0.0.1');\n } catch {\n return false;\n }\n}\n\n/** The theme editor's origin when it frames this page, otherwise `null`. Browser only. */\nexport function editorOrigin(): string | null {\n if (typeof window === 'undefined') return null;\n let origin: string | null;\n try {\n origin = parentOrigin();\n } catch {\n return null;\n }\n if (!origin) return null;\n if ((EDITOR_ORIGINS as readonly string[]).includes(origin)) return origin;\n return import.meta.env.DEV && isLocalEditor(origin) ? origin : null;\n}\n\nexport interface EditorFrame {\n origin: string;\n /** The engine's own dev editor (`/__twilight/editor`): edits apply live, and blocks can't be hidden. */\n dev: boolean;\n}\n\n/** The editor framing this page, the merchant's or (on a dev server) the engine's own. Browser only. */\nexport function editorFrame(): EditorFrame | null {\n if (typeof window === 'undefined') return null;\n if (import.meta.env.DEV && isEditorFrame()) return { origin: window.location.origin, dev: true };\n const origin = editorOrigin();\n return origin ? { origin, dev: false } : null;\n}\n\nexport function postToEditor(\n origin: string,\n action: LiveEditorMessage | typeof FRAME_LOADED_ACTION,\n data?: { id: string }\n): void {\n window.parent.postMessage({ action, data, is_salla: true }, origin);\n}\n\n/** The header or footer `el` stands for, if any. One inside a dialog (a sheet's copy) is not it. */\nexport function areaOf(el: Element): Area | null {\n if (el.closest('[role=\"dialog\"]')) return null;\n const marked = el.getAttribute(AREA_ATTRIBUTE);\n if (marked === 'header' || marked === 'footer') return marked;\n if (el.matches(AREA_FALLBACKS.header)) return 'header';\n if (el.matches(AREA_FALLBACKS.footer)) return 'footer';\n return null;\n}\n\n/** What the editor can act on: a block with an id, the header, or the footer. */\nexport const TARGET_SELECTOR = [\n `[${BLOCK_ATTRIBUTE}]`,\n `[${AREA_ATTRIBUTE}=\"header\"]`,\n `[${AREA_ATTRIBUTE}=\"footer\"]`,\n AREA_FALLBACKS.header,\n AREA_FALLBACKS.footer,\n].join(', ');\n\n/** The block, header or footer under `node`, nearest first. */\nexport function targetOf(node: EventTarget | null): HTMLElement | null {\n let el = node instanceof Element ? node.closest<HTMLElement>(TARGET_SELECTOR) : null;\n while (el) {\n if (el.hasAttribute(BLOCK_ATTRIBUTE) || areaOf(el)) return el;\n el = el.parentElement?.closest<HTMLElement>(TARGET_SELECTOR) ?? null;\n }\n return null;\n}\n"]}