@samva/vite 0.8.0 → 0.9.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/AGENTS.md +62 -58
- package/README.md +140 -94
- package/dist/build.d.ts +47 -42
- package/dist/build.js +88 -213
- package/dist/dev.d.ts +22 -0
- package/dist/dev.js +43 -0
- package/dist/editor/assets/index-BtfwuWcY.js +32 -0
- package/dist/editor/assets/index-DIuS_EZu.css +2 -0
- package/dist/editor/index.html +2 -2
- package/dist/editor-Cow7zZ_9.js +780 -0
- package/dist/index.d.ts +11 -4
- package/dist/index.js +1 -1054
- package/dist/project-CiUuzKsC.d.ts +271 -0
- package/dist/project-Cp8qb3s0.js +774 -0
- package/dist/project.d.ts +2 -175
- package/dist/project.js +2 -2
- package/dist/render.d.ts +54 -0
- package/dist/render.js +98 -0
- package/package.json +11 -12
- package/dist/discovery-D2eR-rzi.js +0 -35
- package/dist/editor/assets/index-6Qlbkdhz.js +0 -36
- package/dist/editor/assets/index-Ed_V5wEW.css +0 -2
- package/dist/email.d.ts +0 -60
- package/dist/email.js +0 -126
- package/dist/emit.d.ts +0 -99
- package/dist/emit.js +0 -142
- package/dist/project-RON2Ei7d.js +0 -603
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--spacing:.25rem;--container-lg:32rem;--container-2xl:42rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--shadow-xs:0 1px 2px 0 #0000000d;--shadow-sm:0 1px 3px 0 #0000001a, 0 1px 2px -1px #0000001a;--shadow-md:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--shadow-lg:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--shadow-xl:0 20px 25px -5px #0000001a, 0 8px 10px -6px #0000001a;--ease-out:cubic-bezier(0, 0, .2, 1);--animate-spin:spin 1s linear infinite;--blur-md:12px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-accent-email:var(--accent-email);--color-sel-soft:var(--sel-soft);--color-sel-mid:var(--sel-mid);--color-background:var(--background);--color-foreground:var(--foreground);--color-muted:var(--muted);--color-muted-foreground:var(--muted-foreground);--color-border:var(--border);--color-border-subtle:var(--border-subtle);--color-surface-inset:var(--surface-inset);--color-surface-elevated:var(--surface-elevated);--color-primary:var(--primary);--color-primary-foreground:var(--primary-foreground);--color-placeholder:var(--placeholder);--color-status-success:var(--status-success);--color-status-warning:var(--status-warning);--color-status-error:var(--status-error)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}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;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-3{top:calc(var(--spacing) * 3)}.right-0{right:0}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:0}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing) * 3)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[80\]{z-index:80}.z-\[100\]{z-index:100}.z-\[110\]{z-index:110}.z-\[111\]{z-index:111}.z-\[120\]{z-index:120}.z-\[130\]{z-index:130}.z-\[131\]{z-index:131}.z-\[200\]{z-index:200}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-\[7px\]{width:7px;height:7px}.size-\[11px\]{width:11px;height:11px}.size-\[13px\]{width:13px;height:13px}.size-\[14px\]{width:14px;height:14px}.size-\[15px\]{width:15px;height:15px}.size-\[16px\]{width:16px;height:16px}.size-full{width:100%;height:100%}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-7\.5{height:calc(var(--spacing) * 7.5)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[92px\]{height:92px}.h-\[calc\(100\%-2rem\)\]{height:calc(100% - 2rem)}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-\[85dvh\]{max-height:85dvh}.max-h-\[min\(560px\,70vh\)\]{max-height:min(560px,70vh)}.min-h-0{min-height:0}.min-h-5{min-height:calc(var(--spacing) * 5)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-10{min-height:calc(var(--spacing) * 10)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-40{min-height:calc(var(--spacing) * 40)}.min-h-52{min-height:calc(var(--spacing) * 52)}.min-h-\[34px\]{min-height:34px}.min-h-full{min-height:100%}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-\[30px\]{width:30px}.w-\[42px\]{width:42px}.w-\[52px\]{width:52px}.w-\[82px\]{width:82px}.w-\[116px\]{width:116px}.w-\[150px\]{width:150px}.w-\[360px\]{width:360px}.w-\[375px\]{width:375px}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-\[420px\]{width:420px}.w-\[600px\]{width:600px}.w-\[clamp\(96px\,18vw\,240px\)\]{width:clamp(96px,18vw,240px)}.w-\[min\(840px\,calc\(100vw-32px\)\)\]{width:min(840px,100vw - 32px)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[72px\]{max-width:72px}.max-w-\[92vw\]{max-width:92vw}.max-w-\[170px\]{max-width:170px}.max-w-\[180px\]{max-width:180px}.max-w-\[280px\]{max-width:280px}.max-w-\[420px\]{max-width:420px}.max-w-\[460px\]{max-width:460px}.max-w-\[720px\]{max-width:720px}.max-w-\[1100px\]{max-width:1100px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-52{min-width:calc(var(--spacing) * 52)}.min-w-\[8ch\]{min-width:8ch}.min-w-\[128px\]{min-width:128px}.min-w-\[var\(--anchor-width\)\]{min-width:var(--anchor-width)}.flex-1{flex:1}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.origin-\[var\(--transform-origin\)\]{transform-origin:var(--transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-3{--tw-translate-x:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.list-none{list-style-type:none}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.grid-rows-\[auto_minmax\(0\,1fr\)_auto\]{grid-template-rows:auto minmax(0,1fr) auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[7px\]{border-radius:7px}.rounded-\[9px\]{border-radius:9px}.rounded-\[18px\]{border-radius:18px}.rounded-\[28px\]{border-radius:28px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent-email,.border-accent-email\/40{border-color:var(--color-accent-email)}@supports (color:color-mix(in lab, red, red)){.border-accent-email\/40{border-color:color-mix(in oklab, var(--color-accent-email) 40%, transparent)}}.border-border{border-color:var(--color-border)}.border-border-subtle{border-color:var(--color-border-subtle)}.border-border\/80{border-color:var(--color-border)}@supports (color:color-mix(in lab, red, red)){.border-border\/80{border-color:color-mix(in oklab, var(--color-border) 80%, transparent)}}.border-status-error\/30{border-color:var(--color-status-error)}@supports (color:color-mix(in lab, red, red)){.border-status-error\/30{border-color:color-mix(in oklab, var(--color-status-error) 30%, transparent)}}.border-status-error\/40{border-color:var(--color-status-error)}@supports (color:color-mix(in lab, red, red)){.border-status-error\/40{border-color:color-mix(in oklab, var(--color-status-error) 40%, transparent)}}.border-status-success\/40{border-color:var(--color-status-success)}@supports (color:color-mix(in lab, red, red)){.border-status-success\/40{border-color:color-mix(in oklab, var(--color-status-success) 40%, transparent)}}.border-status-warning\/45{border-color:var(--color-status-warning)}@supports (color:color-mix(in lab, red, red)){.border-status-warning\/45{border-color:color-mix(in oklab, var(--color-status-warning) 45%, transparent)}}.border-transparent{border-color:#0000}.bg-\[\#e9e2d8\]{background-color:#e9e2d8}.bg-\[var\(--editor-backdrop\,rgb\(0_0_0\/0\.28\)\)\]{background-color:var(--editor-backdrop,#00000047)}.bg-\[var\(--editor-canvas-bg\)\]{background-color:var(--editor-canvas-bg)}.bg-\[var\(--editor-scrollbar-thumb\)\]{background-color:var(--editor-scrollbar-thumb)}.bg-accent-email{background-color:var(--color-accent-email)}.bg-background,.bg-background\/45{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/45{background-color:color-mix(in oklab, var(--color-background) 45%, transparent)}}.bg-background\/92{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/92{background-color:color-mix(in oklab, var(--color-background) 92%, transparent)}}.bg-background\/95{background-color:var(--color-background)}@supports (color:color-mix(in lab, red, red)){.bg-background\/95{background-color:color-mix(in oklab, var(--color-background) 95%, transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-border{background-color:var(--color-border)}.bg-foreground{background-color:var(--color-foreground)}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground{background-color:var(--color-muted-foreground)}.bg-muted\/30{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--color-muted) 30%, transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-sel-soft{background-color:var(--color-sel-soft)}.bg-status-error,.bg-status-error\/5{background-color:var(--color-status-error)}@supports (color:color-mix(in lab, red, red)){.bg-status-error\/5{background-color:color-mix(in oklab, var(--color-status-error) 5%, transparent)}}.bg-status-success,.bg-status-success\/10{background-color:var(--color-status-success)}@supports (color:color-mix(in lab, red, red)){.bg-status-success\/10{background-color:color-mix(in oklab, var(--color-status-success) 10%, transparent)}}.bg-status-success\/12{background-color:var(--color-status-success)}@supports (color:color-mix(in lab, red, red)){.bg-status-success\/12{background-color:color-mix(in oklab, var(--color-status-success) 12%, transparent)}}.bg-status-warning{background-color:var(--color-status-warning)}.bg-surface-elevated{background-color:var(--color-surface-elevated)}.bg-surface-inset,.bg-surface-inset\/40{background-color:var(--color-surface-inset)}@supports (color:color-mix(in lab, red, red)){.bg-surface-inset\/40{background-color:color-mix(in oklab, var(--color-surface-inset) 40%, transparent)}}.bg-surface-inset\/80{background-color:var(--color-surface-inset)}@supports (color:color-mix(in lab, red, red)){.bg-surface-inset\/80{background-color:color-mix(in oklab, var(--color-surface-inset) 80%, transparent)}}.bg-transparent{background-color:#0000}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-10{padding-inline:calc(var(--spacing) * 10)}.px-\[7px\]{padding-inline:7px}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-\[3px\]{padding-block:3px}.py-px{padding-block:1px}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-10{padding-top:calc(var(--spacing) * 10)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.pb-12{padding-bottom:calc(var(--spacing) * 12)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.82em\]{font-size:.82em}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent-email{color:var(--color-accent-email)}.text-background{color:var(--color-background)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-placeholder{color:var(--color-placeholder)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-status-error{color:var(--color-status-error)}.text-status-success{color:var(--color-status-success)}.text-status-warning{color:var(--color-status-warning)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.\[color-scheme\:light\]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.opacity-70{opacity:.7}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_0_1px_var\(--accent-email\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--accent-email));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-floating\)\]{--tw-shadow:var(--shadow-floating);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-lg\)\]{--tw-shadow:var(--shadow-lg);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-md\)\]{--tw-shadow:var(--shadow-md);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-sm\)\]{--tw-shadow:var(--shadow-sm);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-xl\)\]{--tw-shadow:var(--shadow-xl);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[var\(--shadow-xs\)\]{--tw-shadow:var(--shadow-xs);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-accent-email\/20{--tw-ring-color:var(--color-accent-email)}@supports (color:color-mix(in lab, red, red)){.ring-accent-email\/20{--tw-ring-color:color-mix(in oklab, var(--color-accent-email) 20%, transparent)}}.ring-primary{--tw-ring-color:var(--color-primary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[1px\]{--tw-backdrop-blur:blur(1px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-color\,box-shadow\]{transition-property:border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[color\,background-color\,border-color\,box-shadow\]{transition-property:color,background-color,border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,scale\,opacity\]{transition-property:transform,scale,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\,transform\,box-shadow\]{transition-property:width,transform,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-180{--tw-duration:.18s;transition-duration:.18s}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[overflow-anchor\:none\]{overflow-anchor:none}.ring-inset{--tw-ring-inset:inset}.placeholder\:text-muted-foreground\/60::placeholder{color:var(--color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-muted-foreground\/60::placeholder{color:color-mix(in oklab, var(--color-muted-foreground) 60%, transparent)}}.placeholder\:text-placeholder::placeholder{color:var(--color-placeholder)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-y-0:before{content:var(--tw-content);inset-block:0}.before\:left-1\/2:before{content:var(--tw-content);left:50%}.before\:w-px:before{content:var(--tw-content);width:1px}.before\:-translate-x-1\/2:before{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.before\:bg-border:before{content:var(--tw-content);background-color:var(--color-border)}.before\:transition-colors:before{content:var(--tw-content);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:top-1\/2:after{content:var(--tw-content);top:50%}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:h-10:after{content:var(--tw-content);height:calc(var(--spacing) * 10)}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.after\:-translate-y-1\/2:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.after\:rounded-full:after{content:var(--tw-content);border-radius:2147483647px}.after\:bg-muted-foreground\/35:after{content:var(--tw-content);background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.after\:bg-muted-foreground\/35:after{background-color:color-mix(in oklab, var(--color-muted-foreground) 35%, transparent)}}.after\:opacity-60:after{content:var(--tw-content);opacity:.6}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.first\:mt-0:first-child{margin-top:0}.read-only\:bg-muted:read-only{background-color:var(--color-muted)}.read-only\:shadow-none:read-only{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-within\:ring-\[3px\]:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.hover\:border-sel-mid:hover{border-color:var(--color-sel-mid)}.hover\:bg-\[var\(--editor-scrollbar-thumb-hover\)\]:hover{background-color:var(--editor-scrollbar-thumb-hover)}.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:text-status-error:hover{color:var(--color-status-error)}.hover\:opacity-90:hover{opacity:.9}.hover\:before\:w-0\.5:hover:before{content:var(--tw-content);width:calc(var(--spacing) * .5)}.hover\:before\:bg-accent-email:hover:before,.hover\:after\:bg-accent-email:hover:after{content:var(--tw-content);background-color:var(--color-accent-email)}.hover\:after\:opacity-100:hover:after{content:var(--tw-content);opacity:1}}.focus\:bg-background:focus,.focus-visible\:bg-background:focus-visible{background-color:var(--color-background)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.active\:translate-y-px:active{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:before\:bg-accent-email:active:before{content:var(--tw-content);background-color:var(--color-accent-email)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-surface-inset:disabled{background-color:var(--color-surface-inset)}.disabled\:text-muted-foreground:disabled{color:var(--color-muted-foreground)}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (hover:hover){.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}}.data-highlighted\:bg-muted[data-highlighted]{background-color:var(--color-muted)}.data-\[ending-style\]\:scale-95[data-ending-style]{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-\[ending-style\]\:opacity-0[data-ending-style]{opacity:0}.data-\[highlighted\]\:bg-sel-soft[data-highlighted]{background-color:var(--color-sel-soft)}.data-\[highlighted\]\:text-accent-email[data-highlighted]{color:var(--color-accent-email)}.data-\[starting-style\]\:scale-95[data-starting-style]{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-\[starting-style\]\:opacity-0[data-starting-style]{opacity:0}@media (width>=40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}}.dark\:grid:where(.dark,.dark *){display:grid}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:bg-\[\#0b141a\]:where(.dark,.dark *){background-color:#0b141a}.dark\:\[color-scheme\:dark\]:where(.dark,.dark *){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.dark\:read-only\:bg-muted\/40:where(.dark,.dark *):read-only{background-color:var(--color-muted)}@supports (color:color-mix(in lab, red, red)){.dark\:read-only\:bg-muted\/40:where(.dark,.dark *):read-only{background-color:color-mix(in oklab, var(--color-muted) 40%, transparent)}}.dark\:read-only\:shadow-none:where(.dark,.dark *):read-only{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.\[\&_\[data-channel-button\]\]\:px-1\.5 [data-channel-button]{padding-inline:calc(var(--spacing) * 1.5)}.\[\&_\[data-channel-label\]\]\:hidden [data-channel-label]{display:none}}:root{--accent-email:oklch(62% .21 255);--sel-soft:oklch(62% .21 255/.08);--sel-mid:oklch(62% .21 255/.35);--editor-scrollbar-thumb:oklch(78% .01 286);--editor-scrollbar-thumb-hover:oklch(62% .015 286)}.dark{--sel-soft:oklch(62% .21 255/.16);--editor-scrollbar-thumb:oklch(32% .01 286);--editor-scrollbar-thumb-hover:oklch(42% .012 286)}.samva-editor-shell{--editor-bg:var(--background);--editor-fg:var(--foreground);--editor-surface:var(--card);--editor-surface-elevated:var(--surface-elevated);--editor-surface-inset:var(--surface-inset);--editor-muted:var(--muted);--editor-muted-fg:var(--muted-foreground);--editor-placeholder:var(--placeholder);--editor-border:var(--border);--editor-border-subtle:var(--border-subtle);--editor-hover:var(--muted);--editor-active:var(--accent);--editor-accent:var(--accent-email);--editor-accent-fg:oklch(100% 0 0);--editor-selection-soft:var(--sel-soft);--editor-selection-mid:var(--sel-mid);--editor-focus-ring:var(--ring);--editor-disabled-fg:var(--muted-foreground);--editor-success:var(--status-success);--editor-warning:var(--status-warning);--editor-error:var(--status-error);--editor-info:var(--status-info);--editor-canvas-bg:var(--surface-inset);--editor-canvas-grid:var(--border)}@supports (color:color-mix(in lab, red, red)){.samva-editor-shell{--editor-canvas-grid:color-mix(in oklab, var(--border) 64%, transparent)}}.samva-editor-shell{--editor-canvas-hover:var(--editor-selection-mid);--editor-canvas-selected:var(--editor-accent);--editor-canvas-selected-fg:var(--editor-accent-fg);--editor-canvas-generated:oklch(62% .21 305);--editor-canvas-document-bg:oklch(100% 0 0);--editor-backdrop:oklab(0% none none/.28);--editor-shadow-control:var(--shadow-xs);--editor-shadow-overlay:var(--shadow-lg);--editor-shadow-floating:var(--shadow-floating);background-color:var(--editor-bg);color:var(--editor-fg);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;font-size:13px;line-height:1.45}.samva-editor-frame{container:samva-editor/inline-size}.dark .samva-editor-shell{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}@container samva-editor (width<=1279px){.samva-editor-shell[data-layout=wide] [data-editor-rail=right],.samva-editor-shell[data-layout=wide] [data-editor-resize=right]{display:none}}@container samva-editor (width<=979px){.samva-editor-shell[data-layout=wide] [data-editor-rail=left],.samva-editor-shell[data-layout=wide] [data-editor-resize=left]{display:none}}.samva-inspector-content>div{border:0;border-bottom:1px solid var(--border-subtle);background:0 0;border-radius:0;margin:0;padding-inline:12px}.samva-inspector-content>div:last-child{border-bottom:0}.samva-radius-slider{appearance:none;cursor:ew-resize;background:0 0;height:18px}.samva-radius-slider::-webkit-slider-runnable-track{background:var(--border);border-radius:999px;height:3px}.samva-radius-slider::-webkit-slider-thumb{appearance:none;border:1px solid var(--border);background:var(--foreground);width:12px;height:12px;box-shadow:var(--editor-shadow-control);border-radius:999px;margin-top:-4.5px}.samva-radius-slider::-moz-range-track{background:var(--border);border-radius:999px;height:3px}.samva-radius-slider::-moz-range-thumb{border:1px solid var(--border);background:var(--foreground);width:12px;height:12px;box-shadow:var(--editor-shadow-control);border-radius:999px}.samva-radius-slider:focus-visible{outline:2px solid var(--accent-email)}@supports (color:color-mix(in lab, red, red)){.samva-radius-slider:focus-visible{outline:2px solid color-mix(in oklab, var(--accent-email) 55%, transparent)}}.samva-radius-slider:focus-visible{outline-offset:3px}.samva-radius-slider-overridden::-webkit-slider-thumb{background:var(--accent-email)}.samva-radius-slider-overridden::-moz-range-thumb{background:var(--accent-email)}@container samva-editor (width<=719px){.samva-editor-workspace .samva-editor-scroll{padding-inline:16px;padding-top:16px}.samva-editor-shell button{touch-action:manipulation}}.samva-editor-workspace{background-color:var(--editor-canvas-bg);background-image:linear-gradient(to right, var(--editor-canvas-grid) 1px, transparent 1px), linear-gradient(to bottom, var(--editor-canvas-grid) 1px, transparent 1px);background-position:top;background-size:24px 24px}.dark .samva-editor-workspace{--editor-canvas-grid:var(--editor-border)}@supports (color:color-mix(in lab, red, red)){.dark .samva-editor-workspace{--editor-canvas-grid:color-mix(in oklab, var(--editor-border) 55%, transparent)}}.samva-editor-scroll{color-scheme:inherit;scrollbar-width:thin;scrollbar-color:var(--editor-scrollbar-thumb) transparent}.samva-editor-scroll::-webkit-scrollbar{width:10px;height:10px}.samva-editor-scroll::-webkit-scrollbar-track{background:0 0}.samva-editor-scroll::-webkit-scrollbar-thumb{background-color:var(--editor-scrollbar-thumb);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.samva-editor-scroll::-webkit-scrollbar-thumb:hover{background-color:var(--editor-scrollbar-thumb-hover);background-clip:padding-box}@media (prefers-reduced-motion:reduce){.samva-editor-shell,.samva-editor-shell *,.samva-editor-shell :before,.samva-editor-shell :after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}:root{--background:oklch(100% 0 0);--foreground:oklch(14.1% .005 285.823);--muted:oklch(96.7% .001 286.375);--muted-foreground:oklch(55.2% .016 285.938);--border:oklch(92% .004 286.32);--border-subtle:oklch(94% .002 286);--surface-inset:oklch(97.5% .001 286);--surface-elevated:oklch(99.5% 0 0);--primary:oklch(21% .006 285.885);--primary-foreground:oklch(98.5% 0 0);--placeholder:oklch(65% .012 285.9);--status-success:oklch(65% .22 155);--status-warning:oklch(75% .18 75);--status-error:oklch(57.7% .245 27.325);--shadow-md:0 2px 4px -1px oklch(0% 0 0/.06), 0 6px 12px -2px oklch(0% 0 0/.08);--shadow-xl:0 12px 24px -6px oklch(0% 0 0/.1), 0 32px 64px -12px oklch(0% 0 0/.16)}.dark{--background:oklch(14.1% .005 285.823);--foreground:oklch(98.5% 0 0);--muted:oklch(27.4% .006 286.033);--muted-foreground:oklch(75% .015 286.067);--border:oklch(100% 0 0/.1);--border-subtle:oklch(100% 0 0/.07);--surface-inset:oklch(16% .004 286);--surface-elevated:oklch(18% .005 286);--primary:oklch(92% .004 286.32);--primary-foreground:oklch(21% .006 285.885);--placeholder:oklch(68% .012 285.9);--shadow-md:0 2px 4px -1px oklch(0% 0 0/.4), 0 6px 12px -2px oklch(0% 0 0/.45);--shadow-xl:0 12px 24px -6px oklch(0% 0 0/.55), 0 32px 64px -12px oklch(0% 0 0/.7)}html,body,#root{height:100%;margin:0}html{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}html.dark{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}body{color:var(--foreground);background:var(--background);-webkit-font-smoothing:antialiased;font-family:ui-sans-serif,system-ui,sans-serif;font-size:13px;line-height:1.45;overflow:hidden}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}
|
package/dist/email.d.ts
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import { CompiledEmailProject, TransformOptions, compileEmailProject } from "@samva/markup/compiler";
|
|
2
|
-
import { TemplateDefinition } from "@samva/markup/template";
|
|
3
|
-
import { SerializeEmailOptions } from "@samva/markup/email/html";
|
|
4
|
-
import { renderEmail } from "@samva/markup/email/render";
|
|
5
|
-
//#region src/email.d.ts
|
|
6
|
-
interface EmailProjectSource {
|
|
7
|
-
/** Project-relative path to text content, or to bytes for an imported file. */
|
|
8
|
-
readonly [path: string]: string | Uint8Array;
|
|
9
|
-
}
|
|
10
|
-
interface RenderedEmailProject extends ReturnType<typeof renderEmail> {
|
|
11
|
-
readonly compiled: CompiledEmailProject;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* One compiled entry, evaluated. `template` is `undefined` when the entry has no
|
|
15
|
-
* default export, which is how a helper module is told apart from a template
|
|
16
|
-
* without inspecting authored source.
|
|
17
|
-
*/
|
|
18
|
-
interface LoadedEmailEntry {
|
|
19
|
-
readonly template: TemplateDefinition<unknown> | undefined;
|
|
20
|
-
readonly renderEmail: typeof renderEmail;
|
|
21
|
-
readonly compiled: CompiledEmailProject;
|
|
22
|
-
}
|
|
23
|
-
/** A long-lived evaluator. Every render shares its module graph, as a dev server does. */
|
|
24
|
-
interface EmailRenderer {
|
|
25
|
-
/**
|
|
26
|
-
* Compile one entry and evaluate the compiler's generated wrapper. Callers
|
|
27
|
-
* that render several inputs against one template load once and render many
|
|
28
|
-
* times; nothing here renders on its own.
|
|
29
|
-
*
|
|
30
|
-
* `namespace` names the id space the entry's modules occupy. Reusing one
|
|
31
|
-
* keeps a watch session's ids stable across reloads, while a fresh one
|
|
32
|
-
* isolates an unrelated project. Omitting it takes a new namespace each time.
|
|
33
|
-
* Every load re-evaluates the namespace's own modules, so the wrapper binds
|
|
34
|
-
* the sheets its imports registered; `invalidate` reaches the modules shared
|
|
35
|
-
* between namespaces.
|
|
36
|
-
*/
|
|
37
|
-
readonly load: (source: EmailProjectSource, entryPoint: string, namespace?: string) => Promise<LoadedEmailEntry>;
|
|
38
|
-
/**
|
|
39
|
-
* Compile, evaluate and render one input in a single call. `serialize` reaches
|
|
40
|
-
* the serializer, so a caller that renders for an editor asks for
|
|
41
|
-
* `instancePaths` here; a render that will be delivered passes nothing.
|
|
42
|
-
*/
|
|
43
|
-
readonly render: (source: EmailProjectSource, entryPoint: string, input: unknown, serialize?: SerializeEmailOptions) => Promise<RenderedEmailProject>;
|
|
44
|
-
/** Drop every evaluated module so the next load re-reads changed source. */
|
|
45
|
-
readonly invalidate: () => void;
|
|
46
|
-
readonly close: () => Promise<void>;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* One Vite server, many renders. Each project gets its own id namespace so their
|
|
50
|
-
* modules coexist in one graph — which also means they share one instance of
|
|
51
|
-
* `@samva/markup`, exactly as a published consumer's install does. That shared
|
|
52
|
-
* instance holds the stylesheet registry, which is why the compiler's generated
|
|
53
|
-
* reset module runs first in every project's graph.
|
|
54
|
-
*/
|
|
55
|
-
declare const createEmailRenderer: (options: TransformOptions, ssrExternal?: readonly string[]) => Promise<EmailRenderer>;
|
|
56
|
-
/** Compile and render one project, then release the evaluator. */
|
|
57
|
-
declare const renderEmailProject: (source: EmailProjectSource, entryPoint: string, options: TransformOptions, input: unknown) => Promise<RenderedEmailProject>;
|
|
58
|
-
//#endregion
|
|
59
|
-
export { type CompiledEmailProject, EmailProjectSource, EmailRenderer, LoadedEmailEntry, RenderedEmailProject, compileEmailProject, createEmailRenderer, renderEmailProject };
|
|
60
|
-
//# sourceMappingURL=email.d.ts.map
|
package/dist/email.js
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import { dirname } from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
|
-
import { compileEmailProject } from "@samva/markup/compiler";
|
|
4
|
-
//#region src/email.ts
|
|
5
|
-
const VIRTUAL = "/@samva-email/";
|
|
6
|
-
/** This package's own directory: `src` in the repository, `dist` when published. */
|
|
7
|
-
const RESOLUTION_ROOT = dirname(fileURLToPath(import.meta.url));
|
|
8
|
-
const SCRIPT = /\.[cm]?[jt]sx?$/;
|
|
9
|
-
const qualify = (path) => SCRIPT.test(path) ? path : `${path}.js`;
|
|
10
|
-
const unqualify = (id) => id.endsWith(".js") && !SCRIPT.test(id.slice(0, -3)) ? id.slice(0, -3) : id;
|
|
11
|
-
const resolveWithin = (graph, id, importer) => {
|
|
12
|
-
const own = id.startsWith(graph.prefix) ? unqualify(id.slice(graph.prefix.length)) : id;
|
|
13
|
-
if (graph.files[own] !== void 0) return `${graph.prefix}${qualify(own)}`;
|
|
14
|
-
if (!own.startsWith(".")) return void 0;
|
|
15
|
-
const segments = [...(importer?.startsWith(graph.prefix) === true ? unqualify(importer.slice(graph.prefix.length)) : "").split("/").slice(0, -1), ...own.split("/")];
|
|
16
|
-
const parts = [];
|
|
17
|
-
for (const segment of segments) {
|
|
18
|
-
if (segment === "." || segment === "") continue;
|
|
19
|
-
if (segment === "..") parts.pop();
|
|
20
|
-
else parts.push(segment);
|
|
21
|
-
}
|
|
22
|
-
const path = parts.join("/");
|
|
23
|
-
for (const candidate of [
|
|
24
|
-
path,
|
|
25
|
-
`${path}.ts`,
|
|
26
|
-
`${path}.tsx`,
|
|
27
|
-
`${path}.js`,
|
|
28
|
-
`${path}/index.ts`
|
|
29
|
-
]) if (graph.files[candidate] !== void 0) return `${graph.prefix}${qualify(candidate)}`;
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* One Vite server, many renders. Each project gets its own id namespace so their
|
|
33
|
-
* modules coexist in one graph — which also means they share one instance of
|
|
34
|
-
* `@samva/markup`, exactly as a published consumer's install does. That shared
|
|
35
|
-
* instance holds the stylesheet registry, which is why the compiler's generated
|
|
36
|
-
* reset module runs first in every project's graph.
|
|
37
|
-
*/
|
|
38
|
-
const createEmailRenderer = async (options, ssrExternal = []) => {
|
|
39
|
-
const vite = await import("vite").catch(() => void 0);
|
|
40
|
-
if (vite === void 0) throw new Error("`vite` is required to render an email project locally.");
|
|
41
|
-
const graphs = /* @__PURE__ */ new Map();
|
|
42
|
-
let anonymous = 0;
|
|
43
|
-
let evaluating = Promise.resolve();
|
|
44
|
-
const evaluate = (operation) => {
|
|
45
|
-
const running = evaluating.then(operation, operation);
|
|
46
|
-
evaluating = running.catch(() => void 0);
|
|
47
|
-
return running;
|
|
48
|
-
};
|
|
49
|
-
const graphFor = (id) => id === void 0 ? void 0 : [...graphs.values()].find((graph) => id.startsWith(graph.prefix));
|
|
50
|
-
const server = await vite.createServer({
|
|
51
|
-
root: RESOLUTION_ROOT,
|
|
52
|
-
configFile: false,
|
|
53
|
-
logLevel: "silent",
|
|
54
|
-
server: {
|
|
55
|
-
middlewareMode: true,
|
|
56
|
-
hmr: false
|
|
57
|
-
},
|
|
58
|
-
optimizeDeps: {
|
|
59
|
-
noDiscovery: true,
|
|
60
|
-
include: []
|
|
61
|
-
},
|
|
62
|
-
oxc: { jsx: {
|
|
63
|
-
runtime: "automatic",
|
|
64
|
-
importSource: "@samva/markup/email"
|
|
65
|
-
} },
|
|
66
|
-
...ssrExternal.length === 0 ? {} : { ssr: { external: [...ssrExternal] } },
|
|
67
|
-
plugins: [{
|
|
68
|
-
name: "samva:email-project",
|
|
69
|
-
enforce: "pre",
|
|
70
|
-
resolveId: (id, importer) => {
|
|
71
|
-
const graph = graphFor(id) ?? graphFor(importer);
|
|
72
|
-
return graph === void 0 ? void 0 : resolveWithin(graph, id, importer);
|
|
73
|
-
},
|
|
74
|
-
load: (id) => {
|
|
75
|
-
const graph = graphFor(id);
|
|
76
|
-
return graph === void 0 ? void 0 : graph.files[unqualify(id.slice(graph.prefix.length))];
|
|
77
|
-
}
|
|
78
|
-
}]
|
|
79
|
-
});
|
|
80
|
-
const load = async (source, entryPoint, namespace) => {
|
|
81
|
-
const key = namespace ?? `#${anonymous += 1}`;
|
|
82
|
-
const graph = graphs.get(key) ?? {
|
|
83
|
-
files: {},
|
|
84
|
-
prefix: `${VIRTUAL}${graphs.size}/`
|
|
85
|
-
};
|
|
86
|
-
graphs.set(key, graph);
|
|
87
|
-
const compiled = await compileEmailProject(source, entryPoint, options);
|
|
88
|
-
graph.files = compiled.files;
|
|
89
|
-
const module = await evaluate(async () => {
|
|
90
|
-
const ssr = server.environments.ssr;
|
|
91
|
-
for (const node of ssr.moduleGraph.idToModuleMap.values()) if (node.id?.startsWith(graph.prefix) === true) ssr.moduleGraph.invalidateModule(node);
|
|
92
|
-
return await server.ssrLoadModule(`${graph.prefix}${qualify(compiled.entryPoint)}`);
|
|
93
|
-
});
|
|
94
|
-
return {
|
|
95
|
-
template: module.template,
|
|
96
|
-
renderEmail: module.renderEmail,
|
|
97
|
-
compiled
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
return {
|
|
101
|
-
load,
|
|
102
|
-
render: async (source, entryPoint, input, serialize) => {
|
|
103
|
-
const entry = await load(source, entryPoint);
|
|
104
|
-
if (entry.template === void 0) throw new TypeError(`${entryPoint} does not default-export a template definition.`);
|
|
105
|
-
return {
|
|
106
|
-
...entry.renderEmail(entry.template, input, serialize),
|
|
107
|
-
compiled: entry.compiled
|
|
108
|
-
};
|
|
109
|
-
},
|
|
110
|
-
invalidate: () => server.moduleGraph.invalidateAll(),
|
|
111
|
-
close: () => server.close()
|
|
112
|
-
};
|
|
113
|
-
};
|
|
114
|
-
/** Compile and render one project, then release the evaluator. */
|
|
115
|
-
const renderEmailProject = async (source, entryPoint, options, input) => {
|
|
116
|
-
const renderer = await createEmailRenderer(options);
|
|
117
|
-
try {
|
|
118
|
-
return await renderer.render(source, entryPoint, input);
|
|
119
|
-
} finally {
|
|
120
|
-
await renderer.close();
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
//#endregion
|
|
124
|
-
export { compileEmailProject, createEmailRenderer, renderEmailProject };
|
|
125
|
-
|
|
126
|
-
//# sourceMappingURL=email.js.map
|
package/dist/emit.d.ts
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { COMPILER_VERSION } from "@samva/markup/compile";
|
|
2
|
-
import { Diagnostic } from "@samva/markup/diagnostics";
|
|
3
|
-
import { TemplateVariable } from "@samva/markup/render-template";
|
|
4
|
-
//#region src/emit.d.ts
|
|
5
|
-
/** Structured channel preview emission, independent of the email execution runtime. */
|
|
6
|
-
type PreviewChannel = "unknown" | "sms" | "whatsapp";
|
|
7
|
-
type WhatsAppButtonPreview = {
|
|
8
|
-
readonly type: "QUICK_REPLY";
|
|
9
|
-
readonly text: string;
|
|
10
|
-
} | {
|
|
11
|
-
readonly type: "URL";
|
|
12
|
-
readonly text: string;
|
|
13
|
-
readonly url: string;
|
|
14
|
-
} | {
|
|
15
|
-
readonly type: "PHONE_NUMBER";
|
|
16
|
-
readonly text: string;
|
|
17
|
-
readonly phone_number: string;
|
|
18
|
-
} | {
|
|
19
|
-
readonly type: "COPY_CODE";
|
|
20
|
-
readonly example: string;
|
|
21
|
-
};
|
|
22
|
-
interface AuthoringValidationSummary {
|
|
23
|
-
readonly ok: boolean;
|
|
24
|
-
readonly diagnostics: number;
|
|
25
|
-
readonly warnings: number;
|
|
26
|
-
readonly repairableDiagnostics: number;
|
|
27
|
-
readonly placeholders: readonly string[];
|
|
28
|
-
readonly darkClassCount: number;
|
|
29
|
-
}
|
|
30
|
-
/** The compiled payload for one template, discriminated by channel. */
|
|
31
|
-
type CompiledPreview = {
|
|
32
|
-
readonly channel: "unknown";
|
|
33
|
-
readonly ok: false;
|
|
34
|
-
readonly diagnostics: readonly Diagnostic[];
|
|
35
|
-
readonly warnings?: readonly Diagnostic[];
|
|
36
|
-
} | {
|
|
37
|
-
readonly channel: "sms";
|
|
38
|
-
readonly ok: boolean;
|
|
39
|
-
readonly body?: string | undefined;
|
|
40
|
-
readonly encoding?: "gsm7" | "ucs2" | undefined;
|
|
41
|
-
readonly estimatedSegments?: number | undefined;
|
|
42
|
-
readonly maxSegments?: number | undefined;
|
|
43
|
-
readonly warnings?: readonly Diagnostic[] | undefined;
|
|
44
|
-
readonly diagnostics?: readonly Diagnostic[] | undefined;
|
|
45
|
-
} | {
|
|
46
|
-
readonly channel: "whatsapp";
|
|
47
|
-
readonly ok: boolean;
|
|
48
|
-
readonly headerType?: "text" | "image" | "video" | "document" | undefined;
|
|
49
|
-
readonly headerContent?: string | undefined;
|
|
50
|
-
readonly bodyContent?: string | undefined;
|
|
51
|
-
readonly footerContent?: string | undefined;
|
|
52
|
-
readonly buttons?: readonly WhatsAppButtonPreview[] | undefined;
|
|
53
|
-
readonly warnings?: readonly Diagnostic[] | undefined;
|
|
54
|
-
readonly diagnostics?: readonly Diagnostic[] | undefined;
|
|
55
|
-
};
|
|
56
|
-
/**
|
|
57
|
-
* One template's full preview payload: its emitted SML, inferred variable
|
|
58
|
-
* schema, emit diagnostics, the derived channel, and the channel's compiled
|
|
59
|
-
* output. `ok` is true only when the template emitted cleanly AND compiled
|
|
60
|
-
* without error — the shape the preview client and the CLI both gate on.
|
|
61
|
-
*/
|
|
62
|
-
interface EmittedTemplatePreview {
|
|
63
|
-
readonly name: string;
|
|
64
|
-
readonly ok: boolean;
|
|
65
|
-
readonly channel: PreviewChannel;
|
|
66
|
-
/** Emitted SML, present whenever the render itself succeeded (even if unstable). */
|
|
67
|
-
readonly source: string | undefined;
|
|
68
|
-
readonly variables: readonly TemplateVariable[];
|
|
69
|
-
readonly diagnostics: readonly Diagnostic[];
|
|
70
|
-
readonly compiled: CompiledPreview;
|
|
71
|
-
readonly validation: AuthoringValidationSummary;
|
|
72
|
-
}
|
|
73
|
-
/** The aggregate for one module file. */
|
|
74
|
-
interface ModulePreview {
|
|
75
|
-
readonly ok: boolean;
|
|
76
|
-
readonly compilerVersion: string;
|
|
77
|
-
readonly templates: readonly EmittedTemplatePreview[];
|
|
78
|
-
readonly diagnostics: readonly Diagnostic[];
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Emits + compiles the one supported template export from an already-evaluated
|
|
82
|
-
* TSX file. A template file owns exactly one template: its `default` export.
|
|
83
|
-
* Named exports are ordinary helpers and are never inspected or invoked.
|
|
84
|
-
*
|
|
85
|
-
* `name` comes from the file identity rather than the JavaScript function name,
|
|
86
|
-
* keeping the catalog, build output, and CLI push slug stable when a developer
|
|
87
|
-
* changes the implementation shape of the default export. Direct callers of
|
|
88
|
-
* `@samva/vite/emit` must pass that file-backed name as the first argument.
|
|
89
|
-
*/
|
|
90
|
-
declare const emitModulePreview: (name: string, moduleExports: Record<string, unknown>) => ModulePreview;
|
|
91
|
-
/**
|
|
92
|
-
* Compiles a raw SML source string directly (no TSX). Used by tests and any
|
|
93
|
-
* caller that already holds emitted SML. Wraps the single source in the same
|
|
94
|
-
* preview shape so the client renders compiled SML identically to TSX emission.
|
|
95
|
-
*/
|
|
96
|
-
declare const compileSourcePreview: (name: string, source: string) => EmittedTemplatePreview;
|
|
97
|
-
//#endregion
|
|
98
|
-
export { AuthoringValidationSummary, COMPILER_VERSION, CompiledPreview, EmittedTemplatePreview, ModulePreview, PreviewChannel, WhatsAppButtonPreview, compileSourcePreview, emitModulePreview };
|
|
99
|
-
//# sourceMappingURL=emit.d.ts.map
|
package/dist/emit.js
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { COMPILER_VERSION, compileSource } from "@samva/markup/compile";
|
|
2
|
-
import { emitModule } from "@samva/markup/emit";
|
|
3
|
-
import { Result } from "better-result";
|
|
4
|
-
//#region src/emit.ts
|
|
5
|
-
const countRepairable = (diagnostics) => diagnostics.filter((diagnostic) => diagnostic.repair !== void 0).length;
|
|
6
|
-
const uniquePlaceholders = (source) => source === void 0 ? [] : [...new Set([...source.matchAll(/{{\s*([A-Za-z_][\w.-]*)\s*}}/g)].map((match) => match[1] ?? ""))].filter(Boolean).sort();
|
|
7
|
-
const darkClassCount = (source) => source === void 0 ? 0 : (source.match(/\bdark:/g) ?? []).length;
|
|
8
|
-
const validationSummary = (source, emitDiagnostics, compiled) => {
|
|
9
|
-
const warnings = compiled.warnings ?? [];
|
|
10
|
-
const diagnostics = compiled.diagnostics ?? [];
|
|
11
|
-
return {
|
|
12
|
-
ok: compiled.ok && emitDiagnostics.length === 0,
|
|
13
|
-
diagnostics: emitDiagnostics.length + diagnostics.length,
|
|
14
|
-
warnings: warnings.length,
|
|
15
|
-
repairableDiagnostics: countRepairable(emitDiagnostics) + countRepairable(diagnostics),
|
|
16
|
-
placeholders: uniquePlaceholders(source),
|
|
17
|
-
darkClassCount: darkClassCount(source)
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
/** Compile one source into its channel-polymorphic preview. */
|
|
21
|
-
const compiledPreview = (source) => {
|
|
22
|
-
const probe = compileSource(source);
|
|
23
|
-
if (Result.isError(probe)) return {
|
|
24
|
-
channel: "unknown",
|
|
25
|
-
compileOk: false,
|
|
26
|
-
compiled: {
|
|
27
|
-
channel: "unknown",
|
|
28
|
-
ok: false,
|
|
29
|
-
diagnostics: probe.error.diagnostics
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
const compiled = probe.value;
|
|
33
|
-
if (compiled.channel === "sms") return {
|
|
34
|
-
channel: "sms",
|
|
35
|
-
compileOk: true,
|
|
36
|
-
compiled: {
|
|
37
|
-
channel: "sms",
|
|
38
|
-
ok: true,
|
|
39
|
-
body: compiled.body,
|
|
40
|
-
encoding: compiled.encoding,
|
|
41
|
-
estimatedSegments: compiled.estimatedSegments,
|
|
42
|
-
maxSegments: compiled.maxSegments,
|
|
43
|
-
warnings: compiled.warnings
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
return {
|
|
47
|
-
channel: "whatsapp",
|
|
48
|
-
compileOk: true,
|
|
49
|
-
compiled: {
|
|
50
|
-
channel: "whatsapp",
|
|
51
|
-
ok: true,
|
|
52
|
-
headerType: compiled.headerType,
|
|
53
|
-
headerContent: compiled.headerContent,
|
|
54
|
-
bodyContent: compiled.bodyContent,
|
|
55
|
-
footerContent: compiled.footerContent,
|
|
56
|
-
buttons: compiled.buttons,
|
|
57
|
-
warnings: compiled.warnings
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
};
|
|
61
|
-
const previewTemplate = (emitted) => {
|
|
62
|
-
if (emitted.source === void 0) return {
|
|
63
|
-
name: emitted.name,
|
|
64
|
-
ok: false,
|
|
65
|
-
channel: "unknown",
|
|
66
|
-
source: void 0,
|
|
67
|
-
variables: emitted.variables,
|
|
68
|
-
diagnostics: emitted.diagnostics,
|
|
69
|
-
compiled: {
|
|
70
|
-
channel: "unknown",
|
|
71
|
-
ok: false,
|
|
72
|
-
diagnostics: []
|
|
73
|
-
},
|
|
74
|
-
validation: validationSummary(void 0, emitted.diagnostics, {
|
|
75
|
-
channel: "unknown",
|
|
76
|
-
ok: false,
|
|
77
|
-
diagnostics: []
|
|
78
|
-
})
|
|
79
|
-
};
|
|
80
|
-
const { channel, compileOk, compiled } = compiledPreview(emitted.source);
|
|
81
|
-
return {
|
|
82
|
-
name: emitted.name,
|
|
83
|
-
ok: emitted.ok && compileOk,
|
|
84
|
-
channel,
|
|
85
|
-
source: emitted.source,
|
|
86
|
-
variables: emitted.variables,
|
|
87
|
-
diagnostics: emitted.diagnostics,
|
|
88
|
-
compiled,
|
|
89
|
-
validation: validationSummary(emitted.source, emitted.diagnostics, compiled)
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* Emits + compiles the one supported template export from an already-evaluated
|
|
94
|
-
* TSX file. A template file owns exactly one template: its `default` export.
|
|
95
|
-
* Named exports are ordinary helpers and are never inspected or invoked.
|
|
96
|
-
*
|
|
97
|
-
* `name` comes from the file identity rather than the JavaScript function name,
|
|
98
|
-
* keeping the catalog, build output, and CLI push slug stable when a developer
|
|
99
|
-
* changes the implementation shape of the default export. Direct callers of
|
|
100
|
-
* `@samva/vite/emit` must pass that file-backed name as the first argument.
|
|
101
|
-
*/
|
|
102
|
-
const emitModulePreview = (name, moduleExports) => {
|
|
103
|
-
const emitted = emitModule(moduleExports);
|
|
104
|
-
if (emitted.templates.length === 0) return {
|
|
105
|
-
ok: false,
|
|
106
|
-
compilerVersion: COMPILER_VERSION,
|
|
107
|
-
templates: [],
|
|
108
|
-
diagnostics: emitted.diagnostics
|
|
109
|
-
};
|
|
110
|
-
const templates = emitted.templates.map((template) => previewTemplate({
|
|
111
|
-
...template,
|
|
112
|
-
name
|
|
113
|
-
}));
|
|
114
|
-
return {
|
|
115
|
-
ok: emitted.ok && templates.every((template) => template.ok),
|
|
116
|
-
compilerVersion: COMPILER_VERSION,
|
|
117
|
-
templates,
|
|
118
|
-
diagnostics: emitted.diagnostics
|
|
119
|
-
};
|
|
120
|
-
};
|
|
121
|
-
/**
|
|
122
|
-
* Compiles a raw SML source string directly (no TSX). Used by tests and any
|
|
123
|
-
* caller that already holds emitted SML. Wraps the single source in the same
|
|
124
|
-
* preview shape so the client renders compiled SML identically to TSX emission.
|
|
125
|
-
*/
|
|
126
|
-
const compileSourcePreview = (name, source) => {
|
|
127
|
-
const { channel, compileOk, compiled } = compiledPreview(source);
|
|
128
|
-
return {
|
|
129
|
-
name,
|
|
130
|
-
ok: compileOk,
|
|
131
|
-
channel,
|
|
132
|
-
source,
|
|
133
|
-
variables: [],
|
|
134
|
-
diagnostics: [],
|
|
135
|
-
compiled,
|
|
136
|
-
validation: validationSummary(source, [], compiled)
|
|
137
|
-
};
|
|
138
|
-
};
|
|
139
|
-
//#endregion
|
|
140
|
-
export { COMPILER_VERSION, compileSourcePreview, emitModulePreview };
|
|
141
|
-
|
|
142
|
-
//# sourceMappingURL=emit.js.map
|