@maizzle/framework 6.0.0-rc.9 → 6.0.0

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 (623) 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 +71 -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 +24 -0
  102. package/dist/config/index.d.ts.map +1 -0
  103. package/dist/config/{index.mjs → index.js} +45 -14
  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} +201 -107
  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-DaqjATE_.js +8785 -0
  235. package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-DaqjATE_.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 +37 -30
  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.map +0 -1
  490. package/dist/events/index.d.mts.map +0 -1
  491. package/dist/events/index.mjs.map +0 -1
  492. package/dist/index.d.mts +0 -31
  493. package/dist/index.mjs +0 -31
  494. package/dist/node_modules/picomatch/index.mjs +0 -13
  495. package/dist/node_modules/picomatch/index.mjs.map +0 -1
  496. package/dist/node_modules/picomatch/lib/constants.mjs +0 -174
  497. package/dist/node_modules/picomatch/lib/constants.mjs.map +0 -1
  498. package/dist/node_modules/picomatch/lib/parse.mjs +0 -1067
  499. package/dist/node_modules/picomatch/lib/parse.mjs.map +0 -1
  500. package/dist/node_modules/picomatch/lib/picomatch.mjs +0 -304
  501. package/dist/node_modules/picomatch/lib/picomatch.mjs.map +0 -1
  502. package/dist/node_modules/picomatch/lib/scan.mjs +0 -296
  503. package/dist/node_modules/picomatch/lib/scan.mjs.map +0 -1
  504. package/dist/node_modules/picomatch/lib/utils.mjs +0 -53
  505. package/dist/node_modules/picomatch/lib/utils.mjs.map +0 -1
  506. package/dist/plaintext.d.mts.map +0 -1
  507. package/dist/plaintext.mjs.map +0 -1
  508. package/dist/plugin.d.mts.map +0 -1
  509. package/dist/plugin.mjs.map +0 -1
  510. package/dist/plugins/postcss/mergeMediaQueries.d.mts.map +0 -1
  511. package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
  512. package/dist/plugins/postcss/pruneVars.d.mts.map +0 -1
  513. package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
  514. package/dist/plugins/postcss/removeDeclarations.d.mts.map +0 -1
  515. package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
  516. package/dist/plugins/postcss/tailwindCleanup.d.mts.map +0 -1
  517. package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
  518. package/dist/render/createRenderer.d.mts.map +0 -1
  519. package/dist/render/createRenderer.mjs +0 -286
  520. package/dist/render/createRenderer.mjs.map +0 -1
  521. package/dist/render/index.d.mts +0 -26
  522. package/dist/render/index.d.mts.map +0 -1
  523. package/dist/render/index.mjs +0 -46
  524. package/dist/render/index.mjs.map +0 -1
  525. package/dist/serve.d.mts.map +0 -1
  526. package/dist/serve.mjs.map +0 -1
  527. package/dist/server/compatibility.d.mts +0 -5
  528. package/dist/server/compatibility.d.mts.map +0 -1
  529. package/dist/server/compatibility.mjs +0 -97
  530. package/dist/server/compatibility.mjs.map +0 -1
  531. package/dist/server/email.d.mts.map +0 -1
  532. package/dist/server/email.mjs.map +0 -1
  533. package/dist/server/linter.d.mts +0 -5
  534. package/dist/server/linter.d.mts.map +0 -1
  535. package/dist/server/linter.mjs +0 -189
  536. package/dist/server/linter.mjs.map +0 -1
  537. package/dist/transformers/addAttributes.d.mts +0 -32
  538. package/dist/transformers/addAttributes.d.mts.map +0 -1
  539. package/dist/transformers/addAttributes.mjs.map +0 -1
  540. package/dist/transformers/attributeToStyle.d.mts +0 -25
  541. package/dist/transformers/attributeToStyle.d.mts.map +0 -1
  542. package/dist/transformers/attributeToStyle.mjs +0 -80
  543. package/dist/transformers/attributeToStyle.mjs.map +0 -1
  544. package/dist/transformers/base.d.mts +0 -8
  545. package/dist/transformers/base.d.mts.map +0 -1
  546. package/dist/transformers/base.mjs.map +0 -1
  547. package/dist/transformers/entities.d.mts +0 -8
  548. package/dist/transformers/entities.d.mts.map +0 -1
  549. package/dist/transformers/entities.mjs +0 -41
  550. package/dist/transformers/entities.mjs.map +0 -1
  551. package/dist/transformers/filters/defaults.d.mts.map +0 -1
  552. package/dist/transformers/filters/defaults.mjs.map +0 -1
  553. package/dist/transformers/filters/index.d.mts +0 -22
  554. package/dist/transformers/filters/index.d.mts.map +0 -1
  555. package/dist/transformers/filters/index.mjs +0 -67
  556. package/dist/transformers/filters/index.mjs.map +0 -1
  557. package/dist/transformers/format.d.mts +0 -15
  558. package/dist/transformers/format.d.mts.map +0 -1
  559. package/dist/transformers/format.mjs +0 -26
  560. package/dist/transformers/format.mjs.map +0 -1
  561. package/dist/transformers/index.d.mts.map +0 -1
  562. package/dist/transformers/index.mjs +0 -81
  563. package/dist/transformers/index.mjs.map +0 -1
  564. package/dist/transformers/inlineCSS.d.mts +0 -17
  565. package/dist/transformers/inlineCSS.d.mts.map +0 -1
  566. package/dist/transformers/inlineCSS.mjs +0 -70
  567. package/dist/transformers/inlineCSS.mjs.map +0 -1
  568. package/dist/transformers/inlineLink.d.mts +0 -14
  569. package/dist/transformers/inlineLink.d.mts.map +0 -1
  570. package/dist/transformers/inlineLink.mjs.map +0 -1
  571. package/dist/transformers/minify.d.mts +0 -17
  572. package/dist/transformers/minify.d.mts.map +0 -1
  573. package/dist/transformers/minify.mjs +0 -24
  574. package/dist/transformers/minify.mjs.map +0 -1
  575. package/dist/transformers/purgeCSS.d.mts +0 -23
  576. package/dist/transformers/purgeCSS.d.mts.map +0 -1
  577. package/dist/transformers/purgeCSS.mjs +0 -132
  578. package/dist/transformers/purgeCSS.mjs.map +0 -1
  579. package/dist/transformers/removeAttributes.d.mts +0 -31
  580. package/dist/transformers/removeAttributes.d.mts.map +0 -1
  581. package/dist/transformers/removeAttributes.mjs +0 -63
  582. package/dist/transformers/removeAttributes.mjs.map +0 -1
  583. package/dist/transformers/replaceStrings.d.mts.map +0 -1
  584. package/dist/transformers/replaceStrings.mjs.map +0 -1
  585. package/dist/transformers/safeClassNames.d.mts +0 -22
  586. package/dist/transformers/safeClassNames.d.mts.map +0 -1
  587. package/dist/transformers/safeClassNames.mjs.map +0 -1
  588. package/dist/transformers/shorthandCSS.d.mts +0 -24
  589. package/dist/transformers/shorthandCSS.d.mts.map +0 -1
  590. package/dist/transformers/shorthandCSS.mjs +0 -48
  591. package/dist/transformers/shorthandCSS.mjs.map +0 -1
  592. package/dist/transformers/sixHex.d.mts +0 -16
  593. package/dist/transformers/sixHex.d.mts.map +0 -1
  594. package/dist/transformers/sixHex.mjs +0 -30
  595. package/dist/transformers/sixHex.mjs.map +0 -1
  596. package/dist/transformers/tailwindcss.d.mts.map +0 -1
  597. package/dist/transformers/tailwindcss.mjs.map +0 -1
  598. package/dist/transformers/urlQuery.d.mts +0 -24
  599. package/dist/transformers/urlQuery.d.mts.map +0 -1
  600. package/dist/transformers/urlQuery.mjs +0 -65
  601. package/dist/transformers/urlQuery.mjs.map +0 -1
  602. package/dist/types/config.d.mts.map +0 -1
  603. package/dist/types/config.mjs +0 -1
  604. package/dist/types/index.d.mts +0 -2
  605. package/dist/types/index.mjs +0 -1
  606. package/dist/utils/ast/index.d.mts +0 -4
  607. package/dist/utils/ast/index.mjs +0 -5
  608. package/dist/utils/ast/parser.d.mts.map +0 -1
  609. package/dist/utils/ast/parser.mjs.map +0 -1
  610. package/dist/utils/ast/serializer.d.mts.map +0 -1
  611. package/dist/utils/ast/serializer.mjs +0 -37
  612. package/dist/utils/ast/serializer.mjs.map +0 -1
  613. package/dist/utils/ast/walker.d.mts.map +0 -1
  614. package/dist/utils/ast/walker.mjs.map +0 -1
  615. package/dist/utils/detect.d.mts.map +0 -1
  616. package/dist/utils/detect.mjs.map +0 -1
  617. package/dist/utils/url.d.mts.map +0 -1
  618. package/dist/utils/url.mjs.map +0 -1
  619. package/node_modules/@clack/core/dist/index.mjs.map +0 -1
  620. package/node_modules/@clack/prompts/dist/index.mjs.map +0 -1
  621. package/node_modules/fast-wrap-ansi/lib/main.js.map +0 -1
  622. package/node_modules/maizzle/dist/commands/make/stubs/layout.vue +0 -39
  623. package/node_modules/tinyexec/dist/LICENSES.txt +0 -83
