@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
|
@@ -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, '&')
|
|
232
|
+
.replace(/"/g, '"')
|
|
233
|
+
.replace(/</g, '<')
|
|
234
|
+
.replace(/>/g, '>')
|
|
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
|
|
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"
|
|
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
|
-
|
|
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="
|
|
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="
|
|
137
|
+
:class="articleMergedClass"
|
|
138
|
+
>
|
|
89
139
|
<slot />
|
|
90
140
|
</div>
|
|
91
141
|
</body>
|
package/dist/components/Link.vue
CHANGED
|
@@ -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="
|
|
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
|
-
/**
|
|
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:
|
|
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.
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
63
|
-
})
|
|
86
|
+
))
|
|
64
87
|
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
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) =>
|
|
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>
|