@maizzle/framework 6.0.0-rc.9 → 6.0.1

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 (624) hide show
  1. package/README.md +3 -3
  2. package/bin/maizzle.mjs +1 -1
  3. package/dist/build.d.ts +38 -0
  4. package/dist/build.d.ts.map +1 -0
  5. package/dist/build.js +234 -0
  6. package/dist/build.js.map +1 -0
  7. package/dist/components/Body.vue +32 -3
  8. package/dist/components/Button.vue +91 -62
  9. package/dist/components/CodeBlock.vue +6 -4
  10. package/dist/components/CodeInline.vue +77 -6
  11. package/dist/components/Column.vue +67 -31
  12. package/dist/components/Container.vue +73 -12
  13. package/dist/components/Font.vue +96 -0
  14. package/dist/components/Head.vue +1 -1
  15. package/dist/components/Heading.vue +1 -1
  16. package/dist/components/Hr.vue +33 -0
  17. package/dist/components/Html.vue +36 -3
  18. package/dist/components/Img.vue +332 -0
  19. package/dist/components/Layout.vue +73 -21
  20. package/dist/components/Link.vue +1 -1
  21. package/dist/components/Markdown.vue +51 -24
  22. package/dist/components/MarkdownLayout.vue +39 -0
  23. package/dist/components/NotPlaintext.vue +14 -0
  24. package/dist/components/Outlook.vue +38 -11
  25. package/dist/components/OutlookBg.vue +241 -0
  26. package/dist/components/Plaintext.vue +14 -0
  27. package/dist/components/Preheader.vue +35 -10
  28. package/dist/components/QrCode.vue +157 -0
  29. package/dist/components/Raw.vue +28 -0
  30. package/dist/components/Row.vue +115 -22
  31. package/dist/components/Section.vue +65 -26
  32. package/dist/components/Spacer.vue +35 -29
  33. package/dist/components/Tailwind.vue +45 -0
  34. package/dist/components/Text.vue +3 -3
  35. package/dist/components/Vml.vue +207 -94
  36. package/dist/components/utils.d.ts +53 -0
  37. package/dist/components/utils.d.ts.map +1 -0
  38. package/dist/components/utils.js +80 -0
  39. package/dist/components/utils.js.map +1 -0
  40. package/dist/components/utils.ts +102 -0
  41. package/dist/composables/defineConfig.d.ts +13 -0
  42. package/dist/composables/defineConfig.d.ts.map +1 -0
  43. package/dist/composables/{defineConfig.mjs → defineConfig.js} +7 -9
  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.js +6 -0
  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.ts +16 -0
  54. package/dist/composables/useConfig.d.ts.map +1 -0
  55. package/dist/composables/useConfig.js +19 -0
  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 +42 -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/useOutputPath.d.ts +17 -0
  78. package/dist/composables/useOutputPath.d.ts.map +1 -0
  79. package/dist/composables/useOutputPath.js +23 -0
  80. package/dist/composables/useOutputPath.js.map +1 -0
  81. package/dist/composables/{usePlaintext.d.mts → usePlaintext.d.ts} +3 -1
  82. package/dist/composables/usePlaintext.d.ts.map +1 -0
  83. package/dist/composables/{usePlaintext.mjs → usePlaintext.js} +4 -4
  84. package/dist/composables/usePlaintext.js.map +1 -0
  85. package/dist/composables/usePreheader.d.ts +25 -0
  86. package/dist/composables/usePreheader.d.ts.map +1 -0
  87. package/dist/composables/usePreheader.js +28 -0
  88. package/dist/composables/usePreheader.js.map +1 -0
  89. package/dist/composables/useTransformers.d.ts +34 -0
  90. package/dist/composables/useTransformers.d.ts.map +1 -0
  91. package/dist/composables/useTransformers.js +48 -0
  92. package/dist/composables/useTransformers.js.map +1 -0
  93. package/dist/composables/useUrlQuery.d.ts +19 -0
  94. package/dist/composables/useUrlQuery.d.ts.map +1 -0
  95. package/dist/composables/useUrlQuery.js +26 -0
  96. package/dist/composables/useUrlQuery.js.map +1 -0
  97. package/dist/config/{defaults.d.mts → defaults.d.ts} +2 -2
  98. package/dist/config/defaults.d.ts.map +1 -0
  99. package/dist/config/{defaults.mjs → defaults.js} +10 -6
  100. package/dist/config/defaults.js.map +1 -0
  101. package/dist/config/index.d.ts +33 -0
  102. package/dist/config/index.d.ts.map +1 -0
  103. package/dist/config/index.js +136 -0
  104. package/dist/config/index.js.map +1 -0
  105. package/dist/events/{index.d.mts → index.d.ts} +35 -12
  106. package/dist/events/index.d.ts.map +1 -0
  107. package/dist/events/{index.mjs → index.js} +31 -13
  108. package/dist/events/index.js.map +1 -0
  109. package/dist/index.d.ts +41 -0
  110. package/dist/index.js +40 -0
  111. package/dist/{plaintext.d.mts → plaintext.d.ts} +1 -1
  112. package/dist/plaintext.d.ts.map +1 -0
  113. package/dist/{plaintext.mjs → plaintext.js} +4 -5
  114. package/dist/plaintext.js.map +1 -0
  115. package/dist/{plugin.d.mts → plugin.d.ts} +2 -2
  116. package/dist/plugin.d.ts.map +1 -0
  117. package/dist/{plugin.mjs → plugin.js} +8 -9
  118. package/dist/plugin.js.map +1 -0
  119. package/dist/plugins/postcss/{mergeMediaQueries.d.mts → mergeMediaQueries.d.ts} +2 -2
  120. package/dist/plugins/postcss/mergeMediaQueries.d.ts.map +1 -0
  121. package/dist/plugins/postcss/{mergeMediaQueries.mjs → mergeMediaQueries.js} +2 -3
  122. package/dist/plugins/postcss/mergeMediaQueries.js.map +1 -0
  123. package/dist/plugins/postcss/{pruneVars.d.mts → pruneVars.d.ts} +1 -1
  124. package/dist/plugins/postcss/pruneVars.d.ts.map +1 -0
  125. package/dist/plugins/postcss/{pruneVars.mjs → pruneVars.js} +2 -2
  126. package/dist/plugins/postcss/pruneVars.js.map +1 -0
  127. package/dist/plugins/postcss/quoteFontFamilies.d.ts +13 -0
  128. package/dist/plugins/postcss/quoteFontFamilies.d.ts.map +1 -0
  129. package/dist/plugins/postcss/quoteFontFamilies.js +84 -0
  130. package/dist/plugins/postcss/quoteFontFamilies.js.map +1 -0
  131. package/dist/plugins/postcss/{removeDeclarations.d.mts → removeDeclarations.d.ts} +1 -1
  132. package/dist/plugins/postcss/removeDeclarations.d.ts.map +1 -0
  133. package/dist/plugins/postcss/{removeDeclarations.mjs → removeDeclarations.js} +2 -2
  134. package/dist/plugins/postcss/removeDeclarations.js.map +1 -0
  135. package/dist/plugins/postcss/resolveMaizzleImports.d.ts +16 -0
  136. package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -0
  137. package/dist/plugins/postcss/resolveMaizzleImports.js +39 -0
  138. package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -0
  139. package/dist/plugins/postcss/resolveProps.d.ts +8 -0
  140. package/dist/plugins/postcss/resolveProps.d.ts.map +1 -0
  141. package/dist/plugins/postcss/resolveProps.js +155 -0
  142. package/dist/plugins/postcss/resolveProps.js.map +1 -0
  143. package/dist/plugins/postcss/{tailwindCleanup.d.mts → tailwindCleanup.d.ts} +2 -2
  144. package/dist/plugins/postcss/tailwindCleanup.d.ts.map +1 -0
  145. package/dist/plugins/postcss/{tailwindCleanup.mjs → tailwindCleanup.js} +5 -3
  146. package/dist/plugins/postcss/tailwindCleanup.js.map +1 -0
  147. package/dist/prepare.d.ts +17 -0
  148. package/dist/prepare.d.ts.map +1 -0
  149. package/dist/prepare.js +44 -0
  150. package/dist/prepare.js.map +1 -0
  151. package/dist/render/active.d.ts +8 -0
  152. package/dist/render/active.d.ts.map +1 -0
  153. package/dist/render/active.js +12 -0
  154. package/dist/render/active.js.map +1 -0
  155. package/dist/render/buildTemplate.d.ts +49 -0
  156. package/dist/render/buildTemplate.d.ts.map +1 -0
  157. package/dist/render/buildTemplate.js +141 -0
  158. package/dist/render/buildTemplate.js.map +1 -0
  159. package/dist/render/{createRenderer.d.mts → createRenderer.d.ts} +14 -6
  160. package/dist/render/createRenderer.d.ts.map +1 -0
  161. package/dist/render/createRenderer.js +468 -0
  162. package/dist/render/createRenderer.js.map +1 -0
  163. package/dist/render/index.d.ts +18 -0
  164. package/dist/render/index.d.ts.map +1 -0
  165. package/dist/render/index.js +59 -0
  166. package/dist/render/index.js.map +1 -0
  167. package/dist/render/injectFonts.d.ts +15 -0
  168. package/dist/render/injectFonts.d.ts.map +1 -0
  169. package/dist/render/injectFonts.js +45 -0
  170. package/dist/render/injectFonts.js.map +1 -0
  171. package/dist/render/parallel/buildWorker.d.ts +31 -0
  172. package/dist/render/parallel/buildWorker.d.ts.map +1 -0
  173. package/dist/render/parallel/buildWorker.js +66 -0
  174. package/dist/render/parallel/buildWorker.js.map +1 -0
  175. package/dist/render/parallel/worker.mjs +28 -0
  176. package/dist/render/plugins/codeBlockExtract.d.ts +14 -0
  177. package/dist/render/plugins/codeBlockExtract.d.ts.map +1 -0
  178. package/dist/render/plugins/codeBlockExtract.js +38 -0
  179. package/dist/render/plugins/codeBlockExtract.js.map +1 -0
  180. package/dist/render/plugins/markdownExtract.d.ts +12 -0
  181. package/dist/render/plugins/markdownExtract.d.ts.map +1 -0
  182. package/dist/render/plugins/markdownExtract.js +49 -0
  183. package/dist/render/plugins/markdownExtract.js.map +1 -0
  184. package/dist/render/plugins/rawExtract.d.ts +14 -0
  185. package/dist/render/plugins/rawExtract.d.ts.map +1 -0
  186. package/dist/render/plugins/rawExtract.js +34 -0
  187. package/dist/render/plugins/rawExtract.js.map +1 -0
  188. package/dist/render/plugins/rowSourceLocation.d.ts +18 -0
  189. package/dist/render/plugins/rowSourceLocation.d.ts.map +1 -0
  190. package/dist/render/plugins/rowSourceLocation.js +45 -0
  191. package/dist/render/plugins/rowSourceLocation.js.map +1 -0
  192. package/dist/{serve.d.mts → serve.d.ts} +5 -3
  193. package/dist/serve.d.ts.map +1 -0
  194. package/dist/{serve.mjs → serve.js} +248 -119
  195. package/dist/serve.js.map +1 -0
  196. package/dist/server/compatibility.d.ts +59 -0
  197. package/dist/server/compatibility.d.ts.map +1 -0
  198. package/dist/server/compatibility.js +959 -0
  199. package/dist/server/compatibility.js.map +1 -0
  200. package/dist/server/{email.d.mts → email.d.ts} +2 -2
  201. package/dist/server/email.d.ts.map +1 -0
  202. package/dist/server/{email.mjs → email.js} +2 -3
  203. package/dist/server/email.js.map +1 -0
  204. package/dist/server/linter.d.ts +20 -0
  205. package/dist/server/linter.d.ts.map +1 -0
  206. package/dist/server/linter.js +345 -0
  207. package/dist/server/linter.js.map +1 -0
  208. package/dist/server/sfc-utils.d.ts +21 -0
  209. package/dist/server/sfc-utils.d.ts.map +1 -0
  210. package/dist/server/sfc-utils.js +198 -0
  211. package/dist/server/sfc-utils.js.map +1 -0
  212. package/dist/server/ui/.vite/deps/@lucide_vue.js +44967 -0
  213. package/dist/server/ui/.vite/deps/@lucide_vue.js.map +1 -0
  214. package/dist/server/ui/.vite/deps/@vueuse_core.js +8155 -0
  215. package/dist/server/ui/.vite/deps/@vueuse_core.js.map +1 -0
  216. package/dist/server/ui/.vite/deps/@vueuse_shared.js +1859 -0
  217. package/dist/server/ui/.vite/deps/@vueuse_shared.js.map +1 -0
  218. package/dist/server/ui/.vite/deps/_metadata.json +78 -0
  219. package/dist/server/ui/.vite/deps/chunk-EAsCxrDo.js +14 -0
  220. package/dist/server/ui/.vite/deps/class-variance-authority.js +57 -0
  221. package/dist/server/ui/.vite/deps/class-variance-authority.js.map +1 -0
  222. package/dist/server/ui/.vite/deps/clsx.js +18 -0
  223. package/dist/server/ui/.vite/deps/clsx.js.map +1 -0
  224. package/dist/server/ui/.vite/deps/culori.js +4312 -0
  225. package/dist/server/ui/.vite/deps/culori.js.map +1 -0
  226. package/dist/server/ui/.vite/deps/package.json +3 -0
  227. package/dist/server/ui/.vite/deps/reka-ui.js +44464 -0
  228. package/dist/server/ui/.vite/deps/reka-ui.js.map +1 -0
  229. package/dist/server/ui/.vite/deps/tailwind-merge.js +3458 -0
  230. package/dist/server/ui/.vite/deps/tailwind-merge.js.map +1 -0
  231. package/dist/server/ui/.vite/deps/vue-router.js +6383 -0
  232. package/dist/server/ui/.vite/deps/vue-router.js.map +1 -0
  233. package/dist/server/ui/.vite/deps/vue.js +2 -0
  234. package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-N1X0OxKs.js +8800 -0
  235. package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-N1X0OxKs.js.map +1 -0
  236. package/dist/server/ui/App.vue +106 -66
  237. package/dist/server/ui/components/SidebarClose.vue +12 -0
  238. package/dist/server/ui/components/ui/checkbox/Checkbox.vue +1 -1
  239. package/dist/server/ui/components/ui/command/Command.vue +5 -1
  240. package/dist/server/ui/components/ui/command/CommandInput.vue +2 -2
  241. package/dist/server/ui/components/ui/dialog/DialogContent.vue +1 -1
  242. package/dist/server/ui/components/ui/dialog/DialogScrollContent.vue +1 -1
  243. package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +1 -1
  244. package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -1
  245. package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -1
  246. package/dist/server/ui/components/ui/input/Input.vue +1 -1
  247. package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
  248. package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +2 -2
  249. package/dist/server/ui/components/ui/tags-input/TagsInputInput.vue +1 -1
  250. package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +1 -1
  251. package/dist/server/ui/lib/emulated-dark-mode.ts +146 -0
  252. package/dist/server/ui/main.css +25 -0
  253. package/dist/server/ui/pages/Home.vue +1 -1
  254. package/dist/server/ui/pages/Preview.vue +377 -186
  255. package/dist/server/ui/vite-env.d.ts +1 -0
  256. package/dist/tests/render/_helpers.d.ts +6 -0
  257. package/dist/tests/render/_helpers.d.ts.map +1 -0
  258. package/dist/tests/render/_helpers.js +16 -0
  259. package/dist/tests/render/_helpers.js.map +1 -0
  260. package/dist/transformers/addAttributes.d.ts +42 -0
  261. package/dist/transformers/addAttributes.d.ts.map +1 -0
  262. package/dist/transformers/{addAttributes.mjs → addAttributes.js} +40 -24
  263. package/dist/transformers/addAttributes.js.map +1 -0
  264. package/dist/transformers/attributeToStyle.d.ts +38 -0
  265. package/dist/transformers/attributeToStyle.d.ts.map +1 -0
  266. package/dist/transformers/attributeToStyle.js +94 -0
  267. package/dist/transformers/attributeToStyle.js.map +1 -0
  268. package/dist/transformers/base.d.ts +71 -0
  269. package/dist/transformers/base.d.ts.map +1 -0
  270. package/dist/transformers/{base.mjs → base.js} +65 -40
  271. package/dist/transformers/base.js.map +1 -0
  272. package/dist/transformers/columnWidth.d.ts +31 -0
  273. package/dist/transformers/columnWidth.d.ts.map +1 -0
  274. package/dist/transformers/columnWidth.js +527 -0
  275. package/dist/transformers/columnWidth.js.map +1 -0
  276. package/dist/transformers/entities.d.ts +37 -0
  277. package/dist/transformers/entities.d.ts.map +1 -0
  278. package/dist/transformers/entities.js +74 -0
  279. package/dist/transformers/entities.js.map +1 -0
  280. package/dist/transformers/filters/{defaults.d.mts → defaults.d.ts} +1 -1
  281. package/dist/transformers/filters/defaults.d.ts.map +1 -0
  282. package/dist/transformers/filters/{defaults.mjs → defaults.js} +2 -2
  283. package/dist/transformers/filters/defaults.js.map +1 -0
  284. package/dist/transformers/filters/index.d.ts +43 -0
  285. package/dist/transformers/filters/index.d.ts.map +1 -0
  286. package/dist/transformers/filters/index.js +89 -0
  287. package/dist/transformers/filters/index.js.map +1 -0
  288. package/dist/transformers/format.d.ts +22 -0
  289. package/dist/transformers/format.d.ts.map +1 -0
  290. package/dist/transformers/format.js +30 -0
  291. package/dist/transformers/format.js.map +1 -0
  292. package/dist/transformers/imgWidth.d.ts +20 -0
  293. package/dist/transformers/imgWidth.d.ts.map +1 -0
  294. package/dist/transformers/imgWidth.js +76 -0
  295. package/dist/transformers/imgWidth.js.map +1 -0
  296. package/dist/transformers/{index.d.mts → index.d.ts} +4 -3
  297. package/dist/transformers/index.d.ts.map +1 -0
  298. package/dist/transformers/index.js +163 -0
  299. package/dist/transformers/index.js.map +1 -0
  300. package/dist/transformers/inlineCss.d.ts +85 -0
  301. package/dist/transformers/inlineCss.d.ts.map +1 -0
  302. package/dist/transformers/inlineCss.js +112 -0
  303. package/dist/transformers/inlineCss.js.map +1 -0
  304. package/dist/transformers/inlineLink.d.ts +35 -0
  305. package/dist/transformers/inlineLink.d.ts.map +1 -0
  306. package/dist/transformers/{inlineLink.mjs → inlineLink.js} +35 -11
  307. package/dist/transformers/inlineLink.js.map +1 -0
  308. package/dist/transformers/minify.d.ts +21 -0
  309. package/dist/transformers/minify.d.ts.map +1 -0
  310. package/dist/transformers/minify.js +25 -0
  311. package/dist/transformers/minify.js.map +1 -0
  312. package/dist/transformers/minifyCodeInline.d.ts +29 -0
  313. package/dist/transformers/minifyCodeInline.d.ts.map +1 -0
  314. package/dist/transformers/minifyCodeInline.js +36 -0
  315. package/dist/transformers/minifyCodeInline.js.map +1 -0
  316. package/dist/transformers/msoPlaceholders.d.ts +33 -0
  317. package/dist/transformers/msoPlaceholders.d.ts.map +1 -0
  318. package/dist/transformers/msoPlaceholders.js +114 -0
  319. package/dist/transformers/msoPlaceholders.js.map +1 -0
  320. package/dist/transformers/purgeCss.d.ts +43 -0
  321. package/dist/transformers/purgeCss.d.ts.map +1 -0
  322. package/dist/transformers/purgeCss.js +207 -0
  323. package/dist/transformers/purgeCss.js.map +1 -0
  324. package/dist/transformers/removeAttributes.d.ts +54 -0
  325. package/dist/transformers/removeAttributes.d.ts.map +1 -0
  326. package/dist/transformers/removeAttributes.js +72 -0
  327. package/dist/transformers/removeAttributes.js.map +1 -0
  328. package/dist/transformers/{replaceStrings.d.mts → replaceStrings.d.ts} +2 -2
  329. package/dist/transformers/replaceStrings.d.ts.map +1 -0
  330. package/dist/transformers/{replaceStrings.mjs → replaceStrings.js} +2 -2
  331. package/dist/transformers/replaceStrings.js.map +1 -0
  332. package/dist/transformers/safeSelectors.d.ts +37 -0
  333. package/dist/transformers/safeSelectors.d.ts.map +1 -0
  334. package/dist/transformers/{safeClassNames.mjs → safeSelectors.js} +40 -10
  335. package/dist/transformers/safeSelectors.js.map +1 -0
  336. package/dist/transformers/shorthandCss.d.ts +47 -0
  337. package/dist/transformers/shorthandCss.d.ts.map +1 -0
  338. package/dist/transformers/shorthandCss.js +92 -0
  339. package/dist/transformers/shorthandCss.js.map +1 -0
  340. package/dist/transformers/sixHex.d.ts +25 -0
  341. package/dist/transformers/sixHex.d.ts.map +1 -0
  342. package/dist/transformers/sixHex.js +42 -0
  343. package/dist/transformers/sixHex.js.map +1 -0
  344. package/dist/transformers/tailwindComponent.d.ts +16 -0
  345. package/dist/transformers/tailwindComponent.d.ts.map +1 -0
  346. package/dist/transformers/tailwindComponent.js +101 -0
  347. package/dist/transformers/tailwindComponent.js.map +1 -0
  348. package/dist/transformers/{tailwindcss.d.mts → tailwindcss.d.ts} +2 -2
  349. package/dist/transformers/tailwindcss.d.ts.map +1 -0
  350. package/dist/transformers/{tailwindcss.mjs → tailwindcss.js} +33 -74
  351. package/dist/transformers/tailwindcss.js.map +1 -0
  352. package/dist/transformers/urlQuery.d.ts +36 -0
  353. package/dist/transformers/urlQuery.d.ts.map +1 -0
  354. package/dist/transformers/urlQuery.js +77 -0
  355. package/dist/transformers/urlQuery.js.map +1 -0
  356. package/dist/types/{config.d.mts → config.d.ts} +231 -46
  357. package/dist/types/config.d.ts.map +1 -0
  358. package/dist/types/config.js +1 -0
  359. package/dist/types/index.d.ts +2 -0
  360. package/dist/types/index.js +1 -0
  361. package/dist/utils/ast/index.d.ts +4 -0
  362. package/dist/utils/ast/index.js +4 -0
  363. package/dist/utils/ast/{parser.d.mts → parser.d.ts} +1 -1
  364. package/dist/utils/ast/parser.d.ts.map +1 -0
  365. package/dist/utils/ast/{parser.mjs → parser.js} +2 -3
  366. package/dist/utils/ast/parser.js.map +1 -0
  367. package/dist/utils/ast/{serializer.d.mts → serializer.d.ts} +1 -1
  368. package/dist/utils/ast/serializer.d.ts.map +1 -0
  369. package/dist/utils/ast/serializer.js +46 -0
  370. package/dist/utils/ast/serializer.js.map +1 -0
  371. package/dist/utils/ast/{walker.d.mts → walker.d.ts} +1 -1
  372. package/dist/utils/ast/walker.d.ts.map +1 -0
  373. package/dist/utils/ast/{walker.mjs → walker.js} +2 -2
  374. package/dist/utils/ast/walker.js.map +1 -0
  375. package/dist/utils/cloneConfig.d.ts +13 -0
  376. package/dist/utils/cloneConfig.d.ts.map +1 -0
  377. package/dist/utils/cloneConfig.js +21 -0
  378. package/dist/utils/cloneConfig.js.map +1 -0
  379. package/dist/utils/compileTailwindCss.d.ts +16 -0
  380. package/dist/utils/compileTailwindCss.d.ts.map +1 -0
  381. package/dist/utils/compileTailwindCss.js +55 -0
  382. package/dist/utils/compileTailwindCss.js.map +1 -0
  383. package/dist/utils/componentSources.d.ts +50 -0
  384. package/dist/utils/componentSources.d.ts.map +1 -0
  385. package/dist/utils/componentSources.js +50 -0
  386. package/dist/utils/componentSources.js.map +1 -0
  387. package/dist/utils/cssBox.d.ts +42 -0
  388. package/dist/utils/cssBox.d.ts.map +1 -0
  389. package/dist/utils/cssBox.js +151 -0
  390. package/dist/utils/cssBox.js.map +1 -0
  391. package/dist/utils/decodeStyleEntities.d.ts +15 -0
  392. package/dist/utils/decodeStyleEntities.d.ts.map +1 -0
  393. package/dist/utils/decodeStyleEntities.js +18 -0
  394. package/dist/utils/decodeStyleEntities.js.map +1 -0
  395. package/dist/utils/{detect.d.mts → detect.d.ts} +1 -1
  396. package/dist/utils/detect.d.ts.map +1 -0
  397. package/dist/utils/{detect.mjs → detect.js} +2 -3
  398. package/dist/utils/detect.js.map +1 -0
  399. package/dist/utils/output-markers.d.ts +29 -0
  400. package/dist/utils/output-markers.d.ts.map +1 -0
  401. package/dist/utils/output-markers.js +68 -0
  402. package/dist/utils/output-markers.js.map +1 -0
  403. package/dist/utils/{url.d.mts → url.d.ts} +1 -1
  404. package/dist/utils/url.d.ts.map +1 -0
  405. package/dist/utils/{url.mjs → url.js} +2 -3
  406. package/dist/utils/url.js.map +1 -0
  407. package/dist/utils/watchPaths.d.ts +11 -0
  408. package/dist/utils/watchPaths.d.ts.map +1 -0
  409. package/dist/utils/watchPaths.js +19 -0
  410. package/dist/utils/watchPaths.js.map +1 -0
  411. package/node_modules/@clack/core/CHANGELOG.md +44 -0
  412. package/node_modules/@clack/core/dist/index.d.mts +125 -5
  413. package/node_modules/@clack/core/dist/index.mjs +972 -11
  414. package/node_modules/@clack/core/package.json +6 -2
  415. package/node_modules/@clack/prompts/CHANGELOG.md +70 -0
  416. package/node_modules/@clack/prompts/README.md +129 -3
  417. package/node_modules/@clack/prompts/dist/index.d.mts +567 -33
  418. package/node_modules/@clack/prompts/dist/index.mjs +1378 -133
  419. package/node_modules/@clack/prompts/package.json +7 -4
  420. package/node_modules/fast-string-truncated-width/dist/index.js +36 -96
  421. package/node_modules/fast-string-truncated-width/dist/types.d.ts +0 -3
  422. package/node_modules/fast-string-truncated-width/dist/utils.d.ts +3 -3
  423. package/node_modules/fast-string-truncated-width/dist/utils.js +14 -9
  424. package/node_modules/fast-string-truncated-width/package.json +1 -1
  425. package/node_modules/fast-string-truncated-width/readme.md +2 -3
  426. package/node_modules/fast-string-width/package.json +2 -2
  427. package/node_modules/fast-string-width/readme.md +0 -3
  428. package/node_modules/fast-wrap-ansi/lib/main.js +4 -2
  429. package/node_modules/fast-wrap-ansi/package.json +11 -11
  430. package/node_modules/maizzle/README.md +24 -0
  431. package/node_modules/maizzle/dist/commands/make/component.mjs +1 -1
  432. package/node_modules/maizzle/dist/commands/make/config.mjs +8 -7
  433. package/node_modules/maizzle/dist/commands/make/layout.mjs +3 -3
  434. package/node_modules/maizzle/dist/commands/make/scaffold.mjs +1 -1
  435. package/node_modules/maizzle/dist/commands/make/stubs/Layout.vue +146 -0
  436. package/node_modules/maizzle/dist/commands/make/stubs/component.vue +2 -4
  437. package/node_modules/maizzle/dist/commands/make/stubs/config.ts +1 -5
  438. package/node_modules/maizzle/dist/commands/make/template.mjs +1 -1
  439. package/node_modules/maizzle/dist/commands/new.mjs +46 -135
  440. package/node_modules/maizzle/dist/index.d.mts +1 -0
  441. package/node_modules/maizzle/dist/index.mjs +30 -7
  442. package/node_modules/maizzle/package.json +5 -4
  443. package/node_modules/nypm/dist/cli.mjs +28 -5
  444. package/node_modules/nypm/dist/index.d.mts +0 -8
  445. package/node_modules/nypm/dist/index.mjs +27 -4
  446. package/node_modules/nypm/package.json +12 -12
  447. package/node_modules/tinyexec/README.md +9 -1
  448. package/node_modules/tinyexec/dist/main.d.mts +22 -7
  449. package/node_modules/tinyexec/dist/main.mjs +189 -491
  450. package/node_modules/tinyexec/package.json +14 -16
  451. package/package.json +38 -31
  452. package/dist/_virtual/_rolldown/runtime.mjs +0 -32
  453. package/dist/build.d.mts +0 -19
  454. package/dist/build.d.mts.map +0 -1
  455. package/dist/build.mjs +0 -141
  456. package/dist/build.mjs.map +0 -1
  457. package/dist/components/Divider.vue +0 -133
  458. package/dist/components/Image.vue +0 -70
  459. package/dist/components/Overlap.vue +0 -80
  460. package/dist/components/utils.d.mts +0 -5
  461. package/dist/components/utils.d.mts.map +0 -1
  462. package/dist/components/utils.mjs +0 -9
  463. package/dist/components/utils.mjs.map +0 -1
  464. package/dist/composables/defineConfig.d.mts +0 -14
  465. package/dist/composables/defineConfig.d.mts.map +0 -1
  466. package/dist/composables/defineConfig.mjs.map +0 -1
  467. package/dist/composables/renderContext.d.mts +0 -24
  468. package/dist/composables/renderContext.d.mts.map +0 -1
  469. package/dist/composables/renderContext.mjs +0 -6
  470. package/dist/composables/renderContext.mjs.map +0 -1
  471. package/dist/composables/useConfig.d.mts +0 -9
  472. package/dist/composables/useConfig.d.mts.map +0 -1
  473. package/dist/composables/useConfig.mjs +0 -13
  474. package/dist/composables/useConfig.mjs.map +0 -1
  475. package/dist/composables/useDoctype.d.mts.map +0 -1
  476. package/dist/composables/useDoctype.mjs.map +0 -1
  477. package/dist/composables/useEvent.d.mts.map +0 -1
  478. package/dist/composables/useEvent.mjs.map +0 -1
  479. package/dist/composables/usePlaintext.d.mts.map +0 -1
  480. package/dist/composables/usePlaintext.mjs.map +0 -1
  481. package/dist/composables/usePreviewText.d.mts +0 -24
  482. package/dist/composables/usePreviewText.d.mts.map +0 -1
  483. package/dist/composables/usePreviewText.mjs +0 -29
  484. package/dist/composables/usePreviewText.mjs.map +0 -1
  485. package/dist/config/defaults.d.mts.map +0 -1
  486. package/dist/config/defaults.mjs.map +0 -1
  487. package/dist/config/index.d.mts +0 -15
  488. package/dist/config/index.d.mts.map +0 -1
  489. package/dist/config/index.mjs +0 -71
  490. package/dist/config/index.mjs.map +0 -1
  491. package/dist/events/index.d.mts.map +0 -1
  492. package/dist/events/index.mjs.map +0 -1
  493. package/dist/index.d.mts +0 -31
  494. package/dist/index.mjs +0 -31
  495. package/dist/node_modules/picomatch/index.mjs +0 -13
  496. package/dist/node_modules/picomatch/index.mjs.map +0 -1
  497. package/dist/node_modules/picomatch/lib/constants.mjs +0 -174
  498. package/dist/node_modules/picomatch/lib/constants.mjs.map +0 -1
  499. package/dist/node_modules/picomatch/lib/parse.mjs +0 -1067
  500. package/dist/node_modules/picomatch/lib/parse.mjs.map +0 -1
  501. package/dist/node_modules/picomatch/lib/picomatch.mjs +0 -304
  502. package/dist/node_modules/picomatch/lib/picomatch.mjs.map +0 -1
  503. package/dist/node_modules/picomatch/lib/scan.mjs +0 -296
  504. package/dist/node_modules/picomatch/lib/scan.mjs.map +0 -1
  505. package/dist/node_modules/picomatch/lib/utils.mjs +0 -53
  506. package/dist/node_modules/picomatch/lib/utils.mjs.map +0 -1
  507. package/dist/plaintext.d.mts.map +0 -1
  508. package/dist/plaintext.mjs.map +0 -1
  509. package/dist/plugin.d.mts.map +0 -1
  510. package/dist/plugin.mjs.map +0 -1
  511. package/dist/plugins/postcss/mergeMediaQueries.d.mts.map +0 -1
  512. package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
  513. package/dist/plugins/postcss/pruneVars.d.mts.map +0 -1
  514. package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
  515. package/dist/plugins/postcss/removeDeclarations.d.mts.map +0 -1
  516. package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
  517. package/dist/plugins/postcss/tailwindCleanup.d.mts.map +0 -1
  518. package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
  519. package/dist/render/createRenderer.d.mts.map +0 -1
  520. package/dist/render/createRenderer.mjs +0 -286
  521. package/dist/render/createRenderer.mjs.map +0 -1
  522. package/dist/render/index.d.mts +0 -26
  523. package/dist/render/index.d.mts.map +0 -1
  524. package/dist/render/index.mjs +0 -46
  525. package/dist/render/index.mjs.map +0 -1
  526. package/dist/serve.d.mts.map +0 -1
  527. package/dist/serve.mjs.map +0 -1
  528. package/dist/server/compatibility.d.mts +0 -5
  529. package/dist/server/compatibility.d.mts.map +0 -1
  530. package/dist/server/compatibility.mjs +0 -97
  531. package/dist/server/compatibility.mjs.map +0 -1
  532. package/dist/server/email.d.mts.map +0 -1
  533. package/dist/server/email.mjs.map +0 -1
  534. package/dist/server/linter.d.mts +0 -5
  535. package/dist/server/linter.d.mts.map +0 -1
  536. package/dist/server/linter.mjs +0 -189
  537. package/dist/server/linter.mjs.map +0 -1
  538. package/dist/transformers/addAttributes.d.mts +0 -32
  539. package/dist/transformers/addAttributes.d.mts.map +0 -1
  540. package/dist/transformers/addAttributes.mjs.map +0 -1
  541. package/dist/transformers/attributeToStyle.d.mts +0 -25
  542. package/dist/transformers/attributeToStyle.d.mts.map +0 -1
  543. package/dist/transformers/attributeToStyle.mjs +0 -80
  544. package/dist/transformers/attributeToStyle.mjs.map +0 -1
  545. package/dist/transformers/base.d.mts +0 -8
  546. package/dist/transformers/base.d.mts.map +0 -1
  547. package/dist/transformers/base.mjs.map +0 -1
  548. package/dist/transformers/entities.d.mts +0 -8
  549. package/dist/transformers/entities.d.mts.map +0 -1
  550. package/dist/transformers/entities.mjs +0 -41
  551. package/dist/transformers/entities.mjs.map +0 -1
  552. package/dist/transformers/filters/defaults.d.mts.map +0 -1
  553. package/dist/transformers/filters/defaults.mjs.map +0 -1
  554. package/dist/transformers/filters/index.d.mts +0 -22
  555. package/dist/transformers/filters/index.d.mts.map +0 -1
  556. package/dist/transformers/filters/index.mjs +0 -67
  557. package/dist/transformers/filters/index.mjs.map +0 -1
  558. package/dist/transformers/format.d.mts +0 -15
  559. package/dist/transformers/format.d.mts.map +0 -1
  560. package/dist/transformers/format.mjs +0 -26
  561. package/dist/transformers/format.mjs.map +0 -1
  562. package/dist/transformers/index.d.mts.map +0 -1
  563. package/dist/transformers/index.mjs +0 -81
  564. package/dist/transformers/index.mjs.map +0 -1
  565. package/dist/transformers/inlineCSS.d.mts +0 -17
  566. package/dist/transformers/inlineCSS.d.mts.map +0 -1
  567. package/dist/transformers/inlineCSS.mjs +0 -70
  568. package/dist/transformers/inlineCSS.mjs.map +0 -1
  569. package/dist/transformers/inlineLink.d.mts +0 -14
  570. package/dist/transformers/inlineLink.d.mts.map +0 -1
  571. package/dist/transformers/inlineLink.mjs.map +0 -1
  572. package/dist/transformers/minify.d.mts +0 -17
  573. package/dist/transformers/minify.d.mts.map +0 -1
  574. package/dist/transformers/minify.mjs +0 -24
  575. package/dist/transformers/minify.mjs.map +0 -1
  576. package/dist/transformers/purgeCSS.d.mts +0 -23
  577. package/dist/transformers/purgeCSS.d.mts.map +0 -1
  578. package/dist/transformers/purgeCSS.mjs +0 -132
  579. package/dist/transformers/purgeCSS.mjs.map +0 -1
  580. package/dist/transformers/removeAttributes.d.mts +0 -31
  581. package/dist/transformers/removeAttributes.d.mts.map +0 -1
  582. package/dist/transformers/removeAttributes.mjs +0 -63
  583. package/dist/transformers/removeAttributes.mjs.map +0 -1
  584. package/dist/transformers/replaceStrings.d.mts.map +0 -1
  585. package/dist/transformers/replaceStrings.mjs.map +0 -1
  586. package/dist/transformers/safeClassNames.d.mts +0 -22
  587. package/dist/transformers/safeClassNames.d.mts.map +0 -1
  588. package/dist/transformers/safeClassNames.mjs.map +0 -1
  589. package/dist/transformers/shorthandCSS.d.mts +0 -24
  590. package/dist/transformers/shorthandCSS.d.mts.map +0 -1
  591. package/dist/transformers/shorthandCSS.mjs +0 -48
  592. package/dist/transformers/shorthandCSS.mjs.map +0 -1
  593. package/dist/transformers/sixHex.d.mts +0 -16
  594. package/dist/transformers/sixHex.d.mts.map +0 -1
  595. package/dist/transformers/sixHex.mjs +0 -30
  596. package/dist/transformers/sixHex.mjs.map +0 -1
  597. package/dist/transformers/tailwindcss.d.mts.map +0 -1
  598. package/dist/transformers/tailwindcss.mjs.map +0 -1
  599. package/dist/transformers/urlQuery.d.mts +0 -24
  600. package/dist/transformers/urlQuery.d.mts.map +0 -1
  601. package/dist/transformers/urlQuery.mjs +0 -65
  602. package/dist/transformers/urlQuery.mjs.map +0 -1
  603. package/dist/types/config.d.mts.map +0 -1
  604. package/dist/types/config.mjs +0 -1
  605. package/dist/types/index.d.mts +0 -2
  606. package/dist/types/index.mjs +0 -1
  607. package/dist/utils/ast/index.d.mts +0 -4
  608. package/dist/utils/ast/index.mjs +0 -5
  609. package/dist/utils/ast/parser.d.mts.map +0 -1
  610. package/dist/utils/ast/parser.mjs.map +0 -1
  611. package/dist/utils/ast/serializer.d.mts.map +0 -1
  612. package/dist/utils/ast/serializer.mjs +0 -37
  613. package/dist/utils/ast/serializer.mjs.map +0 -1
  614. package/dist/utils/ast/walker.d.mts.map +0 -1
  615. package/dist/utils/ast/walker.mjs.map +0 -1
  616. package/dist/utils/detect.d.mts.map +0 -1
  617. package/dist/utils/detect.mjs.map +0 -1
  618. package/dist/utils/url.d.mts.map +0 -1
  619. package/dist/utils/url.mjs.map +0 -1
  620. package/node_modules/@clack/core/dist/index.mjs.map +0 -1
  621. package/node_modules/@clack/prompts/dist/index.mjs.map +0 -1
  622. package/node_modules/fast-wrap-ansi/lib/main.js.map +0 -1
  623. package/node_modules/maizzle/dist/commands/make/stubs/layout.vue +0 -39
  624. package/node_modules/tinyexec/dist/LICENSES.txt +0 -83
