nuxt-og-image 1.0.0-beta.8 → 1.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 +335 -162
- package/dist/client/200.html +2 -2
- package/dist/client/404.html +2 -2
- package/dist/client/_nuxt/{Icon.bde42a7e.js → Icon.65a4f5bf.js} +1 -1
- package/dist/client/_nuxt/{entry.8f8c20b5.js → entry.9b6fba4b.js} +2 -2
- package/dist/client/_nuxt/{entry.0827acf4.css → entry.dc5450bf.css} +1 -1
- package/dist/client/_nuxt/{error-404.9ce3fbc6.js → error-404.67bc6c65.js} +1 -1
- package/dist/client/_nuxt/{error-500.d6ddcb0b.js → error-500.e3a6cf7c.js} +1 -1
- package/dist/client/_nuxt/{error-component.42929008.js → error-component.6baa49ee.js} +2 -2
- package/dist/client/index.html +2 -2
- package/dist/module.d.ts +1 -3
- package/dist/module.json +1 -1
- package/dist/module.mjs +15 -16
- package/dist/runtime/nitro/providers/satori/index.mjs +16 -6
- package/dist/runtime/nitro/providers/satori/plugins/emojis.d.ts +2 -0
- package/dist/runtime/nitro/providers/satori/plugins/emojis.mjs +13 -0
- package/dist/runtime/nitro/providers/satori/plugins/flex.mjs +1 -1
- package/dist/runtime/nitro/providers/satori/plugins/imageSrc.mjs +5 -12
- package/dist/runtime/nitro/providers/satori/utils.d.ts +4 -6
- package/dist/runtime/nitro/providers/satori/utils.mjs +56 -18
- package/dist/runtime/nitro/routes/__og_image__/font.d.ts +2 -0
- package/dist/runtime/nitro/routes/__og_image__/font.mjs +21 -0
- package/dist/runtime/nitro/routes/__og_image__/html.mjs +30 -7
- package/package.json +5 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--nui-c-context:125,125,125}html{background-color:#fff}html.dark{background-color:#222;color:#fff;color-scheme:dark}*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.carbon-sun{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6ZM5.394 6.813L6.81 5.399l3.505 3.506L8.9 10.319zM2 15.005h5v2H2zm3.394 10.193L8.9 21.692l1.414 1.414l-3.505 3.506zM15 25.005h2v5h-2zm6.687-1.9l1.414-1.414l3.506 3.506l-1.414 1.414zm3.313-8.1h5v2h-5zm-3.313-6.101l3.506-3.506l1.414 1.414l-3.506 3.506zM15 2.005h2v5h-2z'/%3E%3C/svg%3E");background-color:currentColor;color:inherit;display:inline-block;height:1.2em;-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;vertical-align:middle;width:1.2em}.dark .dark\:carbon-moon{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3Z'/%3E%3C/svg%3E");background-color:currentColor;color:inherit;display:inline-block;height:1.2em;-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;vertical-align:middle;width:1.2em}.logos-chrome{background:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 257' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cdefs%3E%3ClinearGradient id='logosChrome0' x1='49.998%25' x2='49.998%25' y1='.706%25' y2='96.99%25'%3E%3Cstop offset='0%25' stop-color='%2386BBE5'/%3E%3Cstop offset='100%25' stop-color='%231072BA'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='%23EF3F36' d='M127.789.035s75.32-3.38 115.253 72.328H121.38s-22.96-.74-42.573 27.114c-5.634 11.691-11.69 23.734-4.894 47.468c-9.79-16.586-51.975-90.04-51.975-90.04S51.693 3.028 127.788.035Z'/%3E%3Cpath fill='%23FCD900' d='M239.133 192.229s-34.756 66.94-120.253 63.63c10.564-18.276 60.848-105.358 60.848-105.358s12.149-19.508-2.183-50.425c-7.29-10.74-14.72-21.973-38.664-27.96c19.262-.175 103.95 0 103.95 0s31.726 52.715-3.698 120.113Z'/%3E%3Cpath fill='%2361BC5B' d='M16.973 192.757s-40.601-63.56 5.035-135.958c10.529 18.276 60.813 105.358 60.813 105.358s10.846 20.283 44.756 23.31c12.924-.95 26.375-1.76 43.56-19.472C161.663 182.757 119.16 256 119.16 256s-61.552 1.127-102.188-63.243Z'/%3E%3Cpath fill='%235AB055' d='m118.845 256.493l17.113-71.412s18.804-1.48 34.58-18.769c-9.79 17.22-51.693 90.181-51.693 90.181Z'/%3E%3Cpath fill='%23FFF' d='M70.462 129.056c0-31.48 25.53-57.01 57.01-57.01c31.48 0 57.01 25.53 57.01 57.01c0 31.481-25.53 57.01-57.01 57.01c-31.48-.035-57.01-25.529-57.01-57.01Z'/%3E%3Cpath fill='url(%23logosChrome0)' d='M80.004 129.056c0-26.198 21.234-47.467 47.468-47.467c26.198 0 47.467 21.234 47.467 47.467c0 26.199-21.233 47.468-47.467 47.468c-26.199 0-47.468-21.269-47.468-47.468Z'/%3E%3Cpath fill='%23EACA05' d='m242.795 72.152l-70.462 20.67s-10.634-15.6-33.487-20.67c19.825-.106 103.949 0 103.949 0Z'/%3E%3Cpath fill='%23DF3A32' d='M72.54 144.339c-9.896-17.149-50.602-87.434-50.602-87.434l52.186 51.622s-5.353 11.022-3.345 26.797l1.76 9.015Z'/%3E%3C/svg%3E") no-repeat;background-color:transparent;background-size:100% 100%;display:inline-block;height:1.2em;vertical-align:middle;width:1.2em}.logos-vercel-icon{background:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 222' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath d='m128 0l128 221.705H0z'/%3E%3C/svg%3E") no-repeat;background-color:transparent;background-size:100% 100%;display:inline-block;height:1.2em;vertical-align:middle;width:1.2em}.logos-vue{background:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 221' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='%2341B883' d='M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z'/%3E%3Cpath fill='%2341B883' d='m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z'/%3E%3Cpath fill='%2335495E' d='M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z'/%3E%3C/svg%3E") no-repeat;background-color:transparent;background-size:100% 100%;display:inline-block;height:1.2em;vertical-align:middle;width:1.2em}.n-button-icon{font-size:1.1em;margin-left:-.2em;margin-right:.2em}.n-button-base{grid-gap:.25rem;--un-shadow:var(--un-shadow-inset) 0 1px 2px 0 var(--un-shadow-color,rgba(0,0,0,.05));align-items:center;border-color:#9ca3af80;border-radius:.25rem;border-width:1px;box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow);display:inline-flex;gap:.25rem;opacity:.8;outline:2px solid transparent!important;outline-offset:2px!important;padding:.25em 1em}.hover\:n-button-hover:hover{border-color:rgba(var(--nui-c-context),1)!important;color:rgba(var(--nui-c-context),1);opacity:1}[n~=borderless]{--un-shadow:0 0 var(--un-shadow-color,transparent)!important;border-style:none!important;box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)!important}.active\:n-button-active:active{--un-ring-width:3px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);--un-ring-color:rgba(var(--nui-c-context),.1);background-color:rgba(var(--nui-c-context),.05);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.focus-visible\:n-focus-base:focus-visible{--un-ring-width:2px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);--un-ring-color:rgba(var(--nui-c-context),.5);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.n-transition{transition-duration:.15s;transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fixed{position:fixed}.-bottom-1\/2{bottom:-50%}.left-0{left:0}.right-0{right:0}.z-10{z-index:10}.z-20{z-index:20}.grid{display:grid}.m-0{margin:0}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-16{margin-bottom:4rem}.mb-2,[mb-2=""]{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mr-2,[mr-2=""]{margin-right:.5rem}.mt-2{margin-top:.5rem}.block,[block=""]{display:block}.inline-block{display:inline-block}.hidden{display:none}.h-1\/2{height:50%}.h-7,[h-7=""]{height:1.75rem}.h-auto{height:auto}.h-screen{height:100vh}.h1,[h1=""]{height:.25rem}.max-h-full{max-height:100%}.max-w-520px{max-width:520px}.min-h-screen{min-height:100vh}.w-7,[w-7=""]{width:1.75rem}.w-full{width:100%}.flex,[flex=""]{display:flex}.flex-1{flex:1 1 0%}.flex-col,[flex-col=""]{flex-direction:column}.cursor-pointer{cursor:pointer}.place-content-center{place-content:center}.items-start{align-items:flex-start}.items-center,[items-center=""]{align-items:center}.justify-center,[justify-center=""]{justify-content:center}.justify-between{justify-content:space-between}.space-x-1>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--un-space-x-reverse)));margin-right:calc(.25rem*var(--un-space-x-reverse))}.space-x-5>:not([hidden])~:not([hidden]),[space-x-5=""]>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--un-space-x-reverse)));margin-right:calc(1.25rem*var(--un-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--un-space-x-reverse)));margin-right:calc(1.5rem*var(--un-space-x-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.border-2{border-width:2px}.border-dark-900\/30{border-color:#0f0f0f4d}.border-light-700{--un-border-opacity:1;border-color:rgba(233,236,239,var(--un-border-opacity))}.dark .dark\:border-dark-800{--un-border-opacity:1;border-color:rgba(24,24,24,var(--un-border-opacity))}.rounded{border-radius:.25rem}.rounded-full,[rounded-full=""]{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.dark .dark\:border-none{border-style:none}.bg-black\/5{background-color:#0000000d}.bg-light-200{--un-bg-opacity:1;background-color:rgba(250,250,250,var(--un-bg-opacity))}.bg-light-500{--un-bg-opacity:1;background-color:rgba(242,242,242,var(--un-bg-opacity))}.bg-light-900{--un-bg-opacity:1;background-color:rgba(221,225,227,var(--un-bg-opacity))}.bg-white{--un-bg-opacity:1;background-color:rgba(255,255,255,var(--un-bg-opacity))}.dark .dark\:bg-black{--un-bg-opacity:1;background-color:rgba(0,0,0,var(--un-bg-opacity))}.dark .dark\:bg-dark-200{--un-bg-opacity:1;background-color:rgba(50,50,50,var(--un-bg-opacity))}.dark .dark\:bg-dark-300{--un-bg-opacity:1;background-color:rgba(45,45,45,var(--un-bg-opacity))}.dark .dark\:bg-dark-800{--un-bg-opacity:1;background-color:rgba(24,24,24,var(--un-bg-opacity))}.dark .dark\:bg-dark-900{--un-bg-opacity:1;background-color:rgba(15,15,15,var(--un-bg-opacity))}.dark .dark\:bg-dark-900\/20{background-color:#0f0f0f33}.dark .dark\:bg-white\/10{background-color:#ffffff1a}.hover\:bg-blue-200:hover{--un-bg-opacity:1;background-color:rgba(191,219,254,var(--un-bg-opacity))}.p-0,[p-0=""]{padding:0}.p-1{padding:.25rem}.p-8{padding:2rem}.px,.px-4{padding-left:1rem;padding-right:1rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-7{padding-bottom:1.75rem;padding-top:1.75rem}.pb-1{padding-bottom:.25rem}.pb-7,[pb-7=""]{padding-bottom:1.75rem}.pt-14{padding-top:3.5rem}.pt-2{padding-top:.5rem}.text-center{text-align:center}.font-sans{font-family:Avenir,Helvetica,Arial,sans-serif}.text-6xl{font-size:3.75rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-decoration\:inherit{line-height:inherit}.text-sm,[text-sm=""]{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs,[text-xs=""]{font-size:.75rem;line-height:1rem}.font-light{font-weight:300}.font-medium{font-weight:500}.leading-5{line-height:1.25rem}.leading-tight{line-height:1.25}.dark .dark\:text-light{--un-text-opacity:1;color:rgba(246,246,246,var(--un-text-opacity))}.dark .dark\:text-light-100{--un-text-opacity:1;color:rgba(252,252,252,var(--un-text-opacity))}.dark .dark\:text-light-900{--un-text-opacity:1;color:rgba(221,225,227,var(--un-text-opacity))}.dark .dark\:text-white{--un-text-opacity:1;color:rgba(255,255,255,var(--un-text-opacity))}.text-black{--un-text-opacity:1;color:rgba(0,0,0,var(--un-text-opacity))}.text-blue-900\/70{color:#1e3a8ab3}.text-dark-200{--un-text-opacity:1;color:rgba(50,50,50,var(--un-text-opacity))}.text-dark-700{--un-text-opacity:1;color:rgba(27,27,27,var(--un-text-opacity))}.text-dark-800{--un-text-opacity:1;color:rgba(24,24,24,var(--un-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:grayscale}.op50,.op50\:,.opacity-50,[op50=""]{opacity:.5}.opacity-60,[opacity-60=""]{opacity:.6}.opacity-80,[opacity-80=""]{opacity:.8}.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color,rgba(0,0,0,.1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color,rgba(0,0,0,.1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--un-ring-width:2px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.ring-offset-2{--un-ring-offset-width:2px}.ring-white{--un-ring-opacity:1;--un-ring-color:rgba(255,255,255,var(--un-ring-opacity))}.ring-opacity-60{--un-ring-opacity:.6}.ring-offset-blue-400{--un-ring-offset-opacity:1;--un-ring-offset-color:rgba(96,165,250,var(--un-ring-offset-opacity))}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}[n~=lg]{font-size:1.125rem;line-height:1.75rem}.n-disabled\:n-disabled[disabled],[disabled] .n-disabled\:n-disabled{filter:saturate(0);opacity:.4;pointer-events:none}@media (min-width:640px){.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3{padding-bottom:.75rem;padding-top:.75rem}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-8xl{font-size:6rem;line-height:1}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1280px){[xl\:hidden=""]{display:none}}@media (min-width:1536px){.\32xl\:mx-auto{margin-left:auto;margin-right:auto}.\32xl\:mb-8{margin-bottom:2rem}.\32xl\:block{display:block}.\32xl\:hidden{display:none}.\32xl\:h-full{height:100%}.\32xl\:w-1205px{width:1205px}.\32xl\:flex{display:flex}.\32xl\:flex-row{flex-direction:row}.\32xl\:space-x-0>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(0rem*(1 - var(--un-space-x-reverse)));margin-right:calc(0rem*var(--un-space-x-reverse))}.\32xl\:space-y-4>:not([hidden])~:not([hidden]){--un-space-y-reverse:0;margin-bottom:calc(1rem*var(--un-space-y-reverse));margin-top:calc(1rem*(1 - var(--un-space-y-reverse)))}.\32xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.\32xl\:py-7{padding-bottom:1.75rem;padding-top:1.75rem}}iframe[data-v-aa5b40b2]{aspect-ratio:40/21;max-width:1200px;transition:.4s;width:100%}img[data-v-e284dbf4]{aspect-ratio:40/21;max-width:1200px;transition:.4s ease-in-out}.tab-panels{width:100%}div[role=tabpanel]{display:flex;width:100%}
|
|
1
|
+
:root{--nui-c-context:125,125,125}html{background-color:#fff}html.dark{background-color:#222;color:#fff;color-scheme:dark}*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.carbon-sun{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6ZM5.394 6.813L6.81 5.399l3.505 3.506L8.9 10.319zM2 15.005h5v2H2zm3.394 10.193L8.9 21.692l1.414 1.414l-3.505 3.506zM15 25.005h2v5h-2zm6.687-1.9l1.414-1.414l3.506 3.506l-1.414 1.414zm3.313-8.1h5v2h-5zm-3.313-6.101l3.506-3.506l1.414 1.414l-3.506 3.506zM15 2.005h2v5h-2z'/%3E%3C/svg%3E");background-color:currentColor;color:inherit;display:inline-block;height:1.2em;-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;vertical-align:middle;width:1.2em}.dark .dark\:carbon-moon{--un-icon:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 32 32' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='currentColor' d='M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3Z'/%3E%3C/svg%3E");background-color:currentColor;color:inherit;display:inline-block;height:1.2em;-webkit-mask:var(--un-icon) no-repeat;mask:var(--un-icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;vertical-align:middle;width:1.2em}.logos-chrome{background:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 257' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cdefs%3E%3ClinearGradient id='logosChrome0' x1='49.998%25' x2='49.998%25' y1='.706%25' y2='96.99%25'%3E%3Cstop offset='0%25' stop-color='%2386BBE5'/%3E%3Cstop offset='100%25' stop-color='%231072BA'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cpath fill='%23EF3F36' d='M127.789.035s75.32-3.38 115.253 72.328H121.38s-22.96-.74-42.573 27.114c-5.634 11.691-11.69 23.734-4.894 47.468c-9.79-16.586-51.975-90.04-51.975-90.04S51.693 3.028 127.788.035Z'/%3E%3Cpath fill='%23FCD900' d='M239.133 192.229s-34.756 66.94-120.253 63.63c10.564-18.276 60.848-105.358 60.848-105.358s12.149-19.508-2.183-50.425c-7.29-10.74-14.72-21.973-38.664-27.96c19.262-.175 103.95 0 103.95 0s31.726 52.715-3.698 120.113Z'/%3E%3Cpath fill='%2361BC5B' d='M16.973 192.757s-40.601-63.56 5.035-135.958c10.529 18.276 60.813 105.358 60.813 105.358s10.846 20.283 44.756 23.31c12.924-.95 26.375-1.76 43.56-19.472C161.663 182.757 119.16 256 119.16 256s-61.552 1.127-102.188-63.243Z'/%3E%3Cpath fill='%235AB055' d='m118.845 256.493l17.113-71.412s18.804-1.48 34.58-18.769c-9.79 17.22-51.693 90.181-51.693 90.181Z'/%3E%3Cpath fill='%23FFF' d='M70.462 129.056c0-31.48 25.53-57.01 57.01-57.01c31.48 0 57.01 25.53 57.01 57.01c0 31.481-25.53 57.01-57.01 57.01c-31.48-.035-57.01-25.529-57.01-57.01Z'/%3E%3Cpath fill='url(%23logosChrome0)' d='M80.004 129.056c0-26.198 21.234-47.467 47.468-47.467c26.198 0 47.467 21.234 47.467 47.467c0 26.199-21.233 47.468-47.467 47.468c-26.199 0-47.468-21.269-47.468-47.468Z'/%3E%3Cpath fill='%23EACA05' d='m242.795 72.152l-70.462 20.67s-10.634-15.6-33.487-20.67c19.825-.106 103.949 0 103.949 0Z'/%3E%3Cpath fill='%23DF3A32' d='M72.54 144.339c-9.896-17.149-50.602-87.434-50.602-87.434l52.186 51.622s-5.353 11.022-3.345 26.797l1.76 9.015Z'/%3E%3C/svg%3E") no-repeat;background-color:transparent;background-size:100% 100%;display:inline-block;height:1.2em;vertical-align:middle;width:1.2em}.logos-vercel-icon{background:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 222' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath d='m128 0l128 221.705H0z'/%3E%3C/svg%3E") no-repeat;background-color:transparent;background-size:100% 100%;display:inline-block;height:1.2em;vertical-align:middle;width:1.2em}.logos-vue{background:url("data:image/svg+xml;utf8,%3Csvg viewBox='0 0 256 221' display='inline-block' vertical-align='middle' width='1.2em' height='1.2em' xmlns='http://www.w3.org/2000/svg' %3E%3Cpath fill='%2341B883' d='M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z'/%3E%3Cpath fill='%2341B883' d='m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z'/%3E%3Cpath fill='%2335495E' d='M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z'/%3E%3C/svg%3E") no-repeat;background-color:transparent;background-size:100% 100%;display:inline-block;height:1.2em;vertical-align:middle;width:1.2em}.n-button-icon{font-size:1.1em;margin-left:-.2em;margin-right:.2em}.n-button-base{grid-gap:.25rem;--un-shadow:var(--un-shadow-inset) 0 1px 2px 0 var(--un-shadow-color,rgba(0,0,0,.05));align-items:center;border-color:#9ca3af80;border-radius:.25rem;border-width:1px;box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow);display:inline-flex;gap:.25rem;opacity:.8;outline:2px solid transparent!important;outline-offset:2px!important;padding:.25em 1em}.hover\:n-button-hover:hover{border-color:rgba(var(--nui-c-context),1)!important;color:rgba(var(--nui-c-context),1);opacity:1}[n~=borderless]{--un-shadow:0 0 var(--un-shadow-color,transparent)!important;border-style:none!important;box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)!important}.active\:n-button-active:active{--un-ring-width:3px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);--un-ring-color:rgba(var(--nui-c-context),.1);background-color:rgba(var(--nui-c-context),.05);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.focus-visible\:n-focus-base:focus-visible{--un-ring-width:2px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);--un-ring-color:rgba(var(--nui-c-context),.5);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.n-transition{transition-duration:.15s;transition-duration:.2s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.fixed{position:fixed}.-bottom-1\/2{bottom:-50%}.left-0{left:0}.right-0{right:0}.z-10{z-index:10}.z-20{z-index:20}.grid{display:grid}.m-0{margin:0}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-16{margin-bottom:4rem}.mb-2,[mb-2=""]{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mr-2,[mr-2=""]{margin-right:.5rem}.mt-2{margin-top:.5rem}.mt-5{margin-top:1.25rem}.block,[block=""]{display:block}.inline-block{display:inline-block}.hidden{display:none}.h-1\/2{height:50%}.h-7,[h-7=""]{height:1.75rem}.h-auto{height:auto}.h-screen{height:100vh}.h1,[h1=""]{height:.25rem}.max-h-full{max-height:100%}.max-w-520px{max-width:520px}.min-h-screen{min-height:100vh}.w-7,[w-7=""]{width:1.75rem}.w-full{width:100%}.flex,[flex=""]{display:flex}.flex-1{flex:1 1 0%}.flex-col,[flex-col=""]{flex-direction:column}.cursor-pointer{cursor:pointer}.place-content-center{place-content:center}.items-start{align-items:flex-start}.items-center,[items-center=""]{align-items:center}.justify-center,[justify-center=""]{justify-content:center}.justify-between{justify-content:space-between}.space-x-1>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--un-space-x-reverse)));margin-right:calc(.25rem*var(--un-space-x-reverse))}.space-x-5>:not([hidden])~:not([hidden]),[space-x-5=""]>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(1.25rem*(1 - var(--un-space-x-reverse)));margin-right:calc(1.25rem*var(--un-space-x-reverse))}.space-x-6>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(1.5rem*(1 - var(--un-space-x-reverse)));margin-right:calc(1.5rem*var(--un-space-x-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.border-2{border-width:2px}.border-dark-900\/30{border-color:#0f0f0f4d}.border-light-700{--un-border-opacity:1;border-color:rgba(233,236,239,var(--un-border-opacity))}.dark .dark\:border-dark-800{--un-border-opacity:1;border-color:rgba(24,24,24,var(--un-border-opacity))}.rounded{border-radius:.25rem}.rounded-full,[rounded-full=""]{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.dark .dark\:border-none{border-style:none}.bg-black\/5{background-color:#0000000d}.bg-light-200{--un-bg-opacity:1;background-color:rgba(250,250,250,var(--un-bg-opacity))}.bg-light-500{--un-bg-opacity:1;background-color:rgba(242,242,242,var(--un-bg-opacity))}.bg-light-900{--un-bg-opacity:1;background-color:rgba(221,225,227,var(--un-bg-opacity))}.bg-white{--un-bg-opacity:1;background-color:rgba(255,255,255,var(--un-bg-opacity))}.dark .dark\:bg-black{--un-bg-opacity:1;background-color:rgba(0,0,0,var(--un-bg-opacity))}.dark .dark\:bg-dark-200{--un-bg-opacity:1;background-color:rgba(50,50,50,var(--un-bg-opacity))}.dark .dark\:bg-dark-300{--un-bg-opacity:1;background-color:rgba(45,45,45,var(--un-bg-opacity))}.dark .dark\:bg-dark-800{--un-bg-opacity:1;background-color:rgba(24,24,24,var(--un-bg-opacity))}.dark .dark\:bg-dark-900{--un-bg-opacity:1;background-color:rgba(15,15,15,var(--un-bg-opacity))}.dark .dark\:bg-dark-900\/20{background-color:#0f0f0f33}.dark .dark\:bg-white\/10{background-color:#ffffff1a}.hover\:bg-blue-200:hover{--un-bg-opacity:1;background-color:rgba(191,219,254,var(--un-bg-opacity))}.p-0,[p-0=""]{padding:0}.p-1{padding:.25rem}.p-8{padding:2rem}.px,.px-4{padding-left:1rem;padding-right:1rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.py-7{padding-bottom:1.75rem;padding-top:1.75rem}.pb-1{padding-bottom:.25rem}.pb-7,[pb-7=""]{padding-bottom:1.75rem}.pt-14{padding-top:3.5rem}.pt-2{padding-top:.5rem}.text-center{text-align:center}.font-sans{font-family:Avenir,Helvetica,Arial,sans-serif}.text-6xl{font-size:3.75rem;line-height:1}.text-8xl{font-size:6rem;line-height:1}.text-decoration\:inherit{line-height:inherit}.text-sm,[text-sm=""]{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs,[text-xs=""]{font-size:.75rem;line-height:1rem}.font-light{font-weight:300}.font-medium{font-weight:500}.leading-5{line-height:1.25rem}.leading-tight{line-height:1.25}.dark .dark\:text-light{--un-text-opacity:1;color:rgba(246,246,246,var(--un-text-opacity))}.dark .dark\:text-light-100{--un-text-opacity:1;color:rgba(252,252,252,var(--un-text-opacity))}.dark .dark\:text-light-900{--un-text-opacity:1;color:rgba(221,225,227,var(--un-text-opacity))}.dark .dark\:text-white{--un-text-opacity:1;color:rgba(255,255,255,var(--un-text-opacity))}.text-black{--un-text-opacity:1;color:rgba(0,0,0,var(--un-text-opacity))}.text-blue-900\/70{color:#1e3a8ab3}.text-dark-200{--un-text-opacity:1;color:rgba(50,50,50,var(--un-text-opacity))}.text-dark-700{--un-text-opacity:1;color:rgba(27,27,27,var(--un-text-opacity))}.text-dark-800{--un-text-opacity:1;color:rgba(24,24,24,var(--un-text-opacity))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-smoothing:grayscale}.op50,.op50\:,.opacity-50,[op50=""]{opacity:.5}.opacity-60,[opacity-60=""]{opacity:.6}.opacity-80,[opacity-80=""]{opacity:.8}.shadow{--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color,rgba(0,0,0,.1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color,rgba(0,0,0,.1));box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--un-ring-width:2px;--un-ring-offset-shadow:var(--un-ring-inset) 0 0 0 var(--un-ring-offset-width) var(--un-ring-offset-color);--un-ring-shadow:var(--un-ring-inset) 0 0 0 calc(var(--un-ring-width) + var(--un-ring-offset-width)) var(--un-ring-color);box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow)}.ring-offset-2{--un-ring-offset-width:2px}.ring-white{--un-ring-opacity:1;--un-ring-color:rgba(255,255,255,var(--un-ring-opacity))}.ring-opacity-60{--un-ring-opacity:.6}.ring-offset-blue-400{--un-ring-offset-opacity:1;--un-ring-offset-color:rgba(96,165,250,var(--un-ring-offset-opacity))}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}[n~=lg]{font-size:1.125rem;line-height:1.75rem}.n-disabled\:n-disabled[disabled],[disabled] .n-disabled\:n-disabled{filter:saturate(0);opacity:.4;pointer-events:none}@media (min-width:640px){.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-3{padding-bottom:.75rem;padding-top:.75rem}.sm\:text-2xl{font-size:1.5rem;line-height:2rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-8xl{font-size:6rem;line-height:1}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:1280px){[xl\:hidden=""]{display:none}}@media (min-width:1536px){.\32xl\:mx-auto{margin-left:auto;margin-right:auto}.\32xl\:mb-8{margin-bottom:2rem}.\32xl\:block{display:block}.\32xl\:hidden{display:none}.\32xl\:h-full{height:100%}.\32xl\:w-1205px{width:1205px}.\32xl\:flex{display:flex}.\32xl\:flex-row{flex-direction:row}.\32xl\:space-x-0>:not([hidden])~:not([hidden]){--un-space-x-reverse:0;margin-left:calc(0rem*(1 - var(--un-space-x-reverse)));margin-right:calc(0rem*var(--un-space-x-reverse))}.\32xl\:space-y-4>:not([hidden])~:not([hidden]){--un-space-y-reverse:0;margin-bottom:calc(1rem*var(--un-space-y-reverse));margin-top:calc(1rem*(1 - var(--un-space-y-reverse)))}.\32xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.\32xl\:py-7{padding-bottom:1.75rem;padding-top:1.75rem}}iframe[data-v-aa5b40b2]{aspect-ratio:40/21;max-width:1200px;transition:.4s;width:100%}img[data-v-e284dbf4]{aspect-ratio:40/21;max-width:1200px;transition:.4s ease-in-out}.tab-panels{width:100%}div[role=tabpanel]{display:flex;width:100%}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as n,v as a,o as r,l,x as e,t as s,y as d,z as c,A as p,B as f,C as x,D as h}from"./entry.
|
|
1
|
+
import{s as n,v as a,o as r,l,x as e,t as s,y as d,z as c,A as p,B as f,C as x,D as h}from"./entry.9b6fba4b.js";const m=t=>(x("data-v-18337f8d"),t=t(),h(),t),u={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},g=m(()=>e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),_={class:"max-w-520px text-center z-20"},b=["textContent"],y=["textContent"],w={class:"w-full flex items-center justify-center"},S={__name:"error-404",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:404},statusMessage:{type:String,default:"Not Found"},description:{type:String,default:"Sorry, the page you are looking for could not be found."},backHome:{type:String,default:"Go back home"}},setup(t){const o=t;return a({title:`${o.statusCode} - ${o.statusMessage} | ${o.appName}`,script:[],style:[{children:'*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e0e0e0}*{--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14, 165, 233, .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}a{color:inherit;text-decoration:inherit}body{margin:0;font-family:inherit;line-height:inherit}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}h1,p{margin:0}h1{font-size:inherit;font-weight:inherit}'}]}),(k,v)=>{const i=p;return r(),l("div",u,[g,e("div",_,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:s(t.statusCode)},null,8,b),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:s(t.description)},null,8,y),e("div",w,[d(i,{to:"/",class:"gradient-border text-md sm:text-xl py-2 px-4 sm:py-3 sm:px-6 cursor-pointer"},{default:c(()=>[f(s(t.backHome),1)]),_:1})])])])}}},z=n(S,[["__scopeId","data-v-18337f8d"]]);export{z as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as i,v as a,o as r,l as n,x as e,t as s,C as l,D as d}from"./entry.
|
|
1
|
+
import{s as i,v as a,o as r,l as n,x as e,t as s,C as l,D as d}from"./entry.9b6fba4b.js";const c=t=>(l("data-v-428e244b"),t=t(),d(),t),p={class:"font-sans antialiased bg-white dark:bg-black text-black dark:text-white grid min-h-screen place-content-center overflow-hidden"},h=c(()=>e("div",{class:"fixed -bottom-1/2 left-0 right-0 h-1/2 spotlight"},null,-1)),f={class:"max-w-520px text-center"},g=["textContent"],m=["textContent"],x={__name:"error-500",props:{appName:{type:String,default:"Nuxt"},version:{type:String,default:""},statusCode:{type:Number,default:500},statusMessage:{type:String,default:"Server error"},description:{type:String,default:"This page is temporarily unavailable."}},setup(t){const o=t;return a({title:`${o.statusCode} - ${o.statusMessage} | ${o.appName}`,script:[],style:[{children:'*,:before,:after{-webkit-box-sizing:border-box;box-sizing:border-box;border-width:0;border-style:solid;border-color:#e0e0e0}*{--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(14, 165, 233, .5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000}:root{-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{margin:0;font-family:inherit;line-height:inherit}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5}h1,p{margin:0}h1{font-size:inherit;font-weight:inherit}'}]}),(b,u)=>(r(),n("div",p,[h,e("div",f,[e("h1",{class:"text-8xl sm:text-10xl font-medium mb-8",textContent:s(t.statusCode)},null,8,g),e("p",{class:"text-xl px-8 sm:px-0 sm:text-4xl font-light mb-16 leading-tight",textContent:s(t.description)},null,8,m)])]))}},w=i(x,[["__scopeId","data-v-428e244b"]]);export{w as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{d as n,_ as o,o as _,c as f,n as g,g as E,u as r}from"./entry.
|
|
1
|
+
import{d as n,_ as o,o as _,c as f,n as g,g as E,u as r}from"./entry.9b6fba4b.js";const k={__name:"nuxt-error-page",props:{error:Object},setup(t){(t.error.stack||"").split(`
|
|
2
2
|
`).splice(1).map(e=>({text:e.replace("webpack:/","").replace(".vue",".js").trim(),internal:e.includes("node_modules")&&!e.includes(".cache")||e.includes("internal")||e.includes("new Promise")})).map(e=>`<span class="stack${e.internal?" internal":""}">${e.text}</span>`).join(`
|
|
3
|
-
`);const s=Number(t.error.statusCode||500),a=s===404,c=t.error.statusMessage??(a?"Page Not Found":"Internal Server Error"),u=t.error.message||t.error.toString(),i=void 0,d=n(()=>o(()=>import("./error-404.
|
|
3
|
+
`);const s=Number(t.error.statusCode||500),a=s===404,c=t.error.statusMessage??(a?"Page Not Found":"Internal Server Error"),u=t.error.message||t.error.toString(),i=void 0,d=n(()=>o(()=>import("./error-404.67bc6c65.js"),["./error-404.67bc6c65.js","./entry.9b6fba4b.js","./entry.dc5450bf.css","./error-404.68aa58b4.css"],import.meta.url).then(e=>e.default||e)),l=n(()=>o(()=>import("./error-500.e3a6cf7c.js"),["./error-500.e3a6cf7c.js","./entry.9b6fba4b.js","./entry.dc5450bf.css","./error-500.dc5710d1.css"],import.meta.url).then(e=>e.default||e)),m=a?d:l;return(e,p)=>(_(),f(r(m),g(E({statusCode:r(s),statusMessage:r(c),description:r(u),stack:r(i)})),null,16))}},v=k;export{v as default};
|
package/dist/client/index.html
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!DOCTYPE html>
|
|
2
2
|
<html >
|
|
3
3
|
<head><meta charset="utf-8">
|
|
4
|
-
<meta name="viewport" content="width=device-width, initial-scale=1"><link rel="modulepreload" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/entry.
|
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1"><link rel="modulepreload" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/entry.9b6fba4b.js"><link rel="preload" as="style" href="/__nuxt_og_image__/client/_nuxt/entry.dc5450bf.css"><link rel="prefetch" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/error-component.6baa49ee.js"><link rel="stylesheet" href="/__nuxt_og_image__/client/_nuxt/entry.dc5450bf.css"><script>"use strict";const w=window,de=document.documentElement,knownColorSchemes=["dark","light"],preference=window.localStorage.getItem("nuxt-color-mode")||"system";let value=preference==="system"?getColorScheme():preference;const forcedColorMode=de.getAttribute("data-color-mode-forced");forcedColorMode&&(value=forcedColorMode),addColorScheme(value),w["__NUXT_COLOR_MODE__"]={preference,value,getColorScheme,addColorScheme,removeColorScheme};function addColorScheme(e){const o=""+e+"",t="";de.classList?de.classList.add(o):de.className+=" "+o,t&&de.setAttribute("data-"+t,e)}function removeColorScheme(e){const o=""+e+"",t="";de.classList?de.classList.remove(o):de.className=de.className.replace(new RegExp(o,"g"),""),t&&de.removeAttribute("data-"+t)}function prefersColorScheme(e){return w.matchMedia("(prefers-color-scheme"+e+")")}function getColorScheme(){if(w.matchMedia&&prefersColorScheme("").media!=="not all"){for(const e of knownColorSchemes)if(prefersColorScheme(":"+e).matches)return e}return"light"}
|
|
5
5
|
</script></head>
|
|
6
|
-
<body ><div id="__nuxt"></div><script>window.__NUXT__={serverRendered:false,config:{public:{},app:{baseURL:"\u002F__nuxt_og_image__\u002Fclient",buildAssetsDir:"\u002F_nuxt\u002F",cdnURL:""}},data:{},state:{}}</script><script type="module" src="/__nuxt_og_image__/client/_nuxt/entry.
|
|
6
|
+
<body ><div id="__nuxt"></div><script>window.__NUXT__={serverRendered:false,config:{public:{},app:{baseURL:"\u002F__nuxt_og_image__\u002Fclient",buildAssetsDir:"\u002F_nuxt\u002F",cdnURL:""}},data:{},state:{}}</script><script type="module" src="/__nuxt_og_image__/client/_nuxt/entry.9b6fba4b.js" crossorigin></script></body>
|
|
7
7
|
</html>
|
package/dist/module.d.ts
CHANGED
|
@@ -39,9 +39,7 @@ interface ModuleOptions {
|
|
|
39
39
|
host: string;
|
|
40
40
|
defaults: OgImageOptions;
|
|
41
41
|
experimentalNitroBrowser: boolean;
|
|
42
|
-
|
|
43
|
-
publicPath: string;
|
|
44
|
-
}>;
|
|
42
|
+
fonts: `${string}:${number}`[];
|
|
45
43
|
satoriOptions: Partial<SatoriOptions>;
|
|
46
44
|
forcePrerender: boolean;
|
|
47
45
|
}
|
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -9,6 +9,7 @@ import { joinURL } from 'ufo';
|
|
|
9
9
|
import { resolve, relative } from 'pathe';
|
|
10
10
|
import { tinyws } from 'tinyws';
|
|
11
11
|
import sirv from 'sirv';
|
|
12
|
+
import { copy } from 'fs-extra';
|
|
12
13
|
import { createBirpcGroup } from 'birpc';
|
|
13
14
|
import { stringify, parse } from 'flatted';
|
|
14
15
|
|
|
@@ -179,25 +180,14 @@ const module = defineNuxtModule({
|
|
|
179
180
|
width: 1200,
|
|
180
181
|
height: 630
|
|
181
182
|
},
|
|
182
|
-
|
|
183
|
-
{
|
|
184
|
-
name: "Inter",
|
|
185
|
-
weight: 400,
|
|
186
|
-
style: "normal",
|
|
187
|
-
publicPath: "/inter-latin-ext-400-normal.woff"
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
name: "Inter",
|
|
191
|
-
weight: 700,
|
|
192
|
-
style: "normal",
|
|
193
|
-
publicPath: "/inter-latin-ext-700-normal.woff"
|
|
194
|
-
}
|
|
195
|
-
],
|
|
183
|
+
fonts: [],
|
|
196
184
|
satoriOptions: {}
|
|
197
185
|
};
|
|
198
186
|
},
|
|
199
187
|
async setup(config, nuxt) {
|
|
200
188
|
const { resolve } = createResolver(import.meta.url);
|
|
189
|
+
if (!config.fonts.length)
|
|
190
|
+
config.fonts = ["Inter:400", "Inter:700"];
|
|
201
191
|
const distResolve = (p) => {
|
|
202
192
|
const cwd = resolve(".");
|
|
203
193
|
if (cwd.endsWith("/dist"))
|
|
@@ -233,6 +223,10 @@ export {}
|
|
|
233
223
|
handler: resolve(`./runtime/nitro/routes/__og_image__/${type}`)
|
|
234
224
|
});
|
|
235
225
|
});
|
|
226
|
+
addServerHandler({
|
|
227
|
+
route: "/api/og-image-font",
|
|
228
|
+
handler: resolve("./runtime/nitro/routes/__og_image__/font")
|
|
229
|
+
});
|
|
236
230
|
if (nuxt.options.dev) {
|
|
237
231
|
const playgroundDir = distResolve("./client");
|
|
238
232
|
const {
|
|
@@ -269,13 +263,18 @@ export {}
|
|
|
269
263
|
});
|
|
270
264
|
const runtimeDir = resolve("./runtime");
|
|
271
265
|
nuxt.options.build.transpile.push(runtimeDir);
|
|
272
|
-
|
|
266
|
+
const fontDir = resolve(nuxt.options.buildDir, "nuxt-og-image");
|
|
267
|
+
const publicDirs = [`${nuxt.options.rootDir}/public`, fontDir];
|
|
268
|
+
exposeConfig("#nuxt-og-image/config", "nuxt-og-image-config.mjs", { ...config, publicDirs });
|
|
269
|
+
nuxt.hooks.hook("build:before", async () => {
|
|
270
|
+
await copy(resolve("./runtime/public"), resolve(nuxt.options.buildDir, "nuxt-og-image"));
|
|
271
|
+
});
|
|
273
272
|
nuxt.hooks.hook("nitro:config", (nitroConfig) => {
|
|
274
273
|
nitroConfig.externals = defu(nitroConfig.externals || {}, {
|
|
275
274
|
inline: [runtimeDir]
|
|
276
275
|
});
|
|
277
276
|
nitroConfig.publicAssets = nitroConfig.publicAssets || [];
|
|
278
|
-
nitroConfig.publicAssets.push({ dir:
|
|
277
|
+
nitroConfig.publicAssets.push({ dir: fontDir, maxAge: 31536e3 });
|
|
279
278
|
nitroConfig.virtual["#nuxt-og-image/browser"] = `export { createBrowser } from '${runtimeDir}/nitro/browsers/${isEdge ? "lambda" : "default"}'`;
|
|
280
279
|
nitroConfig.virtual["#nuxt-og-image/provider"] = `
|
|
281
280
|
import satori from '${runtimeDir}/nitro/providers/satori'
|
|
@@ -2,11 +2,13 @@ import { html as convertHtmlToSatori } from "satori-html";
|
|
|
2
2
|
import satori from "satori";
|
|
3
3
|
import { parseURL } from "ufo";
|
|
4
4
|
import { Resvg } from "@resvg/resvg-js";
|
|
5
|
-
import
|
|
5
|
+
import twemoji from "twemoji";
|
|
6
|
+
import { loadFont, walkSatoriTree } from "./utils.mjs";
|
|
6
7
|
import imageSrc from "./plugins/imageSrc.mjs";
|
|
7
8
|
import twClasses from "./plugins/twClasses.mjs";
|
|
8
9
|
import flex from "./plugins/flex.mjs";
|
|
9
|
-
import
|
|
10
|
+
import emojis from "./plugins/emojis.mjs";
|
|
11
|
+
import { fonts, satoriOptions } from "#nuxt-og-image/config";
|
|
10
12
|
export default {
|
|
11
13
|
name: "satori",
|
|
12
14
|
createPng: async function createPng(baseUrl, options) {
|
|
@@ -19,11 +21,13 @@ export default {
|
|
|
19
21
|
const url = parseURL(baseUrl);
|
|
20
22
|
const html = await $fetch(url.pathname);
|
|
21
23
|
const body = html.match(/<body[^>]*>([\s\S]*)<\/body>/)?.[1];
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const emojiedFont = twemoji.parse(body, {
|
|
25
|
+
folder: "svg",
|
|
26
|
+
ext: ".svg"
|
|
27
|
+
});
|
|
28
|
+
const satoriTree = convertHtmlToSatori(emojiedFont);
|
|
26
29
|
await walkSatoriTree(url, satoriTree, [
|
|
30
|
+
emojis(url),
|
|
27
31
|
twClasses(url),
|
|
28
32
|
imageSrc(url),
|
|
29
33
|
flex(url)
|
|
@@ -31,9 +35,15 @@ export default {
|
|
|
31
35
|
return satoriTree;
|
|
32
36
|
},
|
|
33
37
|
createSvg: async function createSvg(baseUrl, options) {
|
|
38
|
+
const url = parseURL(baseUrl);
|
|
34
39
|
const vnodes = await this.createVNode(baseUrl, options);
|
|
40
|
+
const satoriFonts = [];
|
|
41
|
+
for (const font of fonts)
|
|
42
|
+
satoriFonts.push(await loadFont(url, font));
|
|
35
43
|
return await satori(vnodes, {
|
|
36
44
|
...satoriOptions,
|
|
45
|
+
fonts: satoriFonts,
|
|
46
|
+
embedFont: true,
|
|
37
47
|
width: options.width,
|
|
38
48
|
height: options.height
|
|
39
49
|
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineSatoriTransformer } from "../utils.mjs";
|
|
2
|
+
export default defineSatoriTransformer(() => {
|
|
3
|
+
return {
|
|
4
|
+
filter: (node) => node.type === "img" && node.props?.class?.includes("emoji"),
|
|
5
|
+
transform: async (node) => {
|
|
6
|
+
node.props.style = node.props.style || {};
|
|
7
|
+
node.props.style.height = "1em";
|
|
8
|
+
node.props.style.width = "1em";
|
|
9
|
+
node.props.style.margin = "0 .05em 0 .1em";
|
|
10
|
+
node.props.style.verticalAlign = "0.1em";
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineSatoriTransformer } from "../utils.mjs";
|
|
2
2
|
export default defineSatoriTransformer(() => {
|
|
3
3
|
return {
|
|
4
|
-
filter: (node) => node.type === "div" && (Array.isArray(node.props
|
|
4
|
+
filter: (node) => node.type === "div" && (Array.isArray(node.props?.children) && node.props?.children.length >= 1) && (!node.props.style?.display && !node.props?.class?.includes("flex")),
|
|
5
5
|
transform: async (node) => {
|
|
6
6
|
node.props.style = node.props.style || {};
|
|
7
7
|
node.props.style.display = "flex";
|
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
import { fileURLToPath } from "node:url";
|
|
2
|
-
import { promises as fsp } from "node:fs";
|
|
3
1
|
import { withBase } from "ufo";
|
|
4
|
-
import {
|
|
5
|
-
import { defineSatoriTransformer } from "../utils.mjs";
|
|
6
|
-
import { getAsset } from "#internal/nitro/virtual/public-assets";
|
|
2
|
+
import { defineSatoriTransformer, readPublicAssetBase64 } from "../utils.mjs";
|
|
7
3
|
export default defineSatoriTransformer((url) => {
|
|
8
4
|
return {
|
|
9
5
|
filter: (node) => node.type === "img",
|
|
10
6
|
transform: async (node) => {
|
|
11
7
|
const src = node.props?.src;
|
|
12
8
|
if (src && src.startsWith("/")) {
|
|
13
|
-
const file =
|
|
14
|
-
if (file)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
node.props.src = `data:${file.type};base64,${await fsp.readFile(path, { encoding: "base64" })}`;
|
|
18
|
-
} else {
|
|
9
|
+
const file = await readPublicAssetBase64(src);
|
|
10
|
+
if (file)
|
|
11
|
+
node.props.src = file;
|
|
12
|
+
else
|
|
19
13
|
node.props.src = withBase(src, `${url.protocol}//${url.host}`);
|
|
20
|
-
}
|
|
21
14
|
}
|
|
22
15
|
}
|
|
23
16
|
};
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/// <reference types="node" />
|
|
2
2
|
import type { ParsedURL } from 'ufo';
|
|
3
3
|
import type { SatoriTransformer, VNode } from '../../../../types';
|
|
4
|
-
export declare function
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
publicPath?: string | undefined;
|
|
8
|
-
}>;
|
|
4
|
+
export declare function readPublicAsset(file: string, encoding?: BufferEncoding): Promise<string | Buffer | undefined>;
|
|
5
|
+
export declare function readPublicAssetBase64(file: string): Promise<string | undefined>;
|
|
6
|
+
export declare function loadFont(url: ParsedURL, font: string): Promise<any>;
|
|
9
7
|
export declare function walkSatoriTree(url: ParsedURL, node: VNode, plugins: SatoriTransformer[]): Promise<void>;
|
|
10
8
|
export declare function defineSatoriTransformer(transformer: (url: ParsedURL) => SatoriTransformer): (url: ParsedURL) => SatoriTransformer;
|
|
@@ -1,29 +1,67 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { existsSync, promises as fsp } from "fs";
|
|
2
|
+
import { join } from "pathe";
|
|
3
|
+
import { useStorage } from "#internal/nitro";
|
|
4
|
+
import { publicDirs } from "#nuxt-og-image/config";
|
|
5
|
+
const cachedFonts = {};
|
|
6
|
+
const r = (base, key) => {
|
|
7
|
+
return join(base, key.replace(/:/g, "/"));
|
|
8
|
+
};
|
|
9
|
+
export async function readPublicAsset(file, encoding) {
|
|
10
|
+
for (const d of publicDirs) {
|
|
11
|
+
const path = r(d, file);
|
|
12
|
+
if (existsSync(path))
|
|
13
|
+
return await fsp.readFile(path, { encoding });
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function readPublicAssetBase64(file) {
|
|
17
|
+
const base64 = await readPublicAsset(file, "base64");
|
|
18
|
+
if (base64) {
|
|
19
|
+
let type = "image/jpeg";
|
|
20
|
+
const ext = file.split(".").pop();
|
|
21
|
+
if (ext === "svg")
|
|
22
|
+
type = "image/svg+xml";
|
|
23
|
+
else if (ext === "png")
|
|
24
|
+
type = "image/png";
|
|
25
|
+
return `data:${type};base64,${base64}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function loadFont(url, font) {
|
|
29
|
+
if (cachedFonts[font])
|
|
30
|
+
return cachedFonts[font];
|
|
31
|
+
const [name, weight] = font.split(":");
|
|
32
|
+
if (name === "Inter" && ["400", "700"].includes(weight)) {
|
|
33
|
+
const data2 = await readPublicAsset(`/inter-latin-ext-${weight}-normal.woff`);
|
|
34
|
+
if (data2) {
|
|
35
|
+
return cachedFonts[font] = { name, weight: weight === "400" ? "500" : weight, data: data2, style: "normal" };
|
|
12
36
|
}
|
|
13
|
-
if (!font.data)
|
|
14
|
-
font.data = await (await $fetch(withBase(font.publicPath, `${url.protocol}//${url.host}`))).arrayBuffer();
|
|
15
37
|
}
|
|
16
|
-
|
|
38
|
+
const fontUrl = await $fetch("/api/og-image-font", {
|
|
39
|
+
query: { name, weight }
|
|
40
|
+
});
|
|
41
|
+
let data;
|
|
42
|
+
const storageKey = `nuxt-og-image:font:${font}`;
|
|
43
|
+
const hasStoredFont = await useStorage().hasItem(storageKey);
|
|
44
|
+
if (!hasStoredFont) {
|
|
45
|
+
data = await $fetch(fontUrl, {
|
|
46
|
+
responseType: "arrayBuffer"
|
|
47
|
+
});
|
|
48
|
+
await useStorage().setItem(storageKey, data);
|
|
49
|
+
} else {
|
|
50
|
+
data = await useStorage().getItem(storageKey);
|
|
51
|
+
}
|
|
52
|
+
return cachedFonts[font] = { name, weight, data, style: "normal" };
|
|
17
53
|
}
|
|
18
54
|
export async function walkSatoriTree(url, node, plugins) {
|
|
19
55
|
if (!node.props?.children)
|
|
20
56
|
return;
|
|
21
57
|
for (const child of node.props.children || []) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
58
|
+
if (child) {
|
|
59
|
+
for (const plugin of plugins) {
|
|
60
|
+
if (plugin.filter(child))
|
|
61
|
+
await plugin.transform(child);
|
|
62
|
+
}
|
|
63
|
+
await walkSatoriTree(url, child, plugins);
|
|
25
64
|
}
|
|
26
|
-
await walkSatoriTree(url, child, plugins);
|
|
27
65
|
}
|
|
28
66
|
}
|
|
29
67
|
export function defineSatoriTransformer(transformer) {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getQuery } from "h3";
|
|
2
|
+
import { defineCachedEventHandler } from "#internal/nitro";
|
|
3
|
+
export default defineCachedEventHandler(async (e) => {
|
|
4
|
+
const { name, weight } = getQuery(e);
|
|
5
|
+
if (!name || !weight)
|
|
6
|
+
return "Provide a font name and weight";
|
|
7
|
+
const css = await await $fetch(`https://fonts.googleapis.com/css2?family=${name}:wght@${weight}`, {
|
|
8
|
+
headers: {
|
|
9
|
+
"User-Agent": "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; de-at) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1"
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const resource = css.match(/src: url\((.+)\) format\('(opentype|truetype)'\)/);
|
|
13
|
+
if (!resource)
|
|
14
|
+
return;
|
|
15
|
+
return resource[1];
|
|
16
|
+
}, {
|
|
17
|
+
getKey: (e) => {
|
|
18
|
+
const query = getQuery(e);
|
|
19
|
+
return `nuxt-og-image:font-url:${query.name}:${query.weight}`;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { parseURL, withBase, withoutTrailingSlash } from "ufo";
|
|
2
2
|
import { renderSSRHead } from "@unhead/ssr";
|
|
3
3
|
import { createHeadCore } from "@unhead/vue";
|
|
4
|
-
import { defineEventHandler, sendRedirect } from "h3";
|
|
4
|
+
import { defineEventHandler, getQuery, sendRedirect } from "h3";
|
|
5
5
|
import { fetchOptions, renderIsland, useHostname } from "../../utils.mjs";
|
|
6
|
-
import { defaults } from "#nuxt-og-image/config";
|
|
6
|
+
import { defaults, fonts } from "#nuxt-og-image/config";
|
|
7
7
|
export default defineEventHandler(async (e) => {
|
|
8
8
|
const path = parseURL(e.path).pathname;
|
|
9
9
|
if (!path.endsWith("__og_image__/html"))
|
|
10
10
|
return;
|
|
11
11
|
const basePath = withoutTrailingSlash(path.replace("__og_image__/html", ""));
|
|
12
|
+
const scale = getQuery(e).scale;
|
|
12
13
|
const options = await fetchOptions(basePath);
|
|
13
14
|
if (options.provider === "browser")
|
|
14
15
|
return sendRedirect(e, withBase(basePath, useHostname(e)));
|
|
@@ -18,7 +19,26 @@ export default defineEventHandler(async (e) => {
|
|
|
18
19
|
head.push({
|
|
19
20
|
style: [
|
|
20
21
|
{
|
|
21
|
-
innerHTML:
|
|
22
|
+
innerHTML: `body { font-family: '${fonts[0].split(":")[0].replace("+", " ")}', sans-serif; }`
|
|
23
|
+
},
|
|
24
|
+
scale ? {
|
|
25
|
+
innerHTML: `body {
|
|
26
|
+
transform: scale(${scale});
|
|
27
|
+
transform-origin: top left;
|
|
28
|
+
max-height: 100vh;
|
|
29
|
+
}
|
|
30
|
+
img.emoji {
|
|
31
|
+
height: 1em;
|
|
32
|
+
width: 1em;
|
|
33
|
+
margin: 0 .05em 0 .1em;
|
|
34
|
+
vertical-align: -0.1em;
|
|
35
|
+
}
|
|
36
|
+
`
|
|
37
|
+
} : {}
|
|
38
|
+
],
|
|
39
|
+
meta: [
|
|
40
|
+
{
|
|
41
|
+
charset: "utf-8"
|
|
22
42
|
}
|
|
23
43
|
],
|
|
24
44
|
script: [
|
|
@@ -38,10 +58,13 @@ export default defineEventHandler(async (e) => {
|
|
|
38
58
|
href: "https://cdn.jsdelivr.net/npm/gardevoir",
|
|
39
59
|
rel: "stylesheet"
|
|
40
60
|
},
|
|
41
|
-
{
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
61
|
+
...fonts.map((font) => {
|
|
62
|
+
const [name, weight] = font.split(":");
|
|
63
|
+
return {
|
|
64
|
+
href: `https://fonts.googleapis.com/css2?family=${name}:wght@${weight}&display=swap`,
|
|
65
|
+
rel: "stylesheet"
|
|
66
|
+
};
|
|
67
|
+
})
|
|
45
68
|
]
|
|
46
69
|
});
|
|
47
70
|
const headChunk = await renderSSRHead(head);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nuxt-og-image",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.0
|
|
4
|
+
"version": "1.0.0",
|
|
5
5
|
"packageManager": "pnpm@7.8.0",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"funding": "https://github.com/sponsors/harlan-zw",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@nuxt/kit": "3.0.0",
|
|
30
30
|
"@resvg/resvg-js": "^2.2.0",
|
|
31
|
+
"@types/fs-extra": "^11.0.1",
|
|
31
32
|
"birpc": "^0.2.3",
|
|
32
33
|
"chalk": "^5.2.0",
|
|
33
34
|
"chrome-launcher": "^0.15.1",
|
|
@@ -35,15 +36,17 @@
|
|
|
35
36
|
"execa": "^6.1.0",
|
|
36
37
|
"fast-glob": "^3.2.12",
|
|
37
38
|
"flatted": "^3.2.7",
|
|
39
|
+
"fs-extra": "^11.1.0",
|
|
38
40
|
"launch-editor": "^2.6.0",
|
|
39
41
|
"ohash": "^1.0.0",
|
|
40
|
-
"pathe": "^1.
|
|
42
|
+
"pathe": "^1.1.0",
|
|
41
43
|
"playwright-core": "^1.29.2",
|
|
42
44
|
"radix3": "^1.0.0",
|
|
43
45
|
"satori": "^0.1.1",
|
|
44
46
|
"satori-html": "^0.3.2",
|
|
45
47
|
"sirv": "^2.0.2",
|
|
46
48
|
"tinyws": "^0.1.0",
|
|
49
|
+
"twemoji": "^14.0.2",
|
|
47
50
|
"ufo": "^1.0.1"
|
|
48
51
|
},
|
|
49
52
|
"devDependencies": {
|