@stacksjs/stx 0.2.339 → 0.2.341

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 (181) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-core-imports.js +0 -1
  3. package/dist/builtins/stx-image.js +3 -2
  4. package/dist/builtins/stx-link.js +2 -1
  5. package/dist/caching.d.ts +4 -0
  6. package/dist/caching.js +34 -0
  7. package/dist/{chunk-hrdd26r4.js → chunk-01ggk8k8.js} +1 -1
  8. package/dist/chunk-025z2btp.js +2 -0
  9. package/dist/{chunk-wdq75f5k.js → chunk-0abjpkv7.js} +1 -1
  10. package/dist/{chunk-x4vhn880.js → chunk-0sq5mdrh.js} +1 -1
  11. package/dist/chunk-19fp0z9s.js +2 -0
  12. package/dist/{chunk-d3kjaae0.js → chunk-1gwbw81h.js} +1 -1
  13. package/dist/{chunk-vaggjvsm.js → chunk-1spzqjve.js} +1 -1
  14. package/dist/{chunk-t00ga194.js → chunk-1t3j8a0q.js} +1 -1
  15. package/dist/{chunk-zfz3s2gd.js → chunk-1xwfws06.js} +2 -2
  16. package/dist/{chunk-x48crnwa.js → chunk-23sv24cm.js} +1 -1
  17. package/dist/{chunk-7r79j1hs.js → chunk-25b8z7xa.js} +1 -1
  18. package/dist/{chunk-xhznr05n.js → chunk-25f0s8t1.js} +2 -2
  19. package/dist/chunk-2p68bkza.js +2 -0
  20. package/dist/{chunk-r10fypcd.js → chunk-2swnc8kg.js} +1 -1
  21. package/dist/chunk-3b0mgxbk.js +2 -0
  22. package/dist/{chunk-zm8b6e9n.js → chunk-3tjqjpwb.js} +1 -1
  23. package/dist/{chunk-nvp546bb.js → chunk-48x5bsqv.js} +1 -1
  24. package/dist/{chunk-wdvee4kr.js → chunk-4wpxbkbe.js} +2 -2
  25. package/dist/{chunk-7a21q2q4.js → chunk-5g9vbhbt.js} +1 -1
  26. package/dist/chunk-5grrqaqs.js +2 -0
  27. package/dist/{chunk-c3xmcsvd.js → chunk-5qr420a9.js} +130 -130
  28. package/dist/chunk-6jx4r94x.js +2 -0
  29. package/dist/{chunk-0xgc5t3y.js → chunk-6nvm939g.js} +1 -1
  30. package/dist/{chunk-tr1174hz.js → chunk-6nxq8rcw.js} +1 -1
  31. package/dist/{chunk-7r80apc5.js → chunk-6p6b01kp.js} +1 -1
  32. package/dist/{chunk-xe6zmdfq.js → chunk-74r1zw2h.js} +1 -1
  33. package/dist/{chunk-97ej3abh.js → chunk-8tsr51hj.js} +1 -1
  34. package/dist/chunk-a1rt1fms.js +2 -0
  35. package/dist/{chunk-aved735s.js → chunk-ahpmjg3f.js} +2 -2
  36. package/dist/chunk-akp89n3w.js +2 -0
  37. package/dist/{chunk-b4cabzk9.js → chunk-anf2y2h5.js} +1 -1
  38. package/dist/{chunk-d6yyzpsv.js → chunk-beextc84.js} +53 -20
  39. package/dist/chunk-bqhrryqs.js +2 -0
  40. package/dist/{chunk-799s9mwc.js → chunk-bt8w146r.js} +2 -2
  41. package/dist/{chunk-fa2mg49t.js → chunk-byjy9far.js} +2 -2
  42. package/dist/{chunk-axqfm9b4.js → chunk-c0n802j1.js} +1 -1
  43. package/dist/{chunk-vxt5c5aq.js → chunk-c33y19bn.js} +1 -1
  44. package/dist/{chunk-2gc4cevb.js → chunk-c73pyeak.js} +1 -1
  45. package/dist/{chunk-6av24ywm.js → chunk-cqw3c1xg.js} +1 -1
  46. package/dist/chunk-czvzaa42.js +3 -0
  47. package/dist/{chunk-n6eetz4r.js → chunk-d389vyyz.js} +2 -2
  48. package/dist/{chunk-tvc2xwen.js → chunk-d8cng4x9.js} +1 -1
  49. package/dist/chunk-da0tfpa2.js +2 -0
  50. package/dist/chunk-de2cfcf5.js +2 -0
  51. package/dist/{chunk-rzayq0ht.js → chunk-drs93sry.js} +1 -1
  52. package/dist/{chunk-t8ctvjqe.js → chunk-e0kzyf1g.js} +1 -1
  53. package/dist/{chunk-1q6xc3m2.js → chunk-ebd3z4j9.js} +1 -1
  54. package/dist/chunk-ejj7qbzd.js +2 -0
  55. package/dist/{chunk-rkykwy3z.js → chunk-evtrctj9.js} +1 -1
  56. package/dist/{chunk-q9ckfwhh.js → chunk-f2qbjr3z.js} +1 -1
  57. package/dist/{chunk-xy4jt4ek.js → chunk-f5cw54q3.js} +1 -1
  58. package/dist/chunk-fhhp6pmx.js +2 -0
  59. package/dist/{chunk-yne23w3c.js → chunk-fm5211ec.js} +1 -1
  60. package/dist/chunk-fqsrft0a.js +2 -0
  61. package/dist/{chunk-mjf3xmxn.js → chunk-fvsefztj.js} +1 -1
  62. package/dist/{chunk-m46edxtt.js → chunk-fx29n4vc.js} +1 -1
  63. package/dist/{chunk-156j37tv.js → chunk-gbkq5qnw.js} +3 -3
  64. package/dist/{chunk-chkbvqq2.js → chunk-ghd80w8a.js} +3 -3
  65. package/dist/{chunk-sntjqyqq.js → chunk-gkq323fg.js} +1 -1
  66. package/dist/chunk-gqzccw30.js +2 -0
  67. package/dist/{chunk-gz6mszbx.js → chunk-gwc54hjc.js} +2 -2
  68. package/dist/chunk-h47e1c03.js +2 -0
  69. package/dist/{chunk-ay336sqb.js → chunk-hk8j3eps.js} +1 -1
  70. package/dist/{chunk-86v2rps7.js → chunk-hnffkdzc.js} +1 -1
  71. package/dist/{chunk-191bg6nt.js → chunk-hrmxxs0w.js} +1 -1
  72. package/dist/{chunk-vafj091j.js → chunk-j82hfkcf.js} +240 -240
  73. package/dist/chunk-jcbj3xp4.js +2 -0
  74. package/dist/{chunk-h0y4mb2m.js → chunk-k3w3gwm3.js} +1 -1
  75. package/dist/{chunk-jx03a693.js → chunk-k5b9471y.js} +1 -1
  76. package/dist/chunk-kbemcvp1.js +2 -0
  77. package/dist/{chunk-zj039s33.js → chunk-kznb3hdj.js} +1 -1
  78. package/dist/{chunk-m11pb9cx.js → chunk-m39hb2a2.js} +1 -1
  79. package/dist/chunk-m3b6kx1j.js +2 -0
  80. package/dist/chunk-mbstfjnj.js +2 -0
  81. package/dist/{chunk-az4mq459.js → chunk-mkgbrbr9.js} +1 -1
  82. package/dist/{chunk-dekxwgc2.js → chunk-mznr9nyp.js} +1 -1
  83. package/dist/{chunk-5qsg9q46.js → chunk-p52cm7ch.js} +1 -1
  84. package/dist/{chunk-5g6rprcy.js → chunk-p5d8sb50.js} +1 -1
  85. package/dist/chunk-pbct6nxk.js +2 -0
  86. package/dist/chunk-peerbcwj.js +2 -0
  87. package/dist/chunk-pt1w6vq2.js +2 -0
  88. package/dist/{chunk-kdhrk7x5.js → chunk-q4cemvkw.js} +1 -1
  89. package/dist/{chunk-k3dtvay1.js → chunk-r1rfwm01.js} +1 -1
  90. package/dist/{chunk-q0srntf6.js → chunk-r46cg4qa.js} +1 -1
  91. package/dist/{chunk-22hch2me.js → chunk-reskzmsb.js} +1 -1
  92. package/dist/chunk-rgda0gwf.js +2 -0
  93. package/dist/{chunk-d7zxg9bp.js → chunk-rh7mwwb4.js} +2 -2
  94. package/dist/{chunk-qtc28zy1.js → chunk-rr49zrz6.js} +1 -1
  95. package/dist/chunk-rwa10jm4.js +2 -0
  96. package/dist/{chunk-w72v0ab1.js → chunk-s4mmmwj4.js} +1 -1
  97. package/dist/{chunk-tsmdmf5h.js → chunk-saqbtgqr.js} +49 -3
  98. package/dist/chunk-snsh9ye4.js +2 -0
  99. package/dist/{chunk-a26hcag1.js → chunk-sytwy0mg.js} +1 -1
  100. package/dist/chunk-td39mtts.js +2 -0
  101. package/dist/{chunk-tr41gn5j.js → chunk-thrv2nbz.js} +1 -1
  102. package/dist/{chunk-066yt1hy.js → chunk-tmj45xq5.js} +1 -1
  103. package/dist/chunk-trfx00jf.js +2 -0
  104. package/dist/chunk-trncnwem.js +2 -0
  105. package/dist/{chunk-y8vj3rtt.js → chunk-ts3wfjh9.js} +1 -1
  106. package/dist/chunk-v3yh931q.js +2 -0
  107. package/dist/{chunk-7qawmh8w.js → chunk-vfggb00k.js} +2 -2
  108. package/dist/chunk-vk2j3vvs.js +2 -0
  109. package/dist/chunk-vph6zpeq.js +2 -0
  110. package/dist/chunk-wa3ks5zv.js +2 -0
  111. package/dist/chunk-wv8h3d68.js +3 -0
  112. package/dist/{chunk-28q3vycz.js → chunk-wvc7t11n.js} +1 -1
  113. package/dist/{chunk-2tjk867y.js → chunk-x7dv5rq7.js} +1 -1
  114. package/dist/{chunk-pswhshrp.js → chunk-xe93ae3r.js} +3 -3
  115. package/dist/{chunk-mys0rat0.js → chunk-xec226zb.js} +1 -1
  116. package/dist/chunk-xer5kn26.js +2 -0
  117. package/dist/{chunk-tr9ynxdw.js → chunk-y956wapy.js} +1 -1
  118. package/dist/{chunk-stbns4bg.js → chunk-yhvrq2qd.js} +1 -1
  119. package/dist/{chunk-eq2j7w8p.js → chunk-yq7fc8sa.js} +1 -1
  120. package/dist/{chunk-wb90259a.js → chunk-yr7camcd.js} +1 -1
  121. package/dist/{chunk-e2emz8yb.js → chunk-ys56ecvx.js} +1 -1
  122. package/dist/{chunk-6n1qbh78.js → chunk-ytx17bg2.js} +1 -1
  123. package/dist/{chunk-64qg8jes.js → chunk-yzv702kk.js} +2 -2
  124. package/dist/{chunk-63xv0h5e.js → chunk-zv4nf0x2.js} +1 -1
  125. package/dist/cli.js +14 -14
  126. package/dist/client-script.js +2 -2
  127. package/dist/craft-entry.js +1 -1
  128. package/dist/craft.js +1 -1
  129. package/dist/database.js +1 -1
  130. package/dist/events.d.ts +14 -0
  131. package/dist/events.js +12 -1
  132. package/dist/expressions.js +9 -4
  133. package/dist/hydration.d.ts +0 -39
  134. package/dist/hydration.js +7 -1
  135. package/dist/process.js +4 -0
  136. package/dist/pwa.js +2 -2
  137. package/dist/runtime-globals.js +1 -0
  138. package/dist/signals.js +48 -2
  139. package/dist/ssg.js +2 -2
  140. package/dist/stx.d.ts +4 -0
  141. package/dist/url-safety.d.ts +67 -0
  142. package/dist/url-safety.js +40 -0
  143. package/dist/visual-testing.js +1 -1
  144. package/package.json +5 -5
  145. package/stx.d.ts +4 -0
  146. package/dist/chunk-09fb200s.js +0 -2
  147. package/dist/chunk-0b3cqgyr.js +0 -2
  148. package/dist/chunk-0tky87hx.js +0 -2
  149. package/dist/chunk-408rnn07.js +0 -2
  150. package/dist/chunk-48d9ey9k.js +0 -2
  151. package/dist/chunk-58j32d7n.js +0 -2
  152. package/dist/chunk-63h3pg9g.js +0 -2
  153. package/dist/chunk-6qe53wjc.js +0 -2
  154. package/dist/chunk-7157az6e.js +0 -2
  155. package/dist/chunk-a2nsmczq.js +0 -2
  156. package/dist/chunk-ar0fcmpj.js +0 -2
  157. package/dist/chunk-azhpwmty.js +0 -2
  158. package/dist/chunk-b3pn6dh5.js +0 -2
  159. package/dist/chunk-ca6t6nnn.js +0 -2
  160. package/dist/chunk-d72ps148.js +0 -2
  161. package/dist/chunk-deqnt1w5.js +0 -3
  162. package/dist/chunk-e0r2hndd.js +0 -2
  163. package/dist/chunk-e4sgv8p0.js +0 -2
  164. package/dist/chunk-eb1v7f55.js +0 -2
  165. package/dist/chunk-evk1dzpg.js +0 -2
  166. package/dist/chunk-fx5m9d3t.js +0 -2
  167. package/dist/chunk-jwa2jhd8.js +0 -2
  168. package/dist/chunk-mpbbfrpk.js +0 -2
  169. package/dist/chunk-nwz43t6d.js +0 -2
  170. package/dist/chunk-p1cddybx.js +0 -2
  171. package/dist/chunk-pqtype7s.js +0 -2
  172. package/dist/chunk-pvtnhx3j.js +0 -2
  173. package/dist/chunk-q1xcd8jg.js +0 -3
  174. package/dist/chunk-tzywy1s7.js +0 -2
  175. package/dist/chunk-vhzc08aa.js +0 -2
  176. package/dist/chunk-wqyfz0y6.js +0 -2
  177. package/dist/chunk-wwzzyqcg.js +0 -2
  178. package/dist/chunk-x2pzekhq.js +0 -2
  179. package/dist/chunk-xnpdkd13.js +0 -2
  180. package/dist/chunk-zqtrg15a.js +0 -2
  181. package/dist/chunk-zzfpwxpp.js +0 -2
