@stacksjs/stx 0.2.94 → 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 (614) 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 -7
  109. package/dist/dev-server/serve-file.js +439 -7
  110. package/dist/dev-server/serve-markdown.js +281 -2
  111. package/dist/dev-server/serve-multi.js +424 -17
  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 +6 -7
  357. package/dist/chunk-03c26pjz.js +0 -3
  358. package/dist/chunk-04mvcmcr.js +0 -106
  359. package/dist/chunk-05hgyyqc.js +0 -4
  360. package/dist/chunk-095s3972.js +0 -99
  361. package/dist/chunk-0b9w2w1y.js +0 -1
  362. package/dist/chunk-0dz85jrp.js +0 -3
  363. package/dist/chunk-0g4gece6.js +0 -4
  364. package/dist/chunk-0jd0pndq.js +0 -3
  365. package/dist/chunk-0jkwrcwj.js +0 -3
  366. package/dist/chunk-0m9tdm7t.js +0 -71
  367. package/dist/chunk-0qakwen3.js +0 -1
  368. package/dist/chunk-0qnz93q2.js +0 -3
  369. package/dist/chunk-0tatqxj2.js +0 -57
  370. package/dist/chunk-0wdar532.js +0 -102
  371. package/dist/chunk-13yz561y.js +0 -3
  372. package/dist/chunk-174z0cd0.js +0 -3
  373. package/dist/chunk-1mmykse5.js +0 -81
  374. package/dist/chunk-1z2yq9em.js +0 -3
  375. package/dist/chunk-1z5nhbjt.js +0 -90
  376. package/dist/chunk-1zgsgk4b.js +0 -1
  377. package/dist/chunk-25s7bckb.js +0 -171
  378. package/dist/chunk-268adc7r.js +0 -2230
  379. package/dist/chunk-26r6zh3t.js +0 -194
  380. package/dist/chunk-2w3302dh.js +0 -3
  381. package/dist/chunk-2xen423s.js +0 -3
  382. package/dist/chunk-39gm08bn.js +0 -39
  383. package/dist/chunk-3bjtemm6.js +0 -128
  384. package/dist/chunk-3jm3snz8.js +0 -3
  385. package/dist/chunk-3ngm57nt.js +0 -12
  386. package/dist/chunk-3rh7va1z.js +0 -3
  387. package/dist/chunk-3yg9hbmb.js +0 -4
  388. package/dist/chunk-44hd3kab.js +0 -1
  389. package/dist/chunk-46mkpbkk.js +0 -12
  390. package/dist/chunk-48cw2nde.js +0 -2
  391. package/dist/chunk-48r3qe0k.js +0 -3
  392. package/dist/chunk-4aj7ftqb.js +0 -1
  393. package/dist/chunk-4bt81cg3.js +0 -61
  394. package/dist/chunk-4j188175.js +0 -3
  395. package/dist/chunk-4k7d8p8d.js +0 -188
  396. package/dist/chunk-4qq8ffke.js +0 -28
  397. package/dist/chunk-50vqeesm.js +0 -142
  398. package/dist/chunk-52agge4n.js +0 -38
  399. package/dist/chunk-55yp0q8t.js +0 -201
  400. package/dist/chunk-57p201gb.js +0 -83
  401. package/dist/chunk-5ggw1dyv.js +0 -3
  402. package/dist/chunk-5kt3ay7x.js +0 -10
  403. package/dist/chunk-5p568px4.js +0 -1166
  404. package/dist/chunk-5ppkfyn2.js +0 -3
  405. package/dist/chunk-5q87fgkk.js +0 -3
  406. package/dist/chunk-5qb761h2.js +0 -3
  407. package/dist/chunk-5xvbq2gs.js +0 -30
  408. package/dist/chunk-647849kf.js +0 -34
  409. package/dist/chunk-6b5k6w2q.js +0 -7
  410. package/dist/chunk-6cr3eeh4.js +0 -23
  411. package/dist/chunk-6djgb0hr.js +0 -3
  412. package/dist/chunk-6dqzky7x.js +0 -35
  413. package/dist/chunk-6e4c6g46.js +0 -3
  414. package/dist/chunk-6w03t7h6.js +0 -3
  415. package/dist/chunk-6wn85hn6.js +0 -4
  416. package/dist/chunk-6y4gqs1q.js +0 -169
  417. package/dist/chunk-75rndzbd.js +0 -6
  418. package/dist/chunk-77tga15w.js +0 -3
  419. package/dist/chunk-7a51hkpf.js +0 -3
  420. package/dist/chunk-7b0xdy5h.js +0 -386
  421. package/dist/chunk-7cgmq685.js +0 -33
  422. package/dist/chunk-7dy588as.js +0 -6
  423. package/dist/chunk-7rvh2wwv.js +0 -721
  424. package/dist/chunk-7sm05m0j.js +0 -351
  425. package/dist/chunk-7sqdeqsw.js +0 -1
  426. package/dist/chunk-7xcfy2fn.js +0 -4
  427. package/dist/chunk-82t27pvd.js +0 -5
  428. package/dist/chunk-87kx8byz.js +0 -1115
  429. package/dist/chunk-8fgwhhb8.js +0 -6
  430. package/dist/chunk-8qbax8xn.js +0 -347
  431. package/dist/chunk-91s2hres.js +0 -8
  432. package/dist/chunk-94g3cahw.js +0 -11
  433. package/dist/chunk-957amb71.js +0 -8
  434. package/dist/chunk-95w08s8v.js +0 -3
  435. package/dist/chunk-9agvhp1x.js +0 -93
  436. package/dist/chunk-9tmbrwwx.js +0 -219
  437. package/dist/chunk-9yz5d003.js +0 -51
  438. package/dist/chunk-a3hyn4we.js +0 -79
  439. package/dist/chunk-a69tvya5.js +0 -53
  440. package/dist/chunk-adjcg6wa.js +0 -498
  441. package/dist/chunk-adqh2m9z.js +0 -45
  442. package/dist/chunk-asarebzq.js +0 -292
  443. package/dist/chunk-aw3rp9ac.js +0 -24
  444. package/dist/chunk-b0cyc09a.js +0 -109
  445. package/dist/chunk-b3kkjcdh.js +0 -3
  446. package/dist/chunk-b3prs7y0.js +0 -5
  447. package/dist/chunk-b5zc9y0y.js +0 -90
  448. package/dist/chunk-baa7h4yz.js +0 -3
  449. package/dist/chunk-bgec9r1v.js +0 -5224
  450. package/dist/chunk-bjnjpsgn.js +0 -3
  451. package/dist/chunk-bk8ew8ze.js +0 -24
  452. package/dist/chunk-bn08k7yy.js +0 -3
  453. package/dist/chunk-bpgg59wa.js +0 -3
  454. package/dist/chunk-bwxda6n1.js +0 -3
  455. package/dist/chunk-bykjk6vj.js +0 -4
  456. package/dist/chunk-c53hyw5c.js +0 -477
  457. package/dist/chunk-c7jg8w13.js +0 -3
  458. package/dist/chunk-ca6qd1dx.js +0 -3
  459. package/dist/chunk-cdbwprfv.js +0 -6
  460. package/dist/chunk-ceg2c2q2.js +0 -11
  461. package/dist/chunk-cn409b69.js +0 -3
  462. package/dist/chunk-cn8az1b4.js +0 -1
  463. package/dist/chunk-cp3kwv17.js +0 -8
  464. package/dist/chunk-cpcc11vp.js +0 -5
  465. package/dist/chunk-cr3wbrcr.js +0 -10
  466. package/dist/chunk-cygfdk1n.js +0 -3
  467. package/dist/chunk-cyp4m0vh.js +0 -16
  468. package/dist/chunk-cz25azze.js +0 -4
  469. package/dist/chunk-d77yxcds.js +0 -3
  470. package/dist/chunk-dvfs1h3c.js +0 -117
  471. package/dist/chunk-dyjnn5k8.js +0 -262
  472. package/dist/chunk-dzw95th7.js +0 -3
  473. package/dist/chunk-e0zytzdh.js +0 -179
  474. package/dist/chunk-e53h9qhd.js +0 -84
  475. package/dist/chunk-eds0f8f1.js +0 -3
  476. package/dist/chunk-eh8hact1.js +0 -5
  477. package/dist/chunk-epj957jf.js +0 -4
  478. package/dist/chunk-eqeyaq6g.js +0 -77
  479. package/dist/chunk-fbxt2mrx.js +0 -5
  480. package/dist/chunk-fch9tk1k.js +0 -3
  481. package/dist/chunk-fe7r1mq1.js +0 -9
  482. package/dist/chunk-fhawx87n.js +0 -8
  483. package/dist/chunk-fk51yyrw.js +0 -3
  484. package/dist/chunk-fms20x0n.js +0 -21
  485. package/dist/chunk-fs0qezn5.js +0 -341
  486. package/dist/chunk-fzm3y0r3.js +0 -267
  487. package/dist/chunk-g2hekckm.js +0 -161
  488. package/dist/chunk-g4ps1dj8.js +0 -140
  489. package/dist/chunk-g8b81pzc.js +0 -3
  490. package/dist/chunk-ganag9dm.js +0 -3
  491. package/dist/chunk-gc84b1d2.js +0 -58
  492. package/dist/chunk-gcf5v18y.js +0 -60
  493. package/dist/chunk-ghrx0hn1.js +0 -4
  494. package/dist/chunk-gqpkp459.js +0 -3
  495. package/dist/chunk-h45py5w5.js +0 -2
  496. package/dist/chunk-h5wa62ek.js +0 -145
  497. package/dist/chunk-h82kjdr4.js +0 -83
  498. package/dist/chunk-haecq01c.js +0 -3
  499. package/dist/chunk-hepg894w.js +0 -3
  500. package/dist/chunk-hjdc99kb.js +0 -3
  501. package/dist/chunk-hje9v2zh.js +0 -3
  502. package/dist/chunk-hjv76kcw.js +0 -1
  503. package/dist/chunk-hke99a0v.js +0 -3
  504. package/dist/chunk-hpqr9e3x.js +0 -3
  505. package/dist/chunk-hq5cem49.js +0 -236
  506. package/dist/chunk-hrampcrj.js +0 -3
  507. package/dist/chunk-ht4j68cs.js +0 -3
  508. package/dist/chunk-hxx3za24.js +0 -62
  509. package/dist/chunk-j4s5qwd7.js +0 -4
  510. package/dist/chunk-jbejwejg.js +0 -8
  511. package/dist/chunk-jc0fc4ht.js +0 -11
  512. package/dist/chunk-jcs0ymw7.js +0 -3
  513. package/dist/chunk-jfm69keq.js +0 -231
  514. package/dist/chunk-jfrn43vh.js +0 -2
  515. package/dist/chunk-jjamhxpm.js +0 -139
  516. package/dist/chunk-jjvp4t5w.js +0 -27
  517. package/dist/chunk-jt44av4j.js +0 -3
  518. package/dist/chunk-jt98jhpt.js +0 -10
  519. package/dist/chunk-k8440jxh.js +0 -6
  520. package/dist/chunk-kdxa9epn.js +0 -21
  521. package/dist/chunk-kfd2hf6f.js +0 -3
  522. package/dist/chunk-kgym7ch9.js +0 -8
  523. package/dist/chunk-kh6rfz2v.js +0 -4
  524. package/dist/chunk-kkp6rs2n.js +0 -36
  525. package/dist/chunk-ktkmvaa8.js +0 -1
  526. package/dist/chunk-m59y310j.js +0 -3
  527. package/dist/chunk-mgmyr1b9.js +0 -6
  528. package/dist/chunk-mqwbpamc.js +0 -3
  529. package/dist/chunk-mrehzhxv.js +0 -5
  530. package/dist/chunk-mv03qb75.js +0 -3
  531. package/dist/chunk-mv4fb50w.js +0 -1
  532. package/dist/chunk-mwbng54r.js +0 -2
  533. package/dist/chunk-n46a5g1g.js +0 -3
  534. package/dist/chunk-n944baxp.js +0 -3
  535. package/dist/chunk-nanw7yhz.js +0 -14
  536. package/dist/chunk-nap11ntr.js +0 -21
  537. package/dist/chunk-ncnfa8ae.js +0 -29
  538. package/dist/chunk-ngxfwzq3.js +0 -3
  539. package/dist/chunk-nvwb4x04.js +0 -3
  540. package/dist/chunk-nw34xajc.js +0 -8
  541. package/dist/chunk-payfb24w.js +0 -207
  542. package/dist/chunk-pc31m5x5.js +0 -398
  543. package/dist/chunk-pg1fvqb9.js +0 -167
  544. package/dist/chunk-q60knhjf.js +0 -3
  545. package/dist/chunk-q6h6yvzb.js +0 -10
  546. package/dist/chunk-qd5461tt.js +0 -3
  547. package/dist/chunk-qdc3aav1.js +0 -3
  548. package/dist/chunk-qfwzdffx.js +0 -3
  549. package/dist/chunk-qgxwmagw.js +0 -134
  550. package/dist/chunk-qhdtssn1.js +0 -19
  551. package/dist/chunk-qk584whs.js +0 -3
  552. package/dist/chunk-qm4yppj5.js +0 -57
  553. package/dist/chunk-qwyd9a1d.js +0 -2
  554. package/dist/chunk-qxs6et76.js +0 -196
  555. package/dist/chunk-rb1e4cnb.js +0 -3
  556. package/dist/chunk-rh80q1nd.js +0 -1
  557. package/dist/chunk-rkffm9sy.js +0 -128
  558. package/dist/chunk-rv002yn0.js +0 -14
  559. package/dist/chunk-s6ja2bdg.js +0 -66
  560. package/dist/chunk-sjagg9qz.js +0 -66
  561. package/dist/chunk-sn07azv3.js +0 -3
  562. package/dist/chunk-svahbw0w.js +0 -12
  563. package/dist/chunk-svhtdb0s.js +0 -6
  564. package/dist/chunk-t37dp99j.js +0 -3
  565. package/dist/chunk-tj6zfxeb.js +0 -64
  566. package/dist/chunk-tmgz5t2g.js +0 -3
  567. package/dist/chunk-tr0z0e1g.js +0 -3
  568. package/dist/chunk-tx6br9r4.js +0 -274
  569. package/dist/chunk-v97390pe.js +0 -1
  570. package/dist/chunk-vcr5pzpx.js +0 -233
  571. package/dist/chunk-vdfwv0fp.js +0 -6
  572. package/dist/chunk-vp2395eb.js +0 -3
  573. package/dist/chunk-vpe6napb.js +0 -28
  574. package/dist/chunk-vv9wfz1c.js +0 -12
  575. package/dist/chunk-vw6ejgmy.js +0 -21
  576. package/dist/chunk-vx22he47.js +0 -1
  577. package/dist/chunk-w01y57f5.js +0 -1539
  578. package/dist/chunk-w21mwxdd.js +0 -4
  579. package/dist/chunk-w4n8fqp7.js +0 -216
  580. package/dist/chunk-w959hm8j.js +0 -358
  581. package/dist/chunk-wf7zrjsw.js +0 -138
  582. package/dist/chunk-wk07pwtd.js +0 -321
  583. package/dist/chunk-wvef3ngh.js +0 -127
  584. package/dist/chunk-wxvyj65q.js +0 -2
  585. package/dist/chunk-x1hjv24z.js +0 -11
  586. package/dist/chunk-x39sfpvm.js +0 -302
  587. package/dist/chunk-x4fze3q2.js +0 -314
  588. package/dist/chunk-x64kb787.js +0 -15
  589. package/dist/chunk-xcb0pbr6.js +0 -4
  590. package/dist/chunk-xhkjhxsp.js +0 -3
  591. package/dist/chunk-xhnpsngj.js +0 -5
  592. package/dist/chunk-xsqbk4yk.js +0 -3
  593. package/dist/chunk-xygc53vr.js +0 -68
  594. package/dist/chunk-y0qg6rrv.js +0 -3
  595. package/dist/chunk-y25pr13j.js +0 -19
  596. package/dist/chunk-y4c744dk.js +0 -3
  597. package/dist/chunk-y4md9hp0.js +0 -3
  598. package/dist/chunk-y5wazw6j.js +0 -7
  599. package/dist/chunk-y5xz0jc4.js +0 -141
  600. package/dist/chunk-y86m1wr4.js +0 -4
  601. package/dist/chunk-yaan98dd.js +0 -3
  602. package/dist/chunk-yach037f.js +0 -32
  603. package/dist/chunk-yexjrg9d.js +0 -7
  604. package/dist/chunk-ygvyc6wv.js +0 -90
  605. package/dist/chunk-yj560gp8.js +0 -8
  606. package/dist/chunk-yn38c15w.js +0 -4
  607. package/dist/chunk-yr1gdceh.js +0 -3
  608. package/dist/chunk-yw2fzq86.js +0 -3
  609. package/dist/chunk-ywkrxp2h.js +0 -147
  610. package/dist/chunk-z37xq5rx.js +0 -3
  611. package/dist/chunk-z4djtgt0.js +0 -71
  612. package/dist/chunk-z8cjr9n9.js +0 -7
  613. package/dist/chunk-znxp3zha.js +0 -71
  614. package/dist/chunk-zt2yag10.js +0 -429
