@stacksjs/stx 0.2.95 → 0.2.96

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 (612) hide show
  1. package/dist/a11y.js +598 -2
  2. package/dist/analytics.js +159 -2
  3. package/dist/analyzer.js +240 -2
  4. package/dist/animation.js +688 -2
  5. package/dist/app-shell.js +220 -2
  6. package/dist/app.js +79 -2
  7. package/dist/assets.js +155 -2
  8. package/dist/ast.js +630 -2
  9. package/dist/async-components.js +428 -2
  10. package/dist/auth.js +12 -2
  11. package/dist/broadcasting.js +102 -2
  12. package/dist/browser-composables.js +565 -2
  13. package/dist/build-assets.js +29 -2
  14. package/dist/build-mode-detector.js +50 -2
  15. package/dist/build-optimizer.js +433 -2
  16. package/dist/build-views.js +180 -2
  17. package/dist/build.js +33 -2
  18. package/dist/builtins/drawer.js +37 -2
  19. package/dist/builtins/escape.js +3 -2
  20. package/dist/builtins/icon.js +83 -2
  21. package/dist/builtins/index.js +34 -2
  22. package/dist/builtins/modal.js +38 -2
  23. package/dist/builtins/safe-image.js +51 -2
  24. package/dist/builtins/stx-image.js +200 -2
  25. package/dist/builtins/stx-link.js +41 -2
  26. package/dist/builtins/stx-loading-indicator.js +35 -2
  27. package/dist/builtins/suspense.js +24 -2
  28. package/dist/builtins/toast.js +42 -2
  29. package/dist/builtins/tooltip.js +106 -2
  30. package/dist/builtins/transition-group.js +22 -2
  31. package/dist/bundle-analyzer/collector.js +233 -2
  32. package/dist/bundle-analyzer/index.js +82 -2
  33. package/dist/bundle-analyzer/report.js +318 -2
  34. package/dist/bundle-analyzer/treemap.js +594 -2
  35. package/dist/caching.js +131 -2
  36. package/dist/cli.js +11317 -10982
  37. package/dist/client/directive.js +14 -2
  38. package/dist/client/index.js +2 -2
  39. package/dist/client-helpers.js +312 -2
  40. package/dist/client-script-bundler.js +216 -6
  41. package/dist/client-script.js +754 -2
  42. package/dist/client.js +73 -4
  43. package/dist/component-hmr.js +585 -2
  44. package/dist/component-library.d.ts +6 -0
  45. package/dist/component-library.js +683 -0
  46. package/dist/component-processing.js +613 -2
  47. package/dist/component-registry.js +90 -2
  48. package/dist/component-renderer.js +660 -2
  49. package/dist/components.js +213 -2
  50. package/dist/composables/index.js +220 -2
  51. package/dist/composables/use-battery.js +101 -2
  52. package/dist/composables/use-broadcast-channel.js +80 -2
  53. package/dist/composables/use-channel.js +124 -2
  54. package/dist/composables/use-clipboard.js +79 -2
  55. package/dist/composables/use-color-mode.js +131 -2
  56. package/dist/composables/use-cookie.js +86 -2
  57. package/dist/composables/use-device-orientation.js +181 -2
  58. package/dist/composables/use-event-listener.js +27 -2
  59. package/dist/composables/use-event-source.js +166 -2
  60. package/dist/composables/use-eye-dropper.js +142 -2
  61. package/dist/composables/use-fetch.js +223 -2
  62. package/dist/composables/use-fullscreen.js +110 -2
  63. package/dist/composables/use-geolocation.js +101 -2
  64. package/dist/composables/use-idle.js +182 -2
  65. package/dist/composables/use-intersection-observer.js +168 -2
  66. package/dist/composables/use-keyboard.js +224 -2
  67. package/dist/composables/use-media-query.js +62 -2
  68. package/dist/composables/use-meta.js +48 -2
  69. package/dist/composables/use-mouse.js +286 -2
  70. package/dist/composables/use-mutation-observer.js +129 -2
  71. package/dist/composables/use-network.js +85 -2
  72. package/dist/composables/use-notification.js +94 -2
  73. package/dist/composables/use-permissions.js +132 -2
  74. package/dist/composables/use-query.js +0 -1
  75. package/dist/composables/use-resize-observer.js +157 -2
  76. package/dist/composables/use-router.js +51 -2
  77. package/dist/composables/use-share.js +104 -2
  78. package/dist/composables/use-speech.js +294 -2
  79. package/dist/composables/use-storage.js +130 -2
  80. package/dist/composables/use-text-selection.js +205 -4
  81. package/dist/composables/use-timer.js +183 -2
  82. package/dist/composables/use-utilities.js +176 -2
  83. package/dist/composables/use-wake-lock.js +122 -2
  84. package/dist/composables/use-websocket.js +165 -2
  85. package/dist/composables/use-window.js +163 -2
  86. package/dist/composables.js +552 -2
  87. package/dist/composition-api.js +190 -2
  88. package/dist/computed.js +376 -8
  89. package/dist/conditionals.js +599 -2
  90. package/dist/config.js +751 -2
  91. package/dist/craft-bridge.js +432 -2
  92. package/dist/craft-compiler.js +810 -2
  93. package/dist/craft-components.js +945 -2
  94. package/dist/craft-entry.js +5 -2
  95. package/dist/craft-ssr.js +559 -2
  96. package/dist/csp.js +220 -2
  97. package/dist/csrf.js +38 -2
  98. package/dist/custom-directives.js +136 -2
  99. package/dist/defer.js +156 -2
  100. package/dist/deploy/config-generators.js +214 -2
  101. package/dist/deploy/index.js +203 -2
  102. package/dist/deploy/netlify.js +167 -2
  103. package/dist/dev-server/crosswind.js +379 -2
  104. package/dist/dev-server/index.js +7 -2
  105. package/dist/dev-server/keyboard-shortcuts.js +81 -2
  106. package/dist/dev-server/native-window.js +91 -2
  107. package/dist/dev-server/port-utils.js +40 -2
  108. package/dist/dev-server/serve-app.js +682 -2
  109. package/dist/dev-server/serve-file.js +439 -2
  110. package/dist/dev-server/serve-markdown.js +281 -2
  111. package/dist/dev-server/serve-multi.js +579 -2
  112. package/dist/dev-server/terminal-colors.js +45 -2
  113. package/dist/dev-server/theme-selector.js +111 -2
  114. package/dist/dev-server/types.js +43 -2
  115. package/dist/dev-server.js +4 -2
  116. package/dist/devtools.js +462 -18
  117. package/dist/directive-api.js +355 -2
  118. package/dist/docs.js +567 -2
  119. package/dist/doctor.js +123 -2
  120. package/dist/document-shell.js +105 -2
  121. package/dist/dynamic-components.js +78 -2
  122. package/dist/edge-runtime.js +539 -2
  123. package/dist/env.js +9 -2
  124. package/dist/error-boundaries.js +62 -12
  125. package/dist/error-handling.js +1 -2
  126. package/dist/errors/codes.js +97 -2
  127. package/dist/errors/formatter.js +196 -2
  128. package/dist/errors/index.js +44 -2
  129. package/dist/errors/logger.js +250 -2
  130. package/dist/errors/sanitizer.js +181 -2
  131. package/dist/errors/types.js +86 -2
  132. package/dist/events.js +382 -2
  133. package/dist/expressions.js +650 -2
  134. package/dist/formatter.js +265 -2
  135. package/dist/forms-validation.js +510 -4
  136. package/dist/forms.js +709 -2
  137. package/dist/head.js +224 -2
  138. package/dist/heatmap.js +566 -2
  139. package/dist/hot-reload.js +367 -2
  140. package/dist/html-masking.js +73 -2
  141. package/dist/hydration-runtime.js +195 -2
  142. package/dist/hydration.js +654 -2
  143. package/dist/i18n.js +633 -2
  144. package/dist/image-optimization/auto-sibling.js +88 -2
  145. package/dist/image-optimization/build-plugin.js +241 -2
  146. package/dist/image-optimization/component.js +244 -2
  147. package/dist/image-optimization/directive.js +203 -2
  148. package/dist/image-optimization/index.js +54 -2
  149. package/dist/image-optimization/processor.js +262 -2
  150. package/dist/image-optimization/serve.js +102 -2
  151. package/dist/includes.js +733 -2
  152. package/dist/index.d.ts +1 -0
  153. package/dist/index.js +134 -2
  154. package/dist/init.js +505 -2
  155. package/dist/inline-assets.js +82 -2
  156. package/dist/interactive.js +383 -2
  157. package/dist/internal-markdown.js +141 -2
  158. package/dist/island-chunking.js +52 -2
  159. package/dist/js-ts.js +57 -2
  160. package/dist/jsx-runtime.js +289 -2
  161. package/dist/keep-alive.js +421 -2
  162. package/dist/lazy-loader.js +245 -2
  163. package/dist/loading-indicator.js +322 -2
  164. package/dist/loops.js +643 -2
  165. package/dist/manifest.js +31 -2
  166. package/dist/markdown.js +68 -2
  167. package/dist/media/client/blur-up.js +217 -2
  168. package/dist/media/client/index.js +53 -2
  169. package/dist/media/client/lazy-load.js +283 -2
  170. package/dist/media/client/upload-handler.js +354 -2
  171. package/dist/media/image/component.js +574 -2
  172. package/dist/media/image/directive.js +160 -2
  173. package/dist/media/image/editing.js +193 -2
  174. package/dist/media/image/index.js +80 -2
  175. package/dist/media/image/placeholder.js +188 -2
  176. package/dist/media/image/processor/cache.js +51 -2
  177. package/dist/media/image/processor/index.js +3 -2
  178. package/dist/media/image/processor/optimizer.js +202 -2
  179. package/dist/media/image/processor/responsive.js +162 -2
  180. package/dist/media/image/srcset.js +194 -2
  181. package/dist/media/index.js +198 -2
  182. package/dist/media/manager/embed.js +253 -2
  183. package/dist/media/protected/component.js +235 -2
  184. package/dist/media/protected/index.js +20 -2
  185. package/dist/media/protected/signature.js +205 -2
  186. package/dist/media/shared/cache.js +132 -2
  187. package/dist/media/shared/hash.js +35 -2
  188. package/dist/media/shared/index.js +2 -2
  189. package/dist/media/types.js +0 -1
  190. package/dist/media/upload/component.js +320 -2
  191. package/dist/media/upload/index.js +1 -2
  192. package/dist/media/video/directive.js +142 -2
  193. package/dist/media/video/index.js +583 -2
  194. package/dist/media/video/processor/cache.js +52 -2
  195. package/dist/media/video/processor/index.js +4 -2
  196. package/dist/media/video/processor/streaming.js +197 -2
  197. package/dist/media/video/processor/thumbnail.js +134 -2
  198. package/dist/media/video/processor/transcoder.js +283 -2
  199. package/dist/method-spoofing.js +17 -2
  200. package/dist/middleware.js +40 -2
  201. package/dist/misc-directives.js +222 -2
  202. package/dist/native-build.js +511 -2
  203. package/dist/parser/directive-parser.js +239 -2
  204. package/dist/parser/expression-parser.js +358 -2
  205. package/dist/parser/index.js +23 -2
  206. package/dist/parser/tokenizer.js +534 -2
  207. package/dist/partial-hydration.js +427 -2
  208. package/dist/performance-utils.js +430 -2
  209. package/dist/placeholder.js +35 -2
  210. package/dist/plugin-system.js +214 -2
  211. package/dist/plugin.js +173 -2
  212. package/dist/precompiler.js +660 -81
  213. package/dist/process.js +711 -2
  214. package/dist/production-build.js +596 -2
  215. package/dist/production-builder.js +132 -2
  216. package/dist/production-server.js +188 -2
  217. package/dist/props.js +224 -2
  218. package/dist/public-env.js +19 -2
  219. package/dist/pwa/audit.js +255 -2
  220. package/dist/pwa/directives.js +332 -2
  221. package/dist/pwa/icons.js +109 -2
  222. package/dist/pwa/index.js +47 -2
  223. package/dist/pwa/inject.js +102 -2
  224. package/dist/pwa/manifest.js +186 -2
  225. package/dist/pwa/offline.js +259 -2
  226. package/dist/pwa/precache.js +116 -2
  227. package/dist/pwa/service-worker.js +860 -2
  228. package/dist/pwa/workbox-strategies.js +167 -2
  229. package/dist/pwa/workbox.js +382 -2
  230. package/dist/pwa.js +427 -427
  231. package/dist/reactive-bindings.js +266 -2
  232. package/dist/reactive.js +569 -2
  233. package/dist/reactivity.js +559 -2
  234. package/dist/release.js +1 -2
  235. package/dist/render.js +165 -2
  236. package/dist/route-middleware.js +17 -2
  237. package/dist/router.js +9 -2
  238. package/dist/routes.js +14 -2
  239. package/dist/runtime-injection.js +120 -2
  240. package/dist/runtime.js +94 -2
  241. package/dist/safe-evaluator.js +444 -2
  242. package/dist/scaffolding.js +897 -2
  243. package/dist/screenshot.js +87 -2
  244. package/dist/script-classifier.js +32 -2
  245. package/dist/script-validation.js +158 -2
  246. package/dist/seo.js +457 -2
  247. package/dist/serve.js +237 -2
  248. package/dist/server-bindings.js +108 -2
  249. package/dist/server-components.js +338 -11
  250. package/dist/signal-processing.js +946 -2
  251. package/dist/signals-api.js +154 -2
  252. package/dist/signals.js +5287 -2
  253. package/dist/site-builder/build.js +224 -2
  254. package/dist/site-builder/i18n.js +140 -2
  255. package/dist/site-builder/index.js +15 -2
  256. package/dist/site-builder/robots.js +26 -2
  257. package/dist/site-builder/router.js +27 -2
  258. package/dist/site-builder/seo.js +36 -2
  259. package/dist/site-builder/sitemap.js +26 -2
  260. package/dist/site-builder/theme.js +33 -2
  261. package/dist/site-builder/types.js +0 -1
  262. package/dist/slots.js +201 -2
  263. package/dist/source-maps.js +350 -2
  264. package/dist/spa-shell.js +34 -2
  265. package/dist/ssg.js +389 -389
  266. package/dist/ssr.js +355 -2
  267. package/dist/state-management.js +533 -2
  268. package/dist/store-imports.js +13 -2
  269. package/dist/store-loader.js +72 -5
  270. package/dist/stores-client.js +132 -2
  271. package/dist/story/addons.js +261 -2
  272. package/dist/story/analytics.js +235 -2
  273. package/dist/story/auto-stories.js +158 -2
  274. package/dist/story/bookmarks.js +277 -2
  275. package/dist/story/bun-test.js +102 -2
  276. package/dist/story/cli.js +155 -2
  277. package/dist/story/collect/analyzer.js +305 -2
  278. package/dist/story/collect/index.js +27 -2
  279. package/dist/story/collect/parser.js +129 -2
  280. package/dist/story/collect/scanner.js +101 -2
  281. package/dist/story/collect/tree.js +110 -2
  282. package/dist/story/commands/build.js +172 -2
  283. package/dist/story/commands/dev.js +78 -2
  284. package/dist/story/commands/index.js +3 -2
  285. package/dist/story/commands/preview.js +56 -2
  286. package/dist/story/compiled-output.js +151 -2
  287. package/dist/story/composition.js +261 -2
  288. package/dist/story/config-watcher.js +67 -2
  289. package/dist/story/config.js +64 -2
  290. package/dist/story/context.js +27 -2
  291. package/dist/story/controls/index.js +320 -2
  292. package/dist/story/crosswind.js +189 -2
  293. package/dist/story/desktop-preview.js +105 -2
  294. package/dist/story/docs-generator.js +186 -2
  295. package/dist/story/errors.js +239 -2
  296. package/dist/story/figma-export.js +224 -2
  297. package/dist/story/generator.js +165 -2
  298. package/dist/story/hmr.js +131 -2
  299. package/dist/story/hot-swap.js +207 -2
  300. package/dist/story/index.js +49 -2
  301. package/dist/story/interactions.js +225 -2
  302. package/dist/story/keyboard-shortcuts.js +345 -2
  303. package/dist/story/output.js +153 -2
  304. package/dist/story/performance.js +252 -2
  305. package/dist/story/presets.js +289 -2
  306. package/dist/story/props-validation.js +215 -2
  307. package/dist/story/renderer.js +209 -2
  308. package/dist/story/search-index.js +106 -2
  309. package/dist/story/search.js +140 -2
  310. package/dist/story/server.js +965 -2
  311. package/dist/story/setup.js +78 -2
  312. package/dist/story/snapshots.js +170 -2
  313. package/dist/story/testing.js +163 -2
  314. package/dist/story/theme.js +170 -2
  315. package/dist/story/types.js +0 -2
  316. package/dist/story/ui/code-panel.js +175 -2
  317. package/dist/story/ui/controls-panel.js +168 -2
  318. package/dist/story/ui/index.js +4 -2
  319. package/dist/story/ui/navigation.js +250 -2
  320. package/dist/story/ui/preview.js +251 -2
  321. package/dist/story/visual-testing.js +247 -2
  322. package/dist/streaming.js +537 -2
  323. package/dist/strict-lint.js +288 -2
  324. package/dist/style-scoping.js +50 -2
  325. package/dist/suspense.js +398 -2
  326. package/dist/teleport.js +109 -2
  327. package/dist/template-compiler.js +63 -2
  328. package/dist/template-hydrator.js +82 -2
  329. package/dist/template-tag-balance.js +93 -2
  330. package/dist/testing.js +581 -2
  331. package/dist/transitions.js +443 -2
  332. package/dist/type-checker.js +581 -2
  333. package/dist/types/component-types.d.ts +54 -0
  334. package/dist/types/component-types.js +0 -1
  335. package/dist/types/config-types.js +0 -1
  336. package/dist/types/context-types.js +0 -1
  337. package/dist/types/csp-types.js +0 -1
  338. package/dist/types/directive-types.js +3 -2
  339. package/dist/types/index.d.ts +5 -0
  340. package/dist/types/index.js +1 -2
  341. package/dist/types/pwa-types.js +0 -1
  342. package/dist/types.js +1 -2
  343. package/dist/typescript-templates.js +386 -4
  344. package/dist/utils.js +942 -2
  345. package/dist/validator.js +171 -2
  346. package/dist/variable-extractor.js +1094 -2
  347. package/dist/view-composers.js +29 -2
  348. package/dist/virtual-scrolling.js +454 -2
  349. package/dist/visual-editor.js +688 -28
  350. package/dist/vue-template.js +475 -2
  351. package/dist/web-components/css-scoping.js +177 -2
  352. package/dist/web-components/index.js +13 -2
  353. package/dist/web-components/reactive-generator.js +121 -56
  354. package/dist/web-components.js +1447 -2
  355. package/dist/x-element.js +17 -5
  356. package/package.json +5 -6
  357. package/dist/chunk-04n64bnt.js +0 -5
  358. package/dist/chunk-06w68hyg.js +0 -7
  359. package/dist/chunk-07y6m5xx.js +0 -3
  360. package/dist/chunk-095s3972.js +0 -99
  361. package/dist/chunk-09k66d8a.js +0 -3
  362. package/dist/chunk-0a61y94n.js +0 -24
  363. package/dist/chunk-0b9w2w1y.js +0 -1
  364. package/dist/chunk-0dx4q6yq.js +0 -3
  365. package/dist/chunk-0dz85jrp.js +0 -3
  366. package/dist/chunk-0jd0pndq.js +0 -3
  367. package/dist/chunk-0p0nyq50.js +0 -6
  368. package/dist/chunk-0p1h3p3w.js +0 -3
  369. package/dist/chunk-0qakwen3.js +0 -1
  370. package/dist/chunk-0qnz93q2.js +0 -3
  371. package/dist/chunk-10debkj5.js +0 -71
  372. package/dist/chunk-15nesxgt.js +0 -5224
  373. package/dist/chunk-1sr54zp8.js +0 -3
  374. package/dist/chunk-1v49fwr5.js +0 -3
  375. package/dist/chunk-1xz0w746.js +0 -1539
  376. package/dist/chunk-1z5nhbjt.js +0 -90
  377. package/dist/chunk-1zgsgk4b.js +0 -1
  378. package/dist/chunk-20swzkx3.js +0 -216
  379. package/dist/chunk-27zsyhrd.js +0 -4
  380. package/dist/chunk-29y0hk5z.js +0 -3
  381. package/dist/chunk-2cdvw21b.js +0 -274
  382. package/dist/chunk-2j21d3ka.js +0 -161
  383. package/dist/chunk-2jxbwnkz.js +0 -2
  384. package/dist/chunk-31dr4bys.js +0 -6
  385. package/dist/chunk-35faj94w.js +0 -15
  386. package/dist/chunk-39gm08bn.js +0 -39
  387. package/dist/chunk-3a4qsygv.js +0 -51
  388. package/dist/chunk-3te20hqw.js +0 -3
  389. package/dist/chunk-43t7faps.js +0 -24
  390. package/dist/chunk-44hd3kab.js +0 -1
  391. package/dist/chunk-47kpewks.js +0 -71
  392. package/dist/chunk-4aj7ftqb.js +0 -1
  393. package/dist/chunk-4d2y57k7.js +0 -3
  394. package/dist/chunk-4deg33rw.js +0 -57
  395. package/dist/chunk-4k7d8p8d.js +0 -188
  396. package/dist/chunk-4qcy5tx6.js +0 -53
  397. package/dist/chunk-4x7kae4j.js +0 -3
  398. package/dist/chunk-55nwdnsd.js +0 -3
  399. package/dist/chunk-55yp0q8t.js +0 -201
  400. package/dist/chunk-5f43yz6z.js +0 -12
  401. package/dist/chunk-5shey2e4.js +0 -3
  402. package/dist/chunk-6b5k6w2q.js +0 -7
  403. package/dist/chunk-6djzdes9.js +0 -14
  404. package/dist/chunk-6e4c6g46.js +0 -3
  405. package/dist/chunk-6eqbxcrd.js +0 -8
  406. package/dist/chunk-7074g241.js +0 -3
  407. package/dist/chunk-7b6s3g65.js +0 -179
  408. package/dist/chunk-7cgmq685.js +0 -33
  409. package/dist/chunk-7dkz6z2s.js +0 -3
  410. package/dist/chunk-7ed3tean.js +0 -3
  411. package/dist/chunk-7gd339hd.js +0 -109
  412. package/dist/chunk-7j5e8sdj.js +0 -3
  413. package/dist/chunk-7n8g0nfn.js +0 -38
  414. package/dist/chunk-7sqdeqsw.js +0 -1
  415. package/dist/chunk-80g54ncj.js +0 -3
  416. package/dist/chunk-8a5bxece.js +0 -4
  417. package/dist/chunk-8ahwt6a4.js +0 -721
  418. package/dist/chunk-8b3z0zd5.js +0 -8
  419. package/dist/chunk-8dhdpa5h.js +0 -4
  420. package/dist/chunk-8n9nnqr6.js +0 -3
  421. package/dist/chunk-8qc1bsym.js +0 -3
  422. package/dist/chunk-8va64c9n.js +0 -3
  423. package/dist/chunk-8vtm0m84.js +0 -3
  424. package/dist/chunk-8xj7c3mf.js +0 -8
  425. package/dist/chunk-988dw6q3.js +0 -9
  426. package/dist/chunk-9b6cec0v.js +0 -321
  427. package/dist/chunk-9cf97f9p.js +0 -3
  428. package/dist/chunk-9ecv8aqj.js +0 -14
  429. package/dist/chunk-9eq3ht5f.js +0 -8
  430. package/dist/chunk-9jtj77jx.js +0 -3
  431. package/dist/chunk-9t14se2t.js +0 -83
  432. package/dist/chunk-9wmq2272.js +0 -3
  433. package/dist/chunk-9zbk5zx5.js +0 -57
  434. package/dist/chunk-a2g2qb2y.js +0 -386
  435. package/dist/chunk-a3hyn4we.js +0 -79
  436. package/dist/chunk-a87qqft6.js +0 -194
  437. package/dist/chunk-ah88wzbg.js +0 -10
  438. package/dist/chunk-akf1r75r.js +0 -102
  439. package/dist/chunk-amaa1bev.js +0 -2
  440. package/dist/chunk-avx8aydt.js +0 -3
  441. package/dist/chunk-ay9qf4zj.js +0 -6
  442. package/dist/chunk-aywxfqev.js +0 -3
  443. package/dist/chunk-azkegjd8.js +0 -61
  444. package/dist/chunk-b77wjyn7.js +0 -84
  445. package/dist/chunk-baf1hfwh.js +0 -231
  446. package/dist/chunk-bdk6g1vj.js +0 -3
  447. package/dist/chunk-bhqgmyqw.js +0 -36
  448. package/dist/chunk-bk3j0n82.js +0 -341
  449. package/dist/chunk-bndmdahk.js +0 -3
  450. package/dist/chunk-bpgg59wa.js +0 -3
  451. package/dist/chunk-bs3gmfxz.js +0 -5
  452. package/dist/chunk-bxc7kjsk.js +0 -32
  453. package/dist/chunk-c7jg8w13.js +0 -3
  454. package/dist/chunk-ckxjqqn9.js +0 -3
  455. package/dist/chunk-cn8az1b4.js +0 -1
  456. package/dist/chunk-d0zjtdw4.js +0 -29
  457. package/dist/chunk-d1qh1x2g.js +0 -3
  458. package/dist/chunk-djddhmcc.js +0 -60
  459. package/dist/chunk-dqn9gyhb.js +0 -21
  460. package/dist/chunk-drjq2zwg.js +0 -3
  461. package/dist/chunk-dvfs1h3c.js +0 -117
  462. package/dist/chunk-e2q9c5vq.js +0 -8
  463. package/dist/chunk-e98v1bc6.js +0 -12
  464. package/dist/chunk-ejayeex8.js +0 -2
  465. package/dist/chunk-ejh8fyak.js +0 -3
  466. package/dist/chunk-ek2w6zvy.js +0 -4
  467. package/dist/chunk-ewa88139.js +0 -6
  468. package/dist/chunk-fjk3x41y.js +0 -3
  469. package/dist/chunk-frg705zq.js +0 -302
  470. package/dist/chunk-fzm3y0r3.js +0 -267
  471. package/dist/chunk-g1vt329s.js +0 -21
  472. package/dist/chunk-g4ps1dj8.js +0 -140
  473. package/dist/chunk-gkzq8zw4.js +0 -23
  474. package/dist/chunk-gz5fmp3q.js +0 -3
  475. package/dist/chunk-h0hjy0kn.js +0 -292
  476. package/dist/chunk-h5jxydqq.js +0 -147
  477. package/dist/chunk-h5wa62ek.js +0 -145
  478. package/dist/chunk-h7aq56qj.js +0 -28
  479. package/dist/chunk-h82kjdr4.js +0 -83
  480. package/dist/chunk-hbehnm18.js +0 -3
  481. package/dist/chunk-hbgxbgam.js +0 -58
  482. package/dist/chunk-hc2mf5h6.js +0 -4
  483. package/dist/chunk-hjm2xab3.js +0 -3
  484. package/dist/chunk-hjv76kcw.js +0 -1
  485. package/dist/chunk-hrnnh4tq.js +0 -142
  486. package/dist/chunk-ht43ds42.js +0 -236
  487. package/dist/chunk-hxx3za24.js +0 -62
  488. package/dist/chunk-hy8820vc.js +0 -6
  489. package/dist/chunk-j447q024.js +0 -28
  490. package/dist/chunk-j58vh0w6.js +0 -314
  491. package/dist/chunk-j8tn8enq.js +0 -3
  492. package/dist/chunk-jc0fc4ht.js +0 -11
  493. package/dist/chunk-jcs0ymw7.js +0 -3
  494. package/dist/chunk-jjamhxpm.js +0 -139
  495. package/dist/chunk-jjb05d21.js +0 -3
  496. package/dist/chunk-jjdq01dv.js +0 -128
  497. package/dist/chunk-jnmgm2xw.js +0 -5
  498. package/dist/chunk-jpndqst5.js +0 -3
  499. package/dist/chunk-jt0ezawy.js +0 -351
  500. package/dist/chunk-jz73j3qs.js +0 -169
  501. package/dist/chunk-k21df0pg.js +0 -10
  502. package/dist/chunk-k848dzsa.js +0 -429
  503. package/dist/chunk-kdfe4t91.js +0 -3
  504. package/dist/chunk-keawsbpn.js +0 -5
  505. package/dist/chunk-kgym7ch9.js +0 -8
  506. package/dist/chunk-khdn7jwe.js +0 -3
  507. package/dist/chunk-km25cwz6.js +0 -3
  508. package/dist/chunk-knm8a8yx.js +0 -398
  509. package/dist/chunk-krqn0ddk.js +0 -3
  510. package/dist/chunk-ktkmvaa8.js +0 -1
  511. package/dist/chunk-kx6eb6ma.js +0 -4
  512. package/dist/chunk-kypas8vy.js +0 -4
  513. package/dist/chunk-m167kjhv.js +0 -4
  514. package/dist/chunk-m491r0rj.js +0 -358
  515. package/dist/chunk-m8448qby.js +0 -11
  516. package/dist/chunk-mgj88zeq.js +0 -64
  517. package/dist/chunk-mhgk632d.js +0 -3
  518. package/dist/chunk-mv4fb50w.js +0 -1
  519. package/dist/chunk-n5kg7fpx.js +0 -7
  520. package/dist/chunk-n98x35xd.js +0 -8
  521. package/dist/chunk-n9dhs1dw.js +0 -106
  522. package/dist/chunk-nd9rmddh.js +0 -6
  523. package/dist/chunk-ngxfwzq3.js +0 -3
  524. package/dist/chunk-nhv099jv.js +0 -19
  525. package/dist/chunk-nm15ccsg.js +0 -5
  526. package/dist/chunk-npfmdb6y.js +0 -71
  527. package/dist/chunk-nvwb4x04.js +0 -3
  528. package/dist/chunk-nw34xajc.js +0 -8
  529. package/dist/chunk-p077sw22.js +0 -3
  530. package/dist/chunk-p1h8065h.js +0 -3
  531. package/dist/chunk-p3e0cqtt.js +0 -34
  532. package/dist/chunk-p3fpb79v.js +0 -477
  533. package/dist/chunk-p52yzjq6.js +0 -498
  534. package/dist/chunk-p73meypx.js +0 -134
  535. package/dist/chunk-pa9zb7ty.js +0 -4
  536. package/dist/chunk-payfb24w.js +0 -207
  537. package/dist/chunk-pcm1vd8w.js +0 -3
  538. package/dist/chunk-pcntd9h4.js +0 -3
  539. package/dist/chunk-pg1fvqb9.js +0 -167
  540. package/dist/chunk-psc3wfcf.js +0 -1115
  541. package/dist/chunk-pznnww6k.js +0 -6
  542. package/dist/chunk-q6zhd9yf.js +0 -3
  543. package/dist/chunk-qa59zejf.js +0 -246
  544. package/dist/chunk-qvrbjpdc.js +0 -3
  545. package/dist/chunk-qygvvygy.js +0 -12
  546. package/dist/chunk-r0jcmpv6.js +0 -68
  547. package/dist/chunk-r5m9xtm7.js +0 -3
  548. package/dist/chunk-rh80q1nd.js +0 -1
  549. package/dist/chunk-rkffm9sy.js +0 -128
  550. package/dist/chunk-rpx5fa65.js +0 -3
  551. package/dist/chunk-rqxf5hns.js +0 -3
  552. package/dist/chunk-rtr974rc.js +0 -30
  553. package/dist/chunk-rvptcndz.js +0 -3
  554. package/dist/chunk-rw26rpek.js +0 -171
  555. package/dist/chunk-rw7937v4.js +0 -19
  556. package/dist/chunk-rwrv9wbf.js +0 -3
  557. package/dist/chunk-rz2ec6g7.js +0 -347
  558. package/dist/chunk-s6ja2bdg.js +0 -66
  559. package/dist/chunk-scpkdrdb.js +0 -4
  560. package/dist/chunk-shv88d2d.js +0 -10
  561. package/dist/chunk-t0c9wvpr.js +0 -3
  562. package/dist/chunk-tffh3b1e.js +0 -35
  563. package/dist/chunk-tg2f1mzq.js +0 -11
  564. package/dist/chunk-trfswy66.js +0 -77
  565. package/dist/chunk-tzwtg722.js +0 -3
  566. package/dist/chunk-v7f8jj15.js +0 -4
  567. package/dist/chunk-v8j49spx.js +0 -3
  568. package/dist/chunk-v97390pe.js +0 -1
  569. package/dist/chunk-vcr5pzpx.js +0 -233
  570. package/dist/chunk-veeerpwa.js +0 -3
  571. package/dist/chunk-vg5kt6az.js +0 -4
  572. package/dist/chunk-vgv7jvyz.js +0 -219
  573. package/dist/chunk-vjbefncc.js +0 -3
  574. package/dist/chunk-vmxjghsm.js +0 -3
  575. package/dist/chunk-vw7vqd76.js +0 -3
  576. package/dist/chunk-vx22he47.js +0 -1
  577. package/dist/chunk-w3b6m427.js +0 -45
  578. package/dist/chunk-wazkqv7n.js +0 -3
  579. package/dist/chunk-wf7zrjsw.js +0 -138
  580. package/dist/chunk-wfg2gm11.js +0 -3
  581. package/dist/chunk-wg9k6h8w.js +0 -12
  582. package/dist/chunk-wkz2vwkr.js +0 -81
  583. package/dist/chunk-wvef3ngh.js +0 -127
  584. package/dist/chunk-wvf31nzs.js +0 -3
  585. package/dist/chunk-x05nxhyv.js +0 -262
  586. package/dist/chunk-x0770gt9.js +0 -4
  587. package/dist/chunk-x24s4heg.js +0 -1166
  588. package/dist/chunk-x3r64r0c.js +0 -6
  589. package/dist/chunk-x5g9w4hh.js +0 -5
  590. package/dist/chunk-xgkv66q5.js +0 -2230
  591. package/dist/chunk-xqq1vxb6.js +0 -1
  592. package/dist/chunk-xs03kc1h.js +0 -196
  593. package/dist/chunk-xv34zbp4.js +0 -3
  594. package/dist/chunk-xw36p73h.js +0 -90
  595. package/dist/chunk-xyg1r5w0.js +0 -4
  596. package/dist/chunk-xys2sxh6.js +0 -16
  597. package/dist/chunk-y0qg6rrv.js +0 -3
  598. package/dist/chunk-y1k17c8b.js +0 -21
  599. package/dist/chunk-y5xz0jc4.js +0 -141
  600. package/dist/chunk-y6xsqe9a.js +0 -10
  601. package/dist/chunk-yb1t2h8h.js +0 -11
  602. package/dist/chunk-ygvyc6wv.js +0 -90
  603. package/dist/chunk-yj4x5ehw.js +0 -21
  604. package/dist/chunk-yn38c15w.js +0 -4
  605. package/dist/chunk-ynhngsdh.js +0 -3
  606. package/dist/chunk-yrsb6j3z.js +0 -3
  607. package/dist/chunk-yywfvfph.js +0 -2
  608. package/dist/chunk-zcxzdrn7.js +0 -5
  609. package/dist/chunk-zen6ax1y.js +0 -27
  610. package/dist/chunk-zf2pek72.js +0 -3
  611. package/dist/chunk-zk3d0jjf.js +0 -7
  612. package/dist/chunk-zy3rp1ab.js +0 -93