package/dist/process.js CHANGED
@@ -224,6 +224,10 @@ async function buildModulesTag(sources, options) {
224
224
  });
225
225
  if (!code)
226
226
  return null;
227
+ if (options.buildMode === "serve") {
228
+ const { registerServeModuleBundle } = await import("./caching.js");
229
+ return `<script data-stx-scoped data-stx-run="always" data-stx-modules src="${registerServeModuleBundle(code)}"></script>`;
230
+ }
227
231
  return `<script data-stx-scoped data-stx-run="always" data-stx-modules>${code.replace(/<\/script/gi, "<\\/script")}</script>`;
228
232
  } catch {
229
233
  return null;
package/dist/pwa.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // @bun
2
- import{Dk as wq,Ek as dq,Fk as Cq,Gk as mq,Hk as gq}from"./chunk-28q3vycz.js";import{Ik as S,Jk as Tq,Kk as _q,Lk as z,Mk as D,Nk as P,Ok as kq,Pk as vq,Qk as w,Rk as Iq,Sk as d,Tk as Hq,Uk as Oq,Vk as Mq}from"./chunk-64qg8jes.js";import{kw as Aq,lw as bq,mw as Sq,nw as zq,ow as Dq,pw as Pq}from"./chunk-wb90259a.js";import{tw as N}from"./chunk-5g6rprcy.js";import p from"fs";import E from"path";import C from"fs";import L from"path";var k=[72,96,128,144,152,192,384,512],v=[120,152,167,180],I=[16,32];async function H(G,B){let q={success:!0,generatedFiles:[],errors:[],warnings:[]},K=G.pwa?.icons;if(!K?.src)return q.errors.push("No source icon specified in pwa.icons.src"),q.success=!1,q;let Y=L.isAbsolute(K.src)?K.src:L.resolve(process.cwd(),K.src);if(!await Bun.file(Y).exists())return q.errors.push(`Source icon not found: ${Y}`),q.success=!1,q;let Q=L.resolve(B,K.outputDir||"pwa-icons");try{C.mkdirSync(Q,{recursive:!0})}catch{return q.errors.push(`Failed to create output directory: ${Q}`),q.success=!1,q}let X=K.sizes||k,j=K.generateWebP??!0,J=K.generateAppleIcons??!0;try{let y;try{y=await import("sharp")}catch{return q.errors.push(`sharp is not installed. Install it with: bun add sharp
3
- Icon generation requires the sharp package for image processing.`),q.success=!1,q}let R=await y.default(Y).metadata();if(R.width&&R.width<512)q.warnings.push(`Source icon is ${R.width}x${R.height}. Recommend using at least 512x512 for best quality.`);for(let $ of X){let x=L.join(Q,`icon-${$}x${$}.png`);if(await y.default(Y).resize($,$,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).png().toFile(x),q.generatedFiles.push(x),j){let F=L.join(Q,`icon-${$}x${$}.webp`);await y.default(Y).resize($,$,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).webp({quality:90}).toFile(F),q.generatedFiles.push(F)}}if(J){for(let x of v){let F=L.join(Q,`apple-touch-icon-${x}x${x}.png`);await y.default(Y).resize(x,x,{fit:"contain",background:{r:255,g:255,b:255,alpha:1}}).png().toFile(F),q.generatedFiles.push(F)}let $=L.join(Q,"apple-touch-icon.png");await y.default(Y).resize(180,180,{fit:"contain",background:{r:255,g:255,b:255,alpha:1}}).png().toFile($),q.generatedFiles.push($)}for(let $ of I){let x=L.join(Q,`favicon-${$}x${$}.png`);await y.default(Y).resize($,$,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).png().toFile(x),q.generatedFiles.push(x)}let U=512,T=L.join(Q,`icon-maskable-${U}x${U}.png`),Z=Math.floor(U*0.1),_=U-Z*2;await y.default(Y).resize(_,_,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).extend({top:Z,bottom:Z,left:Z,right:Z,background:{r:255,g:255,b:255,alpha:1}}).png().toFile(T),q.generatedFiles.push(T)}catch(y){let V=y instanceof Error?y.message:String(y);q.errors.push(`Icon generation failed: ${V}`),q.success=!1}return q}function n(G){let B=G.sizes||k,q=G.outputDir?`/${G.outputDir}`:"/pwa-icons",K=G.generateWebP??!0,Y=G.generateAppleIcons??!0,Q=[];for(let X of B)if(Q.push(`${q}/icon-${X}x${X}.png`),K)Q.push(`${q}/icon-${X}x${X}.webp`);if(Y){Q.push(`${q}/apple-touch-icon.png`);for(let X of v)Q.push(`${q}/apple-touch-icon-${X}x${X}.png`)}for(let X of I)Q.push(`${q}/favicon-${X}x${X}.png`);return Q.push(`${q}/icon-maskable-512x512.png`),Q}async function O(){try{return await import("sharp"),!0}catch{return!1}}function m(G,B,q,K){let Y=[],Q=K.join(" ");for(let X of G)if(Y.push({src:`${B}/icon-${X}x${X}.png`,sizes:`${X}x${X}`,type:"image/png",purpose:Q}),q)Y.push({src:`${B}/icon-${X}x${X}.webp`,sizes:`${X}x${X}`,type:"image/webp",purpose:Q});return Y}function g(G){return G.map((B)=>({name:B.name,short_name:B.shortName,description:B.description,url:B.url,icons:B.icons?.map((q)=>({src:q.src,sizes:q.sizes,type:q.type}))}))}function h(G){let B=G.pwa?.shareTarget;if(!B?.enabled)return;let q={action:B.action||"/share",method:B.method||"POST",enctype:B.enctype||"multipart/form-data",params:{title:B.params?.title||"title",text:B.params?.text||"text",url:B.params?.url||"url"}};if(B.acceptFiles&&B.acceptFiles.length>0)q.params.files=B.acceptFiles.map((K)=>({name:K.name,accept:K.accept}));return q}function c(G){let B=G.pwa?.fileHandlers;if(!B?.enabled||!B.accept)return;let q=[{action:B.action||"/",accept:B.accept,launch_type:B.launchType||"single-client"}];if(B.icons)q[0].icons=B.icons.map((K)=>({src:K.src,sizes:K.sizes,type:K.type}));return q}function l(G){let B=G.pwa?.protocolHandlers;if(!B||B.length===0)return;return B.map((q)=>({protocol:q.protocol,url:q.url}))}function u(G){let B=G.pwa;if(!B?.enabled||!B.manifest)return null;let{manifest:q,icons:K}=B,Y=K?.sizes||[72,96,128,144,152,192,384,512],Q=K?.outputDir?`/${K.outputDir}`:"/pwa-icons",X=K?.generateWebP??!0,j=K?.purpose||["any","maskable"],J={name:q.name,short_name:q.shortName||q.name,description:q.description,start_url:q.startUrl||"/",display:q.display||"standalone",display_override:q.displayOverride,orientation:q.orientation,theme_color:q.themeColor,background_color:q.backgroundColor,scope:q.scope||"/",lang:q.lang,dir:q.dir,id:q.id,categories:q.categories,icons:m(Y,Q,X,j)};if(q.shortcuts&&q.shortcuts.length>0)J.shortcuts=g(q.shortcuts);if(q.screenshots&&q.screenshots.length>0)J.screenshots=q.screenshots.map((U)=>({src:U.src,sizes:U.sizes,type:U.type,label:U.label,form_factor:U.platform}));let y=h(G);if(y)J.share_target=y;let V=c(G);if(V)J.file_handlers=V;let R=l(G);if(R)J.protocol_handlers=R;if(q.launchHandler)J.launch_handler={client_mode:q.launchHandler};if(q.handleLinks)J.handle_links=q.handleLinks;if(q.edgeSidePanel?.enabled)J.edge_side_panel={preferred_width:q.edgeSidePanel.preferredWidth};return J}function M(G){let B=u(G);if(!B)return"";let q=JSON.parse(JSON.stringify(B));return JSON.stringify(q,null,2)}function i(G,B){return{...B,...G,shortcuts:G.shortcuts||B.shortcuts,screenshots:G.screenshots||B.screenshots,categories:G.categories||B.categories}}function s(G){let B=[],q=G.pwa;if(!q?.enabled)return B;let K=q.manifest;if(!K)return B.push("PWA manifest configuration is missing"),B;if(!K.name)B.push("Manifest name is required");let Y=["fullscreen","standalone","minimal-ui","browser"];if(K.display&&!Y.includes(K.display))B.push(`Invalid display mode: ${K.display}. Must be one of: ${Y.join(", ")}`);let Q=["any","natural","landscape","landscape-primary","landscape-secondary","portrait","portrait-primary","portrait-secondary"];if(K.orientation&&!Q.includes(K.orientation))B.push(`Invalid orientation: ${K.orientation}`);let X=/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;if(K.themeColor&&!X.test(K.themeColor))B.push(`Invalid theme color: ${K.themeColor}. Must be a valid hex color.`);if(K.backgroundColor&&!X.test(K.backgroundColor))B.push(`Invalid background color: ${K.backgroundColor}. Must be a valid hex color.`);if(q.shareTarget?.enabled){if(!q.shareTarget.action)B.push("Share target action URL is required")}if(q.fileHandlers?.enabled){if(!q.fileHandlers.accept||Object.keys(q.fileHandlers.accept).length===0)B.push("File handlers must specify accepted MIME types")}if(q.protocolHandlers)for(let j of q.protocolHandlers){if(!j.protocol)B.push("Protocol handler missing protocol");if(!j.url||!j.url.includes("%s"))B.push(`Protocol handler URL must contain %s placeholder: ${j.protocol}`)}return B}import A from"path";async function b(G){let B=G.pwa?.offline;if(!B?.enabled)return"";if(B.page){let q=A.isAbsolute(B.page)?B.page:A.resolve(process.cwd(),B.page);if(await Bun.file(q).exists())try{let{processDirectives:K}=await import("./chunk-wqyfz0y6.js"),Y=await Bun.file(q).text();return await K(Y,{},q,G,new Set)}catch(K){console.warn(`[PWA] Failed to process custom offline page: ${K}`)}else console.warn(`[PWA] Custom offline page not found: ${q}`)}return f(G)}function f(G){let B=G.pwa?.offline,q=G.pwa?.manifest,K=B?.fallbackTitle||"You are offline",Y=B?.fallbackMessage||"Please check your internet connection and try again.",Q=q?.themeColor||"#4f46e5",X=q?.shortName||q?.name||"App";return`<!DOCTYPE html>
2
+ import{Fk as wq,Gk as dq,Hk as Cq,Ik as mq,Jk as gq}from"./chunk-wvc7t11n.js";import{Kk as S,Lk as Tq,Mk as _q,Nk as z,Ok as D,Pk as P,Qk as kq,Rk as vq,Sk as w,Tk as Iq,Uk as d,Vk as Hq,Wk as Oq,Xk as Mq}from"./chunk-yzv702kk.js";import{ow as Aq,pw as bq,qw as Sq,rw as zq,sw as Dq,tw as Pq}from"./chunk-yr7camcd.js";import{xw as N}from"./chunk-p5d8sb50.js";import p from"fs";import E from"path";import C from"fs";import L from"path";var k=[72,96,128,144,152,192,384,512],v=[120,152,167,180],I=[16,32];async function H(G,B){let q={success:!0,generatedFiles:[],errors:[],warnings:[]},K=G.pwa?.icons;if(!K?.src)return q.errors.push("No source icon specified in pwa.icons.src"),q.success=!1,q;let Y=L.isAbsolute(K.src)?K.src:L.resolve(process.cwd(),K.src);if(!await Bun.file(Y).exists())return q.errors.push(`Source icon not found: ${Y}`),q.success=!1,q;let Q=L.resolve(B,K.outputDir||"pwa-icons");try{C.mkdirSync(Q,{recursive:!0})}catch{return q.errors.push(`Failed to create output directory: ${Q}`),q.success=!1,q}let X=K.sizes||k,j=K.generateWebP??!0,J=K.generateAppleIcons??!0;try{let y;try{y=await import("sharp")}catch{return q.errors.push(`sharp is not installed. Install it with: bun add sharp
3
+ Icon generation requires the sharp package for image processing.`),q.success=!1,q}let R=await y.default(Y).metadata();if(R.width&&R.width<512)q.warnings.push(`Source icon is ${R.width}x${R.height}. Recommend using at least 512x512 for best quality.`);for(let $ of X){let x=L.join(Q,`icon-${$}x${$}.png`);if(await y.default(Y).resize($,$,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).png().toFile(x),q.generatedFiles.push(x),j){let F=L.join(Q,`icon-${$}x${$}.webp`);await y.default(Y).resize($,$,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).webp({quality:90}).toFile(F),q.generatedFiles.push(F)}}if(J){for(let x of v){let F=L.join(Q,`apple-touch-icon-${x}x${x}.png`);await y.default(Y).resize(x,x,{fit:"contain",background:{r:255,g:255,b:255,alpha:1}}).png().toFile(F),q.generatedFiles.push(F)}let $=L.join(Q,"apple-touch-icon.png");await y.default(Y).resize(180,180,{fit:"contain",background:{r:255,g:255,b:255,alpha:1}}).png().toFile($),q.generatedFiles.push($)}for(let $ of I){let x=L.join(Q,`favicon-${$}x${$}.png`);await y.default(Y).resize($,$,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).png().toFile(x),q.generatedFiles.push(x)}let U=512,T=L.join(Q,`icon-maskable-${U}x${U}.png`),Z=Math.floor(U*0.1),_=U-Z*2;await y.default(Y).resize(_,_,{fit:"contain",background:{r:0,g:0,b:0,alpha:0}}).extend({top:Z,bottom:Z,left:Z,right:Z,background:{r:255,g:255,b:255,alpha:1}}).png().toFile(T),q.generatedFiles.push(T)}catch(y){let V=y instanceof Error?y.message:String(y);q.errors.push(`Icon generation failed: ${V}`),q.success=!1}return q}function n(G){let B=G.sizes||k,q=G.outputDir?`/${G.outputDir}`:"/pwa-icons",K=G.generateWebP??!0,Y=G.generateAppleIcons??!0,Q=[];for(let X of B)if(Q.push(`${q}/icon-${X}x${X}.png`),K)Q.push(`${q}/icon-${X}x${X}.webp`);if(Y){Q.push(`${q}/apple-touch-icon.png`);for(let X of v)Q.push(`${q}/apple-touch-icon-${X}x${X}.png`)}for(let X of I)Q.push(`${q}/favicon-${X}x${X}.png`);return Q.push(`${q}/icon-maskable-512x512.png`),Q}async function O(){try{return await import("sharp"),!0}catch{return!1}}function m(G,B,q,K){let Y=[],Q=K.join(" ");for(let X of G)if(Y.push({src:`${B}/icon-${X}x${X}.png`,sizes:`${X}x${X}`,type:"image/png",purpose:Q}),q)Y.push({src:`${B}/icon-${X}x${X}.webp`,sizes:`${X}x${X}`,type:"image/webp",purpose:Q});return Y}function g(G){return G.map((B)=>({name:B.name,short_name:B.shortName,description:B.description,url:B.url,icons:B.icons?.map((q)=>({src:q.src,sizes:q.sizes,type:q.type}))}))}function h(G){let B=G.pwa?.shareTarget;if(!B?.enabled)return;let q={action:B.action||"/share",method:B.method||"POST",enctype:B.enctype||"multipart/form-data",params:{title:B.params?.title||"title",text:B.params?.text||"text",url:B.params?.url||"url"}};if(B.acceptFiles&&B.acceptFiles.length>0)q.params.files=B.acceptFiles.map((K)=>({name:K.name,accept:K.accept}));return q}function c(G){let B=G.pwa?.fileHandlers;if(!B?.enabled||!B.accept)return;let q=[{action:B.action||"/",accept:B.accept,launch_type:B.launchType||"single-client"}];if(B.icons)q[0].icons=B.icons.map((K)=>({src:K.src,sizes:K.sizes,type:K.type}));return q}function l(G){let B=G.pwa?.protocolHandlers;if(!B||B.length===0)return;return B.map((q)=>({protocol:q.protocol,url:q.url}))}function u(G){let B=G.pwa;if(!B?.enabled||!B.manifest)return null;let{manifest:q,icons:K}=B,Y=K?.sizes||[72,96,128,144,152,192,384,512],Q=K?.outputDir?`/${K.outputDir}`:"/pwa-icons",X=K?.generateWebP??!0,j=K?.purpose||["any","maskable"],J={name:q.name,short_name:q.shortName||q.name,description:q.description,start_url:q.startUrl||"/",display:q.display||"standalone",display_override:q.displayOverride,orientation:q.orientation,theme_color:q.themeColor,background_color:q.backgroundColor,scope:q.scope||"/",lang:q.lang,dir:q.dir,id:q.id,categories:q.categories,icons:m(Y,Q,X,j)};if(q.shortcuts&&q.shortcuts.length>0)J.shortcuts=g(q.shortcuts);if(q.screenshots&&q.screenshots.length>0)J.screenshots=q.screenshots.map((U)=>({src:U.src,sizes:U.sizes,type:U.type,label:U.label,form_factor:U.platform}));let y=h(G);if(y)J.share_target=y;let V=c(G);if(V)J.file_handlers=V;let R=l(G);if(R)J.protocol_handlers=R;if(q.launchHandler)J.launch_handler={client_mode:q.launchHandler};if(q.handleLinks)J.handle_links=q.handleLinks;if(q.edgeSidePanel?.enabled)J.edge_side_panel={preferred_width:q.edgeSidePanel.preferredWidth};return J}function M(G){let B=u(G);if(!B)return"";let q=JSON.parse(JSON.stringify(B));return JSON.stringify(q,null,2)}function i(G,B){return{...B,...G,shortcuts:G.shortcuts||B.shortcuts,screenshots:G.screenshots||B.screenshots,categories:G.categories||B.categories}}function s(G){let B=[],q=G.pwa;if(!q?.enabled)return B;let K=q.manifest;if(!K)return B.push("PWA manifest configuration is missing"),B;if(!K.name)B.push("Manifest name is required");let Y=["fullscreen","standalone","minimal-ui","browser"];if(K.display&&!Y.includes(K.display))B.push(`Invalid display mode: ${K.display}. Must be one of: ${Y.join(", ")}`);let Q=["any","natural","landscape","landscape-primary","landscape-secondary","portrait","portrait-primary","portrait-secondary"];if(K.orientation&&!Q.includes(K.orientation))B.push(`Invalid orientation: ${K.orientation}`);let X=/^#([0-9A-Fa-f]{3}|[0-9A-Fa-f]{6})$/;if(K.themeColor&&!X.test(K.themeColor))B.push(`Invalid theme color: ${K.themeColor}. Must be a valid hex color.`);if(K.backgroundColor&&!X.test(K.backgroundColor))B.push(`Invalid background color: ${K.backgroundColor}. Must be a valid hex color.`);if(q.shareTarget?.enabled){if(!q.shareTarget.action)B.push("Share target action URL is required")}if(q.fileHandlers?.enabled){if(!q.fileHandlers.accept||Object.keys(q.fileHandlers.accept).length===0)B.push("File handlers must specify accepted MIME types")}if(q.protocolHandlers)for(let j of q.protocolHandlers){if(!j.protocol)B.push("Protocol handler missing protocol");if(!j.url||!j.url.includes("%s"))B.push(`Protocol handler URL must contain %s placeholder: ${j.protocol}`)}return B}import A from"path";async function b(G){let B=G.pwa?.offline;if(!B?.enabled)return"";if(B.page){let q=A.isAbsolute(B.page)?B.page:A.resolve(process.cwd(),B.page);if(await Bun.file(q).exists())try{let{processDirectives:K}=await import("./chunk-rwa10jm4.js"),Y=await Bun.file(q).text();return await K(Y,{},q,G,new Set)}catch(K){console.warn(`[PWA] Failed to process custom offline page: ${K}`)}else console.warn(`[PWA] Custom offline page not found: ${q}`)}return f(G)}function f(G){let B=G.pwa?.offline,q=G.pwa?.manifest,K=B?.fallbackTitle||"You are offline",Y=B?.fallbackMessage||"Please check your internet connection and try again.",Q=q?.themeColor||"#4f46e5",X=q?.shortName||q?.name||"App";return`<!DOCTYPE html>
4
4
  <html lang="en">
5
5
  <head>
6
6
  <meta charset="UTF-8">
@@ -43,6 +43,7 @@ export const STX_RUNTIME_GLOBALS = [
43
43
  "useDark",
44
44
  "useDebounce",
45
45
  "useDebouncedValue",
46
+ "useDocumentVisibility",
46
47
  "useEventListener",
47
48
  "useFetch",
48
49
  "useFocus",
package/dist/signals.js CHANGED
@@ -2819,6 +2819,33 @@ catch (e2) {
2819
2819
 
2820
2820
  // Known directive names to exclude from generic :attr binding
2821
2821
  var DIRECTIVE_NAMES = {class:1, style:1, text:1, html:1, show:1, model:1, 'if':1, ref:1};
2822
+
2823
+ // A bound value cannot introduce a URL scheme the page did not ask for.
2824
+ // This is the client half of url-safety.ts: the server refuses a scheme
2825
+ // substituted into an href, and x-href over a signal reaches the same
2826
+ // attribute by another road. Same policy, same unsafe: prefix, so a page
2827
+ // behaves the same whether the value arrived at render or at runtime.
2828
+ var URL_NAV_ATTR = {href:1, 'xlink:href':1, action:1, formaction:1, ping:1, cite:1, manifest:1, data:1, to:1};
2829
+ var URL_FETCH_ATTR = {src:1, srcset:1, poster:1, background:1};
2830
+ var urlRefusalWarned = false;
2831
+ function safeUrlAttr(attrName, value) {
2832
+ var navigable = URL_NAV_ATTR[attrName];
2833
+ if (!navigable && !URL_FETCH_ATTR[attrName]) return value;
2834
+ if (typeof value !== 'string' || !value) return value;
2835
+ // Browsers ignore ASCII whitespace and controls inside a scheme and match
2836
+ // it case-insensitively, so the spellings collapse before the test.
2837
+ var probe = value.replace(/[\\u0000-\\u0020\\u00a0\\u2000-\\u200f\\u2028\\u2029\\ufeff]+/g, '').toLowerCase();
2838
+ var refused = /^(?:javascript|vbscript|livescript|mocha|view-source):/.test(probe)
2839
+ || (navigable
2840
+ ? /^data:(?:text\\/html|text\\/xml|application\\/xhtml\\+xml|application\\/xml|image\\/svg\\+xml)/.test(probe)
2841
+ : /^data:(?:text\\/html|application\\/xhtml\\+xml)/.test(probe));
2842
+ if (!refused) return value;
2843
+ if (!urlRefusalWarned) {
2844
+ urlRefusalWarned = true;
2845
+ console.warn('[stx] refused a ' + attrName + ' value whose scheme can run script: ' + probe.slice(0, 24));
2846
+ }
2847
+ return 'unsafe:' + value;
2848
+ }
2822
2849
  // SVG attributes are case-sensitive, but the HTML parser lowercases
2823
2850
  // prefixed attribute names \u2014 ':viewBox' arrives as ':viewbox' because
2824
2851
  // the spec's "adjust SVG attributes" step only covers unprefixed names.
@@ -2926,7 +2953,7 @@ else {
2926
2953
  try { attrValue = JSON.stringify(v); }
2927
2954
  catch (e) { attrValue = String(v); }
2928
2955
  }
2929
- el.setAttribute(attrName, attrValue);
2956
+ el.setAttribute(attrName, safeUrlAttr(attrName, attrValue));
2930
2957
  }
2931
2958
  });
2932
2959
  el.removeAttribute(name);
@@ -3124,7 +3151,12 @@ catch (e) {
3124
3151
  }
3125
3152
  }, {
3126
3153
  capture: modifiers.includes('capture'),
3127
- passive: modifiers.includes('passive'),
3154
+ // A touch or wheel listener that is not passive holds every scroll
3155
+ // starting on the element until this thread has run it. Passive
3156
+ // unless .prevent needs preventDefault() or .nonpassive asks.
3157
+ passive: modifiers.includes('passive')
3158
+ || (/^(touchstart|touchmove|wheel|mousewheel)$/i.test(eventName)
3159
+ && !modifiers.includes('prevent') && !modifiers.includes('nonpassive')),
3128
3160
  once: modifiers.includes('once')
3129
3161
  });