@@ -0,0 +1,332 @@
1
+ <script setup lang="ts">
2
+ import { computed, createStaticVNode, useAttrs, type PropType } from 'vue'
3
+ import { twMerge } from 'tailwind-merge'
4
+ import { outlookFallbackProp } from './utils.ts'
5
+ import { useOutlookFallback } from '../composables/useOutlookFallback'
6
+
7
+ type AspectRatio = '1:1' | '4:3' | '3:2' | '16:9' | '21:9' | '2:1' | '3:4' | '9:16' | (string & {})
8
+ type BackgroundPosition =
9
+ | 'top' | 'right' | 'bottom' | 'left' | 'center'
10
+ | 'top left' | 'top right' | 'top center'
11
+ | 'bottom left' | 'bottom right' | 'bottom center'
12
+ | 'center left' | 'center right' | 'center center'
13
+ | (string & {})
14
+ type BackgroundSize = 'cover' | 'contain' | 'auto' | (string & {})
15
+
16
+ defineOptions({ inheritAttrs: false })
17
+
18
+ const attrs = useAttrs()
19
+
20
+ const props = defineProps({
21
+ /** The image source URL. When motionSrc is used, this becomes the static fallback. */
22
+ src: {
23
+ type: String,
24
+ required: true
25
+ },
26
+ /** Alt text for the image. */
27
+ alt: {
28
+ type: String,
29
+ default: ''
30
+ },
31
+ /** Image source for dark mode. */
32
+ darkSrc: {
33
+ type: String,
34
+ default: null
35
+ },
36
+ /**
37
+ * The width of the image, rendered without units.
38
+ *
39
+ * Optional: when omitted, the width is auto-derived post-render from
40
+ * the nearest sized ancestor (Container/Section/Column or any element
41
+ * with a pixel width). Falls back to fluid when no pixel width is
42
+ * resolvable. The `aspect` crop mode still requires an explicit width.
43
+ */
44
+ width: {
45
+ type: [String, Number],
46
+ default: undefined
47
+ },
48
+ /** Animated image source, shown when user has no reduced motion preference. */
49
+ motionSrc: {
50
+ type: String,
51
+ default: ''
52
+ },
53
+ /**
54
+ * Aspect ratio for cropped images.
55
+ *
56
+ * Accepts colon or slash form: `'16:9'`, `'16/9'`, `'4:3'`, `'1:1'`, etc.
57
+ *
58
+ * Alternatively, set a Tailwind aspect class on the component:
59
+ * `aspect-square`, `aspect-video`, `aspect-[16/9]`, `aspect-3/2`. The
60
+ * prop wins when both are provided.
61
+ *
62
+ * @example '16:9'
63
+ * @example '4:3'
64
+ * @example '1:1'
65
+ */
66
+ aspect: {
67
+ type: String as PropType<AspectRatio>,
68
+ default: ''
69
+ },
70
+ /**
71
+ * CSS `background-position` for the cropped image fill.
72
+ *
73
+ * @default 'center'
74
+ * @example 'top'
75
+ * @example 'top left'
76
+ * @example '20% 30%'
77
+ */
78
+ position: {
79
+ type: String as PropType<BackgroundPosition>,
80
+ default: 'center'
81
+ },
82
+ /**
83
+ * CSS `background-size` for the cropped image fill.
84
+ *
85
+ * @default 'cover'
86
+ * @example 'contain'
87
+ * @example 'auto'
88
+ */
89
+ size: {
90
+ type: String as PropType<BackgroundSize>,
91
+ default: 'cover'
92
+ },
93
+ /**
94
+ * Toggle Outlook (MSO) and VML fallback markup for this image.
95
+ *
96
+ * Inherits from an ancestor (e.g. a Layout calling
97
+ * `useOutlookFallback(false)`); an explicit value overrides. When
98
+ * `false`, the VML `<v:rect>` emitted in cropped mode (`aspect`)
99
+ * is skipped and the modern padding-hack div renders to all
100
+ * clients including Outlook (which will show an empty area).
101
+ *
102
+ * @default inherits — root default `true`
103
+ */
104
+ outlookFallback: outlookFallbackProp,
105
+ /**
106
+ * URL to navigate to when the image is clicked.
107
+ *
108
+ * Modern clients: output is wrapped in `<a href>`. In cropped mode the
109
+ * anchor is `display:block` so the whole padding-hack area is clickable.
110
+ * Outlook: emitted as the `href` attribute on the `<v:rect>` (a
111
+ * documented VML Shape attribute).
112
+ */
113
+ href: {
114
+ type: String,
115
+ default: ''
116
+ },
117
+ })
118
+
119
+ const outlookFallback = useOutlookFallback(props.outlookFallback)
120
+
121
+ function mimeFromExtension(src: string): string {
122
+ const ext = src.slice(src.lastIndexOf('.') + 1).toLowerCase()
123
+
124
+ const types: Record<string, string> = {
125
+ apng: 'image/apng',
126
+ avif: 'image/avif',
127
+ gif: 'image/gif',
128
+ jpg: 'image/jpeg',
129
+ jpeg: 'image/jpeg',
130
+ jfif: 'image/jpeg',
131
+ png: 'image/png',
132
+ svg: 'image/svg+xml',
133
+ webp: 'image/webp',
134
+ }
135
+
136
+ return types[ext] ?? ''
137
+ }
138
+
139
+ const ASPECT_KEYWORDS: Record<string, string> = {
140
+ 'aspect-square': '1/1',
141
+ 'aspect-video': '16/9',
142
+ }
143
+
144
+ /**
145
+ * Vue normalizes a component's `class` attr to a string before it
146
+ * reaches `attrs`, so only the string/empty cases can occur here.
147
+ */
148
+ function normalizeClass(value: unknown): string {
149
+ return typeof value === 'string' ? value : ''
150
+ }
151
+
152
+ /**
153
+ * Pull Tailwind `aspect-*` tokens out of the inherited class list. Returns
154
+ * both the derived ratio (first match wins) and the cleaned class string
155
+ * so the aspect token isn't duplicated on the wrapper.
156
+ */
157
+ const parsedClass = computed(() => {
158
+ const tokens = normalizeClass(attrs.class).split(/\s+/).filter(Boolean)
159
+ let ratio: string | null = null
160
+ const rest: string[] = []
161
+ for (const t of tokens) {
162
+ if (ASPECT_KEYWORDS[t]) {
163
+ if (!ratio) ratio = ASPECT_KEYWORDS[t]
164
+ continue
165
+ }
166
+ const m = t.match(/^aspect-(?:\[(\d+(?:\.\d+)?)[/:](\d+(?:\.\d+)?)\]|(\d+(?:\.\d+)?)\/(\d+(?:\.\d+)?))$/)
167
+ if (m) {
168
+ if (!ratio) ratio = `${m[1] ?? m[3]}/${m[2] ?? m[4]}`
169
+ continue
170
+ }
171
+ rest.push(t)
172
+ }
173
+ return { ratio, className: rest.join(' ') }
174
+ })
175
+
176
+ const resolvedAspect = computed(() => props.aspect || parsedClass.value.ratio || '')
177
+
178
+ const ratio = computed(() => {
179
+ if (!resolvedAspect.value) return null
180
+ const [w, h] = resolvedAspect.value.split(/[:/]/).map(Number)
181
+ if (!w || !h || !Number.isFinite(w) || !Number.isFinite(h)) return null
182
+ const pct = ((h / w) * 100).toFixed(4).replace(/\.?0+$/, '')
183
+ return { w, h, paddingBottom: `${pct}%` }
184
+ })
185
+
186
+ const isCropped = computed(() => ratio.value !== null)
187
+
188
+ const motionType = computed(() => mimeFromExtension(props.motionSrc))
189
+
190
+ const imgWidth = computed(() => Number.parseInt(String(props.width), 10))
191
+
192
+ /**
193
+ * Whether an explicit, usable pixel width was supplied. When false, the
194
+ * non-cropped `<img>` is emitted without a width attribute plus a
195
+ * `data-maizzle-img-width` marker the `imgWidth` transformer reads to
196
+ * backfill the width from the nearest sized ancestor.
197
+ */
198
+ const hasWidth = computed(() => props.width != null && props.width !== '' && Number.isFinite(imgWidth.value))
199
+
200
+ const heightPx = computed(() =>
201
+ ratio.value && Number.isFinite(imgWidth.value)
202
+ ? Math.round((imgWidth.value * ratio.value.h) / ratio.value.w)
203
+ : null
204
+ )
205
+
206
+ const usePicture = computed(() => !isCropped.value && (props.darkSrc || props.motionSrc))
207
+
208
+ /**
209
+ * Escape characters that break Tailwind's `bg-[url('...')]` arbitrary value
210
+ * (the closing `']`, braces, spaces) and the `url()` wrapper itself (quotes,
211
+ * parens). Targeted replace so already-encoded URLs aren't double-encoded.
212
+ *
213
+ * Only used for the dark/motion variant classes — those have to be Tailwind
214
+ * arbitrary classes so they compile to `@media` rules. The base background
215
+ * image is set inline via `:style` to avoid the CSS pipeline rewriting it.
216
+ */
217
+ const escapeForClass = (url: string) => url
218
+ .replace(/'/g, '%27')
219
+ .replace(/\(/g, '%28')
220
+ .replace(/\)/g, '%29')
221
+ .replace(/ /g, '%20')
222
+ .replace(/\]/g, '%5D')
223
+ .replace(/\}/g, '%7D')
224
+
225
+ /** Escape a URL for safe use inside `url('...')` in an inline style. */
226
+ const escapeForCssUrl = (s: string) => s
227
+ .replace(/\\/g, '\\\\')
228
+ .replace(/'/g, "\\'")
229
+
230
+ const escapeAttr = (s: string) => s
231
+ .replace(/&/g, '&amp;')
232
+ .replace(/"/g, '&quot;')
233
+ .replace(/</g, '&lt;')
234
+ .replace(/>/g, '&gt;')
235
+
236
+ const vmlAspect = computed(() => {
237
+ if (props.size === 'cover') return 'atleast'
238
+ if (props.size === 'contain') return 'atmost'
239
+ return ''
240
+ })
241
+
242
+ const VmlRect = () => {
243
+ if (!isCropped.value || !heightPx.value || !Number.isFinite(imgWidth.value)) return null
244
+ const aspectAttr = vmlAspect.value ? ` aspect="${vmlAspect.value}"` : ''
245
+ const altAttr = props.alt ? ` alt="${escapeAttr(props.alt)}"` : ''
246
+ const hrefAttr = props.href ? ` href="${escapeAttr(props.href)}"` : ''
247
+ return createStaticVNode(
248
+ `<!--[if mso]><v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false"${hrefAttr}${altAttr} style="width:${imgWidth.value}px;height:${heightPx.value}px;"><v:fill type="frame" src="${escapeAttr(props.src)}"${aspectAttr} /></v:rect><![endif]-->`,
249
+ 1
250
+ )
251
+ }
252
+
253
+ const NotMsoBefore = () => createStaticVNode('<!--[if !mso]><!-->', 1)
254
+ const NotMsoAfter = () => createStaticVNode('<!--<![endif]-->', 1)
255
+
256
+ const imgClass = 'max-w-full align-middle'
257
+
258
+ const cropClass = computed(() =>
259
+ twMerge(
260
+ `overflow-hidden table max-w-full${hasWidth.value ? ` w-[${imgWidth.value}px]` : ''}`,
261
+ parsedClass.value.className,
262
+ )
263
+ )
264
+ </script>
265
+
266
+ <template>
267
+ <template v-if="isCropped">
268
+ <VmlRect v-if="outlookFallback" />
269
+ <NotMsoBefore v-if="outlookFallback" />
270
+ <a v-if="href" :href="href" class="block no-underline">
271
+ <div
272
+ v-bind="{ ...attrs, class: undefined }"
273
+ role="img"
274
+ :aria-label="alt || undefined"
275
+ :class="cropClass"
276
+ >
277
+ <div
278
+ :class="[
279
+ 'table-cell w-full h-0 bg-no-repeat',
280
+ darkSrc ? `dark:bg-[url('${escapeForClass(darkSrc)}')]!` : '',
281
+ motionSrc ? `motion-safe:bg-[url('${escapeForClass(motionSrc)}')]!` : '',
282
+ ]"
283
+ :style="{
284
+ paddingBottom: ratio!.paddingBottom,
285
+ backgroundImage: `url('${escapeForCssUrl(src)}')`,
286
+ backgroundSize: size,
287
+ backgroundPosition: position,
288
+ }"
289
+ />
290
+ </div>
291
+ </a>
292
+ <div
293
+ v-else
294
+ v-bind="{ ...attrs, class: undefined }"
295
+ role="img"
296
+ :aria-label="alt || undefined"
297
+ :class="['overflow-hidden table max-w-full', parsedClass.className]"
298
+ :style="hasWidth ? `width: ${imgWidth}px;` : undefined"
299
+ >
300
+ <div
301
+ :class="[
302
+ 'table-cell w-full h-0 bg-no-repeat',
303
+ darkSrc ? `dark:bg-[url('${escapeForClass(darkSrc)}')]!` : '',
304
+ motionSrc ? `motion-safe:bg-[url('${escapeForClass(motionSrc)}')]!` : '',
305
+ ]"
306
+ :style="{
307
+ paddingBottom: ratio!.paddingBottom,
308
+ backgroundImage: `url('${escapeForCssUrl(src)}')`,
309
+ backgroundSize: size,
310
+ backgroundPosition: position,
311
+ }"
312
+ />
313
+ </div>
314
+ <NotMsoAfter v-if="outlookFallback" />
315
+ </template>
316
+ <a v-else-if="href && usePicture" :href="href">
317
+ <picture>
318
+ <source v-if="darkSrc" :srcset="darkSrc" media="(prefers-color-scheme: dark)">
319
+ <source v-if="motionSrc" :srcset="motionSrc" :type="motionType || undefined" media="(prefers-reduced-motion: no-preference)">
320
+ <img v-bind="attrs" :src="src" :alt="alt" :width="hasWidth ? imgWidth : undefined" :data-maizzle-img-width="hasWidth ? undefined : ''" :class="imgClass" data-juice-duplicates="false">
321
+ </picture>
322
+ </a>
323
+ <picture v-else-if="usePicture">
324
+ <source v-if="darkSrc" :srcset="darkSrc" media="(prefers-color-scheme: dark)">
325
+ <source v-if="motionSrc" :srcset="motionSrc" :type="motionType || undefined" media="(prefers-reduced-motion: no-preference)">
326
+ <img v-bind="attrs" :src="src" :alt="alt" :width="hasWidth ? imgWidth : undefined" :data-maizzle-img-width="hasWidth ? undefined : ''" :class="imgClass" data-juice-duplicates="false">
327
+ </picture>
328
+ <a v-else-if="href" :href="href">
329
+ <img v-bind="attrs" :src="src" :alt="alt" :width="hasWidth ? imgWidth : undefined" :data-maizzle-img-width="hasWidth ? undefined : ''" :class="imgClass" data-juice-duplicates="false">
330
+ </a>
331
+ <img v-else v-bind="attrs" :src="src" :alt="alt" :width="hasWidth ? imgWidth : undefined" :data-maizzle-img-width="hasWidth ? undefined : ''" :class="imgClass" data-juice-duplicates="false">
332
+ </template>
@@ -1,9 +1,12 @@
1
1
  <script setup lang="ts">
