@maizzle/framework 6.0.0-rc.2 → 6.0.0-rc.21

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 (551) hide show
  1. package/README.md +3 -3
  2. package/bin/maizzle.mjs +1 -1
  3. package/dist/build.d.ts +20 -0
  4. package/dist/build.d.ts.map +1 -0
  5. package/dist/build.js +163 -0
  6. package/dist/build.js.map +1 -0
  7. package/dist/components/Body.vue +128 -0
  8. package/dist/components/Button.vue +148 -52
  9. package/dist/components/CodeBlock.vue +69 -0
  10. package/dist/components/CodeInline.vue +49 -0
  11. package/dist/components/Column.vue +108 -0
  12. package/dist/components/Container.vue +123 -0
  13. package/dist/components/Font.vue +96 -0
  14. package/dist/components/Head.vue +30 -0
  15. package/dist/components/Heading.vue +28 -0
  16. package/dist/components/Hr.vue +33 -0
  17. package/dist/components/Html.vue +137 -0
  18. package/dist/components/Img.vue +70 -0
  19. package/dist/components/Layout.vue +143 -0
  20. package/dist/components/Link.vue +26 -0
  21. package/dist/components/Markdown.vue +89 -0
  22. package/dist/components/MarkdownLayout.vue +39 -0
  23. package/dist/components/NotPlaintext.vue +14 -0
  24. package/dist/components/Outlook.vue +74 -11
  25. package/dist/components/OutlookBg.vue +241 -0
  26. package/dist/components/Overlap.vue +156 -0
  27. package/dist/components/Plaintext.vue +14 -0
  28. package/dist/components/Preheader.vue +15 -0
  29. package/dist/components/QrCode.vue +157 -0
  30. package/dist/components/Raw.vue +28 -0
  31. package/dist/components/Row.vue +184 -0
  32. package/dist/components/Section.vue +124 -0
  33. package/dist/components/Spacer.vue +70 -21
  34. package/dist/components/Tailwind.vue +43 -0
  35. package/dist/components/Text.vue +29 -0
  36. package/dist/components/utils.d.ts +28 -0
  37. package/dist/components/utils.d.ts.map +1 -0
  38. package/dist/components/utils.js +50 -0
  39. package/dist/components/utils.js.map +1 -0
  40. package/dist/components/utils.ts +51 -0
  41. package/dist/composables/{defineConfig.d.mts → defineConfig.d.ts} +2 -2
  42. package/dist/composables/defineConfig.d.ts.map +1 -0
  43. package/dist/composables/{defineConfig.mjs → defineConfig.js} +4 -5
  44. package/dist/composables/defineConfig.js.map +1 -0
  45. package/dist/composables/renderContext.d.ts +37 -0
  46. package/dist/composables/renderContext.d.ts.map +1 -0
  47. package/dist/composables/{renderContext.mjs → renderContext.js} +2 -2
  48. package/dist/composables/renderContext.js.map +1 -0
  49. package/dist/composables/useBaseUrl.d.ts +19 -0
  50. package/dist/composables/useBaseUrl.d.ts.map +1 -0
  51. package/dist/composables/useBaseUrl.js +26 -0
  52. package/dist/composables/useBaseUrl.js.map +1 -0
  53. package/dist/composables/{useConfig.d.mts → useConfig.d.ts} +2 -2
  54. package/dist/composables/useConfig.d.ts.map +1 -0
  55. package/dist/composables/{useConfig.mjs → useConfig.js} +2 -3
  56. package/dist/composables/useConfig.js.map +1 -0
  57. package/dist/composables/useCurrentTemplate.d.ts +31 -0
  58. package/dist/composables/useCurrentTemplate.d.ts.map +1 -0
  59. package/dist/composables/useCurrentTemplate.js +35 -0
  60. package/dist/composables/useCurrentTemplate.js.map +1 -0
  61. package/dist/composables/{useDoctype.d.mts → useDoctype.d.ts} +1 -1
  62. package/dist/composables/useDoctype.d.ts.map +1 -0
  63. package/dist/composables/{useDoctype.mjs → useDoctype.js} +3 -4
  64. package/dist/composables/useDoctype.js.map +1 -0
  65. package/dist/composables/{useEvent.d.mts → useEvent.d.ts} +3 -3
  66. package/dist/composables/useEvent.d.ts.map +1 -0
  67. package/dist/composables/{useEvent.mjs → useEvent.js} +4 -5
  68. package/dist/composables/useEvent.js.map +1 -0
  69. package/dist/composables/useFont.d.ts +50 -0
  70. package/dist/composables/useFont.d.ts.map +1 -0
  71. package/dist/composables/useFont.js +92 -0
  72. package/dist/composables/useFont.js.map +1 -0
  73. package/dist/composables/useOutlookFallback.d.ts +21 -0
  74. package/dist/composables/useOutlookFallback.d.ts.map +1 -0
  75. package/dist/composables/useOutlookFallback.js +29 -0
  76. package/dist/composables/useOutlookFallback.js.map +1 -0
  77. package/dist/composables/{usePlaintext.d.mts → usePlaintext.d.ts} +3 -1
  78. package/dist/composables/usePlaintext.d.ts.map +1 -0
  79. package/dist/composables/{usePlaintext.mjs → usePlaintext.js} +4 -4
  80. package/dist/composables/usePlaintext.js.map +1 -0
  81. package/dist/composables/usePreheader.d.ts +24 -0
  82. package/dist/composables/usePreheader.d.ts.map +1 -0
  83. package/dist/composables/usePreheader.js +28 -0
  84. package/dist/composables/usePreheader.js.map +1 -0
  85. package/dist/composables/useTransformers.d.ts +34 -0
  86. package/dist/composables/useTransformers.d.ts.map +1 -0
  87. package/dist/composables/useTransformers.js +48 -0
  88. package/dist/composables/useTransformers.js.map +1 -0
  89. package/dist/composables/useUrlQuery.d.ts +19 -0
  90. package/dist/composables/useUrlQuery.d.ts.map +1 -0
  91. package/dist/composables/useUrlQuery.js +26 -0
  92. package/dist/composables/useUrlQuery.js.map +1 -0
  93. package/dist/config/{defaults.d.mts → defaults.d.ts} +2 -2
  94. package/dist/config/defaults.d.ts.map +1 -0
  95. package/dist/config/{defaults.mjs → defaults.js} +10 -6
  96. package/dist/config/defaults.js.map +1 -0
  97. package/dist/config/{index.d.mts → index.d.ts} +4 -4
  98. package/dist/config/index.d.ts.map +1 -0
  99. package/dist/config/{index.mjs → index.js} +12 -10
  100. package/dist/config/index.js.map +1 -0
  101. package/dist/events/{index.d.mts → index.d.ts} +30 -12
  102. package/dist/events/index.d.ts.map +1 -0
  103. package/dist/events/{index.mjs → index.js} +26 -13
  104. package/dist/events/index.js.map +1 -0
  105. package/dist/index.d.ts +39 -0
  106. package/dist/index.js +38 -0
  107. package/dist/{plaintext.d.mts → plaintext.d.ts} +1 -1
  108. package/dist/plaintext.d.ts.map +1 -0
  109. package/dist/{plaintext.mjs → plaintext.js} +4 -5
  110. package/dist/plaintext.js.map +1 -0
  111. package/dist/{plugin.d.mts → plugin.d.ts} +2 -2
  112. package/dist/plugin.d.ts.map +1 -0
  113. package/dist/plugin.js +57 -0
  114. package/dist/plugin.js.map +1 -0
  115. package/dist/plugins/postcss/{mergeMediaQueries.d.mts → mergeMediaQueries.d.ts} +2 -2
  116. package/dist/plugins/postcss/mergeMediaQueries.d.ts.map +1 -0
  117. package/dist/plugins/postcss/{mergeMediaQueries.mjs → mergeMediaQueries.js} +2 -3
  118. package/dist/plugins/postcss/mergeMediaQueries.js.map +1 -0
  119. package/dist/plugins/postcss/{pruneVars.d.mts → pruneVars.d.ts} +1 -1
  120. package/dist/plugins/postcss/pruneVars.d.ts.map +1 -0
  121. package/dist/plugins/postcss/{pruneVars.mjs → pruneVars.js} +2 -2
  122. package/dist/plugins/postcss/pruneVars.js.map +1 -0
  123. package/dist/plugins/postcss/quoteFontFamilies.d.ts +13 -0
  124. package/dist/plugins/postcss/quoteFontFamilies.d.ts.map +1 -0
  125. package/dist/plugins/postcss/quoteFontFamilies.js +84 -0
  126. package/dist/plugins/postcss/quoteFontFamilies.js.map +1 -0
  127. package/dist/plugins/postcss/{removeDeclarations.d.mts → removeDeclarations.d.ts} +1 -1
  128. package/dist/plugins/postcss/removeDeclarations.d.ts.map +1 -0
  129. package/dist/plugins/postcss/{removeDeclarations.mjs → removeDeclarations.js} +2 -2
  130. package/dist/plugins/postcss/removeDeclarations.js.map +1 -0
  131. package/dist/plugins/postcss/resolveMaizzleImports.d.ts +16 -0
  132. package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -0
  133. package/dist/plugins/postcss/resolveMaizzleImports.js +39 -0
  134. package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -0
  135. package/dist/plugins/postcss/resolveProps.d.ts +8 -0
  136. package/dist/plugins/postcss/resolveProps.d.ts.map +1 -0
  137. package/dist/plugins/postcss/resolveProps.js +144 -0
  138. package/dist/plugins/postcss/resolveProps.js.map +1 -0
  139. package/dist/plugins/postcss/{tailwindCleanup.d.mts → tailwindCleanup.d.ts} +2 -2
  140. package/dist/plugins/postcss/tailwindCleanup.d.ts.map +1 -0
  141. package/dist/plugins/postcss/tailwindCleanup.js +68 -0
  142. package/dist/plugins/postcss/tailwindCleanup.js.map +1 -0
  143. package/dist/prepare.d.ts +17 -0
  144. package/dist/prepare.d.ts.map +1 -0
  145. package/dist/prepare.js +44 -0
  146. package/dist/prepare.js.map +1 -0
  147. package/dist/render/active.d.ts +8 -0
  148. package/dist/render/active.d.ts.map +1 -0
  149. package/dist/render/active.js +12 -0
  150. package/dist/render/active.js.map +1 -0
  151. package/dist/render/{createRenderer.d.mts → createRenderer.d.ts} +15 -7
  152. package/dist/render/createRenderer.d.ts.map +1 -0
  153. package/dist/render/createRenderer.js +320 -0
  154. package/dist/render/createRenderer.js.map +1 -0
  155. package/dist/render/index.d.ts +18 -0
  156. package/dist/render/index.d.ts.map +1 -0
  157. package/dist/render/index.js +53 -0
  158. package/dist/render/index.js.map +1 -0
  159. package/dist/render/injectFonts.d.ts +15 -0
  160. package/dist/render/injectFonts.d.ts.map +1 -0
  161. package/dist/render/injectFonts.js +45 -0
  162. package/dist/render/injectFonts.js.map +1 -0
  163. package/dist/render/plugins/codeBlockExtract.d.ts +14 -0
  164. package/dist/render/plugins/codeBlockExtract.d.ts.map +1 -0
  165. package/dist/render/plugins/codeBlockExtract.js +34 -0
  166. package/dist/render/plugins/codeBlockExtract.js.map +1 -0
  167. package/dist/render/plugins/markdownExtract.d.ts +12 -0
  168. package/dist/render/plugins/markdownExtract.d.ts.map +1 -0
  169. package/dist/render/plugins/markdownExtract.js +49 -0
  170. package/dist/render/plugins/markdownExtract.js.map +1 -0
  171. package/dist/render/plugins/rawExtract.d.ts +14 -0
  172. package/dist/render/plugins/rawExtract.d.ts.map +1 -0
  173. package/dist/render/plugins/rawExtract.js +34 -0
  174. package/dist/render/plugins/rawExtract.js.map +1 -0
  175. package/dist/render/plugins/rowSourceLocation.d.ts +18 -0
  176. package/dist/render/plugins/rowSourceLocation.d.ts.map +1 -0
  177. package/dist/render/plugins/rowSourceLocation.js +45 -0
  178. package/dist/render/plugins/rowSourceLocation.js.map +1 -0
  179. package/dist/{serve.d.mts → serve.d.ts} +4 -2
  180. package/dist/serve.d.ts.map +1 -0
  181. package/dist/{serve.mjs → serve.js} +203 -78
  182. package/dist/serve.js.map +1 -0
  183. package/dist/server/compatibility.d.ts +59 -0
  184. package/dist/server/compatibility.d.ts.map +1 -0
  185. package/dist/server/compatibility.js +911 -0
  186. package/dist/server/compatibility.js.map +1 -0
  187. package/dist/server/email.d.ts +17 -0
  188. package/dist/server/email.d.ts.map +1 -0
  189. package/dist/server/email.js +40 -0
  190. package/dist/server/email.js.map +1 -0
  191. package/dist/server/linter.d.ts +20 -0
  192. package/dist/server/linter.d.ts.map +1 -0
  193. package/dist/server/linter.js +339 -0
  194. package/dist/server/linter.js.map +1 -0
  195. package/dist/server/sfc-utils.d.ts +21 -0
  196. package/dist/server/sfc-utils.d.ts.map +1 -0
  197. package/dist/server/sfc-utils.js +198 -0
  198. package/dist/server/sfc-utils.js.map +1 -0
  199. package/dist/server/ui/App.vue +253 -77
  200. package/dist/server/ui/components/SidebarClose.vue +12 -0
  201. package/dist/server/ui/components/ui/checkbox/Checkbox.vue +35 -0
  202. package/dist/server/ui/components/ui/checkbox/index.ts +1 -0
  203. package/dist/server/ui/components/ui/command/Command.vue +5 -1
  204. package/dist/server/ui/components/ui/command/CommandDialog.vue +1 -1
  205. package/dist/server/ui/components/ui/command/CommandInput.vue +19 -1
  206. package/dist/server/ui/components/ui/command/CommandItem.vue +1 -1
  207. package/dist/server/ui/components/ui/command/CommandList.vue +1 -1
  208. package/dist/server/ui/components/ui/command/CommandShortcut.vue +1 -1
  209. package/dist/server/ui/components/ui/dialog/DialogOverlay.vue +9 -1
  210. package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  211. package/dist/server/ui/components/ui/input/Input.vue +1 -1
  212. package/dist/server/ui/components/ui/scroll-area/ScrollBar.vue +1 -1
  213. package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
  214. package/dist/server/ui/components/ui/sheet/SheetOverlay.vue +9 -1
  215. package/dist/server/ui/components/ui/sidebar/Sidebar.vue +8 -1
  216. package/dist/server/ui/components/ui/sidebar/SidebarProvider.vue +1 -1
  217. package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +5 -4
  218. package/dist/server/ui/components/ui/tags-input/TagsInput.vue +26 -0
  219. package/dist/server/ui/components/ui/tags-input/TagsInputInput.vue +17 -0
  220. package/dist/server/ui/components/ui/tags-input/TagsInputItem.vue +19 -0
  221. package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +22 -0
  222. package/dist/server/ui/components/ui/tags-input/TagsInputItemText.vue +17 -0
  223. package/dist/server/ui/components/ui/tags-input/index.ts +5 -0
  224. package/dist/server/ui/components/ui/toggle/index.ts +3 -3
  225. package/dist/server/ui/components/ui/toggle-group/ToggleGroup.vue +1 -1
  226. package/dist/server/ui/components/ui/toggle-group/ToggleGroupItem.vue +2 -2
  227. package/dist/server/ui/lib/emulated-dark-mode.ts +131 -0
  228. package/dist/server/ui/main.css +20 -20
  229. package/dist/server/ui/pages/Home.vue +12 -5
  230. package/dist/server/ui/pages/Preview.vue +716 -276
  231. package/dist/tests/render/_helpers.d.ts +6 -0
  232. package/dist/tests/render/_helpers.d.ts.map +1 -0
  233. package/dist/tests/render/_helpers.js +16 -0
  234. package/dist/tests/render/_helpers.js.map +1 -0
  235. package/dist/transformers/{addAttributes.d.mts → addAttributes.d.ts} +2 -2
  236. package/dist/transformers/addAttributes.d.ts.map +1 -0
  237. package/dist/transformers/{addAttributes.mjs → addAttributes.js} +16 -13
  238. package/dist/transformers/addAttributes.js.map +1 -0
  239. package/dist/transformers/attributeToStyle.d.ts +38 -0
  240. package/dist/transformers/attributeToStyle.d.ts.map +1 -0
  241. package/dist/transformers/attributeToStyle.js +94 -0
  242. package/dist/transformers/attributeToStyle.js.map +1 -0
  243. package/dist/transformers/base.d.ts +71 -0
  244. package/dist/transformers/base.d.ts.map +1 -0
  245. package/dist/transformers/{base.mjs → base.js} +56 -30
  246. package/dist/transformers/base.js.map +1 -0
  247. package/dist/transformers/columnWidth.d.ts +31 -0
  248. package/dist/transformers/columnWidth.d.ts.map +1 -0
  249. package/dist/transformers/columnWidth.js +546 -0
  250. package/dist/transformers/columnWidth.js.map +1 -0
  251. package/dist/transformers/entities.d.ts +37 -0
  252. package/dist/transformers/entities.d.ts.map +1 -0
  253. package/dist/transformers/entities.js +73 -0
  254. package/dist/transformers/entities.js.map +1 -0
  255. package/dist/transformers/filters/defaults.d.ts +6 -0
  256. package/dist/transformers/filters/defaults.d.ts.map +1 -0
  257. package/dist/transformers/filters/defaults.js +78 -0
  258. package/dist/transformers/filters/defaults.js.map +1 -0
  259. package/dist/transformers/filters/index.d.ts +43 -0
  260. package/dist/transformers/filters/index.d.ts.map +1 -0
  261. package/dist/transformers/filters/index.js +89 -0
  262. package/dist/transformers/filters/index.js.map +1 -0
  263. package/dist/transformers/format.d.ts +22 -0
  264. package/dist/transformers/format.d.ts.map +1 -0
  265. package/dist/transformers/format.js +30 -0
  266. package/dist/transformers/format.js.map +1 -0
  267. package/dist/transformers/{index.d.mts → index.d.ts} +14 -11
  268. package/dist/transformers/index.d.ts.map +1 -0
  269. package/dist/transformers/index.js +133 -0
  270. package/dist/transformers/index.js.map +1 -0
  271. package/dist/transformers/inlineCss.d.ts +84 -0
  272. package/dist/transformers/inlineCss.d.ts.map +1 -0
  273. package/dist/transformers/inlineCss.js +91 -0
  274. package/dist/transformers/inlineCss.js.map +1 -0
  275. package/dist/transformers/inlineLink.d.ts +35 -0
  276. package/dist/transformers/inlineLink.d.ts.map +1 -0
  277. package/dist/transformers/{inlineLink.mjs → inlineLink.js} +34 -10
  278. package/dist/transformers/inlineLink.js.map +1 -0
  279. package/dist/transformers/minify.d.ts +21 -0
  280. package/dist/transformers/minify.d.ts.map +1 -0
  281. package/dist/transformers/minify.js +25 -0
  282. package/dist/transformers/minify.js.map +1 -0
  283. package/dist/transformers/msoPlaceholders.d.ts +28 -0
  284. package/dist/transformers/msoPlaceholders.d.ts.map +1 -0
  285. package/dist/transformers/msoPlaceholders.js +88 -0
  286. package/dist/transformers/msoPlaceholders.js.map +1 -0
  287. package/dist/transformers/purgeCss.d.ts +43 -0
  288. package/dist/transformers/purgeCss.d.ts.map +1 -0
  289. package/dist/transformers/purgeCss.js +181 -0
  290. package/dist/transformers/purgeCss.js.map +1 -0
  291. package/dist/transformers/removeAttributes.d.ts +54 -0
  292. package/dist/transformers/removeAttributes.d.ts.map +1 -0
  293. package/dist/transformers/removeAttributes.js +70 -0
  294. package/dist/transformers/removeAttributes.js.map +1 -0
  295. package/dist/transformers/{replaceStrings.d.mts → replaceStrings.d.ts} +2 -2
  296. package/dist/transformers/replaceStrings.d.ts.map +1 -0
  297. package/dist/transformers/{replaceStrings.mjs → replaceStrings.js} +2 -2
  298. package/dist/transformers/replaceStrings.js.map +1 -0
  299. package/dist/transformers/{safeClassNames.d.mts → safeClassNames.d.ts} +2 -2
  300. package/dist/transformers/safeClassNames.d.ts.map +1 -0
  301. package/dist/transformers/{safeClassNames.mjs → safeClassNames.js} +4 -5
  302. package/dist/transformers/safeClassNames.js.map +1 -0
  303. package/dist/transformers/shorthandCss.d.ts +47 -0
  304. package/dist/transformers/shorthandCss.d.ts.map +1 -0
  305. package/dist/transformers/shorthandCss.js +61 -0
  306. package/dist/transformers/shorthandCss.js.map +1 -0
  307. package/dist/transformers/sixHex.d.ts +25 -0
  308. package/dist/transformers/sixHex.d.ts.map +1 -0
  309. package/dist/transformers/sixHex.js +42 -0
  310. package/dist/transformers/sixHex.js.map +1 -0
  311. package/dist/transformers/tailwindComponent.d.ts +16 -0
  312. package/dist/transformers/tailwindComponent.d.ts.map +1 -0
  313. package/dist/transformers/tailwindComponent.js +92 -0
  314. package/dist/transformers/tailwindComponent.js.map +1 -0
  315. package/dist/transformers/{tailwindcss.d.mts → tailwindcss.d.ts} +8 -4
  316. package/dist/transformers/tailwindcss.d.ts.map +1 -0
  317. package/dist/transformers/tailwindcss.js +97 -0
  318. package/dist/transformers/tailwindcss.js.map +1 -0
  319. package/dist/transformers/urlQuery.d.ts +36 -0
  320. package/dist/transformers/urlQuery.d.ts.map +1 -0
  321. package/dist/transformers/urlQuery.js +77 -0
  322. package/dist/transformers/urlQuery.js.map +1 -0
  323. package/dist/types/config.d.ts +737 -0
  324. package/dist/types/config.d.ts.map +1 -0
  325. package/dist/types/config.js +1 -0
  326. package/dist/types/index.d.ts +2 -0
  327. package/dist/types/index.js +1 -0
  328. package/dist/utils/ast/index.d.ts +4 -0
  329. package/dist/utils/ast/index.js +4 -0
  330. package/dist/utils/ast/{parser.d.mts → parser.d.ts} +1 -1
  331. package/dist/utils/ast/parser.d.ts.map +1 -0
  332. package/dist/utils/ast/{parser.mjs → parser.js} +2 -3
  333. package/dist/utils/ast/parser.js.map +1 -0
  334. package/dist/utils/ast/serializer.d.ts +8 -0
  335. package/dist/utils/ast/serializer.d.ts.map +1 -0
  336. package/dist/utils/ast/serializer.js +36 -0
  337. package/dist/utils/ast/serializer.js.map +1 -0
  338. package/dist/utils/ast/{walker.d.mts → walker.d.ts} +1 -1
  339. package/dist/utils/ast/walker.d.ts.map +1 -0
  340. package/dist/utils/ast/{walker.mjs → walker.js} +2 -2
  341. package/dist/utils/ast/walker.js.map +1 -0
  342. package/dist/utils/compileTailwindCss.d.ts +16 -0
  343. package/dist/utils/compileTailwindCss.d.ts.map +1 -0
  344. package/dist/utils/compileTailwindCss.js +54 -0
  345. package/dist/utils/compileTailwindCss.js.map +1 -0
  346. package/dist/utils/componentSources.d.ts +50 -0
  347. package/dist/utils/componentSources.d.ts.map +1 -0
  348. package/dist/utils/componentSources.js +50 -0
  349. package/dist/utils/componentSources.js.map +1 -0
  350. package/dist/utils/decodeStyleEntities.d.ts +15 -0
  351. package/dist/utils/decodeStyleEntities.d.ts.map +1 -0
  352. package/dist/utils/decodeStyleEntities.js +18 -0
  353. package/dist/utils/decodeStyleEntities.js.map +1 -0
  354. package/dist/utils/detect.d.ts +5 -0
  355. package/dist/utils/detect.d.ts.map +1 -0
  356. package/dist/utils/detect.js +10 -0
  357. package/dist/utils/detect.js.map +1 -0
  358. package/dist/utils/output-markers.d.ts +29 -0
  359. package/dist/utils/output-markers.d.ts.map +1 -0
  360. package/dist/utils/output-markers.js +68 -0
  361. package/dist/utils/output-markers.js.map +1 -0
  362. package/dist/utils/{url.d.mts → url.d.ts} +1 -1
  363. package/dist/utils/url.d.ts.map +1 -0
  364. package/dist/utils/{url.mjs → url.js} +2 -3
  365. package/dist/utils/url.js.map +1 -0
  366. package/dist/utils/watchPaths.d.ts +11 -0
  367. package/dist/utils/watchPaths.d.ts.map +1 -0
  368. package/dist/utils/watchPaths.js +19 -0
  369. package/dist/utils/watchPaths.js.map +1 -0
  370. package/node_modules/@clack/core/CHANGELOG.md +8 -0
  371. package/node_modules/@clack/core/dist/index.d.mts +18 -4
  372. package/node_modules/@clack/core/dist/index.mjs +16 -10
  373. package/node_modules/@clack/core/dist/index.mjs.map +1 -1
  374. package/node_modules/@clack/core/package.json +5 -2
  375. package/node_modules/@clack/prompts/CHANGELOG.md +15 -0
  376. package/node_modules/@clack/prompts/README.md +107 -2
  377. package/node_modules/@clack/prompts/dist/index.d.mts +16 -11
  378. package/node_modules/@clack/prompts/dist/index.mjs +114 -107
  379. package/node_modules/@clack/prompts/dist/index.mjs.map +1 -1
  380. package/node_modules/@clack/prompts/package.json +7 -4
  381. package/node_modules/fast-string-truncated-width/dist/index.js +36 -96
  382. package/node_modules/fast-string-truncated-width/dist/types.d.ts +0 -3
  383. package/node_modules/fast-string-truncated-width/dist/utils.d.ts +3 -3
  384. package/node_modules/fast-string-truncated-width/dist/utils.js +14 -9
  385. package/node_modules/fast-string-truncated-width/package.json +1 -1
  386. package/node_modules/fast-string-truncated-width/readme.md +2 -3
  387. package/node_modules/fast-string-width/package.json +2 -2
  388. package/node_modules/fast-string-width/readme.md +0 -3
  389. package/node_modules/fast-wrap-ansi/lib/main.js +4 -1
  390. package/node_modules/fast-wrap-ansi/lib/main.js.map +1 -1
  391. package/node_modules/fast-wrap-ansi/package.json +2 -2
  392. package/node_modules/maizzle/README.md +24 -0
  393. package/node_modules/maizzle/dist/commands/make/component.mjs +1 -1
  394. package/node_modules/maizzle/dist/commands/make/config.mjs +1 -1
  395. package/node_modules/maizzle/dist/commands/make/layout.mjs +3 -3
  396. package/node_modules/maizzle/dist/commands/make/scaffold.mjs +1 -1
  397. package/node_modules/maizzle/dist/commands/make/stubs/Layout.vue +146 -0
  398. package/node_modules/maizzle/dist/commands/make/stubs/component.vue +2 -4
  399. package/node_modules/maizzle/dist/commands/make/stubs/config.ts +1 -5
  400. package/node_modules/maizzle/dist/commands/make/template.mjs +1 -1
  401. package/node_modules/maizzle/dist/commands/new.mjs +32 -52
  402. package/node_modules/maizzle/dist/index.d.mts +1 -0
  403. package/node_modules/maizzle/dist/index.mjs +30 -7
  404. package/node_modules/maizzle/package.json +4 -3
  405. package/node_modules/nypm/dist/cli.mjs +28 -5
  406. package/node_modules/nypm/dist/index.d.mts +0 -8
  407. package/node_modules/nypm/dist/index.mjs +27 -4
  408. package/node_modules/nypm/package.json +12 -12
  409. package/node_modules/tinyexec/README.md +1 -1
  410. package/node_modules/tinyexec/dist/main.d.mts +6 -6
  411. package/node_modules/tinyexec/dist/main.mjs +126 -134
  412. package/node_modules/tinyexec/package.json +9 -9
  413. package/package.json +31 -21
  414. package/dist/build.d.mts +0 -19
  415. package/dist/build.d.mts.map +0 -1
  416. package/dist/build.mjs +0 -139
  417. package/dist/build.mjs.map +0 -1
  418. package/dist/components/Divider.vue +0 -105
  419. package/dist/components/Vml.vue +0 -89
  420. package/dist/components/utils.d.mts +0 -5
  421. package/dist/components/utils.d.mts.map +0 -1
  422. package/dist/components/utils.mjs +0 -9
  423. package/dist/components/utils.mjs.map +0 -1
  424. package/dist/composables/defineConfig.d.mts.map +0 -1
  425. package/dist/composables/defineConfig.mjs.map +0 -1
  426. package/dist/composables/renderContext.d.mts +0 -19
  427. package/dist/composables/renderContext.d.mts.map +0 -1
  428. package/dist/composables/renderContext.mjs.map +0 -1
  429. package/dist/composables/useConfig.d.mts.map +0 -1
  430. package/dist/composables/useConfig.mjs.map +0 -1
  431. package/dist/composables/useDoctype.d.mts.map +0 -1
  432. package/dist/composables/useDoctype.mjs.map +0 -1
  433. package/dist/composables/useEvent.d.mts.map +0 -1
  434. package/dist/composables/useEvent.mjs.map +0 -1
  435. package/dist/composables/usePlaintext.d.mts.map +0 -1
  436. package/dist/composables/usePlaintext.mjs.map +0 -1
  437. package/dist/config/defaults.d.mts.map +0 -1
  438. package/dist/config/defaults.mjs.map +0 -1
  439. package/dist/config/index.d.mts.map +0 -1
  440. package/dist/config/index.mjs.map +0 -1
  441. package/dist/events/index.d.mts.map +0 -1
  442. package/dist/events/index.mjs.map +0 -1
  443. package/dist/index.d.mts +0 -29
  444. package/dist/index.mjs +0 -29
  445. package/dist/plaintext.d.mts.map +0 -1
  446. package/dist/plaintext.mjs.map +0 -1
  447. package/dist/plugin.d.mts.map +0 -1
  448. package/dist/plugin.mjs +0 -41
  449. package/dist/plugin.mjs.map +0 -1
  450. package/dist/plugins/postcss/mergeMediaQueries.d.mts.map +0 -1
  451. package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
  452. package/dist/plugins/postcss/pruneVars.d.mts.map +0 -1
  453. package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
  454. package/dist/plugins/postcss/removeDeclarations.d.mts.map +0 -1
  455. package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
  456. package/dist/plugins/postcss/tailwindCleanup.d.mts.map +0 -1
  457. package/dist/plugins/postcss/tailwindCleanup.mjs +0 -35
  458. package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
  459. package/dist/render/createRenderer.d.mts.map +0 -1
  460. package/dist/render/createRenderer.mjs +0 -155
  461. package/dist/render/createRenderer.mjs.map +0 -1
  462. package/dist/render/index.d.mts +0 -26
  463. package/dist/render/index.d.mts.map +0 -1
  464. package/dist/render/index.mjs +0 -44
  465. package/dist/render/index.mjs.map +0 -1
  466. package/dist/serve.d.mts.map +0 -1
  467. package/dist/serve.mjs.map +0 -1
  468. package/dist/server/compatibility.d.mts +0 -6
  469. package/dist/server/compatibility.d.mts.map +0 -1
  470. package/dist/server/compatibility.mjs +0 -83
  471. package/dist/server/compatibility.mjs.map +0 -1
  472. package/dist/server/linter.d.mts +0 -6
  473. package/dist/server/linter.d.mts.map +0 -1
  474. package/dist/server/linter.mjs +0 -200
  475. package/dist/server/linter.mjs.map +0 -1
  476. package/dist/server/ui/components/ui/resizable/ResizableHandle.vue +0 -30
  477. package/dist/server/ui/components/ui/resizable/ResizablePanel.vue +0 -21
  478. package/dist/server/ui/components/ui/resizable/ResizablePanelGroup.vue +0 -25
  479. package/dist/server/ui/components/ui/resizable/index.ts +0 -3
  480. package/dist/transformers/addAttributes.d.mts.map +0 -1
  481. package/dist/transformers/addAttributes.mjs.map +0 -1
  482. package/dist/transformers/attributeToStyle.d.mts +0 -25
  483. package/dist/transformers/attributeToStyle.d.mts.map +0 -1
  484. package/dist/transformers/attributeToStyle.mjs +0 -80
  485. package/dist/transformers/attributeToStyle.mjs.map +0 -1
  486. package/dist/transformers/base.d.mts +0 -8
  487. package/dist/transformers/base.d.mts.map +0 -1
  488. package/dist/transformers/base.mjs.map +0 -1
  489. package/dist/transformers/entities.d.mts +0 -8
  490. package/dist/transformers/entities.d.mts.map +0 -1
  491. package/dist/transformers/entities.mjs +0 -38
  492. package/dist/transformers/entities.mjs.map +0 -1
  493. package/dist/transformers/format.d.mts +0 -15
  494. package/dist/transformers/format.d.mts.map +0 -1
  495. package/dist/transformers/format.mjs +0 -26
  496. package/dist/transformers/format.mjs.map +0 -1
  497. package/dist/transformers/index.d.mts.map +0 -1
  498. package/dist/transformers/index.mjs +0 -73
  499. package/dist/transformers/index.mjs.map +0 -1
  500. package/dist/transformers/inlineCSS.d.mts +0 -30
  501. package/dist/transformers/inlineCSS.d.mts.map +0 -1
  502. package/dist/transformers/inlineCSS.mjs +0 -79
  503. package/dist/transformers/inlineCSS.mjs.map +0 -1
  504. package/dist/transformers/inlineLink.d.mts +0 -14
  505. package/dist/transformers/inlineLink.d.mts.map +0 -1
  506. package/dist/transformers/inlineLink.mjs.map +0 -1
  507. package/dist/transformers/minify.d.mts +0 -17
  508. package/dist/transformers/minify.d.mts.map +0 -1
  509. package/dist/transformers/minify.mjs +0 -24
  510. package/dist/transformers/minify.mjs.map +0 -1
  511. package/dist/transformers/purgeCSS.d.mts +0 -23
  512. package/dist/transformers/purgeCSS.d.mts.map +0 -1
  513. package/dist/transformers/purgeCSS.mjs +0 -66
  514. package/dist/transformers/purgeCSS.mjs.map +0 -1
  515. package/dist/transformers/removeAttributes.d.mts +0 -31
  516. package/dist/transformers/removeAttributes.d.mts.map +0 -1
  517. package/dist/transformers/removeAttributes.mjs +0 -63
  518. package/dist/transformers/removeAttributes.mjs.map +0 -1
  519. package/dist/transformers/replaceStrings.d.mts.map +0 -1
  520. package/dist/transformers/replaceStrings.mjs.map +0 -1
  521. package/dist/transformers/safeClassNames.d.mts.map +0 -1
  522. package/dist/transformers/safeClassNames.mjs.map +0 -1
  523. package/dist/transformers/shorthandCSS.d.mts +0 -24
  524. package/dist/transformers/shorthandCSS.d.mts.map +0 -1
  525. package/dist/transformers/shorthandCSS.mjs +0 -48
  526. package/dist/transformers/shorthandCSS.mjs.map +0 -1
  527. package/dist/transformers/tailwindcss.d.mts.map +0 -1
  528. package/dist/transformers/tailwindcss.mjs +0 -136
  529. package/dist/transformers/tailwindcss.mjs.map +0 -1
  530. package/dist/transformers/urlQuery.d.mts +0 -24
  531. package/dist/transformers/urlQuery.d.mts.map +0 -1
  532. package/dist/transformers/urlQuery.mjs +0 -65
  533. package/dist/transformers/urlQuery.mjs.map +0 -1
  534. package/dist/types/config.d.mts +0 -149
  535. package/dist/types/config.d.mts.map +0 -1
  536. package/dist/types/config.mjs +0 -1
  537. package/dist/types/index.d.mts +0 -2
  538. package/dist/types/index.mjs +0 -1
  539. package/dist/utils/ast/index.d.mts +0 -4
  540. package/dist/utils/ast/index.mjs +0 -5
  541. package/dist/utils/ast/parser.d.mts.map +0 -1
  542. package/dist/utils/ast/parser.mjs.map +0 -1
  543. package/dist/utils/ast/serializer.d.mts +0 -7
  544. package/dist/utils/ast/serializer.d.mts.map +0 -1
  545. package/dist/utils/ast/serializer.mjs +0 -13
  546. package/dist/utils/ast/serializer.mjs.map +0 -1
  547. package/dist/utils/ast/walker.d.mts.map +0 -1
  548. package/dist/utils/ast/walker.mjs.map +0 -1
  549. package/dist/utils/url.d.mts.map +0 -1
  550. package/dist/utils/url.mjs.map +0 -1
  551. package/node_modules/maizzle/dist/commands/make/stubs/layout.vue +0 -39