3130
3162
  el.removeAttribute(name);
@@ -5565,6 +5597,19 @@ catch (e) {} }
5565
5597
  return matches;
5566
5598
  }
5567
5599
 
5600
+ // 'visible' or 'hidden', kept current: whether the page is on screen (the
5601
+ // app in the foreground, the tab in front). Built in rather than taken from
5602
+ // @stacksjs/browser, whose bundle a page then carried in full (~180KB) for
5603
+ // this one listener.
5604
+ function useDocumentVisibility() {
5605
+ var visibility = state(typeof document !== 'undefined' ? document.visibilityState : 'visible');
5606
+ if (typeof document === 'undefined') return visibility;
5607
+ var onChange = function() { visibility.set(document.visibilityState); };
5608
+ document.addEventListener('visibilitychange', onChange);
5609
+ onDestroy(function() { document.removeEventListener('visibilitychange', onChange); });
5610
+ return visibility;
5611
+ }
5612
+
5568
5613
  var scrollLockStates = new WeakMap();
5569
5614
 
5570
5615
  function resolveScrollLockTarget(target) {
@@ -6706,6 +6751,7 @@ catch (e) {} }
6706
6751
  useColorMode,
6707
6752
  useDark,
6708
6753
  useMediaQuery,
6754
+ useDocumentVisibility,
6709
6755
  useScrollLock,
