@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.
- package/README.md +3 -3
- package/bin/maizzle.mjs +1 -1
- package/dist/build.d.ts +38 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +234 -0
- package/dist/build.js.map +1 -0
- package/dist/components/Body.vue +32 -3
- package/dist/components/Button.vue +91 -62
- package/dist/components/CodeBlock.vue +6 -4
- package/dist/components/CodeInline.vue +77 -6
- package/dist/components/Column.vue +67 -31
- package/dist/components/Container.vue +73 -12
- package/dist/components/Font.vue +96 -0
- package/dist/components/Head.vue +1 -1
- package/dist/components/Heading.vue +1 -1
- package/dist/components/Hr.vue +33 -0
- package/dist/components/Html.vue +36 -3
- package/dist/components/Img.vue +332 -0
- package/dist/components/Layout.vue +71 -21
- package/dist/components/Link.vue +1 -1
- package/dist/components/Markdown.vue +51 -24
- package/dist/components/MarkdownLayout.vue +39 -0
- package/dist/components/NotPlaintext.vue +14 -0
- package/dist/components/Outlook.vue +38 -11
- package/dist/components/OutlookBg.vue +241 -0
- package/dist/components/Plaintext.vue +14 -0
- package/dist/components/Preheader.vue +35 -10
- package/dist/components/QrCode.vue +157 -0
- package/dist/components/Raw.vue +28 -0
- package/dist/components/Row.vue +115 -22
- package/dist/components/Section.vue +65 -26
- package/dist/components/Spacer.vue +35 -29
- package/dist/components/Tailwind.vue +45 -0
- package/dist/components/Text.vue +3 -3
- package/dist/components/Vml.vue +207 -94
- package/dist/components/utils.d.ts +53 -0
- package/dist/components/utils.d.ts.map +1 -0
- package/dist/components/utils.js +80 -0
- package/dist/components/utils.js.map +1 -0
- package/dist/components/utils.ts +102 -0
- package/dist/composables/defineConfig.d.ts +13 -0
- package/dist/composables/defineConfig.d.ts.map +1 -0
- package/dist/composables/{defineConfig.mjs → defineConfig.js} +7 -9
- package/dist/composables/defineConfig.js.map +1 -0
- package/dist/composables/renderContext.d.ts +37 -0
- package/dist/composables/renderContext.d.ts.map +1 -0
- package/dist/composables/renderContext.js +6 -0
- package/dist/composables/renderContext.js.map +1 -0
- package/dist/composables/useBaseUrl.d.ts +19 -0
- package/dist/composables/useBaseUrl.d.ts.map +1 -0
- package/dist/composables/useBaseUrl.js +26 -0
- package/dist/composables/useBaseUrl.js.map +1 -0
- package/dist/composables/useConfig.d.ts +16 -0
- package/dist/composables/useConfig.d.ts.map +1 -0
- package/dist/composables/useConfig.js +19 -0
- package/dist/composables/useConfig.js.map +1 -0
- package/dist/composables/useCurrentTemplate.d.ts +31 -0
- package/dist/composables/useCurrentTemplate.d.ts.map +1 -0
- package/dist/composables/useCurrentTemplate.js +42 -0
- package/dist/composables/useCurrentTemplate.js.map +1 -0
- package/dist/composables/{useDoctype.d.mts → useDoctype.d.ts} +1 -1
- package/dist/composables/useDoctype.d.ts.map +1 -0
- package/dist/composables/{useDoctype.mjs → useDoctype.js} +3 -4
- package/dist/composables/useDoctype.js.map +1 -0
- package/dist/composables/{useEvent.d.mts → useEvent.d.ts} +3 -3
- package/dist/composables/useEvent.d.ts.map +1 -0
- package/dist/composables/{useEvent.mjs → useEvent.js} +4 -5
- package/dist/composables/useEvent.js.map +1 -0
- package/dist/composables/useFont.d.ts +50 -0
- package/dist/composables/useFont.d.ts.map +1 -0
- package/dist/composables/useFont.js +92 -0
- package/dist/composables/useFont.js.map +1 -0
- package/dist/composables/useOutlookFallback.d.ts +21 -0
- package/dist/composables/useOutlookFallback.d.ts.map +1 -0
- package/dist/composables/useOutlookFallback.js +29 -0
- package/dist/composables/useOutlookFallback.js.map +1 -0
- package/dist/composables/useOutputPath.d.ts +17 -0
- package/dist/composables/useOutputPath.d.ts.map +1 -0
- package/dist/composables/useOutputPath.js +23 -0
- package/dist/composables/useOutputPath.js.map +1 -0
- package/dist/composables/{usePlaintext.d.mts → usePlaintext.d.ts} +3 -1
- package/dist/composables/usePlaintext.d.ts.map +1 -0
- package/dist/composables/{usePlaintext.mjs → usePlaintext.js} +4 -4
- package/dist/composables/usePlaintext.js.map +1 -0
- package/dist/composables/usePreheader.d.ts +25 -0
- package/dist/composables/usePreheader.d.ts.map +1 -0
- package/dist/composables/usePreheader.js +28 -0
- package/dist/composables/usePreheader.js.map +1 -0
- package/dist/composables/useTransformers.d.ts +34 -0
- package/dist/composables/useTransformers.d.ts.map +1 -0
- package/dist/composables/useTransformers.js +48 -0
- package/dist/composables/useTransformers.js.map +1 -0
- package/dist/composables/useUrlQuery.d.ts +19 -0
- package/dist/composables/useUrlQuery.d.ts.map +1 -0
- package/dist/composables/useUrlQuery.js +26 -0
- package/dist/composables/useUrlQuery.js.map +1 -0
- package/dist/config/{defaults.d.mts → defaults.d.ts} +2 -2
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/{defaults.mjs → defaults.js} +10 -6
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +24 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/{index.mjs → index.js} +45 -14
- package/dist/config/index.js.map +1 -0
- package/dist/events/{index.d.mts → index.d.ts} +35 -12
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/{index.mjs → index.js} +31 -13
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +40 -0
- package/dist/{plaintext.d.mts → plaintext.d.ts} +1 -1
- package/dist/plaintext.d.ts.map +1 -0
- package/dist/{plaintext.mjs → plaintext.js} +4 -5
- package/dist/plaintext.js.map +1 -0
- package/dist/{plugin.d.mts → plugin.d.ts} +2 -2
- package/dist/plugin.d.ts.map +1 -0
- package/dist/{plugin.mjs → plugin.js} +8 -9
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/postcss/{mergeMediaQueries.d.mts → mergeMediaQueries.d.ts} +2 -2
- package/dist/plugins/postcss/mergeMediaQueries.d.ts.map +1 -0
- package/dist/plugins/postcss/{mergeMediaQueries.mjs → mergeMediaQueries.js} +2 -3
- package/dist/plugins/postcss/mergeMediaQueries.js.map +1 -0
- package/dist/plugins/postcss/{pruneVars.d.mts → pruneVars.d.ts} +1 -1
- package/dist/plugins/postcss/pruneVars.d.ts.map +1 -0
- package/dist/plugins/postcss/{pruneVars.mjs → pruneVars.js} +2 -2
- package/dist/plugins/postcss/pruneVars.js.map +1 -0
- package/dist/plugins/postcss/quoteFontFamilies.d.ts +13 -0
- package/dist/plugins/postcss/quoteFontFamilies.d.ts.map +1 -0
- package/dist/plugins/postcss/quoteFontFamilies.js +84 -0
- package/dist/plugins/postcss/quoteFontFamilies.js.map +1 -0
- package/dist/plugins/postcss/{removeDeclarations.d.mts → removeDeclarations.d.ts} +1 -1
- package/dist/plugins/postcss/removeDeclarations.d.ts.map +1 -0
- package/dist/plugins/postcss/{removeDeclarations.mjs → removeDeclarations.js} +2 -2
- package/dist/plugins/postcss/removeDeclarations.js.map +1 -0
- package/dist/plugins/postcss/resolveMaizzleImports.d.ts +16 -0
- package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -0
- package/dist/plugins/postcss/resolveMaizzleImports.js +39 -0
- package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -0
- package/dist/plugins/postcss/resolveProps.d.ts +8 -0
- package/dist/plugins/postcss/resolveProps.d.ts.map +1 -0
- package/dist/plugins/postcss/resolveProps.js +155 -0
- package/dist/plugins/postcss/resolveProps.js.map +1 -0
- package/dist/plugins/postcss/{tailwindCleanup.d.mts → tailwindCleanup.d.ts} +2 -2
- package/dist/plugins/postcss/tailwindCleanup.d.ts.map +1 -0
- package/dist/plugins/postcss/{tailwindCleanup.mjs → tailwindCleanup.js} +5 -3
- package/dist/plugins/postcss/tailwindCleanup.js.map +1 -0
- package/dist/prepare.d.ts +17 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +44 -0
- package/dist/prepare.js.map +1 -0
- package/dist/render/active.d.ts +8 -0
- package/dist/render/active.d.ts.map +1 -0
- package/dist/render/active.js +12 -0
- package/dist/render/active.js.map +1 -0
- package/dist/render/buildTemplate.d.ts +49 -0
- package/dist/render/buildTemplate.d.ts.map +1 -0
- package/dist/render/buildTemplate.js +141 -0
- package/dist/render/buildTemplate.js.map +1 -0
- package/dist/render/{createRenderer.d.mts → createRenderer.d.ts} +14 -6
- package/dist/render/createRenderer.d.ts.map +1 -0
- package/dist/render/createRenderer.js +468 -0
- package/dist/render/createRenderer.js.map +1 -0
- package/dist/render/index.d.ts +18 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +59 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/injectFonts.d.ts +15 -0
- package/dist/render/injectFonts.d.ts.map +1 -0
- package/dist/render/injectFonts.js +45 -0
- package/dist/render/injectFonts.js.map +1 -0
- package/dist/render/parallel/buildWorker.d.ts +31 -0
- package/dist/render/parallel/buildWorker.d.ts.map +1 -0
- package/dist/render/parallel/buildWorker.js +66 -0
- package/dist/render/parallel/buildWorker.js.map +1 -0
- package/dist/render/parallel/worker.mjs +28 -0
- package/dist/render/plugins/codeBlockExtract.d.ts +14 -0
- package/dist/render/plugins/codeBlockExtract.d.ts.map +1 -0
- package/dist/render/plugins/codeBlockExtract.js +38 -0
- package/dist/render/plugins/codeBlockExtract.js.map +1 -0
- package/dist/render/plugins/markdownExtract.d.ts +12 -0
- package/dist/render/plugins/markdownExtract.d.ts.map +1 -0
- package/dist/render/plugins/markdownExtract.js +49 -0
- package/dist/render/plugins/markdownExtract.js.map +1 -0
- package/dist/render/plugins/rawExtract.d.ts +14 -0
- package/dist/render/plugins/rawExtract.d.ts.map +1 -0
- package/dist/render/plugins/rawExtract.js +34 -0
- package/dist/render/plugins/rawExtract.js.map +1 -0
- package/dist/render/plugins/rowSourceLocation.d.ts +18 -0
- package/dist/render/plugins/rowSourceLocation.d.ts.map +1 -0
- package/dist/render/plugins/rowSourceLocation.js +45 -0
- package/dist/render/plugins/rowSourceLocation.js.map +1 -0
- package/dist/{serve.d.mts → serve.d.ts} +5 -3
- package/dist/serve.d.ts.map +1 -0
- package/dist/{serve.mjs → serve.js} +201 -107
- package/dist/serve.js.map +1 -0
- package/dist/server/compatibility.d.ts +59 -0
- package/dist/server/compatibility.d.ts.map +1 -0
- package/dist/server/compatibility.js +959 -0
- package/dist/server/compatibility.js.map +1 -0
- package/dist/server/{email.d.mts → email.d.ts} +2 -2
- package/dist/server/email.d.ts.map +1 -0
- package/dist/server/{email.mjs → email.js} +2 -3
- package/dist/server/email.js.map +1 -0
- package/dist/server/linter.d.ts +20 -0
- package/dist/server/linter.d.ts.map +1 -0
- package/dist/server/linter.js +345 -0
- package/dist/server/linter.js.map +1 -0
- package/dist/server/sfc-utils.d.ts +21 -0
- package/dist/server/sfc-utils.d.ts.map +1 -0
- package/dist/server/sfc-utils.js +198 -0
- package/dist/server/sfc-utils.js.map +1 -0
- package/dist/server/ui/.vite/deps/@lucide_vue.js +44967 -0
- package/dist/server/ui/.vite/deps/@lucide_vue.js.map +1 -0
- package/dist/server/ui/.vite/deps/@vueuse_core.js +8155 -0
- package/dist/server/ui/.vite/deps/@vueuse_core.js.map +1 -0
- package/dist/server/ui/.vite/deps/@vueuse_shared.js +1859 -0
- package/dist/server/ui/.vite/deps/@vueuse_shared.js.map +1 -0
- package/dist/server/ui/.vite/deps/_metadata.json +78 -0
- package/dist/server/ui/.vite/deps/chunk-EAsCxrDo.js +14 -0
- package/dist/server/ui/.vite/deps/class-variance-authority.js +57 -0
- package/dist/server/ui/.vite/deps/class-variance-authority.js.map +1 -0
- package/dist/server/ui/.vite/deps/clsx.js +18 -0
- package/dist/server/ui/.vite/deps/clsx.js.map +1 -0
- package/dist/server/ui/.vite/deps/culori.js +4312 -0
- package/dist/server/ui/.vite/deps/culori.js.map +1 -0
- package/dist/server/ui/.vite/deps/package.json +3 -0
- package/dist/server/ui/.vite/deps/reka-ui.js +44464 -0
- package/dist/server/ui/.vite/deps/reka-ui.js.map +1 -0
- package/dist/server/ui/.vite/deps/tailwind-merge.js +3458 -0
- package/dist/server/ui/.vite/deps/tailwind-merge.js.map +1 -0
- package/dist/server/ui/.vite/deps/vue-router.js +6383 -0
- package/dist/server/ui/.vite/deps/vue-router.js.map +1 -0
- package/dist/server/ui/.vite/deps/vue.js +2 -0
- package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-DaqjATE_.js +8785 -0
- package/dist/server/ui/.vite/deps/vue.runtime.esm-bundler-DaqjATE_.js.map +1 -0
- package/dist/server/ui/App.vue +106 -66
- package/dist/server/ui/components/SidebarClose.vue +12 -0
- package/dist/server/ui/components/ui/checkbox/Checkbox.vue +1 -1
- package/dist/server/ui/components/ui/command/Command.vue +5 -1
- package/dist/server/ui/components/ui/command/CommandInput.vue +2 -2
- package/dist/server/ui/components/ui/dialog/DialogContent.vue +1 -1
- package/dist/server/ui/components/ui/dialog/DialogScrollContent.vue +1 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +1 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +1 -1
- package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +1 -1
- package/dist/server/ui/components/ui/input/Input.vue +1 -1
- package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
- package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +2 -2
- package/dist/server/ui/components/ui/tags-input/TagsInputInput.vue +1 -1
- package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +1 -1
- package/dist/server/ui/lib/emulated-dark-mode.ts +146 -0
- package/dist/server/ui/main.css +25 -0
- package/dist/server/ui/pages/Home.vue +1 -1
- package/dist/server/ui/pages/Preview.vue +377 -186
- package/dist/server/ui/vite-env.d.ts +1 -0
- package/dist/tests/render/_helpers.d.ts +6 -0
- package/dist/tests/render/_helpers.d.ts.map +1 -0
- package/dist/tests/render/_helpers.js +16 -0
- package/dist/tests/render/_helpers.js.map +1 -0
- package/dist/transformers/addAttributes.d.ts +42 -0
- package/dist/transformers/addAttributes.d.ts.map +1 -0
- package/dist/transformers/{addAttributes.mjs → addAttributes.js} +40 -24
- package/dist/transformers/addAttributes.js.map +1 -0
- package/dist/transformers/attributeToStyle.d.ts +38 -0
- package/dist/transformers/attributeToStyle.d.ts.map +1 -0
- package/dist/transformers/attributeToStyle.js +94 -0
- package/dist/transformers/attributeToStyle.js.map +1 -0
- package/dist/transformers/base.d.ts +71 -0
- package/dist/transformers/base.d.ts.map +1 -0
- package/dist/transformers/{base.mjs → base.js} +65 -40
- package/dist/transformers/base.js.map +1 -0
- package/dist/transformers/columnWidth.d.ts +31 -0
- package/dist/transformers/columnWidth.d.ts.map +1 -0
- package/dist/transformers/columnWidth.js +527 -0
- package/dist/transformers/columnWidth.js.map +1 -0
- package/dist/transformers/entities.d.ts +37 -0
- package/dist/transformers/entities.d.ts.map +1 -0
- package/dist/transformers/entities.js +74 -0
- package/dist/transformers/entities.js.map +1 -0
- package/dist/transformers/filters/{defaults.d.mts → defaults.d.ts} +1 -1
- package/dist/transformers/filters/defaults.d.ts.map +1 -0
- package/dist/transformers/filters/{defaults.mjs → defaults.js} +2 -2
- package/dist/transformers/filters/defaults.js.map +1 -0
- package/dist/transformers/filters/index.d.ts +43 -0
- package/dist/transformers/filters/index.d.ts.map +1 -0
- package/dist/transformers/filters/index.js +89 -0
- package/dist/transformers/filters/index.js.map +1 -0
- package/dist/transformers/format.d.ts +22 -0
- package/dist/transformers/format.d.ts.map +1 -0
- package/dist/transformers/format.js +30 -0
- package/dist/transformers/format.js.map +1 -0
- package/dist/transformers/imgWidth.d.ts +20 -0
- package/dist/transformers/imgWidth.d.ts.map +1 -0
- package/dist/transformers/imgWidth.js +76 -0
- package/dist/transformers/imgWidth.js.map +1 -0
- package/dist/transformers/{index.d.mts → index.d.ts} +4 -3
- package/dist/transformers/index.d.ts.map +1 -0
- package/dist/transformers/index.js +163 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/inlineCss.d.ts +85 -0
- package/dist/transformers/inlineCss.d.ts.map +1 -0
- package/dist/transformers/inlineCss.js +112 -0
- package/dist/transformers/inlineCss.js.map +1 -0
- package/dist/transformers/inlineLink.d.ts +35 -0
- package/dist/transformers/inlineLink.d.ts.map +1 -0
- package/dist/transformers/{inlineLink.mjs → inlineLink.js} +35 -11
- package/dist/transformers/inlineLink.js.map +1 -0
- package/dist/transformers/minify.d.ts +21 -0
- package/dist/transformers/minify.d.ts.map +1 -0
- package/dist/transformers/minify.js +25 -0
- package/dist/transformers/minify.js.map +1 -0
- package/dist/transformers/minifyCodeInline.d.ts +29 -0
- package/dist/transformers/minifyCodeInline.d.ts.map +1 -0
- package/dist/transformers/minifyCodeInline.js +36 -0
- package/dist/transformers/minifyCodeInline.js.map +1 -0
- package/dist/transformers/msoPlaceholders.d.ts +33 -0
- package/dist/transformers/msoPlaceholders.d.ts.map +1 -0
- package/dist/transformers/msoPlaceholders.js +114 -0
- package/dist/transformers/msoPlaceholders.js.map +1 -0
- package/dist/transformers/purgeCss.d.ts +43 -0
- package/dist/transformers/purgeCss.d.ts.map +1 -0
- package/dist/transformers/purgeCss.js +207 -0
- package/dist/transformers/purgeCss.js.map +1 -0
- package/dist/transformers/removeAttributes.d.ts +54 -0
- package/dist/transformers/removeAttributes.d.ts.map +1 -0
- package/dist/transformers/removeAttributes.js +72 -0
- package/dist/transformers/removeAttributes.js.map +1 -0
- package/dist/transformers/{replaceStrings.d.mts → replaceStrings.d.ts} +2 -2
- package/dist/transformers/replaceStrings.d.ts.map +1 -0
- package/dist/transformers/{replaceStrings.mjs → replaceStrings.js} +2 -2
- package/dist/transformers/replaceStrings.js.map +1 -0
- package/dist/transformers/safeSelectors.d.ts +37 -0
- package/dist/transformers/safeSelectors.d.ts.map +1 -0
- package/dist/transformers/{safeClassNames.mjs → safeSelectors.js} +40 -10
- package/dist/transformers/safeSelectors.js.map +1 -0
- package/dist/transformers/shorthandCss.d.ts +47 -0
- package/dist/transformers/shorthandCss.d.ts.map +1 -0
- package/dist/transformers/shorthandCss.js +92 -0
- package/dist/transformers/shorthandCss.js.map +1 -0
- package/dist/transformers/sixHex.d.ts +25 -0
- package/dist/transformers/sixHex.d.ts.map +1 -0
- package/dist/transformers/sixHex.js +42 -0
- package/dist/transformers/sixHex.js.map +1 -0
- package/dist/transformers/tailwindComponent.d.ts +16 -0
- package/dist/transformers/tailwindComponent.d.ts.map +1 -0
- package/dist/transformers/tailwindComponent.js +101 -0
- package/dist/transformers/tailwindComponent.js.map +1 -0
- package/dist/transformers/{tailwindcss.d.mts → tailwindcss.d.ts} +2 -2
- package/dist/transformers/tailwindcss.d.ts.map +1 -0
- package/dist/transformers/{tailwindcss.mjs → tailwindcss.js} +33 -74
- package/dist/transformers/tailwindcss.js.map +1 -0
- package/dist/transformers/urlQuery.d.ts +36 -0
- package/dist/transformers/urlQuery.d.ts.map +1 -0
- package/dist/transformers/urlQuery.js +77 -0
- package/dist/transformers/urlQuery.js.map +1 -0
- package/dist/types/{config.d.mts → config.d.ts} +231 -46
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +1 -0
- package/dist/utils/ast/index.d.ts +4 -0
- package/dist/utils/ast/index.js +4 -0
- package/dist/utils/ast/{parser.d.mts → parser.d.ts} +1 -1
- package/dist/utils/ast/parser.d.ts.map +1 -0
- package/dist/utils/ast/{parser.mjs → parser.js} +2 -3
- package/dist/utils/ast/parser.js.map +1 -0
- package/dist/utils/ast/{serializer.d.mts → serializer.d.ts} +1 -1
- package/dist/utils/ast/serializer.d.ts.map +1 -0
- package/dist/utils/ast/serializer.js +46 -0
- package/dist/utils/ast/serializer.js.map +1 -0
- package/dist/utils/ast/{walker.d.mts → walker.d.ts} +1 -1
- package/dist/utils/ast/walker.d.ts.map +1 -0
- package/dist/utils/ast/{walker.mjs → walker.js} +2 -2
- package/dist/utils/ast/walker.js.map +1 -0
- package/dist/utils/cloneConfig.d.ts +13 -0
- package/dist/utils/cloneConfig.d.ts.map +1 -0
- package/dist/utils/cloneConfig.js +21 -0
- package/dist/utils/cloneConfig.js.map +1 -0
- package/dist/utils/compileTailwindCss.d.ts +16 -0
- package/dist/utils/compileTailwindCss.d.ts.map +1 -0
- package/dist/utils/compileTailwindCss.js +55 -0
- package/dist/utils/compileTailwindCss.js.map +1 -0
- package/dist/utils/componentSources.d.ts +50 -0
- package/dist/utils/componentSources.d.ts.map +1 -0
- package/dist/utils/componentSources.js +50 -0
- package/dist/utils/componentSources.js.map +1 -0
- package/dist/utils/cssBox.d.ts +42 -0
- package/dist/utils/cssBox.d.ts.map +1 -0
- package/dist/utils/cssBox.js +151 -0
- package/dist/utils/cssBox.js.map +1 -0
- package/dist/utils/decodeStyleEntities.d.ts +15 -0
- package/dist/utils/decodeStyleEntities.d.ts.map +1 -0
- package/dist/utils/decodeStyleEntities.js +18 -0
- package/dist/utils/decodeStyleEntities.js.map +1 -0
- package/dist/utils/{detect.d.mts → detect.d.ts} +1 -1
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/{detect.mjs → detect.js} +2 -3
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/output-markers.d.ts +29 -0
- package/dist/utils/output-markers.d.ts.map +1 -0
- package/dist/utils/output-markers.js +68 -0
- package/dist/utils/output-markers.js.map +1 -0
- package/dist/utils/{url.d.mts → url.d.ts} +1 -1
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/{url.mjs → url.js} +2 -3
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/watchPaths.d.ts +11 -0
- package/dist/utils/watchPaths.d.ts.map +1 -0
- package/dist/utils/watchPaths.js +19 -0
- package/dist/utils/watchPaths.js.map +1 -0
- package/node_modules/@clack/core/CHANGELOG.md +44 -0
- package/node_modules/@clack/core/dist/index.d.mts +125 -5
- package/node_modules/@clack/core/dist/index.mjs +972 -11
- package/node_modules/@clack/core/package.json +6 -2
- package/node_modules/@clack/prompts/CHANGELOG.md +70 -0
- package/node_modules/@clack/prompts/README.md +129 -3
- package/node_modules/@clack/prompts/dist/index.d.mts +567 -33
- package/node_modules/@clack/prompts/dist/index.mjs +1378 -133
- package/node_modules/@clack/prompts/package.json +7 -4
- package/node_modules/fast-string-truncated-width/dist/index.js +36 -96
- package/node_modules/fast-string-truncated-width/dist/types.d.ts +0 -3
- package/node_modules/fast-string-truncated-width/dist/utils.d.ts +3 -3
- package/node_modules/fast-string-truncated-width/dist/utils.js +14 -9
- package/node_modules/fast-string-truncated-width/package.json +1 -1
- package/node_modules/fast-string-truncated-width/readme.md +2 -3
- package/node_modules/fast-string-width/package.json +2 -2
- package/node_modules/fast-string-width/readme.md +0 -3
- package/node_modules/fast-wrap-ansi/lib/main.js +4 -2
- package/node_modules/fast-wrap-ansi/package.json +11 -11
- package/node_modules/maizzle/README.md +24 -0
- package/node_modules/maizzle/dist/commands/make/component.mjs +1 -1
- package/node_modules/maizzle/dist/commands/make/config.mjs +8 -7
- package/node_modules/maizzle/dist/commands/make/layout.mjs +3 -3
- package/node_modules/maizzle/dist/commands/make/scaffold.mjs +1 -1
- package/node_modules/maizzle/dist/commands/make/stubs/Layout.vue +146 -0
- package/node_modules/maizzle/dist/commands/make/stubs/component.vue +2 -4
- package/node_modules/maizzle/dist/commands/make/stubs/config.ts +1 -5
- package/node_modules/maizzle/dist/commands/make/template.mjs +1 -1
- package/node_modules/maizzle/dist/commands/new.mjs +46 -135
- package/node_modules/maizzle/dist/index.d.mts +1 -0
- package/node_modules/maizzle/dist/index.mjs +30 -7
- package/node_modules/maizzle/package.json +5 -4
- package/node_modules/nypm/dist/cli.mjs +28 -5
- package/node_modules/nypm/dist/index.d.mts +0 -8
- package/node_modules/nypm/dist/index.mjs +27 -4
- package/node_modules/nypm/package.json +12 -12
- package/node_modules/tinyexec/README.md +9 -1
- package/node_modules/tinyexec/dist/main.d.mts +22 -7
- package/node_modules/tinyexec/dist/main.mjs +189 -491
- package/node_modules/tinyexec/package.json +14 -16
- package/package.json +37 -30
- package/dist/_virtual/_rolldown/runtime.mjs +0 -32
- package/dist/build.d.mts +0 -19
- package/dist/build.d.mts.map +0 -1
- package/dist/build.mjs +0 -141
- package/dist/build.mjs.map +0 -1
- package/dist/components/Divider.vue +0 -133
- package/dist/components/Image.vue +0 -70
- package/dist/components/Overlap.vue +0 -80
- package/dist/components/utils.d.mts +0 -5
- package/dist/components/utils.d.mts.map +0 -1
- package/dist/components/utils.mjs +0 -9
- package/dist/components/utils.mjs.map +0 -1
- package/dist/composables/defineConfig.d.mts +0 -14
- package/dist/composables/defineConfig.d.mts.map +0 -1
- package/dist/composables/defineConfig.mjs.map +0 -1
- package/dist/composables/renderContext.d.mts +0 -24
- package/dist/composables/renderContext.d.mts.map +0 -1
- package/dist/composables/renderContext.mjs +0 -6
- package/dist/composables/renderContext.mjs.map +0 -1
- package/dist/composables/useConfig.d.mts +0 -9
- package/dist/composables/useConfig.d.mts.map +0 -1
- package/dist/composables/useConfig.mjs +0 -13
- package/dist/composables/useConfig.mjs.map +0 -1
- package/dist/composables/useDoctype.d.mts.map +0 -1
- package/dist/composables/useDoctype.mjs.map +0 -1
- package/dist/composables/useEvent.d.mts.map +0 -1
- package/dist/composables/useEvent.mjs.map +0 -1
- package/dist/composables/usePlaintext.d.mts.map +0 -1
- package/dist/composables/usePlaintext.mjs.map +0 -1
- package/dist/composables/usePreviewText.d.mts +0 -24
- package/dist/composables/usePreviewText.d.mts.map +0 -1
- package/dist/composables/usePreviewText.mjs +0 -29
- package/dist/composables/usePreviewText.mjs.map +0 -1
- package/dist/config/defaults.d.mts.map +0 -1
- package/dist/config/defaults.mjs.map +0 -1
- package/dist/config/index.d.mts +0 -15
- package/dist/config/index.d.mts.map +0 -1
- package/dist/config/index.mjs.map +0 -1
- package/dist/events/index.d.mts.map +0 -1
- package/dist/events/index.mjs.map +0 -1
- package/dist/index.d.mts +0 -31
- package/dist/index.mjs +0 -31
- package/dist/node_modules/picomatch/index.mjs +0 -13
- package/dist/node_modules/picomatch/index.mjs.map +0 -1
- package/dist/node_modules/picomatch/lib/constants.mjs +0 -174
- package/dist/node_modules/picomatch/lib/constants.mjs.map +0 -1
- package/dist/node_modules/picomatch/lib/parse.mjs +0 -1067
- package/dist/node_modules/picomatch/lib/parse.mjs.map +0 -1
- package/dist/node_modules/picomatch/lib/picomatch.mjs +0 -304
- package/dist/node_modules/picomatch/lib/picomatch.mjs.map +0 -1
- package/dist/node_modules/picomatch/lib/scan.mjs +0 -296
- package/dist/node_modules/picomatch/lib/scan.mjs.map +0 -1
- package/dist/node_modules/picomatch/lib/utils.mjs +0 -53
- package/dist/node_modules/picomatch/lib/utils.mjs.map +0 -1
- package/dist/plaintext.d.mts.map +0 -1
- package/dist/plaintext.mjs.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/plugin.mjs.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.d.mts.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
- package/dist/plugins/postcss/pruneVars.d.mts.map +0 -1
- package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.d.mts.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.d.mts.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
- package/dist/render/createRenderer.d.mts.map +0 -1
- package/dist/render/createRenderer.mjs +0 -286
- package/dist/render/createRenderer.mjs.map +0 -1
- package/dist/render/index.d.mts +0 -26
- package/dist/render/index.d.mts.map +0 -1
- package/dist/render/index.mjs +0 -46
- package/dist/render/index.mjs.map +0 -1
- package/dist/serve.d.mts.map +0 -1
- package/dist/serve.mjs.map +0 -1
- package/dist/server/compatibility.d.mts +0 -5
- package/dist/server/compatibility.d.mts.map +0 -1
- package/dist/server/compatibility.mjs +0 -97
- package/dist/server/compatibility.mjs.map +0 -1
- package/dist/server/email.d.mts.map +0 -1
- package/dist/server/email.mjs.map +0 -1
- package/dist/server/linter.d.mts +0 -5
- package/dist/server/linter.d.mts.map +0 -1
- package/dist/server/linter.mjs +0 -189
- package/dist/server/linter.mjs.map +0 -1
- package/dist/transformers/addAttributes.d.mts +0 -32
- package/dist/transformers/addAttributes.d.mts.map +0 -1
- package/dist/transformers/addAttributes.mjs.map +0 -1
- package/dist/transformers/attributeToStyle.d.mts +0 -25
- package/dist/transformers/attributeToStyle.d.mts.map +0 -1
- package/dist/transformers/attributeToStyle.mjs +0 -80
- package/dist/transformers/attributeToStyle.mjs.map +0 -1
- package/dist/transformers/base.d.mts +0 -8
- package/dist/transformers/base.d.mts.map +0 -1
- package/dist/transformers/base.mjs.map +0 -1
- package/dist/transformers/entities.d.mts +0 -8
- package/dist/transformers/entities.d.mts.map +0 -1
- package/dist/transformers/entities.mjs +0 -41
- package/dist/transformers/entities.mjs.map +0 -1
- package/dist/transformers/filters/defaults.d.mts.map +0 -1
- package/dist/transformers/filters/defaults.mjs.map +0 -1
- package/dist/transformers/filters/index.d.mts +0 -22
- package/dist/transformers/filters/index.d.mts.map +0 -1
- package/dist/transformers/filters/index.mjs +0 -67
- package/dist/transformers/filters/index.mjs.map +0 -1
- package/dist/transformers/format.d.mts +0 -15
- package/dist/transformers/format.d.mts.map +0 -1
- package/dist/transformers/format.mjs +0 -26
- package/dist/transformers/format.mjs.map +0 -1
- package/dist/transformers/index.d.mts.map +0 -1
- package/dist/transformers/index.mjs +0 -81
- package/dist/transformers/index.mjs.map +0 -1
- package/dist/transformers/inlineCSS.d.mts +0 -17
- package/dist/transformers/inlineCSS.d.mts.map +0 -1
- package/dist/transformers/inlineCSS.mjs +0 -70
- package/dist/transformers/inlineCSS.mjs.map +0 -1
- package/dist/transformers/inlineLink.d.mts +0 -14
- package/dist/transformers/inlineLink.d.mts.map +0 -1
- package/dist/transformers/inlineLink.mjs.map +0 -1
- package/dist/transformers/minify.d.mts +0 -17
- package/dist/transformers/minify.d.mts.map +0 -1
- package/dist/transformers/minify.mjs +0 -24
- package/dist/transformers/minify.mjs.map +0 -1
- package/dist/transformers/purgeCSS.d.mts +0 -23
- package/dist/transformers/purgeCSS.d.mts.map +0 -1
- package/dist/transformers/purgeCSS.mjs +0 -132
- package/dist/transformers/purgeCSS.mjs.map +0 -1
- package/dist/transformers/removeAttributes.d.mts +0 -31
- package/dist/transformers/removeAttributes.d.mts.map +0 -1
- package/dist/transformers/removeAttributes.mjs +0 -63
- package/dist/transformers/removeAttributes.mjs.map +0 -1
- package/dist/transformers/replaceStrings.d.mts.map +0 -1
- package/dist/transformers/replaceStrings.mjs.map +0 -1
- package/dist/transformers/safeClassNames.d.mts +0 -22
- package/dist/transformers/safeClassNames.d.mts.map +0 -1
- package/dist/transformers/safeClassNames.mjs.map +0 -1
- package/dist/transformers/shorthandCSS.d.mts +0 -24
- package/dist/transformers/shorthandCSS.d.mts.map +0 -1
- package/dist/transformers/shorthandCSS.mjs +0 -48
- package/dist/transformers/shorthandCSS.mjs.map +0 -1
- package/dist/transformers/sixHex.d.mts +0 -16
- package/dist/transformers/sixHex.d.mts.map +0 -1
- package/dist/transformers/sixHex.mjs +0 -30
- package/dist/transformers/sixHex.mjs.map +0 -1
- package/dist/transformers/tailwindcss.d.mts.map +0 -1
- package/dist/transformers/tailwindcss.mjs.map +0 -1
- package/dist/transformers/urlQuery.d.mts +0 -24
- package/dist/transformers/urlQuery.d.mts.map +0 -1
- package/dist/transformers/urlQuery.mjs +0 -65
- package/dist/transformers/urlQuery.mjs.map +0 -1
- package/dist/types/config.d.mts.map +0 -1
- package/dist/types/config.mjs +0 -1
- package/dist/types/index.d.mts +0 -2
- package/dist/types/index.mjs +0 -1
- package/dist/utils/ast/index.d.mts +0 -4
- package/dist/utils/ast/index.mjs +0 -5
- package/dist/utils/ast/parser.d.mts.map +0 -1
- package/dist/utils/ast/parser.mjs.map +0 -1
- package/dist/utils/ast/serializer.d.mts.map +0 -1
- package/dist/utils/ast/serializer.mjs +0 -37
- package/dist/utils/ast/serializer.mjs.map +0 -1
- package/dist/utils/ast/walker.d.mts.map +0 -1
- package/dist/utils/ast/walker.mjs.map +0 -1
- package/dist/utils/detect.d.mts.map +0 -1
- package/dist/utils/detect.mjs.map +0 -1
- package/dist/utils/url.d.mts.map +0 -1
- package/dist/utils/url.mjs.map +0 -1
- package/node_modules/@clack/core/dist/index.mjs.map +0 -1
- package/node_modules/@clack/prompts/dist/index.mjs.map +0 -1
- package/node_modules/fast-wrap-ansi/lib/main.js.map +0 -1
- package/node_modules/maizzle/dist/commands/make/stubs/layout.vue +0 -39
- package/node_modules/tinyexec/dist/LICENSES.txt +0 -83
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
</picture>
|
|
8
8
|
</a>
|
|
9
9
|
</p>
|
|
10
|
-
<p>
|
|
10
|
+
<p>The modern email development framework</p>
|
|
11
11
|
<div>
|
|
12
12
|
|
|
13
13
|
[![Version][npm-version-shield]][npm]
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
|
|
21
21
|
## About
|
|
22
22
|
|
|
23
|
-
> **Note:** This repository contains the core code of the Maizzle framework. If you want to
|
|
23
|
+
> **Note:** This repository contains the core code of the Maizzle framework. If you want to start building HTML emails using Maizzle, visit the [Starter repository](https://github.com/maizzle/maizzle).
|
|
24
24
|
|
|
25
|
-
Maizzle is a framework
|
|
25
|
+
Maizzle is a Vite-powered framework for building HTML emails with Vue and Tailwind CSS.
|
|
26
26
|
|
|
27
27
|
## Documentation
|
|
28
28
|
|
package/bin/maizzle.mjs
CHANGED
|
@@ -5,6 +5,6 @@ import { fileURLToPath } from 'node:url'
|
|
|
5
5
|
|
|
6
6
|
const jiti = createJiti(fileURLToPath(import.meta.url), { interopDefault: true })
|
|
7
7
|
const { default: bootstrap } = await jiti.import('maizzle')
|
|
8
|
-
const framework = await jiti.import('../dist/index.
|
|
8
|
+
const framework = await jiti.import('../dist/index.js')
|
|
9
9
|
|
|
10
10
|
await bootstrap(framework)
|
package/dist/build.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { MaizzleConfig } from "./types/config.js";
|
|
2
|
+
//#region src/build.d.ts
|
|
3
|
+
interface BuildResult {
|
|
4
|
+
files: string[];
|
|
5
|
+
config: MaizzleConfig;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build all SFC email templates to HTML files.
|
|
9
|
+
*
|
|
10
|
+
* Creates a single Renderer instance, then loops through each template
|
|
11
|
+
* calling render → transformers → write to disk.
|
|
12
|
+
*
|
|
13
|
+
* Pass a `Partial<MaizzleConfig>` to override config inline, or a string
|
|
14
|
+
* to load config from a specific file path. Omit to load `maizzle.config`
|
|
15
|
+
* from the working directory.
|
|
16
|
+
*/
|
|
17
|
+
declare function build(configInput?: Partial<MaizzleConfig> | string): Promise<BuildResult>;
|
|
18
|
+
/**
|
|
19
|
+
* Decide whether to build in parallel and with how many workers.
|
|
20
|
+
*
|
|
21
|
+
* `config.parallel`:
|
|
22
|
+
* - omitted → parallel when `count > 50`, min(CPU count − 1, 8) workers
|
|
23
|
+
* - `true` → always parallel (ignores threshold), default workers
|
|
24
|
+
* - `false` → always sequential
|
|
25
|
+
* - `{ workers, threshold }` → parallel when `count > threshold` (default 50),
|
|
26
|
+
* using `workers` threads (default min(CPU count − 1, 8))
|
|
27
|
+
*
|
|
28
|
+
* Workers reload the config file to recover function hooks, so parallel only
|
|
29
|
+
* applies to file-based configs (a path or the default cwd config) — an inline
|
|
30
|
+
* config object has no file to reload and always builds sequentially.
|
|
31
|
+
*/
|
|
32
|
+
declare function resolveParallel(config: MaizzleConfig, count: number, configInput: Partial<MaizzleConfig> | string | undefined): {
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
workers: number;
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
export { BuildResult, build, resolveParallel };
|
|
38
|
+
//# sourceMappingURL=build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","names":[],"sources":["../src/build.ts"],"mappings":";;UAaiB,WAAA;EACf,KAAA;EACA,MAAA,EAAQ,aAAa;AAAA;;;;;;;;AAAA;AAavB;;iBAAsB,KAAA,CAAM,WAAA,GAAc,OAAA,CAAQ,aAAA,aAA0B,OAAA,CAAQ,WAAA;;;;;;;;;;;;;AAAW;AA0H/F;iBAAgB,eAAA,CACd,MAAA,EAAQ,aAAA,EACR,KAAA,UACA,WAAA,EAAa,OAAA,CAAQ,aAAA;EAClB,OAAA;EAAkB,OAAA;AAAA"}
|
package/dist/build.js
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { resolveConfig } from "./config/index.js";
|
|
2
|
+
import { EventManager } from "./events/index.js";
|
|
3
|
+
import { normalizeComponentSources } from "./utils/componentSources.js";
|
|
4
|
+
import { createRenderer } from "./render/createRenderer.js";
|
|
5
|
+
import { buildTemplate, computeContentBase } from "./render/buildTemplate.js";
|
|
6
|
+
import { cpSync, existsSync, mkdirSync, rmSync } from "node:fs";
|
|
7
|
+
import { dirname, join, parse, relative, resolve, sep } from "node:path";
|
|
8
|
+
import { fileURLToPath } from "node:url";
|
|
9
|
+
import { availableParallelism } from "node:os";
|
|
10
|
+
import { glob } from "tinyglobby";
|
|
11
|
+
import ora from "ora";
|
|
12
|
+
//#region src/build.ts
|
|
13
|
+
/**
|
|
14
|
+
* Build all SFC email templates to HTML files.
|
|
15
|
+
*
|
|
16
|
+
* Creates a single Renderer instance, then loops through each template
|
|
17
|
+
* calling render → transformers → write to disk.
|
|
18
|
+
*
|
|
19
|
+
* Pass a `Partial<MaizzleConfig>` to override config inline, or a string
|
|
20
|
+
* to load config from a specific file path. Omit to load `maizzle.config`
|
|
21
|
+
* from the working directory.
|
|
22
|
+
*/
|
|
23
|
+
async function build(configInput) {
|
|
24
|
+
const start = Date.now();
|
|
25
|
+
const spinner = ora({
|
|
26
|
+
text: "Building templates...",
|
|
27
|
+
spinner: "circleHalves"
|
|
28
|
+
}).start();
|
|
29
|
+
try {
|
|
30
|
+
const config = await resolveConfig(configInput);
|
|
31
|
+
const events = new EventManager();
|
|
32
|
+
events.registerConfig(config);
|
|
33
|
+
await events.fireBeforeCreate({ config });
|
|
34
|
+
const outputPath = resolve(config.output?.path ?? "dist");
|
|
35
|
+
const outputExtension = config.output?.extension ?? "html";
|
|
36
|
+
const contentPatterns = config.content ?? ["emails/**/*.vue"];
|
|
37
|
+
const contentBase = computeContentBase(contentPatterns);
|
|
38
|
+
const templateFiles = await glob(contentPatterns);
|
|
39
|
+
if (templateFiles.length === 0) {
|
|
40
|
+
spinner.succeed("No templates found");
|
|
41
|
+
return {
|
|
42
|
+
files: [],
|
|
43
|
+
config
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const cwd = process.cwd();
|
|
47
|
+
if (outputPath === parse(outputPath).root || outputPath === cwd || cwd.startsWith(outputPath + sep)) throw new Error(`Refusing to clear output path "${outputPath}": it is the filesystem root, the current working directory, or a parent of it. Set output.path to a subdirectory like "dist".`);
|
|
48
|
+
if (existsSync(outputPath)) rmSync(outputPath, {
|
|
49
|
+
recursive: true,
|
|
50
|
+
force: true
|
|
51
|
+
});
|
|
52
|
+
const outputFiles = [];
|
|
53
|
+
let droppedAfterBuild = 0;
|
|
54
|
+
const parallel = resolveParallel(config, templateFiles.length, configInput);
|
|
55
|
+
if (parallel.enabled) {
|
|
56
|
+
spinner.text = `Building ${templateFiles.length} templates across ${parallel.workers} workers...`;
|
|
57
|
+
const result = await runParallelBuild({
|
|
58
|
+
templateFiles,
|
|
59
|
+
workers: parallel.workers,
|
|
60
|
+
config,
|
|
61
|
+
configInput,
|
|
62
|
+
outputPath,
|
|
63
|
+
outputExtension,
|
|
64
|
+
contentBase
|
|
65
|
+
});
|
|
66
|
+
outputFiles.push(...result.files);
|
|
67
|
+
droppedAfterBuild = result.sfcAfterBuildCount;
|
|
68
|
+
await copyStatic(config, outputPath);
|
|
69
|
+
await events.fireAfterBuild({
|
|
70
|
+
files: outputFiles,
|
|
71
|
+
config
|
|
72
|
+
});
|
|
73
|
+
} else {
|
|
74
|
+
const renderer = await createRenderer({
|
|
75
|
+
markdown: config.markdown,
|
|
76
|
+
root: config.root,
|
|
77
|
+
componentDirs: normalizeComponentSources(config.components?.source, process.cwd()),
|
|
78
|
+
vite: config.vite
|
|
79
|
+
});
|
|
80
|
+
try {
|
|
81
|
+
for (const templatePath of templateFiles) {
|
|
82
|
+
const { files } = await buildTemplate(templatePath, {
|
|
83
|
+
config,
|
|
84
|
+
renderer,
|
|
85
|
+
events,
|
|
86
|
+
outputPath,
|
|
87
|
+
outputExtension,
|
|
88
|
+
contentBase
|
|
89
|
+
});
|
|
90
|
+
outputFiles.push(...files);
|
|
91
|
+
}
|
|
92
|
+
await copyStatic(config, outputPath);
|
|
93
|
+
await events.fireAfterBuild({
|
|
94
|
+
files: outputFiles,
|
|
95
|
+
config
|
|
96
|
+
});
|
|
97
|
+
} finally {
|
|
98
|
+
await renderer.close();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (droppedAfterBuild > 0) console.warn(`[maizzle] Skipped ${droppedAfterBuild} SFC-registered afterBuild handler(s): afterBuild can't run inside a parallel build worker. Move build-completion logic to the config's afterBuild hook.`);
|
|
102
|
+
const duration = ((Date.now() - start) / 1e3).toFixed(2);
|
|
103
|
+
const count = outputFiles.length;
|
|
104
|
+
spinner.stopAndPersist({
|
|
105
|
+
symbol: "✅",
|
|
106
|
+
text: `Built ${count} template${count !== 1 ? "s" : ""} in ${duration}s`
|
|
107
|
+
});
|
|
108
|
+
return {
|
|
109
|
+
files: outputFiles,
|
|
110
|
+
config
|
|
111
|
+
};
|
|
112
|
+
} catch (err) {
|
|
113
|
+
if (spinner.isSpinning) spinner.fail("Build failed");
|
|
114
|
+
throw err;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Default template count above which parallel build turns on. Benchmarked
|
|
119
|
+
* crossover (with the worker cap below) is ~25 templates; 50 leaves margin so
|
|
120
|
+
* auto-parallel only kicks in where it's a reliable win across hardware.
|
|
121
|
+
* Override per project with `parallel: { threshold }`.
|
|
122
|
+
*/
|
|
123
|
+
const DEFAULT_PARALLEL_THRESHOLD = 50;
|
|
124
|
+
/**
|
|
125
|
+
* Default worker cap. Each worker runs a full Vite SSR renderer, so startup +
|
|
126
|
+
* contention outweighs added parallelism past ~8 — benchmarks showed 8 beating
|
|
127
|
+
* 12/16/23 at every size. Override with `parallel: { workers }`.
|
|
128
|
+
*/
|
|
129
|
+
const DEFAULT_MAX_WORKERS = 8;
|
|
130
|
+
/**
|
|
131
|
+
* Decide whether to build in parallel and with how many workers.
|
|
132
|
+
*
|
|
133
|
+
* `config.parallel`:
|
|
134
|
+
* - omitted → parallel when `count > 50`, min(CPU count − 1, 8) workers
|
|
135
|
+
* - `true` → always parallel (ignores threshold), default workers
|
|
136
|
+
* - `false` → always sequential
|
|
137
|
+
* - `{ workers, threshold }` → parallel when `count > threshold` (default 50),
|
|
138
|
+
* using `workers` threads (default min(CPU count − 1, 8))
|
|
139
|
+
*
|
|
140
|
+
* Workers reload the config file to recover function hooks, so parallel only
|
|
141
|
+
* applies to file-based configs (a path or the default cwd config) — an inline
|
|
142
|
+
* config object has no file to reload and always builds sequentially.
|
|
143
|
+
*/
|
|
144
|
+
function resolveParallel(config, count, configInput) {
|
|
145
|
+
const setting = config.parallel;
|
|
146
|
+
if (setting === false) return {
|
|
147
|
+
enabled: false,
|
|
148
|
+
workers: 0
|
|
149
|
+
};
|
|
150
|
+
if (!(typeof configInput === "string" || configInput == null)) return {
|
|
151
|
+
enabled: false,
|
|
152
|
+
workers: 0
|
|
153
|
+
};
|
|
154
|
+
const cpus = availableParallelism();
|
|
155
|
+
let maxWorkers = Math.min(Math.max(1, cpus - 1), DEFAULT_MAX_WORKERS);
|
|
156
|
+
let threshold = DEFAULT_PARALLEL_THRESHOLD;
|
|
157
|
+
const ignoreThreshold = setting === true;
|
|
158
|
+
if (typeof setting === "object" && setting !== null) {
|
|
159
|
+
if (typeof setting.workers === "number" && setting.workers > 0) maxWorkers = Math.floor(setting.workers);
|
|
160
|
+
if (typeof setting.threshold === "number" && setting.threshold >= 0) threshold = Math.floor(setting.threshold);
|
|
161
|
+
}
|
|
162
|
+
if (!ignoreThreshold && count <= threshold) return {
|
|
163
|
+
enabled: false,
|
|
164
|
+
workers: 0
|
|
165
|
+
};
|
|
166
|
+
const workers = Math.min(maxWorkers, count);
|
|
167
|
+
return {
|
|
168
|
+
enabled: workers >= 2 && count >= 2,
|
|
169
|
+
workers
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Run the build across worker threads. Each worker reloads the config (for its
|
|
174
|
+
* function hooks), builds its batch via the same `buildTemplate` as the
|
|
175
|
+
* sequential path, and returns the files it wrote. beforeCreate/afterBuild stay
|
|
176
|
+
* on the main thread (handled by the caller).
|
|
177
|
+
*/
|
|
178
|
+
async function runParallelBuild(opts) {
|
|
179
|
+
const { templateFiles, workers, config, configInput, outputPath, outputExtension, contentBase } = opts;
|
|
180
|
+
const { default: Tinypool } = await import("tinypool");
|
|
181
|
+
const workerPath = resolve(dirname(fileURLToPath(import.meta.url)), "render/parallel/worker.mjs");
|
|
182
|
+
const configPath = typeof configInput === "string" ? configInput : void 0;
|
|
183
|
+
const configData = JSON.parse(JSON.stringify(config));
|
|
184
|
+
const batches = shardEvenly(templateFiles, workers);
|
|
185
|
+
const pool = new Tinypool({
|
|
186
|
+
filename: workerPath,
|
|
187
|
+
minThreads: batches.length,
|
|
188
|
+
maxThreads: batches.length
|
|
189
|
+
});
|
|
190
|
+
try {
|
|
191
|
+
const results = await Promise.all(batches.map((templatePaths) => pool.run({
|
|
192
|
+
templatePaths,
|
|
193
|
+
configPath,
|
|
194
|
+
configData,
|
|
195
|
+
outputPath,
|
|
196
|
+
outputExtension,
|
|
197
|
+
contentBase
|
|
198
|
+
})));
|
|
199
|
+
return {
|
|
200
|
+
files: results.flatMap((r) => r.files),
|
|
201
|
+
sfcAfterBuildCount: results.reduce((n, r) => n + r.sfcAfterBuildCount, 0)
|
|
202
|
+
};
|
|
203
|
+
} finally {
|
|
204
|
+
await pool.destroy();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/** Round-robin items into up to `buckets` non-empty groups for even balance. */
|
|
208
|
+
function shardEvenly(items, buckets) {
|
|
209
|
+
const out = Array.from({ length: buckets }, () => []);
|
|
210
|
+
items.forEach((item, i) => out[i % buckets].push(item));
|
|
211
|
+
return out.filter((b) => b.length > 0);
|
|
212
|
+
}
|
|
213
|
+
async function copyStatic(config, outputPath) {
|
|
214
|
+
const sources = config.static?.source ?? ["public/**/*.*"];
|
|
215
|
+
const destination = config.static?.destination ?? "public";
|
|
216
|
+
const files = await glob(sources);
|
|
217
|
+
const bases = sources.filter((s) => !s.startsWith("!")).map(staticBase);
|
|
218
|
+
for (const file of files) {
|
|
219
|
+
const abs = resolve(file);
|
|
220
|
+
const destPath = join(outputPath, destination, relative(bases.filter((b) => abs === b || abs.startsWith(b + sep)).sort((a, b) => b.length - a.length)[0] ?? bases[0] ?? resolve("."), abs));
|
|
221
|
+
const destDir = dirname(destPath);
|
|
222
|
+
if (!existsSync(destDir)) mkdirSync(destDir, { recursive: true });
|
|
223
|
+
cpSync(file, destPath);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/** Absolute static (non-glob) prefix of a source pattern, used as the strip base. */
|
|
227
|
+
function staticBase(pattern) {
|
|
228
|
+
const staticPart = pattern.split(/[*{?[]/)[0];
|
|
229
|
+
return resolve(/[/\\]$/.test(staticPart) ? staticPart : dirname(staticPart));
|
|
230
|
+
}
|
|
231
|
+
//#endregion
|
|
232
|
+
export { build, resolveParallel };
|
|
233
|
+
|
|
234
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","names":["parsePath"],"sources":["../src/build.ts"],"sourcesContent":["import { mkdirSync, cpSync, existsSync, rmSync } from 'node:fs'\nimport { resolve, dirname, relative, join, parse as parsePath, sep } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { availableParallelism } from 'node:os'\nimport { glob } from 'tinyglobby'\nimport ora from 'ora'\nimport { resolveConfig } from './config/index.ts'\nimport { EventManager } from './events/index.ts'\nimport { createRenderer } from './render/createRenderer.ts'\nimport { normalizeComponentSources } from './utils/componentSources.ts'\nimport { buildTemplate, computeContentBase } from './render/buildTemplate.ts'\nimport type { MaizzleConfig } from './types/index.ts'\n\nexport interface BuildResult {\n files: string[]\n config: MaizzleConfig\n}\n\n/**\n * Build all SFC email templates to HTML files.\n *\n * Creates a single Renderer instance, then loops through each template\n * calling render → transformers → write to disk.\n *\n * Pass a `Partial<MaizzleConfig>` to override config inline, or a string\n * to load config from a specific file path. Omit to load `maizzle.config`\n * from the working directory.\n */\nexport async function build(configInput?: Partial<MaizzleConfig> | string): Promise<BuildResult> {\n const start = Date.now()\n const spinner = ora({ text: 'Building templates...', spinner: 'circleHalves' }).start()\n\n try {\n const config = await resolveConfig(configInput)\n\n const events = new EventManager()\n events.registerConfig(config)\n await events.fireBeforeCreate({ config })\n\n const outputPath = resolve(config.output?.path ?? 'dist')\n const outputExtension = config.output?.extension ?? 'html'\n\n const contentPatterns = config.content ?? ['emails/**/*.vue']\n const contentBase = computeContentBase(contentPatterns)\n const templateFiles = await glob(contentPatterns)\n\n if (templateFiles.length === 0) {\n spinner.succeed('No templates found')\n return { files: [], config }\n }\n\n // Clear the output directory before writing fresh output. Guard against a\n // misconfigured output.path (e.g. '.', '', '../..') that resolves to the\n // project root or a parent of it — rmSync would wipe the whole project.\n const cwd = process.cwd()\n if (outputPath === parsePath(outputPath).root || outputPath === cwd || cwd.startsWith(outputPath + sep)) {\n throw new Error(`Refusing to clear output path \"${outputPath}\": it is the filesystem root, the current working directory, or a parent of it. Set output.path to a subdirectory like \"dist\".`)\n }\n\n if (existsSync(outputPath)) {\n rmSync(outputPath, { recursive: true, force: true })\n }\n\n const outputFiles: string[] = []\n let droppedAfterBuild = 0\n\n const parallel = resolveParallel(config, templateFiles.length, configInput)\n\n if (parallel.enabled) {\n spinner.text = `Building ${templateFiles.length} templates across ${parallel.workers} workers...`\n\n const result = await runParallelBuild({\n templateFiles,\n workers: parallel.workers,\n config,\n configInput,\n outputPath,\n outputExtension,\n contentBase,\n })\n\n outputFiles.push(...result.files)\n droppedAfterBuild = result.sfcAfterBuildCount\n\n await copyStatic(config, outputPath)\n await events.fireAfterBuild({ files: outputFiles, config })\n } else {\n const renderer = await createRenderer({ markdown: config.markdown, root: config.root, componentDirs: normalizeComponentSources(config.components?.source, process.cwd()), vite: config.vite })\n\n try {\n for (const templatePath of templateFiles) {\n const { files } = await buildTemplate(templatePath, { config, renderer, events, outputPath, outputExtension, contentBase })\n outputFiles.push(...files)\n }\n\n await copyStatic(config, outputPath)\n await events.fireAfterBuild({ files: outputFiles, config })\n } finally {\n await renderer.close()\n }\n }\n\n if (droppedAfterBuild > 0) {\n console.warn(`[maizzle] Skipped ${droppedAfterBuild} SFC-registered afterBuild handler(s): afterBuild can't run inside a parallel build worker. Move build-completion logic to the config's afterBuild hook.`)\n }\n\n const duration = ((Date.now() - start) / 1000).toFixed(2)\n const count = outputFiles.length\n spinner.stopAndPersist({\n symbol: '✅',\n text: `Built ${count} template${count !== 1 ? 's' : ''} in ${duration}s`,\n })\n\n return { files: outputFiles, config }\n } catch (err) {\n // Stop the spinner so a thrown error doesn't leave it spinning forever.\n if (spinner.isSpinning) spinner.fail('Build failed')\n throw err\n }\n}\n\n/**\n * Default template count above which parallel build turns on. Benchmarked\n * crossover (with the worker cap below) is ~25 templates; 50 leaves margin so\n * auto-parallel only kicks in where it's a reliable win across hardware.\n * Override per project with `parallel: { threshold }`.\n */\nconst DEFAULT_PARALLEL_THRESHOLD = 50\n\n/**\n * Default worker cap. Each worker runs a full Vite SSR renderer, so startup +\n * contention outweighs added parallelism past ~8 — benchmarks showed 8 beating\n * 12/16/23 at every size. Override with `parallel: { workers }`.\n */\nconst DEFAULT_MAX_WORKERS = 8\n\n/**\n * Decide whether to build in parallel and with how many workers.\n *\n * `config.parallel`:\n * - omitted → parallel when `count > 50`, min(CPU count − 1, 8) workers\n * - `true` → always parallel (ignores threshold), default workers\n * - `false` → always sequential\n * - `{ workers, threshold }` → parallel when `count > threshold` (default 50),\n * using `workers` threads (default min(CPU count − 1, 8))\n *\n * Workers reload the config file to recover function hooks, so parallel only\n * applies to file-based configs (a path or the default cwd config) — an inline\n * config object has no file to reload and always builds sequentially.\n */\nexport function resolveParallel(\n config: MaizzleConfig,\n count: number,\n configInput: Partial<MaizzleConfig> | string | undefined,\n): { enabled: boolean; workers: number } {\n const setting = config.parallel\n if (setting === false) return { enabled: false, workers: 0 }\n\n const fileBased = typeof configInput === 'string' || configInput == null\n if (!fileBased) return { enabled: false, workers: 0 }\n\n const cpus = availableParallelism()\n const defaultWorkers = Math.min(Math.max(1, cpus - 1), DEFAULT_MAX_WORKERS)\n\n let maxWorkers = defaultWorkers\n let threshold = DEFAULT_PARALLEL_THRESHOLD\n // `true` opts in regardless of count; object/omitted stay threshold-gated.\n const ignoreThreshold = setting === true\n\n if (typeof setting === 'object' && setting !== null) {\n if (typeof setting.workers === 'number' && setting.workers > 0) maxWorkers = Math.floor(setting.workers)\n if (typeof setting.threshold === 'number' && setting.threshold >= 0) threshold = Math.floor(setting.threshold)\n }\n\n if (!ignoreThreshold && count <= threshold) return { enabled: false, workers: 0 }\n\n const workers = Math.min(maxWorkers, count)\n return { enabled: workers >= 2 && count >= 2, workers }\n}\n\n/**\n * Run the build across worker threads. Each worker reloads the config (for its\n * function hooks), builds its batch via the same `buildTemplate` as the\n * sequential path, and returns the files it wrote. beforeCreate/afterBuild stay\n * on the main thread (handled by the caller).\n */\nasync function runParallelBuild(opts: {\n templateFiles: string[]\n workers: number\n config: MaizzleConfig\n configInput: Partial<MaizzleConfig> | string | undefined\n outputPath: string\n outputExtension: string\n contentBase: string\n}): Promise<{ files: string[]; sfcAfterBuildCount: number }> {\n const { templateFiles, workers, config, configInput, outputPath, outputExtension, contentBase } = opts\n\n const { default: Tinypool } = await import('tinypool')\n const workerPath = resolve(dirname(fileURLToPath(import.meta.url)), 'render/parallel/worker.mjs')\n\n const configPath = typeof configInput === 'string' ? configInput : undefined\n // Serializable snapshot of the post-beforeCreate config (functions dropped).\n const configData = JSON.parse(JSON.stringify(config)) as Partial<MaizzleConfig>\n\n const batches = shardEvenly(templateFiles, workers)\n\n const pool = new Tinypool({ filename: workerPath, minThreads: batches.length, maxThreads: batches.length })\n\n try {\n const results = await Promise.all(\n batches.map(templatePaths => pool.run({\n templatePaths,\n configPath,\n configData,\n outputPath,\n outputExtension,\n contentBase,\n })),\n )\n\n return {\n files: results.flatMap(r => r.files),\n sfcAfterBuildCount: results.reduce((n, r) => n + r.sfcAfterBuildCount, 0),\n }\n } finally {\n await pool.destroy()\n }\n}\n\n/** Round-robin items into up to `buckets` non-empty groups for even balance. */\nfunction shardEvenly<T>(items: T[], buckets: number): T[][] {\n const out: T[][] = Array.from({ length: buckets }, () => [])\n items.forEach((item, i) => out[i % buckets].push(item))\n return out.filter(b => b.length > 0)\n}\n\nasync function copyStatic(config: MaizzleConfig, outputPath: string): Promise<void> {\n const sources = config.static?.source ?? ['public/**/*.*']\n const destination = config.static?.destination ?? 'public'\n\n // One glob call so negation patterns still apply across the whole set.\n const files = await glob(sources)\n\n // Absolute base dir to strip, per positive source pattern. Each file keeps\n // the structure under its own pattern's base — using only sources[0] sends\n // files from other roots to the wrong place (or escaping the output dir).\n const bases = sources.filter(s => !s.startsWith('!')).map(staticBase)\n\n for (const file of files) {\n const abs = resolve(file)\n const base = bases\n .filter(b => abs === b || abs.startsWith(b + sep))\n .sort((a, b) => b.length - a.length)[0] ?? bases[0] ?? resolve('.')\n\n const destPath = join(outputPath, destination, relative(base, abs))\n const destDir = dirname(destPath)\n\n if (!existsSync(destDir)) {\n mkdirSync(destDir, { recursive: true })\n }\n\n cpSync(file, destPath)\n }\n}\n\n/** Absolute static (non-glob) prefix of a source pattern, used as the strip base. */\nfunction staticBase(pattern: string): string {\n const staticPart = pattern.split(/[*{?[]/)[0]\n // Treat both separators as trailing: resolved patterns use '\\' on Windows.\n return resolve(/[/\\\\]$/.test(staticPart) ? staticPart : dirname(staticPart))\n}\n"],"mappings":"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"}
|
package/dist/components/Body.vue
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import { createStaticVNode, inject, useAttrs, useSlots } from 'vue'
|
|
3
3
|
import type { PropType } from 'vue'
|
|
4
|
+
import { outlookFallbackProp } from './utils.ts'
|
|
5
|
+
import { useOutlookFallback } from '../composables/useOutlookFallback'
|
|
4
6
|
|
|
5
7
|
defineOptions({ inheritAttrs: false })
|
|
6
8
|
|
|
@@ -65,11 +67,35 @@ const props = defineProps({
|
|
|
65
67
|
ariaLabel: {
|
|
66
68
|
type: String,
|
|
67
69
|
default: undefined
|
|
68
|
-
}
|
|
70
|
+
},
|
|
71
|
+
/**
|
|
72
|
+
* Toggle Outlook (MSO) and VML fallback markup for this
|
|
73
|
+
* component and all descendants.
|
|
74
|
+
*
|
|
75
|
+
* When `false`, skips MSO ghost tables, VML shapes,
|
|
76
|
+
* `xmlns:v`/`xmlns:o` attributes, and mso-specific CSS
|
|
77
|
+
* in all built-in components.
|
|
78
|
+
*
|
|
79
|
+
* @default true
|
|
80
|
+
*/
|
|
81
|
+
outlookFallback: outlookFallbackProp,
|
|
69
82
|
})
|
|
70
83
|
|
|
84
|
+
const outlookFallback = useOutlookFallback(props.outlookFallback)
|
|
85
|
+
|
|
71
86
|
const htmlLang = inject<string>('htmlLang', 'en')
|
|
72
87
|
|
|
88
|
+
const msoBody = `<!--[if mso]>
|
|
89
|
+
<xml>
|
|
90
|
+
<o:OfficeDocumentSettings>
|
|
91
|
+
<o:PixelsPerInch>96</o:PixelsPerInch>
|
|
92
|
+
</o:OfficeDocumentSettings>
|
|
93
|
+
<w:WordDocument>
|
|
94
|
+
<w:DontUseAdvancedTypographyReadingMail />
|
|
95
|
+
</w:WordDocument>
|
|
96
|
+
</xml>
|
|
97
|
+
<![endif]-->`
|
|
98
|
+
|
|
73
99
|
const render = () => {
|
|
74
100
|
const extraAttrs = Object.entries(attrs)
|
|
75
101
|
.map(([key, value]) => value === true ? key : `${key}="${value}"`)
|
|
@@ -78,10 +104,12 @@ const render = () => {
|
|
|
78
104
|
const lang = props.xmlLang ?? htmlLang
|
|
79
105
|
|
|
80
106
|
const parts = [
|
|
81
|
-
`xml:lang="${lang}"`,
|
|
82
107
|
`dir="${props.dir}"`,
|
|
83
|
-
'style="margin: 0; padding: 0; width: 100%; word-break: break-word;"',
|
|
108
|
+
'style="margin: 0; padding: 0; width: 100%; height: 100%; word-break: break-word;"',
|
|
84
109
|
]
|
|
110
|
+
if (outlookFallback) {
|
|
111
|
+
parts.unshift(`xml:lang="${lang}"`)
|
|
112
|
+
}
|
|
85
113
|
|
|
86
114
|
if (extraAttrs) {
|
|
87
115
|
parts.push(extraAttrs)
|
|
@@ -98,6 +126,7 @@ const render = () => {
|
|
|
98
126
|
|
|
99
127
|
return [
|
|
100
128
|
createStaticVNode(`<body ${parts.join(' ')}>`, 1),
|
|
129
|
+
outlookFallback ? createStaticVNode(`<span style="display: none">${msoBody}</span>`, 1) : null,
|
|
101
130
|
createStaticVNode(`<div ${articleParts}>`, 1),
|
|
102
131
|
slots.default?.(),
|
|
103
132
|
createStaticVNode('</div>', 1),
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { computed, useAttrs } from 'vue'
|
|
2
|
+
import { computed, useAttrs, createStaticVNode } from 'vue'
|
|
3
3
|
import type { PropType } from 'vue'
|
|
4
4
|
import { twMerge } from 'tailwind-merge'
|
|
5
|
-
import
|
|
5
|
+
import { outlookFallbackProp } from './utils.ts'
|
|
6
|
+
import { useOutlookFallback } from '../composables/useOutlookFallback'
|
|
6
7
|
|
|
7
8
|
defineOptions({ inheritAttrs: false })
|
|
8
9
|
|
|
@@ -35,24 +36,6 @@ const props = defineProps({
|
|
|
35
36
|
type: String as PropType<'left' | 'center' | 'right' | null>,
|
|
36
37
|
default: null
|
|
37
38
|
},
|
|
38
|
-
/**
|
|
39
|
-
* Background color for `solid` and `outline` variants.
|
|
40
|
-
* Also used as the text color for `outline` and `ghost` variants when `color` is not set.
|
|
41
|
-
* @default '#4338ca'
|
|
42
|
-
*/
|
|
43
|
-
bgColor: {
|
|
44
|
-
type: String,
|
|
45
|
-
default: '#4338ca'
|
|
46
|
-
},
|
|
47
|
-
/**
|
|
48
|
-
* Explicit text color. When omitted, `solid` buttons use `#fffffe`
|
|
49
|
-
* and all other variants fall back to `bgColor`.
|
|
50
|
-
* @default null
|
|
51
|
-
*/
|
|
52
|
-
color: {
|
|
53
|
-
type: String,
|
|
54
|
-
default: null
|
|
55
|
-
},
|
|
56
39
|
/**
|
|
57
40
|
* `mso-text-raise` value applied to the inner `<span>` elements.
|
|
58
41
|
* Controls vertical text alignment inside the button in old Outlook.
|
|
@@ -103,9 +86,41 @@ const props = defineProps({
|
|
|
103
86
|
iconClass: {
|
|
104
87
|
type: String,
|
|
105
88
|
default: ''
|
|
106
|
-
}
|
|
89
|
+
},
|
|
90
|
+
/**
|
|
91
|
+
* Alt text for the icon image.
|
|
92
|
+
* @default ''
|
|
93
|
+
*/
|
|
94
|
+
iconAlt: {
|
|
95
|
+
type: String,
|
|
96
|
+
default: ''
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* Horizontal padding in old Outlook, applied as `mso-font-width` on the
|
|
100
|
+
* outer spacer `<i>` elements. Accepts a number, a numeric string, or a
|
|
101
|
+
* string with `%`. Bare numbers are treated as percentages. Effective
|
|
102
|
+
* range up to 500%.
|
|
103
|
+
* @default 150
|
|
104
|
+
*/
|
|
105
|
+
msoPx: {
|
|
106
|
+
type: [String, Number],
|
|
107
|
+
default: 150
|
|
108
|
+
},
|
|
109
|
+
/**
|
|
110
|
+
* Toggle Outlook (MSO) and VML fallback markup for this
|
|
111
|
+
* component and all descendants.
|
|
112
|
+
*
|
|
113
|
+
* When `false`, skips MSO ghost tables, VML shapes,
|
|
114
|
+
* `xmlns:v`/`xmlns:o` attributes, and mso-specific CSS
|
|
115
|
+
* in all built-in components.
|
|
116
|
+
*
|
|
117
|
+
* @default true
|
|
118
|
+
*/
|
|
119
|
+
outlookFallback: outlookFallbackProp,
|
|
107
120
|
})
|
|
108
121
|
|
|
122
|
+
const outlookFallback = useOutlookFallback(props.outlookFallback)
|
|
123
|
+
|
|
109
124
|
const parsedIconWidth = computed(() => parseInt(String(props.iconWidth), 10))
|
|
110
125
|
|
|
111
126
|
const alignClass = computed(() => props.align ? ({
|
|
@@ -114,78 +129,92 @@ const alignClass = computed(() => props.align ? ({
|
|
|
114
129
|
right: 'text-right',
|
|
115
130
|
})[props.align] || '' : '')
|
|
116
131
|
|
|
117
|
-
const
|
|
118
|
-
if (props.color) return props.color
|
|
119
|
-
|
|
120
|
-
return props.variant === 'solid' ? '#fffffe' : props.bgColor
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
const styles = computed(() => {
|
|
132
|
+
const baseClasses = computed(() => {
|
|
124
133
|
if (props.variant === 'link') {
|
|
125
|
-
return
|
|
126
|
-
'text-decoration: none;',
|
|
127
|
-
`color: ${textColor.value};`,
|
|
128
|
-
].join('')
|
|
134
|
+
return 'no-underline text-gray-950'
|
|
129
135
|
}
|
|
130
136
|
|
|
131
|
-
const
|
|
132
|
-
'
|
|
133
|
-
'
|
|
134
|
-
'
|
|
135
|
-
'
|
|
136
|
-
'
|
|
137
|
-
'
|
|
138
|
-
|
|
137
|
+
const classes = [
|
|
138
|
+
'inline-block',
|
|
139
|
+
'no-underline',
|
|
140
|
+
'px-6',
|
|
141
|
+
'py-4',
|
|
142
|
+
'text-base',
|
|
143
|
+
'leading-none',
|
|
144
|
+
'rounded',
|
|
139
145
|
]
|
|
140
146
|
|
|
141
147
|
if (props.variant === 'outline') {
|
|
142
|
-
|
|
143
|
-
'background-color: transparent;',
|
|
144
|
-
`border: 1px solid ${props.bgColor};`,
|
|
145
|
-
)
|
|
148
|
+
classes.push('bg-transparent', 'border', 'border-solid', 'border-indigo-700', 'text-indigo-700')
|
|
146
149
|
} else if (props.variant === 'ghost') {
|
|
147
|
-
|
|
150
|
+
classes.push('bg-transparent', 'text-indigo-700', 'hover:bg-indigo-50')
|
|
148
151
|
} else {
|
|
149
|
-
|
|
152
|
+
classes.push('bg-indigo-700', 'text-white')
|
|
150
153
|
}
|
|
151
154
|
|
|
152
|
-
return
|
|
155
|
+
return classes.join(' ')
|
|
153
156
|
})
|
|
154
157
|
|
|
155
158
|
const isLink = computed(() => props.variant === 'link')
|
|
156
159
|
|
|
157
|
-
const
|
|
158
|
-
|
|
159
|
-
|
|
160
|
+
const mergedClass = computed(() => twMerge(baseClasses.value, attrs.class as string))
|
|
161
|
+
|
|
162
|
+
const textSpanStyle = computed(() =>
|
|
163
|
+
outlookFallback ? `mso-text-raise: ${props.msoPt};` : undefined,
|
|
164
|
+
)
|
|
165
|
+
|
|
166
|
+
const msoPx = computed(() => {
|
|
167
|
+
const v = String(props.msoPx).trim()
|
|
168
|
+
// Bare number → percentage. Anything with a unit passes through.
|
|
169
|
+
return /^\d+(\.\d+)?$/.test(v) ? `${v}%` : v
|
|
160
170
|
})
|
|
161
171
|
|
|
162
|
-
|
|
172
|
+
/**
|
|
173
|
+
* Outlook spacer `<i>` elements rendered as raw HTML inside MSO conditional
|
|
174
|
+
* comments. JS strings keep ` ` / `​` from being decoded by
|
|
175
|
+
* Vue's template parser; htmlparser2 then preserves the comment
|
|
176
|
+
* data verbatim because conditional comments are opaque.
|
|
177
|
+
*/
|
|
178
|
+
const MsoSpacerLeft = () => createStaticVNode(
|
|
179
|
+
`<!--[if mso]><i style="mso-font-width: ${msoPx.value}; mso-text-raise: ${props.msoPb};" hidden> </i><![endif]-->`,
|
|
180
|
+
1,
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
const MsoSpacerRight = () => createStaticVNode(
|
|
184
|
+
`<!--[if mso]><i style="mso-font-width: ${msoPx.value};" hidden> ​</i><![endif]-->`,
|
|
185
|
+
1,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
const MsoIconGap = () => createStaticVNode(
|
|
189
|
+
`<!--[if mso]><i style="mso-font-width: 30%;" hidden> ​</i><![endif]-->`,
|
|
190
|
+
1,
|
|
191
|
+
)
|
|
163
192
|
</script>
|
|
164
193
|
|
|
165
194
|
<template>
|
|
166
195
|
<div :class="alignClass">
|
|
167
196
|
<a
|
|
168
|
-
v-bind="{ ...$attrs, class: undefined }"
|
|
197
|
+
v-bind="{ ...$attrs, class: undefined, style: undefined }"
|
|
169
198
|
:href="href"
|
|
170
|
-
:style="
|
|
199
|
+
:style="$attrs.style as any"
|
|
171
200
|
:class="mergedClass"
|
|
172
201
|
>
|
|
173
202
|
<template v-if="!isLink">
|
|
174
|
-
<
|
|
203
|
+
<MsoSpacerLeft v-if="outlookFallback" />
|
|
175
204
|
<template v-if="icon && iconPosition === 'left'">
|
|
176
|
-
<span :style="
|
|
177
|
-
<img :src="icon" :width="parsedIconWidth" :
|
|
205
|
+
<span :style="textSpanStyle">
|
|
206
|
+
<img :src="icon" :width="parsedIconWidth" :alt="iconAlt" style="vertical-align: baseline; max-width: 100%;" :class="iconClass">
|
|
178
207
|
</span>
|
|
179
|
-
<
|
|
208
|
+
<MsoIconGap v-if="outlookFallback" />
|
|
180
209
|
</template>
|
|
181
|
-
<span :
|
|
210
|
+
<span :style="textSpanStyle"><slot /></span>
|
|
182
211
|
<template v-if="icon && iconPosition === 'right'">
|
|
183
|
-
<
|
|
184
|
-
<span :style="
|
|
185
|
-
<img :src="icon" :width="parsedIconWidth" :
|
|
212
|
+
<MsoIconGap v-if="outlookFallback" />
|
|
213
|
+
<span :style="textSpanStyle">
|
|
214
|
+
<img :src="icon" :width="parsedIconWidth" :alt="iconAlt" style="vertical-align: baseline; max-width: 100%;" :class="iconClass">
|
|
186
215
|
</span>
|
|
187
216
|
</template>
|
|
188
|
-
<
|
|
217
|
+
<MsoSpacerRight v-if="outlookFallback" />
|
|
189
218
|
</template>
|
|
190
219
|
<template v-else>
|
|
191
220
|
<slot />
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { createStaticVNode, type PropType } from 'vue'
|
|
3
|
+
import { twMerge } from 'tailwind-merge'
|
|
3
4
|
import { codeToHtml, getSingletonHighlighter, type BundledLanguage, type BundledTheme } from 'shiki'
|
|
5
|
+
import { buildCodeBlock, codeBlockPreClass } from './utils'
|
|
4
6
|
|
|
5
7
|
export default {
|
|
6
8
|
props: {
|
|
@@ -56,11 +58,11 @@ export default {
|
|
|
56
58
|
.replace(/^<pre[^>]*><code>/, '')
|
|
57
59
|
.replace(/<\/code><\/pre>$/, '')
|
|
58
60
|
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
const
|
|
61
|
+
const preClass = twMerge(codeBlockPreClass(bg), attrs.class as string)
|
|
62
|
+
const tdClass = twMerge(`bg-[${bg}]`, props.tdClass)
|
|
63
|
+
const styleAttr = attrs.style ? ` style="${attrs.style}"` : ''
|
|
62
64
|
|
|
63
|
-
const html =
|
|
65
|
+
const html = buildCodeBlock(codeContent, bg, { preClass, tdClass, styleAttr })
|
|
64
66
|
|
|
65
67
|
return () => createStaticVNode(html, 1)
|
|
66
68
|
}
|