@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,13 +1,438 @@
1
- // @bun
2
- import"./chunk-3jm3snz8.js";var P={if:"control-flow",else:"control-flow",elseif:"control-flow",unless:"control-flow",switch:"control-flow",case:"control-flow",default:"control-flow",for:"loop",foreach:"loop",forelse:"loop",while:"loop",empty:"loop",break:"loop",continue:"loop",extends:"layout",section:"layout",yield:"layout",parent:"layout",include:"layout",includeIf:"layout",includeWhen:"layout",includeFirst:"layout",once:"layout",push:"layout",prepend:"layout",stack:"layout",component:"component",slot:"component",props:"component",webcomponent:"component",auth:"auth",guest:"auth",can:"auth",cannot:"auth",role:"auth",hasRole:"auth",hasAnyRole:"auth",csrf:"form",method:"form",error:"form",old:"form",input:"form",textarea:"form",select:"form",checkbox:"form",radio:"form",meta:"seo",title:"seo",seo:"seo",jsonld:"seo",canonical:"seo",translate:"i18n",lang:"i18n",choice:"i18n"},f={"control-flow":"symbol-branch",loop:"symbol-loop",layout:"symbol-structure",component:"symbol-class",auth:"shield",form:"symbol-field",seo:"search",i18n:"globe",custom:"symbol-misc"};function d(B){let Q={type:"document",name:"document",label:"Document",range:{start:0,end:B.length,line:1,column:1},children:[]},j=[Q],Y=0,V=1,G=1,W=(J)=>{if(J===`
3
- `)V++,G=1;else G++;Y++},Z=()=>({start:Y,end:Y,line:V,column:G});while(Y<B.length){let J=B.slice(Y),A=J.match(/^@(\w+)(?:\s*\(([^)]*)\))?/);if(A){let[X,H,q]=A,F=P[H]||"custom";if(H.startsWith("end")){let K=H.slice(3),$=j[j.length-1];if($.name===K&&j.length>1)$.range.end=Y+X.length,j.pop()}else{let K=C(H),$={type:"directive",name:H,label:`@${H}${q?`(${S(q,30)})`:""}`,range:Z(),children:[],directiveCategory:F,isClosable:K,icon:f[F],description:q};if(j[j.length-1].children.push($),K)j.push($)}for(let K of X)W(K);continue}let z=J.match(/^<([A-Z][A-Za-z0-9]+)([^>]*)>/);if(z){let[X,H,q]=z,F={type:"component",name:H,label:`<${H}>`,range:Z(),children:[],attributes:b(q),icon:"symbol-class",isClosable:!X.endsWith("/>")};if(j[j.length-1].children.push(F),F.isClosable)j.push(F);for(let K of X)W(K);continue}let U=J.match(/^<\/([A-Z][A-Za-z0-9]+)>/);if(U){let[X,H]=U,q=j[j.length-1];if(q.name===H&&q.type==="component"&&j.length>1)q.range.end=Y+X.length,j.pop();for(let F of X)W(F);continue}let D=J.match(/^<([a-z][a-z0-9-]*)([^>]*)>/i);if(D){let[X,H,q]=D,F=X.endsWith("/>")||v(H),K={type:"element",name:H,label:`<${H}>`,range:Z(),children:[],attributes:b(q),isClosable:!F};if(j[j.length-1].children.push(K),K.isClosable)j.push(K);for(let $ of X)W($);continue}let O=J.match(/^<\/([a-z][a-z0-9-]*)>/i);if(O){let[X,H]=O,q=j[j.length-1];if(q.name===H&&q.type==="element"&&j.length>1)q.range.end=Y+X.length,j.pop();for(let F of X)W(F);continue}let R=J.match(/^\{\{([^}]+)\}\}/);if(R){let[X,H]=R,q={type:"expression",name:"expression",label:`{{ ${S(H.trim(),30)} }}`,range:Z(),children:[],icon:"symbol-variable"};j[j.length-1].children.push(q);for(let F of X)W(F);continue}let L=J.match(/^<script([^>]*)>/);if(L){let[X]=L,H={type:"script",name:"script",label:"<script>",range:Z(),children:[],icon:"symbol-event",isClosable:!0};j[j.length-1].children.push(H),j.push(H);for(let q of X)W(q);continue}if(J.startsWith("</script>")){let H=j[j.length-1];if(H.type==="script"&&j.length>1)H.range.end=Y+9,j.pop();for(let q of"</script>")W(q);continue}let T=J.match(/^<style([^>]*)>/);if(T){let[X]=T,H={type:"style",name:"style",label:"<style>",range:Z(),children:[],icon:"symbol-color",isClosable:!0};j[j.length-1].children.push(H),j.push(H);for(let q of X)W(q);continue}if(J.startsWith("</style>")){let H=j[j.length-1];if(H.type==="style"&&j.length>1)H.range.end=Y+8,j.pop();for(let q of"</style>")W(q);continue}let E=J.match(/^\{\{--([^}]*?)--\}\}/);if(E){let[X,H]=E,q={type:"comment",name:"comment",label:`{{-- ${S(H.trim(),30)} --}}`,range:Z(),children:[],icon:"comment"};j[j.length-1].children.push(q);for(let F of X)W(F);continue}W(B[Y])}return Q}function h(B){return y(B)}function u(B){return y(B)}function y(B){let Q=[],j=[],Y=[],V=[],G=[],W=[],Z=[],J,A=/\{\{\s*([^}]+?)\s*\}\}/g,z=B.matchAll(A);for(let q of z){let K=q[1].match(/^([a-z_$][\w$]*)/i);if(K){let $=I(B,q.index);Q.push({name:K[1],line:$,column:g(B,q.index),context:"expression"})}}let U=/@(\w+)(?:\s*\(([^)]*)\))?/g,D=B.matchAll(U);for(let q of D){let F=q[1],K=q[2],$=I(B,q.index);if(F==="extends"&&K)J={extends:K.replace(/['"]/g,""),line:$,sections:[]};else if(F==="section"&&K){let _=K.replace(/['"]/g,"").split(",")[0].trim();if(G.push({name:_,line:$,content:""}),J)J.sections.push(_)}else if(F==="slot")V.push({name:K?K.replace(/['"]/g,""):"default",line:$,isNamed:!!K});else if(F==="component"&&K){let _=K.replace(/['"]/g,"").split(",")[0].trim();j.push({name:_,line:$,props:{},hasSlot:!1})}Y.push({name:F,category:P[F]||"custom",line:$,params:K,hasEndTag:C(F)})}let O=/<([A-Z][A-Za-z0-9]+)([^>]*)>/g,R=B.matchAll(O);for(let q of R){let F=q[1],K=q[2],$=I(B,q.index),_=B.indexOf(`</${F}>`,q.index),w=_!==-1&&B.slice(q.index+q[0].length,_).trim().length>0;j.push({name:F,line:$,props:b(K),hasSlot:w})}let L=/<script([^>]*)>([\s\S]*?)<\/script>/g,T=B.matchAll(L);for(let q of T){let F=q[1],K=q[2],$=I(B,q.index),_=F.includes('lang="ts"')||F.includes("lang='ts'"),w=[],N=/export\s+(?:const|let|var|function|class)\s+(\w+)/g,x=K.matchAll(N);for(let M of x)w.push(M[1]);W.push({type:_?"typescript":"javascript",line:$,content:K,exports:w})}let E=/<style([^>]*)>([\s\S]*?)<\/style>/g,X=B.matchAll(E);for(let q of X){let F=q[1],K=q[2],$=I(B,q.index),_="css";if(F.includes('lang="scss"')||F.includes("lang='scss'"))_="scss";if(F.includes('lang="less"')||F.includes("lang='less'"))_="less";Z.push({type:_,line:$,content:K,scoped:F.includes("scoped")})}let H=k(B,Y,j,Q);return{variables:Q,components:j,directives:Y,slots:V,sections:G,scripts:W,styles:Z,layout:J,metrics:H}}function k(B,Q,j,Y){let V=B.split(`
4
- `).length,G=B.length,W=0,Z=0;for(let z of Q)if(z.hasEndTag&&!z.name.startsWith("end"))Z++,W=Math.max(W,Z);else if(z.name.startsWith("end"))Z--;let A=1+Q.filter((z)=>z.category==="control-flow"||z.category==="loop").length;return{lines:V,characters:G,maxNestingDepth:W,directiveCount:Q.length,componentCount:j.length,expressionCount:Y.length,complexity:A}}async function l(B,Q={}){let{context:j={},includeStyles:Y=!0,includeScripts:V=!1,wrapInDocument:G=!0,baseUrl:W="",customCss:Z=""}=Q,J=B;if(J=J.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(z,U)=>{let D=U.trim().split(".")[0].split("[")[0];if(D in j){let O=j[D];return typeof O==="object"?JSON.stringify(O):String(O)}return`<span class="stx-preview-placeholder">${U}</span>`}),J=J.replace(/@(\w+)(?:\s*\([^)]*\))?/g,(z,U)=>{if(U.startsWith("end"))return"";return`<span class="stx-preview-directive" data-directive="${U}">${z}</span>`}),!V)J=J.replace(/<script[\s\S]*?<\/script>/gi,"");let A="";if(Y){let z=J.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/gi);for(let U of z)A+=U[1];J=J.replace(/<style[\s\S]*?<\/style>/gi,"")}if(G)return`<!DOCTYPE html>
1
+ const DIRECTIVE_CATEGORIES = {
2
+ if: "control-flow",
3
+ else: "control-flow",
4
+ elseif: "control-flow",
5
+ unless: "control-flow",
6
+ switch: "control-flow",
7
+ case: "control-flow",
8
+ default: "control-flow",
9
+ for: "loop",
10
+ foreach: "loop",
11
+ forelse: "loop",
12
+ while: "loop",
13
+ empty: "loop",
14
+ break: "loop",
15
+ continue: "loop",
16
+ extends: "layout",
17
+ section: "layout",
18
+ yield: "layout",
19
+ parent: "layout",
20
+ include: "layout",
21
+ includeIf: "layout",
22
+ includeWhen: "layout",
23
+ includeFirst: "layout",
24
+ once: "layout",
25
+ push: "layout",
26
+ prepend: "layout",
27
+ stack: "layout",
28
+ component: "component",
29
+ slot: "component",
30
+ props: "component",
31
+ webcomponent: "component",
32
+ auth: "auth",
33
+ guest: "auth",
34
+ can: "auth",
35
+ cannot: "auth",
36
+ role: "auth",
37
+ hasRole: "auth",
38
+ hasAnyRole: "auth",
39
+ csrf: "form",
40
+ method: "form",
41
+ error: "form",
42
+ old: "form",
43
+ input: "form",
44
+ textarea: "form",
45
+ select: "form",
46
+ checkbox: "form",
47
+ radio: "form",
48
+ meta: "seo",
49
+ title: "seo",
50
+ seo: "seo",
51
+ jsonld: "seo",
52
+ canonical: "seo",
53
+ translate: "i18n",
54
+ lang: "i18n",
55
+ choice: "i18n"
56
+ }, DIRECTIVE_ICONS = {
57
+ "control-flow": "symbol-branch",
58
+ loop: "symbol-loop",
59
+ layout: "symbol-structure",
60
+ component: "symbol-class",
61
+ auth: "shield",
62
+ form: "symbol-field",
63
+ seo: "search",
64
+ i18n: "globe",
65
+ custom: "symbol-misc"
66
+ };
67
+ export function getTemplateOutline(template) {
68
+ const root = {
69
+ type: "document",
70
+ name: "document",
71
+ label: "Document",
72
+ range: { start: 0, end: template.length, line: 1, column: 1 },
73
+ children: []
74
+ }, stack = [root];
75
+ let pos = 0, line = 1, column = 1;
76
+ const updatePosition = (char) => {
77
+ if (char === `
78
+ `) {
79
+ line++;
80
+ column = 1;
81
+ } else
82
+ column++;
83
+ pos++;
84
+ }, getPosition = () => ({ start: pos, end: pos, line, column });
85
+ while (pos < template.length) {
86
+ const remaining = template.slice(pos), directiveMatch = remaining.match(/^@(\w+)(?:\s*\(([^)]*)\))?/);
87
+ if (directiveMatch) {
88
+ const [full, name, params] = directiveMatch, category = DIRECTIVE_CATEGORIES[name] || "custom";
89
+ if (name.startsWith("end")) {
90
+ const baseName = name.slice(3), parent = stack[stack.length - 1];
91
+ if (parent.name === baseName && stack.length > 1) {
92
+ parent.range.end = pos + full.length;
93
+ stack.pop();
94
+ }
95
+ } else {
96
+ const isClosable = hasEndTag(name), node = {
97
+ type: "directive",
98
+ name,
99
+ label: `@${name}${params ? `(${truncate(params, 30)})` : ""}`,
100
+ range: getPosition(),
101
+ children: [],
102
+ directiveCategory: category,
103
+ isClosable,
104
+ icon: DIRECTIVE_ICONS[category],
105
+ description: params
106
+ };
107
+ stack[stack.length - 1].children.push(node);
108
+ if (isClosable)
109
+ stack.push(node);
110
+ }
111
+ for (const char of full)
112
+ updatePosition(char);
113
+ continue;
114
+ }
115
+ const componentMatch = remaining.match(/^<([A-Z][A-Za-z0-9]+)([^>]*)>/);
116
+ if (componentMatch) {
117
+ const [full, name, attrs] = componentMatch, node = {
118
+ type: "component",
119
+ name,
120
+ label: `<${name}>`,
121
+ range: getPosition(),
122
+ children: [],
123
+ attributes: parseSimpleAttributes(attrs),
124
+ icon: "symbol-class",
125
+ isClosable: !full.endsWith("/>")
126
+ };
127
+ stack[stack.length - 1].children.push(node);
128
+ if (node.isClosable)
129
+ stack.push(node);
130
+ for (const char of full)
131
+ updatePosition(char);
132
+ continue;
133
+ }
134
+ const componentCloseMatch = remaining.match(/^<\/([A-Z][A-Za-z0-9]+)>/);
135
+ if (componentCloseMatch) {
136
+ const [full, name] = componentCloseMatch, parent = stack[stack.length - 1];
137
+ if (parent.name === name && parent.type === "component" && stack.length > 1) {
138
+ parent.range.end = pos + full.length;
139
+ stack.pop();
140
+ }
141
+ for (const char of full)
142
+ updatePosition(char);
143
+ continue;
144
+ }
145
+ const elementMatch = remaining.match(/^<([a-z][a-z0-9-]*)([^>]*)>/i);
146
+ if (elementMatch) {
147
+ const [full, tag, attrs] = elementMatch, isSelfClosing = full.endsWith("/>") || isVoidElement(tag), node = {
148
+ type: "element",
149
+ name: tag,
150
+ label: `<${tag}>`,
151
+ range: getPosition(),
152
+ children: [],
153
+ attributes: parseSimpleAttributes(attrs),
154
+ isClosable: !isSelfClosing
155
+ };
156
+ stack[stack.length - 1].children.push(node);
157
+ if (node.isClosable)
158
+ stack.push(node);
159
+ for (const char of full)
160
+ updatePosition(char);
161
+ continue;
162
+ }
163
+ const elementCloseMatch = remaining.match(/^<\/([a-z][a-z0-9-]*)>/i);
164
+ if (elementCloseMatch) {
165
+ const [full, tag] = elementCloseMatch, parent = stack[stack.length - 1];
166
+ if (parent.name === tag && parent.type === "element" && stack.length > 1) {
167
+ parent.range.end = pos + full.length;
168
+ stack.pop();
169
+ }
170
+ for (const char of full)
171
+ updatePosition(char);
172
+ continue;
173
+ }
174
+ const exprMatch = remaining.match(/^\{\{([^}]+)\}\}/);
175
+ if (exprMatch) {
176
+ const [full, expr] = exprMatch, node = {
177
+ type: "expression",
178
+ name: "expression",
179
+ label: `{{ ${truncate(expr.trim(), 30)} }}`,
180
+ range: getPosition(),
181
+ children: [],
182
+ icon: "symbol-variable"
183
+ };
184
+ stack[stack.length - 1].children.push(node);
185
+ for (const char of full)
186
+ updatePosition(char);
187
+ continue;
188
+ }
189
+ const scriptMatch = remaining.match(/^<script([^>]*)>/);
190
+ if (scriptMatch) {
191
+ const [full] = scriptMatch, node = {
192
+ type: "script",
193
+ name: "script",
194
+ label: "<script>",
195
+ range: getPosition(),
196
+ children: [],
197
+ icon: "symbol-event",
198
+ isClosable: !0
199
+ };
200
+ stack[stack.length - 1].children.push(node);
201
+ stack.push(node);
202
+ for (const char of full)
203
+ updatePosition(char);
204
+ continue;
205
+ }
206
+ if (remaining.startsWith("</script>")) {
207
+ const full = "</script>", parent = stack[stack.length - 1];
208
+ if (parent.type === "script" && stack.length > 1) {
209
+ parent.range.end = pos + full.length;
210
+ stack.pop();
211
+ }
212
+ for (const char of full)
213
+ updatePosition(char);
214
+ continue;
215
+ }
216
+ const styleMatch = remaining.match(/^<style([^>]*)>/);
217
+ if (styleMatch) {
218
+ const [full] = styleMatch, node = {
219
+ type: "style",
220
+ name: "style",
221
+ label: "<style>",
222
+ range: getPosition(),
223
+ children: [],
224
+ icon: "symbol-color",
225
+ isClosable: !0
226
+ };
227
+ stack[stack.length - 1].children.push(node);
228
+ stack.push(node);
229
+ for (const char of full)
230
+ updatePosition(char);
231
+ continue;
232
+ }
233
+ if (remaining.startsWith("</style>")) {
234
+ const full = "</style>", parent = stack[stack.length - 1];
235
+ if (parent.type === "style" && stack.length > 1) {
236
+ parent.range.end = pos + full.length;
237
+ stack.pop();
238
+ }
239
+ for (const char of full)
240
+ updatePosition(char);
241
+ continue;
242
+ }
243
+ const commentMatch = remaining.match(/^\{\{--([^}]*?)--\}\}/);
244
+ if (commentMatch) {
245
+ const [full, content] = commentMatch, node = {
246
+ type: "comment",
247
+ name: "comment",
248
+ label: `{{-- ${truncate(content.trim(), 30)} --}}`,
249
+ range: getPosition(),
250
+ children: [],
251
+ icon: "comment"
252
+ };
253
+ stack[stack.length - 1].children.push(node);
254
+ for (const char of full)
255
+ updatePosition(char);
256
+ continue;
257
+ }
258
+ updatePosition(template[pos]);
259
+ }
260
+ return root;
261
+ }
262
+ export function analyzeVisualEditorTemplate(template) {
263
+ return analyzeTemplateContentImpl(template);
264
+ }
265
+ export function analyzeTemplateContent(template) {
266
+ return analyzeTemplateContentImpl(template);
267
+ }
268
+ function analyzeTemplateContentImpl(template) {
269
+ const variables = [], components = [], directives = [], slots = [], sections = [], scripts = [], styles = [];
270
+ let layout;
271
+ const exprRegex = /\{\{\s*([^}]+?)\s*\}\}/g, exprMatches = template.matchAll(exprRegex);
272
+ for (const match of exprMatches) {
273
+ const varMatch = match[1].match(/^([a-z_$][\w$]*)/i);
274
+ if (varMatch) {
275
+ const lineNum = getLineNumber(template, match.index);
276
+ variables.push({
277
+ name: varMatch[1],
278
+ line: lineNum,
279
+ column: getColumnNumber(template, match.index),
280
+ context: "expression"
281
+ });
282
+ }
283
+ }
284
+ const directiveRegex = /@(\w+)(?:\s*\(([^)]*)\))?/g, directiveMatches = template.matchAll(directiveRegex);
285
+ for (const match of directiveMatches) {
286
+ const name = match[1], params = match[2], lineNum = getLineNumber(template, match.index);
287
+ if (name === "extends" && params)
288
+ layout = {
289
+ extends: params.replace(/['"]/g, ""),
290
+ line: lineNum,
291
+ sections: []
292
+ };
293
+ else if (name === "section" && params) {
294
+ const sectionName = params.replace(/['"]/g, "").split(",")[0].trim();
295
+ sections.push({
296
+ name: sectionName,
297
+ line: lineNum,
298
+ content: ""
299
+ });
300
+ if (layout)
301
+ layout.sections.push(sectionName);
302
+ } else if (name === "slot")
303
+ slots.push({
304
+ name: params ? params.replace(/['"]/g, "") : "default",
305
+ line: lineNum,
306
+ isNamed: !!params
307
+ });
308
+ else if (name === "component" && params) {
309
+ const componentName = params.replace(/['"]/g, "").split(",")[0].trim();
310
+ components.push({
311
+ name: componentName,
312
+ line: lineNum,
313
+ props: {},
314
+ hasSlot: !1
315
+ });
316
+ }
317
+ directives.push({
318
+ name,
319
+ category: DIRECTIVE_CATEGORIES[name] || "custom",
320
+ line: lineNum,
321
+ params,
322
+ hasEndTag: hasEndTag(name)
323
+ });
324
+ }
325
+ const componentRegex = /<([A-Z][A-Za-z0-9]+)([^>]*)>/g, componentMatches = template.matchAll(componentRegex);
326
+ for (const match of componentMatches) {
327
+ const name = match[1], attrsStr = match[2], lineNum = getLineNumber(template, match.index), closeTagPos = template.indexOf(`</${name}>`, match.index), hasSlot = closeTagPos !== -1 && template.slice(match.index + match[0].length, closeTagPos).trim().length > 0;
328
+ components.push({
329
+ name,
330
+ line: lineNum,
331
+ props: parseSimpleAttributes(attrsStr),
332
+ hasSlot
333
+ });
334
+ }
335
+ const scriptRegex = /<script([^>]*)>([\s\S]*?)<\/script>/g, scriptMatches = template.matchAll(scriptRegex);
336
+ for (const match of scriptMatches) {
337
+ const attrs = match[1], content = match[2], lineNum = getLineNumber(template, match.index), isTS = attrs.includes('lang="ts"') || attrs.includes("lang='ts'"), exports = [], exportRegex = /export\s+(?:const|let|var|function|class)\s+(\w+)/g, exportMatches = content.matchAll(exportRegex);
338
+ for (const exportMatch of exportMatches)
339
+ exports.push(exportMatch[1]);
340
+ scripts.push({
341
+ type: isTS ? "typescript" : "javascript",
342
+ line: lineNum,
343
+ content,
344
+ exports
345
+ });
346
+ }
347
+ const styleRegex = /<style([^>]*)>([\s\S]*?)<\/style>/g, styleMatches = template.matchAll(styleRegex);
348
+ for (const match of styleMatches) {
349
+ const attrs = match[1], content = match[2], lineNum = getLineNumber(template, match.index);
350
+ let type = "css";
351
+ if (attrs.includes('lang="scss"') || attrs.includes("lang='scss'"))
352
+ type = "scss";
353
+ if (attrs.includes('lang="less"') || attrs.includes("lang='less'"))
354
+ type = "less";
355
+ styles.push({
356
+ type,
357
+ line: lineNum,
358
+ content,
359
+ scoped: attrs.includes("scoped")
360
+ });
361
+ }
362
+ const metrics = calculateMetrics(template, directives, components, variables);
363
+ return {
364
+ variables,
365
+ components,
366
+ directives,
367
+ slots,
368
+ sections,
369
+ scripts,
370
+ styles,
371
+ layout,
372
+ metrics
373
+ };
374
+ }
375
+ function calculateMetrics(template, directives, components, variables) {
376
+ const lines = template.split(`
377
+ `).length, characters = template.length;
378
+ let maxDepth = 0, currentDepth = 0;
379
+ for (const dir of directives)
380
+ if (dir.hasEndTag && !dir.name.startsWith("end")) {
381
+ currentDepth++;
382
+ maxDepth = Math.max(maxDepth, currentDepth);
383
+ } else if (dir.name.startsWith("end"))
384
+ currentDepth--;
385
+ const complexity = 1 + directives.filter((d) => d.category === "control-flow" || d.category === "loop").length;
386
+ return {
387
+ lines,
388
+ characters,
389
+ maxNestingDepth: maxDepth,
390
+ directiveCount: directives.length,
391
+ componentCount: components.length,
392
+ expressionCount: variables.length,
393
+ complexity
394
+ };
395
+ }
396
+ export async function generatePreview(template, options = {}) {
397
+ const {
398
+ context = {},
399
+ includeStyles = !0,
400
+ includeScripts = !1,
401
+ wrapInDocument = !0,
402
+ baseUrl = "",
403
+ customCss = ""
404
+ } = options;
405
+ let preview = template;
406
+ preview = preview.replace(/\{\{\s*([^}]+?)\s*\}\}/g, (_, expr) => {
407
+ const varName = expr.trim().split(".")[0].split("[")[0];
408
+ if (varName in context) {
409
+ const value = context[varName];
410
+ return typeof value === "object" ? JSON.stringify(value) : String(value);
411
+ }
412
+ return `<span class="stx-preview-placeholder">${expr}</span>`;
413
+ });
414
+ preview = preview.replace(/@(\w+)(?:\s*\([^)]*\))?/g, (match, name) => {
415
+ if (name.startsWith("end"))
416
+ return "";
417
+ return `<span class="stx-preview-directive" data-directive="${name}">${match}</span>`;
418
+ });
419
+ if (!includeScripts)
420
+ preview = preview.replace(/<script[\s\S]*?<\/script>/gi, "");
421
+ let styles = "";
422
+ if (includeStyles) {
423
+ const styleMatches = preview.matchAll(/<style[^>]*>([\s\S]*?)<\/style>/gi);
424
+ for (const match of styleMatches)
425
+ styles += match[1];
426
+ preview = preview.replace(/<style[\s\S]*?<\/style>/gi, "");
427
+ }
428
+ if (wrapInDocument)
429
+ return `<!DOCTYPE html>
5
430
  <html lang="en">
6
431
  <head>
7
432
  <meta charset="UTF-8">
8
433
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
9
434
  <title>STX Preview</title>
10
- ${W?`<base href="${W}">`:""}
435
+ ${baseUrl ? `<base href="${baseUrl}">` : ""}
11
436
  <style>
12
437
  .stx-preview-placeholder {
13
438
  background: #fff3cd;
@@ -23,53 +448,288 @@ import"./chunk-3jm3snz8.js";var P={if:"control-flow",else:"control-flow",elseif:
23
448
  font-family: monospace;
24
449
  font-size: 0.9em;
25
450
  }
26
- ${Z}
27
- ${A}
451
+ ${customCss}
452
+ ${styles}
28
453
  </style>
29
454
  </head>
30
455
  <body>
31
- ${J}
456
+ ${preview}
32
457
  </body>
33
- </html>`;return J}function p(){return[{name:"extends",displayName:"Use Layout",category:"Layout",description:"Use a layout template",icon:"symbol-structure",snippet:`@layout('$1')
458
+ </html>`;
459
+ return preview;
460
+ }
461
+ export function getDefaultPalette() {
462
+ return [
463
+ {
464
+ name: "extends",
465
+ displayName: "Use Layout",
466
+ category: "Layout",
467
+ description: "Use a layout template",
468
+ icon: "symbol-structure",
469
+ snippet: `@layout('$1')
34
470
 
35
471
  @section('content')
36
472
  $0
37
- @endsection`},{name:"section",displayName:"Section",category:"Layout",description:"Define a section within a layout",icon:"symbol-structure",snippet:`@section('$1')
473
+ @endsection`
474
+ },
475
+ {
476
+ name: "section",
477
+ displayName: "Section",
478
+ category: "Layout",
479
+ description: "Define a section within a layout",
480
+ icon: "symbol-structure",
481
+ snippet: `@section('$1')
38
482
  $0
39
- @endsection`},{name:"include",displayName:"Include Partial",category:"Layout",description:"Include another template",icon:"file-add",snippet:"@include('$1')"},{name:"if",displayName:"If Block",category:"Control Flow",description:"Conditional rendering",icon:"symbol-branch",snippet:`@if($1)
483
+ @endsection`
484
+ },
485
+ {
486
+ name: "include",
487
+ displayName: "Include Partial",
488
+ category: "Layout",
489
+ description: "Include another template",
490
+ icon: "file-add",
491
+ snippet: "@include('$1')"
492
+ },
493
+ {
494
+ name: "if",
495
+ displayName: "If Block",
496
+ category: "Control Flow",
497
+ description: "Conditional rendering",
498
+ icon: "symbol-branch",
499
+ snippet: `@if($1)
40
500
  $0
41
- @endif`},{name:"if-else",displayName:"If-Else Block",category:"Control Flow",description:"Conditional with else branch",icon:"symbol-branch",snippet:`@if($1)
501
+ @endif`
502
+ },
503
+ {
504
+ name: "if-else",
505
+ displayName: "If-Else Block",
506
+ category: "Control Flow",
507
+ description: "Conditional with else branch",
508
+ icon: "symbol-branch",
509
+ snippet: `@if($1)
42
510
  $2
43
511
  @else
44
512
  $0
45
- @endif`},{name:"switch",displayName:"Switch Block",category:"Control Flow",description:"Switch statement for multiple conditions",icon:"symbol-branch",snippet:`@switch($1)
513
+ @endif`
514
+ },
515
+ {
516
+ name: "switch",
517
+ displayName: "Switch Block",
518
+ category: "Control Flow",
519
+ description: "Switch statement for multiple conditions",
520
+ icon: "symbol-branch",
521
+ snippet: `@switch($1)
46
522
  @case($2)
47
523
  $3
48
524
  @break
49
525
  @default
50
526
  $0
51
- @endswitch`},{name:"foreach",displayName:"For Each Loop",category:"Loops",description:"Iterate over a collection",icon:"symbol-loop",snippet:`@foreach($1 as $2)
527
+ @endswitch`
528
+ },
529
+ {
530
+ name: "foreach",
531
+ displayName: "For Each Loop",
532
+ category: "Loops",
533
+ description: "Iterate over a collection",
534
+ icon: "symbol-loop",
535
+ snippet: `@foreach($1 as $2)
52
536
  $0
53
- @endforeach`},{name:"forelse",displayName:"For Else Loop",category:"Loops",description:"Loop with empty state",icon:"symbol-loop",snippet:`@forelse($1 as $2)
537
+ @endforeach`
538
+ },
539
+ {
540
+ name: "forelse",
541
+ displayName: "For Else Loop",
542
+ category: "Loops",
543
+ description: "Loop with empty state",
544
+ icon: "symbol-loop",
545
+ snippet: `@forelse($1 as $2)
54
546
  $3
55
547
  @empty
56
548
  $0
57
- @endforelse`},{name:"for",displayName:"For Loop",category:"Loops",description:"Traditional for loop",icon:"symbol-loop",snippet:`@for($1 = 0; $1 < $2; $1++)
549
+ @endforelse`
550
+ },
551
+ {
552
+ name: "for",
553
+ displayName: "For Loop",
554
+ category: "Loops",
555
+ description: "Traditional for loop",
556
+ icon: "symbol-loop",
557
+ snippet: `@for($1 = 0; $1 < $2; $1++)
58
558
  $0
59
- @endfor`},{name:"component",displayName:"Component",category:"Components",description:"Include a reusable component",icon:"symbol-class",snippet:`@component('$1')
559
+ @endfor`
560
+ },
561
+ {
562
+ name: "component",
563
+ displayName: "Component",
564
+ category: "Components",
565
+ description: "Include a reusable component",
566
+ icon: "symbol-class",
567
+ snippet: `@component('$1')
60
568
  $0
61
- @endcomponent`},{name:"slot",displayName:"Slot",category:"Components",description:"Define slot content placeholder",icon:"symbol-class",snippet:`@slot('$1')
569
+ @endcomponent`
570
+ },
571
+ {
572
+ name: "slot",
573
+ displayName: "Slot",
574
+ category: "Components",
575
+ description: "Define slot content placeholder",
576
+ icon: "symbol-class",
577
+ snippet: `@slot('$1')
62
578
  $0
63
- @endslot`},{name:"csrf",displayName:"CSRF Token",category:"Forms",description:"Insert CSRF protection token",icon:"shield",snippet:"@csrf"},{name:"error",displayName:"Error Display",category:"Forms",description:"Display validation error",icon:"error",snippet:`@error('$1')
579
+ @endslot`
580
+ },
581
+ {
582
+ name: "csrf",
583
+ displayName: "CSRF Token",
584
+ category: "Forms",
585
+ description: "Insert CSRF protection token",
586
+ icon: "shield",
587
+ snippet: "@csrf"
588
+ },
589
+ {
590
+ name: "error",
591
+ displayName: "Error Display",
592
+ category: "Forms",
593
+ description: "Display validation error",
594
+ icon: "error",
595
+ snippet: `@error('$1')
64
596
  <span class="error">{{ \\$message }}</span>
65
- @enderror`},{name:"auth",displayName:"Auth Check",category:"Auth",description:"Show content for authenticated users",icon:"shield",snippet:`@auth
597
+ @enderror`
598
+ },
599
+ {
600
+ name: "auth",
601
+ displayName: "Auth Check",
602
+ category: "Auth",
603
+ description: "Show content for authenticated users",
604
+ icon: "shield",
605
+ snippet: `@auth
66
606
  $0
67
- @endauth`},{name:"guest",displayName:"Guest Check",category:"Auth",description:"Show content for guests",icon:"shield",snippet:`@guest
607
+ @endauth`
608
+ },
609
+ {
610
+ name: "guest",
611
+ displayName: "Guest Check",
612
+ category: "Auth",
613
+ description: "Show content for guests",
614
+ icon: "shield",
615
+ snippet: `@guest
68
616
  $0
69
- @endguest`},{name:"meta",displayName:"Meta Tag",category:"SEO",description:"Insert meta tag",icon:"search",snippet:"@meta('$1', '$2')"},{name:"title",displayName:"Page Title",category:"SEO",description:"Set page title",icon:"search",snippet:"@title('$1')"},{name:"translate",displayName:"Translation",category:"i18n",description:"Translate a string",icon:"globe",snippet:"@translate('$1')"}]}function i(B,Q,j=""){let G=B.snippet.split(`
70
- `).map((O,R)=>R===0?O:j+O).join(`
71
- `),W=G.match(/\$\d/),Z=G.length;if(W)Z=G.indexOf(W[0]);let J=G.replace(/\$\d/g,""),A=J.slice(0,Z),z=A.split(`
72
- `).length-1,U=A.lastIndexOf(`
73
- `)+1,D=Z-U;return{content:J,cursorPosition:{line:Q.line+z,column:z===0?Q.column+D:D,offset:Q.offset+Z}}}function C(B){return["if","unless","switch","for","foreach","forelse","while","section","component","slot","push","prepend","auth","guest","can","cannot","role","hasRole","hasAnyRole","error","isset","empty","ts","js","css","markdown","verbatim","once"].includes(B)}function v(B){return["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"].includes(B.toLowerCase())}function b(B){let Q={},j=/([^\s=]+)(?:=["']([^"']*)["'])?/g,Y=B.matchAll(j);for(let V of Y){let[,G,W]=V;Q[G]=W??!0}return Q}function S(B,Q){if(B.length<=Q)return B;return`${B.slice(0,Q-3)}...`}function I(B,Q){return B.slice(0,Q).split(`
74
- `).length}function g(B,Q){let j=B.lastIndexOf(`
75
- `,Q-1);return Q-j}export{i as insertPaletteItem,d as getTemplateOutline,p as getDefaultPalette,l as generatePreview,h as analyzeVisualEditorTemplate,u as analyzeTemplateContent};
617
+ @endguest`
618
+ },
619
+ {
620
+ name: "meta",
621
+ displayName: "Meta Tag",
622
+ category: "SEO",
623
+ description: "Insert meta tag",
624
+ icon: "search",
625
+ snippet: "@meta('$1', '$2')"
626
+ },
627
+ {
628
+ name: "title",
629
+ displayName: "Page Title",
630
+ category: "SEO",
631
+ description: "Set page title",
632
+ icon: "search",
633
+ snippet: "@title('$1')"
634
+ },
635
+ {
636
+ name: "translate",
637
+ displayName: "Translation",
638
+ category: "i18n",
639
+ description: "Translate a string",
640
+ icon: "globe",
641
+ snippet: "@translate('$1')"
642
+ }
643
+ ];
644
+ }
645
+ export function insertPaletteItem(item, position, indentation = "") {
646
+ const content = item.snippet.split(`
647
+ `).map((line, i) => i === 0 ? line : indentation + line).join(`
648
+ `), cursorMatch = content.match(/\$\d/);
649
+ let cursorOffset = content.length;
650
+ if (cursorMatch)
651
+ cursorOffset = content.indexOf(cursorMatch[0]);
652
+ const newContent = content.replace(/\$\d/g, ""), beforeCursor = newContent.slice(0, cursorOffset), cursorLine = beforeCursor.split(`
653
+ `).length - 1, lastLineStart = beforeCursor.lastIndexOf(`
654
+ `) + 1, cursorColumn = cursorOffset - lastLineStart;
655
+ return {
656
+ content: newContent,
657
+ cursorPosition: {
658
+ line: position.line + cursorLine,
659
+ column: cursorLine === 0 ? position.column + cursorColumn : cursorColumn,
660
+ offset: position.offset + cursorOffset
661
+ }
662
+ };
663
+ }
664
+ function hasEndTag(directiveName) {
665
+ return [
666
+ "if",
667
+ "unless",
668
+ "switch",
669
+ "for",
670
+ "foreach",
671
+ "forelse",
672
+ "while",
673
+ "section",
674
+ "component",
675
+ "slot",
676
+ "push",
677
+ "prepend",
678
+ "auth",
679
+ "guest",
680
+ "can",
681
+ "cannot",
682
+ "role",
683
+ "hasRole",
684
+ "hasAnyRole",
685
+ "error",
686
+ "isset",
687
+ "empty",
688
+ "ts",
689
+ "js",
690
+ "css",
691
+ "markdown",
692
+ "verbatim",
693
+ "once"
694
+ ].includes(directiveName);
695
+ }
696
+ function isVoidElement(tag) {
697
+ return [
698
+ "area",
699
+ "base",
700
+ "br",
701
+ "col",
702
+ "embed",
703
+ "hr",
704
+ "img",
705
+ "input",
706
+ "link",
707
+ "meta",
708
+ "param",
709
+ "source",
710
+ "track",
711
+ "wbr"
712
+ ].includes(tag.toLowerCase());
713
+ }
714
+ function parseSimpleAttributes(attrsStr) {
715
+ const attrs = {}, regex = /([^\s=]+)(?:=["']([^"']*)["'])?/g, matches = attrsStr.matchAll(regex);
716
+ for (const match of matches) {
717
+ const [, name, value] = match;
718
+ attrs[name] = value ?? !0;
719
+ }
720
+ return attrs;
721
+ }
722
+ function truncate(str, maxLength) {
723
+ if (str.length <= maxLength)
724
+ return str;
725
+ return `${str.slice(0, maxLength - 3)}...`;
726
+ }
727
+ function getLineNumber(template, offset) {
728
+ return template.slice(0, offset).split(`
729
+ `).length;
730
+ }
731
+ function getColumnNumber(template, offset) {
732
+ const lastNewline = template.lastIndexOf(`
733
+ `, offset - 1);
734
+ return offset - lastNewline;
735
+ }