6710
6756
  usePreferredDark,
6711
6757
  usePreferredLight,
package/dist/ssg.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{uk as Uq,vk as Iq,zk as Fq}from"./chunk-fa2mg49t.js";import{Ak as Eq,Bk as Tq,Ck as Dq}from"./chunk-axqfm9b4.js";import{$k as Aq,Xk as _q,_k as zq}from"./chunk-wdvee4kr.js";import"./chunk-156j37tv.js";import"./chunk-mjf3xmxn.js";import{Jp as P,Om as Oq,io as l,lo as Hq,rr as n}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import{ht as Xq}from"./chunk-pswhshrp.js";import{mt as d}from"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import{Tt as Bq}from"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import{$v as jq,Zv as Yq,_v as Vq,aw as Gq,bw as Lq,cw as Nq}from"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import{tw as y}from"./chunk-5g6rprcy.js";import O from"fs";import j from"path";import{createHash as xq}from"crypto";function yq(q){try{return new Bun.Transpiler({loader:"js",minifyWhitespace:!0}).transformSync(q).replace(/\}(var |let |const |function )/g,"};$1").trim()}catch{return q}}var Pq=/<script\s+type="stx\/island"\s+data-stx-island="([^"]+)"([^>]*)>([\s\S]*?)<\/script>/g;function Cq(q){return Bun.hash(q).toString(16)}function Qq(q,Z={}){if(!q.includes('type="stx/island"'))return{html:q,chunks:[]};let $=new Map,Q=q.replace(Pq,(J,W,z,A)=>{let G=A.trim();if(!G)return J;if(/\bdata-stx-src=/.test(z))return J;if(Z.minify)G=yq(G);let X=Cq(G);if(!$.has(X))$.set(X,G);let B=Z.integrity?` data-stx-integrity="sha384-${xq("sha384").update(G).digest("base64")}"`:"";return`<script type="stx/island" data-stx-island="${W}" data-stx-src="/_stx/islands/${X}.js"${B}${z}></script>`}),K=Array.from($,([J,W])=>({hash:J,code:W}));return{html:Q,chunks:K}}var gq=new Set(["visible","idle"]);function Zq(q){if(!q.includes("data-stx-src="))return q;let Z=new Map,$=/data-stx-scope="([^"]+)"[^>]*?stx-hydrate="([^"]+)"/g,Q;while((Q=$.exec(q))!==null)Z.set(Q[1],Q[2]);let K=new Set,J=/data-stx-island="([^"]+)"[^>]*?data-stx-src="([^"]+)"/g,W;while((W=J.exec(q))!==null)if(gq.has(Z.get(W[1])||""))K.add(W[2]);let z=q.lastIndexOf("</head>");if(K.size===0||z===-1)return q;let A=Array.from(K).filter((G)=>!q.includes(`rel="prefetch" href="${G}"`)).map((G)=>`<link rel="prefetch" href="${G}" as="script">`).join("");if(!A)return q;return q.slice(0,z)+A+q.slice(z)}var fq=["STX_SITE_URL","SITE_URL","URL","VERCEL_URL","CF_PAGES_URL"];function h(q){let Z=q.trim();if(!Z)return null;let $=/^https?:\/\//i.test(Z)?Z:`https://${Z}`;try{return new URL($).origin+new URL($).pathname.replace(/\/$/,"")}catch{return null}}function mq(q){for(let Z of fq){let $=q[Z];if(!$)continue;let Q=h($);if(Q)return{url:Q,source:"env",via:Z}}return null}function $q(q){if(!q||typeof q!=="object")return null;let Z=q,$=Z.site?.url??Z.url??Z.app?.url;return typeof $==="string"?h($):null}async function dq(q){let{existsSync:Z}=await import("fs"),$=await import("path");for(let Q of["site.config.ts","site.config.js",".config/site.config.ts"]){let K=$.resolve(q,Q);if(!Z(K))continue;try{let J=await import(K),W=$q(J.default??J);if(W)return W}catch{}}return null}async function Kq(q={}){let Z=q.cwd??process.cwd(),$=q.env??process.env;if(q.explicit){let W=h(q.explicit);if(W)return{url:W,source:"option"}}let Q=$q(q.stxConfig);if(Q)return{url:Q,source:"stx.config",via:"site.url"};let K=await dq(Z);if(K)return{url:K,source:"site.config",via:"url"};let J=mq($);if(J)return J;return{url:"http://localhost",source:"fallback"}}function Wq(){return["No site URL configured \u2014 sitemap.xml and robots.txt will point at http://localhost."," Set one in stx.config.ts (site: { url: 'https://example.com' }), in site.config.ts,"," via --domain, or with SITE_URL in the build environment."].join(`
2
+ import{Bk as Fq,wk as Uq,xk as Iq}from"./chunk-byjy9far.js";import{Ck as Eq,Dk as Tq,Ek as Dq}from"./chunk-c0n802j1.js";import{Zk as _q,al as zq,bl as Aq}from"./chunk-4wpxbkbe.js";import"./chunk-gbkq5qnw.js";import"./chunk-fvsefztj.js";import{Np as P,Sm as Oq,mo as l,po as Hq,vr as n}from"./chunk-j82hfkcf.js";import"./chunk-rh7mwwb4.js";import"./chunk-1t3j8a0q.js";import"./chunk-01ggk8k8.js";import"./chunk-25b8z7xa.js";import"./chunk-hk8j3eps.js";import{lt as Xq}from"./chunk-xe93ae3r.js";import{qt as d}from"./chunk-1spzqjve.js";import"./chunk-f2qbjr3z.js";import"./chunk-1xwfws06.js";import"./chunk-r1rfwm01.js";import{Xt as Bq}from"./chunk-ahpmjg3f.js";import"./chunk-bt8w146r.js";import"./chunk-6p6b01kp.js";import"./chunk-x7dv5rq7.js";import"./chunk-e0kzyf1g.js";import"./chunk-wv8h3d68.js";import{bw as Yq,cw as Vq,dw as jq,ew as Gq,fw as Lq,gw as Nq}from"./chunk-beextc84.js";import"./chunk-yr7camcd.js";import{xw as y}from"./chunk-p5d8sb50.js";import O from"fs";import j from"path";import{createHash as xq}from"crypto";function yq(q){try{return new Bun.Transpiler({loader:"js",minifyWhitespace:!0}).transformSync(q).replace(/\}(var |let |const |function )/g,"};$1").trim()}catch{return q}}var Pq=/<script\s+type="stx\/island"\s+data-stx-island="([^"]+)"([^>]*)>([\s\S]*?)<\/script>/g;function Cq(q){return Bun.hash(q).toString(16)}function Qq(q,Z={}){if(!q.includes('type="stx/island"'))return{html:q,chunks:[]};let $=new Map,Q=q.replace(Pq,(J,W,z,A)=>{let G=A.trim();if(!G)return J;if(/\bdata-stx-src=/.test(z))return J;if(Z.minify)G=yq(G);let X=Cq(G);if(!$.has(X))$.set(X,G);let B=Z.integrity?` data-stx-integrity="sha384-${xq("sha384").update(G).digest("base64")}"`:"";return`<script type="stx/island" data-stx-island="${W}" data-stx-src="/_stx/islands/${X}.js"${B}${z}></script>`}),K=Array.from($,([J,W])=>({hash:J,code:W}));return{html:Q,chunks:K}}var gq=new Set(["visible","idle"]);function Zq(q){if(!q.includes("data-stx-src="))return q;let Z=new Map,$=/data-stx-scope="([^"]+)"[^>]*?stx-hydrate="([^"]+)"/g,Q;while((Q=$.exec(q))!==null)Z.set(Q[1],Q[2]);let K=new Set,J=/data-stx-island="([^"]+)"[^>]*?data-stx-src="([^"]+)"/g,W;while((W=J.exec(q))!==null)if(gq.has(Z.get(W[1])||""))K.add(W[2]);let z=q.lastIndexOf("</head>");if(K.size===0||z===-1)return q;let A=Array.from(K).filter((G)=>!q.includes(`rel="prefetch" href="${G}"`)).map((G)=>`<link rel="prefetch" href="${G}" as="script">`).join("");if(!A)return q;return q.slice(0,z)+A+q.slice(z)}var fq=["STX_SITE_URL","SITE_URL","URL","VERCEL_URL","CF_PAGES_URL"];function h(q){let Z=q.trim();if(!Z)return null;let $=/^https?:\/\//i.test(Z)?Z:`https://${Z}`;try{return new URL($).origin+new URL($).pathname.replace(/\/$/,"")}catch{return null}}function mq(q){for(let Z of fq){let $=q[Z];if(!$)continue;let Q=h($);if(Q)return{url:Q,source:"env",via:Z}}return null}function $q(q){if(!q||typeof q!=="object")return null;let Z=q,$=Z.site?.url??Z.url??Z.app?.url;return typeof $==="string"?h($):null}async function dq(q){let{existsSync:Z}=await import("fs"),$=await import("path");for(let Q of["site.config.ts","site.config.js",".config/site.config.ts"]){let K=$.resolve(q,Q);if(!Z(K))continue;try{let J=await import(K),W=$q(J.default??J);if(W)return W}catch{}}return null}async function Kq(q={}){let Z=q.cwd??process.cwd(),$=q.env??process.env;if(q.explicit){let W=h(q.explicit);if(W)return{url:W,source:"option"}}let Q=$q(q.stxConfig);if(Q)return{url:Q,source:"stx.config",via:"site.url"};let K=await dq(Z);if(K)return{url:K,source:"site.config",via:"url"};let J=mq($);if(J)return J;return{url:"http://localhost",source:"fallback"}}function Wq(){return["No site URL configured \u2014 sitemap.xml and robots.txt will point at http://localhost."," Set one in stx.config.ts (site: { url: 'https://example.com' }), in site.config.ts,"," via --domain, or with SITE_URL in the build environment."].join(`
3
3
  `)}class wq{cacheDir;cache=new Map;loaded=!1;salt;constructor(q,Z=""){this.cacheDir=q,this.salt=Z}async load(){if(this.loaded)return;let q=j.join(this.cacheDir,"build-cache.json");if(await Bun.file(q).exists())try{let Z=JSON.parse(await Bun.file(q).text());for(let[$,Q]of Object.entries(Z))this.cache.set($,Q)}catch{}this.loaded=!0}async save(){await O.promises.mkdir(this.cacheDir,{recursive:!0});let q=j.join(this.cacheDir,"build-cache.json"),Z={};for(let[$,Q]of this.cache)Z[$]=Q;await Bun.write(q,JSON.stringify(Z))}getHash(q,Z){let $=O.statSync(q),Q=`${this.salt}|${q}:${$.mtimeMs}`;for(let J of Z)if(O.existsSync(J)){let W=O.statSync(J);Q+=`:${J}:${W.mtimeMs}`}let K=0;for(let J=0;J<Q.length;J++){let W=Q.charCodeAt(J);K=(K<<5)-K+W,K=K&K}return Math.abs(K).toString(36)}get(q,Z){let $=this.cache.get(q);if(!$)return null;let Q=this.getHash(Z,$.dependencies??[]);if($.hash!==Q)return this.cache.delete(q),null;return $.html}set(q,Z,$,Q){let K=this.getHash(Z,$);this.cache.set(q,{hash:K,html:Q,generatedAt:Date.now(),dependencies:$})}}class Rq{cacheDir;constructor(q){this.cacheDir=q}getFilePath(q){let Z=q.replace(/[^a-zA-Z0-9]/g,"_")+".json";return j.join(this.cacheDir,"isr",Z)}async get(q){let Z=this.getFilePath(q);if(!await Bun.file(Z).exists())return null;try{return JSON.parse(await Bun.file(Z).text())}catch{return null}}async set(q,Z){let $=this.getFilePath(q);await O.promises.mkdir(j.dirname($),{recursive:!0}),await Bun.write($,JSON.stringify(Z))}async invalidate(q){let Z=this.getFilePath(q);if(await Bun.file(Z).exists())await O.promises.unlink(Z)}async invalidatePattern(q){let Z=j.join(this.cacheDir,"isr");if(!O.existsSync(Z))return;let $=await O.promises.readdir(Z);for(let Q of $){let K=Q.replace(/_/g,"/").replace(".json","");if(q.test(K))await O.promises.unlink(j.join(Z,Q))}}async needsRevalidation(q){let Z=await this.get(q);if(!Z)return!0;return Date.now()>Z.revalidateAfter}}async function pq(q){try{let $=(await Bun.file(q).text()).match(/<script\s+server\b[^>]*>([\s\S]*?)<\/script>/i);if(!$)return null;let Q=$[1];if(!Q.includes("getStaticPaths"))return null;let K=Q.match(/(?:export\s+)?(?:async\s+)?function\s+getStaticPaths\s*\([^)]*\)\s*\{([\s\S]*?)\n[\t ]*\}/);if(!K)return null;return await Function(`
