@salla.sa/twilight-theme-engine 1.0.102 → 1.0.103

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 (142) hide show
  1. package/dist/{AddToCartForm-PGX4TKK5.js → AddToCartForm-O7UZDX6G.js} +3 -3
  2. package/dist/{AddToCartForm-PGX4TKK5.js.map → AddToCartForm-O7UZDX6G.js.map} +1 -1
  3. package/dist/{BlogAuthorPage-SLTGPBTO.js → BlogAuthorPage-JLU2JWPT.js} +9 -9
  4. package/dist/{BlogAuthorPage-SLTGPBTO.js.map → BlogAuthorPage-JLU2JWPT.js.map} +1 -1
  5. package/dist/{BlogCategoryPage-BSNM6O7D.js → BlogCategoryPage-FTZPLNTL.js} +9 -9
  6. package/dist/{BlogCategoryPage-BSNM6O7D.js.map → BlogCategoryPage-FTZPLNTL.js.map} +1 -1
  7. package/dist/{BlogPage-SFMPPVK6.js → BlogPage-JBVPGHR5.js} +8 -8
  8. package/dist/{BlogPage-SFMPPVK6.js.map → BlogPage-JBVPGHR5.js.map} +1 -1
  9. package/dist/{BlogSinglePage-HXPZJMOO.js → BlogSinglePage-V3KQ5HIW.js} +8 -8
  10. package/dist/{BlogSinglePage-HXPZJMOO.js.map → BlogSinglePage-V3KQ5HIW.js.map} +1 -1
  11. package/dist/{BlogTagPage-O23AU64T.js → BlogTagPage-NTYO6TB4.js} +9 -9
  12. package/dist/{BlogTagPage-O23AU64T.js.map → BlogTagPage-NTYO6TB4.js.map} +1 -1
  13. package/dist/{BrandsPage-NNEO7WBD.js → BrandsPage-5OSSOWDP.js} +8 -8
  14. package/dist/{BrandsPage-NNEO7WBD.js.map → BrandsPage-5OSSOWDP.js.map} +1 -1
  15. package/dist/{Breadcrumb-ZOGOEHIT.js → Breadcrumb-GJI3N76F.js} +8 -8
  16. package/dist/{Breadcrumb-ZOGOEHIT.js.map → Breadcrumb-GJI3N76F.js.map} +1 -1
  17. package/dist/{CartItem-AIVN7POE.js → CartItem-KO34MYXT.js} +8 -8
  18. package/dist/{CartItem-AIVN7POE.js.map → CartItem-KO34MYXT.js.map} +1 -1
  19. package/dist/{CartSummary-II45KD76.js → CartSummary-NPFAJI7C.js} +8 -8
  20. package/dist/{CartSummary-II45KD76.js.map → CartSummary-NPFAJI7C.js.map} +1 -1
  21. package/dist/{Copyright-CCX4G6HS.js → Copyright-VEJV2YTR.js} +3 -3
  22. package/dist/{Copyright-CCX4G6HS.js.map → Copyright-VEJV2YTR.js.map} +1 -1
  23. package/dist/{CustomerLayout-U4MXMKJE.js → CustomerLayout-L374ZRWY.js} +8 -8
  24. package/dist/{CustomerLayout-U4MXMKJE.js.map → CustomerLayout-L374ZRWY.js.map} +1 -1
  25. package/dist/{Footer-INYXRJQ4.js → Footer-D4YSIM25.js} +4 -4
  26. package/dist/{Footer-INYXRJQ4.js.map → Footer-D4YSIM25.js.map} +1 -1
  27. package/dist/{Header-ICAHI5OA.js → Header-CXJ3TFHO.js} +4 -4
  28. package/dist/{Header-ICAHI5OA.js.map → Header-CXJ3TFHO.js.map} +1 -1
  29. package/dist/{LoyaltyPage-PBT32LV7.js → LoyaltyPage-BTKKAZYT.js} +8 -8
  30. package/dist/{LoyaltyPage-PBT32LV7.js.map → LoyaltyPage-BTKKAZYT.js.map} +1 -1
  31. package/dist/{LoyaltyPointsPage-6LJF7ZFO.js → LoyaltyPointsPage-CBVSWLR6.js} +3 -3
  32. package/dist/{LoyaltyPointsPage-6LJF7ZFO.js.map → LoyaltyPointsPage-CBVSWLR6.js.map} +1 -1
  33. package/dist/{MainMenu-6AQECV5E.js → MainMenu-KCVTEZRG.js} +3 -3
  34. package/dist/{MainMenu-6AQECV5E.js.map → MainMenu-KCVTEZRG.js.map} +1 -1
  35. package/dist/{MasterLayout-RPVSZOED.js → MasterLayout-K6IGPKCD.js} +8 -8
  36. package/dist/{MasterLayout-RPVSZOED.js.map → MasterLayout-K6IGPKCD.js.map} +1 -1
  37. package/dist/{MobileMenu-JGCNAGQN.js → MobileMenu-KDKARTM5.js} +8 -8
  38. package/dist/{MobileMenu-JGCNAGQN.js.map → MobileMenu-KDKARTM5.js.map} +1 -1
  39. package/dist/{NotificationsPage-RTIXES2K.js → NotificationsPage-A3NZEO52.js} +8 -8
  40. package/dist/{NotificationsPage-RTIXES2K.js.map → NotificationsPage-A3NZEO52.js.map} +1 -1
  41. package/dist/{OrderSinglePage-TAVOOUEP.js → OrderSinglePage-APA3LCWT.js} +8 -8
  42. package/dist/{OrderSinglePage-TAVOOUEP.js.map → OrderSinglePage-APA3LCWT.js.map} +1 -1
  43. package/dist/{OrdersPage-AYYJBHOJ.js → OrdersPage-N4S2SKXD.js} +8 -8
  44. package/dist/{OrdersPage-AYYJBHOJ.js.map → OrdersPage-N4S2SKXD.js.map} +1 -1
  45. package/dist/{PageSingle-4ASICFTJ.js → PageSingle-ED3IQQLS.js} +3 -3
  46. package/dist/{PageSingle-4ASICFTJ.js.map → PageSingle-ED3IQQLS.js.map} +1 -1
  47. package/dist/{ProductDetails-ZNBMM557.js → ProductDetails-MN3GXUXK.js} +3 -3
  48. package/dist/{ProductDetails-ZNBMM557.js.map → ProductDetails-MN3GXUXK.js.map} +1 -1
  49. package/dist/{ProfilePage-BBXMTKL2.js → ProfilePage-QQ2GN7RO.js} +8 -8
  50. package/dist/{ProfilePage-BBXMTKL2.js.map → ProfilePage-QQ2GN7RO.js.map} +1 -1
  51. package/dist/{ReviewsPage-4BSQEFPW.js → ReviewsPage-YHO2CNZP.js} +3 -3
  52. package/dist/{ReviewsPage-4BSQEFPW.js.map → ReviewsPage-YHO2CNZP.js.map} +1 -1
  53. package/dist/{SeoCartWidget-THR2WPLF.js → SeoCartWidget-DWJT2WXI.js} +8 -8
  54. package/dist/{SeoCartWidget-THR2WPLF.js.map → SeoCartWidget-DWJT2WXI.js.map} +1 -1
  55. package/dist/{SettingsPage-MUJ4767L.js → SettingsPage-BRCNPSRN.js} +8 -8
  56. package/dist/{SettingsPage-MUJ4767L.js.map → SettingsPage-BRCNPSRN.js.map} +1 -1
  57. package/dist/{StoreClosedNotification-3SVCHYWS.js → StoreClosedNotification-2CIG5LX6.js} +9 -9
  58. package/dist/{StoreClosedNotification-3SVCHYWS.js.map → StoreClosedNotification-2CIG5LX6.js.map} +1 -1
  59. package/dist/{TestimonialsPage-JKNNN7PT.js → TestimonialsPage-DDLTHBMM.js} +3 -3
  60. package/dist/{TestimonialsPage-JKNNN7PT.js.map → TestimonialsPage-DDLTHBMM.js.map} +1 -1
  61. package/dist/{ThankYouPage-6NLWMBY4.js → ThankYouPage-YN6PC4GT.js} +8 -8
  62. package/dist/{ThankYouPage-6NLWMBY4.js.map → ThankYouPage-YN6PC4GT.js.map} +1 -1
  63. package/dist/{WalletPage-B6OEJKBR.js → WalletPage-YVJYIL52.js} +8 -8
  64. package/dist/{WalletPage-B6OEJKBR.js.map → WalletPage-YVJYIL52.js.map} +1 -1
  65. package/dist/{WishlistPage-7BYBM24I.js → WishlistPage-PD3SHN27.js} +8 -8
  66. package/dist/{WishlistPage-7BYBM24I.js.map → WishlistPage-PD3SHN27.js.map} +1 -1
  67. package/dist/{chunk-LMJUQ6FW.js → chunk-44FMRCHW.js} +3 -3
  68. package/dist/{chunk-LMJUQ6FW.js.map → chunk-44FMRCHW.js.map} +1 -1
  69. package/dist/{chunk-OK6AE7EJ.js → chunk-46EXP3AL.js} +6 -6
  70. package/dist/{chunk-OK6AE7EJ.js.map → chunk-46EXP3AL.js.map} +1 -1
  71. package/dist/{chunk-PCRXL4RU.js → chunk-7RL4DG54.js} +3 -3
  72. package/dist/{chunk-PCRXL4RU.js.map → chunk-7RL4DG54.js.map} +1 -1
  73. package/dist/{chunk-ZE4EZOXQ.js → chunk-AVPU5C5V.js} +4 -4
  74. package/dist/{chunk-ZE4EZOXQ.js.map → chunk-AVPU5C5V.js.map} +1 -1
  75. package/dist/{chunk-UWW4I3L3.js → chunk-BXOQ663B.js} +4 -4
  76. package/dist/{chunk-UWW4I3L3.js.map → chunk-BXOQ663B.js.map} +1 -1
  77. package/dist/chunk-CXONF653.js +14 -0
  78. package/dist/{chunk-JJSQWN5M.js.map → chunk-CXONF653.js.map} +1 -1
  79. package/dist/{chunk-6EBOQCET.js → chunk-GLWSJZJZ.js} +4 -4
  80. package/dist/{chunk-6EBOQCET.js.map → chunk-GLWSJZJZ.js.map} +1 -1
  81. package/dist/{chunk-VYWEI635.js → chunk-IYD3EN22.js} +5 -5
  82. package/dist/{chunk-VYWEI635.js.map → chunk-IYD3EN22.js.map} +1 -1
  83. package/dist/{chunk-W5CR5IJW.js → chunk-L4AWMQPQ.js} +4 -4
  84. package/dist/{chunk-W5CR5IJW.js.map → chunk-L4AWMQPQ.js.map} +1 -1
  85. package/dist/{chunk-N45X7D55.js → chunk-OXMUPNMH.js} +2 -2
  86. package/dist/chunk-OXMUPNMH.js.map +1 -0
  87. package/dist/{chunk-NFLDOZOM.js → chunk-RPVHCIR4.js} +3 -3
  88. package/dist/{chunk-NFLDOZOM.js.map → chunk-RPVHCIR4.js.map} +1 -1
  89. package/dist/{chunk-B3EOUBP3.js → chunk-TMN53ONR.js} +7 -7
  90. package/dist/{chunk-B3EOUBP3.js.map → chunk-TMN53ONR.js.map} +1 -1
  91. package/dist/{chunk-ICYJD26Y.js → chunk-U73QOIGZ.js} +4 -4
  92. package/dist/{chunk-ICYJD26Y.js.map → chunk-U73QOIGZ.js.map} +1 -1
  93. package/dist/{chunk-VVZLYCKO.js → chunk-UIXEKYTM.js} +8 -8
  94. package/dist/{chunk-VVZLYCKO.js.map → chunk-UIXEKYTM.js.map} +1 -1
  95. package/dist/{chunk-RXZ5ZZ3I.js → chunk-V7EPED4G.js} +3 -3
  96. package/dist/{chunk-RXZ5ZZ3I.js.map → chunk-V7EPED4G.js.map} +1 -1
  97. package/dist/components/cart/index.js +1 -1
  98. package/dist/components/common/index.js +1 -1
  99. package/dist/components/drawer/index.js +6 -6
  100. package/dist/components/home/index.js +8 -8
  101. package/dist/components/layout/index.js +1 -1
  102. package/dist/components/product/index.js +7 -7
  103. package/dist/components/store/index.js +8 -8
  104. package/dist/dev/editor/index.js +2 -2
  105. package/dist/dev/editor/index.js.map +1 -1
  106. package/dist/dev/editor/pickers.d.ts +1 -1
  107. package/dist/dev/editor/pickers.d.ts.map +1 -1
  108. package/dist/dev/index.js +2 -2
  109. package/dist/dev/schema-types.d.ts +1 -1
  110. package/dist/dev/schema-types.d.ts.map +1 -1
  111. package/dist/{document-class-YIOOJTJG.js → document-class-JQ7ZZJAT.js} +3 -3
  112. package/dist/{document-class-YIOOJTJG.js.map → document-class-JQ7ZZJAT.js.map} +1 -1
  113. package/dist/hooks/index.js +6 -6
  114. package/dist/hooks/useGtm.js +6 -6
  115. package/dist/hooks/useMoney.js +6 -6
  116. package/dist/hooks/useStore.js +6 -6
  117. package/dist/index.js +6 -6
  118. package/dist/{not-found-3XVHUWBP.js → not-found-MTU2BM73.js} +8 -8
  119. package/dist/{not-found-3XVHUWBP.js.map → not-found-MTU2BM73.js.map} +1 -1
  120. package/dist/providers/index.js +6 -6
  121. package/dist/routes/account/orders.js +1 -1
  122. package/dist/routes/account.js +6 -6
  123. package/dist/routes/blog.js +5 -5
  124. package/dist/routes/brands.js +1 -1
  125. package/dist/routes/cart.js +10 -10
  126. package/dist/routes/home.js +9 -9
  127. package/dist/routes/loyalty.js +2 -2
  128. package/dist/routes/page.js +1 -1
  129. package/dist/routes/product-listing.js +8 -8
  130. package/dist/routes/product.js +8 -8
  131. package/dist/routes/testimonials.js +2 -2
  132. package/dist/routes/thank-you.js +1 -1
  133. package/dist/skeleton.js +9 -9
  134. package/dist/{store-lookup-OZTXCMWE.js → store-lookup-C4DMFSBT.js} +3 -3
  135. package/dist/{store-lookup-OZTXCMWE.js.map → store-lookup-C4DMFSBT.js.map} +1 -1
  136. package/dist/tanstack.js +1 -1
  137. package/dist/vite/index.js +8 -2
  138. package/dist/vite/index.js.map +1 -1
  139. package/dist/vite/plugins/twilight-schema.d.ts.map +1 -1
  140. package/package.json +1 -1
  141. package/dist/chunk-JJSQWN5M.js +0 -14
  142. package/dist/chunk-N45X7D55.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"twilight-schema.d.ts","sourceRoot":"","sources":["../../../src/vite/plugins/twilight-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,SAAS,EAIV,MAAM,wBAAwB,CAAC;AAyThC,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAkD3D"}