@@ -0,0 +1,6 @@
1
+ //#region src/tests/render/_helpers.d.ts
2
+ declare function createTempProject(): string;
3
+ declare function writeSfc(dir: string, path: string, content: string): void;
4
+ //#endregion
5
+ export { createTempProject, writeSfc };
6
+ //# sourceMappingURL=_helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.d.ts","names":[],"sources":["../../../src/tests/render/_helpers.ts"],"mappings":";iBAIgB,iBAAA,CAAA;AAAA,iBAKA,QAAA,CAAS,GAAA,UAAa,IAAA,UAAc,OAAA"}
@@ -0,0 +1,16 @@
1
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ //#region src/tests/render/_helpers.ts
5
+ function createTempProject() {
6
+ return mkdtempSync(join(tmpdir(), "maizzle-render-"));
7
+ }
8
+ function writeSfc(dir, path, content) {
9
+ const full = join(dir, path);
10
+ mkdirSync(join(dir, ...path.split("/").slice(0, -1)), { recursive: true });
11
+ writeFileSync(full, content);
12
+ }
13
+ //#endregion
14
+ export { createTempProject, writeSfc };
15
+
16
+ //# sourceMappingURL=_helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_helpers.js","names":[],"sources":["../../../src/tests/render/_helpers.ts"],"sourcesContent":["import { mkdtempSync, writeFileSync, mkdirSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { tmpdir } from 'node:os'\n\nexport function createTempProject() {\n const dir = mkdtempSync(join(tmpdir(), 'maizzle-render-'))\n return dir\n}\n\nexport function writeSfc(dir: string, path: string, content: string) {\n const full = join(dir, path)\n mkdirSync(join(dir, ...path.split('/').slice(0, -1)), { recursive: true })\n writeFileSync(full, content)\n}\n"],"mappings":";;;;AAIA,SAAgB,oBAAoB;CAElC,OADY,YAAY,KAAK,QAAQ,EAAE,kBAAkB,CAC/C;;AAGZ,SAAgB,SAAS,KAAa,MAAc,SAAiB;CACnE,MAAM,OAAO,KAAK,KAAK,KAAK;CAC5B,UAAU,KAAK,KAAK,GAAG,KAAK,MAAM,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,WAAW,MAAM,CAAC;CAC1E,cAAc,MAAM,QAAQ"}
@@ -1,4 +1,4 @@
1
- import { AttributesConfig } from "../types/config.mjs";
1
+ import { AttributesConfig } from "../types/config.js";
2
2
  import { ChildNode } from "domhandler";