@@ -1,5 +1,7 @@
1
1
  <script lang="ts">
2
- import { createStaticVNode } from 'vue'
2
+ import { createStaticVNode, type PropType } from 'vue'
3
+ import { twMerge } from 'tailwind-merge'
4
+ import { codeToHtml, getSingletonHighlighter, type BundledLanguage, type BundledTheme } from 'shiki'
3
5
 
4
6
  export default {
5
7
  inheritAttrs: false,
@@ -13,9 +15,27 @@ export default {
13
15
  code: {
14
16
  type: String,
15
17
  default: ''
18
+ },
19
+ /**
20
+ * Language for syntax highlighting. Only consulted when `theme` is set.
21
+ * @default 'html'
22
+ */
23
+ language: {
24
+ type: String as PropType<BundledLanguage>,
25
+ default: 'html'
26
+ },
27
+ /**
28
+ * Shiki theme to apply. When set, the inline code is syntax-highlighted
29
+ * with this theme and the cell uses the theme's background color.
30
+ * When unset, falls back to the plain gray-styled `<code>` (no Shiki
31
+ * pass, faster, and visually quieter in body copy).
32
+ */
33
+ theme: {
34
+ type: String as PropType<BundledTheme | undefined>,
35
+ default: undefined
16
36
  }
17
37
  },
18
- setup(props, { slots, attrs }) {
38
+ async setup(props, { slots, attrs }) {
19
39
  let source = props.code
20
40
 
21
41
  if (!source) {
@@ -31,9 +51,60 @@ export default {
31
51
  return () => createStaticVNode('', 0)
32
52
  }
33
53
 
34
- const classes = attrs.class ? ` class="${attrs.class}"` : ''
35
- const baseStyles = 'white-space:normal;border-radius:6px;border:1px solid #d1d5db;background-color:#f3f4f6;padding:2px 6px;font-size:11px;color:inherit'
36
- const styles = [baseStyles, attrs.style].filter(Boolean).join(';')
54
+ if (props.theme) {
55
+ const highlighted = await codeToHtml(source, {
56
+ lang: props.language,
57
+ theme: props.theme,
58
+ })
59
+
60
+ const hl = await getSingletonHighlighter({ themes: [props.theme], langs: [] })
61
+ const bg = hl.getTheme(props.theme).bg
62
+
63
+ const codeContent = highlighted
64
+ .replace(/^<pre[^>]*><code>/, '')
65
+ .replace(/<\/code><\/pre>$/, '')
66
+
67
+ /**
68
+ * Replace shiki's structural `<`/`>` (the `<span>` tag delimiters)
69
+ * with private string markers `§MZLT§`/`§MZGT§`. Source-level
70
+ * entities like `&lt;` (representing a literal `<` in the user's
71
+ * code) are made of `&`, `l`, `t`, `;` — no real `<` character —
72
+ * so they pass through untouched.
73
+ *
74
+ * Why markers and not HTML entities? Both levels of escaping would
75
+ * end up as `&lt;` after a round-trip, and the decoder couldn't
76
+ * tell which to decode back to a real `<` (structural) vs leave
77
+ * as `&lt;` (content). Using non-entity markers makes the two
78
+ * levels distinguishable: only `§MZ*§` gets decoded.
79
+ *
80
+ * Two pipeline passes that would otherwise mangle the shiki HTML
81
+ * are defused by the markers:
82
+ * - `format` (oxfmt with `htmlWhitespaceSensitivity: 'ignore'`)
83
+ * sees the `<code>` body as plain text and won't reflow the
84
+ * chain of `<span>` tokens onto separate lines.
85
+ * - The HTML5 self-close strip (`( \/>)` regex at the end of
86
+ * the pipeline) won't match anything inside a shiki cell,
87
+ * so a highlighted Vue self-closing tag like `<MyTag />`
88
+ * keeps its ` />` instead of being silently shortened to `>`.
89
+ *
90
+ * `minifyCodeInline` swaps the markers back to real angle brackets
91
+ * at the very end of the pipeline, after both passes have run.
92
+ */
93
+ const escaped = codeContent
94
+ .replace(/</g, '§MZLT§')
95
+ .replace(/>/g, '§MZGT§')
96
+
97
+ const base = `bg-[${bg}] rounded-md py-0.5 px-1.5 text-[11px]`
98
+ const merged = twMerge(base, (attrs.class as string) ?? '')
99
+ const styleAttr = attrs.style ? ` style="${attrs.style}"` : ''
100
+
101
+ const html = `<code class="${merged}"${styleAttr} data-minify-inline>${escaped}</code>`
102
+ return () => createStaticVNode(html, 1)
103
+ }
104
+
105
+ const base = 'whitespace-normal rounded-md [border:1px_solid_#d1d5db] bg-gray-100 py-0.5 px-1.5 text-[11px] text-inherit'
106
+ const merged = twMerge(base, (attrs.class as string) ?? '')
107
+ const styleAttr = attrs.style ? ` style="${attrs.style}"` : ''
37
108
 
38
109
  const escaped = source
39
110
  .replace(/&/g, '&amp;')
@@ -41,7 +112,7 @@ export default {
41
112
  .replace(/>/g, '&gt;')
42
113
  .replace(/"/g, '&quot;')
43
114
 
44
- const html = `<code${classes} style="${styles}">${escaped}</code>`
115
+ const html = `<code class="${merged}"${styleAttr}>${escaped}</code>`
45
116
 
46
117
  return () => createStaticVNode(html, 1)
47
118
  }
@@ -1,7 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { computed, createStaticVNode, inject, provide, useAttrs } from 'vue'
2
+ import { computed, createStaticVNode, inject, useAttrs } from 'vue'
3
3
  import type { ComputedRef } from 'vue'
4
- import { normalizeToPixels } from './utils.ts'
4
+ import { twMerge } from 'tailwind-merge'
5
+ import { nextId, normalizeToPixels, outlookFallbackProp } from './utils.ts'
6
+ import { useOutlookFallback } from '../composables/useOutlookFallback'
5
7
 
6
8
  defineOptions({ inheritAttrs: false })
7
9
 
@@ -11,8 +13,9 @@ const props = defineProps({
11
13
  /**
12
14
  * Override the auto-computed column width.
13
15
  *
14
- * By default, the width is calculated from the parent `Row`
15
- * by dividing its width by the column count.
16
+ * By default, the width is calculated from the nearest sized
17
+ * ancestor (`Container`, `Section`, `Row`, or outer `Column`)
18
+ * divided by the column count detected on the parent `Row`.
16
19
  */
17
20
  width: {
18
21
  type: [String, Number],
@@ -28,46 +31,73 @@ const props = defineProps({
28
31
  msoStyle: {
29
32
  type: String,
30
33
  default: undefined
31
- }
34
+ },
35
+ /**
36
+ * Toggle Outlook (MSO) and VML fallback markup for this
37
+ * component and all descendants.
38
+ *
39
+ * When `false`, skips MSO ghost tables, VML shapes,
40
+ * `xmlns:v`/`xmlns:o` attributes, and mso-specific CSS
41
+ * in all built-in components.
42
+ *
43
+ * @default true
44
+ */
45
+ outlookFallback: outlookFallbackProp,
32
46
  })
33
47
 
34
- const injectedMinWidth = inject<ComputedRef<string> | null>('columnMinWidth', null)
35
- const containerWidth = inject<ComputedRef<string | number> | null>('containerWidth', null)
36
- const injectedMsoWidth = inject<ComputedRef<string> | null>('columnMsoWidth', null)
48
+ const outlookFallback = useOutlookFallback(props.outlookFallback)
37
49
 
38
- const minWidth = computed(() => {
39
- if (props.width) return normalizeToPixels(props.width)
40
- if (injectedMinWidth?.value) return injectedMinWidth.value
50
+ const columnCount = inject<ComputedRef<number> | null>('columnCount', null)
41
51
 
42
- // Fallback: divide container width by 2 if available
43
- if (containerWidth?.value) {
44
- const val = containerWidth.value
45
- if (typeof val === 'number') return `${parseFloat((val / 2).toFixed(2))}px`
46
- const num = Number.parseFloat(val)
47
- const unit = val.replace(String(num), '') || 'px'
48
- return `${parseFloat((num / 2).toFixed(2))}${unit}`
49
- }
52
+ const count = computed(() => columnCount?.value ?? 2)
50
53
 
51
- return '18.75em'
52
- })
54
+ const useMarker = props.width == null
55
+ const colId = useMarker ? nextId('co') : null
53
56
 
54
- const msoWidth = computed(() => injectedMsoWidth?.value ?? '50%')
57
+ const minWidth = computed(() => {
58
+ if (props.width != null) return normalizeToPixels(props.width)
59
+ return `__MAIZZLE_COLW_${colId}__`
60
+ })
55
61
 
56
- // Provide column width as containerWidth for nested Rows
57
- provide('containerWidth', minWidth)
62
+ const msoWidth = computed(() => {
63
+ if (props.width != null) return normalizeToPixels(props.width)
64
+ return `__MAIZZLE_COLW_${colId}__`
65
+ })
58
66
 
59
- const styles = computed(() => {
60
- return `display: inline-block; min-width: ${minWidth.value}; font-size: 16px; vertical-align: top;`
67
+ /**
68
+ * Baseline display/typography lives in classes not inline `:style` —
69
+ * so the user can override any of them via tailwind utilities. Inline
70
+ * `display: inline-block` would silently shadow a class like
71
+ * `inline-table` during CSS inlining; routing both through twMerge lets
72
+ * the user's utility cleanly replace ours instead of being dropped.
73
+ *
74
+ * When `width` is set as a prop the resolved pixel value also goes
75
+ * through the class list (`min-w-[Npx]`) so it dedupes against the
76
+ * user's `min-w-*` utility. The marker path (no prop) has to stay
77
+ * inline because the placeholder string is replaced post-render and
78
+ * Tailwind's content scanner can't compile a class whose value is
79
+ * still a marker.
80
+ */
81
+ const baseClass = 'inline-block text-[medium]'
82
+ const mergedClass = computed(() => {
83
+ const parts = [baseClass]
84
+ if (props.width != null) parts.push(`min-w-[${normalizeToPixels(props.width)}]`)
85
+ return twMerge(parts.join(' '), (attrs.class as string) ?? '')
61
86
  })
62
87
 
88
+ const styles = computed(() =>
89
+ props.width != null ? undefined : `min-width: ${minWidth.value};`
90
+ )
91
+
63
92
  const tdStyle = computed(() => {
64
- const parts = ['vertical-align: top']
93
+ const parts = [`width: ${msoWidth.value}`]
94
+ if (useMarker) parts.push(`__MAIZZLE_COLTDX_${colId}__`)
65
95
  if (props.msoStyle) parts.push(props.msoStyle)
66
96
  return parts.join('; ')
67
97
  })
68
98
 
69
99
  const MsoBefore = () => createStaticVNode(
70
- `<!--[if mso]><td width="${msoWidth.value}" style="${tdStyle.value}"><![endif]-->`,
100
+ `<!--[if mso]><td style="${tdStyle.value}"><![endif]-->`,
71
101
  1
72
102
  )
73
103
 
@@ -78,9 +108,15 @@ const MsoAfter = () => createStaticVNode(
78
108
  </script>
79
109
 
80
110
  <template>
81
- <MsoBefore />
82
- <div v-bind="attrs" :style="styles">
111
+ <MsoBefore v-if="outlookFallback" />
112
+ <div
113
+ v-bind="{ ...attrs, class: undefined }"
114
+ :class="mergedClass"
115
+ :style="styles"
116
+ :data-maizzle-cw-id="colId"
117
+ :data-maizzle-cw-count="useMarker ? count : null"
118
+ >
83
119
  <slot />
84
120
  </div>
85
- <MsoAfter />
121
+ <MsoAfter v-if="outlookFallback" />
86
122
  </template>
@@ -1,6 +1,8 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, provide, createStaticVNode, useAttrs } from 'vue'
3
- import { normalizeToPixels } from './utils.ts'
3
+ import { twMerge } from 'tailwind-merge'
4
+ import { hasWidthUtility, nextId, normalizeToPixels, outlookFallbackProp } from './utils.ts'
5
+ import { useOutlookFallback } from '../composables/useOutlookFallback'
4
6
 
5
7
  defineOptions({ inheritAttrs: false })
6
8
 
@@ -11,25 +13,77 @@ const props = defineProps({
11
13
  * Max width of the container.
12
14
  *
13
15
  * Applied as `max-width` on the div and as `width` on the MSO table.
14
- * Also provided to child `Row` and `Column` components for
15
- * automatic column width calculation.
16
+ * Also used as the width source for descendant `Row`/`Column`
17
+ * components when computing column widths.
16
18
  *
17
- * @default '37.5em'
19
+ * When not set, the div defaults to `max-w-150 mx-auto` (max
20
+ * 600px, centered, shrinks below) — overridable via Tailwind
21
+ * classes such as `w-[400px]` or `max-w-xl`. The MSO table
22
+ * width is auto-derived from the resolved width/max-width after
23
+ * CSS inlining, falling back to 600px when unresolvable.
18
24
  */
19
25
  width: {
20
26
  type: [String, Number],
21
- default: '37.5em'
22
- }
27
+ default: null
28
+ },
29
+ /**
30
+ * Inline CSS applied only to the MSO `<td>` element.
31
+ *
32
+ * Use for Outlook-specific styling that shouldn't affect other clients.
33
+ * Appended after any padding propagated from the outer div's
34
+ * inlined style, so msoStyle wins on duplicate properties.
35
+ *
36
+ * @example 'padding: 10px 20px'
37
+ */
38
+ msoStyle: {
39
+ type: String,
40
+ default: undefined
41
+ },
42
+ /**
43
+ * Toggle Outlook (MSO) and VML fallback markup for this
44
+ * component and all descendants.
45
+ *
46
+ * When `false`, skips MSO ghost tables, VML shapes,
47
+ * `xmlns:v`/`xmlns:o` attributes, and mso-specific CSS
48
+ * in all built-in components.
49
+ *
50
+ * @default true
51
+ */
52
+ outlookFallback: outlookFallbackProp,
23
53
  })
24
54
 
55
+ const outlookFallback = useOutlookFallback(props.outlookFallback)
56
+
25
57
  provide('containerWidth', computed(() => props.width))
26
58
 
27
- const styles = computed(() => {
28
- return `max-width: ${normalizeToPixels(props.width)}; margin: 0 auto;`
59
+ const useMarker = outlookFallback && props.width == null
60
+ const msoId = useMarker ? nextId('c') : null
61
+ const tdId = outlookFallback ? nextId('ct') : null
62
+
63
+ const mergedClass = computed(() => {
64
+ const userClass = (attrs.class as string) ?? ''
65
+ const parts: string[] = ['m-0', 'mx-auto']
66
+ if (props.width != null) {
67
+ parts.push(`max-w-[${normalizeToPixels(props.width)}]`)
68
+ } else if (!hasWidthUtility(userClass)) {
69
+ parts.push('max-w-150')
70
+ }
71
+ return twMerge(parts.join(' '), userClass)
72
+ })
73
+
74
+ const msoWidth = computed(() => {
75
+ if (props.width != null) return normalizeToPixels(props.width)
76
+ return `__MAIZZLE_MSOW_${msoId}__`
29
77
  })
30
78
 
79
+ const colWidthSource = computed(() =>
80
+ props.width != null ? normalizeToPixels(props.width) : ''
81
+ )
82
+
83
+ const tdMarker = tdId ? `__MAIZZLE_MSOTDSTYLE_${tdId}__` : ''
84
+
31
85
  const MsoBefore = () => createStaticVNode(
32
- `<!--[if mso]><table role="none" cellpadding="0" cellspacing="0" style="width: ${normalizeToPixels(props.width)}" align="center"><tr><td><![endif]-->`,
86
+ `<!--[if mso]><table role="none" cellpadding="0" cellspacing="0" style="width: ${msoWidth.value}" align="center"><tr><td${tdMarker}><![endif]-->`,
33
87
  1
34
88
  )
35
89
 
@@ -40,9 +94,16 @@ const MsoAfter = () => createStaticVNode(
40
94
  </script>
41
95
 
42
96
  <template>
43
- <MsoBefore />
44
- <div v-bind="attrs" :style="styles">
97
+ <MsoBefore v-if="outlookFallback" />
98
+ <div
99
+ v-bind="{ ...attrs, class: undefined }"
100
+ :class="mergedClass"
101
+ :data-maizzle-msow-id="msoId"
102
+ :data-maizzle-cw="colWidthSource"
103
+ :data-maizzle-mso-td-id="tdId"
104
+ :data-maizzle-mso-style="tdId && props.msoStyle ? props.msoStyle : null"
105
+ >
45
106
  <slot />
46
107
  </div>
47
- <MsoAfter />
108
+ <MsoAfter v-if="outlookFallback" />
48
109
  </template>
@@ -0,0 +1,96 @@
1
+ <script setup lang="ts">
2
+ import { type PropType } from 'vue'
3
+ import { useFont } from '../composables/useFont'
4
+
5
+ type PopularGoogleFont =
6
+ // Sans-serif
7
+ | 'Roboto' | 'Open Sans' | 'Inter' | 'Lato' | 'Montserrat'
8
+ // Serif
9
+ | 'Merriweather' | 'Playfair Display' | 'Lora' | 'PT Serif' | 'Noto Serif'
10
+ // Display
11
+ | 'Oswald' | 'Bebas Neue' | 'Anton' | 'Lobster' | 'Pacifico'
12
+ // Handwriting
13
+ | 'Dancing Script' | 'Caveat' | 'Shadows Into Light' | 'Satisfy' | 'Great Vibes'
14
+ // Monospace
15
+ | 'Roboto Mono' | 'Source Code Pro' | 'JetBrains Mono' | 'Fira Code' | 'Inconsolata'
16
+
17
+ const props = defineProps({
18
+ /**
19
+ * A single font family name, e.g. `"Roboto"` or `"Open Sans"`.
20
+ *
21
+ * For fallback fonts, use the `fallback` prop instead of a
22
+ * comma-separated list here. Popular Google Fonts are suggested
23
+ * in the IDE, but any string is accepted.
24
+ *
25
+ * @example "Open Sans"
26
+ */
27
+ family: {
28
+ type: String as PropType<PopularGoogleFont | (string & {})>,
29
+ required: true,
30
+ validator: (v: string) => v.trim().length > 0,
31
+ },
32
+ /**
33
+ * CSS fallback list appended to the `font-family` declaration.
34
+ *
35
+ * @example "Verdana, sans-serif"
36
+ */
37
+ fallback: {
38
+ type: String,
39
+ default: '',
40
+ },
41
+ /**
42
+ * Font provider used to build the stylesheet URL when `url` is omitted.
43
+ * Bunny Fonts is a drop-in, privacy-friendly Google Fonts mirror.
44
+ */
45
+ provider: {
46
+ type: String as PropType<'google' | 'bunny'>,
47
+ default: 'google',
48
+ validator: (v: string) => ['google', 'bunny'].includes(v),
49
+ },
50
+ /**
51
+ * Stylesheet URL. When provided, used as-is for the `<link href>`.
52
+ * When omitted, a Google Fonts URL is built from `family`, `weights`,
53
+ * `display` and `styles`.
54
+ */
55
+ url: {
56
+ type: String,
57
+ default: '',
58
+ },
59
+ /**
60
+ * Font weights to load. Ignored when `url` is provided.
61
+ */
62
+ weights: {
63
+ type: Array as () => number[],
64
+ default: () => [400],
65
+ },
66
+ /**
67
+ * `font-display` value. Ignored when `url` is provided.
68
+ */
69
+ display: {
70
+ type: String as PropType<'auto' | 'block' | 'swap' | 'fallback' | 'optional'>,
71
+ default: 'swap',
72
+ validator: (v: string) => ['auto', 'block', 'swap', 'fallback', 'optional'].includes(v),
73
+ },
74
+ /**
75
+ * Font styles to load. Ignored when `url` is provided.
76
+ *
77
+ * @example ['normal', 'italic']
78
+ */
79
+ styles: {
80
+ type: Array as () => Array<'normal' | 'italic'>,
81
+ default: () => ['normal'],
82
+ },
83
+ })
84
+
85
+ useFont({
86
+ family: props.family,
87
+ fallback: props.fallback || undefined,
88
+ provider: props.provider,
89
+ url: props.url || undefined,
90
+ weights: props.weights,
91
+ display: props.display,
92
+ styles: props.styles,
93
+ })
94
+ </script>
95
+
96
+ <template></template>
@@ -6,7 +6,7 @@ const props = defineProps({
6
6
  * Render an empty `<head>` before the main head element.
7
7
  *
8
8
  * This is a workaround for Yahoo! Mail on Android, which
9
- * strips styles from the first `<head>` element.
9
+ * strips the first `<head>` element it finds.
10
10
  *
11
11
  * @default false
12
12
  */
@@ -22,7 +22,7 @@ const mergedClass = computed(() => twMerge('m-0', attrs.class as string))
22
22
  </script>
23
23
 
24
24
  <template>
25
- <component :is="tag" v-bind="$attrs" :class="mergedClass">
25
+ <component :is="tag" v-bind="{ ...$attrs, class: mergedClass }">
26
26
  <slot />
27
27
  </component>
28
28
  </template>
@@ -0,0 +1,33 @@
1
+ <script setup lang="ts">
2
+ import { computed, useAttrs } from 'vue'
3
+ import { twMerge } from 'tailwind-merge'
4
+
5
+ defineOptions({ inheritAttrs: false })
6
+
7
+ const attrs = useAttrs()
8
+
9
+ const HEIGHT_RE = /(?:^|\s)h-([\w./\-[\]%]+)/g
10
+ const LEADING_RE = /(?:^|\s)leading-/
11
+
12
+ const mergedClass = computed(() => {
13
+ const userClass = (attrs.class as string) || ''
14
+ const heights = [...userClass.matchAll(HEIGHT_RE)]
15
+ const userHeight = heights.length ? heights[heights.length - 1][1] : null
16
+ const userHasLeading = LEADING_RE.test(userClass)
17
+
18
+ const defaults = ['my-6', 'bg-gray-300']
19
+ if (!userHeight) defaults.push('h-px')
20
+ if (!userHasLeading && !userHeight) defaults.push('leading-px')
21
+
22
+ const derived = userHeight && !userHasLeading ? `leading-${userHeight}` : ''
23
+ return twMerge(defaults.join(' '), userClass, derived)
24
+ })
25
+ </script>
26
+
27
+ <template>
28
+ <div
29
+ role="separator"
30
+ v-bind="{ ...$attrs, class: undefined }"
31
+ :class="mergedClass"
32
+ >&zwj;</div>
33
+ </template>
@@ -1,6 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { createStaticVNode, provide, useAttrs, useSlots } from 'vue'
2
+ import { createStaticVNode, inject, provide, useAttrs, useSlots } from 'vue'
3
3
  import type { PropType } from 'vue'
4
+ import { outlookFallbackProp } from './utils.ts'
5
+ import { useOutlookFallback } from '../composables/useOutlookFallback'
6
+ import { RenderContextKey } from '../composables/renderContext'
4
7
 
5
8
  defineOptions({ inheritAttrs: false })
6
9
 
@@ -65,9 +68,39 @@ const props = defineProps({
65
68
  xmlns: {
66
69
  type: [Boolean, String],
67
70
  default: true
68
- }
71
+ },
72
+ /**
73
+ * Toggle Outlook (MSO) and VML fallback markup for this
74
+ * component and all descendants.
75
+ *
76
+ * When `false`, skips MSO ghost tables, VML shapes,
77
+ * `xmlns:v`/`xmlns:o` attributes, and mso-specific CSS
78
+ * in all built-in components.
79
+ *
80
+ * @default true
81
+ */
82
+ outlookFallback: outlookFallbackProp,
83
+ /**
84
+ * DOCTYPE declaration prepended to the rendered HTML.
85
+ *
86
+ * Overrides `doctype` in the Maizzle config and any value
87
+ * set via `useDoctype()` in the same template.
88
+ *
89
+ * @default '<!DOCTYPE html>'
90
+ */
91
+ doctype: {
92
+ type: String,
93
+ default: undefined,
94
+ },
69
95
  })
70
96
 
97
+ const outlookFallback = useOutlookFallback(props.outlookFallback)
98
+
99
+ if (props.doctype !== undefined) {
100
+ const ctx = inject(RenderContextKey, undefined)
101
+ if (ctx) ctx.doctype = props.doctype
102
+ }
103
+
71
104
  provide('htmlLang', props.lang)
72
105
 
73
106
  const render = () => {
@@ -80,7 +113,7 @@ const render = () => {
80
113
  `dir="${props.dir}"`,
81
114
  ]
82
115
 
83
- if (props.xmlns !== false && props.xmlns !== 'false') {
116
+ if (outlookFallback && props.xmlns !== false && props.xmlns !== 'false') {
84
117
  parts.push(
85
118
  'xmlns:v="urn:schemas-microsoft-com:vml"',
86
119
  'xmlns:o="urn:schemas-microsoft-com:office:office"',