1
+ {"version":3,"file":"twilight-schema.d.ts","sourceRoot":"","sources":["../../../src/vite/plugins/twilight-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,SAAS,EAIV,MAAM,wBAAwB,CAAC;AA+ThC,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,SAAS,CAkD3D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salla.sa/twilight-theme-engine",
3
- "version": "1.0.102",
3
+ "version": "1.0.103",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -1,14 +0,0 @@
1
- import { lazy } from 'react';
2
-
3
- // src/components/cart/lazy.ts
4
- var LazyCartItem = lazy(() => import('./CartItem-AIVN7POE.js').then((m) => ({ default: m.CartItem })));
5
- var LazyCartSummary = lazy(
6
- () => import('./CartSummary-II45KD76.js').then((m) => ({ default: m.CartSummary }))
7
- );
8
- var LazySeoCartWidget = lazy(
9
- () => import('./SeoCartWidget-THR2WPLF.js').then((m) => ({ default: m.SeoCartWidget }))
10
- );
11
-
12
- export { LazyCartItem, LazyCartSummary, LazySeoCartWidget };
13
- //# sourceMappingURL=chunk-JJSQWN5M.js.map
14
- //# sourceMappingURL=chunk-JJSQWN5M.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/dev/schema-types.ts"],"names":[],"mappings":";AAyBO,IAAM,qBAAA,GAAwB;AAO9B,IAAM,oBAAA,GAAuB;AA6DpC,SAAS,gBAAgB,KAAA,EAAyB;AAChD,EAAA,MAAM,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA;AAChD,EAAA,OAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,GAAY,MAA8B,KAAA,GAAQ,KAAA;AACrF;AAOO,SAAS,aAAA,CACd,OACA,OAAA,EACS;AACT,EAAA,OAAA,CAAQ,KAAA,CAAM,UAAA,IAAc,EAAC,EAAG,KAAA,CAAM,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAM,KAAM;AAClE,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,eAAA,CAAgB,OAAA,CAAQ,EAAE,CAAC,CAAC,CAAA,KAAM,MAAA,CAAO,eAAA,CAAgB,KAAK,CAAC,CAAA;AACpF,IAAA,IAAI,SAAA,KAAc,GAAA,IAAO,SAAA,KAAc,IAAA,EAAM,OAAO,KAAA;AACpD,IAAA,IAAI,SAAA,KAAc,IAAA,EAAM,OAAO,CAAC,KAAA;AAChC,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;AA+DO,IAAM,eAAA,GAAkB;AAGxB,IAAM,qBAAA,GAAwB;AAG9B,SAAS,aAAA,GAAyB;AACvC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,KAAA;AAC1C,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,YAAA,EAAc,YAAA,CAAa,qBAAqB,CAAA,IAAK,KAAA;AAAA,EACrE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,IAAM,oBAAA,GAAuB;AAO7B,IAAM,0BAAA,GAA6B,GAAG,oBAAoB,CAAA,MAAA;AAC1D,IAAM,2BAAA,GAA8B,IAAI,IAAA,GAAO;AAG/C,IAAM,iBAAA,GAAoB;AAG1B,IAAM,kBAAA,GAAqB;AAE3B,IAAM,mBAAA,GAAuC,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,EAAC,EAAG,QAAQ,IAAA;AAE5F,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,sBAAsB,GAAA,EAAsC;AAC1E,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,MAAM,SAAmC,KAAA,CAAM,OAAA,CAAQ,IAAI,MAAM,CAAA,GAC7D,IAAI,MAAA,CAAO,OAAA;AAAA,IAAQ,CAAC,KAAA,EAAgB,KAAA,KAClC,QAAA,CAAS,KAAK,CAAA,IAAK,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,IAAA,GACvD;AAAA,MACE;AAAA,QACE,EAAA,EAAI,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,IAAY,MAAM,EAAA,GAAK,KAAA,CAAM,EAAA,GAAK,CAAA,MAAA,EAAS,KAAK,CAAA,CAAA;AAAA,QACxE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,EAAE,CAAA;AAAA,QACtC,QAAQ,QAAA,CAAS,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA,CAAM,SAAS;AAAC;AACnD,QAEF;AAAC,GACP,GACA,IAAA;AACJ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAI,OAAA,KAAY,IAAA;AAAA,IACzB,UAAU,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA,GAAI,GAAA,CAAI,WAAW,EAAC;AAAA,IACnD;AAAA,GACF;AACF;AAGO,IAAM,gBAAA,GAA8B;AAAA,EACzC,UAAU,EAAC;AAAA,EACX,YAAY,EAAC;AAAA,EACb,kBAAkB,EAAC;AAAA,EACnB,mBAAmB,EAAC;AAAA,EACpB,eAAe,EAAC;AAAA,EAChB,OAAA,EAAS;AACX","file":"chunk-N45X7D55.js","sourcesContent":["/**\n * Shared, browser-safe types for the dev-mode twilight.json settings/components\n * editor. Produced (in Node) by `buildTwilightSchema` and consumed (in the\n * browser) by the dev store and `DevSettingsWidget`. Kept free of any Node or\n * React imports so both sides can share it.\n */\n\n/** How a single setting/field is rendered in the dev editor. */\nexport type DevFieldKind =\n | 'toggle'\n | 'select'\n | 'text'\n | 'textarea'\n | 'number'\n | 'image'\n | 'collection'\n | 'entities'\n | 'link'\n | 'readonly';\n\n/** What a picker can look up in the store (or fall back to samples for). */\nexport type DevLookupSource =\n 'products' | 'categories' | 'brands' | 'blog_articles' | 'blog_categories';\n\n/** How long the editor waits for its frame to answer a store lookup. */\nexport const DEV_LOOKUP_TIMEOUT_MS = 8000;\n\n/**\n * How long a lookup may keep reading further pages: well inside\n * {@link DEV_LOOKUP_TIMEOUT_MS}, so the frame answers with what it has found\n * before the editor stops waiting, and stops fetching once it has answered.\n */\nexport const DEV_LOOKUP_BUDGET_MS = 5000;\n\n/** One thing a picker found. `data` is what gets saved, shaped like the API sends it to a block. */\nexport interface DevLookupItem {\n id: string | number;\n name: string;\n image?: string;\n url?: string;\n data: Record<string, unknown>;\n}\n\nexport interface DevSchemaOption {\n label: string;\n value: string;\n}\n\n/** One twilight.json `conditions` entry: the field shows only while `id`'s value passes. */\nexport interface DevFieldCondition {\n /** The other field's id (inside a collection, without the `<collection>.` prefix). */\n id: string;\n /** `=` (also `==`) or `!=`. Any other operator is ignored, so it never hides a field. */\n operation: string;\n value: unknown;\n}\n\nexport interface DevSchemaField {\n /**\n * twilight.json entry `id` — also the key used for overrides. Inside a\n * collection, the `<collection>.` prefix is dropped (`slides.image` → `image`),\n * matching the rows the API hands a block.\n */\n id: string;\n label: string;\n kind: DevFieldKind;\n /** Default value taken from twilight.json (`null` for readonly fields; rows for a collection). */\n default: unknown;\n /** Present for `select`. */\n options?: DevSchemaOption[];\n /** For `readonly`: why it can't be edited yet (e.g. \"collection\", \"remote\"). */\n note?: string;\n /** twilight.json `description`, shown under the field. */\n description?: string;\n placeholder?: string;\n /** `number`: `minimum`/`maximum`. `collection`: `minLength`/`maxLength` (item count). */\n min?: number;\n max?: number;\n /** `collection`: the fields of one item. */\n fields?: DevSchemaField[];\n /** `collection`: what one item is called (`item_label`), e.g. \"Slide\". */\n itemLabel?: string;\n /** `entities`: which store list it picks from. */\n source?: Extract<DevLookupSource, 'products' | 'categories' | 'brands'>;\n /** `entities`: more than one (`multichoice`). */\n multiple?: boolean;\n /** `link`: the kinds of link it offers (`sources`), e.g. product, category, external. */\n linkSources?: DevSchemaOption[];\n /** twilight.json `conditions`: the field shows only while every one holds. */\n conditions?: DevFieldCondition[];\n}\n\n/** A select may hold its choice as `[{ value }]`; compare on the bare value. */\nfunction conditionScalar(value: unknown): unknown {\n const first = Array.isArray(value) ? value[0] : value;\n return first && typeof first === 'object' ? (first as { value?: unknown }).value : first;\n}\n\n/**\n * Whether a field should show: true when it has no `conditions`, or when each\n * one holds against `valueOf` (the current value of the field it names, its\n * default included). Values compare as strings, so `true` matches `\"true\"`.\n */\nexport function conditionsMet(\n field: Pick<DevSchemaField, 'conditions'>,\n valueOf: (id: string) => unknown\n): boolean {\n return (field.conditions ?? []).every(({ id, operation, value }) => {\n const equal = String(conditionScalar(valueOf(id))) === String(conditionScalar(value));\n if (operation === '=' || operation === '==') return equal;\n if (operation === '!=') return !equal;\n return true;\n });\n}\n\nexport interface DevSchemaComponent {\n /** e.g. \"home.enhanced-slider\" — the natural component key. */\n path: string;\n /** twilight.json catalog id, sent as a block's `key` like the API does. */\n key?: string;\n title: string;\n /** `title` per language when twilight.json gives `{ ar, en }`. */\n titles?: Record<string, string>;\n /** twilight.json `image`: a preview of the component, shown when adding one. */\n image?: string;\n /** twilight.json `icon`: a Salla icon class, e.g. `sicon-image`. */\n icon?: string;\n fields: DevSchemaField[];\n}\n\nexport interface DevSchema {\n /** twilight.json `name`, per language (a plain string is filed under both). */\n themeName?: Record<string, string>;\n /** Editable + readonly theme settings, in declaration order. */\n settings: DevSchemaField[];\n /** Store components with their fields. */\n components: DevSchemaComponent[];\n /** `{ [settingId]: default }` for every non-readonly setting. */\n settingsDefaults: Record<string, unknown>;\n /** `{ [componentPath]: { [fieldId]: default } }`. */\n componentDefaults: Record<string, Record<string, unknown>>;\n /**\n * `{ [componentPath]: data }`: everything a newly added block starts with,\n * readonly fields included, shaped the way the API delivers block data\n * (collection rows lose their `<collection>.` key prefix). Optional so a\n * schema from an older engine build still type-checks.\n */\n blockDefaults?: Record<string, Record<string, unknown>>;\n /** The saved preview state (`twilight.preview.json`), `null` when there is none. */\n preview?: DevPreviewState | null;\n}\n\n/** One home block in a dev-owned layout. */\nexport interface DevPreviewBlock {\n /** Stable id for React keys and edits; unrelated to the API. */\n id: string;\n /** Home loader spelling, without the `home.` prefix (e.g. \"main-links\"). */\n path: string;\n /** The block's data, spread onto `{ path }` when it renders. */\n fields: Record<string, unknown>;\n}\n\n/**\n * Everything the dev editor saves, persisted to `twilight.preview.json` by the\n * dev server so the server render and every tab start from the same values.\n */\nexport interface DevPreviewState {\n /** Master switch: when false the theme uses the real store's values. */\n enabled: boolean;\n /** Sparse `{ [settingId]: value }` overrides for theme settings. */\n settings: Record<string, unknown>;\n /** The home page's blocks, in order. `null` renders the store's own blocks. */\n layout: DevPreviewBlock[] | null;\n}\n\n/** Dev-server page that hosts the theme editor. */\nexport const DEV_EDITOR_PATH = '/__twilight/editor';\n\n/** Marks the iframe the editor frames the storefront in. */\nexport const DEV_EDITOR_FRAME_ATTR = 'data-twilight-editor';\n\n/** True inside the editor's frame, where the storefront hides its own dev button. */\nexport function isEditorFrame(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return window.frameElement?.hasAttribute(DEV_EDITOR_FRAME_ATTR) ?? false;\n } catch {\n return false; // Framed by another origin: not our editor.\n }\n}\n\n/** Dev-server endpoint the editor saves through. */\nexport const DEV_PREVIEW_ENDPOINT = '/__twilight/preview';\n\n/**\n * Where a picked image goes: the dev server keeps it in `twilight-preview-assets/`\n * (gitignored, next to twilight.json) and serves it back from under this path,\n * so the saved state holds a short URL rather than the image itself.\n */\nexport const DEV_PREVIEW_IMAGE_ENDPOINT = `${DEV_PREVIEW_ENDPOINT}/image`;\nexport const DEV_PREVIEW_IMAGE_MAX_BYTES = 5 * 1024 * 1024;\n\n/** Dev-server event that hands a save to the other open tabs. */\nexport const DEV_PREVIEW_EVENT = 'twilight:preview';\n\n/** Where `virtual:twilight/schema` puts the saved state before the app renders. */\nexport const DEV_PREVIEW_GLOBAL = '__twilightDevPreview__';\n\nexport const EMPTY_PREVIEW_STATE: DevPreviewState = { enabled: false, settings: {}, layout: null };\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/**\n * Coerce anything (a hand-edited file, a request body) into a valid state, or\n * `null` when it isn't one at all. Blocks without a path are dropped and\n * missing ids are filled, so a bad entry can't break the home page.\n */\nexport function normalizePreviewState(raw: unknown): DevPreviewState | null {\n if (!isRecord(raw)) return null;\n const layout: DevPreviewBlock[] | null = Array.isArray(raw.layout)\n ? raw.layout.flatMap((entry: unknown, index) =>\n isRecord(entry) && typeof entry.path === 'string' && entry.path\n ? [\n {\n id: typeof entry.id === 'string' && entry.id ? entry.id : `block-${index}`,\n path: entry.path.replace(/^home\\./, ''),\n fields: isRecord(entry.fields) ? entry.fields : {},\n },\n ]\n : []\n )\n : null;\n return {\n enabled: raw.enabled === true,\n settings: isRecord(raw.settings) ? raw.settings : {},\n layout,\n };\n}\n\n/** The shape the vite plugin ships when there is no schema (prod / missing file). */\nexport const EMPTY_DEV_SCHEMA: DevSchema = {\n settings: [],\n components: [],\n settingsDefaults: {},\n componentDefaults: {},\n blockDefaults: {},\n preview: null,\n};\n"]}