3
3
 
4
4
  //#region src/transformers/addAttributes.d.ts
@@ -29,4 +29,4 @@ import { ChildNode } from "domhandler";
29
29
  declare function addAttributes(dom: ChildNode[], config?: AttributesConfig): ChildNode[];
30
30
  //#endregion
31
31
  export { addAttributes };
32
- //# sourceMappingURL=addAttributes.d.mts.map
32
+ //# sourceMappingURL=addAttributes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addAttributes.d.ts","names":[],"sources":["../../src/transformers/addAttributes.ts"],"mappings":";;;;;;AA2CA;;;;;;;;;;;;;;;;;;;;;;iBAAgB,aAAA,CAAc,GAAA,EAAK,SAAA,IAAa,MAAA,GAAQ,gBAAA,GAAwB,SAAA"}
@@ -1,7 +1,6 @@
1
- import { walk } from "../utils/ast/walker.mjs";
2
- import "../utils/ast/index.mjs";
3
- import { defu } from "defu";
4
-
1
+ import { walk } from "../utils/ast/walker.js";
2
+ import "../utils/ast/index.js";
3
+ import { defu as defu$1 } from "defu";
5
4
  //#region src/transformers/addAttributes.ts
6
5
  /**
7
6
  * Default attributes to add to elements.
@@ -41,21 +40,25 @@ const DEFAULT_ATTRIBUTES = {
41
40
  function addAttributes(dom, config = {}) {
42
41
  const addConfig = config.add;
43
42
  if (addConfig === false) return dom;
44
- const attributesToAdd = defu(typeof addConfig === "object" ? addConfig : {}, DEFAULT_ATTRIBUTES);
43
+ const attributesToAdd = defu$1(typeof addConfig === "object" ? addConfig : {}, DEFAULT_ATTRIBUTES);
45
44
  if (Object.keys(attributesToAdd).length === 0) return dom;
46
45
  for (const [selectorPattern, attributes] of Object.entries(attributesToAdd)) {
46
+ if (attributes === false) continue;
47
47
  const selectors = selectorPattern.split(",").map((s) => s.trim());
48
48
  walk(dom, (node) => {
49
49
  const el = node;
50
50
  if (!el.name) return;
51
51
  if (selectors.some((selector) => elementMatches(el, selector))) {
52
52
  if (!el.attribs) el.attribs = {};
53
- for (const [attrName, attrValue] of Object.entries(attributes)) if (attrName === "class" && el.attribs.class) {
54
- const existingClasses = el.attribs.class.split(/\s+/).filter(Boolean);
55
- const newClasses = String(attrValue).split(/\s+/).filter(Boolean);
56
- const mergedClasses = [...new Set([...existingClasses, ...newClasses])];
57
- if (mergedClasses.join(" ") !== el.attribs.class) el.attribs.class = mergedClasses.join(" ");
58
- } else if (!(attrName in el.attribs)) el.attribs[attrName] = String(attrValue);
53
+ for (const [attrName, attrValue] of Object.entries(attributes)) {
54
+ if (attrValue === false) continue;
55
+ if (attrName === "class" && el.attribs.class) {
56
+ const existingClasses = el.attribs.class.split(/\s+/).filter(Boolean);
57
+ const newClasses = String(attrValue).split(/\s+/).filter(Boolean);
58
+ const mergedClasses = [...new Set([...existingClasses, ...newClasses])];
59
+ if (mergedClasses.join(" ") !== el.attribs.class) el.attribs.class = mergedClasses.join(" ");
60
+ } else if (!(attrName in el.attribs)) el.attribs[attrName] = String(attrValue);
61
+ }
59
62
  }
60
63
  });
61
64
  }
@@ -95,7 +98,7 @@ function elementMatches(el, selector) {
95
98
  }
96
99
  return el.name === selector;
97
100
  }
98
-
99
101
  //#endregion
100
102
  export { addAttributes };
101
- //# sourceMappingURL=addAttributes.mjs.map
103
+
104
+ //# sourceMappingURL=addAttributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addAttributes.js","names":["merge"],"sources":["../../src/transformers/addAttributes.ts"],"sourcesContent":["import { defu as merge } from 'defu'\nimport type { ChildNode, Element } from 'domhandler'\nimport { walk } from '../utils/ast/index.ts'\nimport type { AttributesConfig } from '../types/config.ts'\n\n/**\n * Default attributes to add to elements.\n */\nconst DEFAULT_ATTRIBUTES: Record<string, Record<string, string | boolean | number>> = {\n table: {\n cellpadding: 0,\n cellspacing: 0,\n role: 'none',\n },\n img: {\n alt: '',\n },\n}\n\n/**\n * Add attributes transformer.\n *\n * Automatically adds attributes to HTML elements based on CSS selectors.\n *\n * Default attributes (can be disabled by setting `attributes.add` to false):\n * - table: cellpadding=\"0\", cellspacing=\"0\", role=\"none\"\n * - img: alt=\"\"\n *\n * Supports tag, class, id, and attribute selectors.\n * Multiple selectors can be specified by comma-separating them.\n *\n * Examples:\n * ```js\n * attributes: {\n * add: {\n * div: { role: 'article' },\n * '.test': { editable: true },\n * '#header': { 'data-id': 'main' },\n * 'div, p': { class: 'content' },\n * }\n * }\n * ```\n */\nexport function addAttributes(dom: ChildNode[], config: AttributesConfig = {}): ChildNode[] {\n const addConfig = config.add\n\n // Disabled when explicitly set to false\n if (addConfig === false) {\n return dom\n }\n\n // Deep merge user attributes on top of defaults using defu\n const userAttributes = typeof addConfig === 'object' ? addConfig : {}\n const attributesToAdd = merge(userAttributes, DEFAULT_ATTRIBUTES) as Record<string, false | Record<string, false | string | boolean | number>>\n\n if (Object.keys(attributesToAdd).length === 0) {\n return dom\n }\n\n // Process each selector pattern\n for (const [selectorPattern, attributes] of Object.entries(attributesToAdd)) {\n // User opted out of this selector entirely (e.g. `table: false`)\n if (attributes === false) continue\n // Split by comma for multiple selectors\n const selectors = selectorPattern.split(',').map(s => s.trim())\n\n walk(dom, (node) => {\n const el = node as Element\n if (!el.name) return\n\n // Check if element matches any selector in the pattern\n const matches = selectors.some(selector => elementMatches(el, selector))\n\n if (matches) {\n // Initialize attribs if needed\n if (!el.attribs) {\n el.attribs = {}\n }\n\n for (const [attrName, attrValue] of Object.entries(attributes)) {\n // User opted out of this specific attribute (e.g. `role: false`)\n if (attrValue === false) continue\n // Special handling for class - merge instead of replace\n if (attrName === 'class' && el.attribs.class) {\n const existingClasses = el.attribs.class.split(/\\s+/).filter(Boolean)\n const newClasses = String(attrValue).split(/\\s+/).filter(Boolean)\n const mergedClasses = [...new Set([...existingClasses, ...newClasses])]\n if (mergedClasses.join(' ') !== el.attribs.class) {\n el.attribs.class = mergedClasses.join(' ')\n }\n } else {\n // Only add attribute if not already present\n if (!(attrName in el.attribs)) {\n el.attribs[attrName] = String(attrValue)\n }\n }\n }\n }\n })\n }\n\n return dom\n}\n\n/**\n * Check if an element matches a CSS selector.\n * Supports: tag, .class, #id, [attribute], [attribute=value]\n */\nfunction elementMatches(el: Element, selector: string): boolean {\n // Remove whitespace\n selector = selector.trim()\n\n // Check for attribute selector [attr] or [attr=value]\n const attrMatch = selector.match(/^\\[([^\\]=]+)(?:=([^\\]]*))?\\]$/)\n if (attrMatch) {\n const [, attrName, attrValue] = attrMatch\n if (attrValue === undefined) {\n // Just checking if attribute exists\n return attrName in (el.attribs || {})\n } else {\n // Check if attribute has specific value\n return el.attribs?.[attrName] === attrValue\n }\n }\n\n // Check for class selector .class\n if (selector.startsWith('.')) {\n const className = selector.slice(1)\n const classes = el.attribs?.class?.split(/\\s+/) || []\n return classes.includes(className)\n }\n\n // Check for id selector #id\n if (selector.startsWith('#')) {\n const id = selector.slice(1)\n return el.attribs?.id === id\n }\n\n // Check for tag selector (possibly with attribute)\n // Split tag from attribute if present, e.g., \"div[role=alert]\"\n const tagAttrMatch = selector.match(/^([a-z][a-z0-9]*)\\[([^\\]]+)\\]$/i)\n if (tagAttrMatch) {\n const [, tagName, attrPart] = tagAttrMatch\n if (el.name !== tagName) return false\n\n // Parse attribute part: could be \"attr\" or \"attr=value\"\n const attrEqMatch = attrPart.match(/^([^=]+)(?:=(.*))?$/)\n if (attrEqMatch) {\n const [, attrName, attrValue] = attrEqMatch\n if (attrValue === undefined) {\n return attrName in (el.attribs || {})\n } else {\n return el.attribs?.[attrName] === attrValue\n }\n }\n return false\n }\n\n // Simple tag selector\n return el.name === selector\n}\n"],"mappings":";;;;;;;AAQA,MAAM,qBAAgF;CACpF,OAAO;EACL,aAAa;EACb,aAAa;EACb,MAAM;EACP;CACD,KAAK,EACH,KAAK,IACN;CACF;;;;;;;;;;;;;;;;;;;;;;;;;AA0BD,SAAgB,cAAc,KAAkB,SAA2B,EAAE,EAAe;CAC1F,MAAM,YAAY,OAAO;CAGzB,IAAI,cAAc,OAChB,OAAO;CAKT,MAAM,kBAAkBA,OADD,OAAO,cAAc,WAAW,YAAY,EAAE,EACvB,mBAAmB;CAEjE,IAAI,OAAO,KAAK,gBAAgB,CAAC,WAAW,GAC1C,OAAO;CAIT,KAAK,MAAM,CAAC,iBAAiB,eAAe,OAAO,QAAQ,gBAAgB,EAAE;EAE3E,IAAI,eAAe,OAAO;EAE1B,MAAM,YAAY,gBAAgB,MAAM,IAAI,CAAC,KAAI,MAAK,EAAE,MAAM,CAAC;EAE/D,KAAK,MAAM,SAAS;GAClB,MAAM,KAAK;GACX,IAAI,CAAC,GAAG,MAAM;GAKd,IAFgB,UAAU,MAAK,aAAY,eAAe,IAAI,SAAS,CAE5D,EAAE;IAEX,IAAI,CAAC,GAAG,SACN,GAAG,UAAU,EAAE;IAGjB,KAAK,MAAM,CAAC,UAAU,cAAc,OAAO,QAAQ,WAAW,EAAE;KAE9D,IAAI,cAAc,OAAO;KAEzB,IAAI,aAAa,WAAW,GAAG,QAAQ,OAAO;MAC5C,MAAM,kBAAkB,GAAG,QAAQ,MAAM,MAAM,MAAM,CAAC,OAAO,QAAQ;MACrE,MAAM,aAAa,OAAO,UAAU,CAAC,MAAM,MAAM,CAAC,OAAO,QAAQ;MACjE,MAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,iBAAiB,GAAG,WAAW,CAAC,CAAC;MACvE,IAAI,cAAc,KAAK,IAAI,KAAK,GAAG,QAAQ,OACzC,GAAG,QAAQ,QAAQ,cAAc,KAAK,IAAI;YAI5C,IAAI,EAAE,YAAY,GAAG,UACnB,GAAG,QAAQ,YAAY,OAAO,UAAU;;;IAKhD;;CAGJ,OAAO;;;;;;AAOT,SAAS,eAAe,IAAa,UAA2B;CAE9D,WAAW,SAAS,MAAM;CAG1B,MAAM,YAAY,SAAS,MAAM,gCAAgC;CACjE,IAAI,WAAW;EACb,MAAM,GAAG,UAAU,aAAa;EAChC,IAAI,cAAc,KAAA,GAEhB,OAAO,aAAa,GAAG,WAAW,EAAE;OAGpC,OAAO,GAAG,UAAU,cAAc;;CAKtC,IAAI,SAAS,WAAW,IAAI,EAAE;EAC5B,MAAM,YAAY,SAAS,MAAM,EAAE;EAEnC,QADgB,GAAG,SAAS,OAAO,MAAM,MAAM,IAAI,EAAE,EACtC,SAAS,UAAU;;CAIpC,IAAI,SAAS,WAAW,IAAI,EAAE;EAC5B,MAAM,KAAK,SAAS,MAAM,EAAE;EAC5B,OAAO,GAAG,SAAS,OAAO;;CAK5B,MAAM,eAAe,SAAS,MAAM,kCAAkC;CACtE,IAAI,cAAc;EAChB,MAAM,GAAG,SAAS,YAAY;EAC9B,IAAI,GAAG,SAAS,SAAS,OAAO;EAGhC,MAAM,cAAc,SAAS,MAAM,sBAAsB;EACzD,IAAI,aAAa;GACf,MAAM,GAAG,UAAU,aAAa;GAChC,IAAI,cAAc,KAAA,GAChB,OAAO,aAAa,GAAG,WAAW,EAAE;QAEpC,OAAO,GAAG,UAAU,cAAc;;EAGtC,OAAO;;CAIT,OAAO,GAAG,SAAS"}
@@ -0,0 +1,38 @@
1
+ import { ChildNode } from "domhandler";
2
+
3
+ //#region src/transformers/attributeToStyle.d.ts
4
+ /**
5
+ * Convert HTML attributes to inline CSS styles.
6
+ *
7
+ * Supported attributes:
8
+ * - `width`: `width: ${value}${unit}` (px and %, defaults to px)
9
+ * - `height`: `height: ${value}${unit}` (px and %, defaults to px)
10
+ * - `bgcolor`: `background-color: ${value}`
11
+ * - `background`: `background-image: url('${value}')`
12
+ * - `align`: on `<table>`, `left`/`right` become `float`, `center` becomes
13
+ * `margin-left/right: auto`; on other elements, becomes `text-align`
14
+ * - `valign`: `vertical-align: ${value}`
15
+ *
16
+ * @param html HTML string to transform.
17
+ * @param attributes `true` to process the default set, an array to restrict
18
+ * to specific attribute names, `false` to disable.
19
+ * @returns The transformed HTML string.
20
+ *
21
+ * @example
22
+ * import { attributeToStyle } from '@maizzle/framework'
23
+ *
24
+ * const out = attributeToStyle('<table align="center"><tr><td bgcolor="#f00">x</td></tr></table>')
25
+ *
26
+ * // Restrict to specific attributes:
27
+ * const limited = attributeToStyle(html, ['width', 'height'])
28
+ */
29
+ declare function attributeToStyle(html: string, attributes?: boolean | string[]): string;
30
+ /**
31
+ * DOM-form of {@link attributeToStyle} used by the internal transformer
32
+ * pipeline. Takes a parsed DOM, returns a parsed DOM — avoids redundant
33
+ * serialize/parse round-trips when chained with other transformers.
34
+ */
35
+ declare function attributeToStyleDom(dom: ChildNode[], attributes?: boolean | string[]): ChildNode[];
36
+ //#endregion
37
+ export { attributeToStyle, attributeToStyleDom };
38
+ //# sourceMappingURL=attributeToStyle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributeToStyle.d.ts","names":[],"sources":["../../src/transformers/attributeToStyle.ts"],"mappings":";;;;;AAiCA;;;;;AASA;;;;;;;;;;;;;;;;;;iBATgB,gBAAA,CAAiB,IAAA,UAAc,UAAA;;;;;;iBAS/B,mBAAA,CAAoB,GAAA,EAAK,SAAA,IAAa,UAAA,wBAAwC,SAAA"}
@@ -0,0 +1,94 @@
1
+ import { parse } from "../utils/ast/parser.js";
2
+ import { walk } from "../utils/ast/walker.js";
3
+ import { serialize } from "../utils/ast/serializer.js";
4
+ import "../utils/ast/index.js";
5
+ //#region src/transformers/attributeToStyle.ts
6
+ /**
7
+ * Default list of attributes that can be converted to inline styles.
8
+ */
9
+ const DEFAULT_ATTRIBUTES = [
10
+ "width",
11
+ "height",
12
+ "bgcolor",
13
+ "background",
14
+ "align",
15
+ "valign"
16
+ ];
17
+ /**
18
+ * Convert HTML attributes to inline CSS styles.
19
+ *
20
+ * Supported attributes:
21
+ * - `width`: `width: ${value}${unit}` (px and %, defaults to px)
22
+ * - `height`: `height: ${value}${unit}` (px and %, defaults to px)
23
+ * - `bgcolor`: `background-color: ${value}`
24
+ * - `background`: `background-image: url('${value}')`
25
+ * - `align`: on `<table>`, `left`/`right` become `float`, `center` becomes
26
+ * `margin-left/right: auto`; on other elements, becomes `text-align`
27
+ * - `valign`: `vertical-align: ${value}`
28
+ *
29
+ * @param html HTML string to transform.
30
+ * @param attributes `true` to process the default set, an array to restrict
31
+ * to specific attribute names, `false` to disable.
32
+ * @returns The transformed HTML string.
33
+ *
34
+ * @example
35
+ * import { attributeToStyle } from '@maizzle/framework'
36
+ *
37
+ * const out = attributeToStyle('<table align="center"><tr><td bgcolor="#f00">x</td></tr></table>')
38
+ *
39
+ * // Restrict to specific attributes:
40
+ * const limited = attributeToStyle(html, ['width', 'height'])
41
+ */
42
+ function attributeToStyle(html, attributes = true) {
43
+ return serialize(attributeToStyleDom(parse(html), attributes));
44
+ }
45
+ /**
46
+ * DOM-form of {@link attributeToStyle} used by the internal transformer
47
+ * pipeline. Takes a parsed DOM, returns a parsed DOM — avoids redundant
48
+ * serialize/parse round-trips when chained with other transformers.
49
+ */
50
+ function attributeToStyleDom(dom, attributes = true) {
51
+ if (!attributes) return dom;
52
+ const attributesToProcess = attributes === true ? DEFAULT_ATTRIBUTES : Array.isArray(attributes) ? attributes : [];
53
+ if (attributesToProcess.length === 0) return dom;
54
+ walk(dom, (node) => {
55
+ const el = node;
56
+ if (!("attribs" in el) || !el.attribs) return;
57
+ const styles = [];
58
+ for (const attr of attributesToProcess) {
59
+ const value = el.attribs[attr];
60
+ if (!value) continue;
61
+ const styleValue = convertAttributeToStyle(el.name, attr, value);
62
+ if (styleValue) styles.push(styleValue);
63
+ }
64
+ if (styles.length > 0) {
65
+ const existingStyle = el.attribs.style || "";
66
+ const separator = existingStyle ? "; " : "";
67
+ el.attribs.style = existingStyle + separator + styles.join("; ");
68
+ }
69
+ });
70
+ return dom;
71
+ }
72
+ /**
73
+ * Convert a single HTML attribute value to a CSS style declaration.
74
+ */
75
+ function convertAttributeToStyle(tagName, attr, value) {
76
+ switch (attr) {
77
+ case "width":
78
+ case "height": return `${attr}: ${/^\d+$/.test(value) ? `${value}px` : value}`;
79
+ case "bgcolor": return `background-color: ${value}`;
80
+ case "background": return `background-image: url('${value}')`;
81
+ case "align":
82
+ if (tagName === "table") {
83
+ if (value === "left" || value === "right") return `float: ${value}`;
84
+ if (value === "center") return "margin-left: auto; margin-right: auto";
85
+ }
86
+ return `text-align: ${value}`;
87
+ case "valign": return `vertical-align: ${value}`;
88
+ default: return null;
89
+ }
90
+ }
91
+ //#endregion
92
+ export { attributeToStyle, attributeToStyleDom };
93
+
94
+ //# sourceMappingURL=attributeToStyle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributeToStyle.js","names":[],"sources":["../../src/transformers/attributeToStyle.ts"],"sourcesContent":["import type { ChildNode, Element } from 'domhandler'\nimport { parse, serialize, walk } from '../utils/ast/index.ts'\n\n/**\n * Default list of attributes that can be converted to inline styles.\n */\nconst DEFAULT_ATTRIBUTES = ['width', 'height', 'bgcolor', 'background', 'align', 'valign']\n\n/**\n * Convert HTML attributes to inline CSS styles.\n *\n * Supported attributes:\n * - `width`: `width: ${value}${unit}` (px and %, defaults to px)\n * - `height`: `height: ${value}${unit}` (px and %, defaults to px)\n * - `bgcolor`: `background-color: ${value}`\n * - `background`: `background-image: url('${value}')`\n * - `align`: on `<table>`, `left`/`right` become `float`, `center` becomes\n * `margin-left/right: auto`; on other elements, becomes `text-align`\n * - `valign`: `vertical-align: ${value}`\n *\n * @param html HTML string to transform.\n * @param attributes `true` to process the default set, an array to restrict\n * to specific attribute names, `false` to disable.\n * @returns The transformed HTML string.\n *\n * @example\n * import { attributeToStyle } from '@maizzle/framework'\n *\n * const out = attributeToStyle('<table align=\"center\"><tr><td bgcolor=\"#f00\">x</td></tr></table>')\n *\n * // Restrict to specific attributes:\n * const limited = attributeToStyle(html, ['width', 'height'])\n */\nexport function attributeToStyle(html: string, attributes: boolean | string[] = true): string {\n return serialize(attributeToStyleDom(parse(html), attributes))\n}\n\n/**\n * DOM-form of {@link attributeToStyle} used by the internal transformer\n * pipeline. Takes a parsed DOM, returns a parsed DOM — avoids redundant\n * serialize/parse round-trips when chained with other transformers.\n */\nexport function attributeToStyleDom(dom: ChildNode[], attributes: boolean | string[] = true): ChildNode[] {\n if (!attributes) return dom\n\n const attributesToProcess: string[] = attributes === true\n ? DEFAULT_ATTRIBUTES\n : Array.isArray(attributes)\n ? attributes\n : []\n\n if (attributesToProcess.length === 0) return dom\n\n walk(dom, (node) => {\n const el = node as Element\n\n if (!('attribs' in el) || !el.attribs) {\n return\n }\n\n const styles: string[] = []\n\n for (const attr of attributesToProcess) {\n const value = el.attribs[attr]\n if (!value) continue\n\n const styleValue = convertAttributeToStyle(el.name, attr, value)\n if (styleValue) {\n styles.push(styleValue)\n }\n }\n\n // Append new styles to existing style attribute\n if (styles.length > 0) {\n const existingStyle = el.attribs.style || ''\n const separator = existingStyle ? '; ' : ''\n el.attribs.style = existingStyle + separator + styles.join('; ')\n }\n })\n\n return dom\n}\n\n/**\n * Convert a single HTML attribute value to a CSS style declaration.\n */\nfunction convertAttributeToStyle(\n tagName: string,\n attr: string,\n value: string,\n): string | null {\n switch (attr) {\n case 'width':\n case 'height': {\n // Support px and % values, default to px if no unit\n const normalizedValue = /^\\d+$/.test(value) ? `${value}px` : value\n return `${attr}: ${normalizedValue}`\n }\n\n case 'bgcolor':\n return `background-color: ${value}`\n\n case 'background':\n return `background-image: url('${value}')`\n\n case 'align': {\n // On table elements: left/right -> float, center -> margin auto\n if (tagName === 'table') {\n if (value === 'left' || value === 'right') {\n return `float: ${value}`\n }\n if (value === 'center') {\n return 'margin-left: auto; margin-right: auto'\n }\n }\n // On other elements: text-align\n return `text-align: ${value}`\n }\n\n case 'valign':\n return `vertical-align: ${value}`\n\n default:\n return null\n }\n}\n"],"mappings":";;;;;;;;AAMA,MAAM,qBAAqB;CAAC;CAAS;CAAU;CAAW;CAAc;CAAS;CAAS;;;;;;;;;;;;;;;;;;;;;;;;;;AA2B1F,SAAgB,iBAAiB,MAAc,aAAiC,MAAc;CAC5F,OAAO,UAAU,oBAAoB,MAAM,KAAK,EAAE,WAAW,CAAC;;;;;;;AAQhE,SAAgB,oBAAoB,KAAkB,aAAiC,MAAmB;CACxG,IAAI,CAAC,YAAY,OAAO;CAExB,MAAM,sBAAgC,eAAe,OACjD,qBACA,MAAM,QAAQ,WAAW,GACvB,aACA,EAAE;CAER,IAAI,oBAAoB,WAAW,GAAG,OAAO;CAE7C,KAAK,MAAM,SAAS;EAClB,MAAM,KAAK;EAEX,IAAI,EAAE,aAAa,OAAO,CAAC,GAAG,SAC5B;EAGF,MAAM,SAAmB,EAAE;EAE3B,KAAK,MAAM,QAAQ,qBAAqB;GACtC,MAAM,QAAQ,GAAG,QAAQ;GACzB,IAAI,CAAC,OAAO;GAEZ,MAAM,aAAa,wBAAwB,GAAG,MAAM,MAAM,MAAM;GAChE,IAAI,YACF,OAAO,KAAK,WAAW;;EAK3B,IAAI,OAAO,SAAS,GAAG;GACrB,MAAM,gBAAgB,GAAG,QAAQ,SAAS;GAC1C,MAAM,YAAY,gBAAgB,OAAO;GACzC,GAAG,QAAQ,QAAQ,gBAAgB,YAAY,OAAO,KAAK,KAAK;;GAElE;CAEF,OAAO;;;;;AAMT,SAAS,wBACP,SACA,MACA,OACe;CACf,QAAQ,MAAR;EACE,KAAK;EACL,KAAK,UAGH,OAAO,GAAG,KAAK,IADS,QAAQ,KAAK,MAAM,GAAG,GAAG,MAAM,MAAM;EAI/D,KAAK,WACH,OAAO,qBAAqB;EAE9B,KAAK,cACH,OAAO,0BAA0B,MAAM;EAEzC,KAAK;GAEH,IAAI,YAAY,SAAS;IACvB,IAAI,UAAU,UAAU,UAAU,SAChC,OAAO,UAAU;IAEnB,IAAI,UAAU,UACZ,OAAO;;GAIX,OAAO,eAAe;EAGxB,KAAK,UACH,OAAO,mBAAmB;EAE5B,SACE,OAAO"}
@@ -0,0 +1,71 @@
1
+ import { ChildNode } from "domhandler";
2
+
3
+ //#region src/transformers/base.d.ts
4
+ /**
5
+ * Options for the `base` transformer.
6
+ */
7
+ interface BaseUrlOptions {
8
+ /** Base URL to prepend to relative links. */
9
+ url: string;
10
+ /**
11
+ * Tag/attribute scope for prepending. Omit to use the built-in defaults
12
+ * (`a[href]`, `img[src]`, `link[href]`, etc.).
13
+ *
14
+ * - Array of tag names — restrict the built-in defaults to these tags.
15
+ * - Object — explicit per-tag attribute map. Each attribute value is
16
+ * `true` (use the base url) or a string (use that string as the url
17
+ * for this attribute only).
18
+ */
19
+ tags?: string[] | Record<string, Record<string, string | boolean>>;
20
+ /**
21
+ * Custom attributes to rewrite globally, regardless of tag. Each key
22
+ * is the attribute name; the value is the URL to prepend.
23
+ */
24
+ attributes?: Record<string, string>;
25
+ /**
26
+ * Rewrite `url()` references inside `<style>` tag contents.
27
+ *
28
+ * @default true
29
+ */
30
+ styleTag?: boolean;
31
+ /**
32
+ * Rewrite `url()` references inside inline `style` attributes.
33
+ *
34
+ * @default true
35
+ */
36
+ inlineCss?: boolean;
37
+ }
38
+ /**
39
+ * Prepend a base URL to relative `src`/`href`/etc. references throughout
40
+ * the document, including inside `<style>` blocks, inline `style`
41
+ * attributes, MSO conditional comments, and VML tags.
42
+ *
43
+ * @param html HTML string to transform.
44
+ * @param options Either a base URL string, or a {@link BaseUrlOptions} object
45
+ * for finer control.
46
+ * @returns The transformed HTML string.
47
+ *
48
+ * @example
49
+ * import { base } from '@maizzle/framework'
50
+ *
51
+ * // Just a URL — applied with the built-in tag/attribute defaults.
52
+ * const out = base('<img src="/a.png">', 'https://cdn.example.com/')
53
+ *
54
+ * // Restrict to specific tags, opt out of style rewriting:
55
+ * const limited = base(html, {
56
+ * url: 'https://cdn.example.com/',
57
+ * tags: ['img'],
58
+ * styleTag: false,
59
+ * inlineCss: false,
60
+ * })
61
+ */
62
+ declare function base(html: string, options: string | BaseUrlOptions): string;
63
+ /**
64
+ * DOM-form of {@link base} used by the internal transformer pipeline.
65
+ * Takes a parsed DOM, returns a parsed DOM — avoids redundant
66
+ * serialize/parse round-trips when chained with other transformers.
67
+ */
68
+ declare function baseDom(dom: ChildNode[], options: string | BaseUrlOptions | undefined | null | false): ChildNode[];
69
+ //#endregion
70
+ export { BaseUrlOptions, base, baseDom };
71
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","names":[],"sources":["../../src/transformers/base.ts"],"mappings":";;;;;AAUA;UAAiB,cAAA;;EAEf,GAAA;EAUkB;;;;;;;;;EAAlB,IAAA,cAAkB,MAAA,SAAe,MAAA;EAWjC;;;;EANA,UAAA,GAAa,MAAA;EAuIK;;;;;EAjIlB,QAAA;EAiIiE;;AASnE;;;EApIE,SAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;iBA2Hc,IAAA,CAAK,IAAA,UAAc,OAAA,WAAkB,cAAA;;;;;;iBASrC,OAAA,CAAQ,GAAA,EAAK,SAAA,IAAa,OAAA,WAAkB,cAAA,8BAA4C,SAAA"}
@@ -1,12 +1,11 @@
1
- import { parse } from "../utils/ast/parser.mjs";
2
- import { walk } from "../utils/ast/walker.mjs";
3
- import { serialize } from "../utils/ast/serializer.mjs";
4
- import "../utils/ast/index.mjs";
5
- import { defaultTags, isAbsoluteUrl, processSrcset } from "../utils/url.mjs";
1
+ import { parse } from "../utils/ast/parser.js";
2
+ import { walk } from "../utils/ast/walker.js";
3
+ import { serialize } from "../utils/ast/serializer.js";
4
+ import "../utils/ast/index.js";
5
+ import { defaultTags, isAbsoluteUrl, processSrcset } from "../utils/url.js";
6
6
  import postcss from "postcss";
7
7
  import safeParser from "postcss-safe-parser";
8
8
  import valueParser from "postcss-value-parser";
9
-
10
9
  //#region src/transformers/base.ts
11
10
  const sourceAttributes = [
12
11
  "src",
@@ -59,24 +58,19 @@ function processInlineStyle(style, url) {
59
58
  return style;
60
59
  }
61
60
  }
62
- function getBaseUrl(config) {
63
- const baseUrlConfig = config.base;
64
- if (!baseUrlConfig || baseUrlConfig === "") return;
65
- return baseUrlConfig;
66
- }
67
- function resolveOptions(baseUrlConfig) {
68
- if (!baseUrlConfig) return void 0;
69
- if (typeof baseUrlConfig === "string") return {
70
- url: baseUrlConfig,
61
+ function resolveOptions(input) {
62
+ if (!input) return void 0;
63
+ if (typeof input === "string") return {
64
+ url: input,
71
65
  styleTag: true,
72
66
  inlineCss: true
73
67
  };
74
- if (typeof baseUrlConfig === "object" && "url" in baseUrlConfig) return {
75
- url: baseUrlConfig.url ?? "",
76
- tags: baseUrlConfig.tags,
77
- attributes: baseUrlConfig.attributes,
78
- styleTag: baseUrlConfig.styleTag ?? true,
79
- inlineCss: baseUrlConfig.inlineCss ?? true
68
+ if (typeof input === "object" && "url" in input) return {
69
+ url: input.url ?? "",
70
+ tags: input.tags,
71
+ attributes: input.attributes,
72
+ styleTag: input.styleTag ?? true,
73
+ inlineCss: input.inlineCss ?? true
80
74
  };
81
75
  }
82
76
  function getTagConfig(tagName, options) {
@@ -88,10 +82,42 @@ function getTagConfig(tagName, options) {
88
82
  }
89
83
  if (typeof tags === "object") return tags[tagName];
90
84
  }
91
- function base(dom, config = {}) {
92
- const options = resolveOptions(getBaseUrl(config));
93
- if (!options || !options.url) return dom;
94
- const { url: baseUrl, styleTag = true, inlineCss = true, attributes = {} } = options;
85
+ /**
86
+ * Prepend a base URL to relative `src`/`href`/etc. references throughout
87
+ * the document, including inside `<style>` blocks, inline `style`
88
+ * attributes, MSO conditional comments, and VML tags.
89
+ *
90
+ * @param html HTML string to transform.
91
+ * @param options Either a base URL string, or a {@link BaseUrlOptions} object
92
+ * for finer control.
93
+ * @returns The transformed HTML string.
94
+ *
95
+ * @example
96
+ * import { base } from '@maizzle/framework'
97
+ *
98
+ * // Just a URL — applied with the built-in tag/attribute defaults.
99
+ * const out = base('<img src="/a.png">', 'https://cdn.example.com/')
100
+ *
101
+ * // Restrict to specific tags, opt out of style rewriting:
102
+ * const limited = base(html, {
103
+ * url: 'https://cdn.example.com/',
104
+ * tags: ['img'],
105
+ * styleTag: false,
106
+ * inlineCss: false,
107
+ * })
108
+ */
109
+ function base(html, options) {
110
+ return serialize(baseDom(parse(html), options));
111
+ }
112
+ /**
113
+ * DOM-form of {@link base} used by the internal transformer pipeline.
114
+ * Takes a parsed DOM, returns a parsed DOM — avoids redundant
115
+ * serialize/parse round-trips when chained with other transformers.
116
+ */
117
+ function baseDom(dom, options) {
118
+ const resolved = resolveOptions(options);
119
+ if (!resolved || !resolved.url) return dom;
120
+ const { url: baseUrl, styleTag = true, inlineCss = true, attributes = {} } = resolved;
95
121
  walk(dom, (node) => {
96
122
  const el = node;
97
123
  if (!el.name) return;
@@ -104,8 +130,8 @@ function base(dom, config = {}) {
104
130
  return;
105
131
  }
106
132
  if (!el.attribs) return;
107
- const tagConfig = getTagConfig(el.name, options);
108
- if (tagConfig || options.tags === void 0) for (const [attr, value] of Object.entries(el.attribs)) {
133
+ const tagConfig = getTagConfig(el.name, resolved);
134
+ if (tagConfig || resolved.tags === void 0) for (const [attr, value] of Object.entries(el.attribs)) {
109
135
  if (!value) continue;
110
136
  const attrConfig = tagConfig?.[attr];
111
137
  if (!attrConfig && attr !== "style") continue;
@@ -154,7 +180,7 @@ function rewriteMsoComments(html, url) {
154
180
  return result;
155
181
  });
156
182
  }
157
-
158
183
  //#endregion
159
- export { base };
160
- //# sourceMappingURL=base.mjs.map
184
+ export { base, baseDom };
185
+
186
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","names":[],"sources":["../../src/transformers/base.ts"],"sourcesContent":["import postcss from 'postcss'\nimport safeParser from 'postcss-safe-parser'\nimport valueParser from 'postcss-value-parser'\nimport { walk, serialize, parse } from '../utils/ast/index.ts'\nimport { isAbsoluteUrl, defaultTags, processSrcset } from '../utils/url.ts'\nimport type { ChildNode, Element } from 'domhandler'\n\n/**\n * Options for the `base` transformer.\n */\nexport interface BaseUrlOptions {\n /** Base URL to prepend to relative links. */\n url: string\n /**\n * Tag/attribute scope for prepending. Omit to use the built-in defaults\n * (`a[href]`, `img[src]`, `link[href]`, etc.).\n *\n * - Array of tag names — restrict the built-in defaults to these tags.\n * - Object — explicit per-tag attribute map. Each attribute value is\n * `true` (use the base url) or a string (use that string as the url\n * for this attribute only).\n */\n tags?: string[] | Record<string, Record<string, string | boolean>>\n /**\n * Custom attributes to rewrite globally, regardless of tag. Each key\n * is the attribute name; the value is the URL to prepend.\n */\n attributes?: Record<string, string>\n /**\n * Rewrite `url()` references inside `<style>` tag contents.\n *\n * @default true\n */\n styleTag?: boolean\n /**\n * Rewrite `url()` references inside inline `style` attributes.\n *\n * @default true\n */\n inlineCss?: boolean\n}\n\nconst sourceAttributes = ['src', 'href', 'srcset', 'poster', 'background', 'data']\n\n/**\n * Convert the shared `defaultTags` (tag → string[]) into the richer format\n * the transformer needs (tag → Record<attr, true>).\n */\nconst defaultTagConfig: Record<string, Record<string, string | boolean>> = Object.fromEntries(\n Object.entries(defaultTags).map(([tag, attrs]) => [\n tag,\n Object.fromEntries(attrs.map(attr => [attr, true])),\n ]),\n)\n\nconst postcssBaseUrl: postcss.PluginCreator<{ url: string }> = (opts) => {\n return {\n postcssPlugin: 'postcss-base-url',\n Declaration(decl) {\n if (!decl.value.includes('url(')) return\n\n const parsed = valueParser(decl.value)\n let changed = false\n\n parsed.walk(node => {\n if (node.type !== 'function' || node.value !== 'url') return\n\n const urlNode = node.nodes[0]\n if (!urlNode) return\n\n if (isAbsoluteUrl(urlNode.value)) return\n\n urlNode.value = opts!.url + urlNode.value\n changed = true\n })\n\n if (changed) {\n decl.value = parsed.toString()\n }\n }\n }\n}\npostcssBaseUrl.postcss = true\n\nfunction processCss(css: string, url: string): string {\n const { css: result } = postcss([postcssBaseUrl({ url })]).process(css, { parser: safeParser, from: undefined })\n return result\n}\n\nfunction processInlineStyle(style: string, url: string): string {\n try {\n const { css } = postcss([postcssBaseUrl({ url })]).process(`a{${style}}`, { parser: safeParser, from: undefined })\n const match = css.match(/a\\s*\\{\\s*([\\s\\S]*?)\\s*\\}/)\n return match?.[1]?.trim() ?? style\n } catch {\n return style\n }\n}\n\nfunction resolveOptions(input: string | BaseUrlOptions | undefined | null | false): BaseUrlOptions | undefined {\n if (!input) return undefined\n if (typeof input === 'string') {\n return { url: input, styleTag: true, inlineCss: true }\n }\n if (typeof input === 'object' && 'url' in input) {\n return {\n url: input.url ?? '',\n tags: input.tags,\n attributes: input.attributes,\n styleTag: input.styleTag ?? true,\n inlineCss: input.inlineCss ?? true,\n }\n }\n return undefined\n}\n\nfunction getTagConfig(\n tagName: string,\n options: BaseUrlOptions\n): Record<string, string | boolean> | undefined {\n const { tags } = options\n\n if (tags === undefined) {\n return defaultTagConfig[tagName]\n }\n\n if (Array.isArray(tags)) {\n if (!tags.includes(tagName)) return undefined\n return defaultTagConfig[tagName]\n }\n\n if (typeof tags === 'object') {\n return tags[tagName]\n }\n\n return undefined\n}\n\n/**\n * Prepend a base URL to relative `src`/`href`/etc. references throughout\n * the document, including inside `<style>` blocks, inline `style`\n * attributes, MSO conditional comments, and VML tags.\n *\n * @param html HTML string to transform.\n * @param options Either a base URL string, or a {@link BaseUrlOptions} object\n * for finer control.\n * @returns The transformed HTML string.\n *\n * @example\n * import { base } from '@maizzle/framework'\n *\n * // Just a URL — applied with the built-in tag/attribute defaults.\n * const out = base('<img src=\"/a.png\">', 'https://cdn.example.com/')\n *\n * // Restrict to specific tags, opt out of style rewriting:\n * const limited = base(html, {\n * url: 'https://cdn.example.com/',\n * tags: ['img'],\n * styleTag: false,\n * inlineCss: false,\n * })\n */\nexport function base(html: string, options: string | BaseUrlOptions): string {\n return serialize(baseDom(parse(html), options))\n}\n\n/**\n * DOM-form of {@link base} used by the internal transformer pipeline.\n * Takes a parsed DOM, returns a parsed DOM — avoids redundant\n * serialize/parse round-trips when chained with other transformers.\n */\nexport function baseDom(dom: ChildNode[], options: string | BaseUrlOptions | undefined | null | false): ChildNode[] {\n const resolved = resolveOptions(options)\n if (!resolved || !resolved.url) return dom\n\n const { url: baseUrl, styleTag = true, inlineCss = true, attributes = {} } = resolved\n\n walk(dom, (node) => {\n const el = node as Element\n if (!el.name) return\n\n // Process <style> tag content with PostCSS\n if (el.name === 'style' && styleTag && el.children) {\n for (const child of el.children) {\n if (child.type === 'text') {\n const textNode = child as unknown as { data: string }\n const processed = processCss(textNode.data, baseUrl)\n if (processed !== textNode.data) {\n textNode.data = processed\n }\n }\n }\n return\n }\n\n if (!el.attribs) return\n\n // Process tag-specific attributes (respects tags filter)\n const tagConfig = getTagConfig(el.name, resolved)\n\n if (tagConfig || resolved.tags === undefined) {\n for (const [attr, value] of Object.entries(el.attribs)) {\n if (!value) continue\n\n const attrConfig = tagConfig?.[attr]\n if (!attrConfig && attr !== 'style') continue\n\n if (attr === 'srcset' && (attrConfig === true || typeof attrConfig === 'string')) {\n const newSrcset = processSrcset(value, typeof attrConfig === 'string' ? attrConfig : baseUrl)\n if (newSrcset !== value) {\n el.attribs.srcset = newSrcset\n }\n } else if (attr === 'style' && inlineCss && value.includes('url(')) {\n const newStyle = processInlineStyle(value, baseUrl)\n if (newStyle !== value) {\n el.attribs.style = newStyle\n }\n } else if (attrConfig === true && !isAbsoluteUrl(value)) {\n el.attribs[attr] = baseUrl + value\n } else if (typeof attrConfig === 'string' && !isAbsoluteUrl(value)) {\n el.attribs[attr] = attrConfig + value\n }\n }\n }\n\n // Process custom attributes (not affected by tags filter)\n for (const [attr, url] of Object.entries(attributes)) {\n if (el.attribs[attr] && !isAbsoluteUrl(el.attribs[attr])) {\n el.attribs[attr] = url + el.attribs[attr]\n }\n }\n })\n\n // VML and MSO comment rewrites require operating on serialized HTML\n // (HTML comments are not represented as traversable DOM nodes)\n const serialized = serialize(dom)\n const rewritten = rewriteMsoComments(rewriteVMLs(serialized, baseUrl), baseUrl)\n\n // Only re-parse if the regex passes actually changed anything\n if (rewritten !== serialized) {\n return parse(rewritten)\n }\n\n return dom\n}\n\nfunction rewriteVMLs(html: string, url: string): string {\n html = html.replace(/<v:image[^>]+src=\"?([^\"\\s]+)\"/gi, (match, src) => {\n if (isAbsoluteUrl(src)) return match\n return match.replace(src, url + src)\n })\n\n html = html.replace(/<v:fill[^>]+src=\"?([^\"\\s]+)\"/gi, (match, src) => {\n if (isAbsoluteUrl(src)) return match\n return match.replace(src, url + src)\n })\n\n return html\n}\n\nfunction rewriteMsoComments(html: string, url: string): string {\n return html.replace(/<!--\\[if [^\\]]+\\]>[\\s\\S]*?<!\\[endif\\]-->/g, (msoBlock) => {\n let result = msoBlock\n\n for (const attr of sourceAttributes) {\n const attrRegex = new RegExp(`\\\\b${attr}=\"([^\"]+)\"`, 'gi')\n result = result.replace(attrRegex, (match, value) => {\n if (isAbsoluteUrl(value)) return match\n\n if (attr === 'srcset') {\n return `srcset=\"${processSrcset(value, url)}\"`\n }\n\n return `${attr}=\"${url}${value}\"`\n })\n }\n\n // Use PostCSS for style attribute url() rewriting inside MSO comments\n result = result.replace(/style=\"([^\"]+)\"/gi, (match, style) => {\n if (!style.includes('url(')) return match\n const processed = processInlineStyle(style, url)\n return `style=\"${processed}\"`\n })\n\n return result\n })\n}\n"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { ChildNode } from "domhandler";
2
+
3
+ //#region src/transformers/columnWidth.d.ts
4
+ /**
5
+ * Resolve `__MAIZZLE_COLW_{id}__` and `__MAIZZLE_OH_{id}__` placeholders.
6
+ *
7
+ * COLW (column width) — emitted by `<Column>` and `<Overlap>`. Walks up to
8
+ * the nearest ancestor marked `data-maizzle-cw` (Container, Section,
9
+ * Row, or another Column already resolved) and divides the source
10
+ * width by `data-maizzle-cw-count`. With `data-maizzle-cw-self`,
11
+ * reads from the element's own inlined max/width/min-width
12
+ * instead — used by `<Overlap>` with its own width class.
13
+ *
14
+ * OH (overlap height) — emitted by `<Overlap>`. Reads max-height, height,
15
+ * or min-height from the element's own inlined style.
16
+ *
17
+ * Resolution rules:
18
+ * - Style placeholders for `min-width`: replaced when resolvable, otherwise
19
+ * the entire `min-width` declaration is stripped.
20
+ * - Other style placeholders (Overlap td `width`, etc.): replaced when
21
+ * resolvable, otherwise replaced with the count-based fallback or `100%`.
22
+ * - Comment placeholders: same fallback chain.
23
+ *
24
+ * Resolved column widths are written back to `data-maizzle-cw` so nested
25
+ * rows cascade. All `data-maizzle-cw*` and `data-maizzle-oh-*` are
26
+ * stripped at the end of the second walk pass.
27
+ */
28
+ declare function columnWidth(dom: ChildNode[]): ChildNode[];
29
+ //#endregion
30
+ export { columnWidth };
31
+ //# sourceMappingURL=columnWidth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnWidth.d.ts","names":[],"sources":["../../src/transformers/columnWidth.ts"],"mappings":";;;;;AAwTA;;;;;;;;;;;;;;;;;;;;;;iBAAgB,WAAA,CAAY,GAAA,EAAK,SAAA,KAAc,SAAA"}