2
- import type { PropType } from 'vue'
2
+ import { computed, useAttrs, createStaticVNode, type PropType } from 'vue'
3
+ import { twMerge } from 'tailwind-merge'
4
+ import { outlookFallbackProp } from './utils.ts'
5
+ import { useOutlookFallback } from '../composables/useOutlookFallback'
3
6
 
4
7
  defineOptions({ inheritAttrs: false })
5
8
 
6
- defineProps({
9
+ const props = defineProps({
7
10
  /**
8
11
  * Classes to add to the `<body>` tag.
9
12
  */
@@ -29,6 +32,18 @@ defineProps({
29
32
  type: String as PropType<'ltr' | 'rtl'>,
30
33
  default: 'ltr'
31
34
  },
35
+ /**
36
+ * Render an empty `<head>` before the main head element.
37
+ *
38
+ * This is a workaround for Yahoo! Mail on Android, which
39
+ * strips the first `<head>` element it finds.
40
+ *
41
+ * @default false
42
+ */
43
+ doubleHead: {
44
+ type: [Boolean, String],
45
+ default: false
46
+ },
32
47
  /**
33
48
  * Accessible label for the email article wrapper.
34
49
  *
@@ -39,12 +54,58 @@ defineProps({
39
54
  ariaLabel: {
40
55
  type: String,
41
56
  default: undefined
42
- }
57
+ },
58
+ /**
59
+ * Toggle Outlook (MSO) and VML fallback markup for this
60
+ * component and all descendants.
61
+ *
62
+ * When `false`, skips MSO ghost tables, VML shapes,
63
+ * `xmlns:v`/`xmlns:o` attributes, and mso-specific CSS
64
+ * in all built-in components.
65
+ *
66
+ * @default true
67
+ */
68
+ outlookFallback: outlookFallbackProp,
43
69
  })
70
+
71
+ const outlookFallback = useOutlookFallback(props.outlookFallback)
72
+
73
+ const attrs = useAttrs()
74
+ const bodyMergedClass = computed(() => twMerge('m-0 p-0 size-full [word-break:break-word]', props.bodyClass))
75
+ const articleMergedClass = computed(() => twMerge('[font-size:max(16px,1rem)] font-inter', attrs.class as string))
76
+
77
+ const EmptyHead = () => createStaticVNode('<head></head>', 1)
78
+
79
+ const MsoHead = () => createStaticVNode(
80
+ `<!--[if mso]>
81
+ <style>
82
+ td,th,div,p,a,h1,h2,h3,h4,h5,h6 {font-family: "Segoe UI", sans-serif; mso-line-height-rule: exactly;}
83
+ .mso-break-all {word-break: break-all;}
84
+ </style>
85
+ <![endif]-->`,
86
+ 1
87
+ )
88
+
89
+ const msoBody = `<!--[if mso]>
90
+ <xml>
91
+ <o:OfficeDocumentSettings>
92
+ <o:PixelsPerInch>96</o:PixelsPerInch>
93
+ </o:OfficeDocumentSettings>
94
+ <w:WordDocument>
95
+ <w:DontUseAdvancedTypographyReadingMail />
96
+ </w:WordDocument>
97
+ </xml>
98
+ <![endif]-->`
99
+
100
+ const htmlXmlns = computed(() => outlookFallback ? {
101
+ 'xmlns:v': 'urn:schemas-microsoft-com:vml',
102
+ 'xmlns:o': 'urn:schemas-microsoft-com:office:office',
103
+ } : {})
44
104
  </script>
45
105
 
46
106
  <template>
47
- <html :lang="lang" :dir="dir" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
107
+ <html :lang="lang" :dir="dir" v-bind="htmlXmlns">
108
+ <EmptyHead v-if="props.doubleHead === true || props.doubleHead === 'true'" />
48
109
  <head>
49
110
  <meta charset="utf-8">
50
111
  <meta name="x-apple-disable-message-reformatting">
@@ -52,32 +113,20 @@ defineProps({
52
113
  <meta name="format-detection" content="telephone=no, date=no, address=no, email=no, url=no">
53
114
  <meta name="color-scheme" content="light dark">
54
115
  <meta name="supported-color-schemes" content="light dark">
55
- <!--[if mso]>
56
- <noscript>
57
- <xml>
58
- <o:OfficeDocumentSettings xmlns:o="urn:schemas-microsoft-com:office:office">
59
- <o:PixelsPerInch>96</o:PixelsPerInch>
60
- </o:OfficeDocumentSettings>
61
- </xml>
62
- </noscript>
63
- <style>
64
- td,th,div,p,a,h1,h2,h3,h4,h5,h6 {font-family: "Segoe UI", sans-serif; mso-line-height-rule: exactly;}
65
- .mso-break-all {word-break: break-all;}
66
- </style>
67
- <![endif]-->
116
+ <MsoHead v-if="outlookFallback" />
68
117
  <link rel="preconnect" href="https://fonts.googleapis.com">
69
118
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="anonymous">
70
- <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap" rel="stylesheet" media="screen">
119
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet" media="screen">
71
120
  <style>
72
121
  @import "@maizzle/tailwindcss";
73
122
 
74
123
  img {
75
124
  @apply max-w-full align-middle;
76
125
  }
77
-
78
126
  </style>
79
127
  </head>
80
- <body :xml:lang="lang" :class="['m-0 p-0 size-full [word-break:break-word]', bodyClass]">
128
+ <body :xml:lang="outlookFallback ? lang : null" :class="bodyMergedClass">
129
+ <span v-if="outlookFallback" style="display: none" v-html="msoBody"></span>
81
130
  <div
82
131
  role="article"
83
132
  aria-roledescription="email"
@@ -85,7 +134,8 @@ defineProps({
85
134
  :lang="lang"
86
135
  :dir="dir"
87
136
  style="font-size: medium;"
88
- :class="['[font-size:max(16px,1rem)]', $attrs.class]">
137
+ :class="articleMergedClass"
138
+ >
89
139
  <slot />
90
140
  </div>
91
141
  </body>
@@ -20,7 +20,7 @@ const mergedClass = computed(() => twMerge('no-underline', attrs.class as string
20
20
  </script>
21
21
 
22
22
  <template>
23
- <a :href="href" v-bind="$attrs" :class="mergedClass">
23
+ <a :href="href" v-bind="{ ...$attrs, class: mergedClass }">
24
24
  <slot />
25
25
  </a>
26
26
  </template>
@@ -1,7 +1,10 @@
1
1
  <script lang="ts">
2
- import { createStaticVNode, type PropType } from 'vue'
2
+ import { createStaticVNode, inject, type PropType } from 'vue'
3
3
  import { createMarkdownExit, type MarkdownExitOptions } from 'markdown-exit'
4
4
  import { codeToHtml, type BundledTheme } from 'shiki'
5
+ import { defu } from 'defu'
6
+ import { MaizzleConfigKey } from '../composables/useConfig'
7
+ import { shikiToCodeBlock } from './utils'
5
8
 
6
9
  export default {
7
10
  props: {
@@ -15,17 +18,21 @@ export default {
15
18
  type: String,
16
19
  default: ''
17
20
  },
18
- /** Shiki theme for fenced code blocks. @default 'github-dark-high-contrast' */
21
+ /**
22
+ * Shiki theme for fenced code blocks. Falls back to
23
+ * `markdown.shikiTheme` from the config, then to
24
+ * `'github-dark-high-contrast'`.
25
+ */
19
26
  shikiTheme: {
20
27
  type: String as PropType<BundledTheme>,
21
- default: 'github-dark-high-contrast'
28
+ default: undefined
22
29
  },
23
30
  /** Wrap output in a div element. @default false */
24
31
  wrapper: {
25
32
  type: Boolean,
26
33
  default: false
27
34
  },
28
- /** markdown-exit configuration options. Merged with defaults. */
35
+ /** markdown-exit configuration options. Takes precedence over `markdown.markdownOptions` from the config. */
29
36
  config: {
30
37
  type: Object as PropType<MarkdownExitOptions>,
31
38
  default: () => ({})
@@ -48,32 +55,52 @@ export default {
48
55
  return () => createStaticVNode('', 0)
49
56
  }
50
57
 
51
- const md = createMarkdownExit({
52
- html: true,
53
- linkify: true,
54
- typographer: true,
55
- highlight: async (code, lang) => {
56
- try {
57
- return await codeToHtml(code, { lang, theme: props.shikiTheme })
58
- } catch {
59
- return ''
60
- }
58
+ /**
59
+ * Pull the global `markdown` config (when rendered inside a Maizzle
60
+ * build) so the component honors the same options and plugins as
61
+ * `.md` templates. Props override the config; both fall back to the
62
+ * component defaults. `inject` over `useConfig()` so the component
63
+ * still works standalone, when no config is provided.
64
+ */
65
+ const mdConfig = inject(MaizzleConfigKey, undefined)?.markdown ?? {}
66
+ const markdownOptions = mdConfig.markdownOptions
67
+ const markdownUses = mdConfig.markdownUses
68
+ const markdownSetup = mdConfig.markdownSetup
69
+ const theme = props.shikiTheme ?? mdConfig.shikiTheme ?? 'github-dark-high-contrast'
70
+
71
+ const md = createMarkdownExit(defu(
72
+ props.config,
73
+ markdownOptions ?? {},
74
+ {
75
+ html: true,
76
+ linkify: true,
77
+ typographer: true,
78
+ highlight: async (code: string, lang: string) => {
79
+ try {
80
+ return await codeToHtml(code, { lang, theme })
81
+ } catch {
82
+ return ''
83
+ }
84
+ },
61
85
  },
62
- ...props.config,
63
- })
86
+ ))
64
87
 
65
- const wrapPre = (html: string) =>
66
- `<table class="w-full"><tr><td class="max-w-0 mso-padding-alt-4">${html}</td></tr></table>\n`
88
+ /**
89
+ * Apply config plugins before overriding the fence rules, so the
90
+ * code-block wrapping below composes over whatever they emit.
91
+ */
92
+ for (const use of markdownUses ?? []) {
93
+ if (Array.isArray(use)) md.use(use[0], ...use.slice(1))
94
+ else md.use(use)
95
+ }
96
+ await markdownSetup?.(md)
67
97
 
68
98
  const defaultFence = md.renderer.rules.fence!
69
- md.renderer.rules.fence = (...args) => {
70
- const result = defaultFence(...args)
71
- if (typeof result === 'string') return wrapPre(result)
72
- return result.then(wrapPre)
73
- }
99
+ md.renderer.rules.fence = (...args) =>
100
+ Promise.resolve(defaultFence(...args)).then(shikiToCodeBlock)
74
101
 
75
102
  const defaultCodeBlock = md.renderer.rules.code_block!
76
- md.renderer.rules.code_block = (...args) => wrapPre(defaultCodeBlock(...args) as string)
103
+ md.renderer.rules.code_block = (...args) => shikiToCodeBlock(defaultCodeBlock(...args) as string)
77
104
 
78
105
  let html = await md.renderAsync(source)
79
106
 
@@ -0,0 +1,39 @@
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+ import Layout from './Layout.vue'
4
+ import Container from './Container.vue'
5
+
6
+ defineOptions({ inheritAttrs: false })
7
+
8
+ const props = defineProps({
9
+ /**
10
+ * Frontmatter object — wired in automatically when this layout
11
+ * wraps a `.md` template (the default behavior, or via the
12
+ * `layout: MarkdownLayout` frontmatter key).
13
+ *
14
+ * Keys matching `Layout`'s props (`lang`, `dir`, `bodyClass`,
15
+ * `doubleHead`, `ariaLabel`, `outlookFallback`) flow through to
16
+ * the wrapped `Layout`. Missing keys fall back to `Layout`'s
17
+ * own defaults.
18
+ */
19
+ frontmatter: {
20
+ type: Object as PropType<Record<string, unknown>>,
21
+ default: () => ({})
22
+ },
23
+ })
24
+ </script>
25
+
26
+ <template>
27
+ <Layout
28
+ :lang="props.frontmatter.lang as string | undefined"
29
+ :dir="props.frontmatter.dir as 'ltr' | 'rtl' | undefined"
30
+ :body-class="props.frontmatter.bodyClass as string | undefined"
31
+ :double-head="props.frontmatter.doubleHead as boolean | string | undefined"
32
+ :aria-label="props.frontmatter.ariaLabel as string | undefined"
33
+ :outlook-fallback="props.frontmatter.outlookFallback as boolean | undefined"
34
+ >
35
+ <Container class="max-w-xl">
36
+ <slot />
37
+ </Container>
38
+ </Layout>
39
+ </template>
@@ -0,0 +1,14 @@
1
+ <script lang="ts">
2
+ import { h } from 'vue'
3
+
4
+ export default {
5
+ name: 'NotPlaintext',
6
+ setup(_, { slots }) {
7
+ return () => h(
8
+ 'div',
9
+ { 'data-maizzle-html-only': '' },
10
+ slots.default?.(),
11
+ )
12
+ },
13
+ }
14
+ </script>