@samva/vite 0.1.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 +8 -0
- package/LICENSE +21 -0
- package/README.md +108 -0
- package/dist/build.d.ts +42 -0
- package/dist/build.js +99 -0
- package/dist/build.js.map +1 -0
- package/dist/editor/assets/authoring-editor-CSA7Zv4v-B3TgD9LK.js +145 -0
- package/dist/editor/assets/authoring-editor-CSA7Zv4v-B3TgD9LK.js.map +1 -0
- package/dist/editor/assets/index-C1g6_O2Y.js +86 -0
- package/dist/editor/assets/index-C1g6_O2Y.js.map +1 -0
- package/dist/editor/assets/index-j-Fc0EML.css +2 -0
- package/dist/editor/index.html +13 -0
- package/dist/emit.d.ts +116 -0
- package/dist/emit.js +236 -0
- package/dist/emit.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +760 -0
- package/dist/index.js.map +1 -0
- package/dist/theme-CfJe8s3k.js +138 -0
- package/dist/theme-CfJe8s3k.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1,2 @@
|
|
|
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-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--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-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-content:""}}}@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-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-white:#fff;--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);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--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}.invisible{visibility:hidden}.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-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:0}.bottom-0\.5{bottom:calc(var(--spacing) * .5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.left-0{left:0}.left-1{left:var(--spacing)}.left-1\.5{left:calc(var(--spacing) * 1.5)}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-3{left:calc(var(--spacing) * 3)}.left-4{left:calc(var(--spacing) * 4)}.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-\[90\]{z-index:90}.z-\[100\]{z-index:100}.z-\[110\]{z-index:110}.z-\[111\]{z-index:111}.z-\[120\]{z-index:120}.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}.m-auto{margin:auto}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-1\.5{margin-inline:calc(var(--spacing) * 1.5)}.mx-auto{margin-inline:auto}.my-1{margin-block:var(--spacing)}.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-3\.5{margin-top:calc(var(--spacing) * 3.5)}.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)}.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-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.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-block{display:inline-block}.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{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.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-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.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-\[17px\]{width:17px;height:17px}.size-full{width:100%;height:100%}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-5\.5{height:calc(var(--spacing) * 5.5)}.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-8\.5{height:calc(var(--spacing) * 8.5)}.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-20{height:calc(var(--spacing) * 20)}.h-\[18px\]{height:18px}.h-\[28px\]{height:28px}.h-\[30px\]{height:30px}.h-\[calc\(100\%-2rem\)\]{height:calc(100% - 2rem)}.h-\[var\(--accordion-panel-height\)\]{height:var(--accordion-panel-height)}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[260px\]{max-height:260px}.max-h-\[320px\]{max-height:320px}.max-h-\[calc\(min\(420px\,60vh\)-49px\)\]{max-height:calc(min(420px,60vh) - 49px)}.max-h-\[min\(420px\,60vh\)\]{max-height:min(420px,60vh)}.max-h-\[min\(420px\,var\(--available-height\)\)\]{max-height:min(420px, var(--available-height))}.min-h-0{min-height:0}.min-h-5{min-height:calc(var(--spacing) * 5)}.min-h-7{min-height:calc(var(--spacing) * 7)}.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-\[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\.5{width:calc(var(--spacing) * 6.5)}.w-8\.5{width:calc(var(--spacing) * 8.5)}.w-12{width:calc(var(--spacing) * 12)}.w-13{width:calc(var(--spacing) * 13)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-\[30px\]{width:30px}.w-\[46\%\]{width:46%}.w-\[60\%\]{width:60%}.w-\[70\%\]{width:70%}.w-\[74px\]{width:74px}.w-\[80\%\]{width:80%}.w-\[88\%\]{width:88%}.w-\[90\%\]{width:90%}.w-\[272px\]{width:272px}.w-\[300px\]{width:300px}.w-\[340px\]{width:340px}.w-\[375px\]{width:375px}.w-\[380px\]{width:380px}.w-\[400px\]{width:400px}.w-\[420px\]{width:420px}.w-\[600px\]{width:600px}.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-\[280px\]{max-width:280px}.max-w-\[420px\]{max-width:420px}.max-w-\[460px\]{max-width:460px}.max-w-\[600px\]{max-width:600px}.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-44{min-width:calc(var(--spacing) * 44)}.min-w-52{min-width:calc(var(--spacing) * 52)}.min-w-\[8ch\]{min-width:8ch}.min-w-\[116px\]{min-width:116px}.min-w-\[148px\]{min-width:148px}.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}.grow{flex-grow:1}.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-grab{cursor:grab}.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-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-\[1fr_auto\]{grid-template-columns:1fr auto}.grid-cols-\[10px_minmax\(0\,1fr\)\]{grid-template-columns:10px minmax(0,1fr)}.grid-rows-\[auto_1fr_32px\]{grid-template-rows:auto 1fr 32px}.grid-rows-\[auto_auto_1fr_32px\]{grid-template-rows:auto auto 1fr 32px}.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-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-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)}:where(.divide-border-subtle>:not(:last-child)){border-color:var(--color-border-subtle)}.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-\[4px\]{border-radius:4px}.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-0{border-style:var(--tw-border-style);border-width:0}.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-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.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\/30{border-color:var(--color-accent-email)}@supports (color:color-mix(in lab, red, red)){.border-accent-email\/30{border-color:color-mix(in oklab, var(--color-accent-email) 30%, transparent)}}.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-stone-200{border-color:var(--color-stone-200)}.border-transparent{border-color:#0000}.bg-\[\#e9e2d8\]{background-color:#e9e2d8}.bg-\[color-mix\(in_oklab\,var\(--status-error\)_20\%\,transparent\)\]{background-color:var(--status-error)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_oklab\,var\(--status-error\)_20\%\,transparent\)\]{background-color:color-mix(in oklab,var(--status-error) 20%,transparent)}}.bg-\[color-mix\(in_oklab\,var\(--status-warning\)_20\%\,transparent\)\]{background-color:var(--status-warning)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_oklab\,var\(--status-warning\)_20\%\,transparent\)\]{background-color:color-mix(in oklab,var(--status-warning) 20%,transparent)}}.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,.bg-accent-email\/70{background-color:var(--color-accent-email)}@supports (color:color-mix(in lab, red, red)){.bg-accent-email\/70{background-color:color-mix(in oklab, var(--color-accent-email) 70%, transparent)}}.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-border{background-color:var(--color-border)}.bg-border-subtle{background-color:var(--color-border-subtle)}.bg-foreground{background-color:var(--color-foreground)}.bg-muted{background-color:var(--color-muted)}.bg-muted-foreground\/55{background-color:var(--color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.bg-muted-foreground\/55{background-color:color-mix(in oklab, var(--color-muted-foreground) 55%, transparent)}}.bg-primary{background-color:var(--color-primary)}.bg-sel-soft,.bg-sel-soft\/40{background-color:var(--color-sel-soft)}@supports (color:color-mix(in lab, red, red)){.bg-sel-soft\/40{background-color:color-mix(in oklab, var(--color-sel-soft) 40%, transparent)}}.bg-sel-soft\/50{background-color:var(--color-sel-soft)}@supports (color:color-mix(in lab, red, red)){.bg-sel-soft\/50{background-color:color-mix(in oklab, var(--color-sel-soft) 50%, transparent)}}.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-success\/15{background-color:var(--color-status-success)}@supports (color:color-mix(in lab, red, red)){.bg-status-success\/15{background-color:color-mix(in oklab, var(--color-status-success) 15%, transparent)}}.bg-status-warning{background-color:var(--color-status-warning)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-stone-100{background-color:var(--color-stone-100)}.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\/60{background-color:var(--color-surface-inset)}@supports (color:color-mix(in lab, red, red)){.bg-surface-inset\/60{background-color:color-mix(in oklab, var(--color-surface-inset) 60%, 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}.bg-white{background-color:var(--color-white)}.bg-linear-to-br{--tw-gradient-position:to bottom right}@supports (background-image:linear-gradient(in lab, red, red)){.bg-linear-to-br{--tw-gradient-position:to bottom right in oklab}}.bg-linear-to-br{background-image:linear-gradient(var(--tw-gradient-stops))}.from-border{--tw-gradient-from:var(--color-border);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-muted{--tw-gradient-to:var(--color-muted);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.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-2\.5{padding:calc(var(--spacing) * 2.5)}.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}.px-\[26px\]{padding-inline:26px}.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-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.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-1{padding-top:var(--spacing)}.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-0\.5{padding-right:calc(var(--spacing) * .5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pb-1{padding-bottom:var(--spacing)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.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-7{padding-left:calc(var(--spacing) * 7)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.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-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-\[\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.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\.07em\]{--tw-tracking:.07em;letter-spacing:.07em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.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)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-900{color:var(--color-stone-900)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.\[color-scheme\:light\]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-70{opacity:.7}.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)}.ring,.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,.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-status-error{--tw-ring-color:var(--color-status-error)}.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,)}.drop-shadow-\[0_1px_1px_rgb\(0_0_0\/\.8\)\]{--tw-drop-shadow-size:drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#000c));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.filter{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\,background-color\]{transition-property:border-color,box-shadow,background-color;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\,box-shadow\]{transition-property:color,background-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\,opacity\]{transition-property:height,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,opacity\]{transition-property:transform,opacity;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}.not-last\:border-b:not(:last-child){border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.not-last\:pb-2\.5:not(:last-child){padding-bottom:calc(var(--spacing) * 2.5)}@media (hover:hover){.group-hover\:text-muted-foreground\/50:is(:where(.group):hover *){color:var(--color-muted-foreground)}@supports (color:color-mix(in lab, red, red)){.group-hover\:text-muted-foreground\/50:is(:where(.group):hover *){color:color-mix(in oklab, var(--color-muted-foreground) 50%, transparent)}}.group-hover\/ghost\:scale-100:is(:where(.group\/ghost):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\/ghost\:opacity-40:is(:where(.group\/ghost):hover *){opacity:.4}.group-hover\/ghost\:opacity-100:is(:where(.group\/ghost):hover *){opacity:1}}.group-aria-expanded\:rotate-180:is(:where(.group)[aria-expanded=true] *){rotate:180deg}.group-data-\[highlighted\]\:border-sel-mid:is(:where(.group)[data-highlighted] *){border-color:var(--color-sel-mid)}.group-data-\[highlighted\]\:text-accent-email:is(:where(.group)[data-highlighted] *){color:var(--color-accent-email)}.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\:bg-sel-soft:hover{background-color:var(--color-sel-soft)}.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\:shadow-\[var\(--shadow-md\)\]:hover{--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)}.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{background-color:var(--color-background)}.focus\:bg-sel-soft:focus{background-color:var(--color-sel-soft)}.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)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset:inset}.active\:translate-y-px:active{--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.active\:cursor-grabbing:active{cursor:grabbing}.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-default:disabled{cursor:default}.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-45:disabled{opacity:.45}.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-\[disabled\]\:text-muted-foreground[data-disabled]{color:var(--color-muted-foreground)}.data-\[disabled\]\:opacity-70[data-disabled]{opacity:.7}.data-\[ending-style\]\:h-0[data-ending-style]{height:0}.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-\[pressed\]\:bg-background[data-pressed]{background-color:var(--color-background)}.data-\[pressed\]\:text-foreground[data-pressed]{color:var(--color-foreground)}.data-\[pressed\]\:shadow-\[var\(--shadow-md\)\][data-pressed]{--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)}.data-\[selected\]\:bg-background[data-selected]{background-color:var(--color-background)}.data-\[selected\]\:text-foreground[data-selected]{color:var(--color-foreground)}.data-\[selected\]\:shadow-\[var\(--shadow-md\)\][data-selected]{--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)}.data-\[starting-style\]\:h-0[data-starting-style]{height:0}.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\:hidden{display:none}}.dark\:grid:where(.dark,.dark *){display:grid}.dark\:hidden:where(.dark,.dark *){display:none}.dark\:border-stone-700:where(.dark,.dark *){border-color:var(--color-stone-700)}.dark\:bg-\[\#0b141a\]:where(.dark,.dark *){background-color:#0b141a}.dark\:bg-stone-800:where(.dark,.dark *){background-color:var(--color-stone-800)}.dark\:bg-stone-900:where(.dark,.dark *){background-color:var(--color-stone-900)}.dark\:bg-stone-950:where(.dark,.dark *){background-color:var(--color-stone-950)}.dark\:text-stone-300:where(.dark,.dark *){color:var(--color-stone-300)}.dark\:text-stone-400:where(.dark,.dark *){color:var(--color-stone-400)}.dark\:text-stone-500:where(.dark,.dark *){color:var(--color-stone-500)}.dark\:text-white:where(.dark,.dark *){color:var(--color-white)}.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-disabled-opacity:.4;--editor-success:var(--status-success);--editor-warning:var(--status-warning);--editor-error:var(--status-error);--editor-error-soft:var(--status-error)}@supports (color:color-mix(in lab, red, red)){.samva-editor-shell{--editor-error-soft:color-mix(in oklab, var(--status-error) 12%, transparent)}}.samva-editor-shell{--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-document-bg:oklch(100% 0 0);--editor-drag-indicator:var(--editor-accent);--editor-toolbar-bg:var(--editor-surface-elevated);--editor-toolbar-fg:var(--editor-fg);--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;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}@keyframes samva-editor-agent-pulse{0%,to{opacity:.35}50%{opacity:1}}.samva-editor-agent-pulse{animation:1.4s ease-in-out infinite samva-editor-agent-pulse}@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}.samva-editor-agent-pulse{animation:none}}: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-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@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-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}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Samva editor</title>
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-C1g6_O2Y.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-j-Fc0EML.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|
package/dist/emit.d.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { COMPILER_VERSION, CompileBase, CompileOptions } 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
|
+
type PreviewChannel = "email" | "sms" | "whatsapp";
|
|
6
|
+
/** Both email compile bases the preview surfaces and a build materializes. */
|
|
7
|
+
declare const COMPILE_BASES: readonly ["outlook-safe", "modern"];
|
|
8
|
+
/** One email base's compiled artifact, or its compile diagnostics if it failed. */
|
|
9
|
+
interface EmailBaseArtifact {
|
|
10
|
+
readonly base: CompileBase;
|
|
11
|
+
readonly ok: boolean;
|
|
12
|
+
readonly html?: string | undefined;
|
|
13
|
+
readonly text?: string | undefined;
|
|
14
|
+
readonly warnings?: readonly Diagnostic[] | undefined;
|
|
15
|
+
readonly diagnostics?: readonly Diagnostic[] | undefined;
|
|
16
|
+
}
|
|
17
|
+
type WhatsAppButtonPreview = {
|
|
18
|
+
readonly type: "QUICK_REPLY";
|
|
19
|
+
readonly text: string;
|
|
20
|
+
} | {
|
|
21
|
+
readonly type: "URL";
|
|
22
|
+
readonly text: string;
|
|
23
|
+
readonly url: string;
|
|
24
|
+
} | {
|
|
25
|
+
readonly type: "PHONE_NUMBER";
|
|
26
|
+
readonly text: string;
|
|
27
|
+
readonly phone_number: string;
|
|
28
|
+
} | {
|
|
29
|
+
readonly type: "COPY_CODE";
|
|
30
|
+
readonly example: string;
|
|
31
|
+
};
|
|
32
|
+
interface AuthoringValidationSummary {
|
|
33
|
+
readonly ok: boolean;
|
|
34
|
+
readonly diagnostics: number;
|
|
35
|
+
readonly warnings: number;
|
|
36
|
+
readonly repairableDiagnostics: number;
|
|
37
|
+
readonly placeholders: readonly string[];
|
|
38
|
+
readonly darkClassCount: number;
|
|
39
|
+
readonly emailBases?: readonly {
|
|
40
|
+
readonly base: CompileBase;
|
|
41
|
+
readonly ok: boolean;
|
|
42
|
+
readonly htmlBytes?: number | undefined;
|
|
43
|
+
readonly warnings: number;
|
|
44
|
+
readonly diagnostics: number;
|
|
45
|
+
readonly repairableDiagnostics: number;
|
|
46
|
+
}[] | undefined;
|
|
47
|
+
}
|
|
48
|
+
/** The compiled payload for one template, discriminated by channel. */
|
|
49
|
+
type CompiledPreview = {
|
|
50
|
+
readonly channel: "email";
|
|
51
|
+
readonly bases: readonly EmailBaseArtifact[];
|
|
52
|
+
} | {
|
|
53
|
+
readonly channel: "sms";
|
|
54
|
+
readonly ok: boolean;
|
|
55
|
+
readonly body?: string | undefined;
|
|
56
|
+
readonly encoding?: "gsm7" | "ucs2" | undefined;
|
|
57
|
+
readonly estimatedSegments?: number | undefined;
|
|
58
|
+
readonly maxSegments?: number | undefined;
|
|
59
|
+
readonly warnings?: readonly Diagnostic[] | undefined;
|
|
60
|
+
readonly diagnostics?: readonly Diagnostic[] | undefined;
|
|
61
|
+
} | {
|
|
62
|
+
readonly channel: "whatsapp";
|
|
63
|
+
readonly ok: boolean;
|
|
64
|
+
readonly headerType?: "text" | "image" | "video" | "document" | undefined;
|
|
65
|
+
readonly headerContent?: string | undefined;
|
|
66
|
+
readonly bodyContent?: string | undefined;
|
|
67
|
+
readonly footerContent?: string | undefined;
|
|
68
|
+
readonly buttons?: readonly WhatsAppButtonPreview[] | undefined;
|
|
69
|
+
readonly warnings?: readonly Diagnostic[] | undefined;
|
|
70
|
+
readonly diagnostics?: readonly Diagnostic[] | undefined;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* One template's full preview payload: its emitted SML, inferred variable
|
|
74
|
+
* schema, emit diagnostics, the derived channel, and the channel's compiled
|
|
75
|
+
* output. `ok` is true only when the template emitted cleanly AND compiled
|
|
76
|
+
* without error — the shape the preview client and the CLI both gate on.
|
|
77
|
+
*/
|
|
78
|
+
interface EmittedTemplatePreview {
|
|
79
|
+
readonly name: string;
|
|
80
|
+
readonly ok: boolean;
|
|
81
|
+
readonly channel: PreviewChannel;
|
|
82
|
+
/** Emitted SML, present whenever the render itself succeeded (even if unstable). */
|
|
83
|
+
readonly source: string | undefined;
|
|
84
|
+
readonly variables: readonly TemplateVariable[];
|
|
85
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
86
|
+
readonly compiled: CompiledPreview;
|
|
87
|
+
readonly validation: AuthoringValidationSummary;
|
|
88
|
+
}
|
|
89
|
+
/** The aggregate for one module file. */
|
|
90
|
+
interface ModulePreview {
|
|
91
|
+
readonly ok: boolean;
|
|
92
|
+
readonly compilerVersion: string;
|
|
93
|
+
readonly templates: readonly EmittedTemplatePreview[];
|
|
94
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Emits + compiles the one supported template export from an already-evaluated
|
|
98
|
+
* TSX file. A template file owns exactly one template: its `default` export.
|
|
99
|
+
* Named exports are ordinary helpers and are never inspected or invoked.
|
|
100
|
+
*
|
|
101
|
+
* `name` comes from the file identity rather than the JavaScript function name,
|
|
102
|
+
* keeping the catalog, build output, and CLI push slug stable when a developer
|
|
103
|
+
* changes the implementation shape of the default export. Direct callers of
|
|
104
|
+
* `@samva/vite/emit` must pass that file-backed name as the first argument.
|
|
105
|
+
*/
|
|
106
|
+
declare const emitModulePreview: (name: string, moduleExports: Record<string, unknown>, options?: CompileOptions) => ModulePreview;
|
|
107
|
+
/**
|
|
108
|
+
* Compiles a raw `.samva` source string directly (no TSX). Used for `.samva`
|
|
109
|
+
* files the plugin discovers alongside `.tsx` templates and for `samva
|
|
110
|
+
* templates pull` round-trips. Wraps the single source in the same preview
|
|
111
|
+
* shape so the client renders `.samva` and `.tsx` templates identically.
|
|
112
|
+
*/
|
|
113
|
+
declare const compileSourcePreview: (name: string, source: string, options?: CompileOptions) => EmittedTemplatePreview;
|
|
114
|
+
//#endregion
|
|
115
|
+
export { AuthoringValidationSummary, COMPILER_VERSION, COMPILE_BASES, CompiledPreview, EmailBaseArtifact, EmittedTemplatePreview, ModulePreview, PreviewChannel, WhatsAppButtonPreview, compileSourcePreview, emitModulePreview };
|
|
116
|
+
//# sourceMappingURL=emit.d.ts.map
|
package/dist/emit.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { Result } from "effect";
|
|
2
|
+
import { COMPILER_VERSION, compileSource } from "@samva/markup/compile";
|
|
3
|
+
import { emitModule } from "@samva/markup/emit";
|
|
4
|
+
//#region src/emit.ts
|
|
5
|
+
/** Both email compile bases the preview surfaces and a build materializes. */
|
|
6
|
+
const COMPILE_BASES = ["outlook-safe", "modern"];
|
|
7
|
+
const countRepairable = (diagnostics) => diagnostics.filter((diagnostic) => diagnostic.repair !== void 0).length;
|
|
8
|
+
const uniquePlaceholders = (source) => source === void 0 ? [] : [...new Set([...source.matchAll(/{{\s*([A-Za-z_][\w.-]*)\s*}}/g)].map((match) => match[1] ?? ""))].filter(Boolean).sort();
|
|
9
|
+
const darkClassCount = (source) => source === void 0 ? 0 : (source.match(/\bdark:/g) ?? []).length;
|
|
10
|
+
const validationSummary = (source, emitDiagnostics, compiled) => {
|
|
11
|
+
if (compiled.channel === "email") {
|
|
12
|
+
const baseSummaries = compiled.bases.map((artifact) => {
|
|
13
|
+
const warnings = artifact.warnings ?? [];
|
|
14
|
+
const diagnostics = artifact.diagnostics ?? [];
|
|
15
|
+
return {
|
|
16
|
+
base: artifact.base,
|
|
17
|
+
ok: artifact.ok,
|
|
18
|
+
htmlBytes: artifact.html === void 0 ? void 0 : new TextEncoder().encode(artifact.html).length,
|
|
19
|
+
warnings: warnings.length,
|
|
20
|
+
diagnostics: diagnostics.length,
|
|
21
|
+
repairableDiagnostics: countRepairable(diagnostics)
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
const warnings = baseSummaries.reduce((sum, base) => sum + base.warnings, 0);
|
|
25
|
+
const diagnostics = emitDiagnostics.length + baseSummaries.reduce((sum, base) => sum + base.diagnostics, 0);
|
|
26
|
+
return {
|
|
27
|
+
ok: baseSummaries.length > 0 && baseSummaries.every((base) => base.ok) && emitDiagnostics.length === 0,
|
|
28
|
+
diagnostics,
|
|
29
|
+
warnings,
|
|
30
|
+
repairableDiagnostics: countRepairable(emitDiagnostics) + baseSummaries.reduce((sum, base) => sum + base.repairableDiagnostics, 0),
|
|
31
|
+
placeholders: uniquePlaceholders(source),
|
|
32
|
+
darkClassCount: darkClassCount(source),
|
|
33
|
+
emailBases: baseSummaries
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const warnings = compiled.warnings ?? [];
|
|
37
|
+
const diagnostics = compiled.diagnostics ?? [];
|
|
38
|
+
return {
|
|
39
|
+
ok: compiled.ok && emitDiagnostics.length === 0,
|
|
40
|
+
diagnostics: emitDiagnostics.length + diagnostics.length,
|
|
41
|
+
warnings: warnings.length,
|
|
42
|
+
repairableDiagnostics: countRepairable(emitDiagnostics) + countRepairable(diagnostics),
|
|
43
|
+
placeholders: uniquePlaceholders(source),
|
|
44
|
+
darkClassCount: darkClassCount(source)
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
const emailBaseArtifact = (source, base, options) => {
|
|
48
|
+
const result = compileSource(source, {
|
|
49
|
+
...options,
|
|
50
|
+
base
|
|
51
|
+
});
|
|
52
|
+
if (Result.isFailure(result)) return {
|
|
53
|
+
base,
|
|
54
|
+
ok: false,
|
|
55
|
+
diagnostics: result.failure.diagnostics
|
|
56
|
+
};
|
|
57
|
+
if (result.success.channel !== "email") return {
|
|
58
|
+
base,
|
|
59
|
+
ok: false,
|
|
60
|
+
diagnostics: [{
|
|
61
|
+
code: "channel-changed",
|
|
62
|
+
message: "template no longer compiles to email",
|
|
63
|
+
span: {
|
|
64
|
+
start: 0,
|
|
65
|
+
end: 0
|
|
66
|
+
}
|
|
67
|
+
}]
|
|
68
|
+
};
|
|
69
|
+
return {
|
|
70
|
+
base,
|
|
71
|
+
ok: true,
|
|
72
|
+
html: result.success.html,
|
|
73
|
+
text: result.success.text,
|
|
74
|
+
warnings: result.success.warnings
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
/** Compile one source into its channel-polymorphic preview. */
|
|
78
|
+
const compiledPreview = (source, options) => {
|
|
79
|
+
const probe = compileSource(source, {
|
|
80
|
+
...options,
|
|
81
|
+
base: "outlook-safe"
|
|
82
|
+
});
|
|
83
|
+
if (Result.isFailure(probe)) return {
|
|
84
|
+
channel: "email",
|
|
85
|
+
compileOk: false,
|
|
86
|
+
compiled: {
|
|
87
|
+
channel: "email",
|
|
88
|
+
bases: [{
|
|
89
|
+
base: "outlook-safe",
|
|
90
|
+
ok: false,
|
|
91
|
+
diagnostics: probe.failure.diagnostics
|
|
92
|
+
}]
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const compiled = probe.success;
|
|
96
|
+
if (compiled.channel === "sms") return {
|
|
97
|
+
channel: "sms",
|
|
98
|
+
compileOk: true,
|
|
99
|
+
compiled: {
|
|
100
|
+
channel: "sms",
|
|
101
|
+
ok: true,
|
|
102
|
+
body: compiled.body,
|
|
103
|
+
encoding: compiled.encoding,
|
|
104
|
+
estimatedSegments: compiled.estimatedSegments,
|
|
105
|
+
maxSegments: compiled.maxSegments,
|
|
106
|
+
warnings: compiled.warnings
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
if (compiled.channel === "whatsapp") return {
|
|
110
|
+
channel: "whatsapp",
|
|
111
|
+
compileOk: true,
|
|
112
|
+
compiled: {
|
|
113
|
+
channel: "whatsapp",
|
|
114
|
+
ok: true,
|
|
115
|
+
headerType: compiled.headerType,
|
|
116
|
+
headerContent: compiled.headerContent,
|
|
117
|
+
bodyContent: compiled.bodyContent,
|
|
118
|
+
footerContent: compiled.footerContent,
|
|
119
|
+
buttons: compiled.buttons,
|
|
120
|
+
warnings: compiled.warnings
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
const bases = [{
|
|
124
|
+
base: "outlook-safe",
|
|
125
|
+
ok: true,
|
|
126
|
+
html: compiled.html,
|
|
127
|
+
text: compiled.text,
|
|
128
|
+
warnings: compiled.warnings
|
|
129
|
+
}, emailBaseArtifact(source, "modern", options)];
|
|
130
|
+
return {
|
|
131
|
+
channel: "email",
|
|
132
|
+
compileOk: bases.every((artifact) => artifact.ok),
|
|
133
|
+
compiled: {
|
|
134
|
+
channel: "email",
|
|
135
|
+
bases
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
const previewTemplate = (emitted, options) => {
|
|
140
|
+
if (emitted.source === void 0) return {
|
|
141
|
+
name: emitted.name,
|
|
142
|
+
ok: false,
|
|
143
|
+
channel: "email",
|
|
144
|
+
source: void 0,
|
|
145
|
+
variables: emitted.variables,
|
|
146
|
+
diagnostics: emitted.diagnostics,
|
|
147
|
+
compiled: {
|
|
148
|
+
channel: "email",
|
|
149
|
+
bases: []
|
|
150
|
+
},
|
|
151
|
+
validation: validationSummary(void 0, emitted.diagnostics, {
|
|
152
|
+
channel: "email",
|
|
153
|
+
bases: []
|
|
154
|
+
})
|
|
155
|
+
};
|
|
156
|
+
const { channel, compileOk, compiled } = compiledPreview(emitted.source, options);
|
|
157
|
+
return {
|
|
158
|
+
name: emitted.name,
|
|
159
|
+
ok: emitted.ok && compileOk,
|
|
160
|
+
channel,
|
|
161
|
+
source: emitted.source,
|
|
162
|
+
variables: emitted.variables,
|
|
163
|
+
diagnostics: emitted.diagnostics,
|
|
164
|
+
compiled,
|
|
165
|
+
validation: validationSummary(emitted.source, emitted.diagnostics, compiled)
|
|
166
|
+
};
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Emits + compiles the one supported template export from an already-evaluated
|
|
170
|
+
* TSX file. A template file owns exactly one template: its `default` export.
|
|
171
|
+
* Named exports are ordinary helpers and are never inspected or invoked.
|
|
172
|
+
*
|
|
173
|
+
* `name` comes from the file identity rather than the JavaScript function name,
|
|
174
|
+
* keeping the catalog, build output, and CLI push slug stable when a developer
|
|
175
|
+
* changes the implementation shape of the default export. Direct callers of
|
|
176
|
+
* `@samva/vite/emit` must pass that file-backed name as the first argument.
|
|
177
|
+
*/
|
|
178
|
+
const emitModulePreview = (name, moduleExports, options) => {
|
|
179
|
+
if (!Object.hasOwn(moduleExports, "default")) return {
|
|
180
|
+
ok: false,
|
|
181
|
+
compilerVersion: COMPILER_VERSION,
|
|
182
|
+
templates: [],
|
|
183
|
+
diagnostics: [{
|
|
184
|
+
code: "missing-default-export",
|
|
185
|
+
message: "TSX template files must default-export exactly one template; named exports are ignored.",
|
|
186
|
+
span: {
|
|
187
|
+
start: 0,
|
|
188
|
+
end: 0
|
|
189
|
+
}
|
|
190
|
+
}]
|
|
191
|
+
};
|
|
192
|
+
const emitted = emitModule({ [name]: moduleExports.default });
|
|
193
|
+
if (emitted.templates.length === 0) return {
|
|
194
|
+
ok: false,
|
|
195
|
+
compilerVersion: COMPILER_VERSION,
|
|
196
|
+
templates: [],
|
|
197
|
+
diagnostics: [{
|
|
198
|
+
code: "invalid-default-export",
|
|
199
|
+
message: "The default export is not a Samva template returning <Email>, <Sms>, or <WhatsApp>.",
|
|
200
|
+
span: {
|
|
201
|
+
start: 0,
|
|
202
|
+
end: 0
|
|
203
|
+
}
|
|
204
|
+
}]
|
|
205
|
+
};
|
|
206
|
+
const templates = emitted.templates.map((template) => previewTemplate(template, options));
|
|
207
|
+
return {
|
|
208
|
+
ok: emitted.ok && templates.every((template) => template.ok),
|
|
209
|
+
compilerVersion: COMPILER_VERSION,
|
|
210
|
+
templates,
|
|
211
|
+
diagnostics: emitted.diagnostics
|
|
212
|
+
};
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Compiles a raw `.samva` source string directly (no TSX). Used for `.samva`
|
|
216
|
+
* files the plugin discovers alongside `.tsx` templates and for `samva
|
|
217
|
+
* templates pull` round-trips. Wraps the single source in the same preview
|
|
218
|
+
* shape so the client renders `.samva` and `.tsx` templates identically.
|
|
219
|
+
*/
|
|
220
|
+
const compileSourcePreview = (name, source, options) => {
|
|
221
|
+
const { channel, compileOk, compiled } = compiledPreview(source, options);
|
|
222
|
+
return {
|
|
223
|
+
name,
|
|
224
|
+
ok: compileOk,
|
|
225
|
+
channel,
|
|
226
|
+
source,
|
|
227
|
+
variables: [],
|
|
228
|
+
diagnostics: [],
|
|
229
|
+
compiled,
|
|
230
|
+
validation: validationSummary(source, [], compiled)
|
|
231
|
+
};
|
|
232
|
+
};
|
|
233
|
+
//#endregion
|
|
234
|
+
export { COMPILER_VERSION, COMPILE_BASES, compileSourcePreview, emitModulePreview };
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=emit.js.map
|
package/dist/emit.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","names":[],"sources":["../src/emit.ts"],"sourcesContent":["import type { CompileBase, CompiledTemplate, CompileOptions } from \"@samva/markup/compile\";\nimport { compileSource, COMPILER_VERSION } from \"@samva/markup/compile\";\nimport type { Diagnostic } from \"@samva/markup/diagnostics\";\nimport type { EmittedModule, EmittedTemplate } from \"@samva/markup/emit\";\nimport { emitModule } from \"@samva/markup/emit\";\nimport type { TemplateVariable } from \"@samva/markup/render-template\";\nimport { Result } from \"effect\";\n\n// The programmatic emit path shared by the vite plugin (HMR preview) and the\n// CLI (`samva templates push`). It runs the FULL local chain the design brief\n// §7b locks in: an already-evaluated TSX module → emitModule (discover + emit\n// SML with the determinism guard) → compileSource (SML → channel payload). The\n// SML compiler is a pure library; this is simply its fourth caller alongside\n// the Worker, the browser canvas, and the tests.\n//\n// The preview is channel-polymorphic: email carries per-base artifacts (HTML +\n// text for outlook-safe and modern); sms and whatsapp carry their single\n// compiled payload. The channel is derived from the compiled root tag.\n//\n// Bundler-agnostic: this never imports vite/esbuild or touches the filesystem.\n\nexport type PreviewChannel = \"email\" | \"sms\" | \"whatsapp\";\n\n/** Both email compile bases the preview surfaces and a build materializes. */\nexport const COMPILE_BASES = [\"outlook-safe\", \"modern\"] as const satisfies readonly CompileBase[];\n\n/** One email base's compiled artifact, or its compile diagnostics if it failed. */\nexport interface EmailBaseArtifact {\n readonly base: CompileBase;\n readonly ok: boolean;\n readonly html?: string | undefined;\n readonly text?: string | undefined;\n readonly warnings?: readonly Diagnostic[] | undefined;\n readonly diagnostics?: readonly Diagnostic[] | undefined;\n}\n\nexport type WhatsAppButtonPreview =\n | { readonly type: \"QUICK_REPLY\"; readonly text: string }\n | { readonly type: \"URL\"; readonly text: string; readonly url: string }\n | { readonly type: \"PHONE_NUMBER\"; readonly text: string; readonly phone_number: string }\n | { readonly type: \"COPY_CODE\"; readonly example: string };\n\nexport interface AuthoringValidationSummary {\n readonly ok: boolean;\n readonly diagnostics: number;\n readonly warnings: number;\n readonly repairableDiagnostics: number;\n readonly placeholders: readonly string[];\n readonly darkClassCount: number;\n readonly emailBases?:\n | readonly {\n readonly base: CompileBase;\n readonly ok: boolean;\n readonly htmlBytes?: number | undefined;\n readonly warnings: number;\n readonly diagnostics: number;\n readonly repairableDiagnostics: number;\n }[]\n | undefined;\n}\n\n/** The compiled payload for one template, discriminated by channel. */\nexport type CompiledPreview =\n | { readonly channel: \"email\"; readonly bases: readonly EmailBaseArtifact[] }\n | {\n readonly channel: \"sms\";\n readonly ok: boolean;\n readonly body?: string | undefined;\n readonly encoding?: \"gsm7\" | \"ucs2\" | undefined;\n readonly estimatedSegments?: number | undefined;\n readonly maxSegments?: number | undefined;\n readonly warnings?: readonly Diagnostic[] | undefined;\n readonly diagnostics?: readonly Diagnostic[] | undefined;\n }\n | {\n readonly channel: \"whatsapp\";\n readonly ok: boolean;\n readonly headerType?: \"text\" | \"image\" | \"video\" | \"document\" | undefined;\n readonly headerContent?: string | undefined;\n readonly bodyContent?: string | undefined;\n readonly footerContent?: string | undefined;\n readonly buttons?: readonly WhatsAppButtonPreview[] | undefined;\n readonly warnings?: readonly Diagnostic[] | undefined;\n readonly diagnostics?: readonly Diagnostic[] | undefined;\n };\n\n/**\n * One template's full preview payload: its emitted SML, inferred variable\n * schema, emit diagnostics, the derived channel, and the channel's compiled\n * output. `ok` is true only when the template emitted cleanly AND compiled\n * without error — the shape the preview client and the CLI both gate on.\n */\nexport interface EmittedTemplatePreview {\n readonly name: string;\n readonly ok: boolean;\n readonly channel: PreviewChannel;\n /** Emitted SML, present whenever the render itself succeeded (even if unstable). */\n readonly source: string | undefined;\n readonly variables: readonly TemplateVariable[];\n readonly diagnostics: readonly Diagnostic[];\n readonly compiled: CompiledPreview;\n readonly validation: AuthoringValidationSummary;\n}\n\n/** The aggregate for one module file. */\nexport interface ModulePreview {\n readonly ok: boolean;\n readonly compilerVersion: string;\n readonly templates: readonly EmittedTemplatePreview[];\n readonly diagnostics: readonly Diagnostic[];\n}\n\nconst countRepairable = (diagnostics: readonly Diagnostic[]): number =>\n diagnostics.filter((diagnostic) => diagnostic.repair !== undefined).length;\n\nconst uniquePlaceholders = (source: string | undefined): readonly string[] =>\n source === undefined\n ? []\n : [\n ...new Set(\n [...source.matchAll(/{{\\s*([A-Za-z_][\\w.-]*)\\s*}}/g)].map((match) => match[1] ?? \"\"),\n ),\n ]\n .filter(Boolean)\n .sort();\n\nconst darkClassCount = (source: string | undefined): number =>\n source === undefined ? 0 : (source.match(/\\bdark:/g) ?? []).length;\n\nconst validationSummary = (\n source: string | undefined,\n emitDiagnostics: readonly Diagnostic[],\n compiled: CompiledPreview,\n): AuthoringValidationSummary => {\n if (compiled.channel === \"email\") {\n const baseSummaries = compiled.bases.map((artifact) => {\n const warnings = artifact.warnings ?? [];\n const diagnostics = artifact.diagnostics ?? [];\n return {\n base: artifact.base,\n ok: artifact.ok,\n htmlBytes:\n artifact.html === undefined ? undefined : new TextEncoder().encode(artifact.html).length,\n warnings: warnings.length,\n diagnostics: diagnostics.length,\n repairableDiagnostics: countRepairable(diagnostics),\n };\n });\n const warnings = baseSummaries.reduce((sum, base) => sum + base.warnings, 0);\n const diagnostics =\n emitDiagnostics.length + baseSummaries.reduce((sum, base) => sum + base.diagnostics, 0);\n return {\n ok:\n baseSummaries.length > 0 &&\n baseSummaries.every((base) => base.ok) &&\n emitDiagnostics.length === 0,\n diagnostics,\n warnings,\n repairableDiagnostics:\n countRepairable(emitDiagnostics) +\n baseSummaries.reduce((sum, base) => sum + base.repairableDiagnostics, 0),\n placeholders: uniquePlaceholders(source),\n darkClassCount: darkClassCount(source),\n emailBases: baseSummaries,\n };\n }\n\n const warnings = compiled.warnings ?? [];\n const diagnostics = compiled.diagnostics ?? [];\n return {\n ok: compiled.ok && emitDiagnostics.length === 0,\n diagnostics: emitDiagnostics.length + diagnostics.length,\n warnings: warnings.length,\n repairableDiagnostics: countRepairable(emitDiagnostics) + countRepairable(diagnostics),\n placeholders: uniquePlaceholders(source),\n darkClassCount: darkClassCount(source),\n };\n};\n\nconst emailBaseArtifact = (\n source: string,\n base: CompileBase,\n options: CompileOptions | undefined,\n): EmailBaseArtifact => {\n const result = compileSource(source, { ...options, base });\n if (Result.isFailure(result)) {\n return { base, ok: false, diagnostics: result.failure.diagnostics };\n }\n if (result.success.channel !== \"email\") {\n return {\n base,\n ok: false,\n diagnostics: [\n {\n code: \"channel-changed\",\n message: \"template no longer compiles to email\",\n span: { start: 0, end: 0 },\n },\n ],\n };\n }\n return {\n base,\n ok: true,\n html: result.success.html,\n text: result.success.text,\n warnings: result.success.warnings,\n };\n};\n\n/** Compile one source into its channel-polymorphic preview. */\nconst compiledPreview = (\n source: string,\n options: CompileOptions | undefined,\n): {\n readonly channel: PreviewChannel;\n readonly compileOk: boolean;\n readonly compiled: CompiledPreview;\n} => {\n // Probe once (email base is a no-op for sms/whatsapp) to learn the channel.\n const probe = compileSource(source, { ...options, base: \"outlook-safe\" });\n if (Result.isFailure(probe)) {\n return {\n channel: \"email\",\n compileOk: false,\n compiled: {\n channel: \"email\",\n bases: [{ base: \"outlook-safe\", ok: false, diagnostics: probe.failure.diagnostics }],\n },\n };\n }\n const compiled: CompiledTemplate = probe.success;\n\n if (compiled.channel === \"sms\") {\n return {\n channel: \"sms\",\n compileOk: true,\n compiled: {\n channel: \"sms\",\n ok: true,\n body: compiled.body,\n encoding: compiled.encoding,\n estimatedSegments: compiled.estimatedSegments,\n maxSegments: compiled.maxSegments,\n warnings: compiled.warnings,\n },\n };\n }\n\n if (compiled.channel === \"whatsapp\") {\n return {\n channel: \"whatsapp\",\n compileOk: true,\n compiled: {\n channel: \"whatsapp\",\n ok: true,\n headerType: compiled.headerType,\n headerContent: compiled.headerContent,\n bodyContent: compiled.bodyContent,\n footerContent: compiled.footerContent,\n buttons: compiled.buttons,\n warnings: compiled.warnings,\n },\n };\n }\n\n const bases: EmailBaseArtifact[] = [\n {\n base: \"outlook-safe\",\n ok: true,\n html: compiled.html,\n text: compiled.text,\n warnings: compiled.warnings,\n },\n emailBaseArtifact(source, \"modern\", options),\n ];\n return {\n channel: \"email\",\n compileOk: bases.every((artifact) => artifact.ok),\n compiled: { channel: \"email\", bases },\n };\n};\n\nconst previewTemplate = (\n emitted: EmittedTemplate,\n options?: CompileOptions,\n): EmittedTemplatePreview => {\n if (emitted.source === undefined) {\n // Render failed outright (grammar violation) — no source to compile.\n return {\n name: emitted.name,\n ok: false,\n channel: \"email\",\n source: undefined,\n variables: emitted.variables,\n diagnostics: emitted.diagnostics,\n compiled: { channel: \"email\", bases: [] },\n validation: validationSummary(undefined, emitted.diagnostics, {\n channel: \"email\",\n bases: [],\n }),\n };\n }\n const { channel, compileOk, compiled } = compiledPreview(emitted.source, options);\n return {\n name: emitted.name,\n ok: emitted.ok && compileOk,\n channel,\n source: emitted.source,\n variables: emitted.variables,\n diagnostics: emitted.diagnostics,\n compiled,\n validation: validationSummary(emitted.source, emitted.diagnostics, compiled),\n };\n};\n\n/**\n * Emits + compiles the one supported template export from an already-evaluated\n * TSX file. A template file owns exactly one template: its `default` export.\n * Named exports are ordinary helpers and are never inspected or invoked.\n *\n * `name` comes from the file identity rather than the JavaScript function name,\n * keeping the catalog, build output, and CLI push slug stable when a developer\n * changes the implementation shape of the default export. Direct callers of\n * `@samva/vite/emit` must pass that file-backed name as the first argument.\n */\nexport const emitModulePreview = (\n name: string,\n moduleExports: Record<string, unknown>,\n options?: CompileOptions,\n): ModulePreview => {\n if (!Object.hasOwn(moduleExports, \"default\")) {\n return {\n ok: false,\n compilerVersion: COMPILER_VERSION,\n templates: [],\n diagnostics: [\n {\n code: \"missing-default-export\",\n message:\n \"TSX template files must default-export exactly one template; named exports are ignored.\",\n span: { start: 0, end: 0 },\n },\n ],\n };\n }\n\n const emitted: EmittedModule = emitModule({ [name]: moduleExports.default });\n if (emitted.templates.length === 0) {\n return {\n ok: false,\n compilerVersion: COMPILER_VERSION,\n templates: [],\n diagnostics: [\n {\n code: \"invalid-default-export\",\n message:\n \"The default export is not a Samva template returning <Email>, <Sms>, or <WhatsApp>.\",\n span: { start: 0, end: 0 },\n },\n ],\n };\n }\n const templates = emitted.templates.map((template) => previewTemplate(template, options));\n return {\n ok: emitted.ok && templates.every((template) => template.ok),\n compilerVersion: COMPILER_VERSION,\n templates,\n diagnostics: emitted.diagnostics,\n };\n};\n\n/**\n * Compiles a raw `.samva` source string directly (no TSX). Used for `.samva`\n * files the plugin discovers alongside `.tsx` templates and for `samva\n * templates pull` round-trips. Wraps the single source in the same preview\n * shape so the client renders `.samva` and `.tsx` templates identically.\n */\nexport const compileSourcePreview = (\n name: string,\n source: string,\n options?: CompileOptions,\n): EmittedTemplatePreview => {\n const { channel, compileOk, compiled } = compiledPreview(source, options);\n return {\n name,\n ok: compileOk,\n channel,\n source,\n variables: [],\n diagnostics: [],\n compiled,\n validation: validationSummary(source, [], compiled),\n };\n};\n\nexport { COMPILER_VERSION };\n"],"mappings":";;;;;AAwBA,MAAa,gBAAgB,CAAC,gBAAgB,QAAQ;AAwFtD,MAAM,mBAAmB,gBACvB,YAAY,QAAQ,eAAe,WAAW,WAAW,KAAA,CAAS,CAAC,CAAC;AAEtE,MAAM,sBAAsB,WAC1B,WAAW,KAAA,IACP,CAAC,IACD,CACE,GAAG,IAAI,IACL,CAAC,GAAG,OAAO,SAAS,+BAA+B,CAAC,CAAC,CAAC,KAAK,UAAU,MAAM,MAAM,EAAE,CACrF,CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK;AAEd,MAAM,kBAAkB,WACtB,WAAW,KAAA,IAAY,KAAK,OAAO,MAAM,UAAU,KAAK,CAAC,EAAA,CAAG;AAE9D,MAAM,qBACJ,QACA,iBACA,aAC+B;CAC/B,IAAI,SAAS,YAAY,SAAS;EAChC,MAAM,gBAAgB,SAAS,MAAM,KAAK,aAAa;GACrD,MAAM,WAAW,SAAS,YAAY,CAAC;GACvC,MAAM,cAAc,SAAS,eAAe,CAAC;GAC7C,OAAO;IACL,MAAM,SAAS;IACf,IAAI,SAAS;IACb,WACE,SAAS,SAAS,KAAA,IAAY,KAAA,IAAY,IAAI,YAAY,CAAC,CAAC,OAAO,SAAS,IAAI,CAAC,CAAC;IACpF,UAAU,SAAS;IACnB,aAAa,YAAY;IACzB,uBAAuB,gBAAgB,WAAW;GACpD;EACF,CAAC;EACD,MAAM,WAAW,cAAc,QAAQ,KAAK,SAAS,MAAM,KAAK,UAAU,CAAC;EAC3E,MAAM,cACJ,gBAAgB,SAAS,cAAc,QAAQ,KAAK,SAAS,MAAM,KAAK,aAAa,CAAC;EACxF,OAAO;GACL,IACE,cAAc,SAAS,KACvB,cAAc,OAAO,SAAS,KAAK,EAAE,KACrC,gBAAgB,WAAW;GAC7B;GACA;GACA,uBACE,gBAAgB,eAAe,IAC/B,cAAc,QAAQ,KAAK,SAAS,MAAM,KAAK,uBAAuB,CAAC;GACzE,cAAc,mBAAmB,MAAM;GACvC,gBAAgB,eAAe,MAAM;GACrC,YAAY;EACd;CACF;CAEA,MAAM,WAAW,SAAS,YAAY,CAAC;CACvC,MAAM,cAAc,SAAS,eAAe,CAAC;CAC7C,OAAO;EACL,IAAI,SAAS,MAAM,gBAAgB,WAAW;EAC9C,aAAa,gBAAgB,SAAS,YAAY;EAClD,UAAU,SAAS;EACnB,uBAAuB,gBAAgB,eAAe,IAAI,gBAAgB,WAAW;EACrF,cAAc,mBAAmB,MAAM;EACvC,gBAAgB,eAAe,MAAM;CACvC;AACF;AAEA,MAAM,qBACJ,QACA,MACA,YACsB;CACtB,MAAM,SAAS,cAAc,QAAQ;EAAE,GAAG;EAAS;CAAK,CAAC;CACzD,IAAI,OAAO,UAAU,MAAM,GACzB,OAAO;EAAE;EAAM,IAAI;EAAO,aAAa,OAAO,QAAQ;CAAY;CAEpE,IAAI,OAAO,QAAQ,YAAY,SAC7B,OAAO;EACL;EACA,IAAI;EACJ,aAAa,CACX;GACE,MAAM;GACN,SAAS;GACT,MAAM;IAAE,OAAO;IAAG,KAAK;GAAE;EAC3B,CACF;CACF;CAEF,OAAO;EACL;EACA,IAAI;EACJ,MAAM,OAAO,QAAQ;EACrB,MAAM,OAAO,QAAQ;EACrB,UAAU,OAAO,QAAQ;CAC3B;AACF;;AAGA,MAAM,mBACJ,QACA,YAKG;CAEH,MAAM,QAAQ,cAAc,QAAQ;EAAE,GAAG;EAAS,MAAM;CAAe,CAAC;CACxE,IAAI,OAAO,UAAU,KAAK,GACxB,OAAO;EACL,SAAS;EACT,WAAW;EACX,UAAU;GACR,SAAS;GACT,OAAO,CAAC;IAAE,MAAM;IAAgB,IAAI;IAAO,aAAa,MAAM,QAAQ;GAAY,CAAC;EACrF;CACF;CAEF,MAAM,WAA6B,MAAM;CAEzC,IAAI,SAAS,YAAY,OACvB,OAAO;EACL,SAAS;EACT,WAAW;EACX,UAAU;GACR,SAAS;GACT,IAAI;GACJ,MAAM,SAAS;GACf,UAAU,SAAS;GACnB,mBAAmB,SAAS;GAC5B,aAAa,SAAS;GACtB,UAAU,SAAS;EACrB;CACF;CAGF,IAAI,SAAS,YAAY,YACvB,OAAO;EACL,SAAS;EACT,WAAW;EACX,UAAU;GACR,SAAS;GACT,IAAI;GACJ,YAAY,SAAS;GACrB,eAAe,SAAS;GACxB,aAAa,SAAS;GACtB,eAAe,SAAS;GACxB,SAAS,SAAS;GAClB,UAAU,SAAS;EACrB;CACF;CAGF,MAAM,QAA6B,CACjC;EACE,MAAM;EACN,IAAI;EACJ,MAAM,SAAS;EACf,MAAM,SAAS;EACf,UAAU,SAAS;CACrB,GACA,kBAAkB,QAAQ,UAAU,OAAO,CAC7C;CACA,OAAO;EACL,SAAS;EACT,WAAW,MAAM,OAAO,aAAa,SAAS,EAAE;EAChD,UAAU;GAAE,SAAS;GAAS;EAAM;CACtC;AACF;AAEA,MAAM,mBACJ,SACA,YAC2B;CAC3B,IAAI,QAAQ,WAAW,KAAA,GAErB,OAAO;EACL,MAAM,QAAQ;EACd,IAAI;EACJ,SAAS;EACT,QAAQ,KAAA;EACR,WAAW,QAAQ;EACnB,aAAa,QAAQ;EACrB,UAAU;GAAE,SAAS;GAAS,OAAO,CAAC;EAAE;EACxC,YAAY,kBAAkB,KAAA,GAAW,QAAQ,aAAa;GAC5D,SAAS;GACT,OAAO,CAAC;EACV,CAAC;CACH;CAEF,MAAM,EAAE,SAAS,WAAW,aAAa,gBAAgB,QAAQ,QAAQ,OAAO;CAChF,OAAO;EACL,MAAM,QAAQ;EACd,IAAI,QAAQ,MAAM;EAClB;EACA,QAAQ,QAAQ;EAChB,WAAW,QAAQ;EACnB,aAAa,QAAQ;EACrB;EACA,YAAY,kBAAkB,QAAQ,QAAQ,QAAQ,aAAa,QAAQ;CAC7E;AACF;;;;;;;;;;;AAYA,MAAa,qBACX,MACA,eACA,YACkB;CAClB,IAAI,CAAC,OAAO,OAAO,eAAe,SAAS,GACzC,OAAO;EACL,IAAI;EACJ,iBAAiB;EACjB,WAAW,CAAC;EACZ,aAAa,CACX;GACE,MAAM;GACN,SACE;GACF,MAAM;IAAE,OAAO;IAAG,KAAK;GAAE;EAC3B,CACF;CACF;CAGF,MAAM,UAAyB,WAAW,GAAG,OAAO,cAAc,QAAQ,CAAC;CAC3E,IAAI,QAAQ,UAAU,WAAW,GAC/B,OAAO;EACL,IAAI;EACJ,iBAAiB;EACjB,WAAW,CAAC;EACZ,aAAa,CACX;GACE,MAAM;GACN,SACE;GACF,MAAM;IAAE,OAAO;IAAG,KAAK;GAAE;EAC3B,CACF;CACF;CAEF,MAAM,YAAY,QAAQ,UAAU,KAAK,aAAa,gBAAgB,UAAU,OAAO,CAAC;CACxF,OAAO;EACL,IAAI,QAAQ,MAAM,UAAU,OAAO,aAAa,SAAS,EAAE;EAC3D,iBAAiB;EACjB;EACA,aAAa,QAAQ;CACvB;AACF;;;;;;;AAQA,MAAa,wBACX,MACA,QACA,YAC2B;CAC3B,MAAM,EAAE,SAAS,WAAW,aAAa,gBAAgB,QAAQ,OAAO;CACxE,OAAO;EACL;EACA,IAAI;EACJ;EACA;EACA,WAAW,CAAC;EACZ,aAAa,CAAC;EACd;EACA,YAAY,kBAAkB,QAAQ,CAAC,GAAG,QAAQ;CACpD;AACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Plugin } from "vite";
|
|
2
|
+
import { CompileOptions } from "@samva/markup/compile";
|
|
3
|
+
//#region src/editor.d.ts
|
|
4
|
+
interface SamvaEditorPluginOptions {
|
|
5
|
+
/** Directory containing `.samva` / `.tsx` templates, relative to project root. Default `emails`. */
|
|
6
|
+
readonly templatesDir?: string | undefined;
|
|
7
|
+
/** Editor UI route. Default `/`; its API and assets are mounted as siblings below it. */
|
|
8
|
+
readonly route?: string | undefined;
|
|
9
|
+
/** Compile options applied to catalog validation and browser previews. */
|
|
10
|
+
readonly compile?: CompileOptions | undefined;
|
|
11
|
+
/** Project theme file relative to root. Default `theme.css`; false disables discovery. */
|
|
12
|
+
readonly theme?: string | false | undefined;
|
|
13
|
+
}
|
|
14
|
+
declare const samvaEditor: (options?: SamvaEditorPluginOptions) => Plugin;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { type SamvaEditorPluginOptions, samvaEditor };
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|