package/dist/pwa/audit.js CHANGED
@@ -1,2 +1,255 @@
1
- // @bun
2
- import{Ae as e,we as a,xe as b,ye as c,ze as d}from"../chunk-nw34xajc.js";import"../chunk-xv34zbp4.js";export{d as runPwaAudit,e as formatAuditResult,c as calculateAuditResult,a as auditConfig,b as auditBuildOutput};
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function auditConfig(options) {
4
+ const checks = [], pwa = options.pwa;
5
+ checks.push({
6
+ id: "pwa-enabled",
7
+ name: "PWA Enabled",
8
+ category: "required",
9
+ passed: pwa?.enabled === !0,
10
+ message: pwa?.enabled ? "PWA is enabled" : "PWA is not enabled in config"
11
+ });
12
+ if (!pwa?.enabled)
13
+ return checks;
14
+ checks.push({
15
+ id: "manifest-name",
16
+ name: "App Name",
17
+ category: "required",
18
+ passed: Boolean(pwa.manifest?.name),
19
+ message: pwa.manifest?.name ? `App name: "${pwa.manifest.name}"` : "Missing required manifest name"
20
+ });
21
+ checks.push({
22
+ id: "manifest-short-name",
23
+ name: "Short Name",
24
+ category: "recommended",
25
+ passed: Boolean(pwa.manifest?.shortName),
26
+ message: pwa.manifest?.shortName ? `Short name: "${pwa.manifest.shortName}"` : "Short name not set (will use full name)"
27
+ });
28
+ checks.push({
29
+ id: "manifest-description",
30
+ name: "App Description",
31
+ category: "recommended",
32
+ passed: Boolean(pwa.manifest?.description),
33
+ message: pwa.manifest?.description ? "Description is set" : "App description not provided"
34
+ });
35
+ checks.push({
36
+ id: "manifest-theme-color",
37
+ name: "Theme Color",
38
+ category: "required",
39
+ passed: Boolean(pwa.manifest?.themeColor),
40
+ message: pwa.manifest?.themeColor ? `Theme color: ${pwa.manifest.themeColor}` : "Theme color not set"
41
+ });
42
+ checks.push({
43
+ id: "manifest-background-color",
44
+ name: "Background Color",
45
+ category: "required",
46
+ passed: Boolean(pwa.manifest?.backgroundColor),
47
+ message: pwa.manifest?.backgroundColor ? `Background color: ${pwa.manifest.backgroundColor}` : "Background color not set"
48
+ });
49
+ checks.push({
50
+ id: "manifest-display",
51
+ name: "Display Mode",
52
+ category: "required",
53
+ passed: ["standalone", "fullscreen", "minimal-ui"].includes(pwa.manifest?.display || ""),
54
+ message: pwa.manifest?.display ? `Display mode: ${pwa.manifest.display}` : "Display mode should be standalone, fullscreen, or minimal-ui"
55
+ });
56
+ checks.push({
57
+ id: "manifest-start-url",
58
+ name: "Start URL",
59
+ category: "required",
60
+ passed: Boolean(pwa.manifest?.startUrl),
61
+ message: pwa.manifest?.startUrl ? `Start URL: ${pwa.manifest.startUrl}` : "Start URL not set"
62
+ });
63
+ checks.push({
64
+ id: "icons-source",
65
+ name: "Icon Source",
66
+ category: "required",
67
+ passed: Boolean(pwa.icons?.src),
68
+ message: pwa.icons?.src ? `Icon source: ${pwa.icons.src}` : "No icon source configured"
69
+ });
70
+ const iconSizes = pwa.icons?.sizes || [];
71
+ checks.push({
72
+ id: "icons-192",
73
+ name: "192x192 Icon",
74
+ category: "required",
75
+ passed: iconSizes.includes(192),
76
+ message: iconSizes.includes(192) ? "192x192 icon will be generated" : "Missing 192x192 icon (required for Android)"
77
+ });
78
+ checks.push({
79
+ id: "icons-512",
80
+ name: "512x512 Icon",
81
+ category: "required",
82
+ passed: iconSizes.includes(512),
83
+ message: iconSizes.includes(512) ? "512x512 icon will be generated" : "Missing 512x512 icon (required for splash screen)"
84
+ });
85
+ checks.push({
86
+ id: "icons-maskable",
87
+ name: "Maskable Icon",
88
+ category: "recommended",
89
+ passed: pwa.icons?.purpose?.includes("maskable") || !1,
90
+ message: pwa.icons?.purpose?.includes("maskable") ? "Maskable icon purpose is set" : "Consider adding maskable icon purpose for adaptive icons"
91
+ });
92
+ checks.push({
93
+ id: "sw-configured",
94
+ name: "Service Worker",
95
+ category: "required",
96
+ passed: Boolean(pwa.serviceWorker),
97
+ message: pwa.serviceWorker ? "Service worker is configured" : "Service worker configuration missing"
98
+ });
99
+ checks.push({
100
+ id: "sw-cache-version",
101
+ name: "Cache Version",
102
+ category: "recommended",
103
+ passed: Boolean(pwa.serviceWorker?.cacheVersion),
104
+ message: pwa.serviceWorker?.cacheVersion ? `Cache version: ${pwa.serviceWorker.cacheVersion}` : "Set cache version for proper cache busting"
105
+ });
106
+ checks.push({
107
+ id: "offline-enabled",
108
+ name: "Offline Support",
109
+ category: "required",
110
+ passed: pwa.offline?.enabled === !0,
111
+ message: pwa.offline?.enabled ? "Offline support is enabled" : "Offline support is disabled"
112
+ });
113
+ const routes = pwa.routes || [];
114
+ checks.push({
115
+ id: "caching-strategies",
116
+ name: "Caching Strategies",
117
+ category: "recommended",
118
+ passed: routes.length > 0,
119
+ message: routes.length > 0 ? `${routes.length} route caching strategies configured` : "No custom caching strategies defined"
120
+ });
121
+ checks.push({
122
+ id: "push-config",
123
+ name: "Push Notifications",
124
+ category: "optional",
125
+ passed: !pwa.push?.enabled || Boolean(pwa.push?.vapidPublicKey),
126
+ message: pwa.push?.enabled ? pwa.push?.vapidPublicKey ? "Push notifications configured with VAPID key" : "Push enabled but missing VAPID key" : "Push notifications not enabled"
127
+ });
128
+ checks.push({
129
+ id: "share-target",
130
+ name: "Share Target",
131
+ category: "optional",
132
+ passed: !0,
133
+ message: pwa.shareTarget?.enabled ? `Share target enabled at ${pwa.shareTarget.action}` : "Share target not enabled"
134
+ });
135
+ checks.push({
136
+ id: "auto-inject",
137
+ name: "Auto-injection",
138
+ category: "recommended",
139
+ passed: pwa.autoInject !== !1,
140
+ message: pwa.autoInject !== !1 ? "PWA tags will be auto-injected" : "Auto-injection disabled - manual tag insertion required"
141
+ });
142
+ return checks;
143
+ }
144
+ export function auditBuildOutput(outputDir) {
145
+ const checks = [], manifestPath = path.join(outputDir, "manifest.json"), manifestExists = fs.existsSync(manifestPath);
146
+ checks.push({
147
+ id: "build-manifest",
148
+ name: "Manifest File",
149
+ category: "required",
150
+ passed: manifestExists,
151
+ message: manifestExists ? "manifest.json exists" : "manifest.json not found in build output"
152
+ });
153
+ if (manifestExists)
154
+ try {
155
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
156
+ checks.push({
157
+ id: "build-manifest-valid",
158
+ name: "Valid Manifest JSON",
159
+ category: "required",
160
+ passed: !0,
161
+ message: "Manifest is valid JSON"
162
+ });
163
+ checks.push({
164
+ id: "build-manifest-icons",
165
+ name: "Manifest Icons",
166
+ category: "required",
167
+ passed: Array.isArray(manifest.icons) && manifest.icons.length > 0,
168
+ message: manifest.icons?.length ? `${manifest.icons.length} icons defined in manifest` : "No icons defined in manifest"
169
+ });
170
+ } catch {
171
+ checks.push({
172
+ id: "build-manifest-valid",
173
+ name: "Valid Manifest JSON",
174
+ category: "required",
175
+ passed: !1,
176
+ message: "Manifest is not valid JSON"
177
+ });
178
+ }
179
+ const swPath = path.join(outputDir, "sw.js"), swExists = fs.existsSync(swPath);
180
+ checks.push({
181
+ id: "build-sw",
182
+ name: "Service Worker File",
183
+ category: "required",
184
+ passed: swExists,
185
+ message: swExists ? "Service worker (sw.js) exists" : "Service worker not found in build output"
186
+ });
187
+ const offlinePath = path.join(outputDir, "offline.html"), offlineExists = fs.existsSync(offlinePath);
188
+ checks.push({
189
+ id: "build-offline",
190
+ name: "Offline Page",
191
+ category: "recommended",
192
+ passed: offlineExists,
193
+ message: offlineExists ? "Offline page exists" : "No offline.html found"
194
+ });
195
+ const iconsDir = path.join(outputDir, "pwa-icons");
196
+ if (fs.existsSync(iconsDir)) {
197
+ const iconFiles = fs.readdirSync(iconsDir).filter((f) => f.endsWith(".png") || f.endsWith(".webp"));
198
+ checks.push({
199
+ id: "build-icons",
200
+ name: "Generated Icons",
201
+ category: "required",
202
+ passed: iconFiles.length > 0,
203
+ message: iconFiles.length > 0 ? `${iconFiles.length} icon files generated` : "No icon files found"
204
+ });
205
+ } else
206
+ checks.push({
207
+ id: "build-icons",
208
+ name: "Generated Icons",
209
+ category: "required",
210
+ passed: !1,
211
+ message: "Icons directory not found"
212
+ });
213
+ return checks;
214
+ }
215
+ export function calculateAuditResult(checks) {
216
+ const requiredChecks = checks.filter((c) => c.category === "required"), recommendedChecks = checks.filter((c) => c.category === "recommended"), requiredPassed = requiredChecks.filter((c) => c.passed).length, recommendedPassed = recommendedChecks.filter((c) => c.passed).length, requiredScore = requiredChecks.length > 0 ? requiredPassed / requiredChecks.length * 70 : 70, recommendedScore = recommendedChecks.length > 0 ? recommendedPassed / recommendedChecks.length * 30 : 30;
217
+ return {
218
+ score: Math.round(requiredScore + recommendedScore),
219
+ passed: checks.filter((c) => c.passed).length,
220
+ failed: checks.filter((c) => !c.passed && c.category === "required").length,
221
+ warnings: checks.filter((c) => !c.passed && c.category !== "required").length,
222
+ checks
223
+ };
224
+ }
225
+ export function runPwaAudit(options, outputDir) {
226
+ const configChecks = auditConfig(options), buildChecks = outputDir && fs.existsSync(outputDir) ? auditBuildOutput(outputDir) : [];
227
+ return calculateAuditResult([...configChecks, ...buildChecks]);
228
+ }
229
+ export function formatAuditResult(result) {
230
+ const lines = [];
231
+ lines.push(`
232
+ === PWA Audit Report ===
233
+ `);
234
+ const scoreColor = result.score >= 90 ? "32" : result.score >= 70 ? "33" : "31";
235
+ lines.push(`Score: \x1B[${scoreColor}m${result.score}/100\x1B[0m`);
236
+ lines.push(`Passed: ${result.passed} | Failed: ${result.failed} | Warnings: ${result.warnings}
237
+ `);
238
+ const categories = ["required", "recommended", "optional"];
239
+ for (const category of categories) {
240
+ const categoryChecks = result.checks.filter((c) => c.category === category);
241
+ if (categoryChecks.length === 0)
242
+ continue;
243
+ lines.push(`
244
+ ${category.toUpperCase()}:`);
245
+ for (const check of categoryChecks) {
246
+ const icon = check.passed ? "\x1B[32m\u2713\x1B[0m" : "\x1B[31m\u2717\x1B[0m";
247
+ lines.push(` ${icon} ${check.name}: ${check.message}`);
248
+ if (check.details)
249
+ lines.push(` ${check.details}`);
250
+ }
251
+ }
252
+ lines.push("");
253
+ return lines.join(`
254
+ `);
255
+ }
@@ -1,2 +1,332 @@
1
- // @bun
2
- import{Vt as a,Wt as b,Xt as c,Yt as d,Zt as e,_t as f}from"../chunk-frg705zq.js";import"../chunk-xv34zbp4.js";export{f as registerPwaDirectives,b as pwaUpdateDirective,d as pwaPushDirective,c as pwaOfflineDirective,a as pwaInstallDirective,e as pwaDirectives};
1
+ function generateInstallButton(content, options) {
2
+ const themeColor = options.pwa?.manifest?.themeColor || "#4f46e5";
3
+ return `<div class="stx-pwa-install" style="display:none;">
4
+ ${content}
5
+ </div>
6
+ <script>
7
+ (function() {
8
+ let deferredPrompt;
9
+ const installContainer = document.querySelector('.stx-pwa-install');
10
+ const installBtn = installContainer?.querySelector('button, [data-pwa-install]') || installContainer;
11
+
12
+ window.addEventListener('beforeinstallprompt', (e) => {
13
+ e.preventDefault();
14
+ deferredPrompt = e;
15
+ if (installContainer) {
16
+ installContainer.style.display = 'block';
17
+ }
18
+ });
19
+
20
+ if (installBtn) {
21
+ installBtn.addEventListener('click', async () => {
22
+ if (!deferredPrompt) return;
23
+ deferredPrompt.prompt();
24
+ const { outcome } = await deferredPrompt.userChoice;
25
+ console.log('[PWA] Install prompt outcome:', outcome);
26
+ deferredPrompt = null;
27
+ if (installContainer) {
28
+ installContainer.style.display = 'none';
29
+ }
30
+ });
31
+ }
32
+
33
+ window.addEventListener('appinstalled', () => {
34
+ console.log('[PWA] App installed');
35
+ deferredPrompt = null;
36
+ if (installContainer) {
37
+ installContainer.style.display = 'none';
38
+ }
39
+ });
40
+
41
+ // Check if already installed
42
+ if (window.matchMedia('(display-mode: standalone)').matches) {
43
+ if (installContainer) {
44
+ installContainer.style.display = 'none';
45
+ }
46
+ }
47
+ })();
48
+ </script>`;
49
+ }
50
+ function generateUpdatePrompt(content, options) {
51
+ const config = options.pwa?.updates, message = config?.message || "A new version is available. Reload to update?", autoReload = config?.autoReload || !1, hasCustomContent = content.trim().length > 0, defaultUI = `
52
+ <div class="stx-pwa-update-banner" style="
53
+ position: fixed;
54
+ bottom: 0;
55
+ left: 0;
56
+ right: 0;
57
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
58
+ color: white;
59
+ padding: 16px 24px;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: space-between;
63
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
64
+ box-shadow: 0 -4px 20px rgba(0,0,0,0.15);
65
+ z-index: 99999;
66
+ transform: translateY(100%);
67
+ transition: transform 0.3s ease;
68
+ ">
69
+ <span style="font-size: 14px;">${message}</span>
70
+ <div style="display: flex; gap: 12px;">
71
+ <button data-pwa-dismiss style="
72
+ background: transparent;
73
+ border: 1px solid rgba(255,255,255,0.5);
74
+ color: white;
75
+ padding: 8px 16px;
76
+ border-radius: 6px;
77
+ cursor: pointer;
78
+ font-size: 14px;
79
+ ">Later</button>
80
+ <button data-pwa-reload style="
81
+ background: white;
82
+ border: none;
83
+ color: #667eea;
84
+ padding: 8px 16px;
85
+ border-radius: 6px;
86
+ cursor: pointer;
87
+ font-weight: 600;
88
+ font-size: 14px;
89
+ ">Update Now</button>
90
+ </div>
91
+ </div>`;
92
+ return `${hasCustomContent ? `<div class="stx-pwa-update" style="display:none;">${content}</div>` : defaultUI}
93
+ <script>
94
+ (function() {
95
+ const updateContainer = document.querySelector('.stx-pwa-update, .stx-pwa-update-banner');
96
+ const dismissBtn = updateContainer?.querySelector('[data-pwa-dismiss]');
97
+ const reloadBtn = updateContainer?.querySelector('[data-pwa-reload], button');
98
+ const autoReload = ${autoReload};
99
+ let newWorker = null;
100
+
101
+ function showUpdate() {
102
+ if (updateContainer) {
103
+ if (updateContainer.classList.contains('stx-pwa-update-banner')) {
104
+ updateContainer.style.transform = 'translateY(0)';
105
+ }
106
+ else {
107
+ updateContainer.style.display = 'block';
108
+ }
109
+ }
110
+ if (autoReload) {
111
+ setTimeout(() => window.location.reload(), 1000);
112
+ }
113
+ }
114
+
115
+ function hideUpdate() {
116
+ if (updateContainer) {
117
+ if (updateContainer.classList.contains('stx-pwa-update-banner')) {
118
+ updateContainer.style.transform = 'translateY(100%)';
119
+ }
120
+ else {
121
+ updateContainer.style.display = 'none';
122
+ }
123
+ }
124
+ }
125
+
126
+ if (dismissBtn) {
127
+ dismissBtn.addEventListener('click', hideUpdate);
128
+ }
129
+
130
+ if (reloadBtn) {
131
+ reloadBtn.addEventListener('click', () => {
132
+ if (newWorker) {
133
+ newWorker.postMessage({ type: 'SKIP_WAITING' });
134
+ }
135
+ window.location.reload();
136
+ });
137
+ }
138
+
139
+ // Listen for service worker updates
140
+ if ('serviceWorker' in navigator) {
141
+ navigator.serviceWorker.ready.then((registration) => {
142
+ registration.addEventListener('updatefound', () => {
143
+ newWorker = registration.installing;
144
+ if (newWorker) {
145
+ newWorker.addEventListener('statechange', () => {
146
+ if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
147
+ showUpdate();
148
+ }
149
+ });
150
+ }
151
+ });
152
+ });
153
+
154
+ // Handle controller change (after skipWaiting)
155
+ navigator.serviceWorker.addEventListener('controllerchange', () => {
156
+ window.location.reload();
157
+ });
158
+ }
159
+
160
+ // Also listen for custom event
161
+ window.addEventListener('pwa-update-available', showUpdate);
162
+ })();
163
+ </script>`;
164
+ }
165
+ function generateOfflineIndicator(content, options) {
166
+ return `${content.trim().length > 0 ? `<div class="stx-offline-indicator" style="display:none;">${content}</div>` : `
167
+ <div class="stx-offline-indicator" style="
168
+ position: fixed;
169
+ top: 16px;
170
+ right: 16px;
171
+ background: #ef4444;
172
+ color: white;
173
+ padding: 12px 20px;
174
+ border-radius: 8px;
175
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
176
+ font-size: 14px;
177
+ font-weight: 500;
178
+ box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
179
+ z-index: 99999;
180
+ display: none;
181
+ align-items: center;
182
+ gap: 8px;
183
+ ">
184
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
185
+ <path d="M1 1l22 22M16.72 11.06A10.94 10.94 0 0 1 19 12.55M5 12.55a10.94 10.94 0 0 1 5.17-2.39M10.71 5.05A16 16 0 0 1 22.58 9M1.42 9a15.91 15.91 0 0 1 4.7-2.88M8.53 16.11a6 6 0 0 1 6.95 0"/>
186
+ <circle cx="12" cy="20" r="1"/>
187
+ </svg>
188
+ <span>You are offline</span>
189
+ </div>`}
190
+ <script>
191
+ (function() {
192
+ const indicator = document.querySelector('.stx-offline-indicator');
193
+
194
+ function updateStatus() {
195
+ if (indicator) {
196
+ indicator.style.display = navigator.onLine ? 'none' : 'flex';
197
+ }
198
+ }
199
+
200
+ window.addEventListener('online', updateStatus);
201
+ window.addEventListener('offline', updateStatus);
202
+ updateStatus();
203
+ })();
204
+ </script>`;
205
+ }
206
+ function generatePushSubscribe(content, options) {
207
+ const pushConfig = options.pwa?.push, vapidKey = pushConfig?.vapidPublicKey || "", endpoint = pushConfig?.subscriptionEndpoint || "/api/push/subscribe";
208
+ return `<div class="stx-pwa-push" style="display:none;">
209
+ ${content}
210
+ </div>
211
+ <script>
212
+ (function() {
213
+ const pushContainer = document.querySelector('.stx-pwa-push');
214
+ const pushBtn = pushContainer?.querySelector('button, [data-pwa-push]') || pushContainer;
215
+ const vapidKey = '${vapidKey}';
216
+ const endpoint = '${endpoint}';
217
+
218
+ async function checkPushSupport() {
219
+ if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
220
+ console.log('[PWA] Push notifications not supported');
221
+ return false;
222
+ }
223
+ return true;
224
+ }
225
+
226
+ async function subscribeToPush() {
227
+ try {
228
+ const registration = await navigator.serviceWorker.ready;
229
+
230
+ // Check existing subscription
231
+ let subscription = await registration.pushManager.getSubscription();
232
+
233
+ if (!subscription && vapidKey) {
234
+ // Convert VAPID key
235
+ const urlBase64ToUint8Array = (base64String) => {
236
+ const padding = '='.repeat((4 - base64String.length % 4) % 4);
237
+ const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
238
+ const rawData = window.atob(base64);
239
+ const outputArray = new Uint8Array(rawData.length);
240
+ for (let i = 0; i < rawData.length; ++i) {
241
+ outputArray[i] = rawData.charCodeAt(i);
242
+ }
243
+ return outputArray;
244
+ };
245
+
246
+ subscription = await registration.pushManager.subscribe({
247
+ userVisibleOnly: true,
248
+ applicationServerKey: urlBase64ToUint8Array(vapidKey)
249
+ });
250
+
251
+ // Send subscription to server
252
+ if (endpoint) {
253
+ await fetch(endpoint, {
254
+ method: 'POST',
255
+ headers: { 'Content-Type': 'application/json' },
256
+ body: JSON.stringify(subscription)
257
+ });
258
+ }
259
+
260
+ console.log('[PWA] Push subscription created');
261
+ return subscription;
262
+ }
263
+
264
+ return subscription;
265
+ }
266
+ catch (error) {
267
+ console.error('[PWA] Push subscription failed:', error);
268
+ return null;
269
+ }
270
+ }
271
+
272
+ async function init() {
273
+ if (await checkPushSupport()) {
274
+ const permission = await Notification.requestPermission();
275
+ if (permission === 'granted' && pushContainer) {
276
+ pushContainer.style.display = 'block';
277
+ }
278
+ }
279
+ }
280
+
281
+ if (pushBtn) {
282
+ pushBtn.addEventListener('click', subscribeToPush);
283
+ }
284
+
285
+ // Check support on load
286
+ if (pushContainer) {
287
+ init();
288
+ }
289
+ })();
290
+ </script>`;
291
+ }
292
+ export const pwaInstallDirective = {
293
+ name: "pwa.installButton",
294
+ handler: (content, _params, context, _filePath) => {
295
+ const options = context.__stx_options || {};
296
+ return generateInstallButton(content, options);
297
+ },
298
+ hasEndTag: !0,
299
+ description: "Renders a PWA install prompt button that appears when the app can be installed"
300
+ }, pwaUpdateDirective = {
301
+ name: "pwa.updatePrompt",
302
+ handler: (content, _params, context, _filePath) => {
303
+ const options = context.__stx_options || {};
304
+ return generateUpdatePrompt(content, options);
305
+ },
306
+ hasEndTag: !0,
307
+ description: "Renders a PWA update notification UI when a new version is available"
308
+ }, pwaOfflineDirective = {
309
+ name: "pwa.offlineIndicator",
310
+ handler: (content, _params, context, _filePath) => {
311
+ const options = context.__stx_options || {};
312
+ return generateOfflineIndicator(content, options);
313
+ },
314
+ hasEndTag: !0,
315
+ description: "Renders an offline status indicator that shows when the user loses connection"
316
+ }, pwaPushDirective = {
317
+ name: "pwa.pushSubscribe",
318
+ handler: (content, _params, context, _filePath) => {
319
+ const options = context.__stx_options || {};
320
+ return generatePushSubscribe(content, options);
321
+ },
322
+ hasEndTag: !0,
323
+ description: "Renders a push notification subscription button"
324
+ }, pwaDirectives = [
325
+ pwaInstallDirective,
326
+ pwaUpdateDirective,
327
+ pwaOfflineDirective,
328
+ pwaPushDirective
329
+ ];
330
+ export function registerPwaDirectives(customDirectives) {
331
+ return [...customDirectives, ...pwaDirectives];
332
+ }