@mulmocast/slide 0.5.0 → 0.6.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/.claude/skills/extend/SKILL.md +6 -6
- package/.claude/skills/extend/references/extended-script-schema.md +5 -5
- package/.claude/skills/md-to-mulmo/SKILL.md +8 -8
- package/.claude/skills/narrate/SKILL.md +8 -8
- package/.claude/skills/narrate/references/extended-script-schema.md +5 -5
- package/README.md +187 -27
- package/lib/actions/bundle.d.ts.map +1 -1
- package/lib/actions/bundle.js +10 -0
- package/lib/actions/bundle.js.map +1 -1
- package/lib/actions/extend-merge.d.ts +2 -0
- package/lib/actions/extend-merge.d.ts.map +1 -0
- package/lib/actions/extend-merge.js +22 -0
- package/lib/actions/extend-merge.js.map +1 -0
- package/lib/actions/extend-scaffold.d.ts +2 -2
- package/lib/actions/extend-scaffold.d.ts.map +1 -1
- package/lib/actions/extend-scaffold.js +3 -3
- package/lib/actions/extend-scaffold.js.map +1 -1
- package/lib/actions/extend-validate.js +3 -3
- package/lib/actions/extend-validate.js.map +1 -1
- package/lib/actions/md-to-extended.d.ts +7 -7
- package/lib/actions/md-to-extended.d.ts.map +1 -1
- package/lib/actions/md-to-extended.js +20 -20
- package/lib/actions/md-to-extended.js.map +1 -1
- package/lib/actions/narrate.d.ts +1 -1
- package/lib/actions/narrate.d.ts.map +1 -1
- package/lib/actions/narrate.js +12 -14
- package/lib/actions/narrate.js.map +1 -1
- package/lib/actions/pipeline.d.ts +13 -0
- package/lib/actions/pipeline.d.ts.map +1 -0
- package/lib/actions/pipeline.js +78 -0
- package/lib/actions/pipeline.js.map +1 -0
- package/lib/actions/preview.js +1 -1
- package/lib/actions/preview.js.map +1 -1
- package/lib/cli/action-commands.d.ts +3 -0
- package/lib/cli/action-commands.d.ts.map +1 -0
- package/lib/cli/action-commands.js +144 -0
- package/lib/cli/action-commands.js.map +1 -0
- package/lib/cli/convert-commands.d.ts +3 -0
- package/lib/cli/convert-commands.d.ts.map +1 -0
- package/lib/cli/convert-commands.js +190 -0
- package/lib/cli/convert-commands.js.map +1 -0
- package/lib/cli/extend-commands.d.ts +3 -0
- package/lib/cli/extend-commands.d.ts.map +1 -0
- package/lib/cli/extend-commands.js +41 -0
- package/lib/cli/extend-commands.js.map +1 -0
- package/lib/cli/index.d.ts +3 -0
- package/lib/cli/index.d.ts.map +1 -0
- package/lib/cli/index.js +31 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/cli/misc-commands.d.ts +3 -0
- package/lib/cli/misc-commands.d.ts.map +1 -0
- package/lib/cli/misc-commands.js +86 -0
- package/lib/cli/misc-commands.js.map +1 -0
- package/lib/cli/options.d.ts +194 -0
- package/lib/cli/options.d.ts.map +1 -0
- package/lib/cli/options.js +125 -0
- package/lib/cli/options.js.map +1 -0
- package/lib/cli.js +86 -29
- package/lib/cli.js.map +1 -1
- package/lib/convert/marp.js +1 -1
- package/lib/convert/marp.js.map +1 -1
- package/lib/convert/movie.d.ts.map +1 -1
- package/lib/convert/movie.js +2 -2
- package/lib/convert/movie.js.map +1 -1
- package/lib/utils/extended-bundle-merge.d.ts +6 -0
- package/lib/utils/extended-bundle-merge.d.ts.map +1 -0
- package/lib/utils/extended-bundle-merge.js +71 -0
- package/lib/utils/extended-bundle-merge.js.map +1 -0
- package/lib/vue/assets/index-BZu3TPGe.js +115 -0
- package/lib/vue/assets/index-DyeW2SiG.css +1 -0
- package/lib/vue/index.html +3 -3
- package/lib/vue/openai-chat.d.ts +12 -0
- package/lib/vue/openai-chat.d.ts.map +1 -0
- package/lib/vue/openai-chat.js +85 -0
- package/lib/vue/openai-chat.js.map +1 -0
- package/package.json +31 -27
- package/lib/convert/pdfvision.d.ts +0 -14
- package/lib/convert/pdfvision.d.ts.map +0 -1
- package/lib/convert/pdfvision.js +0 -247
- package/lib/convert/pdfvision.js.map +0 -1
- package/lib/utils/document-analysis.d.ts +0 -43
- package/lib/utils/document-analysis.d.ts.map +0 -1
- package/lib/utils/document-analysis.js +0 -118
- package/lib/utils/document-analysis.js.map +0 -1
- package/lib/utils/narration-generator.d.ts +0 -14
- package/lib/utils/narration-generator.d.ts.map +0 -1
- package/lib/utils/narration-generator.js +0 -68
- package/lib/utils/narration-generator.js.map +0 -1
- package/lib/utils/vision-provider.d.ts +0 -12
- package/lib/utils/vision-provider.d.ts.map +0 -1
- package/lib/utils/vision-provider.js +0 -105
- package/lib/utils/vision-provider.js.map +0 -1
- package/lib/vue/assets/index-D6am8L57.css +0 -1
- package/lib/vue/assets/index-xq-ZNfmX.js +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@media(hover:none){.play-overlay[data-v-843621f0]{opacity:.6}.play-overlay[data-v-843621f0]:active{opacity:1}}.mulmo-text-box[data-v-46289647]{background:var(--mulmo-text-bg, #ffffff);color:inherit}.mulmo-text-primary[data-v-46289647]{color:var(--mulmo-text-primary, inherit)}.mulmo-text-secondary[data-v-46289647]{color:inherit;opacity:var(--mulmo-text-secondary-opacity, .7)}@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-border-style:solid;--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-duration:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,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-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-7xl:80rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-lg:.5rem;--radius-2xl:1rem;--aspect-video:16/9;--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)}}@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,ui-sans-serif,system-ui,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;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{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}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-2{top:calc(var(--spacing)*2)}.right-0{right:calc(var(--spacing)*0)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-2{bottom:calc(var(--spacing)*2)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.z-50{z-index:50}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.float-left{float:left}.clear-both{clear:both}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-4{margin-right:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-1{margin-left:calc(var(--spacing)*1)}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.aspect-video{aspect-ratio:var(--aspect-video)}.h-4{height:calc(var(--spacing)*4)}.h-6\!{height:calc(var(--spacing)*6)!important}.h-8{height:calc(var(--spacing)*8)}.h-16{height:calc(var(--spacing)*16)}.h-auto{height:auto}.h-full{height:100%}.max-h-\[80vh\]{max-height:80vh}.max-h-full{max-height:100%}.w-4{width:calc(var(--spacing)*4)}.w-8{width:calc(var(--spacing)*8)}.w-16{width:calc(var(--spacing)*16)}.w-30{width:calc(var(--spacing)*30)}.w-64{width:calc(var(--spacing)*64)}.w-auto{width:auto}.w-full{width:100%}.max-w-7xl{max-width:var(--container-7xl)}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[auto\,1fr\,auto\]{grid-template-columns:auto,1fr,auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.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-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-y-4{row-gap:calc(var(--spacing)*4)}.self-center{align-self:center}.justify-self-end{justify-self:flex-end}.justify-self-start{justify-self:flex-start}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-black{background-color:var(--color-black)}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-green-600{background-color:var(--color-green-600)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-red-600{background-color:var(--color-red-600)}.bg-white{background-color:var(--color-white)}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-10{padding:calc(var(--spacing)*10)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-12{padding-block:calc(var(--spacing)*12)}.text-center{text-align:center}.text-left{text-align:left}.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-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-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.opacity-0{opacity:0}.opacity-0\!{opacity:0!important}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.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-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))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.\[--mulmo-text-bg\:\#1f2937\]{--mulmo-text-bg:#1f2937}.\[--mulmo-text-primary\:\#fff\]{--mulmo-text-primary:#fff}@media(hover:hover){.group-hover\:text-indigo-600:is(:where(.group):hover *){color:var(--color-indigo-600)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:border-indigo-400:hover{border-color:var(--color-indigo-400)}.hover\:bg-amber-700:hover{background-color:var(--color-amber-700)}.hover\:bg-black\/70:hover{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/70:hover{background-color:color-mix(in oklab,var(--color-black)70%,transparent)}}.hover\:bg-black\/80:hover{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/80:hover{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px 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)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-2:focus{--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\:ring-indigo-200:focus{--tw-ring-color:var(--color-indigo-200)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-50:disabled{opacity:.5}@media not all and (min-width:40rem){.max-sm\:col-span-2{grid-column:span 2/span 2}.max-sm\:col-start-1{grid-column-start:1}.max-sm\:col-start-2{grid-column-start:2}.max-sm\:row-start-2{grid-row-start:2}.max-sm\:row-start-3{grid-row-start:3}.max-sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:40rem){.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline-block{display:inline-block}.sm\:w-auto{width:auto}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:80rem){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}.mulmocast-video::-webkit-media-controls-enclosure{background-color:#00000080!important;border-radius:0!important}.mulmocast-video::-webkit-media-controls-current-time-display{-webkit-text-fill-color:#fff!important}.mulmocast-video::-webkit-media-controls-time-remaining-display{-webkit-text-fill-color:#fff!important}.mulmocast-video::-webkit-media-controls-play-button{filter:brightness(1.1)}.mulmocast-video::-webkit-media-controls-mute-button{filter:brightness(1.1)}.mulmocast-video::-webkit-media-controls-overlay-play-button{filter:brightness(1.1)}.mulmocast-video::-webkit-media-controls-fullscreen-button{filter:brightness(1.1)}.mulmocast-video::-webkit-media-controls{opacity:0;transition:opacity .3s}.mulmocast-video:hover::-webkit-media-controls{opacity:1}.mulmocast-audio::-webkit-media-controls-enclosure{background-color:#00000080!important;border-radius:0!important}.mulmocast-audio::-webkit-media-controls-current-time-display{-webkit-text-fill-color:#fff!important}.mulmocast-audio::-webkit-media-controls-time-remaining-display{-webkit-text-fill-color:#fff!important}.mulmocast-audio::-webkit-media-controls-play-button{filter:brightness(1.1)}.mulmocast-audio::-webkit-media-controls-mute-button{filter:brightness(1.1)}.mulmocast-audio::-webkit-media-controls{opacity:0;transition:opacity .3s}.mulmocast-audio:hover::-webkit-media-controls{opacity:1}@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-leading{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@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-duration{syntax:"*";inherits:false}.px-4.py-2.bg-gray-500{margin:.5rem}.items-center.justify-center.w-full{padding:.5rem}.max-w-7xl{padding:.5rem;margin:.5rem}@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-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight: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}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,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-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--radius-sm:.25rem;--radius-lg:.5rem;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--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)}}@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,ui-sans-serif,system-ui,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;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{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{.fixed{position:fixed}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-8{margin-top:calc(var(--spacing)*8)}.mr-96{margin-right:calc(var(--spacing)*96)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.block{display:block}.flex{display:flex}.h-3{height:calc(var(--spacing)*3)}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing)*3)}.w-56{width:calc(var(--spacing)*56)}.w-96{width:calc(var(--spacing)*96)}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[85\%\]{max-width:85%}.flex-1{flex:1}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.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}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}: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)))}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-none{--tw-border-style:none;border-style:none}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-600{background-color:var(--color-green-600)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-600{background-color:var(--color-purple-600)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-600{background-color:var(--color-red-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-red-900\/50{background-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.bg-red-900\/50{background-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.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))}.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)}.break-words{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-red-200{color:var(--color-red-200)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-white{color:var(--color-white)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition-\[margin\]{transition-property:margin;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))}.\[--mulmo-text-bg\:\#1f2937\]{--mulmo-text-bg:#1f2937}.\[--mulmo-text-secondary\:\#bbb\]{--mulmo-text-secondary:#bbb}@media(hover:hover){.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\:bg-purple-700:hover{background-color:var(--color-purple-700)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{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}@keyframes pulse{50%{opacity:.5}}
|
package/lib/vue/index.html
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
<!
|
|
1
|
+
<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>MulmoViewer Preview</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-BZu3TPGe.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-DyeW2SiG.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="app"></div>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface ChatMessage {
|
|
2
|
+
role: "system" | "user" | "assistant";
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
export interface ChatOptions {
|
|
6
|
+
apiKey: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export type StreamCallback = (chunk: string) => void;
|
|
11
|
+
export declare function streamChat(messages: ChatMessage[], options: ChatOptions, onChunk: StreamCallback): Promise<string>;
|
|
12
|
+
//# sourceMappingURL=openai-chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-chat.d.ts","sourceRoot":"","sources":["../../src/vue/openai-chat.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAiBrD,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,MAAM,CAAC,CA2EjB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const OPENAI_CHAT_URL = "https://api.openai.com/v1/chat/completions";
|
|
2
|
+
const DEFAULT_MODEL = "gpt-4o-mini";
|
|
3
|
+
const IDLE_TIMEOUT_MS = 30_000;
|
|
4
|
+
function parseSSELine(line) {
|
|
5
|
+
if (!line.startsWith("data: "))
|
|
6
|
+
return null;
|
|
7
|
+
const data = line.slice("data: ".length);
|
|
8
|
+
if (data === "[DONE]")
|
|
9
|
+
return null;
|
|
10
|
+
try {
|
|
11
|
+
const parsed = JSON.parse(data);
|
|
12
|
+
return parsed.choices?.[0]?.delta?.content ?? null;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function streamChat(messages, options, onChunk) {
|
|
19
|
+
const timeoutController = new AbortController();
|
|
20
|
+
let timeoutId = setTimeout(() => timeoutController.abort(), IDLE_TIMEOUT_MS);
|
|
21
|
+
function resetIdleTimeout() {
|
|
22
|
+
clearTimeout(timeoutId);
|
|
23
|
+
timeoutId = setTimeout(() => timeoutController.abort(), IDLE_TIMEOUT_MS);
|
|
24
|
+
}
|
|
25
|
+
// Combine user-provided signal with timeout signal
|
|
26
|
+
const combinedSignal = options.signal
|
|
27
|
+
? AbortSignal.any([options.signal, timeoutController.signal])
|
|
28
|
+
: timeoutController.signal;
|
|
29
|
+
try {
|
|
30
|
+
const response = await fetch(OPENAI_CHAT_URL, {
|
|
31
|
+
method: "POST",
|
|
32
|
+
headers: {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
Authorization: `Bearer ${options.apiKey}`,
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
model: options.model ?? DEFAULT_MODEL,
|
|
38
|
+
messages,
|
|
39
|
+
stream: true,
|
|
40
|
+
}),
|
|
41
|
+
signal: combinedSignal,
|
|
42
|
+
});
|
|
43
|
+
if (!response.ok) {
|
|
44
|
+
const errorBody = await response.text();
|
|
45
|
+
throw new Error(`OpenAI API error (${response.status}): ${errorBody}`);
|
|
46
|
+
}
|
|
47
|
+
if (!response.body) {
|
|
48
|
+
throw new Error("Response body is null");
|
|
49
|
+
}
|
|
50
|
+
const reader = response.body.getReader();
|
|
51
|
+
const decoder = new TextDecoder();
|
|
52
|
+
const resultParts = [];
|
|
53
|
+
let buffer = "";
|
|
54
|
+
for (;;) {
|
|
55
|
+
const { done, value } = await reader.read();
|
|
56
|
+
if (done)
|
|
57
|
+
break;
|
|
58
|
+
buffer += decoder.decode(value, { stream: true });
|
|
59
|
+
const lines = buffer.split("\n");
|
|
60
|
+
// Keep the last incomplete line in the buffer
|
|
61
|
+
buffer = lines.pop() ?? "";
|
|
62
|
+
lines.forEach((line) => {
|
|
63
|
+
const content = parseSSELine(line.trim());
|
|
64
|
+
if (content) {
|
|
65
|
+
resultParts.push(content);
|
|
66
|
+
onChunk(content);
|
|
67
|
+
resetIdleTimeout();
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
// Process any remaining buffer
|
|
72
|
+
if (buffer.trim()) {
|
|
73
|
+
const content = parseSSELine(buffer.trim());
|
|
74
|
+
if (content) {
|
|
75
|
+
resultParts.push(content);
|
|
76
|
+
onChunk(content);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return resultParts.join("");
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
clearTimeout(timeoutId);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=openai-chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-chat.js","sourceRoot":"","sources":["../../src/vue/openai-chat.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mulmocast/slide",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Convert presentations (Keynote, PowerPoint, PDF, Marp) and videos to MulmoScript format",
|
|
5
5
|
"homepage": "https://github.com/receptron/MulmoCast-Slides#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
}
|
|
27
27
|
},
|
|
28
28
|
"bin": {
|
|
29
|
-
"mulmo-slide": "./lib/cli.js"
|
|
29
|
+
"mulmo-slide": "./lib/cli/index.js"
|
|
30
30
|
},
|
|
31
31
|
"files": [
|
|
32
32
|
"lib",
|
|
@@ -38,39 +38,42 @@
|
|
|
38
38
|
"build:vue": "vite build",
|
|
39
39
|
"build:all": "tsc && vite build",
|
|
40
40
|
"dev": "vite",
|
|
41
|
-
"preview": "tsx src/cli.ts preview",
|
|
41
|
+
"preview": "tsx src/cli/index.ts preview",
|
|
42
42
|
"test": "tsx --test ./tests/test_*.ts",
|
|
43
43
|
"lint": "eslint src/",
|
|
44
44
|
"lint:fix": "eslint src/ --fix",
|
|
45
45
|
"format": "prettier --write src/",
|
|
46
46
|
"format:check": "prettier --check src/",
|
|
47
|
-
"cli": "tsx src/cli.ts",
|
|
48
|
-
"keynote": "tsx src/cli.ts keynote",
|
|
49
|
-
"pptx": "tsx src/cli.ts pptx",
|
|
50
|
-
"pdf": "tsx src/cli.ts pdf",
|
|
51
|
-
"marp": "tsx src/cli.ts marp",
|
|
52
|
-
"markdown": "tsx src/cli.ts markdown",
|
|
53
|
-
"convert": "tsx src/cli.ts convert",
|
|
54
|
-
"transcribe": "tsx src/cli.ts transcribe",
|
|
55
|
-
"movie": "tsx src/cli.ts movie",
|
|
56
|
-
"bundle": "tsx src/cli.ts bundle",
|
|
57
|
-
"parse-md": "tsx src/cli.ts parse-md",
|
|
58
|
-
"assemble-extended": "tsx src/cli.ts assemble-extended",
|
|
59
|
-
"narrate": "tsx src/cli.ts narrate",
|
|
60
|
-
"upload": "tsx src/cli.ts upload",
|
|
61
|
-
"
|
|
62
|
-
"test:
|
|
63
|
-
"test:marp
|
|
47
|
+
"cli": "tsx src/cli/index.ts",
|
|
48
|
+
"keynote": "tsx src/cli/index.ts keynote",
|
|
49
|
+
"pptx": "tsx src/cli/index.ts pptx",
|
|
50
|
+
"pdf": "tsx src/cli/index.ts pdf",
|
|
51
|
+
"marp": "tsx src/cli/index.ts marp",
|
|
52
|
+
"markdown": "tsx src/cli/index.ts markdown",
|
|
53
|
+
"convert": "tsx src/cli/index.ts convert",
|
|
54
|
+
"transcribe": "tsx src/cli/index.ts transcribe",
|
|
55
|
+
"movie": "tsx src/cli/index.ts movie",
|
|
56
|
+
"bundle": "tsx src/cli/index.ts bundle",
|
|
57
|
+
"parse-md": "tsx src/cli/index.ts parse-md",
|
|
58
|
+
"assemble-extended": "tsx src/cli/index.ts assemble-extended",
|
|
59
|
+
"narrate": "tsx src/cli/index.ts narrate",
|
|
60
|
+
"upload": "tsx src/cli/index.ts upload",
|
|
61
|
+
"publish:mulmo": "tsx src/cli/index.ts publish",
|
|
62
|
+
"test:keynote": "tsx src/cli/index.ts keynote samples/GraphAI.key",
|
|
63
|
+
"test:marp": "tsx src/cli/index.ts marp samples/sample.md",
|
|
64
|
+
"test:marp:theme": "tsx src/cli/index.ts marp samples/custom_theme_demo.md --theme samples/custom-ocean.css"
|
|
64
65
|
},
|
|
65
66
|
"dependencies": {
|
|
66
67
|
"@marp-team/marp-cli": "^4.0.0",
|
|
67
|
-
"@mulmocast/extended-types": "^0.
|
|
68
|
-
"
|
|
68
|
+
"@mulmocast/extended-types": "^0.3.1",
|
|
69
|
+
"@mulmocast/script-utils": "^0.1.0",
|
|
70
|
+
"@mulmocast/types": "2.1.38",
|
|
71
|
+
"dotenv": "^17.3.1",
|
|
69
72
|
"franc": "^6.2.0",
|
|
70
|
-
"mulmocast": "
|
|
71
|
-
"mulmocast-viewer": "^0.
|
|
73
|
+
"mulmocast": "2.1.38",
|
|
74
|
+
"mulmocast-viewer": "^0.2.3",
|
|
72
75
|
"node-pptx-parser": "^1.0.1",
|
|
73
|
-
"openai": "^6.
|
|
76
|
+
"openai": "^6.21.0",
|
|
74
77
|
"pdf-parse": "^2.4.5",
|
|
75
78
|
"ppt-png": "^2.2.0",
|
|
76
79
|
"tsx": "^4.7.0",
|
|
@@ -78,13 +81,14 @@
|
|
|
78
81
|
"yargs": "^18.0.0"
|
|
79
82
|
},
|
|
80
83
|
"devDependencies": {
|
|
84
|
+
"@eslint/js": "^10.0.1",
|
|
81
85
|
"@tailwindcss/vite": "^4.1.18",
|
|
82
|
-
"@types/node": "^25.2.
|
|
86
|
+
"@types/node": "^25.2.3",
|
|
83
87
|
"@types/yargs": "^17.0.35",
|
|
84
88
|
"@typescript-eslint/eslint-plugin": "^8.55.0",
|
|
85
89
|
"@typescript-eslint/parser": "^8.55.0",
|
|
86
90
|
"@vitejs/plugin-vue": "^6.0.4",
|
|
87
|
-
"eslint": "^
|
|
91
|
+
"eslint": "^10.0.0",
|
|
88
92
|
"eslint-config-prettier": "^10.1.8",
|
|
89
93
|
"eslint-plugin-prettier": "^5.5.5",
|
|
90
94
|
"globals": "^17.3.0",
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type SupportedLang } from "../utils/lang.js";
|
|
2
|
-
export interface ConvertPdfVisionOptions {
|
|
3
|
-
inputPath: string;
|
|
4
|
-
lang?: SupportedLang;
|
|
5
|
-
provider?: string;
|
|
6
|
-
}
|
|
7
|
-
export interface ConvertPdfVisionResult {
|
|
8
|
-
mulmoScriptPath: string;
|
|
9
|
-
extractedTextsPath: string | null;
|
|
10
|
-
analysisPath: string;
|
|
11
|
-
slideCount: number;
|
|
12
|
-
}
|
|
13
|
-
export declare const convertPdfVision: (options: ConvertPdfVisionOptions) => Promise<ConvertPdfVisionResult>;
|
|
14
|
-
//# sourceMappingURL=pdfvision.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pdfvision.d.ts","sourceRoot":"","sources":["../../src/convert/pdfvision.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAwBnE,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AA6ND,eAAO,MAAM,gBAAgB,GAC3B,SAAS,uBAAuB,KAC/B,OAAO,CAAC,sBAAsB,CA0FhC,CAAC"}
|
package/lib/convert/pdfvision.js
DELETED
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
import * as fs from "fs";
|
|
2
|
-
import * as path from "path";
|
|
3
|
-
import { execSync } from "child_process";
|
|
4
|
-
import { mulmoScriptSchema } from "mulmocast";
|
|
5
|
-
import { resolveLang } from "../utils/lang.js";
|
|
6
|
-
import { convertPdfToImages, extractTextFromPdf, writeMulmoScript } from "../utils/pdf.js";
|
|
7
|
-
import { checkDependencies } from "../utils/dependencies.js";
|
|
8
|
-
import { resolveVisionProvider, callVisionAPI, callTextLLM, } from "../utils/vision-provider.js";
|
|
9
|
-
import { buildDocumentAnalysisPrompt, parseDocumentAnalysis, } from "../utils/document-analysis.js";
|
|
10
|
-
import { buildNarrationPrompt, parseNarrationResponse } from "../utils/narration-generator.js";
|
|
11
|
-
const CROP_PADDING_PERCENT = 5;
|
|
12
|
-
const CROP_DPI = 600;
|
|
13
|
-
const TRIM_BORDER_PX = 20;
|
|
14
|
-
const getMagickCmd = () => {
|
|
15
|
-
return process.platform === "linux" ? "convert" : "magick";
|
|
16
|
-
};
|
|
17
|
-
const buildPageImages = (imagesDir, basename, pageCount) => {
|
|
18
|
-
return Array.from({ length: pageCount }, (_, i) => ({
|
|
19
|
-
path: path.join(imagesDir, `${basename}-${i}.png`),
|
|
20
|
-
})).filter((img) => fs.existsSync(img.path));
|
|
21
|
-
};
|
|
22
|
-
const sanitizeLabel = (label) => {
|
|
23
|
-
return label.replace(/[^a-zA-Z0-9_-]/g, "_").toLowerCase();
|
|
24
|
-
};
|
|
25
|
-
const getImageDimensions = (imagePath) => {
|
|
26
|
-
try {
|
|
27
|
-
const magick = getMagickCmd();
|
|
28
|
-
const identifyCmd = magick === "magick" ? "magick identify" : "identify";
|
|
29
|
-
const output = execSync(`${identifyCmd} -format "%w %h" "${imagePath}"`, { encoding: "utf-8" });
|
|
30
|
-
const [w, h] = output.trim().split(" ").map(Number);
|
|
31
|
-
return { width: w, height: h };
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
const convertPageHighRes = (pdfPath, page, outputPath) => {
|
|
38
|
-
try {
|
|
39
|
-
const magick = getMagickCmd();
|
|
40
|
-
const cmd = `${magick} -density ${CROP_DPI} -antialias "${pdfPath}[${page}]" -background white -alpha remove -quality 95 "${outputPath}"`;
|
|
41
|
-
execSync(cmd, { stdio: "pipe" });
|
|
42
|
-
return fs.existsSync(outputPath);
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
const addPadding = (bbox, padding) => {
|
|
49
|
-
const x = Math.max(0, bbox.x - padding);
|
|
50
|
-
const y = Math.max(0, bbox.y - padding);
|
|
51
|
-
const width = Math.min(100 - x, bbox.width + padding * 2);
|
|
52
|
-
const height = Math.min(100 - y, bbox.height + padding * 2);
|
|
53
|
-
return { x, y, width, height };
|
|
54
|
-
};
|
|
55
|
-
const cropFigure = (pageImagePath, outputPath, bbox) => {
|
|
56
|
-
try {
|
|
57
|
-
const dims = getImageDimensions(pageImagePath);
|
|
58
|
-
if (!dims)
|
|
59
|
-
return false;
|
|
60
|
-
const padded = addPadding(bbox, CROP_PADDING_PERCENT);
|
|
61
|
-
const cropX = Math.round((padded.x / 100) * dims.width);
|
|
62
|
-
const cropY = Math.round((padded.y / 100) * dims.height);
|
|
63
|
-
const cropW = Math.round((padded.width / 100) * dims.width);
|
|
64
|
-
const cropH = Math.round((padded.height / 100) * dims.height);
|
|
65
|
-
const magick = getMagickCmd();
|
|
66
|
-
const cropCmd = [
|
|
67
|
-
`${magick} "${pageImagePath}"`,
|
|
68
|
-
`-crop ${cropW}x${cropH}+${cropX}+${cropY} +repage`,
|
|
69
|
-
`-trim +repage`,
|
|
70
|
-
`-bordercolor white -border ${TRIM_BORDER_PX}`,
|
|
71
|
-
`"${outputPath}"`,
|
|
72
|
-
].join(" ");
|
|
73
|
-
execSync(cropCmd, { stdio: "pipe" });
|
|
74
|
-
return fs.existsSync(outputPath);
|
|
75
|
-
}
|
|
76
|
-
catch {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
const cropFigures = (analysis, imagesDir, basename, pdfPath) => {
|
|
81
|
-
const figureImageMap = new Map();
|
|
82
|
-
// Identify pages that need high-res conversion
|
|
83
|
-
const pagesWithFigures = new Set();
|
|
84
|
-
analysis.figures.forEach((figure) => {
|
|
85
|
-
if (figure.bbox && figure.label) {
|
|
86
|
-
pagesWithFigures.add(figure.page);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
// Convert those pages at high DPI
|
|
90
|
-
const highResDir = path.join(imagesDir, "_highres");
|
|
91
|
-
if (pagesWithFigures.size > 0) {
|
|
92
|
-
if (!fs.existsSync(highResDir)) {
|
|
93
|
-
fs.mkdirSync(highResDir, { recursive: true });
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
const highResMap = new Map();
|
|
97
|
-
pagesWithFigures.forEach((page) => {
|
|
98
|
-
const highResPath = path.join(highResDir, `${basename}-${page}-hires.png`);
|
|
99
|
-
if (convertPageHighRes(pdfPath, page, highResPath)) {
|
|
100
|
-
highResMap.set(page, highResPath);
|
|
101
|
-
console.log(` High-res (${CROP_DPI}dpi): page ${page}`);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
// Crop figures from high-res images (fallback to standard images)
|
|
105
|
-
analysis.figures.forEach((figure) => {
|
|
106
|
-
if (!figure.bbox || !figure.label)
|
|
107
|
-
return;
|
|
108
|
-
const sourceImage = highResMap.get(figure.page) ?? path.join(imagesDir, `${basename}-${figure.page}.png`);
|
|
109
|
-
if (!fs.existsSync(sourceImage))
|
|
110
|
-
return;
|
|
111
|
-
const sanitized = sanitizeLabel(figure.label);
|
|
112
|
-
const croppedFilename = `${basename}-fig-${sanitized}.png`;
|
|
113
|
-
const croppedPath = path.join(imagesDir, croppedFilename);
|
|
114
|
-
if (cropFigure(sourceImage, croppedPath, figure.bbox)) {
|
|
115
|
-
figureImageMap.set(figure.label, `./images/${croppedFilename}`);
|
|
116
|
-
console.log(` Cropped: ${figure.label} → ${croppedFilename}`);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
// Clean up high-res temp images
|
|
120
|
-
if (fs.existsSync(highResDir)) {
|
|
121
|
-
fs.readdirSync(highResDir).forEach((f) => fs.unlinkSync(path.join(highResDir, f)));
|
|
122
|
-
fs.rmdirSync(highResDir);
|
|
123
|
-
}
|
|
124
|
-
return figureImageMap;
|
|
125
|
-
};
|
|
126
|
-
const analyzeDocument = async (provider, images, extractedTexts, lang) => {
|
|
127
|
-
console.log(`Analyzing document with ${provider} Vision API...`);
|
|
128
|
-
const prompt = buildDocumentAnalysisPrompt({
|
|
129
|
-
pageCount: images.length,
|
|
130
|
-
extractedTexts,
|
|
131
|
-
lang,
|
|
132
|
-
});
|
|
133
|
-
const response = await callVisionAPI(provider, { prompt, images });
|
|
134
|
-
return parseDocumentAnalysis(response);
|
|
135
|
-
};
|
|
136
|
-
const generateNarrations = async (provider, analysis, extractedTexts, lang) => {
|
|
137
|
-
console.log("Generating narration with text LLM...");
|
|
138
|
-
const prompt = buildNarrationPrompt({
|
|
139
|
-
documentAnalysis: analysis,
|
|
140
|
-
extractedTexts,
|
|
141
|
-
lang,
|
|
142
|
-
});
|
|
143
|
-
const response = await callTextLLM(provider, prompt);
|
|
144
|
-
const entries = parseNarrationResponse(response, analysis.slides.length);
|
|
145
|
-
return entries.map((e) => e.text);
|
|
146
|
-
};
|
|
147
|
-
const buildMulmoScript = (analysis, narrations, basename, lang, figureImageMap) => {
|
|
148
|
-
const beats = analysis.slides.map((slide, i) => {
|
|
149
|
-
const imagePage = slide.imagePage ?? slide.sourcePages[0] ?? 0;
|
|
150
|
-
const pageImagePath = `./images/${basename}-${imagePage}.png`;
|
|
151
|
-
const imagePath = slide.figureRef && figureImageMap.has(slide.figureRef)
|
|
152
|
-
? figureImageMap.get(slide.figureRef)
|
|
153
|
-
: pageImagePath;
|
|
154
|
-
return {
|
|
155
|
-
text: narrations[i] || "",
|
|
156
|
-
image: {
|
|
157
|
-
type: "image",
|
|
158
|
-
source: {
|
|
159
|
-
kind: "path",
|
|
160
|
-
path: imagePath,
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
};
|
|
164
|
-
});
|
|
165
|
-
const mulmoScript = {
|
|
166
|
-
$mulmocast: { version: "1.1" },
|
|
167
|
-
lang,
|
|
168
|
-
beats,
|
|
169
|
-
};
|
|
170
|
-
const result = mulmoScriptSchema.safeParse(mulmoScript);
|
|
171
|
-
if (!result.success) {
|
|
172
|
-
console.error("MulmoScript validation failed:");
|
|
173
|
-
console.error(result.error.format());
|
|
174
|
-
throw new Error("Invalid MulmoScript generated");
|
|
175
|
-
}
|
|
176
|
-
return result.data;
|
|
177
|
-
};
|
|
178
|
-
export const convertPdfVision = async (options) => {
|
|
179
|
-
const { inputPath, provider: providerArg } = options;
|
|
180
|
-
const pdfFile = path.resolve(inputPath);
|
|
181
|
-
if (!fs.existsSync(pdfFile)) {
|
|
182
|
-
throw new Error(`File not found: ${pdfFile}`);
|
|
183
|
-
}
|
|
184
|
-
checkDependencies("pdf");
|
|
185
|
-
const provider = resolveVisionProvider(providerArg);
|
|
186
|
-
console.log(`Using Vision provider: ${provider}`);
|
|
187
|
-
const basename = path.basename(pdfFile, ".pdf");
|
|
188
|
-
const outputDir = path.join("scripts", basename);
|
|
189
|
-
const imagesDir = path.join(outputDir, "images");
|
|
190
|
-
if (!fs.existsSync(outputDir)) {
|
|
191
|
-
fs.mkdirSync(outputDir, { recursive: true });
|
|
192
|
-
}
|
|
193
|
-
// Step 1: Convert PDF to page images
|
|
194
|
-
console.log("Converting PDF to images...");
|
|
195
|
-
const { slideCount: pageCount } = convertPdfToImages({
|
|
196
|
-
pdfPath: pdfFile,
|
|
197
|
-
imagesDir,
|
|
198
|
-
basename,
|
|
199
|
-
});
|
|
200
|
-
// Step 2: Extract text
|
|
201
|
-
console.log("Extracting text from PDF...");
|
|
202
|
-
const pageTexts = await extractTextFromPdf(pdfFile);
|
|
203
|
-
const extractedTexts = [];
|
|
204
|
-
pageTexts.forEach((page) => {
|
|
205
|
-
extractedTexts[page.pageNumber] = page.text;
|
|
206
|
-
});
|
|
207
|
-
console.log(`Extracted text from ${pageTexts.length} pages`);
|
|
208
|
-
const resolvedLang = resolveLang(options.lang, extractedTexts.filter(Boolean));
|
|
209
|
-
// Save extracted texts
|
|
210
|
-
const hasExtractedText = extractedTexts.some((t) => t && t.length > 0);
|
|
211
|
-
let extractedTextsPath = null;
|
|
212
|
-
if (hasExtractedText) {
|
|
213
|
-
extractedTextsPath = path.join(outputDir, "extracted_texts.json");
|
|
214
|
-
fs.writeFileSync(extractedTextsPath, JSON.stringify(extractedTexts, null, 2));
|
|
215
|
-
}
|
|
216
|
-
// Step 3: Vision API - analyze document (1 API call)
|
|
217
|
-
const images = buildPageImages(imagesDir, basename, pageCount);
|
|
218
|
-
const analysis = await analyzeDocument(provider, images, extractedTexts, resolvedLang);
|
|
219
|
-
// Save analysis
|
|
220
|
-
const analysisPath = path.join(outputDir, "analysis.json");
|
|
221
|
-
fs.writeFileSync(analysisPath, JSON.stringify(analysis, null, 2));
|
|
222
|
-
console.log(`Document analysis saved: ${analysisPath}`);
|
|
223
|
-
console.log(` Sections: ${analysis.sections.length}`);
|
|
224
|
-
console.log(` Figures: ${analysis.figures.length}`);
|
|
225
|
-
console.log(` Planned slides: ${analysis.slides.length}`);
|
|
226
|
-
// Step 4: Crop figures from high-res page images
|
|
227
|
-
console.log("Cropping figures from page images...");
|
|
228
|
-
const figureImageMap = cropFigures(analysis, imagesDir, basename, pdfFile);
|
|
229
|
-
console.log(` Cropped ${figureImageMap.size} figures`);
|
|
230
|
-
// Step 5: Text LLM - generate narration (1 API call)
|
|
231
|
-
const narrations = await generateNarrations(provider, analysis, extractedTexts, resolvedLang);
|
|
232
|
-
// Step 6: Build and write MulmoScript
|
|
233
|
-
const mulmoScript = buildMulmoScript(analysis, narrations, basename, resolvedLang, figureImageMap);
|
|
234
|
-
const jsonPath = path.join(outputDir, `${basename}.json`);
|
|
235
|
-
writeMulmoScript(mulmoScript, jsonPath);
|
|
236
|
-
console.log(`\n✓ pdfvision conversion complete!`);
|
|
237
|
-
console.log(` Provider: ${provider}`);
|
|
238
|
-
console.log(` Pages: ${pageCount} → Slides: ${analysis.slides.length}`);
|
|
239
|
-
console.log(` Output: ${jsonPath}`);
|
|
240
|
-
return {
|
|
241
|
-
mulmoScriptPath: jsonPath,
|
|
242
|
-
extractedTextsPath,
|
|
243
|
-
analysisPath,
|
|
244
|
-
slideCount: analysis.slides.length,
|
|
245
|
-
};
|
|
246
|
-
};
|
|
247
|
-
//# sourceMappingURL=pdfvision.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pdfvision.js","sourceRoot":"","sources":["../../src/convert/pdfvision.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { SupportedLang } from "./lang.js";
|
|
2
|
-
export interface SectionInfo {
|
|
3
|
-
name: string;
|
|
4
|
-
pages: number[];
|
|
5
|
-
summary: string;
|
|
6
|
-
}
|
|
7
|
-
export interface BoundingBox {
|
|
8
|
-
x: number;
|
|
9
|
-
y: number;
|
|
10
|
-
width: number;
|
|
11
|
-
height: number;
|
|
12
|
-
}
|
|
13
|
-
export interface FigureInfo {
|
|
14
|
-
page: number;
|
|
15
|
-
type: "figure" | "table" | "chart" | "diagram";
|
|
16
|
-
label?: string;
|
|
17
|
-
description: string;
|
|
18
|
-
importance: "high" | "medium" | "low";
|
|
19
|
-
bbox?: BoundingBox;
|
|
20
|
-
}
|
|
21
|
-
export interface SlideSpec {
|
|
22
|
-
title: string;
|
|
23
|
-
section: string;
|
|
24
|
-
sourcePages: number[];
|
|
25
|
-
imagePage?: number;
|
|
26
|
-
figureRef?: string;
|
|
27
|
-
narrationHint: string;
|
|
28
|
-
}
|
|
29
|
-
export interface DocumentAnalysis {
|
|
30
|
-
title: string;
|
|
31
|
-
authors?: string;
|
|
32
|
-
sections: SectionInfo[];
|
|
33
|
-
figures: FigureInfo[];
|
|
34
|
-
slides: SlideSpec[];
|
|
35
|
-
}
|
|
36
|
-
export interface BuildAnalysisPromptOptions {
|
|
37
|
-
pageCount: number;
|
|
38
|
-
extractedTexts: string[];
|
|
39
|
-
lang: SupportedLang;
|
|
40
|
-
}
|
|
41
|
-
export declare const buildDocumentAnalysisPrompt: (options: BuildAnalysisPromptOptions) => string;
|
|
42
|
-
export declare const parseDocumentAnalysis: (content: string) => DocumentAnalysis;
|
|
43
|
-
//# sourceMappingURL=document-analysis.d.ts.map
|