4
4
  return (async function getStaticPaths() {
5
5
  ${K[1]}
@@ -41,7 +41,7 @@ ${q.map((Q)=>{let K=new URL(Q.loc,Z).href,J=` <url>
41
41
  ${$.join(`
42
42
  `)}
43
43
  </channel>
44
- </rss>`}async function aq(q={}){let Z=Date.now();Aq();let $=await n(process.cwd()),Q=$.build||{},K=await Kq({explicit:q.domain||Q.domain,stxConfig:$});if(K.source==="fallback"&&(q.sitemap??Q.sitemap??!0))console.warn(Wq());let J={router:q.router??$?.router??{},pagesDir:q.pagesDir||Q.pagesDir||"pages",outputDir:q.outputDir||Q.outputDir||"dist",baseUrl:q.baseUrl||Q.baseUrl||"/",domain:K.url,revalidate:q.revalidate??Q.revalidate??!1,sitemap:q.sitemap??Q.sitemap??!0,sitemapExclude:q.sitemapExclude||Q.sitemapExclude||[],robots:q.robots??Q.robots??!0,rss:q.rss??Q.rss??!1,concurrency:q.concurrency||Q.concurrency||10,cache:q.cache??Q.cache??!0,cacheDir:q.cacheDir||Q.cacheDir||d(process.cwd(),"ssg-cache"),contentLoaders:q.contentLoaders||[],hooks:q.hooks||{},minify:q.minify??Q.minify??!0,generate404:q.generate404??Q.generate404??!0,publicDir:q.publicDir||Q.publicDir||"public",trailingSlash:q.trailingSlash??Q.trailingSlash??!1,cleanOutput:q.cleanOutput??Q.cleanOutput??!0,cacheSalt:q.cacheSalt??"",partialsDir:q.partialsDir||$?.partialsDir||"",componentsDir:q.componentsDir||$?.componentsDir||"",failOnIncludeError:q.failOnIncludeError??!0,chunkIslands:q.chunkIslands===!0,prefetchIslands:q.prefetchIslands===!0,integrityIslands:q.integrityIslands===!0},W={totalPages:0,successCount:0,failedCount:0,cachedCount:0,buildTime:0,pages:[],errors:[]},z=new Set,A=0,G={},X={};await J.hooks.onBuildStart?.();try{if(J.cleanOutput&&O.existsSync(J.outputDir))await O.promises.rm(J.outputDir,{recursive:!0});await O.promises.mkdir(J.outputDir,{recursive:!0});let L=J.cacheSalt;if(!L){let{resolveUserCssConfig:Y,fingerprintConfig:N}=await import("./chunk-sntjqyqq.js");try{L=N(await Y(process.cwd()))}catch{}}let{prepareImageDelivery:_}=await import("./chunk-97ej3abh.js"),F=await _(J.publicDir,J.outputDir);if(F.count>0)console.log(`Optimized ${F.count} image(s) for responsive delivery`),L=[L,F.fingerprint].filter(Boolean).join(":");let C=new wq(J.cacheDir,L);if(J.cache)await C.load();try{let{generateCss:Y}=await import("./chunk-sntjqyqq.js");await Y('<div class="bg-black"></div>')}catch{}Yq();let kq=$?.routeMiddleware?.dir||"middleware";await jq(process.cwd(),kq);let p=Vq();if(p.length>0)console.log(`Loaded ${p.length} middleware: ${p.join(", ")}`);let bq=$?.routeMiddleware?.global||[];Fq($?.layoutsDir,d(process.cwd()));let i=l(".",{pagesDir:J.pagesDir,pagesDirs:$?._layerPageDirs});console.log(`Found ${i.length} routes`);let g=[];for(let Y of i){let N=await uq(Y);for(let H of N)g.push({route:Y,url:H.url,params:H.params,props:H.props,revalidate:H.revalidate??J.revalidate})}W.totalPages=g.length,console.log(`Generating ${W.totalPages} pages...`);let b=[],s=[];for(let Y=0;Y<g.length;Y+=J.concurrency)s.push(g.slice(Y,Y+J.concurrency));for(let Y of s)await Promise.all(Y.map(async(N)=>{let{route:H,url:V,params:S,props:Sq,revalidate:a}=N;try{await J.hooks.onPageStart?.(V);let w=await Bun.file(H.filePath).text(),R=JJ(w),vq=R?.middleware?Array.isArray(R.middleware)?R.middleware:[R.middleware]:[],t=[...bq,...vq];if(t.length>0){let D=Gq(V,S,R||{}),M=Lq(D,null,void 0,{isServer:!0}),E=await Nq(t,M);if(E.redirect){let U=typeof E.redirect==="string"?E.redirect:E.redirect.path||E.redirect,x=QJ(String(U),V),k=ZJ(V,J);await O.promises.mkdir(j.dirname(k),{recursive:!0}),await Bun.write(k,x),W.successCount++,W.pages.push({route:V,outputPath:k,size:Buffer.byteLength(x),cached:!1}),b.push({loc:V,lastmod:new Date().toISOString()}),console.log(` \u21B3 ${V} \u2192 redirect to ${U}`);return}if(E.abort){let U=typeof E.abort==="string"?E.abort:E.abort?.error?.message||"aborted";console.warn(` \u21B3 ${V} \u2014 middleware aborted: ${U}`);return}}let e=w.match(/definePageMeta\s*\(\s*\{[\s\S]*?validate\s*:\s*((?:\([^)]*\)|[^,}])*(?:\{[\s\S]*?\})?)/m);if(e)try{if(!await Function("route",`
44
+ </rss>`}async function aq(q={}){let Z=Date.now();Aq();let $=await n(process.cwd()),Q=$.build||{},K=await Kq({explicit:q.domain||Q.domain,stxConfig:$});if(K.source==="fallback"&&(q.sitemap??Q.sitemap??!0))console.warn(Wq());let J={router:q.router??$?.router??{},pagesDir:q.pagesDir||Q.pagesDir||"pages",outputDir:q.outputDir||Q.outputDir||"dist",baseUrl:q.baseUrl||Q.baseUrl||"/",domain:K.url,revalidate:q.revalidate??Q.revalidate??!1,sitemap:q.sitemap??Q.sitemap??!0,sitemapExclude:q.sitemapExclude||Q.sitemapExclude||[],robots:q.robots??Q.robots??!0,rss:q.rss??Q.rss??!1,concurrency:q.concurrency||Q.concurrency||10,cache:q.cache??Q.cache??!0,cacheDir:q.cacheDir||Q.cacheDir||d(process.cwd(),"ssg-cache"),contentLoaders:q.contentLoaders||[],hooks:q.hooks||{},minify:q.minify??Q.minify??!0,generate404:q.generate404??Q.generate404??!0,publicDir:q.publicDir||Q.publicDir||"public",trailingSlash:q.trailingSlash??Q.trailingSlash??!1,cleanOutput:q.cleanOutput??Q.cleanOutput??!0,cacheSalt:q.cacheSalt??"",partialsDir:q.partialsDir||$?.partialsDir||"",componentsDir:q.componentsDir||$?.componentsDir||"",failOnIncludeError:q.failOnIncludeError??!0,chunkIslands:q.chunkIslands===!0,prefetchIslands:q.prefetchIslands===!0,integrityIslands:q.integrityIslands===!0},W={totalPages:0,successCount:0,failedCount:0,cachedCount:0,buildTime:0,pages:[],errors:[]},z=new Set,A=0,G={},X={};await J.hooks.onBuildStart?.();try{if(J.cleanOutput&&O.existsSync(J.outputDir))await O.promises.rm(J.outputDir,{recursive:!0});await O.promises.mkdir(J.outputDir,{recursive:!0});let L=J.cacheSalt;if(!L){let{resolveUserCssConfig:Y,fingerprintConfig:N}=await import("./chunk-gkq323fg.js");try{L=N(await Y(process.cwd()))}catch{}}let{prepareImageDelivery:_}=await import("./chunk-8tsr51hj.js"),F=await _(J.publicDir,J.outputDir);if(F.count>0)console.log(`Optimized ${F.count} image(s) for responsive delivery`),L=[L,F.fingerprint].filter(Boolean).join(":");let C=new wq(J.cacheDir,L);if(J.cache)await C.load();try{let{generateCss:Y}=await import("./chunk-gkq323fg.js");await Y('<div class="bg-black"></div>')}catch{}Yq();let kq=$?.routeMiddleware?.dir||"middleware";await jq(process.cwd(),kq);let p=Vq();if(p.length>0)console.log(`Loaded ${p.length} middleware: ${p.join(", ")}`);let bq=$?.routeMiddleware?.global||[];Fq($?.layoutsDir,d(process.cwd()));let i=l(".",{pagesDir:J.pagesDir,pagesDirs:$?._layerPageDirs});console.log(`Found ${i.length} routes`);let g=[];for(let Y of i){let N=await uq(Y);for(let H of N)g.push({route:Y,url:H.url,params:H.params,props:H.props,revalidate:H.revalidate??J.revalidate})}W.totalPages=g.length,console.log(`Generating ${W.totalPages} pages...`);let b=[],s=[];for(let Y=0;Y<g.length;Y+=J.concurrency)s.push(g.slice(Y,Y+J.concurrency));for(let Y of s)await Promise.all(Y.map(async(N)=>{let{route:H,url:V,params:S,props:Sq,revalidate:a}=N;try{await J.hooks.onPageStart?.(V);let w=await Bun.file(H.filePath).text(),R=JJ(w),vq=R?.middleware?Array.isArray(R.middleware)?R.middleware:[R.middleware]:[],t=[...bq,...vq];if(t.length>0){let D=Gq(V,S,R||{}),M=Lq(D,null,void 0,{isServer:!0}),E=await Nq(t,M);if(E.redirect){let U=typeof E.redirect==="string"?E.redirect:E.redirect.path||E.redirect,x=QJ(String(U),V),k=ZJ(V,J);await O.promises.mkdir(j.dirname(k),{recursive:!0}),await Bun.write(k,x),W.successCount++,W.pages.push({route:V,outputPath:k,size:Buffer.byteLength(x),cached:!1}),b.push({loc:V,lastmod:new Date().toISOString()}),console.log(` \u21B3 ${V} \u2192 redirect to ${U}`);return}if(E.abort){let U=typeof E.abort==="string"?E.abort:E.abort?.error?.message||"aborted";console.warn(` \u21B3 ${V} \u2014 middleware aborted: ${U}`);return}}let e=w.match(/definePageMeta\s*\(\s*\{[\s\S]*?validate\s*:\s*((?:\([^)]*\)|[^,}])*(?:\{[\s\S]*?\})?)/m);if(e)try{if(!await Function("route",`
45
45
  const validate = ${e[1]};
46
46
  return validate(route);
47
47
  `)({params:S})){console.warn(`Validation failed for ${V}, skipping...`);return}}catch{}let I=null,qq=!1;if(J.cache){if(I=C.get(V,H.filePath),I)qq=!0,W.cachedCount++}if(!I){let D=await Mq(H,S,Sq,J,$);if(I=D.html,J.failOnIncludeError&&D.includeFailures.length>0)throw Error(`${D.includeFailures.length} include(s) failed to resolve, so this page would have shipped with an error banner where the markup should be:
package/dist/stx.d.ts CHANGED
@@ -592,6 +592,10 @@ declare function usePreferredDark(): ReturnType<typeof useMediaQuery>
592
592
  declare function usePreferredLight(): ReturnType<typeof useMediaQuery>
593
593
  declare function usePreferredReducedMotion(): ReturnType<typeof useMediaQuery>
594
594
  declare function usePreferredContrast(): ReturnType<typeof useMediaQuery>
595
+ /** `document.visibilityState`, kept current; `'visible'` or `'hidden'`. */
596
+ declare function useDocumentVisibility(): StxSignal<DocumentVisibilityState> & {
597
+ readonly value: DocumentVisibilityState
598
+ }
595
599
 
596
600
  // ============================================================================
597
601
  // Head / SEO
@@ -0,0 +1,67 @@
1
+ /**
2
+ * A substituted value cannot introduce a URL scheme the page did not ask for.
3
+ *
4
+ * `{{ }}` escapes HTML, which stops a value closing its attribute or opening a
5
+ * tag -- and says nothing about what the attribute means. `javascript:alert(1)`
6
+ * contains no character escaping touches, so
7
+ * `<a href="{{ url }}">` with a stored URL ran script on click, from a value a
8
+ * person typed. The same goes for `vbscript:` (old Edge, still shipped in
9
+ * Windows-embedded browsers) and for `data:text/html`, which navigates to a
10
+ * document the attacker wrote, on the page's own origin in some browsers.
11
+ *
12
+ * What is *not* here matters as much:
13
+ *
14
+ * - **Only the scheme position.** `href="/search?q={{ term }}"` is left alone:
15
+ * a scheme can only be at the start of a URL, so a value substituted after
16
+ * anything else cannot introduce one.
17
+ * - **Only URL attributes.** `title="{{ text }}"` keeps every byte. A value is
18
+ * rewritten only where the browser would resolve it as a URL.
19
+ * - **`{!! !!}` is untouched**, as it is for HTML: the raw form is how a
20
+ * template says it vouches for the value, and a sanitizer with no way out is
21
+ * one people work around.
22
+ * - **`data:image/...` still loads**, which `<StxImage>`'s own blur placeholder
23
+ * needs; only the data URLs that carry a document are refused.
24
+ *
25
+ * Refused values are prefixed rather than emptied, the way Angular does it: the
26
+ * value stays visible in the DOM and in view-source, so the person debugging it
27
+ * sees what was blocked instead of an attribute that mysteriously went away,
28
+ * and `unsafe:javascript:alert(1)` is an unknown scheme, so a click does
29
+ * nothing.
30
+ */
31
+ /** What a refused value is rewritten to, so it is inert but still readable. */
32
+ export declare const UNSAFE_URL_PREFIX = "unsafe:";
33
+ /** Which policy an attribute name gets, or null when it holds no URL. */
34
+ export declare function urlAttributeKind(name: string): 'navigable' | 'fetched' | null;
35
+ /** Whether this value would introduce a scheme the attribute must not follow. */
36
+ export declare function isDangerousUrl(value: string, kind?: 'navigable' | 'fetched'): boolean;
37
+ /** The value as it may be written, refused ones prefixed to make them inert. */
38
+ export declare function sanitizeUrlValue(value: string, kind?: 'navigable' | 'fetched'): string;
39
+ /**
40
+ * The attribute a substitution at the end of `before` is landing in the scheme
41
+ * position of, or null.
42
+ *
43
+ * `before` is everything already written, so its tail says where the next
44
+ * characters go: inside an open quoted attribute value, with nothing before
45
+ * them in that value. Anything already written into the value means the
46
+ * substitution cannot be the scheme, and an unquoted value is not matched --
47
+ * the interpolation passes write quoted attributes.
48
+ */
49
+ export declare function urlSchemePosition(before: string): 'navigable' | 'fetched' | null;
50
+ /**
51
+ * The tail of the already-written output that a scheme check needs.
52
+ *
53
+ * A page can hold hundreds of substitutions, and slicing the whole output at
54
+ * each one is quadratic -- one of the compile budgets in
55
+ * scripts/performance-budgets.ts is what would notice. Only the enclosing tag's
56
+ * last attribute matters, so a window is enough.
57
+ */
58
+ export declare function schemeWindow(output: string, offset: number, span?: number): string;
59
+ /**
60
+ * Decide the final text for a value that was just substituted: `escaped` as it
61
+ * is, or prefixed when it landed in the scheme position of a URL attribute and
62
+ * introduces a scheme that attribute must not follow.
63
+ *
64
+ * The decision reads the raw value, not the escaped one, so it is testing what
65
+ * the browser will resolve rather than what the HTML escape happened to leave.
66
+ */
67
+ export declare function sanitizeSubstitutedUrl(before: string, raw: string, escaped?: string): string;
@@ -0,0 +1,40 @@
1
+ export const UNSAFE_URL_PREFIX = "unsafe:";
2
+ const NAVIGABLE = "href|xlink:href|action|formaction|ping|cite|manifest|data|to", FETCHED = "src|srcset|poster|background", SCRIPT_SCHEME = /^(?:javascript|vbscript|livescript|mocha|view-source):/, DOCUMENT_DATA = /^data:(?:text\/html|text\/xml|application\/xhtml\+xml|application\/xml|image\/svg\+xml)/, FETCHED_DATA = /^data:(?:text\/html|application\/xhtml\+xml)/, STRIPPED = new RegExp("[\\u0000-\\u0020\\u00A0\\u1680\\u2000-\\u200F\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF]+", "g");
3
+ function normalizeScheme(value) {
4
+ return value.replace(STRIPPED, "").toLowerCase();
5
+ }
6
+ export function urlAttributeKind(name) {
7
+ const lower = name.toLowerCase();
8
+ if (new RegExp(`^(?:${NAVIGABLE})$`).test(lower))
9
+ return "navigable";
10
+ if (new RegExp(`^(?:${FETCHED})$`).test(lower))
11
+ return "fetched";
12
+ return null;
13
+ }
14
+ export function isDangerousUrl(value, kind = "navigable") {
15
+ const normalized = normalizeScheme(value);
16
+ if (SCRIPT_SCHEME.test(normalized))
17
+ return !0;
18
+ return kind === "navigable" ? DOCUMENT_DATA.test(normalized) : FETCHED_DATA.test(normalized);
19
+ }
20
+ export function sanitizeUrlValue(value, kind = "navigable") {
21
+ return isDangerousUrl(value, kind) ? UNSAFE_URL_PREFIX + value : value;
22
+ }
23
+ export function urlSchemePosition(before) {
24
+ const open = before.match(/(?:^|[\s"'`/])([A-Za-z][\w:-]*)\s*=\s*(["'])([^"']*)$/);
25
+ if (!open)
26
+ return null;
27
+ if (open[3].trim() !== "")
28
+ return null;
29
+ return urlAttributeKind(open[1]);
30
+ }
31
+ export function schemeWindow(output, offset, span = 256) {
32
+ if (offset <= span)
33
+ return output.slice(0, offset);
34
+ const window = output.slice(offset - span, offset), boundary = window.search(/[\s"'`/]/);
35
+ return boundary === -1 ? "" : window.slice(boundary);
36
+ }
37
+ export function sanitizeSubstitutedUrl(before, raw, escaped = raw) {
38
+ const kind = urlSchemePosition(before);
39
+ return kind && isDangerousUrl(raw, kind) ? UNSAFE_URL_PREFIX + escaped : escaped;
40
+ }
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import"./chunk-5g6rprcy.js";import B from"fs";import $ from"path";import k from"crypto";var V=[{name:"mobile",width:375,height:667,isMobile:!0,hasTouch:!0},{name:"tablet",width:768,height:1024,isMobile:!0,hasTouch:!0},{name:"desktop",width:1280,height:800,isMobile:!1,hasTouch:!1},{name:"wide",width:1920,height:1080,isMobile:!1,hasTouch:!1}];function J(N={}){let Y={snapshotDir:N.snapshotDir||"__snapshots__",screenshotDir:N.screenshotDir||"__screenshots__",updateSnapshots:N.updateSnapshots||process.env.UPDATE_SNAPSHOTS==="true",threshold:N.threshold??0.01,viewports:N.viewports||V,generateDiff:N.generateDiff??!0,diffDir:N.diffDir||"__diffs__",compare:N.compare||b,ci:N.ci??process.env.CI==="true",retries:N.retries??(N.ci?3:1)};return{async snapshot(M,X){let q=$.join(Y.snapshotDir,`${X}.html`),G=C(M),Q=K(G);if(await Bun.file(q).exists()){let W=await Bun.file(q).text(),Z=K(C(W));if(Q===Z)return{passed:!0,snapshotPath:q,message:"Snapshot matches"};if(Y.updateSnapshots)return await B.promises.mkdir($.dirname(q),{recursive:!0}),await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"Snapshot updated"};let F=$.join(Y.diffDir,`${X}.actual.html`),U=$.join(Y.diffDir,`${X}.diff.html`);return await B.promises.mkdir(Y.diffDir,{recursive:!0}),await Bun.write(F,G),await Bun.write(U,I(W,G)),{passed:!1,snapshotPath:q,actualPath:F,diffPath:U,message:"Snapshot does not match"}}return await B.promises.mkdir($.dirname(q),{recursive:!0}),await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"New snapshot created"}},async snapshotJson(M,X){let q=$.join(Y.snapshotDir,`${X}.json`),G=JSON.stringify(M,null,2);if(await Bun.file(q).exists()){let Q=await Bun.file(q).text();if(G===Q)return{passed:!0,snapshotPath:q};if(Y.updateSnapshots)return await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"Snapshot updated"};return{passed:!1,snapshotPath:q,message:`JSON snapshot mismatch:
2
+ import"./chunk-p5d8sb50.js";import B from"fs";import $ from"path";import k from"crypto";var V=[{name:"mobile",width:375,height:667,isMobile:!0,hasTouch:!0},{name:"tablet",width:768,height:1024,isMobile:!0,hasTouch:!0},{name:"desktop",width:1280,height:800,isMobile:!1,hasTouch:!1},{name:"wide",width:1920,height:1080,isMobile:!1,hasTouch:!1}];function J(N={}){let Y={snapshotDir:N.snapshotDir||"__snapshots__",screenshotDir:N.screenshotDir||"__screenshots__",updateSnapshots:N.updateSnapshots||process.env.UPDATE_SNAPSHOTS==="true",threshold:N.threshold??0.01,viewports:N.viewports||V,generateDiff:N.generateDiff??!0,diffDir:N.diffDir||"__diffs__",compare:N.compare||b,ci:N.ci??process.env.CI==="true",retries:N.retries??(N.ci?3:1)};return{async snapshot(M,X){let q=$.join(Y.snapshotDir,`${X}.html`),G=C(M),Q=K(G);if(await Bun.file(q).exists()){let W=await Bun.file(q).text(),Z=K(C(W));if(Q===Z)return{passed:!0,snapshotPath:q,message:"Snapshot matches"};if(Y.updateSnapshots)return await B.promises.mkdir($.dirname(q),{recursive:!0}),await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"Snapshot updated"};let F=$.join(Y.diffDir,`${X}.actual.html`),U=$.join(Y.diffDir,`${X}.diff.html`);return await B.promises.mkdir(Y.diffDir,{recursive:!0}),await Bun.write(F,G),await Bun.write(U,I(W,G)),{passed:!1,snapshotPath:q,actualPath:F,diffPath:U,message:"Snapshot does not match"}}return await B.promises.mkdir($.dirname(q),{recursive:!0}),await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"New snapshot created"}},async snapshotJson(M,X){let q=$.join(Y.snapshotDir,`${X}.json`),G=JSON.stringify(M,null,2);if(await Bun.file(q).exists()){let Q=await Bun.file(q).text();if(G===Q)return{passed:!0,snapshotPath:q};if(Y.updateSnapshots)return await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"Snapshot updated"};return{passed:!1,snapshotPath:q,message:`JSON snapshot mismatch:
3
3
  ${z(Q,G)}`}}return await B.promises.mkdir($.dirname(q),{recursive:!0}),await Bun.write(q,G),{passed:!0,snapshotPath:q,message:"New snapshot created"}},matchInlineSnapshot(M,X){let q=C(M);if(X===void 0)return{passed:!0,expected:q};let G=C(X);return{passed:q===G,expected:q}},getConfig(){return Y}}}function D(N={}){let Y=J(N),M=Y.getConfig();return{async compareScreenshots(X,q,G="desktop"){let Q=$.join(M.screenshotDir,G,`${X}.png`),W=$.join(M.diffDir,G,`${X}.actual.png`),Z=$.join(M.diffDir,G,`${X}.diff.png`);if(await Bun.file(Q).exists()){let F=await Bun.file(Q).arrayBuffer(),U=Buffer.from(F),_=await M.compare(q,U);if(_.match||_.diffPercentage<=M.threshold)return{viewport:G,passed:!0,baselinePath:Q};if(M.updateSnapshots)return await B.promises.mkdir($.dirname(Q),{recursive:!0}),await Bun.write(Q,q),{viewport:G,passed:!0,baselinePath:Q};if(await B.promises.mkdir($.dirname(W),{recursive:!0}),await Bun.write(W,q),_.diffImage&&M.generateDiff)await Bun.write(Z,_.diffImage);return{viewport:G,passed:!1,baselinePath:Q,actualPath:W,diffPath:M.generateDiff?Z:void 0,diffPercentage:_.diffPercentage}}return await B.promises.mkdir($.dirname(Q),{recursive:!0}),await Bun.write(Q,q),{viewport:G,passed:!0,baselinePath:Q}},async testViewports(X,q,G=M.viewports){let Q=[];for(let W of G){let Z=null;for(let F=0;F<M.retries;F++)try{let U=await q(W),_=await this.compareScreenshots(X,U,W.name);Q.push(_),Z=null;break}catch(U){if(Z=U,F<M.retries-1)await new Promise((_)=>setTimeout(_,100*(F+1)))}if(Z)Q.push({viewport:W.name,passed:!1,baselinePath:"",diffPercentage:100})}return Q},getSnapshotTester(){return Y}}}function L(N={}){let M=D(N).getSnapshotTester(),X=new Map;return{addStory(q){X.set(`${q.component}/${q.name}`,q)},addStories(q){for(let G of q)this.addStory(G)},getStories(){return Array.from(X.values())},getStoriesForComponent(q){return Array.from(X.values()).filter((G)=>G.component===q)},async testStory(q){let G=X.get(q);if(!G)return{name:q,passed:!1,duration:0,snapshots:[],screenshots:[],errors:[Error(`Story not found: ${q}`)]};let Q=Date.now(),W={name:q,passed:!0,duration:0,snapshots:[],screenshots:[],errors:[]};try{let Z=await G.render(),F=await M.snapshot(Z,q.replace(/\//g,"-"));if(W.snapshots.push(F),!F.passed)W.passed=!1}catch(Z){W.passed=!1,W.errors.push(Z)}return W.duration=Date.now()-Q,W},async testAllStories(){let q=[];for(let G of X.keys()){let Q=await this.testStory(G);q.push(Q)}return q},async generateStoryIndex(){let q={};for(let G of X.values()){if(!q[G.component])q[G.component]=[];q[G.component].push({name:G.name,args:G.args})}return JSON.stringify(q,null,2)}}}async function S(N,Y={}){let M={outputDir:Y.outputDir||"visual-test-report",format:Y.format||"html",title:Y.title||"Visual Test Report",includeScreenshots:Y.includeScreenshots??!0};await B.promises.mkdir(M.outputDir,{recursive:!0});let X=N.length,q=N.filter((F)=>F.passed).length,G=X-q,Q=N.reduce((F,U)=>F+U.duration,0);if(M.format==="json"){let F={title:M.title,summary:{total:X,passed:q,failed:G,duration:Q},results:N,generatedAt:new Date().toISOString()},U=$.join(M.outputDir,"report.json");return await Bun.write(U,JSON.stringify(F,null,2)),U}if(M.format==="markdown"){let F=`# ${M.title}
4
4
 
5
5
  `;F+=`## Summary
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/stx",
3
3
  "type": "module",
4
- "version": "0.2.339",
4
+ "version": "0.2.341",
5
5
  "description": "A performant UI Framework. Powered by Bun.",
6
6
  "author": "Chris Breuer <chris@stacksjs.org>",
7
7
  "license": "MIT",
@@ -117,12 +117,12 @@
117
117
  "dependencies": {
118
118
  "@stacksjs/ts-css": "^0.3.2",
119
119
  "@stacksjs/clapp": "^0.2.16",
120
- "@stacksjs/desktop": "0.2.339",
121
- "@stacksjs/sanitizer": "0.2.339",
120
+ "@stacksjs/desktop": "0.2.341",
121
+ "@stacksjs/sanitizer": "0.2.341",
122
122
  "@stacksjs/ts-i18n": "^0.1.11",
123
- "bun-plugin-stx": "0.2.339",
123
+ "bun-plugin-stx": "0.2.341",
124
124
  "bunfig": "^0.15.19",
125
- "stx-router": "0.2.339",
125
+ "stx-router": "0.2.341",
126
126
  "ts-broadcasting": "^0.0.10",
127
127
  "ts-images": "^0.2.22",
128
128
  "ts-syntax-highlighter": "^0.2.1"
package/stx.d.ts CHANGED
@@ -592,6 +592,10 @@ declare function usePreferredDark(): ReturnType<typeof useMediaQuery>
592
592
  declare function usePreferredLight(): ReturnType<typeof useMediaQuery>
593
593
  declare function usePreferredReducedMotion(): ReturnType<typeof useMediaQuery>
594
594
  declare function usePreferredContrast(): ReturnType<typeof useMediaQuery>
595
+ /** `document.visibilityState`, kept current; `'visible'` or `'hidden'`. */
596
+ declare function useDocumentVisibility(): StxSignal<DocumentVisibilityState> & {
597
+ readonly value: DocumentVisibilityState
598
+ }
595
599
 
596
600
  // ============================================================================
597
601
  // Head / SEO
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Co as a,Do as b,Eo as c,Fo as d,Go as e,Ho as f,Io as g,Jo as h,Ko as i,Lo as j,Mo as k}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{b as stripTypeScript,i as splitDeclaration,d as isSyntaxFailure,c as isModuleResolutionFailure,e as isMissingBindingFailure,g as isCompleteImport,k as hasVariables,f as extractVariables,j as extractScriptFromTemplate,h as convertToCommonJS,a as STX_ENGINE_BINDING_NAMES};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Hi as a,Ii as b}from"./chunk-e2emz8yb.js";import"./chunk-7we3xfde.js";import"./chunk-wdvee4kr.js";import"./chunk-156j37tv.js";import"./chunk-mjf3xmxn.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{a as getStoreScript,b as clearStoreCache};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Le as c,Me as d,Ne as e,Oe as f,Pe as g,Qe as h}from"./chunk-rzayq0ht.js";import"./chunk-63xv0h5e.js";import"./chunk-7we3xfde.js";import{Kp as a,Np as b}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{d as virtualPathFor,g as typecheckStxFiles,e as sourcePathFor,h as formatTypecheckDiagnostics,f as findRuntimeTypeDeclarations,b as extractTemplateExpressions,a as extractScriptBlocks,c as buildVirtualSource};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{ei as a,fi as b,gi as c}from"./chunk-63xv0h5e.js";import"./chunk-7we3xfde.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{a as listComposableModules,b as getComposableScript,c as clearComposableCache};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{fo as b,go as c,ho as d}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import{Ju as a}from"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{b as rendersAsElement,c as processESImports,d as processComponents,a as freeIdentifiers};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{yf as a,zf as b}from"./chunk-m11pb9cx.js";import"./chunk-xe6zmdfq.js";import"./chunk-5g6rprcy.js";export{a as handleImageRequest,b as createImageHandler};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{$k as e,Xk as a,Yk as b,Zk as c,_k as d,al as f,bl as g,cl as h,dl as i,el as j,fl as k,gl as l,hl as m,il as n,jl as o}from"./chunk-wdvee4kr.js";import"./chunk-156j37tv.js";import"./chunk-mjf3xmxn.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{o as tempBuildName,b as shouldLogBundlerDiagnostics,f as setBundlerFallbackMode,l as rewriteRegistryImports,g as resolveBundlerFallback,j as registryIdForPath,c as recordBundleFailure,m as queueClientBundleBuild,k as normalizeRegistrySpecifiers,h as hasUserImports,d as getBundleFailures,a as clientBundleDependencies,e as clearBundleFailures,n as bundleClientScript,i as MODULE_SPECIFIER_PREFIX};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{$l as e,Xl as c,_l as d,am as f,bm as g,cm as h,dm as i,em as j,fm as k,gm as l,hm as m,im as n}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import{js as a,ks as b}from"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{h as transformAutoImports,b as stripCommentsAndLiterals,e as renderVendorStyleTags,i as referencesName,n as processClientScript,g as injectBrowserCoreAutoImports,m as generateServerDataBridge,k as generateBrowserAutoImportDestructuring,j as generateAutoImportDestructuring,a as findInterpolationEnd,l as extractBridgeData,d as extractAndStripCssImports,f as STX_AUTO_IMPORTS,c as BROWSER_CORE_IMPORTS};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{$p as k,Ho as a,Jo as b,Lo as c,Mo as d,Vp as e,Wp as f,Xp as g,Yp as h,Zp as i,_p as j,aq as l,bq as m,cq as n,dq as o,eq as p,fq as q,gq as r,hq as s,iq as t,jq as u,kq as v,lq as w,mq as x}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{e as validateTemplate,g as validateDirective,n as userComponentFileExists,m as transpileTypeScript,p as slotContentHasExpressions,k as shouldTranspileTypeScript,t as resolveTemplatePath,r as renderComponentWithSlot,j as isJavaScriptScript,o as isHydrateTrigger,d as hasVariables,h as hasDirectives,u as getSourceLineInfo,l as getSharedTranspiler,f as getPositionInfo,x as getComponentCacheStats,s as fileExists,a as extractVariables,c as extractScriptFromTemplate,i as extractDirectiveNames,v as createDetailedErrorMessage,b as convertToCommonJS,q as componentClientSignalNames,w as clearComponentCache};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Kg as a,Lg as b,Mg as c,Ng as d,Og as e,Pg as f}from"./chunk-az4mq459.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{c as renderSlot,d as processSlots,a as parseSlots,b as parseSlotElement,e as extractSlotContent,f as applySlots};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Ye as a}from"./chunk-wdq75f5k.js";import"./chunk-7qawmh8w.js";import"./chunk-57atgbyq.js";import"./chunk-156j37tv.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{a as startProductionServer};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{pr as a,qr as b,rr as c,sr as d,tr as e,ur as f}from"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{f as validateConfig,b as resolveStxDirectories,c as loadStxConfig,e as defineStxConfig,a as defaultConfig,d as config};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{bv as a,cv as b}from"./chunk-2tjk867y.js";import"./chunk-5g6rprcy.js";export{a as transformStoreImports,b as stripModuleImports};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{At as a,Bt as b}from"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-5g6rprcy.js";export{a as prepareRuntimeConfig,b as generateRuntimeConfigTypes};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Wf as a}from"./chunk-zm8b6e9n.js";import"./chunk-7qawmh8w.js";import"./chunk-57atgbyq.js";import"./chunk-tsmdmf5h.js";import"./chunk-e4g8wz6t.js";import"./chunk-axqfm9b4.js";import"./chunk-156j37tv.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{a as buildForProduction};
@@ -1,3 +0,0 @@
1
- // @bun
2
- import y from"fs";import V from"path";var B=/\b(?:state|derived|effect|ref|reactive|computed|watch|watchEffect|useModel)\s*(?:<[^<>()]*>)?\s*\(/,X=/(?:^|\n)\s*(?:import|export)\s+(?:[^'"]*?\sfrom\s+)?['"](\.[^'"]*)['"]/g,D=["",".ts",".tsx",".js",".jsx",".mts",".mjs","/index.ts","/index.js"],g=3;function H(j,q){let J=V.resolve(V.dirname(q),j);for(let Q of D){let z=J+Q;try{if(y.statSync(z).isFile())return z}catch{}}return null}function K(j,q,J=0,Q=new Set){if(!q||J>=g)return!1;for(let z of j.matchAll(X)){let Z=H(z[1],q);if(!Z||Q.has(Z))continue;Q.add(Z);let $;try{$=y.readFileSync(Z,"utf8")}catch{continue}if(B.test($))return!0;if(K($,Z,J+1,Q))return!0}return!1}var Y=["batch","clearServerData","computed","configureFetch","defineEmits","defineExpose","definePageMeta","defineProps","defineSlots","defineStore","derived","effect","goBack","goForward","inject","invalidateRoute","isDerived","isSignal","navigate","nextTick","onBeforeMount","onBeforeUnmount","onDestroy","onMount","onMounted","onUnmounted","peek","provide","reactive","ref","refresh","registerStoresClient","setRouteParams","state","untrack","useAsync","useClickOutside","useColorMode","useCookie","useCounter","useDark","useDebounce","useDebouncedValue","useEventListener","useFetch","useFocus","useHead","useId","useInterval","useLocalStorage","useMediaQuery","useModel","useMutation","useOptimistic","usePreferredContrast","usePreferredDark","usePreferredLight","usePreferredReducedMotion","useQuery","useReactiveProp","useRef","useRoute","useRouteParam","useRouteParams","useScrollLock","useSearchParams","useSeoMeta","useSessionStorage","useSlots","useStore","useThrottle","useTimeout","useToggle","useWebSocket","watch","watchEffect","watchMultiple","withDefaults"],R=["onMount","onDestroy"];function A(j="const",q=[],J){let Q=q.length?Y.filter((z)=>!q.includes(z)):Y;if(J!==void 0)Q=Q.filter((z)=>{let Z=z.replace(/[$()*+.?[\\\]^{|}-]/g,"\\$&");return new RegExp(`(^|[^\\w$])${Z}(?![\\w$])`).test(J)});return`${j} { ${Q.join(", ")} } = window.stx;`}var k=["defineEmits","defineExpose","definePageMeta","defineProps","defineSlots","withDefaults"],E={useServerData:{category:"server-only",reason:"loads and serializes request-scoped data from <script server>; clients consume it through a keyed useFetch/useAsyncData."},redirect:{category:"server-only",reason:"returns an HTTP Response for <script server>/edge/build; use navigate() on the client."},useAsyncData:{category:"browser-composable",reason:"inlined on demand from src/composables when a script references it; reachable, not a bare global."},Teleport:{category:"compile-time-directive",reason:"template tag resolved by processTeleportDirectives; not a script callable."},StxModalBuiltin:{category:"builtin-component",reason:"builtin component used as a template tag; drive open/close from the modal store."},StxToastBuiltin:{category:"builtin-component",reason:"builtin component used as a template tag; push toasts via the toast store."},useForm:{category:"browser-composable",reason:"reactive form primitive; lives in src/composables/use-form.ts and is inlined on demand when a <script client> references it (#1846)."},defineForm:{category:"browser-composable",reason:"deprecated alias of useForm, kept for a minor (#1843). Same delivery path \u2014 inlined on demand from src/composables/use-form.ts."},validateFields:{category:"isomorphic-import",reason:"pure validation helper; import it directly, not auto-delivered to <script client> (per client-api-delivery.test.ts)."},validateField:{category:"isomorphic-import",reason:"singular pure validation helper; same explicit-import boundary as validateFields."}},x=Y.filter((j)=>!k.includes(j));function O(j){if(!j)return!1;return x.some((q)=>new RegExp(`\\b${q}\\s*(?:<[^>]*>)?\\s*\\(`).test(j))}var M=[/@if\s*=/,/@for\s*=/,/@show\s*=/,/@model\s*=/,/@bind:/,/@class\s*=/,/@style\s*=/,/\bx-data\s*=/,/\bstate\s*(?:<[^>]*>)?\s*\(/,/\bderived\s*(?:<[^>]*>)?\s*\(/,/\beffect\s*(?:<[^>]*>)?\s*\(/,/\bref\s*(?:<[^>]*>)?\s*\(/,/\bcomputed\s*(?:<[^>]*>)?\s*\(/,/\breactive\s*(?:<[^>]*>)?\s*\(/,/\bwatch\s*(?:<[^>]*>)?\s*\(/,/\bwatchEffect\s*(?:<[^>]*>)?\s*\(/,/\s:[a-z][\w-]*\s*=\s*["']/i,/\s:(?:if|else-if|else|for|show|text|html|model)\s*=/,/data-stx(?:-auto)?(?![-\w])/,/data-stx-scoped/],C=/\s@[a-z][\w.:-]*\s*=/i;function T(j,q){if(!j)return!1;let J=U(j);return F(J,q)}function F(j,q){if(M.some((J)=>J.test(j)))return!0;if(O(j))return!0;return P(j,q)}function P(j,q){if(!q)return!1;for(let J of j.matchAll(/<script\b(?![^>]*\bserver\b)(?![^>]*\bsrc\s*=)[^>]*>([\s\S]*?)<\/script\s*>/gi))if(K(J[1],q))return!0;return!1}function d(j,q){if(!j)return!1;let J=U(j);return C.test(J)||F(J,q)}var u=["if","else-if","elseif","else","for","show","key","text","html","model","ref"];function _(j){return u.includes(j.toLowerCase())}var G=["x-text","x-html","x-model","x-show","x-if","x-for","x-cloak","x-ref","x-data","x-bind","x-class","x-style","x-tooltip","x-tooltip-position"],b=["x-init","x-transition","x-effect","x-on"],p=[...G,...b];function c(){return`{${G.map((j)=>`'${j}':1`).join(",")}}`}var v=65536,S=4,w=new Map;function r(){w.clear()}function U(j){if(!j)return j;if(!j.includes("<!--")&&!/<(?:pre|code)\b/i.test(j))return j;let q=j.length>=v;if(q){let z=w.get(j);if(z!==void 0)return z}let J=(z)=>z.replace(/(<[^>]*>)|([^<]+)/g,(Z,$,W)=>$??" ".repeat(W.length)),Q=j.replace(/(<pre\b[^>]*>)([\s\S]*?)(<\/pre>)/gi,(z,Z,$,W)=>Z+J($)+W).replace(/(<code\b[^>]*>)([\s\S]*?)(<\/code>)/gi,(z,Z,$,W)=>Z+J($)+W).replace(/<!--[\s\S]*?-->/g,(z)=>" ".repeat(z.length));if(q){while(w.size>=S){let z=w.keys().next();if(z.done)break;w.delete(z.value)}w.set(j,Q)}return Q}
3
- export{K as fv,Y as gv,R as hv,A as iv,k as jv,E as kv,x as lv,O as mv,T as nv,d as ov,u as pv,_ as qv,G as rv,b as sv,p as tv,c as uv,r as vv,U as wv};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{kl as a,ll as b,ml as c,nl as d,ol as e,pl as f,ql as g}from"./chunk-156j37tv.js";import"./chunk-7r79j1hs.js";import"./chunk-vaggjvsm.js";import"./chunk-k3dtvay1.js";import"./chunk-d6yyzpsv.js";import"./chunk-5g6rprcy.js";export{e as productionApiDispatcher,g as isServerApiSource,b as generateApiTypes,a as discoverServerApi,f as createServerApi,d as createApiDispatcher,c as buildServerApi};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Te as a}from"./chunk-1q6xc3m2.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{a as startInteractive};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Rk as a,Sk as b,Tk as c,Uk as d,Vk as e}from"./chunk-64qg8jes.js";import"./chunk-5g6rprcy.js";export{b as injectPwaTags,e as generateThemeColorMeta,c as generateSwRegistrationScript,a as generatePwaTags,d as generateManifestLink};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Mi as a,Ni as b,Oi as c,Pi as d,Qi as e,Ri as f,Si as g,Ti as h,Ui as i,Vi as j,Wi as k,Xi as l,Yi as m,Zi as n}from"./chunk-6n1qbh78.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{i as streamingSuspenseDirective,m as streamToResponse,g as streamTemplateSimple,a as streamTemplate,d as renderStreamingPage,k as registerStreamingDirectives,e as processStreamDirectives,l as processSectionDirectives,j as islandDirective,n as generateHydrationRuntime,f as extractStreamBoundaries,h as createStreamRenderer,b as buildSuspenseResolveScript,c as SUSPENSE_RESOLVER_RUNTIME};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{di as a}from"./chunk-g6czgcg4.js";import"./chunk-5g6rprcy.js";export{a as rewriteImagesWithSiblings};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Dk as a,Ek as b,Fk as c,Gk as d,Hk as e}from"./chunk-28q3vycz.js";import"./chunk-5g6rprcy.js";export{d as runPwaAudit,e as formatAuditResult,c as calculateAuditResult,a as auditConfig,b as auditBuildOutput};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Jj as b,Kj as c,Lj as d,Mj as e,Nj as f,Oj as g,Pj as h,Qj as i,Rj as j,Sj as k,Tj as l,Uj as m}from"./chunk-q1xcd8jg.js";import{rl as a}from"./chunk-mjf3xmxn.js";import"./chunk-vafj091j.js";import"./chunk-d7zxg9bp.js";import"./chunk-t00ga194.js";import"./chunk-hrdd26r4.js";import"./chunk-7r79j1hs.js";import"./chunk-ay336sqb.js";import"./chunk-pswhshrp.js";import"./chunk-vaggjvsm.js";import"./chunk-q9ckfwhh.js";import"./chunk-zfz3s2gd.js";import"./chunk-k3dtvay1.js";import"./chunk-aved735s.js";import"./chunk-799s9mwc.js";import"./chunk-7r80apc5.js";import"./chunk-2tjk867y.js";import"./chunk-t8ctvjqe.js";import"./chunk-deqnt1w5.js";import"./chunk-d6yyzpsv.js";import"./chunk-wb90259a.js";import"./chunk-5g6rprcy.js";export{b as templateCache,c as readFileCached,e as invalidateFileCacheByDir,d as invalidateFileCache,m as hashFilePath,i as getServeClientAsset,g as getCachedSignalsRuntime,h as getCachedRouterScript,j as clearDevCaches,k as checkCache,l as cacheTemplate,a as cacheEngineFingerprint,f as __setSignalsGeneratorsForTest};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{Vj as a,Wj as b,Xj as c,Yj as d}from"./chunk-xy4jt4ek.js";import"./chunk-5g6rprcy.js";export{d as default,c as createHotReloadServer,b as compileToNative,a as NATIVE_COMPONENTS};
@@ -1,2 +0,0 @@
1
- // @bun
2
- import{hi as a}from"./chunk-1z1efvtw.js";import"./chunk-5g6rprcy.js";export{a as processDeferDirectives};