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.
@@ -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.8f8c20b5.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
+ 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.8f8c20b5.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
+ 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.8f8c20b5.js";const k={__name:"nuxt-error-page",props:{error:Object},setup(t){(t.error.stack||"").split(`
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.9ce3fbc6.js"),["./error-404.9ce3fbc6.js","./entry.8f8c20b5.js","./entry.0827acf4.css","./error-404.68aa58b4.css"],import.meta.url).then(e=>e.default||e)),l=n(()=>o(()=>import("./error-500.d6ddcb0b.js"),["./error-500.d6ddcb0b.js","./entry.8f8c20b5.js","./entry.0827acf4.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};
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};
@@ -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.8f8c20b5.js"><link rel="preload" as="style" href="/__nuxt_og_image__/client/_nuxt/entry.0827acf4.css"><link rel="prefetch" as="script" crossorigin href="/__nuxt_og_image__/client/_nuxt/error-component.42929008.js"><link rel="stylesheet" href="/__nuxt_og_image__/client/_nuxt/entry.0827acf4.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"}
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.8f8c20b5.js" crossorigin></script></body>
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
- satoriFonts: Array<Partial<SatoriOptions['fonts'][number]> & {
43
- publicPath: string;
44
- }>;
42
+ fonts: `${string}:${number}`[];
45
43
  satoriOptions: Partial<SatoriOptions>;
46
44
  forcePrerender: boolean;
47
45
  }
package/dist/module.json CHANGED
@@ -5,5 +5,5 @@
5
5
  "bridge": false
6
6
  },
7
7
  "configKey": "ogImage",
8
- "version": "1.0.0-beta.8"
8
+ "version": "1.0.0"
9
9
  }
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
- satoriFonts: [
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
- exposeConfig("#nuxt-og-image/config", "nuxt-og-image-config.mjs", config);
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: resolve("./runtime/public"), maxAge: 31536e3 });
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 { parseFont, walkSatoriTree } from "./utils.mjs";
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 { satoriFonts, satoriOptions } from "#nuxt-og-image/config";
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
- satoriOptions.fonts = satoriOptions.fonts || [];
23
- for (const font of satoriFonts)
24
- satoriOptions.fonts.push(await parseFont(url, font));
25
- const satoriTree = convertHtmlToSatori(body);
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,2 @@
1
+ declare const _default: (url: import("ufo").ParsedURL) => import("../../../../../types").SatoriTransformer;
2
+ export default _default;
@@ -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.children) && node.props.children.length >= 1) && !node.props.style?.display,
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 { dirname, resolve } from "pathe";
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 = getAsset(src);
14
- if (file) {
15
- const serverDir = dirname(fileURLToPath(import.meta.url));
16
- const path = resolve(serverDir, file.path);
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
- import type { SatoriOptions } from 'satori';
1
+ /// <reference types="node" />
2
2
  import type { ParsedURL } from 'ufo';
3
3
  import type { SatoriTransformer, VNode } from '../../../../types';
4
- export declare function parseFont(url: ParsedURL, font: SatoriOptions['fonts'][number] & {
5
- publicPath?: string;
6
- }): Promise<import("satori").Font & {
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 { fileURLToPath } from "node:url";
2
- import { promises as fsp } from "node:fs";
3
- import { dirname, resolve } from "pathe";
4
- import { withBase } from "ufo";
5
- import { getAsset } from "#internal/nitro/virtual/public-assets";
6
- export async function parseFont(url, font) {
7
- if (typeof font.publicPath === "string") {
8
- const file = getAsset(font.publicPath);
9
- if (file) {
10
- const serverDir = dirname(fileURLToPath(import.meta.url));
11
- font.data = await fsp.readFile(resolve(serverDir, file.path));
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
- return font;
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
- for (const plugin of plugins) {
23
- if (plugin.filter(child))
24
- await plugin.transform(child, url);
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,2 @@
1
+ declare const _default: any;
2
+ export default _default;
@@ -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: "body { font-family: 'Inter', sans-serif; }"
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
- href: "https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap",
43
- rel: "stylesheet"
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-beta.8",
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.0.0",
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": {