@@ -1,302 +0,0 @@
1
- // @bun
2
- function H(j,z){let k=z.pwa?.manifest?.themeColor||"#4f46e5";return`<div class="stx-pwa-install" style="display:none;">
3
- ${j}
4
- </div>
5
- <script>
6
- (function() {
7
- let deferredPrompt;
8
- const installContainer = document.querySelector('.stx-pwa-install');
9
- const installBtn = installContainer?.querySelector('button, [data-pwa-install]') || installContainer;
10
-
11
- window.addEventListener('beforeinstallprompt', (e) => {
12
- e.preventDefault();
13
- deferredPrompt = e;
14
- if (installContainer) {
15
- installContainer.style.display = 'block';
16
- }
17
- });
18
-
19
- if (installBtn) {
20
- installBtn.addEventListener('click', async () => {
21
- if (!deferredPrompt) return;
22
- deferredPrompt.prompt();
23
- const { outcome } = await deferredPrompt.userChoice;
24
- console.log('[PWA] Install prompt outcome:', outcome);
25
- deferredPrompt = null;
26
- if (installContainer) {
27
- installContainer.style.display = 'none';
28
- }
29
- });
30
- }
31
-
32
- window.addEventListener('appinstalled', () => {
33
- console.log('[PWA] App installed');
34
- deferredPrompt = null;
35
- if (installContainer) {
36
- installContainer.style.display = 'none';
37
- }
38
- });
39
-
40
- // Check if already installed
41
- if (window.matchMedia('(display-mode: standalone)').matches) {
42
- if (installContainer) {
43
- installContainer.style.display = 'none';
44
- }
45
- }
46
- })();
47
- </script>`}function J(j,z){let k=z.pwa?.updates,E=k?.message||"A new version is available. Reload to update?",q=k?.autoReload||!1,F=j.trim().length>0,G=`
48
- <div class="stx-pwa-update-banner" style="
49
- position: fixed;
50
- bottom: 0;
51
- left: 0;
52
- right: 0;
53
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
54
- color: white;
55
- padding: 16px 24px;
56
- display: flex;
57
- align-items: center;
58
- justify-content: space-between;
59
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
60
- box-shadow: 0 -4px 20px rgba(0,0,0,0.15);
61
- z-index: 99999;
62
- transform: translateY(100%);
63
- transition: transform 0.3s ease;
64
- ">
65
- <span style="font-size: 14px;">${E}</span>
66
- <div style="display: flex; gap: 12px;">
67
- <button data-pwa-dismiss style="
68
- background: transparent;
69
- border: 1px solid rgba(255,255,255,0.5);
70
- color: white;
71
- padding: 8px 16px;
72
- border-radius: 6px;
73
- cursor: pointer;
74
- font-size: 14px;
75
- ">Later</button>
76
- <button data-pwa-reload style="
77
- background: white;
78
- border: none;
79
- color: #667eea;
80
- padding: 8px 16px;
81
- border-radius: 6px;
82
- cursor: pointer;
83
- font-weight: 600;
84
- font-size: 14px;
85
- ">Update Now</button>
86
- </div>
87
- </div>`;return`${F?`<div class="stx-pwa-update" style="display:none;">${j}</div>`:G}
88
- <script>
89
- (function() {
90
- const updateContainer = document.querySelector('.stx-pwa-update, .stx-pwa-update-banner');
91
- const dismissBtn = updateContainer?.querySelector('[data-pwa-dismiss]');
92
- const reloadBtn = updateContainer?.querySelector('[data-pwa-reload], button');
93
- const autoReload = ${q};
94
- let newWorker = null;
95
-
96
- function showUpdate() {
97
- if (updateContainer) {
98
- if (updateContainer.classList.contains('stx-pwa-update-banner')) {
99
- updateContainer.style.transform = 'translateY(0)';
100
- }
101
- else {
102
- updateContainer.style.display = 'block';
103
- }
104
- }
105
- if (autoReload) {
106
- setTimeout(() => window.location.reload(), 1000);
107
- }
108
- }
109
-
110
- function hideUpdate() {
111
- if (updateContainer) {
112
- if (updateContainer.classList.contains('stx-pwa-update-banner')) {
113
- updateContainer.style.transform = 'translateY(100%)';
114
- }
115
- else {
116
- updateContainer.style.display = 'none';
117
- }
118
- }
119
- }
120
-
121
- if (dismissBtn) {
122
- dismissBtn.addEventListener('click', hideUpdate);
123
- }
124
-
125
- if (reloadBtn) {
126
- reloadBtn.addEventListener('click', () => {
127
- if (newWorker) {
128
- newWorker.postMessage({ type: 'SKIP_WAITING' });
129
- }
130
- window.location.reload();
131
- });
132
- }
133
-
134
- // Listen for service worker updates
135
- if ('serviceWorker' in navigator) {
136
- navigator.serviceWorker.ready.then((registration) => {
137
- registration.addEventListener('updatefound', () => {
138
- newWorker = registration.installing;
139
- if (newWorker) {
140
- newWorker.addEventListener('statechange', () => {
141
- if (newWorker.state === 'installed' && navigator.serviceWorker.controller) {
142
- showUpdate();
143
- }
144
- });
145
- }
146
- });
147
- });
148
-
149
- // Handle controller change (after skipWaiting)
150
- navigator.serviceWorker.addEventListener('controllerchange', () => {
151
- window.location.reload();
152
- });
153
- }
154
-
155
- // Also listen for custom event
156
- window.addEventListener('pwa-update-available', showUpdate);
157
- })();
158
- </script>`}function L(j,z){let k=j.trim().length>0,E=`
159
- <div class="stx-offline-indicator" style="
160
- position: fixed;
161
- top: 16px;
162
- right: 16px;
163
- background: #ef4444;
164
- color: white;
165
- padding: 12px 20px;
166
- border-radius: 8px;
167
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
168
- font-size: 14px;
169
- font-weight: 500;
170
- box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
171
- z-index: 99999;
172
- display: none;
173
- align-items: center;
174
- gap: 8px;
175
- ">
176
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
177
- <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"/>
178
- <circle cx="12" cy="20" r="1"/>
179
- </svg>
180
- <span>You are offline</span>
181
- </div>`;return`${k?`<div class="stx-offline-indicator" style="display:none;">${j}</div>`:`
182
- <div class="stx-offline-indicator" style="
183
- position: fixed;
184
- top: 16px;
185
- right: 16px;
186
- background: #ef4444;
187
- color: white;
188
- padding: 12px 20px;
189
- border-radius: 8px;
190
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
191
- font-size: 14px;
192
- font-weight: 500;
193
- box-shadow: 0 4px 12px rgba(239, 68, 68, 0.3);
194
- z-index: 99999;
195
- display: none;
196
- align-items: center;
197
- gap: 8px;
198
- ">
199
- <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
200
- <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"/>
201
- <circle cx="12" cy="20" r="1"/>
202
- </svg>
203
- <span>You are offline</span>
204
- </div>`}
205
- <script>
206
- (function() {
207
- const indicator = document.querySelector('.stx-offline-indicator');
208
-
209
- function updateStatus() {
210
- if (indicator) {
211
- indicator.style.display = navigator.onLine ? 'none' : 'flex';
212
- }
213
- }
214
-
215
- window.addEventListener('online', updateStatus);
216
- window.addEventListener('offline', updateStatus);
217
- updateStatus();
218
- })();
219
- </script>`}function M(j,z){let k=z.pwa?.push,E=k?.vapidPublicKey||"",q=k?.subscriptionEndpoint||"/api/push/subscribe";return`<div class="stx-pwa-push" style="display:none;">
220
- ${j}
221
- </div>
222
- <script>
223
- (function() {
224
- const pushContainer = document.querySelector('.stx-pwa-push');
225
- const pushBtn = pushContainer?.querySelector('button, [data-pwa-push]') || pushContainer;
226
- const vapidKey = '${E}';
227
- const endpoint = '${q}';
228
-
229
- async function checkPushSupport() {
230
- if (!('serviceWorker' in navigator) || !('PushManager' in window)) {
231
- console.log('[PWA] Push notifications not supported');
232
- return false;
233
- }
234
- return true;
235
- }
236
-
237
- async function subscribeToPush() {
238
- try {
239
- const registration = await navigator.serviceWorker.ready;
240
-
241
- // Check existing subscription
242
- let subscription = await registration.pushManager.getSubscription();
243
-
244
- if (!subscription && vapidKey) {
245
- // Convert VAPID key
246
- const urlBase64ToUint8Array = (base64String) => {
247
- const padding = '='.repeat((4 - base64String.length % 4) % 4);
248
- const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
249
- const rawData = window.atob(base64);
250
- const outputArray = new Uint8Array(rawData.length);
251
- for (let i = 0; i < rawData.length; ++i) {
252
- outputArray[i] = rawData.charCodeAt(i);
253
- }
254
- return outputArray;
255
- };
256
-
257
- subscription = await registration.pushManager.subscribe({
258
- userVisibleOnly: true,
259
- applicationServerKey: urlBase64ToUint8Array(vapidKey)
260
- });
261
-
262
- // Send subscription to server
263
- if (endpoint) {
264
- await fetch(endpoint, {
265
- method: 'POST',
266
- headers: { 'Content-Type': 'application/json' },
267
- body: JSON.stringify(subscription)
268
- });
269
- }
270
-
271
- console.log('[PWA] Push subscription created');
272
- return subscription;
273
- }
274
-
275
- return subscription;
276
- }
277
- catch (error) {
278
- console.error('[PWA] Push subscription failed:', error);
279
- return null;
280
- }
281
- }
282
-
283
- async function init() {
284
- if (await checkPushSupport()) {
285
- const permission = await Notification.requestPermission();
286
- if (permission === 'granted' && pushContainer) {
287
- pushContainer.style.display = 'block';
288
- }
289
- }
290
- }
291
-
292
- if (pushBtn) {
293
- pushBtn.addEventListener('click', subscribeToPush);
294
- }
295
-
296
- // Check support on load
297
- if (pushContainer) {
298
- init();
299
- }
300
- })();
301
- </script>`}var N={name:"pwa.installButton",handler:(j,z,k,E)=>{let q=k.__stx_options||{};return H(j,q)},hasEndTag:!0,description:"Renders a PWA install prompt button that appears when the app can be installed"},Q={name:"pwa.updatePrompt",handler:(j,z,k,E)=>{let q=k.__stx_options||{};return J(j,q)},hasEndTag:!0,description:"Renders a PWA update notification UI when a new version is available"},T={name:"pwa.offlineIndicator",handler:(j,z,k,E)=>{let q=k.__stx_options||{};return L(j,q)},hasEndTag:!0,description:"Renders an offline status indicator that shows when the user loses connection"},V={name:"pwa.pushSubscribe",handler:(j,z,k,E)=>{let q=k.__stx_options||{};return M(j,q)},hasEndTag:!0,description:"Renders a push notification subscription button"},X=[N,Q,T,V];function Z(j){return[...j,...X]}
302
- export{N as Wt,Q as Xt,T as Yt,V as Zt,X as _t,Z as $t};
@@ -1,314 +0,0 @@
1
- // @bun
2
- var e=`
3
- <script data-stx-helpers>
4
- (function() {
5
- 'use strict'
6
-
7
- if (window.__stxHelpers) return
8
- window.__stxHelpers = true
9
-
10
- window.stx = window.stx || {}
11
-
12
- // ===== FORMATTERS =====
13
-
14
- stx.formatCurrency = function(val, currency, locale) {
15
- return new Intl.NumberFormat(locale || 'en-US', {
16
- style: 'currency',
17
- currency: currency || 'USD',
18
- }).format(val)
19
- }
20
-
21
- stx.formatNumber = function(val, decimals, locale) {
22
- var opts = {}
23
- if (typeof decimals === 'number') {
24
- opts.minimumFractionDigits = decimals
25
- opts.maximumFractionDigits = decimals
26
- }
27
- return new Intl.NumberFormat(locale || 'en-US', opts).format(val)
28
- }
29
-
30
- stx.formatDate = function(val, format, locale) {
31
- locale = locale || 'en-US'
32
- var d = val instanceof Date ? val : new Date(val)
33
- if (isNaN(d.getTime())) return String(val)
34
-
35
- if (format === 'long') return d.toLocaleDateString(locale, { year: 'numeric', month: 'long', day: 'numeric' })
36
- if (format === 'relative') {
37
- var diff = Date.now() - d.getTime()
38
- var mins = Math.floor(diff / 60000)
39
- if (mins < 1) return 'just now'
40
- if (mins < 60) return mins + 'm ago'
41
- var hrs = Math.floor(mins / 60)
42
- if (hrs < 24) return hrs + 'h ago'
43
- var days = Math.floor(hrs / 24)
44
- if (days < 7) return days + 'd ago'
45
- return d.toLocaleDateString(locale)
46
- }
47
- return d.toLocaleDateString(locale)
48
- }
49
-
50
- stx.formatPhone = function(phone) {
51
- var n = String(phone).replace(/\\D/g, '')
52
- if (n.length === 10) return \`(\${n.slice(0,3)}) \${n.slice(3,6)}-\${n.slice(6)}\`
53
- if (n.length === 11 && n[0] === '1') return \`+1 (\${n.slice(1,4)}) \${n.slice(4,7)}-\${n.slice(7)}\`
54
- return phone
55
- }
56
-
57
- stx.renderStars = function(rating, max) {
58
- max = max || 5
59
- var full = Math.floor(rating)
60
- var half = rating - full >= 0.5
61
- var h = ''
62
- for (var i = 0; i < max; i++) {
63
- if (i < full || (i === full && half))
64
- h += '<span style="color: var(--badge-amber-text, #f59e0b)">\\u2605</span>'
65
- else
66
- h += '<span style="color: var(--text-muted, #6b7280)">\\u2606</span>'
67
- }
68
- return h
69
- }
70
-
71
- // ===== BADGE SYSTEM =====
72
-
73
- var badgeMaps = {
74
- status: {
75
- 'Active Repair': 'badge-amber', 'Completed': 'badge-emerald',
76
- 'Pending Pickup': 'badge-blue', 'Pending Estimate': 'badge-slate',
77
- 'Approved': 'badge-emerald', 'In Review': 'badge-blue',
78
- 'Supplement': 'badge-amber', 'Draft': 'badge-slate', 'Rejected': 'badge-red',
79
- 'Delivered': 'badge-emerald', 'Shipped': 'badge-blue', 'Processing': 'badge-amber',
80
- 'In Stock': 'badge-emerald', 'Backordered': 'badge-red', 'Low Stock': 'badge-amber',
81
- },
82
- priority: { 'Rush': 'badge-red', 'High': 'badge-amber', 'Normal': 'badge-blue', 'Low': 'badge-slate' },
83
- severity: { 'light': 'severity-light', 'moderate': 'severity-moderate', 'heavy': 'severity-heavy' },
84
- type: { 'OEM': 'badge-blue', 'Aftermarket': 'badge-amber', 'Recycled': 'badge-emerald', 'Reman': 'badge-slate' },
85
- drp: { 'Active DRP': 'badge-emerald', 'Preferred': 'badge-blue', 'Standard': 'badge-slate' },
86
- }
87
-
88
- stx.registerBadgeMap = function(name, map) {
89
- badgeMaps[name] = Object.assign(badgeMaps[name] || {}, map)
90
- }
91
-
92
- stx.badgeClass = function(value, mapName) {
93
- var map = badgeMaps[mapName || 'status'] || badgeMaps.status
94
- return map[value] || 'badge-slate'
95
- }
96
-
97
- stx.badge = function(value, mapName) {
98
- return \`<span class="inline-flex px-2.5 py-1 rounded-full text-xs font-medium \${stx.badgeClass(value, mapName)}">\${value}</span>\`
99
- }
100
-
101
- // ===== DETAIL PANEL BUILDER =====
102
-
103
- function esc(v) { return v != null ? v : '\\u2014' }
104
-
105
- stx.detail = {
106
- panel: function(opts) {
107
- if (!opts || !opts.title) return ''
108
- var badges = ''
109
- if (opts.badges) {
110
- opts.badges.forEach(function(b) { badges += stx.badge(b.text, b.map) })
111
- }
112
- return \`
113
- <div style="display:flex;align-items:center;justify-content:space-between;padding:1.25rem 1.5rem;border-bottom:1px solid var(--border-main)">
114
- <div>
115
- <h2 style="font-size:1.25rem;font-weight:700;color:var(--text-primary)">\${opts.title}</h2>
116
- \${opts.subtitle ? \`<p style="font-size:0.75rem;color:var(--text-muted);margin-top:0.25rem">\${opts.subtitle}</p>\` : ''}
117
- </div>
118
- <div style="display:flex;align-items:center;gap:0.75rem">
119
- \${badges}
120
- <button onclick="closeSlideOver()" style="padding:0.5rem;border-radius:0.5rem;color:var(--text-muted);background:none;border:none;cursor:pointer;font-size:1.5rem;line-height:1" aria-label="Close">&times;</button>
121
- </div>
122
- </div>\`
123
- },
124
-
125
- section: function(label, rows) {
126
- var inner = ''
127
- if (rows) {
128
- if (!Array.isArray(rows) && typeof rows === 'object') {
129
- Object.keys(rows).forEach(function(k) { inner += stx.detail.row(k, rows[k]) })
130
- }
131
- else {
132
- rows.forEach(function(r) {
133
- if (Array.isArray(r)) inner += stx.detail.row(r[0], r[1])
134
- else inner += stx.detail.row(r.label, r.value)
135
- })
136
- }
137
- }
138
- return \`
139
- <div class="detail-section">
140
- <div class="detail-label">\${label}</div>
141
- \${inner}
142
- </div>\`
143
- },
144
-
145
- row: function(label, value) {
146
- return \`
147
- <div class="detail-row">
148
- <span class="detail-row-label">\${label}</span>
149
- <span class="detail-row-value">\${esc(value)}</span>
150
- </div>\`
151
- },
152
-
153
- stats: function(items) {
154
- var list = Array.isArray(items)
155
- ? items
156
- : Object.keys(items).map(function(k) { return { label: k, value: items[k] } })
157
-
158
- var cards = list.map(function(item) {
159
- return \`
160
- <div style="padding:0.75rem;border-radius:0.5rem;background:var(--bg-subtle);text-align:center">
161
- <div style="font-size:1.25rem;font-weight:700;color:var(--text-primary)">\${item.value}</div>
162
- <div style="font-size:0.6875rem;color:var(--text-muted);margin-top:0.25rem">\${item.label}</div>
163
- </div>\`
164
- }).join('')
165
-
166
- return \`<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:0.75rem;padding:0 1.5rem 1rem">\${cards}</div>\`
167
- },
168
-
169
- timeline: function(items) {
170
- var entries = items.map(function(item, i) {
171
- var color = item.color || 'var(--text-accent)'
172
- var isLast = i === items.length - 1
173
-
174
- return \`
175
- <div style="display:flex;gap:0.75rem">
176
- <div style="display:flex;flex-direction:column;align-items:center;flex-shrink:0">
177
- <div style="width:10px;height:10px;border-radius:50%;background:\${color};flex-shrink:0"></div>
178
- \${!isLast ? '<div style="width:2px;flex:1;background:var(--bar-track);min-height:24px"></div>' : ''}
179
- </div>
180
- <div style="padding-bottom:\${isLast ? '0' : '1rem'};flex:1">
181
- <div style="font-size:0.8125rem;font-weight:500;color:var(--text-primary)">\${item.title}</div>
182
- \${item.description ? \`<div style="font-size:0.75rem;color:var(--text-muted);margin-top:0.125rem">\${item.description}</div>\` : ''}
183
- \${item.meta ? \`<div style="font-size:0.6875rem;color:var(--text-tertiary);margin-top:0.25rem">\${item.meta}</div>\` : ''}
184
- </div>
185
- </div>\`
186
- }).join('')
187
-
188
- return \`<div style="padding:0 1.5rem 1rem">\${entries}</div>\`
189
- },
190
-
191
- open: function(html) {
192
- if (typeof openSlideOver === 'function') openSlideOver(html)
193
- },
194
- }
195
-
196
- // ===== DATA TABLE HELPERS =====
197
-
198
- stx.table = {
199
- filter: function(opts) {
200
- var searchEl = document.getElementById(opts.searchId)
201
- var search = searchEl ? searchEl.value.toLowerCase() : ''
202
- var rows = document.querySelectorAll(opts.rowSelector || 'tbody tr')
203
- var filters = opts.filters || []
204
- var matched = []
205
-
206
- rows.forEach(function(row) {
207
- var text = row.textContent.toLowerCase()
208
- var matchSearch = !search || text.indexOf(search) !== -1
209
- var matchFilters = filters.every(function(f) {
210
- var el = document.getElementById(f.id)
211
- if (!el) return true
212
- var val = el.value
213
- if (!val || val === f.allValue) return true
214
- return row.getAttribute(\`data-\${f.attr}\`) === val
215
- })
216
-
217
- if (matchSearch && matchFilters) matched.push(row)
218
- else row.style.display = 'none'
219
- })
220
-
221
- return matched
222
- },
223
-
224
- sort: function(rows, sortBy, direction) {
225
- direction = direction || 'asc'
226
- return rows.slice().sort(function(a, b) {
227
- var aVal = a.getAttribute(\`data-\${sortBy}\`) || a.textContent
228
- var bVal = b.getAttribute(\`data-\${sortBy}\`) || b.textContent
229
- var aNum = parseFloat(aVal.replace(/[^0-9.-]/g, ''))
230
- var bNum = parseFloat(bVal.replace(/[^0-9.-]/g, ''))
231
- if (!isNaN(aNum) && !isNaN(bNum)) return direction === 'asc' ? aNum - bNum : bNum - aNum
232
- return direction === 'asc' ? aVal.localeCompare(bVal) : bVal.localeCompare(aVal)
233
- })
234
- },
235
- }
236
-
237
- // ===== PAGINATION =====
238
-
239
- stx.pagination = function(opts) {
240
- var page = opts.page || 1
241
- var perPage = opts.perPage || 10
242
- var items = opts.items || []
243
- var total = items.length
244
- var totalPages = Math.max(1, Math.ceil(total / perPage))
245
- if (page > totalPages) page = totalPages
246
-
247
- var start = (page - 1) * perPage
248
- var end = Math.min(start + perPage, total)
249
-
250
- items.forEach(function(el, i) { el.style.display = (i >= start && i < end) ? '' : 'none' })
251
-
252
- var ids = { count: opts.countId, total: opts.totalId, empty: opts.emptyId, bar: opts.barId }
253
- if (ids.count) { var el = document.getElementById(ids.count); if (el) el.textContent = total === 0 ? '0' : \`\${start + 1}\\u2013\${end}\` }
254
- if (ids.total) { var el = document.getElementById(ids.total); if (el) el.textContent = total }
255
- if (ids.empty) { var el = document.getElementById(ids.empty); if (el) el.style.display = total === 0 ? 'block' : 'none' }
256
- if (ids.bar) { var el = document.getElementById(ids.bar); if (el) el.style.display = total === 0 ? 'none' : '' }
257
-
258
- if (opts.buttonsId) {
259
- var wrap = document.getElementById(opts.buttonsId)
260
- if (wrap) {
261
- var go = opts.goToPage
262
- var pages = stx.pagination.getPages(page, totalPages)
263
-
264
- var btn = function(label, target, disabled) {
265
- return \`<button onclick="\${go}(\${target})" \${disabled ? 'disabled' : ''}
266
- class="px-3 py-1.5 rounded-lg text-sm cursor-pointer"
267
- style="background:var(--bg-subtle);border:1px solid var(--border-input);color:\${disabled ? 'var(--text-muted)' : 'var(--text-primary)'};opacity:\${disabled ? '0.5' : '1'}">\${label}</button>\`
268
- }
269
-
270
- var h = btn('Previous', page - 1, page === 1)
271
- pages.forEach(function(p) {
272
- if (p === '...') {
273
- h += '<span class="px-2 text-sm" style="color:var(--text-muted)">\\u2026</span>'
274
- }
275
- else if (p === page) {
276
- h += \`<button class="w-9 h-9 rounded-lg text-sm font-medium" style="background:var(--btn-primary-bg, var(--text-accent));color:#fff">\${p}</button>\`
277
- }
278
- else {
279
- h += btn(p, p, false)
280
- }
281
- })
282
- h += btn('Next', page + 1, page === totalPages)
283
- wrap.innerHTML = h
284
- }
285
- }
286
-
287
- return { page: page, totalPages: totalPages, total: total, start: start, end: end }
288
- }
289
-
290
- stx.pagination.getPages = function(current, total) {
291
- if (total <= 7) return Array.from({ length: total }, function(_, i) { return i + 1 })
292
- var pages = [1]
293
- if (current > 3) pages.push('...')
294
- for (var i = Math.max(2, current - 1); i <= Math.min(total - 1, current + 1); i++) pages.push(i)
295
- if (current < total - 2) pages.push('...')
296
- pages.push(total)
297
- return pages
298
- }
299
-
300
- // ===== UTILITIES =====
301
-
302
- stx.debounce = function(fn, delay) {
303
- var timer
304
- return function() {
305
- var args = arguments, ctx = this
306
- clearTimeout(timer)
307
- timer = setTimeout(function() { fn.apply(ctx, args) }, delay || 250)
308
- }
309
- }
310
-
311
- })()
312
- </script>
313
- `;
314
- export{e as vp};
@@ -1,15 +0,0 @@
1
- // @bun
2
- import $ from"path";function u(G,X,H,J){let q=G;q=q.replace(/@a11y\(\s*['"]([^'"]+)['"]\s*(?:,\s*['"]([^'"]+)['"]\s*)?\)/g,(N,j,z)=>{let V={"aria-label":"Ensure interactive elements have accessible labels","alt-text":"Provide alternative text for images",focus:"Ensure the element can receive keyboard focus",landmark:"Use appropriate landmark roles","heading-order":"Maintain proper heading hierarchy","color-contrast":"Ensure sufficient color contrast","keyboard-nav":"Make sure element is keyboard navigable","screen-reader":"Optimize for screen reader users"}[j]||"Make this element accessible";return`<!-- a11y-hint: ${z||V} -->`});let K=/@screenReader\(([^@]*)\)@endScreenReader/g;return q=q.replace(K,(N,j)=>{return`<span class="sr-only">${j.trim()}</span>`}),q=q.replace(/@ariaDescribe\(\s*['"]([^'"]+)['"]\s*,\s*['"]([^'"]+)['"]\s*\)/g,(N,j,z)=>{return`<span id="${`desc-${j}`}" class="sr-only">${z}</span>`}),q}function v(){return`
3
- .sr-only {
4
- position: absolute;
5
- width: 1px;
6
- height: 1px;
7
- padding: 0;
8
- margin: -1px;
9
- overflow: hidden;
10
- clip: rect(0, 0, 0, 0);
11
- white-space: nowrap;
12
- border-width: 0;
13
- }
14
- `.trim()}function A(){return typeof globalThis.document<"u"&&typeof globalThis.document.createElement==="function"}function M(G,X){let H=[],J=/<img\s+([^>]*)>/gi,q;q=J.exec(G);while(q!==null){let U=q[1];if(!/\balt\s*=/i.test(U))H.push({type:"missing-alt",element:q[0].substring(0,100),message:"Image missing alt attribute",impact:"serious",help:"Add alt text to images for screen readers",helpUrl:"https://web.dev/learn/accessibility/images/"});q=J.exec(G)}let K=/<button([^>]*)>\s*<\/button>/gi;q=K.exec(G);while(q!==null){let U=q[1];if(!/\baria-label\s*=/i.test(U)&&!/\btitle\s*=/i.test(U))H.push({type:"missing-accessible-name",element:q[0].substring(0,100),message:"Empty button missing accessible name",impact:"critical",help:"Add text content, aria-label, or title",helpUrl:"https://web.dev/learn/accessibility/aria-html/"});q=K.exec(G)}let N=/<a\s+([^>]*)>\s*<\/a>/gi;q=N.exec(G);while(q!==null){let U=q[1];if(!/\baria-label\s*=/i.test(U)&&!/\btitle\s*=/i.test(U))H.push({type:"link-missing-text",element:q[0].substring(0,100),message:"Link has no accessible text",impact:"serious",help:"Add text content, aria-label, or title to links",helpUrl:"https://web.dev/learn/accessibility/more-html/#links"});q=N.exec(G)}let j=/<(input|select|textarea)\s+([^>]*)>/gi;q=j.exec(G);while(q!==null){let U=q[2];if(/\btype\s*=\s*["']hidden["']/i.test(U)){q=j.exec(G);continue}let O=/\baria-label\s*=/i.test(U)||/\baria-labelledby\s*=/i.test(U),D=U.match(/\bid\s*=\s*["']([^"']+)["']/i);if(!O){let F=D&&new RegExp(`<label[^>]*\\bfor\\s*=\\s*["']${D[1]}["']`,"i").test(G),E=q.index,w=G.substring(0,E),b=G.substring(E),T=(w.match(/<label\b/gi)||[]).length,I=(w.match(/<\/label>/gi)||[]).length,B=T>I;if(!F&&!B)H.push({type:"input-missing-label",element:q[0].substring(0,100),message:"Form input missing associated label",impact:"serious",help:"Associate a label with the input or use aria-label",helpUrl:"https://web.dev/learn/accessibility/forms/"})}q=j.exec(G)}let z=/<h([1-6])[^>]*>/gi,Q=[];q=z.exec(G);while(q!==null)Q.push(Number.parseInt(q[1],10)),q=z.exec(G);let V=0;for(let U of Q){if(V>0&&U>V+1)H.push({type:"heading-skip",element:`<h${U}>`,message:`Heading level skipped from h${V} to h${U}`,impact:"moderate",help:"Maintain proper heading hierarchy without skipping levels",helpUrl:"https://web.dev/learn/accessibility/structure/"});V=U}if(/<html\b/i.test(G)&&!/<html[^>]*\slang\s*=/i.test(G))H.push({type:"missing-lang",element:"<html>",message:"Document language not specified",impact:"serious",help:"Add lang attribute to the html element",helpUrl:"https://web.dev/learn/accessibility/more-html/#language"});let Y=/<table[^>]*>([\s\S]*?)<\/table>/gi;q=Y.exec(G);while(q!==null){let U=q[1];if(!/<th\b/i.test(U))H.push({type:"table-missing-headers",element:"<table>",message:"Table missing header cells (th)",impact:"serious",help:"Use th elements for table headers",helpUrl:"https://web.dev/learn/accessibility/more-html/#tables"});q=Y.exec(G)}let _=/<(video|audio)[^>]*\sautoplay\s[^>]*>/gi;q=_.exec(G);while(q!==null){if(!/\bmuted\b/i.test(q[0]))H.push({type:"autoplay-audio",element:`<${q[1]}>`,message:"Auto-playing media may disrupt users",impact:"moderate",help:"Add muted attribute or provide controls to stop playback",helpUrl:"https://web.dev/learn/accessibility/more-html/#multimedia"});q=_.exec(G)}let Z=/\btabindex\s*=\s*["']([1-9]\d*)["']/gi;q=Z.exec(G);while(q!==null)H.push({type:"positive-tabindex",element:`tabindex="${q[1]}"`,message:"Positive tabindex disrupts natural tab order",impact:"moderate",help:'Use tabindex="0" or "-1" instead of positive values',helpUrl:"https://web.dev/learn/accessibility/focus/#tab-index"}),q=Z.exec(G);let S=/<iframe\s+([^>]*)>/gi;q=S.exec(G);while(q!==null){let U=q[1];if(!/\btitle\s*=/i.test(U)&&!/\baria-label\s*=/i.test(U))H.push({type:"iframe-missing-title",element:"<iframe>",message:"Iframe missing title attribute",impact:"serious",help:"Add a title attribute to describe the iframe content",helpUrl:"https://web.dev/learn/accessibility/more-html/#frames"});q=S.exec(G)}let W=/<([a-z]+)\s+([^>]*role\s*=\s*["']button["'][^>]*)>/gi;q=W.exec(G);while(q!==null){let U=q[1].toLowerCase(),O=q[2];if(U!=="button"&&!/\btabindex\s*=/i.test(O))H.push({type:"button-not-focusable",element:q[0].substring(0,100),message:'Element with role="button" is not keyboard focusable',impact:"serious",help:'Add tabindex="0" to make custom buttons focusable',helpUrl:"https://web.dev/learn/accessibility/focus/"});q=W.exec(G)}return H}async function C(G,X){if(!A())return M(G,X);let H=[];try{let J=globalThis.document.createElement("div");J.innerHTML=G,J.querySelectorAll("img").forEach((j)=>{if(!j.hasAttribute("alt"))H.push({type:"missing-alt",element:`<${j.outerHTML}>`,message:"Image missing alt attribute",impact:"serious",help:"Add alt text to images for screen readers",helpUrl:"https://web.dev/learn/accessibility/images/"})}),J.querySelectorAll('button, a, [role="button"]').forEach((j)=>{if(!(j.hasAttribute("aria-label")||j.hasAttribute("aria-labelledby")||j.textContent&&j.textContent.trim().length>0))H.push({type:"missing-accessible-name",element:`<${j.outerHTML}>`,message:"Interactive element missing accessible name",impact:"critical",help:"Add text content, aria-label, or aria-labelledby",helpUrl:"https://web.dev/learn/accessibility/aria-html/"})}),J.querySelectorAll("input, select, textarea").forEach((j)=>{let z=j.getAttribute("id"),Q=z&&J.querySelector(`label[for="${z}"]`),V=j.hasAttribute("aria-label")||j.hasAttribute("aria-labelledby"),Y=j.closest("label")!==null;if(!Q&&!V&&!Y)H.push({type:"input-missing-label",element:`<${j.outerHTML}>`,message:"Form input missing associated label",impact:"serious",help:"Associate a label with the input or use aria-label",helpUrl:"https://web.dev/learn/accessibility/forms/"})});let q=Array.from(J.querySelectorAll("h1, h2, h3, h4, h5, h6")),K=0;for(let j of q){let z=Number.parseInt(j.tagName.charAt(1));if(K>0&&z>K+1)H.push({type:"heading-skip",element:`<${j.outerHTML}>`,message:`Heading level skipped from h${K} to h${z}`,impact:"moderate",help:"Maintain proper heading hierarchy without skipping levels",helpUrl:"https://web.dev/learn/accessibility/structure/"});K=z}let N=J.querySelector("html");if(G.includes("<html")&&N&&!N.hasAttribute("lang"))H.push({type:"missing-lang",element:"<html>",message:"Document language not specified",impact:"serious",help:"Add lang attribute to the html element",helpUrl:"https://web.dev/learn/accessibility/more-html/#language"});if(J.querySelectorAll("a").forEach((j)=>{let z=j.textContent&&j.textContent.trim().length>0,Q=j.hasAttribute("aria-label")||j.hasAttribute("aria-labelledby"),V=j.hasAttribute("title"),Y=j.querySelector("img[alt]");if(!z&&!Q&&!V&&!Y)H.push({type:"link-missing-text",element:`<${j.outerHTML}>`,message:"Link has no accessible text",impact:"serious",help:"Add text content, aria-label, or title to links",helpUrl:"https://web.dev/learn/accessibility/more-html/#links"})}),G.includes("<nav")||G.includes("<header")){if(!J.querySelector('a[href="#main"], a[href="#content"], .skip-link, [class*="skip"]')&&J.querySelectorAll("a").length>5)H.push({type:"missing-skip-link",element:"<nav>",message:"Consider adding a skip navigation link",impact:"minor",help:"Add a skip link to allow keyboard users to bypass navigation",helpUrl:"https://web.dev/learn/accessibility/focus/#skip-links"})}if(J.querySelectorAll("table").forEach((j)=>{let z=j.querySelector("caption");if(!j.querySelector("th"))H.push({type:"table-missing-headers",element:"<table>",message:"Table missing header cells (th)",impact:"serious",help:"Use th elements for table headers",helpUrl:"https://web.dev/learn/accessibility/more-html/#tables"});if(!z&&!j.hasAttribute("aria-label")&&!j.hasAttribute("aria-labelledby"))H.push({type:"table-missing-caption",element:"<table>",message:"Table missing caption or accessible name",impact:"minor",help:"Add a caption element or aria-label to describe the table",helpUrl:"https://web.dev/learn/accessibility/more-html/#tables"})}),J.querySelectorAll('[style*="color"]').forEach((j)=>{let z=j.getAttribute("style")||"";if(z.includes("color:")&&!z.includes("background"))H.push({type:"potential-contrast-issue",element:`<${j.tagName.toLowerCase()}>`,message:"Element has inline color style - verify contrast ratio",impact:"minor",help:"Ensure text has sufficient contrast ratio (4.5:1 for normal text)",helpUrl:"https://web.dev/learn/accessibility/color-contrast/"})}),J.querySelectorAll("video[autoplay], audio[autoplay]").forEach((j)=>{if(!j.hasAttribute("muted"))H.push({type:"autoplay-audio",element:`<${j.tagName.toLowerCase()}>`,message:"Auto-playing media may disrupt users",impact:"moderate",help:"Add muted attribute or provide controls to stop playback",helpUrl:"https://web.dev/learn/accessibility/more-html/#multimedia"})}),J.querySelectorAll("[tabindex]").forEach((j)=>{if(Number.parseInt(j.getAttribute("tabindex")||"0")>0)H.push({type:"positive-tabindex",element:`<${j.tagName.toLowerCase()}>`,message:"Positive tabindex disrupts natural tab order",impact:"moderate",help:'Use tabindex="0" or "-1" instead of positive values',helpUrl:"https://web.dev/learn/accessibility/focus/#tab-index"})}),J.querySelectorAll('[role="button"]').forEach((j)=>{if(!j.hasAttribute("tabindex"))H.push({type:"button-not-focusable",element:`<${j.outerHTML}>`,message:'Element with role="button" is not keyboard focusable',impact:"serious",help:'Add tabindex="0" to make custom buttons focusable',helpUrl:"https://web.dev/learn/accessibility/focus/"})}),G.includes("<body")&&!J.querySelector('main, [role="main"]'))H.push({type:"missing-main-landmark",element:"<body>",message:"Document missing main landmark region",impact:"moderate",help:"Add a main element to identify the primary content",helpUrl:"https://web.dev/learn/accessibility/structure/#landmarks"});J.querySelectorAll("iframe").forEach((j)=>{if(!j.hasAttribute("title")&&!j.hasAttribute("aria-label"))H.push({type:"iframe-missing-title",element:"<iframe>",message:"Iframe missing title attribute",impact:"serious",help:"Add a title attribute to describe the iframe content",helpUrl:"https://web.dev/learn/accessibility/more-html/#frames"})})}catch(J){console.error(`Error checking accessibility in ${X}:`,J)}return H}async function x(G,X={}){let H={},{recursive:J=!0,ignorePaths:q=[]}=X,K=$.join(G,J?"**/*.stx":"*.stx"),N=new Bun.Glob(K),j=[];for await(let z of N.scan())if(!q.some((V)=>z.includes($.normalize(V))))j.push(z);for(let z of j)try{let Q=await Bun.file(z).text();if(z.endsWith("good-a11y.stx"))continue;let V=await C(Q,z);if(V.length>0)H[z]=V}catch(Q){console.error(`Error scanning ${z}:`,Q)}return H}var P={fixMissingAlt:!0,fixMissingLabels:!0,fixMissingFormLabels:!0,fixTableHeaders:!0,fixMissingLang:!0,fixPositiveTabindex:!0,fixButtonFocusable:!0,defaultLang:"en"};function L(G,X={}){let H={...P,...X},J=[],q=G;if(H.fixMissingAlt)q=q.replace(/<img([^>]*?)(?<!\balt\s*=\s*["'][^"']*["'])(\s*\/?>)/gi,(K,N,j)=>{if(/\balt\s*=/i.test(N))return K;let z=K,Q=`<img${N} alt=""${j}`;return J.push({type:"missing-alt",description:"Added empty alt attribute to image",before:z,after:Q}),Q});if(H.fixMissingLabels)q=q.replace(/<button([^>]*)>\s*<\/button>/gi,(K,N)=>{if(/\baria-label\s*=/i.test(N)||/\btitle\s*=/i.test(N))return K;let j=K,z=`<button${N} aria-label="Button"></button>`;return J.push({type:"missing-accessible-name",description:"Added aria-label to empty button",before:j,after:z}),z}),q=q.replace(/<a([^>]*)>\s*(<(?:i|span|svg)[^>]*(?:class="[^"]*icon[^"]*")?[^>]*>.*?<\/(?:i|span|svg)>)?\s*<\/a>/gi,(K,N,j)=>{if(/\baria-label\s*=/i.test(N)||/\btitle\s*=/i.test(N))return K;if(!j&&K.replace(/<a[^>]*>|<\/a>/gi,"").trim())return K;let z=K,Q=`<a${N} aria-label="Link">${j||""}</a>`;return J.push({type:"missing-accessible-name",description:"Added aria-label to link without text",before:z,after:Q}),Q});if(H.fixMissingFormLabels)q=q.replace(/<(input|select|textarea)([^>]*)>/gi,(K,N,j)=>{if(/\baria-label\s*=/i.test(j)||/\baria-labelledby\s*=/i.test(j))return K;if(/\btype\s*=\s*["']hidden["']/i.test(j))return K;let z=j.match(/\bname\s*=\s*["']([^"']+)["']/i),Q=j.match(/\bid\s*=\s*["']([^"']+)["']/i),V=z?.[1]||Q?.[1]||N,Y=K,_=`<${N}${j} aria-label="${V}">`;return J.push({type:"input-missing-label",description:`Added aria-label to ${N} element`,before:Y,after:_}),_});if(H.fixMissingLang)q=q.replace(/<html([^>]*)>/gi,(K,N)=>{if(/\blang\s*=/i.test(N))return K;let j=K,z=`<html${N} lang="${H.defaultLang}">`;return J.push({type:"missing-lang",description:`Added lang="${H.defaultLang}" to html element`,before:j,after:z}),z});if(H.fixPositiveTabindex)q=q.replace(/\btabindex\s*=\s*["']([1-9]\d*)["']/gi,(K,N)=>{let j=K,z='tabindex="0"';return J.push({type:"positive-tabindex",description:`Changed tabindex="${N}" to tabindex="0"`,before:j,after:'tabindex="0"'}),'tabindex="0"'});if(H.fixButtonFocusable)q=q.replace(/<([a-z]+)(\s[^>]*role\s*=\s*["']button["'][^>]*)>/gi,(K,N,j)=>{if(/\btabindex\s*=/i.test(j))return K;if(N.toLowerCase()==="button")return K;let z=K,Q=`<${N}${j} tabindex="0">`;return J.push({type:"button-not-focusable",description:'Added tabindex="0" to element with role="button"',before:z,after:Q}),Q});if(H.fixTableHeaders)q=q.replace(/<th([^>]*)>/gi,(K,N)=>{if(/\bscope\s*=/i.test(N))return K;let j=K,z=`<th${N} scope="col">`;return J.push({type:"table-missing-scope",description:'Added scope="col" to table header',before:j,after:z}),z});return{original:G,fixed:q,fixCount:J.length,fixes:J}}async function k(G,X={},H=!1){let J=await Bun.file(G).text(),q=L(J,X);if(H&&q.fixCount>0)await Bun.write(G,q.fixed);return q}async function p(G,X={},H={}){let J={},{recursive:q=!0,ignorePaths:K=[],writeBack:N=!1,extensions:j=[".stx",".html",".htm"]}=H,z=j.length===1?`*${j[0]}`:`*{${j.join(",")}}`,Q=$.join(G,q?`**/${z}`:z),V=new Bun.Glob(Q);for await(let Y of V.scan()){if(K.some((Z)=>Y.includes($.normalize(Z))))continue;try{let Z=await k(Y,X,N);if(Z.fixCount>0)J[Y]=Z}catch(Z){console.error(`Error fixing ${Y}:`,Z)}}return J}var y={name:"a11y",handler:(G,X,H,J)=>{if(!X.length)return G;let q=X[0].replace(/['"]/g,""),K=X.length>1?X[1].replace(/['"]/g,""):"",j={"aria-label":"Ensure interactive elements have accessible labels","alt-text":"Provide alternative text for images",focus:"Ensure the element can receive keyboard focus",landmark:"Use appropriate landmark roles","heading-order":"Maintain proper heading hierarchy","color-contrast":"Ensure sufficient color contrast","keyboard-nav":"Make sure element is keyboard navigable","screen-reader":"Optimize for screen reader users"}[q]||"Make this element accessible";return`<!-- a11y-hint: ${K||j} -->${G}`},hasEndTag:!1},R={name:"screenReader",handler:(G)=>{return`<span class="sr-only">${G}</span>`},hasEndTag:!0};function g(){return[y,R]}
15
- export{u as bA,v as cA,A as dA,C as eA,x as fA,L as gA,k as hA,p as iA,y as jA,R as kA,g as lA};