@chai-ui/vue 0.11.2 → 0.11.3

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/reasoning.ts","../src/ChaiProvider.vue","../src/dismiss.ts","../src/icons.ts","../src/composer/AttachMenu.vue","../src/composer/Chip.vue","../src/composer/PromptField.vue","../src/composer/VoiceButton.vue","../src/composer/VoiceWaveform.vue","../src/primitives/Toggle.vue","../src/primitives/SearchMenu.vue","../src/Composer.vue","../src/edit-card/ExpandedImage.vue","../src/edit-card/RegionShape.vue","../src/PageSlide.vue","../src/page-slide.ts","../src/primitives/Pagination.vue","../src/EditCard.vue","../src/result-card/IconButton.vue","../src/result-card/MoreMenu.vue","../src/result-card/ResultText.vue","../src/result-card/VideoPlayer.vue","../src/result-card/ResultMedia.vue","../src/ResultCard.vue","../src/MediaAnalyzer.vue","../src/useComposer.ts","../src/useMediaAnalyzer.ts"],"sourcesContent":["import { computed, inject, type ComputedRef, type InjectionKey } from \"vue\";\nimport type { Reasoning } from \"@chai-ui/core\";\n\nexport const reasoningKey: InjectionKey<ComputedRef<Reasoning>> = Symbol(\"chai-reasoning\");\n\n/** The nearest `ChaiProvider`'s reasoning engine and models; `undefined` outside one. */\nexport function useReasoning(): ComputedRef<Reasoning | undefined> {\n const provided = inject(reasoningKey, null);\n return computed(() => provided?.value);\n}\n","<script setup lang=\"ts\">\nimport { computed, provide } from \"vue\";\nimport { createReasoning, reasoningEngineFor, type GenerationEngine, type MediaKind } from \"@chai-ui/core\";\nimport { reasoningKey } from \"./reasoning.js\";\n\n/** The reasoning engine and models every CHAI component inside shares. Same props as React's `ChaiProvider`. */\nconst props = defineProps<{\n /** Text, image and routing model. Defaults to `DEFAULT_REASONING_MODEL`. */\n reasoningModel?: string;\n /** Per-attachment-kind models, merged over `DEFAULT_REASONING_MODEL_BY_KIND` one kind at a time. */\n reasoningModelByKind?: Partial<Record<MediaKind, string>>;\n /** The engine the reasoning models run on. Defaults to OpenRouter, independent of the generation engine. */\n reasoningEngine?: GenerationEngine;\n}>();\n\n// Created once, and again only when a different engine is passed.\nconst engine = computed(() => reasoningEngineFor({ reasoningEngine: props.reasoningEngine }));\nprovide(\n reasoningKey,\n computed(() => createReasoning(props, engine.value))\n);\n</script>\n\n<template>\n <slot />\n</template>\n","import { onScopeDispose, watch, type Ref } from \"vue\";\n\n/** While `open`, a press outside `root` or Escape calls `close`: the inline menus' popover behavior. */\nexport function useDismiss(root: Ref<HTMLElement | undefined>, open: Ref<boolean>, close: () => void) {\n function onPointerDown(e: PointerEvent) {\n if (!root.value?.contains(e.target as Node)) close();\n }\n function onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") close();\n }\n function listen(on: boolean) {\n if (on) {\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeydown);\n } else {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeydown);\n }\n }\n watch(open, listen);\n onScopeDispose(() => listen(false));\n}\n","/**\n * The same inline `currentColor` SVGs as the React package's icons, as\n * functional components. Media-action icons are traced from the result\n * card design; the `0 -960 960 960` ones are Material Symbols paths.\n */\nimport { h, type FunctionalComponent } from \"vue\";\n\n/** One shape's attributes; `tag` picks rect or circle over the default path. */\ntype Shape = Record<string, string>;\n\nconst icon =\n (viewBox: string, shapes: Shape[], traced = false): FunctionalComponent =>\n () =>\n h(\n \"svg\",\n { viewBox, \"aria-hidden\": \"true\", ...(traced && { fill: \"none\" }) },\n shapes.map(({ tag = \"path\", ...attrs }) => h(tag, attrs))\n );\n\nexport const DownloadIcon = icon(\"0 0 18 18\", [{ \"d\": \"M8.99961 11.9999L5.24961 8.2499L6.29961 7.1624L8.24961 9.1124V2.9999H9.74961V9.1124L11.6996 7.1624L12.7496 8.2499L8.99961 11.9999ZM2.99961 14.9999V11.2499H4.49961V13.4999H13.4996V11.2499H14.9996V14.9999H2.99961Z\", \"fill\": \"currentColor\" }], true);\nexport const ShareIcon = icon(\"0 0 18 18\", [{ \"d\": \"M2.99961 16.4999V5.9999H6.74961V7.4999H4.49961V14.9999H13.4996V7.4999H11.2496V5.9999H14.9996V16.4999H2.99961ZM8.24961 11.9999V3.61865L7.04961 4.81865L5.99961 3.7499L8.99961 0.749904L11.9996 3.7499L10.9496 4.81865L9.74961 3.61865V11.9999H8.24961Z\", \"fill\": \"currentColor\" }], true);\nexport const ExpandIcon = icon(\"0 0 18 18\", [{ \"d\": \"M2 6V2h4M12 2h4v4M16 12v4h-4M6 16H2v-4\", \"stroke\": \"currentColor\", \"stroke-width\": \"1.6\", \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" }], true);\nexport const ZoomInIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M796-121 533-384q-30 26-69.96 40.5Q423.08-329 378-329q-108.16 0-183.08-75Q120-479 120-585t75-181q75-75 181.5-75t181 75Q632-691 632-584.85 632-542 618-502q-14 40-42 75l264 262-44 44ZM377-389q81.25 0 138.13-57.5Q572-504 572-585t-56.87-138.5Q458.25-781 377-781q-82.08 0-139.54 57.5Q180-666 180-585t57.46 138.5Q294.92-389 377-389Zm-31-85v-82h-82v-60h82v-81h60v81h81v60h-81v82h-60Z\", \"fill\": \"currentColor\" }]);\nexport const ZoomOutIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M796-121 533-384q-30 26-70 40.5T378-329q-108 0-183-75t-75-181q0-106 75-181t182-75q106 0 180.5 75T632-585q0 43-14 83t-42 75l264 262-44 44ZM377-389q81 0 138-57.5T572-585q0-81-57-138.5T377-781q-82 0-139.5 57.5T180-585q0 81 57.5 138.5T377-389ZM275-556v-60h201v60H275Z\", \"fill\": \"currentColor\" }]);\nexport const AddIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z\", \"fill\": \"currentColor\" }]);\nexport const DeleteIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M261-120q-24.75 0-42.37-17.63Q201-155.25 201-180v-570h-41v-60h188v-30h264v30h188v60h-41v570q0 24-18 42t-42 18H261Zm438-630H261v570h438v-570ZM367-266h60v-399h-60v399Zm166 0h60v-399h-60v399ZM261-750v570-570Z\", \"fill\": \"currentColor\" }]);\nexport const VisibilityIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M600.5-379.5Q650-429 650-500t-49.5-120.5Q551-670 480-670t-120.5 49.5Q310-571 310-500t49.5 120.5Q409-330 480-330t120.5-49.5Zm-200-41Q368-453 368-500t32.5-79.5Q433-612 480-612t79.5 32.5Q592-547 592-500t-32.5 79.5Q527-388 480-388t-79.5-32.5ZM216-283Q98-366 40-500q58-134 176-217t264-83q146 0 264 83t176 217q-58 134-176 217t-264 83q-146 0-264-83Zm264-217Zm222.5 174.5Q804-391 857-500q-53-109-154.5-174.5T480-740q-121 0-222.5 65.5T102-500q54 109 155.5 174.5T480-260q121 0 222.5-65.5Z\", \"fill\": \"currentColor\" }]);\nexport const VisibilityOffIcon = icon(\"0 -960 960 960\", [{ \"d\": \"m629-419-44-44q26-71-27-118t-115-24l-44-44q17-11 38-16t43-5q71 0 120.5 49.5T650-500q0 22-5.5 43.5T629-419Zm129 129-40-40q49-36 85.5-80.5T857-500q-50-111-150-175.5T490-740q-42 0-86 8t-69 19l-46-47q35-16 89.5-28T485-800q143 0 261.5 81.5T920-500q-26 64-67 117t-95 93Zm58 226L648-229q-35 14-79 21.5t-89 7.5q-146 0-265-81.5T40-500q20-52 55.5-101.5T182-696L56-822l42-43 757 757-39 44ZM223-654q-37 27-71.5 71T102-500q51 111 153.5 175.5T488-260q33 0 65-4t48-12l-64-64q-11 5-27 7.5t-30 2.5q-70 0-120-49t-50-121q0-15 2.5-30t7.5-27l-97-97Zm305 142Zm-116 58Z\", \"fill\": \"currentColor\" }]);\nexport const CheckSymbolIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M378-246 154-470l43-43 181 181 384-384 43 43-427 427Z\", \"fill\": \"currentColor\" }]);\nexport const CloseSymbolIcon = icon(\"0 -960 960 960\", [{ \"d\": \"m249-207-42-42 231-231-231-231 42-42 231 231 231-231 42 42-231 231 231 231-42 42-231-231-231 231Z\", \"fill\": \"currentColor\" }]);\n/** Material Symbols \"mic\" — voice input. */\nexport const MicIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M408-453.92q-29-30.91-29-75.08v-251q0-41.67 29.44-70.83Q437.88-880 479.94-880t71.56 29.17Q581-821.67 581-780v251q0 44.17-29 75.08Q523-423 480-423t-72-30.92ZM480-651Zm-30 531v-136q-106-11-178-89t-72-184h60q0 91 64.29 153t155.5 62q91.21 0 155.71-62Q700-438 700-529h60q0 106-72 184t-178 89v136h-60Zm59.5-376.5Q521-510 521-529v-251q0-17-11.79-28.5T480-820q-17.42 0-29.21 11.5T439-780v251q0 19 11.5 32.5T480-483q18 0 29.5-13.5Z\", \"fill\": \"currentColor\" }]);\nexport const StopIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M240-240v-480h480v480H240Z\", \"fill\": \"currentColor\" }]);\nexport const ThumbUpIcon = icon(\"0 0 18 18\", [{ \"d\": \"M5.25039 15.7502V6.00019L10.5004 0.750193L11.8879 2.13769L10.9129 6.00019H17.2504V9.30019L14.5129 15.7502H5.25039ZM6.75039 14.2502H13.5004L15.7504 9.00019V7.50019H9.00039L10.0129 3.37519L6.75039 6.63769V14.2502ZM1.50039 15.7502V6.00019H5.25039V7.50019H3.00039V14.2502H5.25039V15.7502H1.50039Z\", \"fill\": \"currentColor\" }], true);\nexport const ThumbDownIcon = icon(\"0 0 18 18\", [{ \"d\": \"M2.24961 12C1.84961 12 1.49961 11.85 1.19961 11.55C0.899615 11.25 0.749615 10.9 0.749615 10.5V9C0.749615 8.9125 0.762115 8.81875 0.787115 8.71875C0.812115 8.61875 0.837115 8.525 0.862115 8.4375L3.11211 3.15C3.22461 2.9 3.41211 2.6875 3.67461 2.5125C3.93711 2.3375 4.21211 2.25 4.49961 2.25H12.7496V12L8.24961 16.4625C8.06211 16.65 7.84024 16.7594 7.58399 16.7906C7.32774 16.8219 7.08086 16.775 6.84336 16.65C6.60586 16.525 6.43086 16.35 6.31836 16.125C6.20586 15.9 6.18086 15.6688 6.24336 15.4313L7.08711 12H2.24961ZM11.2496 11.3625V3.75H4.49961L2.24961 9V10.5H8.99961L7.98711 14.625L11.2496 11.3625ZM14.9996 2.25C15.4121 2.25 15.7652 2.39688 16.059 2.69063C16.3527 2.98438 16.4996 3.3375 16.4996 3.75V10.5C16.4996 10.9125 16.3527 11.2656 16.059 11.5594C15.7652 11.8531 15.4121 12 14.9996 12H12.7496V10.5H14.9996V3.75H12.7496V2.25H14.9996Z\", \"fill\": \"currentColor\" }], true);\nexport const RefreshIcon = icon(\"0 0 18 18\", [{ \"d\": \"M8.99961 15.0002C7.32461 15.0002 5.90586 14.4189 4.74336 13.2564C3.58086 12.0939 2.99961 10.6752 2.99961 9.00019C2.99961 7.32519 3.58086 5.90644 4.74336 4.74394C5.90586 3.58144 7.32461 3.00019 8.99961 3.00019C9.86211 3.00019 10.6871 3.17832 11.4746 3.53457C12.2621 3.89082 12.9371 4.40019 13.4996 5.06269V3.00019H14.9996V8.25019H9.74961V6.75019H12.8996C12.4996 6.05019 11.9527 5.50019 11.259 5.10019C10.5652 4.70019 9.81211 4.50019 8.99961 4.50019C7.74961 4.50019 6.68711 4.93769 5.81211 5.81269C4.93711 6.68769 4.49961 7.75019 4.49961 9.00019C4.49961 10.2502 4.93711 11.3127 5.81211 12.1877C6.68711 13.0627 7.74961 13.5002 8.99961 13.5002C9.96211 13.5002 10.8309 13.2252 11.6059 12.6752C12.3809 12.1252 12.9246 11.4002 13.2371 10.5002H14.8121C14.4621 11.8252 13.7496 12.9064 12.6746 13.7439C11.5996 14.5814 10.3746 15.0002 8.99961 15.0002Z\", \"fill\": \"currentColor\" }], true);\nexport const MoreHorizIcon = icon(\"0 0 24 24\", [{ \"d\": \"M6.41473 14C5.86473 14 5.3939 13.8042 5.00223 13.4125C4.61056 13.0208 4.41473 12.55 4.41473 12C4.41473 11.45 4.61056 10.9792 5.00223 10.5875C5.3939 10.1958 5.86473 10 6.41473 10C6.96473 10 7.43556 10.1958 7.82723 10.5875C8.2189 10.9792 8.41473 11.45 8.41473 12C8.41473 12.55 8.2189 13.0208 7.82723 13.4125C7.43556 13.8042 6.96473 14 6.41473 14ZM12.4147 14C11.8647 14 11.3939 13.8042 11.0022 13.4125C10.6106 13.0208 10.4147 12.55 10.4147 12C10.4147 11.45 10.6106 10.9792 11.0022 10.5875C11.3939 10.1958 11.8647 10 12.4147 10C12.9647 10 13.4356 10.1958 13.8272 10.5875C14.2189 10.9792 14.4147 11.45 14.4147 12C14.4147 12.55 14.2189 13.0208 13.8272 13.4125C13.4356 13.8042 12.9647 14 12.4147 14ZM18.4147 14C17.8647 14 17.3939 13.8042 17.0022 13.4125C16.6106 13.0208 16.4147 12.55 16.4147 12C16.4147 11.45 16.6106 10.9792 17.0022 10.5875C17.3939 10.1958 17.8647 10 18.4147 10C18.9647 10 19.4356 10.1958 19.8272 10.5875C20.2189 10.9792 20.4147 11.45 20.4147 12C20.4147 12.55 20.2189 13.0208 19.8272 13.4125C19.4356 13.8042 18.9647 14 18.4147 14Z\", \"fill\": \"currentColor\" }], true);\nexport const InfoIcon = icon(\"0 0 22 22\", [{ \"d\": \"M10.0833 6.41667H11.9167V8.25H10.0833V6.41667ZM10.0833 10.0833H11.9167V15.5833H10.0833V10.0833ZM11 1.83333C5.94 1.83333 1.83333 5.94 1.83333 11C1.83333 16.06 5.94 20.1667 11 20.1667C16.06 20.1667 20.1667 16.06 20.1667 11C20.1667 5.94 16.06 1.83333 11 1.83333ZM11 18.3333C6.9575 18.3333 3.66667 15.0425 3.66667 11C3.66667 6.9575 6.9575 3.66667 11 3.66667C15.0425 3.66667 18.3333 6.9575 18.3333 11C18.3333 15.0425 15.0425 18.3333 11 18.3333Z\", \"fill\": \"currentColor\" }], true);\nexport const CloseIcon = icon(\"0 0 14 14\", [{ \"d\": \"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\", \"fill\": \"currentColor\" }], true);\nexport const CopyIcon = icon(\"0 0 8.60253 11.6462\", [{ \"d\": \"M1.01206 11.6462C0.733745 11.6462 0.495405 11.5323 0.29704 11.3044C0.0990134 11.0761 0 10.8019 0 10.4816V2.32924H1.01206V10.4816H6.57841V11.6462H1.01206ZM3.03619 9.31697C2.75787 9.31697 2.5197 9.20303 2.32167 8.97515C2.12331 8.74689 2.02413 8.47262 2.02413 8.15235V1.16462C2.02413 0.84435 2.12331 0.570082 2.32167 0.341816C2.5197 0.113939 2.75787 0 3.03619 0H7.59047C7.86879 0 8.10713 0.113939 8.30549 0.341816C8.50352 0.570082 8.60253 0.84435 8.60253 1.16462V8.15235C8.60253 8.47262 8.50352 8.74689 8.30549 8.97515C8.10713 9.20303 7.86879 9.31697 7.59047 9.31697H3.03619ZM3.03619 8.15235H7.59047V1.16462H3.03619V8.15235Z\", \"fill\": \"currentColor\" }], true);\nexport const CheckIcon = icon(\"0 0 18 18\", [{ \"d\": \"M7.1625 13.5L2.8875 9.225L3.95625 8.15625L7.1625 11.3625L14.0438 4.48125L15.1125 5.55L7.1625 13.5Z\", \"fill\": \"currentColor\" }], true);\nexport const PlayIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M320-200v-560l440 280-440 280Z\", \"fill\": \"currentColor\" }]);\nexport const ArrowForwardIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M686-450H160v-60h526L438-758l42-42 320 320-320 320-42-42 248-248Z\", \"fill\": \"currentColor\" }]);\nexport const RemoveIcon = icon(\"0 0 16 16\", [{ \"d\": \"M3.5 3.5l9 9m0-9-9 9\", \"stroke\": \"currentColor\", \"stroke-width\": \"3.5\", \"stroke-linecap\": \"round\" }], true);\nexport const VideoIcon = icon(\"0 0 24 24\", [{ \"tag\": \"rect\", \"x\": \"2.5\", \"y\": \"5\", \"width\": \"19\", \"height\": \"14\", \"rx\": \"2\", \"stroke\": \"currentColor\", \"stroke-width\": \"1.5\" }, { \"d\": \"M10 9.5v5l4.5-2.5-4.5-2.5Z\", \"fill\": \"currentColor\" }], true);\nexport const AudioIcon = icon(\"0 0 24 24\", [{ \"d\": \"M9 18V5l12-2v13M9 18a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm12-2a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\", \"stroke\": \"currentColor\", \"stroke-width\": \"1.5\", \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" }], true);\nexport const MixedMediaIcon = icon(\"0 0 24.1904 24.3948\", [{ \"d\": \"M2.90401 23.3661C3.05621 23.765 3.35538 24.0825 3.7464 24.2557C3.95634 24.3502 4.17678 24.3948 4.39985 24.3948C4.59404 24.3948 4.78561 24.3581 4.97194 24.2872L14.4167 20.6762C15.2407 20.3613 15.6554 19.4323 15.3405 18.6083L12.543 11.2918C12.3908 10.8929 12.0916 10.5753 11.7006 10.4021C11.3096 10.2289 10.8739 10.2158 10.4751 10.368L1.03027 13.9817C0.63138 14.1339 0.313842 14.433 0.14064 14.824C-0.0351869 15.2151 -0.045684 15.6507 0.106524 16.0496L2.90401 23.3661ZM0.859692 15.1442C0.948918 14.9448 1.109 14.7926 1.31107 14.7165L10.7559 11.1054C10.8503 11.0687 10.95 11.0503 11.0471 11.0503C11.16 11.0503 11.2728 11.074 11.3778 11.1212C11.5773 11.2104 11.7295 11.3705 11.8056 11.5752L13.9811 17.262L10.294 14.9474C9.92658 14.7165 9.48308 14.6718 9.07631 14.8293C8.66955 14.9841 8.37038 15.3122 8.24966 15.7294L7.76155 17.43L6.26308 16.4905C5.89568 16.2595 5.45218 16.2149 5.04542 16.3724C4.63865 16.5272 4.33949 16.8552 4.21877 17.2725L3.01685 21.4582L0.843947 15.7688C0.765218 15.5667 0.773091 15.3437 0.862317 15.1468L0.859692 15.1442ZM14.6057 18.8917C14.7657 19.3116 14.5558 19.7839 14.1359 19.944L4.69114 23.555C4.48907 23.6338 4.26601 23.6259 4.06919 23.5367C3.86974 23.4474 3.71753 23.2873 3.64143 23.0827L3.57845 22.9199L7.24194 21.5186L14.5453 18.7263L14.6083 18.8891L14.6057 18.8917ZM7.69594 20.503L9.00546 15.9446C9.05532 15.7662 9.18391 15.6271 9.35711 15.5615C9.42534 15.5352 9.4962 15.5221 9.56705 15.5221C9.67465 15.5221 9.78224 15.551 9.87672 15.6113L13.8945 18.1333L7.69857 20.503H7.69594ZM6.77482 20.8546L3.66505 22.0434L4.97456 17.4851C5.02442 17.3066 5.15301 17.1675 5.32622 17.1019C5.39445 17.0757 5.4653 17.0626 5.53616 17.0626C5.64375 17.0626 5.75135 17.0914 5.84582 17.1518L7.53586 18.212L6.77744 20.852L6.77482 20.8546Z\", \"fill\": \"currentColor\" }, { \"d\": \"M6.70667 15.8872C6.70667 15.8872 6.71716 15.8872 6.72241 15.8872C7.04782 15.882 7.34961 15.7534 7.57793 15.5198C7.80624 15.2863 7.92695 14.9819 7.92171 14.6565C7.91646 14.331 7.78787 14.0293 7.55431 13.8009C7.32075 13.5753 7.00846 13.4493 6.69092 13.4572C6.36551 13.4624 6.06372 13.591 5.8354 13.8246C5.60709 14.0581 5.48638 14.3625 5.49162 14.6879C5.49687 15.0134 5.62546 15.3152 5.85902 15.5435C6.08734 15.7665 6.38913 15.8872 6.70667 15.8872ZM6.70667 14.2444C6.81951 14.2444 6.92448 14.2864 7.00583 14.3652C7.08719 14.4439 7.13442 14.5515 7.13442 14.667C7.13442 14.7824 7.09243 14.89 7.01371 14.9714C6.93498 15.0527 6.82738 15.1 6.71191 15.1C6.5912 15.1 6.48885 15.058 6.4075 14.9792C6.32614 14.9005 6.27891 14.7929 6.27891 14.6775C6.27891 14.562 6.3209 14.4544 6.39962 14.373C6.47835 14.2917 6.58595 14.2444 6.70142 14.2444H6.70667Z\", \"fill\": \"currentColor\" }, { \"d\": \"M23.9034 19.6056C23.8981 19.5819 23.885 19.5636 23.8797 19.5399C23.8797 19.5137 23.8745 19.4901 23.8692 19.4638L22.7408 15.0026L22.2894 13.2181C22.2606 13.1052 22.1845 13.0107 22.0821 12.9609C21.9771 12.911 21.8564 12.9084 21.7515 12.953L16.6236 15.1994C16.4478 15.2755 16.3533 15.4697 16.4005 15.656L16.8519 17.4405C16.8519 17.4405 16.8572 17.451 16.8598 17.4589C16.8598 17.4668 16.8598 17.472 16.8624 17.4799L17.794 21.1644C17.4686 21.1565 17.1039 21.2562 16.7417 21.4662C15.8862 21.9569 15.3692 22.836 15.5372 23.5105C15.6106 23.8018 15.8048 24.0275 16.083 24.1456C16.23 24.2085 16.39 24.2374 16.5633 24.2374C16.8808 24.2374 17.2324 24.1351 17.5815 23.933C18.437 23.4422 18.954 22.5631 18.786 21.8887C18.7808 21.8651 18.7676 21.8467 18.7624 21.8231C18.7624 21.7968 18.7571 21.7732 18.7519 21.747L17.6969 17.5717L22.0926 15.6455L22.9114 18.8812C22.586 18.8734 22.2212 18.9731 21.859 19.183C21.0035 19.6738 20.4865 20.5529 20.6545 21.2274C20.728 21.5187 20.9222 21.7443 21.2004 21.8624C21.3473 21.9254 21.51 21.9543 21.6806 21.9543C21.9981 21.9543 22.3498 21.8519 22.6988 21.6499C23.5543 21.1591 24.0713 20.28 23.9007 19.6056H23.9034ZM21.5074 21.1355C21.4549 21.1145 21.4313 21.0856 21.4182 21.0332C21.3552 20.7812 21.6412 20.2144 22.2501 19.8654C22.4967 19.7236 22.7198 19.6685 22.8799 19.6685C22.9481 19.6685 23.0059 19.679 23.0505 19.6974C23.103 19.7184 23.1266 19.7473 23.1397 19.7997C23.2027 20.0517 22.9166 20.6185 22.3078 20.9676C21.9561 21.1696 21.6517 21.1985 21.5074 21.1355ZM17.5001 16.7976L17.2456 15.7872L21.6412 13.861L21.8958 14.8713L17.5001 16.7976ZM16.39 23.4186C16.3376 23.3976 16.3139 23.3688 16.3008 23.3163C16.2378 23.0644 16.5239 22.4975 17.1327 22.1485C17.3794 22.0068 17.6025 21.9517 17.7625 21.9517C17.8308 21.9517 17.8885 21.9622 17.9331 21.9805C17.9856 22.0015 18.0092 22.0304 18.0224 22.0829C18.0853 22.3348 17.7993 22.9016 17.1905 23.2507C16.8388 23.4527 16.5344 23.4816 16.39 23.4186Z\", \"fill\": \"currentColor\" }, { \"d\": \"M2.04571 7.49995C2.2504 7.54719 2.4551 7.57081 2.65192 7.57081C3.33686 7.57081 3.94831 7.30313 4.19237 6.85438C4.20549 6.83076 4.21074 6.80715 4.22124 6.78353C4.23436 6.76778 4.24748 6.75204 4.25798 6.73367L6.1737 3.23025L10.3489 4.6841L8.88721 7.35562C8.66677 7.15355 8.35973 6.99872 7.9897 6.91212C7.0817 6.70217 6.15796 6.98035 5.84042 7.55769C5.70133 7.80962 5.69083 8.09567 5.80893 8.36072C5.98475 8.75174 6.41251 9.0509 6.98723 9.18212C7.19192 9.22936 7.39662 9.25297 7.59344 9.25297C8.27837 9.25297 8.88983 8.9853 9.13389 8.53655C9.14701 8.51293 9.15226 8.48931 9.16276 8.46569C9.17588 8.44994 9.189 8.4342 9.1995 8.41583L11.2569 4.65261L12.081 3.14628C12.1361 3.04393 12.1439 2.92321 12.1019 2.81562C12.06 2.70802 11.9734 2.62404 11.8631 2.58468L6.94262 0.871025C6.76154 0.808042 6.55947 0.884146 6.46762 1.05472L5.6436 2.56106C5.6436 2.56106 5.63835 2.57156 5.63572 2.57681C5.6331 2.58206 5.62785 2.5873 5.62523 2.59255L3.94044 5.67083C3.72 5.46876 3.41296 5.31393 3.04294 5.22733C2.13494 5.01739 1.21119 5.29556 0.893651 5.8729C0.754565 6.12483 0.744067 6.41088 0.86216 6.67593C1.03799 7.06695 1.46574 7.36612 2.04046 7.49733L2.04571 7.49995ZM1.58909 6.2508C1.67306 6.09859 2.01422 5.94638 2.44722 5.94638C2.58106 5.94638 2.72277 5.96213 2.86973 5.99362C3.22926 6.0776 3.4497 6.24293 3.50743 6.37151C3.52843 6.41613 3.52056 6.445 3.50481 6.47649C3.39459 6.67593 2.84349 6.87538 2.22416 6.73367C1.86463 6.64969 1.6442 6.48436 1.58646 6.35577C1.56547 6.31116 1.57334 6.28229 1.58909 6.25342V6.2508ZM11.173 3.17777L10.7321 3.98342L6.55685 2.52957L6.99773 1.72392L11.173 3.17777ZM7.1683 8.41583C6.80878 8.33185 6.58834 8.16652 6.5306 8.03793C6.50961 7.99332 6.51748 7.96445 6.53323 7.93296C6.61721 7.78075 6.95836 7.62592 7.39137 7.62592C7.52521 7.62592 7.66692 7.64167 7.81388 7.67316C8.1734 7.75713 8.39384 7.92246 8.45158 8.05105C8.47257 8.09567 8.4647 8.12453 8.44895 8.15602C8.33873 8.35547 7.78501 8.55492 7.1683 8.41321V8.41583Z\", \"fill\": \"currentColor\" }, { \"d\": \"M13.0938 8.46027L18.1771 11.6671C18.4736 11.8535 18.8095 11.9506 19.1507 11.9506C19.2871 11.9506 19.4236 11.9348 19.5574 11.9059C20.0351 11.7983 20.4392 11.5097 20.7016 11.0977L23.9085 6.01444C24.4465 5.16155 24.1919 4.02786 23.3364 3.48988L18.2532 0.283009C17.8385 0.0232057 17.3504 -0.0633955 16.8728 0.0468243C16.3952 0.15442 15.991 0.443091 15.7286 0.855103L12.5217 5.93833C11.9838 6.79122 12.2383 7.92491 13.0938 8.46289V8.46027ZM17.046 0.813114C17.1221 0.794744 17.2008 0.786871 17.2769 0.786871C17.4711 0.786871 17.6627 0.841981 17.8307 0.946952L22.9139 4.15382C23.3994 4.46086 23.5463 5.10644 23.2393 5.59193L20.0324 10.6752C19.8828 10.9113 19.6519 11.074 19.3816 11.1344C19.1087 11.1974 18.8305 11.1475 18.5943 11.0006L13.5111 7.7937C13.0256 7.48666 12.8786 6.84108 13.1857 6.35559L16.3926 1.27236C16.5421 1.03618 16.7731 0.873472 17.0434 0.813114H17.046Z\", \"fill\": \"currentColor\" }, { \"d\": \"M16.4532 7.53394L19.353 7.78587C19.3845 7.78587 19.4133 7.78849 19.4448 7.78849C19.7991 7.78849 20.1298 7.60742 20.324 7.303C20.5313 6.97234 20.5392 6.5577 20.3397 6.2218L18.8649 3.71299C18.6785 3.39807 18.3505 3.2065 17.9857 3.20125C17.6262 3.196 17.2851 3.37708 17.0909 3.68674L15.6659 5.94625C15.4717 6.25591 15.4507 6.63643 15.6134 6.96447C15.7761 7.2925 16.091 7.50769 16.4558 7.53919L16.4532 7.53394ZM17.7548 4.104C17.8204 3.99903 17.9228 3.98591 17.9674 3.98591H17.97C18.012 3.98591 18.1196 3.99903 18.1826 4.10925L19.6574 6.61806C19.7283 6.73878 19.6784 6.84113 19.6522 6.88049C19.6285 6.91986 19.5524 7.00908 19.416 6.99596L16.5161 6.74403C16.3875 6.73353 16.3298 6.64431 16.3114 6.60494C16.2931 6.56558 16.2563 6.46586 16.3246 6.35826L17.7496 4.09876L17.7548 4.104Z\", \"fill\": \"currentColor\" }], true);\nexport const PlusIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z\", \"fill\": \"currentColor\" }]);\nexport const RetryIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z\", \"fill\": \"currentColor\" }]);\nexport const ErrorIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M503.5-289.48q9.5-9.48 9.5-23.5t-9.48-23.52q-9.48-9.5-23.5-9.5t-23.52 9.48q-9.5 9.48-9.5 23.5t9.48 23.52q9.48 9.5 23.5 9.5t23.52-9.48ZM453-433h60v-253h-60v253Zm27.27 353q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm.23-60Q622-140 721-239.5t99-241Q820-622 721.19-721T480-820q-141 0-240.5 98.81T140-480q0 141 99.5 240.5t241 99.5Zm-.5-340Z\", \"fill\": \"currentColor\" }]);\nexport const OptimizeIcon = icon(\"0 0 25 24\", [{ \"d\": \"M5 19H6.425L16.2 9.225L14.775 7.8L5 17.575V19ZM3 21V16.75L16.2 3.575C16.4 3.39167 16.6208 3.25 16.8625 3.15C17.1042 3.05 17.3583 3 17.625 3C17.8917 3 18.15 3.05 18.4 3.15C18.65 3.25 18.8667 3.4 19.05 3.6L20.425 5C20.625 5.18333 20.7708 5.4 20.8625 5.65C20.9542 5.9 21 6.15 21 6.4C21 6.66667 20.9542 6.92083 20.8625 7.1625C20.7708 7.40417 20.625 7.625 20.425 7.825L7.25 21H3ZM15.475 8.525L14.775 7.8L16.2 9.225L15.475 8.525Z\", \"fill\": \"currentColor\" }, { \"d\": \"M20 12L21.5918 15.4082L25 17L21.5918 18.5918L20 22L18.4082 18.5918L15 17L18.4082 15.4082L20 12Z\", \"fill\": \"currentColor\" }, { \"d\": \"M6 3L7.27345 5.72655L10 7L7.27345 8.27345L6 11L4.72655 8.27345L2 7L4.72655 5.72655L6 3Z\", \"fill\": \"currentColor\" }], true);\nexport const UndoIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M259-200v-60h310q70 0 120.5-46.5T740-422q0-69-50.5-115.5T569-584H274l114 114-42 42-186-186 186-186 42 42-114 114h294q95 0 163.5 64T800-422q0 94-68.5 158T568-200H259Z\", \"fill\": \"currentColor\" }]);\nexport const AttachFileIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M728-326q0 103-72.18 174.5-72.17 71.5-175 71.5Q378-80 305.5-151.5T233-326v-380q0-72.5 51.5-123.25T408-880q72 0 123.5 50.75T583-706v360q0 42-30 72t-72.5 30q-42.5 0-72.5-29.67-30-29.68-30-72.33v-370h60v370q0 17 12.5 29.5t30.64 12.5q18.14 0 30-12.5T523-346v-360q0-48-33.5-81t-81.71-33q-48.21 0-81.5 33.06T293-706v380q0 78 54.97 132T481-140q77.92 0 132.46-54Q668-248 668-326v-390h60v390Z\", \"fill\": \"currentColor\" }]);\nexport const ImageIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h600q24 0 42 18t18 42v600q0 24-18 42t-42 18H180Zm0-60h600v-600H180v600Zm56-97h489L578-473 446-302l-93-127-117 152Zm-56 97v-600 600Z\", \"fill\": \"currentColor\" }]);\n/** Material Symbols \"globe\" — Create world. */\nexport const GlobeIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M480.27-80q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm-.27-60q142.38 0 241.19-99.5T820-480v-13q-6 26-27.41 43.5Q771.19-432 742-432h-80q-33 0-56.5-23.5T582-512v-40H422v-80q0-33 23.5-56.5T502-712h40v-22q0-16 13.5-40t30.5-29q-25-8-51.36-12.5Q508.29-820 480-820q-141 0-240.5 98.81T140-480h150q66 0 113 47t47 113v40H330v105q34 17 71.7 26t78.3 9Z\", \"fill\": \"currentColor\" }]);\nexport const VideocamIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M140-160q-24 0-42-18t-18-42v-520q0-24 18-42t42-18h520q24 0 42 18t18 42v215l160-160v410L720-435v215q0 24-18 42t-42 18H140Zm0-60h520v-520H140v520Zm0 0v-520 520Z\", \"fill\": \"currentColor\" }]);\nexport const ContentCutIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M782-114 481-415 364-298q11 17 13.5 33t2.5 35q0 64-43 107T230-80q-64 0-107-43T80-230q0-64 43-107t107-43q18 0 35.5 5t36.5 15l116-116-118-118q-17 8-34.5 11t-35.5 3q-64 0-107-43T80-730q0-64 43-107t107-43q64 0 107 43t43 107q0 19-2.5 36T367-662l514 514v34h-99ZM599-527l-66-66 249-249h99v33L599-527ZM294-666q26-26 26-64t-26-64q-26-26-64-26t-64 26q-26 26-26 64t26 64q26 26 64 26t64-26Zm202.5 203.5Q502-468 502-476t-5.5-13.5Q491-495 483-495t-13.5 5.5Q464-484 464-476t5.5 13.5Q475-457 483-457t13.5-5.5ZM294-166q26-26 26-64t-26-64q-26-26-64-26t-64 26q-26 26-26 64t26 64q26 26 64 26t64-26Z\", \"fill\": \"currentColor\" }]);\nexport const VolumeUpIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M560-131v-62q97-28 158.5-107.5T780-481q0-101-61-181T560-769v-62q124 28 202 125.5T840-481q0 127-78 224.5T560-131ZM120-360v-240h160l200-200v640L280-360H120Zm420 48v-337q55 17 87.5 64T660-480q0 57-33 104t-87 64ZM420-648 307-540H180v120h127l113 109v-337Zm-94 168Z\", \"fill\": \"currentColor\" }]);\nexport const MusicNoteIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M286.5-163.5Q243-207 243-270t43.5-106.5Q330-420 393-420q28 0 50.5 8t39.5 22v-450h234v135H543v435q0 63-43.5 106.5T393-120q-63 0-106.5-43.5Z\", \"fill\": \"currentColor\" }]);\n","<script setup lang=\"ts\">\n/** The \"+\" / \"×\" attach control: a positioned popover of the use-case actions, and the hidden file picker behind \"Add media\". */\nimport { nextTick, ref, watch, type Component } from \"vue\";\nimport { menuOpensAbove, type ComposerAttachMenuAction, type composerAttachMenuItems, type MenuPlacement } from \"@chai-ui/core\";\nimport { useDismiss } from \"../dismiss.js\";\nimport { AttachFileIcon, CloseSymbolIcon, ContentCutIcon, ImageIcon, MusicNoteIcon, PlusIcon, GlobeIcon, VideocamIcon, VolumeUpIcon } from \"../icons.js\";\n\nconst props = defineProps<{\n items: ReturnType<typeof composerAttachMenuItems>;\n /** Edit mode: one image file at a time. */\n imagesOnly?: boolean;\n disabled?: boolean;\n placement: MenuPlacement;\n}>();\nconst emit = defineEmits<{ select: [action: ComposerAttachMenuAction]; files: [files: FileList | null] }>();\n\nconst ICONS: Record<ComposerAttachMenuAction, Component> = {\n \"add-media\": AttachFileIcon,\n \"create-image\": ImageIcon,\n \"create-video\": VideocamIcon,\n \"create-world\": GlobeIcon,\n \"edit-image\": ContentCutIcon,\n \"create-speech\": VolumeUpIcon,\n \"create-music\": MusicNoteIcon,\n};\nconst open = ref(false);\nconst above = ref(false);\nconst root = ref<HTMLElement>();\nconst menu = ref<HTMLElement>();\nconst input = ref<HTMLInputElement>();\nuseDismiss(root, open, () => (open.value = false));\n\n// Up or down, before the first paint, so it never flashes on the wrong side.\nwatch(open, async (isOpen) => {\n if (!isOpen) return;\n await nextTick();\n above.value = menuOpensAbove(props.placement, root.value!.getBoundingClientRect(), menu.value!.offsetHeight, document.documentElement.clientHeight);\n});\n\nfunction pick(action: ComposerAttachMenuAction) {\n open.value = false;\n if (action === \"add-media\") input.value?.click();\n emit(\"select\", action);\n}\n\nfunction onFileChange(e: Event) {\n const el = e.target as HTMLInputElement;\n emit(\"files\", el.files);\n el.value = \"\";\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"chai-composer__attach\">\n <button\n type=\"button\"\n :class=\"['chai-composer__attach-toggle', { 'chai-composer__attach-toggle--open': open }]\"\n :disabled=\"disabled\"\n :aria-expanded=\"open\"\n aria-haspopup=\"menu\"\n :aria-label=\"open ? 'Close attach menu' : 'Add media'\"\n @click=\"open = !open\"\n >\n <CloseSymbolIcon v-if=\"open\" /><PlusIcon v-else />\n </button>\n <ul v-if=\"open\" ref=\"menu\" :class=\"['chai-composer__attach-menu', { 'chai-composer__attach-menu--above': above }]\" role=\"menu\">\n <li v-for=\"(item, i) in items\" :key=\"item.action\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" class=\"chai-composer__attach-menu-item\" @click=\"pick(item.action)\">\n <span class=\"chai-composer__attach-menu-icon\"><component :is=\"ICONS[item.action]\" /></span>{{ item.label }}\n </button>\n <hr v-if=\"item.divider && i < items.length - 1\" class=\"chai-composer__attach-menu-divider\" role=\"separator\" />\n </li>\n </ul>\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"imagesOnly ? 'image/*' : 'image/*,video/*,audio/*'\"\n :multiple=\"!imagesOnly\"\n hidden\n :disabled=\"disabled\"\n @change=\"onFileChange\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A use-case or region chip: its label, and a remove button revealed on\n * hover when it can be removed. A region chip shows its numbered badge in\n * the region's color, matching the box on the image.\n */\nimport { regionColor } from \"@chai-ui/core\";\nimport { CloseSymbolIcon } from \"../icons.js\";\n\ndefineProps<{ label: string; regionNumber?: number; removable?: boolean; disabled?: boolean }>();\nconst emit = defineEmits<{ remove: [] }>();\n</script>\n\n<template>\n <span\n :class=\"['chai-composer__chip', { 'chai-composer__chip--region': regionNumber != null }]\"\n :style=\"regionNumber != null ? { '--chai-region-color': regionColor(regionNumber) } : undefined\"\n >\n <!-- Label and button touch: whitespace between them would render as a space. -->\n <span v-if=\"regionNumber != null\" class=\"chai-composer__region-badge\" aria-hidden=\"true\">{{ regionNumber }}</span\n >{{ label }}<button\n v-if=\"removable\" type=\"button\" class=\"chai-composer__chip-remove\" :disabled=\"disabled\" :aria-label=\"`Remove ${label}`\" @click=\"emit('remove')\">\n <CloseSymbolIcon />\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * One prompt textarea with its Enhance button: grows with wrapped text,\n * reveals a rewrite as it lands, and offers undo until the text is edited by\n * hand. A `heading` gives it a visible label above a filled box (a world's\n * Environment and Character); without one it's the bar's plain prompt.\n */\nimport { computed, onScopeDispose, ref, useId, watch } from \"vue\";\nimport { enhanceRevealDurationMs, MAX_ANIMATE_ENHANCE_LENGTH } from \"@chai-ui/core\";\nimport { OptimizeIcon, UndoIcon } from \"../icons.js\";\n\nconst props = defineProps<{\n value: string;\n placeholder: string;\n /** Accessible name for the plain prompt. Defaults to `placeholder`. */\n label?: string;\n heading?: string;\n note?: string;\n /** Shown under a headed field, e.g. why submit can't go yet. */\n hint?: string | null;\n onEnhance?: (value: string) => void;\n enhancing: boolean;\n disabled: boolean;\n}>();\nconst emit = defineEmits<{ change: [value: string] }>();\nconst id = useId();\n\n// Grows with wrapped text from one line, instead of a fixed row count.\nconst textarea = ref<HTMLTextAreaElement>();\nwatch(\n () => props.value,\n () => {\n const el = textarea.value;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n },\n { flush: \"post\", immediate: true }\n);\n\n// Enhance and undo. The prompt already holds the rewrite once `enhancing`\n// drops; the reveal is a decorative overlay painting it in, then gone.\nconst originalValue = ref<string | null>(null);\nconst enhancedValue = ref<string | null>(null);\nconst animatingText = ref<string | null>(null);\nconst revealedLength = ref(0);\nlet raf = 0;\n\nwatch(\n () => props.enhancing,\n (now, was) => {\n if (!was || now || originalValue.value == null || props.value === originalValue.value) return;\n const value = props.value;\n enhancedValue.value = value;\n // Long rewrites and reduced-motion requests appear at once.\n if (value.length > MAX_ANIMATE_ENHANCE_LENGTH || window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches) return;\n animatingText.value = value;\n revealedLength.value = 0;\n const duration = enhanceRevealDurationMs(value.length);\n const start = performance.now();\n const tick = (time: number) => {\n revealedLength.value = Math.min(value.length, Math.floor(((time - start) / duration) * value.length));\n if (revealedLength.value < value.length) raf = requestAnimationFrame(tick);\n else animatingText.value = null;\n };\n raf = requestAnimationFrame(tick);\n }\n);\nonScopeDispose(() => cancelAnimationFrame(raf));\n\nconst animating = computed(() => animatingText.value != null);\nconst isEnhanced = computed(() => !animating.value && enhancedValue.value != null && props.value === enhancedValue.value);\nconst enhanceBusy = computed(() => props.enhancing || animating.value);\nconst optimizeName = computed(\n () => `${isEnhanced.value ? \"Revert to original\" : \"Optimize\"} ${props.heading ? props.heading.toLowerCase() : \"prompt\"}`\n);\n\nfunction onOptimizeClick() {\n if (isEnhanced.value) {\n const original = originalValue.value;\n enhancedValue.value = null;\n originalValue.value = null;\n if (original != null) emit(\"change\", original);\n return;\n }\n originalValue.value = props.value; // for undo, before the rewrite lands\n props.onEnhance?.(props.value);\n}\n</script>\n\n<template>\n <!-- A world's labeled field: heading and Enhance above a filled box. -->\n <div v-if=\"heading\" class=\"chai-composer__world-field\">\n <div class=\"chai-composer__world-field-head\">\n <label :for=\"id\" class=\"chai-composer__world-field-label\"><strong>{{ heading }}</strong> {{ note }}</label>\n <!-- Optimize, or once a rewrite lands, undo it: until the text is edited by hand. -->\n <button\n v-if=\"onEnhance\"\n type=\"button\"\n :class=\"['chai-composer__optimize', { 'chai-composer__optimize--active': enhanceBusy }]\"\n :disabled=\"disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)\"\n :aria-label=\"optimizeName\"\n :title=\"optimizeName\"\n @click=\"onOptimizeClick\"\n >\n <UndoIcon v-if=\"isEnhanced\" /><OptimizeIcon v-else />\n </button>\n </div>\n <div class=\"chai-composer__field chai-composer__field--boxed\">\n <textarea\n :id=\"id\"\n ref=\"textarea\"\n :class=\"['chai-composer__input chai-composer__type', { 'chai-composer__input--revealing': animating }]\"\n :value=\"value\"\n :placeholder=\"placeholder\"\n :aria-describedby=\"hint ? `${id}-hint` : undefined\"\n rows=\"1\"\n :disabled=\"disabled || animating\"\n @input=\"emit('change', ($event.target as HTMLTextAreaElement).value)\"\n />\n <div v-if=\"animating\" class=\"chai-composer__reveal chai-composer__type\" aria-hidden=\"true\">\n <span class=\"chai-composer__reveal-text\">{{ animatingText!.slice(0, revealedLength) }}</span>\n </div>\n </div>\n <p v-if=\"hint\" :id=\"`${id}-hint`\" class=\"chai-composer__field-hint\">{{ hint }}</p>\n </div>\n\n <div v-else class=\"chai-composer__field\">\n <textarea\n :id=\"id\"\n ref=\"textarea\"\n :class=\"['chai-composer__input chai-composer__type', { 'chai-composer__input--revealing': animating }]\"\n :value=\"value\"\n :placeholder=\"placeholder\"\n :aria-label=\"label ?? placeholder\"\n rows=\"1\"\n :disabled=\"disabled || animating\"\n @input=\"emit('change', ($event.target as HTMLTextAreaElement).value)\"\n />\n <!-- The Enhance reveal: decorative, so hidden from screen readers, which read the textarea's final text. -->\n <div v-if=\"animating\" class=\"chai-composer__reveal chai-composer__type\" aria-hidden=\"true\">\n <span class=\"chai-composer__reveal-text\">{{ animatingText!.slice(0, revealedLength) }}</span>\n </div>\n <!-- Optimize, or once a rewrite lands, undo it: until the prompt is edited by hand. -->\n <button\n v-if=\"onEnhance\"\n type=\"button\"\n :class=\"['chai-composer__optimize', { 'chai-composer__optimize--active': enhanceBusy }]\"\n :disabled=\"disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)\"\n :aria-label=\"optimizeName\"\n :title=\"optimizeName\"\n @click=\"onOptimizeClick\"\n >\n <UndoIcon v-if=\"isEnhanced\" /><OptimizeIcon v-else />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** The mic: click to record; while recording, a stop button that transcribes; while transcribing, a spinner that cancels. */\nimport { computed } from \"vue\";\nimport type { VoiceInput, VoiceInputState } from \"@chai-ui/core\";\nimport { MicIcon, StopIcon } from \"../icons.js\";\n\nconst props = defineProps<{ voice: VoiceInput; state: VoiceInputState; disabled?: boolean }>();\n\nconst label = computed(() =>\n props.state.status === \"recording\"\n ? \"Stop recording and transcribe\"\n : props.state.status === \"transcribing\"\n ? \"Cancel transcription\"\n : \"Start voice input\"\n);\n\nfunction onClick() {\n const { status } = props.state;\n if (status === \"recording\") props.voice.stop();\n else if (status === \"transcribing\") props.voice.cancel();\n else {\n props.voice.dismiss();\n void props.voice.start();\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && props.state.status === \"recording\") props.voice.cancel();\n}\n</script>\n\n<template>\n <div class=\"chai-composer__voice\" :data-status=\"state.status\">\n <button\n type=\"button\"\n class=\"chai-composer__voice-button\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :title=\"label\"\n @click=\"onClick\"\n @keydown=\"onKeydown\"\n >\n <span v-if=\"state.status === 'transcribing'\" class=\"chai-composer__voice-spinner\" aria-hidden=\"true\" /><StopIcon\n v-else-if=\"state.status === 'recording'\"\n /><MicIcon v-else />\n </button>\n <!-- Announces each change of state once, not every tick of the timer. -->\n <span class=\"chai-visually-hidden\" role=\"status\">{{ state.status === \"recording\" ? \"Recording\" : state.status === \"transcribing\" ? \"Transcribing\" : \"\" }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** What replaces the prompt while recording: recent mic loudness as bars, newest on the right, and the time. Decorative. */\nimport { computed } from \"vue\";\nimport { formatVoiceElapsed, VOICE_LEVEL_COUNT } from \"@chai-ui/core\";\n\nconst props = defineProps<{ levels: number[]; elapsedMs: number }>();\nconst bars = computed(() => [...Array<number>(Math.max(0, VOICE_LEVEL_COUNT - props.levels.length)).fill(0), ...props.levels]);\n</script>\n\n<template>\n <div class=\"chai-composer__waveform\" aria-hidden=\"true\">\n <div class=\"chai-composer__waveform-bars\">\n <span v-for=\"(level, i) in bars\" :key=\"i\" class=\"chai-composer__waveform-bar\" :style=\"{ height: `${Math.max(20, level * 100)}%` }\" />\n </div>\n <span class=\"chai-composer__waveform-time\">{{ formatVoiceElapsed(elapsedMs) }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** MD3 `<md-switch>`, colored from Chai tokens by `chai-switch` in style.css. Use with `v-model`. */\nimport \"@material/web/switch/switch.js\";\n\ndefineProps<{\n modelValue: boolean;\n disabled?: boolean;\n /** The switch's accessible name, e.g. \"Auto-select model\". Required unless something else labels it. */\n ariaLabel?: string;\n}>();\nconst emit = defineEmits<{ \"update:modelValue\": [value: boolean] }>();\n</script>\n\n<template>\n <md-switch\n class=\"chai-switch\"\n :aria-label=\"ariaLabel\"\n :selected.prop=\"modelValue\"\n :disabled.prop=\"disabled ?? false\"\n show-only-selected-icon\n @change=\"emit('update:modelValue', ($event.target as HTMLInputElement & { selected: boolean }).selected)\"\n />\n</template>\n","<script setup lang=\"ts\" generic=\"T extends SearchMenuOption\">\n/**\n * The searchable menu-button pattern behind every Model/option menu: a\n * trigger opening an anchored panel with a search field (a real\n * `<md-outlined-text-field>`) over a plain option list. Hand-rolled rather\n * than `<md-menu>`, so the panel sits inline under its trigger.\n */\nimport \"@material/web/checkbox/checkbox.js\";\nimport \"@material/web/textfield/outlined-text-field.js\";\nimport { computed, nextTick, ref, watch } from \"vue\";\nimport { useDismiss } from \"../dismiss.js\";\nimport { CheckIcon } from \"../icons.js\";\nimport { menuOpensAbove, type MenuPlacement } from \"@chai-ui/core\";\nimport Toggle from \"./Toggle.vue\";\nimport type { SearchMenuOption, SearchMenuSection, SearchMenuToggleHeader } from \"./search-menu.js\";\n\nconst props = withDefaults(\n defineProps<{\n /** A flat option list. Ignored if `sections` is given. */\n options?: T[];\n /** Grouped options, each under its own header with a divider between groups. */\n sections?: SearchMenuSection<T>[];\n /** A toggle pinned above the options (e.g. \"Auto-select model\"); while on, the rows are disabled but keep their check. */\n toggleHeader?: SearchMenuToggleHeader;\n /** The checked option's id, or ids with `multiple`. */\n value: string | string[] | null;\n /** Several options can be checked: each row gets a checkbox and the panel stays open on a pick. */\n multiple?: boolean;\n triggerLabel: string;\n /** Floating label on the search field, and the panel's accessible name. */\n menuLabel: string;\n disabled?: boolean;\n /** Show the search field. Off for a short fixed list. */\n searchable?: boolean;\n /** \"outlined\" matches `.chai-btn--outlined`; \"text\" is chevron and label only. */\n triggerVariant?: \"outlined\" | \"text\";\n /** Panel width in px; longer labels ellipsize. */\n panelWidth?: number;\n /** Which way the panel opens: \"auto\" (default) below when it fits, else above when that fits, else toward the side with more room. */\n placement?: MenuPlacement;\n }>(),\n { searchable: true, triggerVariant: \"outlined\", panelWidth: 280, placement: \"auto\" }\n);\nconst emit = defineEmits<{ select: [option: T] }>();\n\nconst open = ref(false);\nconst above = ref(false);\nconst search = ref(\"\");\nconst root = ref<HTMLElement>();\nconst panel = ref<HTMLElement>();\n\n// Closing also clears the search, so the menu reopens on the full list.\nfunction close() {\n open.value = false;\n search.value = \"\";\n}\n\n// The panel opens from the trigger's left edge; near the right edge of a\n// narrow screen it shifts left to fit, keeping a 16px margin on both sides.\nwatch(open, async (isOpen) => {\n if (!isOpen) return;\n await nextTick();\n const el = panel.value!;\n const rect = el.getBoundingClientRect();\n const over = rect.right - (document.documentElement.clientWidth - 16);\n if (over > 0) el.style.left = `${-Math.min(over, Math.max(0, rect.left - 16))}px`;\n // Up or down, before the first paint, so it never flashes on the wrong side.\n above.value = menuOpensAbove(props.placement, root.value!.getBoundingClientRect(), el.offsetHeight, document.documentElement.clientHeight);\n});\n\nuseDismiss(root, open, close);\n\nconst groups = computed(() => {\n const q = search.value.trim().toLowerCase();\n const raw = props.sections ?? [{ label: \"\", options: props.options ?? [] }];\n if (!q) return raw;\n return raw\n .map((g) => ({ ...g, options: g.options.filter((o) => o.label.toLowerCase().includes(q) || o.rowLabel?.toLowerCase().includes(q)) }))\n .filter((g) => g.options.length > 0);\n});\nconst hasAnyOption = computed(() => groups.value.some((g) => g.options.length > 0));\nconst isSelected = (id: string) => (Array.isArray(props.value) ? props.value.includes(id) : id === props.value);\n\nfunction pick(option: T) {\n emit(\"select\", option);\n if (!props.multiple) close();\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"chai-search-menu\">\n <button\n type=\"button\"\n :class=\"[\n triggerVariant === 'outlined' ? 'chai-btn chai-btn--outlined' : 'chai-search-menu__trigger--text',\n 'chai-search-menu__trigger',\n { 'chai-search-menu__trigger--open': open },\n ]\"\n :disabled=\"disabled\"\n :aria-expanded=\"open\"\n @click=\"open ? close() : (open = true)\"\n >\n <span class=\"chai-search-menu__trigger-label\" :title=\"triggerLabel\">{{ triggerLabel }}</span>\n <!-- Material Symbols \"keyboard_arrow_down\". -->\n <svg :class=\"['chai-search-menu__chevron', { 'chai-search-menu__chevron--open': open }]\" viewBox=\"0 -960 960 960\" aria-hidden=\"true\">\n <path d=\"M480-344 240-584l43-43 197 197 197-197 43 43-240 240Z\" fill=\"currentColor\" />\n </svg>\n </button>\n\n <div v-if=\"open\" ref=\"panel\" class=\"chai-search-menu__panel\" :class=\"{ 'chai-search-menu__panel--above': above }\" role=\"group\" :aria-label=\"menuLabel\" :style=\"{ width: `${panelWidth}px` }\">\n <div v-if=\"toggleHeader\" class=\"chai-search-menu__toggle-header\">\n <span class=\"chai-search-menu__toggle-header-label\">{{ menuLabel }}</span>\n <span class=\"chai-search-menu__toggle-header-row\">\n <span class=\"chai-search-menu__toggle-header-text\">{{ toggleHeader.label }}</span>\n <Toggle :model-value=\"toggleHeader.value\" :aria-label=\"toggleHeader.label\" @update:model-value=\"toggleHeader.onChange\" />\n </span>\n </div>\n <md-outlined-text-field\n v-if=\"searchable\"\n class=\"chai-search-menu__search\"\n :label=\"menuLabel\"\n placeholder=\"Search\"\n :value.prop=\"search\"\n @input=\"search = ($event.target as HTMLInputElement).value\"\n >\n <span slot=\"leading-icon\" class=\"chai-search-menu__search-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"m20 20-3.6-3.6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </span>\n <button v-if=\"search\" type=\"button\" slot=\"trailing-icon\" class=\"chai-search-menu__clear\" aria-label=\"Clear search\" @click=\"search = ''\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"m9 9 6 6m0-6-6 6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n </md-outlined-text-field>\n\n <ul class=\"chai-search-menu__list\">\n <li v-for=\"(group, i) in groups\" :key=\"group.label || i\">\n <p v-if=\"group.label\" class=\"chai-search-menu__section-label\">{{ group.label }}</p>\n <ul class=\"chai-search-menu__section-list\" :aria-label=\"group.label || undefined\">\n <li v-for=\"o in group.options\" :key=\"o.id\">\n <!-- Plain buttons, reached with Tab: `aria-pressed` says which are picked. -->\n <button\n type=\"button\"\n :aria-pressed=\"isSelected(o.id)\"\n :disabled=\"toggleHeader?.value\"\n :class=\"['chai-search-menu__option', { 'chai-search-menu__option--selected': !multiple && isSelected(o.id) }]\"\n @click=\"pick(o)\"\n >\n <!-- Display only: the row is the one control, so the checkbox is hidden from assistive tech and the tab order. -->\n <md-checkbox\n v-if=\"multiple\"\n class=\"chai-search-menu__checkbox\"\n :checked.prop=\"isSelected(o.id)\"\n :disabled.prop=\"toggleHeader?.value ?? false\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n />\n <span class=\"chai-search-menu__option-label\">{{ o.rowLabel ?? o.label }}</span>\n <CheckIcon v-if=\"!multiple && isSelected(o.id)\" />\n </button>\n </li>\n </ul>\n <hr v-if=\"i < groups.length - 1\" class=\"chai-search-menu__divider\" role=\"separator\" />\n </li>\n <li v-if=\"!hasAnyOption\" class=\"chai-search-menu__empty\">No matches.</li>\n </ul>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The compose bar for generative AI input: prompt field, attachments, use\n * case, model and aspect-ratio menus, Enhance, and submit, all driven by\n * which props are given. Same props as React's `Composer`, with `v-model`\n * for the prompt and `v-model:…` for attachments, use cases, models, aspect\n * ratio, auto-select and regions.\n *\n * Some controls show only with somewhere for them to go, so these listeners\n * are props, checked for: `@update:attachments` (add and remove media),\n * `@update:model-id` / `@update:model-ids` (the Model menu),\n * `voiceInput` (the mic), `@update:aspect-ratio`, `@update:character` and `@update:frame-rate` (a\n * world's fields), `@update:use-cases` and `@clear-use-case` (chip\n * remove), `@update:regions`, `@enhance` (the Enhance button), `@abort` (stop\n * while submitting) and `@attach-menu-select` (the + menu's use cases).\n */\nimport \"@material/web/fab/fab.js\";\nimport { computed, onScopeDispose, ref, shallowRef, watch } from \"vue\";\nimport {\n composerAttachmentsFromFiles,\n composerAttachMenuItems,\n composerView,\n createVoiceInput,\n type ComposerAttachment,\n type ComposerAttachMenuAction,\n type ComposerPromptField,\n type GenerationUseCase,\n type ComposerSubmitPayload,\n type ComposerUseCase,\n type EditRegion,\n type MediaKind,\n type MenuPlacement,\n type ModelOption,\n type OutputKind,\n type ParameterOption,\n type VoiceInputConfig,\n} from \"@chai-ui/core\";\nimport AttachMenu from \"./composer/AttachMenu.vue\";\nimport Chip from \"./composer/Chip.vue\";\nimport PromptField from \"./composer/PromptField.vue\";\nimport VoiceButton from \"./composer/VoiceButton.vue\";\nimport VoiceWaveform from \"./composer/VoiceWaveform.vue\";\nimport { ArrowForwardIcon, CloseSymbolIcon, ErrorIcon, ImageIcon, MusicNoteIcon, RetryIcon, StopIcon, VideocamIcon } from \"./icons.js\";\nimport SearchMenu from \"./primitives/SearchMenu.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** The prompt text. Controlled: use `v-model`. */\n modelValue: string;\n /** Defaults to \"Describe media to create\", or edit wording when the use case is an edit. */\n placeholder?: string;\n /** The prompt field's accessible name. Defaults to `placeholder`, which disappears once the person types. */\n promptLabel?: string;\n attachments?: ComposerAttachment[];\n \"onUpdate:attachments\"?: (next: ComposerAttachment[]) => void;\n /** The use-case chip. Aspect ratio only renders for an image or video use case. */\n useCase?: ComposerUseCase | null;\n onClearUseCase?: () => void;\n /** What a submit means with no use case picked. Defaults to `TEXT_USE_CASE`. Never shown as a chip. */\n defaultUseCase?: ComposerUseCase;\n /** Several use cases at once, at most one per kind, with `useCases` and `modelsByKind`. */\n multiSelectUseCases?: boolean;\n useCases?: ComposerUseCase[];\n \"onUpdate:useCases\"?: (next: ComposerUseCase[]) => void;\n /** Models per use-case kind, for `multiSelectUseCases`. A kind left out gets Chai's suggested models. */\n modelsByKind?: Partial<Record<OutputKind, ModelOption[]>>;\n /** The end user can pick several models, each producing its own result, with `modelIds`. */\n multiSelectModels?: boolean;\n modelIds?: string[];\n \"onUpdate:modelIds\"?: (ids: string[]) => void;\n /** Models for the use case. Leave out for Chai's suggested Fal models; `[]` for no Model menu. */\n models?: ModelOption[];\n modelId?: string | null;\n \"onUpdate:modelId\"?: (id: string | null) => void;\n /** The model is chosen at submit: `useComposer` asks the reasoning model. Turning it on clears the pick. */\n autoSelectModel?: boolean;\n /** An \"Auto-select model\" switch at the top of the Model menu, for the end user. */\n showAutoSelectToggle?: boolean;\n \"onUpdate:autoSelectModel\"?: (value: boolean) => void;\n /** Your own labels or a shorter list; ratios the models don't take are left out either way. */\n aspectRatios?: ParameterOption<string>[];\n aspectRatio?: string | null;\n \"onUpdate:aspectRatio\"?: (value: string) => void;\n /** Shows the Enhance button; your handler runs the rewrite and updates the prompt. Gets the current text, which field, and the use case on screen (`mode`). */\n onEnhance?: (value: string, field: ComposerPromptField, mode?: GenerationUseCase) => void;\n /** True while your Enhance handler is running. */\n enhancing?: boolean;\n /** A world's character field (Create world), beside the environment (`v-model`). Shows with `v-model:character`. */\n character?: string;\n \"onUpdate:character\"?: (value: string) => void;\n /** A world's frame rate menu, from the selected models' `frameRates`. */\n frameRate?: number | null;\n \"onUpdate:frameRate\"?: (value: number) => void;\n /** Create speech's Voice menu, from the one picked model's `voices` (`v-model:speech-voice`). Not `voiceInput`, which is dictation. */\n speechVoice?: string | null;\n \"onUpdate:speechVoice\"?: (value: string) => void;\n /** Create music's Genre menu, several at once, from the picked models' `genres` (`v-model:genres`). */\n genres?: string[];\n \"onUpdate:genres\"?: (values: string[]) => void;\n /**\n * Which way the bar's menus open. \"above\" for a bar docked to the bottom\n * of the screen, \"below\" for one docked to the top. \"auto\" (default)\n * measures when a menu opens: below if it fits, else above if that fits,\n * else toward the side with more room.\n */\n menuPlacement?: MenuPlacement;\n /** The last submit's failure: submit becomes retry, and the message shows inline. */\n submitError?: string | null;\n /** Overrides the built-in \"empty prompt and no attachments\" check. Ignored while `submitError` is set. */\n submitDisabled?: boolean;\n /** True while a request is in flight: with `@abort`, submit becomes stop; without, it's disabled. */\n submitting?: boolean;\n onAbort?: () => void;\n onAttachMenuSelect?: (action: ComposerAttachMenuAction) => void;\n /** Which + menu items to show. Each still shows only when it can work. */\n attachMenuActions?: ComposerAttachMenuAction[];\n /** An edit's regions (from `useComposer`'s `edit`), shown as colored chips while editing. */\n regions?: EditRegion[];\n \"onUpdate:regions\"?: (next: EditRegion[]) => void;\n /**\n * The mic, left of submit: the transcript is added to the prompt, never\n * submitted. `{ model: \"fal-ai/wizper\" }` goes through your\n * `/api/chai/fal` route; `{ transcribe }` uses any provider. Off by\n * default, with no default model.\n */\n voiceInput?: VoiceInputConfig;\n disabled?: boolean;\n }>(),\n {\n attachments: () => [],\n useCase: null,\n useCases: () => [],\n modelIds: () => [],\n modelId: null,\n aspectRatio: null,\n character: \"\",\n frameRate: null,\n speechVoice: null,\n genres: () => [],\n menuPlacement: \"auto\",\n submitError: null,\n // Left undefined unless set: Vue would make an absent boolean `false`,\n // which reads as \"never disable\".\n submitDisabled: undefined,\n regions: () => [],\n }\n);\nconst emit = defineEmits<{\n \"update:modelValue\": [value: string];\n /** Everything Composer tracks. Also what retry sends, with the same payload, when `submitError` is set. */\n submit: [payload: ComposerSubmitPayload];\n unsupportedFile: [fileName: string];\n}>();\n\nconst view = computed(() =>\n composerView({\n ...props,\n value: props.modelValue,\n onModelChange: props[\"onUpdate:modelId\"],\n onModelIdsChange: props[\"onUpdate:modelIds\"],\n })\n);\nconst menuItems = computed(() =>\n composerAttachMenuItems(props.attachMenuActions, {\n canAddMedia: Boolean(props[\"onUpdate:attachments\"]),\n canSelect: Boolean(props.onAttachMenuSelect),\n })\n);\nconst modelMenuOptions = computed(() =>\n props.multiSelectUseCases\n ? { sections: view.value.modelSections.map((s) => ({ label: s.label, options: s.options })) }\n : { options: view.value.modelSections[0]?.options }\n);\nconst toMenuOption = (o: { value: string; label: string }) => ({ id: o.value, label: o.label });\nconst voiceMenuOptions = computed(() =>\n view.value.voiceSections\n ? { sections: view.value.voiceSections.map((s) => ({ label: s.label, options: s.options.map(toMenuOption) })) }\n : { options: view.value.voiceOptions.map(toMenuOption) }\n);\n\n// Auto-select chooses at submit, so turning it on clears the current pick\n// and the trigger reads \"Auto-select\" until routing fills in the model.\nwatch(\n () => props.autoSelectModel,\n (on, was) => {\n if (!on || was) return;\n if (view.value.multiModel) props[\"onUpdate:modelIds\"]?.([]);\n else props[\"onUpdate:modelId\"]?.(null);\n }\n);\n\n// Auto-select belongs to the Model menu it was turned on in: picking\n// another use case turns it off, so the new one's model is picked by hand.\n// Only when the end user owns the switch; a builder's setting stays.\nwatch(\n () => view.value.useCaseKey,\n () => {\n if (props.autoSelectModel && props.showAutoSelectToggle) props[\"onUpdate:autoSelectModel\"]?.(false);\n }\n);\n\nfunction toggleModel(id: string) {\n if (view.value.multiModel) props[\"onUpdate:modelIds\"]?.(view.value.toggledModelIds(id));\n else props[\"onUpdate:modelId\"]?.(id);\n}\n\n// Which field's Enhance is running: `enhancing` is one flag for the bar.\nconst enhancingField = ref<ComposerPromptField>(\"prompt\");\nconst enhanceField = (field: ComposerPromptField) =>\n props.onEnhance &&\n ((current: string) => {\n enhancingField.value = field;\n props.onEnhance?.(current, field, view.value.enhanceMode);\n });\n\n// Voice input: a transcript is added to the prompt, never submitted.\nconst voice = createVoiceInput(\n () => props.voiceInput ?? { transcribe: async () => \"\" },\n (text) => {\n const current = props.modelValue;\n emit(\"update:modelValue\", current.trim() ? `${current.trimEnd()} ${text}` : text);\n }\n);\nconst voiceState = shallowRef(voice.getState());\nconst stopVoice = voice.subscribe(() => (voiceState.value = voice.getState()));\nonScopeDispose(() => {\n stopVoice();\n voice.dispose();\n});\n\nasync function onFiles(files: FileList | null) {\n const onAttachments = props[\"onUpdate:attachments\"];\n if (!files || files.length === 0 || !onAttachments) return;\n // Edit mode works on one image: a new one replaces it, and the edit starts over.\n const { attachments, unsupported } = await composerAttachmentsFromFiles(files, props.attachments, view.value.editing);\n unsupported.forEach((name) => emit(\"unsupportedFile\", name));\n if (attachments) onAttachments(attachments);\n}\n\nfunction removeUseCase(useCase: ComposerUseCase) {\n if (props.multiSelectUseCases) props[\"onUpdate:useCases\"]?.(props.useCases.filter((u) => u.kind !== useCase.kind));\n else props.onClearUseCase?.();\n}\n\nfunction onSubmitClick() {\n if (view.value.showStop) props.onAbort?.();\n else if (!view.value.isSubmitDisabled && !props.submitting) emit(\"submit\", view.value.payload());\n}\n</script>\n\n<template>\n <div class=\"chai-composer\">\n <div v-if=\"attachments.length > 0\" class=\"chai-composer__thumbnails\">\n <div v-for=\"a in attachments\" :key=\"a.id\" class=\"chai-composer__thumb\">\n <img v-if=\"a.kind === 'image'\" class=\"chai-composer__thumb-img\" :src=\"a.src\" alt=\"\" />\n <span v-else class=\"chai-composer__thumb-icon\"><VideocamIcon v-if=\"a.kind === 'video'\" /><MusicNoteIcon v-else-if=\"a.kind === 'audio'\" /><ImageIcon v-else /></span>\n <button\n v-if=\"props['onUpdate:attachments']\"\n type=\"button\"\n class=\"chai-composer__thumb-remove\"\n aria-label=\"Remove attachment\"\n @click=\"props['onUpdate:attachments']?.(attachments.filter((x) => x.id !== a.id))\"\n >\n <CloseSymbolIcon />\n </button>\n </div>\n </div>\n\n <ul v-if=\"view.editing && regions.length > 0\" class=\"chai-composer__regions\" aria-label=\"Edit regions\">\n <li v-for=\"r in regions\" :key=\"r.id\">\n <Chip\n :label=\"`Region ${r.number}`\"\n :region-number=\"r.number\"\n :removable=\"Boolean(props['onUpdate:regions'])\"\n :disabled=\"disabled\"\n @remove=\"props['onUpdate:regions']?.(regions.filter((x) => x.id !== r.id))\"\n />\n </li>\n </ul>\n\n <VoiceWaveform v-if=\"voiceInput && voiceState.status === 'recording'\" :levels=\"voiceState.levels\" :elapsed-ms=\"voiceState.elapsedMs\" />\n <div v-else-if=\"view.world\" class=\"chai-composer__world-fields\">\n <PromptField\n :value=\"modelValue\"\n :placeholder=\"view.placeholder\"\n heading=\"Environment\"\n note=\"(required)\"\n :hint=\"view.environmentHint\"\n :on-enhance=\"enhanceField('environment')\"\n :enhancing=\"Boolean(enhancing) && enhancingField === 'environment'\"\n :disabled=\"disabled\"\n @change=\"emit('update:modelValue', $event)\"\n />\n <PromptField\n v-if=\"props['onUpdate:character']\"\n :value=\"character\"\n :placeholder=\"view.characterPlaceholder\"\n heading=\"Character\"\n note=\"(optional)\"\n :on-enhance=\"enhanceField('character')\"\n :enhancing=\"Boolean(enhancing) && enhancingField === 'character'\"\n :disabled=\"disabled\"\n @change=\"props['onUpdate:character']?.($event)\"\n />\n </div>\n <PromptField\n v-else\n :value=\"modelValue\"\n :placeholder=\"view.placeholder\"\n :label=\"promptLabel\"\n :on-enhance=\"enhanceField('prompt')\"\n :enhancing=\"Boolean(enhancing)\"\n :disabled=\"disabled\"\n @change=\"emit('update:modelValue', $event)\"\n />\n\n <p v-if=\"submitError\" class=\"chai-composer__error\" role=\"alert\"><ErrorIcon />{{ submitError }}</p>\n <p v-if=\"voiceInput && voiceState.status === 'error'\" class=\"chai-composer__error\" role=\"alert\"><ErrorIcon />{{ voiceState.error }}</p>\n\n <div class=\"chai-composer__controls\">\n <div class=\"chai-composer__controls-start\">\n <AttachMenu\n v-if=\"menuItems.length > 0\"\n :items=\"menuItems\"\n :images-only=\"view.editing\"\n :disabled=\"disabled\"\n :placement=\"menuPlacement\"\n @select=\"onAttachMenuSelect?.($event)\"\n @files=\"onFiles\"\n />\n\n <Chip\n v-for=\"u in view.pickedUseCases\"\n :key=\"u.kind\"\n :label=\"u.label\"\n :removable=\"Boolean(multiSelectUseCases ? props['onUpdate:useCases'] : onClearUseCase)\"\n :disabled=\"disabled\"\n @remove=\"removeUseCase(u)\"\n />\n\n <!-- The auto-select switch lives inside the Model menu, so with it shown the trigger stays enabled: it's the only way back to the switch. -->\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.modelSections.length > 0 && view.canPickModel\"\n v-bind=\"modelMenuOptions\"\n :value=\"view.multiModel ? view.pickedModelIds : modelId\"\n :multiple=\"view.multiModel\"\n :toggle-header=\"\n showAutoSelectToggle\n ? { label: 'Auto-select model', value: autoSelectModel, onChange: (v: boolean) => props['onUpdate:autoSelectModel']?.(v) }\n : undefined\n \"\n :trigger-label=\"view.modelTriggerLabel\"\n :menu-label=\"view.multiModel ? 'Select models' : 'Select model'\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled || (autoSelectModel && !showAutoSelectToggle)\"\n :panel-width=\"showAutoSelectToggle ? 320 : undefined\"\n @select=\"toggleModel($event.id)\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.showAspectRatio && view.aspectOptions.length > 0 && props['onUpdate:aspectRatio']\"\n :options=\"view.aspectOptions.map((o) => ({ id: o.value, label: o.label }))\"\n :value=\"view.offeredAspect\"\n :trigger-label=\"view.selectedAspect?.label ?? 'Aspect ratio'\"\n menu-label=\"Aspect ratio\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:aspectRatio']?.($event.id)\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.voiceOptions.length > 0 && props['onUpdate:speechVoice']\"\n v-bind=\"voiceMenuOptions\"\n :value=\"view.offeredVoice\"\n :trigger-label=\"view.voiceTriggerLabel\"\n menu-label=\"Voice\"\n :searchable=\"view.voiceOptions.length > view.searchableAt\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:speechVoice']?.($event.id)\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.genreOptions.length > 0 && props['onUpdate:genres']\"\n :options=\"view.genreOptions.map(toMenuOption)\"\n :value=\"view.offeredGenres\"\n multiple\n :trigger-label=\"view.genreTriggerLabel\"\n menu-label=\"Genre\"\n :searchable=\"view.genreOptions.length > view.searchableAt\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:genres']?.(view.toggledGenres($event.id))\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.frameRateOptions.length > 0 && props['onUpdate:frameRate']\"\n :options=\"view.frameRateOptions.map((r) => ({ id: String(r), label: `${r}fps` }))\"\n :value=\"view.offeredFrameRate == null ? null : String(view.offeredFrameRate)\"\n :trigger-label=\"view.offeredFrameRate == null ? 'Frame rate' : `${view.offeredFrameRate}fps`\"\n menu-label=\"Frame rate\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:frameRate']?.(Number($event.id))\"\n />\n </div>\n\n <div class=\"chai-composer__controls-end\">\n <VoiceButton v-if=\"voiceInput\" :voice=\"voice\" :state=\"voiceState\" :disabled=\"disabled\" />\n <!-- MD3's md-fab has no disabled state of its own; Chai's unfilled-until-ready look comes from `data-ready` in style.css. `label=\"\"` keeps it a plain icon FAB.\n Hidden while a recording is made or transcribed: the transcript is sent once it's in the prompt to check. -->\n <md-fab\n v-if=\"!(voiceInput && (voiceState.status === 'recording' || voiceState.status === 'transcribing'))\"\n class=\"chai-composer__submit\"\n size=\"small\"\n variant=\"secondary\"\n label=\"\"\n :data-ready=\"view.showStop || !view.isSubmitDisabled || undefined\"\n :data-error=\"Boolean(submitError) || undefined\"\n :data-stop=\"view.showStop || undefined\"\n :aria-label=\"view.showStop ? 'Stop' : submitError ? 'Retry' : 'Submit'\"\n :aria-disabled=\"view.showStop ? 'false' : submitting || view.isSubmitDisabled ? 'true' : 'false'\"\n @click=\"onSubmitClick\"\n >\n <span slot=\"icon\"><StopIcon v-if=\"view.showStop\" /><RetryIcon v-else-if=\"submitError\" /><ArrowForwardIcon v-else /></span>\n </md-fab>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** The full-size image in a modal dialog: focus moves in, Escape closes, and focus returns to what opened it. */\nimport { onMounted, onUnmounted, ref } from \"vue\";\nimport { CloseSymbolIcon } from \"../icons.js\";\n\ndefineProps<{ src: string; alt: string }>();\nconst emit = defineEmits<{ close: [] }>();\nconst closeButton = ref<HTMLButtonElement>();\nlet opener: HTMLElement | null = null;\n\nonMounted(() => {\n opener = document.activeElement as HTMLElement | null;\n closeButton.value?.focus();\n});\nonUnmounted(() => opener?.focus());\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n emit(\"close\");\n } else if (e.key === \"Tab\") {\n // One control inside: keep focus on it.\n e.preventDefault();\n closeButton.value?.focus();\n }\n}\n</script>\n\n<template>\n <div class=\"chai-result-card__expand-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Expanded image\" @keydown=\"onKeydown\">\n <div class=\"chai-result-card__expand-scrim\" role=\"presentation\" @click=\"emit('close')\" />\n <div class=\"chai-result-card__expand-frame\">\n <img class=\"chai-result-card__image\" :src=\"src\" :alt=\"alt\" />\n <button ref=\"closeButton\" type=\"button\" class=\"chai-result-card__collapse\" aria-label=\"Collapse\" @click=\"emit('close')\">\n <CloseSymbolIcon />\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** One region on the image: a button to select, move or delete it, its number badge, and corner handles while selected. */\nimport { REGION_CORNERS, regionBoxStyle, type EditRegion, type RegionCorner } from \"@chai-ui/core\";\n\ndefineProps<{ region: EditRegion; selected: boolean; draft: boolean; disabled: boolean }>();\nconst emit = defineEmits<{\n dragStart: [e: PointerEvent, kind: \"move\" | RegionCorner];\n select: [];\n keydown: [e: KeyboardEvent];\n}>();\n</script>\n\n<template>\n <div\n :class=\"['chai-edit-card__region', { 'chai-edit-card__region--selected': selected, 'chai-edit-card__region--draft': draft }]\"\n :style=\"regionBoxStyle(region)\"\n >\n <button\n type=\"button\"\n class=\"chai-edit-card__region-body\"\n :aria-label=\"`Region ${region.number}${region.prompt ? `: ${region.prompt}` : ', no instruction yet'}. Arrow keys move it, Shift and arrow keys resize it.`\"\n :aria-pressed=\"selected\"\n :disabled=\"disabled\"\n @pointerdown=\"emit('dragStart', $event, 'move')\"\n @click=\"emit('select')\"\n @keydown=\"emit('keydown', $event)\"\n />\n <span class=\"chai-edit-card__badge\" aria-hidden=\"true\">{{ region.number }}</span>\n <template v-if=\"selected\">\n <span\n v-for=\"corner in REGION_CORNERS\"\n :key=\"corner\"\n :class=\"`chai-edit-card__handle chai-edit-card__handle--${corner}`\"\n aria-hidden=\"true\"\n @pointerdown=\"emit('dragStart', $event, corner)\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Renders a page with its slide. The outgoing image stays in the layout\n * while it slides away, so the card holds its height even while the new\n * image is still loading, and the new page slides in over that space. The\n * page keeps its key once the slide ends, so it isn't remounted (no\n * reloaded image, no restarted video).\n */\nimport { computed } from \"vue\";\nimport type { Slide } from \"./page-slide.js\";\n\nconst props = defineProps<{ slide: Slide | null; pageClass?: string }>();\nconst emit = defineEmits<{ end: [] }>();\n\nconst side = computed(() => (props.slide?.forward ? \"left\" : \"right\"));\nconst outgoing = computed(() => (props.slide?.active ? props.slide.from : undefined));\n</script>\n\n<template>\n <img\n v-if=\"outgoing\"\n :key=\"`out-${slide!.key}`\"\n :class=\"`chai-slide-out chai-slide-out--${side}`\"\n :src=\"outgoing\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n <div\n :key=\"`in-${slide?.key ?? 0}`\"\n :class=\"[pageClass, slide?.active && `chai-slide-in chai-slide-in--${side}`, outgoing && 'chai-slide-in--over']\"\n @animationend.self=\"emit('end')\"\n >\n <slot />\n </div>\n</template>\n","import { ref, watch } from \"vue\";\n\nexport interface Slide {\n /** The image paged away from, shown sliding out. Absent when it wasn't an image. */\n from?: string;\n forward: boolean;\n key: number;\n active: boolean;\n}\n\n/**\n * The slide between pages of a card: the new page comes in from the side it\n * was paged from while the last one leaves the other way. `page` gives the\n * page showing, its index, and its image, if it has one (what slides out next time).\n */\nexport function usePageSlide(page: () => { id: string | undefined; index: number; image: string | undefined }) {\n const slide = ref<Slide | null>(null);\n let shown = page();\n watch(page, (next) => {\n // No slide for someone who has asked their system for less motion.\n const reduceMotion = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n if (next.id !== shown.id && shown.id !== undefined && next.id !== undefined && !reduceMotion) {\n slide.value = { from: shown.image, forward: next.index > shown.index, key: (slide.value?.key ?? 0) + 1, active: true };\n }\n // The same page getting its image (a result arriving) doesn't slide.\n shown = next;\n });\n const endSlide = () => {\n if (slide.value) slide.value = { ...slide.value, active: false, from: undefined };\n };\n return { slide, endSlide };\n}\n","<script setup lang=\"ts\">\n/**\n * Progress-style pager: a pill that fills from page 1 up to the current page\n * under a row of plain dots. One slider, not a button per dot (the dots sit\n * closer than WCAG 2.2's 24px target spacing allows): a click picks the\n * nearest dot; arrow keys, Home and End move between pages. Use with\n * `v-model:index`.\n */\nconst props = withDefaults(\n defineProps<{\n count: number;\n index: number;\n /** Accessible name for the pager, e.g. \"Results\". */\n label: string;\n /** What one page is, for the current position (\"Result 2 of 3\"). */\n itemLabel?: string;\n disabled?: boolean;\n }>(),\n { itemLabel: \"Result\" }\n);\nconst emit = defineEmits<{ \"update:index\": [index: number] }>();\n\nfunction go(next: number) {\n const clamped = Math.max(0, Math.min(props.count - 1, next));\n if (clamped !== props.index) emit(\"update:index\", clamped);\n}\n\nfunction onClick(e: MouseEvent) {\n if (props.disabled) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n go(Math.floor(((e.clientX - rect.left) / rect.width) * props.count));\n}\n\nconst KEY_STEPS: Record<string, (i: number, count: number) => number> = {\n ArrowRight: (i) => i + 1,\n ArrowUp: (i) => i + 1,\n PageDown: (i) => i + 1,\n ArrowLeft: (i) => i - 1,\n ArrowDown: (i) => i - 1,\n PageUp: (i) => i - 1,\n Home: () => 0,\n End: (_, count) => count - 1,\n};\n\nfunction onKeydown(e: KeyboardEvent) {\n const step = KEY_STEPS[e.key];\n if (props.disabled || !step) return;\n e.preventDefault();\n go(step(props.index, props.count));\n}\n</script>\n\n<template>\n <div\n :class=\"['chai-pagination', { 'chai-pagination--disabled': disabled }]\"\n role=\"slider\"\n :aria-label=\"label\"\n :aria-valuemin=\"1\"\n :aria-valuemax=\"count\"\n :aria-valuenow=\"index + 1\"\n :aria-valuetext=\"`${itemLabel} ${index + 1} of ${count}`\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : 0\"\n :style=\"{ '--chai-pagination-fill': `${((index + 1) / count) * 100}%` }\"\n @click=\"onClick\"\n @keydown=\"onKeydown\"\n >\n <span class=\"chai-pagination__track\" aria-hidden=\"true\" />\n <span\n v-for=\"i in count\"\n :key=\"i\"\n :class=\"['chai-pagination__dot', { 'chai-pagination__dot--filled': i - 1 <= index }]\"\n aria-hidden=\"true\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The image editing card: the person marks regions on the image, gives each\n * one an instruction, and checks it into the Composer. It shares\n * ResultCard's frame, with region actions where the votes would be.\n *\n * Drop it in with `useComposer`'s `edit`: `v-model:active-version` and\n * `v-model:regions`, sharing the regions with the Composer's. Each edit's\n * result comes back as a new version. Same props as React's `EditCard`.\n *\n * - \"New region\" adds a box with a prompt field. Check adds the region to\n * the Composer; trash removes it. Clicking a region reopens its field.\n * - Drag a region to move it, or a corner to resize it. By keyboard:\n * arrows move the selected region, Shift + arrows resize it.\n * - Zoom keeps the image inside the card; drag (or arrow keys) to pan.\n */\nimport { computed, onMounted, onUnmounted, ref, watch } from \"vue\";\nimport {\n clampPan,\n DEFAULT_MAX_REGIONS,\n downloadFilename,\n downloadMedia,\n EDIT_ZOOM_STEPS,\n editCardWidth,\n fitBox,\n freeRegionNumber,\n newRegion,\n panForKey,\n panForZoom,\n regionBoxForKey,\n regionBoxStyle,\n regionPopoverPosition,\n resizeBox,\n shareMedia,\n type EditRegion,\n type EditVersion,\n type Pan,\n type RegionBox,\n type RegionCorner,\n type Size,\n} from \"@chai-ui/core\";\nimport ExpandedImage from \"./edit-card/ExpandedImage.vue\";\nimport RegionShape from \"./edit-card/RegionShape.vue\";\nimport {\n AddIcon,\n CheckSymbolIcon,\n CloseSymbolIcon,\n DeleteIcon,\n DownloadIcon,\n ExpandIcon,\n ShareIcon,\n VisibilityIcon,\n VisibilityOffIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from \"./icons.js\";\nimport PageSlide from \"./PageSlide.vue\";\nimport { usePageSlide } from \"./page-slide.js\";\nimport Pagination from \"./primitives/Pagination.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** The original image first, then each edit. Paged with the dots in the card's bottom row. */\n versions: EditVersion[];\n activeVersion: number;\n /** The new regions on the image, each committed with its instruction. Share them with the Composer's `regions`. */\n regions: EditRegion[];\n /** The most regions the chosen model takes (`ModelOption.maxRegions`). \"New region\" is disabled at this many. */\n maxRegions?: number;\n /** A fixed starting width in px, fitted within `maxWidth` and `maxHeight`. */\n width?: number;\n /** Sizes the card from the image's own pixel width: `0.3` makes it 30% as wide as the image. */\n scale?: number;\n /** The widest the card gets, in px. With no `width` or `scale`, the card fills `maxWidth` × `maxHeight`, keeping the image's shape. */\n maxWidth?: number;\n /** The tallest the card gets, in px. */\n maxHeight?: number;\n /** Alt text for the image. */\n alt?: string;\n disabled?: boolean;\n }>(),\n { maxRegions: DEFAULT_MAX_REGIONS, maxWidth: 630, maxHeight: 630, alt: \"Image being edited\" }\n);\nconst emit = defineEmits<{\n \"update:activeVersion\": [index: number];\n \"update:regions\": [next: EditRegion[]];\n /** After the card downloads or shares the version showing. */\n action: [action: \"download\" | \"share\", version: EditVersion];\n}>();\n\ntype Drag =\n | { kind: \"move\" | RegionCorner; id: string; x: number; y: number; box: RegionBox; moved: boolean }\n | { kind: \"pan\"; x: number; y: number; pan: Pan; moved: boolean };\n\nconst index = computed(() => Math.min(Math.max(props.activeVersion, 0), Math.max(0, props.versions.length - 1)));\nconst version = computed(() => props.versions[index.value]);\nconst ready = computed(() => version.value?.status === \"done\" && Boolean(version.value.src));\nconst paginated = computed(() => props.versions.length > 1);\nconst hasImage = computed(() => Boolean(version.value?.src || version.value?.from));\n\n// A region being drawn, not yet checked into the Composer.\nconst draft = ref<EditRegion | null>(null);\nconst selectedId = ref<string | null>(null);\nconst text = ref(\"\");\nconst hidden = ref(false);\nconst zoom = ref(1);\nconst pan = ref<Pan>({ x: 0, y: 0 });\nconst size = ref<Size>({ width: 0, height: 0 });\n// The shown image's own pixel size, kept until the next version's image loads, so the card doesn't jump between.\nconst natural = ref<Size | null>(null);\nconst expanded = ref(false);\nconst linkCopied = ref(false);\nlet drag: Drag | null = null;\nconst viewport = ref<HTMLElement>();\nconst field = ref<HTMLTextAreaElement>();\n\n// Paging slides between versions, and a different version starts clean: no half-drawn region, no zoom.\nconst { slide, endSlide } = usePageSlide(() => ({\n id: version.value?.id,\n index: index.value,\n image: version.value?.src ?? version.value?.from,\n}));\nwatch(\n () => version.value?.id,\n () => {\n draft.value = null;\n selectedId.value = null;\n zoom.value = 1;\n pan.value = { x: 0, y: 0 };\n }\n);\n\nlet observer: ResizeObserver | undefined;\nonMounted(() => {\n observer = new ResizeObserver(([entry]) => {\n if (entry) size.value = { width: entry.contentRect.width, height: entry.contentRect.height };\n });\n if (viewport.value) observer.observe(viewport.value);\n});\nonUnmounted(() => observer?.disconnect());\n\n// A region being drawn takes a free number, even if the regions changed\n// since it was started (so checking it in can't duplicate a number).\nconst shownDraft = computed(() => {\n const d = draft.value;\n return d && props.regions.some((r) => r.number === d.number) ? { ...d, number: freeRegionNumber(props.regions) } : d;\n});\nconst all = computed(() => (shownDraft.value ? [...props.regions, shownDraft.value] : props.regions));\nconst selected = computed(() => all.value.find((r) => r.id === selectedId.value) ?? null);\nconst isDraft = computed(() => selected.value != null && selected.value.id === draft.value?.id);\nconst canCheck = computed(\n () => selected.value != null && text.value.trim().length > 0 && (isDraft.value || text.value.trim() !== selected.value.prompt)\n);\nconst atCap = computed(() => all.value.length >= props.maxRegions);\nconst anyRegions = computed(() => all.value.length > 0 || (version.value?.regions.length ?? 0) > 0);\nconst zoomIndex = computed(() => EDIT_ZOOM_STEPS.indexOf(zoom.value));\n// The field sits above its region, or below it when there isn't room above.\nconst popover = computed(() =>\n selected.value && !hidden.value && size.value.width\n ? regionPopoverPosition(selected.value.box, zoom.value, pan.value, size.value, paginated.value)\n : null\n);\nconst cardWidth = computed(() =>\n editCardWidth(natural.value, { width: props.width, scale: props.scale, maxWidth: props.maxWidth, maxHeight: props.maxHeight })\n);\n\n// The field opens focused, so a new region can be described straight away.\nwatch(selectedId, (id) => id && field.value?.focus(), { flush: \"post\" });\n// The field grows with its text instead of scrolling it out of view.\nwatch(\n [text, selectedId],\n () => {\n const el = field.value;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n },\n { flush: \"post\" }\n);\n\nfunction select(region: EditRegion | null) {\n selectedId.value = region?.id ?? null;\n text.value = region?.prompt ?? \"\";\n}\n\nfunction setBox(id: string, box: RegionBox) {\n if (draft.value?.id === id) draft.value = { ...draft.value, box };\n else emit(\"update:regions\", props.regions.map((r) => (r.id === id ? { ...r, box } : r)));\n}\n\nfunction removeRegion(region: EditRegion) {\n if (region.id === draft.value?.id) draft.value = null;\n else emit(\"update:regions\", props.regions.filter((r) => r.id !== region.id));\n select(null);\n}\n\nfunction addRegion() {\n const region = newRegion(props.regions, zoom.value, pan.value, size.value);\n draft.value = region;\n hidden.value = false;\n select(region);\n}\n\nfunction check() {\n const region = selected.value;\n if (!region || !canCheck.value) return;\n const prompt = text.value.trim();\n if (isDraft.value) {\n emit(\"update:regions\", [...props.regions, { ...region, prompt }]);\n draft.value = null;\n } else {\n emit(\"update:regions\", props.regions.map((r) => (r.id === region.id ? { ...r, prompt } : r)));\n }\n select(null);\n}\n\nfunction clearAll() {\n draft.value = null;\n select(null);\n emit(\"update:regions\", []);\n}\n\nfunction toggleHidden() {\n hidden.value = !hidden.value;\n select(null);\n}\n\nfunction zoomTo(next: number) {\n pan.value = panForZoom(pan.value, zoom.value, next, size.value);\n zoom.value = next;\n}\n\n// --- Pointer: move and resize regions, pan the zoomed image. Moves and\n// releases bubble to the viewport, even while a region or handle holds the\n// pointer capture, so the viewport handles them all.\n\nfunction startRegionDrag(e: PointerEvent, region: EditRegion, kind: \"move\" | RegionCorner) {\n if (props.disabled || e.button !== 0) return;\n e.stopPropagation();\n (e.currentTarget as Element).setPointerCapture(e.pointerId);\n drag = { kind, id: region.id, x: e.clientX, y: e.clientY, box: region.box, moved: false };\n if (region.id !== selectedId.value) select(region);\n}\n\nfunction startPan(e: PointerEvent) {\n if (e.button !== 0) return;\n if (zoom.value > 1) (e.currentTarget as Element).setPointerCapture(e.pointerId);\n drag = { kind: \"pan\", x: e.clientX, y: e.clientY, pan: pan.value, moved: false };\n}\n\nfunction onPointerMove(e: PointerEvent) {\n const d = drag;\n const { width, height } = size.value;\n if (!d || !width) return;\n const dxPx = e.clientX - d.x;\n const dyPx = e.clientY - d.y;\n if (Math.abs(dxPx) + Math.abs(dyPx) > 2) d.moved = true;\n if (d.kind === \"pan\") {\n if (zoom.value > 1) pan.value = clampPan({ x: d.pan.x + dxPx, y: d.pan.y + dyPx }, zoom.value, size.value);\n return;\n }\n const dx = dxPx / (width * zoom.value);\n const dy = dyPx / (height * zoom.value);\n setBox(d.id, d.kind === \"move\" ? fitBox({ ...d.box, x: d.box.x + dx, y: d.box.y + dy }) : resizeBox(d.box, d.kind, dx, dy));\n}\n\nfunction onPointerUp() {\n const d = drag;\n drag = null;\n // A click on the image itself (not a drag) closes the open field.\n if (d?.kind === \"pan\" && !d.moved) select(null);\n}\n\n// --- Keyboard\n\nfunction onRegionKey(e: KeyboardEvent, region: EditRegion) {\n const box = regionBoxForKey(region.box, e.key, { shift: e.shiftKey, alt: e.altKey });\n if (box) {\n e.preventDefault();\n e.stopPropagation();\n setBox(region.id, box);\n } else if (e.key === \"Delete\" || e.key === \"Backspace\") {\n e.preventDefault();\n removeRegion(region);\n }\n}\n\nfunction onViewportKey(e: KeyboardEvent) {\n if (e.target !== e.currentTarget || zoom.value <= 1) return;\n const next = panForKey(pan.value, e.key, zoom.value, size.value);\n if (!next) return;\n e.preventDefault();\n pan.value = next;\n}\n\nfunction onFieldKey(e: KeyboardEvent) {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n check();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n if (isDraft.value) draft.value = null;\n select(null);\n }\n}\n\n// --- Media actions\n\nasync function download() {\n const v = version.value;\n if (!v?.src) return;\n await downloadMedia(v.src, downloadFilename(v.id, \"image\", v.src));\n emit(\"action\", \"download\", v);\n}\n\nasync function share() {\n const v = version.value;\n if (!v?.src) return;\n // With no share sheet the link is copied; say so, or the click looks like nothing happened.\n if ((await shareMedia(v.src)) === \"copied\") {\n linkCopied.value = true;\n setTimeout(() => (linkCopied.value = false), 1500);\n }\n emit(\"action\", \"share\", v);\n}\n\nfunction onImageLoad(e: Event) {\n const img = e.currentTarget as HTMLImageElement;\n natural.value = { width: img.naturalWidth, height: img.naturalHeight };\n}\n</script>\n\n<template>\n <template v-if=\"version\">\n <div class=\"chai-edit-card\" :style=\"{ '--chai-edit-card-width': `${cardWidth}px` }\">\n <div\n ref=\"viewport\"\n :class=\"['chai-edit-card__viewport', { 'chai-edit-card__viewport--zoomed': zoom > 1 }]\"\n role=\"group\"\n :aria-label=\"zoom > 1 ? `Image, zoomed to ${Math.round(zoom * 100)}%. Arrow keys move around.` : 'Image'\"\n :tabindex=\"zoom > 1 ? 0 : undefined\"\n @pointerdown=\"startPan\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n @pointercancel=\"onPointerUp\"\n @keydown=\"onViewportKey\"\n >\n <PageSlide :slide=\"slide\" @end=\"endSlide\">\n <div class=\"chai-edit-card__layer\" :style=\"{ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`, '--chai-edit-zoom': zoom }\">\n <img\n v-if=\"version.src || version.from\"\n class=\"chai-edit-card__image\"\n :src=\"version.src ?? version.from\"\n :alt=\"alt\"\n draggable=\"false\"\n @load=\"onImageLoad\"\n />\n <div v-else class=\"chai-edit-card__placeholder\" />\n\n <template v-if=\"!hidden\">\n <span\n v-for=\"r in version.regions\"\n :key=\"`applied-${r.id}`\"\n class=\"chai-edit-card__region chai-edit-card__region--applied\"\n :style=\"regionBoxStyle(r)\"\n aria-hidden=\"true\"\n />\n <template v-if=\"ready\">\n <RegionShape\n v-for=\"r in all\"\n :key=\"r.id\"\n :region=\"r\"\n :selected=\"r.id === selectedId\"\n :draft=\"r.id === draft?.id\"\n :disabled=\"disabled\"\n @drag-start=\"(e, kind) => startRegionDrag(e, r, kind)\"\n @select=\"select(r)\"\n @keydown=\"onRegionKey($event, r)\"\n />\n </template>\n </template>\n </div>\n </PageSlide>\n\n <div v-if=\"version.status !== 'done'\" class=\"chai-edit-card__status\" role=\"status\">\n <span v-if=\"version.status === 'queued' || version.status === 'running'\" class=\"chai-edit-card__spinner\" role=\"img\" aria-label=\"Editing\" />\n <p v-else class=\"chai-edit-card__status-text\">{{ version.status === \"cancelled\" ? \"Stopped\" : (version.error ?? \"Something went wrong.\") }}</p>\n </div>\n\n <!-- Translucent backings keep these readable on any image. -->\n <div class=\"chai-card-top chai-card-top--start\" @pointerdown.stop>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n aria-label=\"Zoom in\"\n title=\"Zoom in\"\n :disabled=\"!ready || zoomIndex >= EDIT_ZOOM_STEPS.length - 1\"\n @click=\"zoomTo(EDIT_ZOOM_STEPS[zoomIndex + 1]!)\"\n >\n <ZoomInIcon />\n </button>\n <span class=\"chai-edit-card__zoom-level\" aria-live=\"polite\">{{ Math.round(zoom * 100) }}%</span>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n aria-label=\"Zoom out\"\n title=\"Zoom out\"\n :disabled=\"!ready || zoomIndex <= 0\"\n @click=\"zoomTo(EDIT_ZOOM_STEPS[zoomIndex - 1]!)\"\n >\n <ZoomOutIcon />\n </button>\n </div>\n\n <div class=\"chai-card-top chai-card-top--end\" @pointerdown.stop>\n <button type=\"button\" class=\"chai-card-top-btn\" aria-label=\"Download\" title=\"Download\" :disabled=\"disabled || !ready\" @click=\"download\">\n <DownloadIcon />\n </button>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n :aria-label=\"linkCopied ? 'Link copied' : 'Share'\"\n :title=\"linkCopied ? 'Link copied' : 'Share'\"\n :disabled=\"disabled || !ready\"\n @click=\"share\"\n >\n <CheckSymbolIcon v-if=\"linkCopied\" /><ShareIcon v-else />\n </button>\n <button type=\"button\" class=\"chai-card-top-btn\" aria-label=\"Expand\" title=\"Expand\" :disabled=\"!ready\" @click=\"expanded = true\">\n <ExpandIcon />\n </button>\n </div>\n\n <div v-if=\"paginated && hasImage\" class=\"chai-card-fade\" />\n\n <!-- Over the bottom of the image (it fills the card): the region actions. -->\n <div class=\"chai-card-bottom\" @pointerdown.stop>\n <div class=\"chai-card-actions\">\n <div class=\"chai-card-chips\">\n <button\n type=\"button\"\n class=\"chai-card-chip\"\n :disabled=\"disabled || !ready || atCap\"\n :title=\"atCap ? `This model takes up to ${maxRegions} regions` : undefined\"\n @click=\"addRegion\"\n >\n <AddIcon />New region\n </button>\n <button type=\"button\" class=\"chai-card-chip\" :disabled=\"disabled || all.length === 0\" @click=\"clearAll\">\n <CloseSymbolIcon />Clear regions\n </button>\n </div>\n <!-- Named, and given a tooltip, by what a press will do. -->\n <button\n type=\"button\"\n class=\"chai-card-round\"\n :aria-label=\"hidden ? 'Show regions' : 'Hide regions'\"\n :title=\"hidden ? 'Show regions' : 'Hide regions'\"\n :disabled=\"!anyRegions\"\n @click=\"toggleHidden\"\n >\n <VisibilityOffIcon v-if=\"hidden\" /><VisibilityIcon v-else />\n </button>\n </div>\n </div>\n\n <div\n v-if=\"popover && selected\"\n :class=\"['chai-edit-card__popover', { 'chai-edit-card__popover--above': popover.above }]\"\n :style=\"{ left: `${popover.left}px`, top: `${popover.top}px` }\"\n role=\"dialog\"\n :aria-label=\"`Region ${selected.number}`\"\n @pointerdown.stop\n >\n <div class=\"chai-edit-card__popover-header\">\n <span class=\"chai-edit-card__popover-title\">Region {{ selected.number }}</span>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n aria-label=\"Add region to prompt\"\n title=\"Add region to prompt\"\n :disabled=\"disabled || !canCheck\"\n @click=\"check\"\n >\n <CheckSymbolIcon />\n </button>\n <button type=\"button\" class=\"chai-card-top-btn\" aria-label=\"Delete region\" title=\"Delete region\" :disabled=\"disabled\" @click=\"removeRegion(selected)\">\n <DeleteIcon />\n </button>\n </div>\n <textarea\n ref=\"field\"\n v-model=\"text\"\n class=\"chai-edit-card__field\"\n rows=\"1\"\n placeholder=\"What should change here?\"\n :aria-label=\"`Instruction for region ${selected.number}`\"\n :disabled=\"disabled\"\n @keydown=\"onFieldKey\"\n />\n </div>\n </div>\n\n <!-- The version dots are the card's last row, under the image. -->\n <div v-if=\"paginated\" :class=\"['chai-card-pager-bar', { 'chai-card-pager-bar--over-media': hasImage }]\">\n <Pagination\n :count=\"versions.length\"\n :index=\"index\"\n label=\"Versions\"\n item-label=\"Version\"\n :disabled=\"disabled\"\n @update:index=\"emit('update:activeVersion', $event)\"\n />\n </div>\n </div>\n\n <!-- The expanded view reuses the result card's dialog, outside the card for the same reason. -->\n <ExpandedImage v-if=\"expanded && version.src\" :src=\"version.src\" :alt=\"alt\" @close=\"expanded = false\" />\n </template>\n</template>\n","<script setup lang=\"ts\">\n/** The card's small icon buttons, with the hover circle: in a dark group along the top, in the light pill, or the round button on the right. */\ndefineProps<{ variant: \"top\" | \"pill\" | \"round\"; label: string; active?: boolean; disabled?: boolean }>();\nconst CLASS = { top: \"chai-card-top-btn\", pill: \"chai-card-pill-btn\", round: \"chai-card-round\" } as const;\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"[CLASS[variant], { 'chai-card-pill-btn--active': active }]\"\n :aria-label=\"label\"\n :aria-pressed=\"active\"\n :title=\"label\"\n :disabled=\"disabled\"\n >\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/** The ⋯ menu of app-specific actions, a positioned popover under its trigger. Closes on a pick, Escape, or a click outside. */\nimport { ref } from \"vue\";\nimport { useDismiss } from \"../dismiss.js\";\nimport { MoreHorizIcon } from \"../icons.js\";\nimport IconButton from \"./IconButton.vue\";\nimport type { ResultCardMoreAction } from \"./types.js\";\n\ndefineProps<{ actions: ResultCardMoreAction[]; disabled?: boolean }>();\nconst emit = defineEmits<{ select: [action: ResultCardMoreAction] }>();\nconst open = ref(false);\nconst root = ref<HTMLElement>();\n\nuseDismiss(root, open, () => (open.value = false));\n\nfunction pick(action: ResultCardMoreAction) {\n open.value = false;\n emit(\"select\", action);\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"chai-result-card__more\">\n <IconButton variant=\"pill\" label=\"More\" :active=\"open\" :disabled=\"disabled\" @click=\"open = !open\">\n <MoreHorizIcon />\n </IconButton>\n <ul v-if=\"open\" class=\"chai-result-card__more-menu\" role=\"menu\">\n <li v-for=\"action in actions\" :key=\"action.id\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" class=\"chai-result-card__more-menu-item\" @click=\"pick(action)\">\n <span v-if=\"action.icon\" class=\"chai-result-card__more-menu-icon\"><component :is=\"action.icon\" /></span>{{ action.label }}\n </button>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A text result, streaming or finished. One element for both states, so the\n * scroll position survives the moment a stream completes. Past its max\n * height it scrolls; while streaming it follows the newest text, unless the\n * person has scrolled up to read, in which case it stays where they are.\n */\nimport { onMounted, ref, watch } from \"vue\";\n\nconst props = defineProps<{ text: string; streaming: boolean }>();\nconst el = ref<HTMLElement>();\nlet follow = true;\n\nfunction followNewest() {\n if (el.value && props.streaming && follow) el.value.scrollTop = el.value.scrollHeight;\n}\n// A frame later on mount: set during mount, before the card's first paint,\n// the scroll position didn't stick in Chromium (React's effect runs after paint).\nonMounted(() => requestAnimationFrame(followNewest));\nwatch(() => [props.text, props.streaming], followNewest, { flush: \"post\" });\n\nfunction onScroll(e: Event) {\n const p = e.currentTarget as HTMLElement;\n follow = p.scrollTop + p.clientHeight >= p.scrollHeight - 24;\n}\n</script>\n\n<template>\n <!-- aria-busy: screen readers wait for the finished text instead of announcing every chunk. tabindex: keyboard users can scroll a long answer. -->\n <p\n ref=\"el\"\n :class=\"['chai-result-card__text-output', { 'chai-result-card__text-output--streaming': streaming }]\"\n :aria-busy=\"streaming\"\n tabindex=\"0\"\n @scroll=\"onScroll\"\n >{{ text }}</p>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A real `<video>` with slim play/pause and scrubber chrome built on its own\n * playback API, not the browser's heavier native controls. Mounted twice\n * (inline, and in the expand overlay), so `time` and `wasPlaying` carry the\n * position and play state across the swap.\n */\nimport { ref } from \"vue\";\nimport { PlayIcon } from \"../icons.js\";\n\nconst props = defineProps<{ src: string; expanded?: boolean; time: { current: number }; wasPlaying: boolean }>();\nconst emit = defineEmits<{ playingChange: [playing: boolean]; dimensions: [width: number, height: number] }>();\nconst video = ref<HTMLVideoElement>();\nconst playing = ref(props.wasPlaying);\nconst progress = ref(0);\n\nfunction togglePlay() {\n const el = video.value!;\n if (el.paused) el.play();\n else el.pause();\n}\n\nfunction onLoadedMetadata() {\n const el = video.value!;\n el.currentTime = props.time.current;\n if (props.wasPlaying) el.play().catch(() => {});\n emit(\"dimensions\", el.videoWidth, el.videoHeight);\n}\n\nfunction setPlaying(value: boolean) {\n playing.value = value;\n emit(\"playingChange\", value);\n}\n\nfunction onTimeUpdate() {\n const el = video.value!;\n props.time.current = el.currentTime;\n if (el.duration) progress.value = el.currentTime / el.duration;\n}\n\nfunction scrub(e: MouseEvent) {\n const el = video.value!;\n if (!el.duration) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n el.currentTime = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width)) * el.duration;\n}\n\n// Keyboard seeking, the slider pattern: arrows move 5s, Home/End jump.\nconst STEPS: Record<string, number> = { ArrowRight: 5, ArrowUp: 5, ArrowLeft: -5, ArrowDown: -5 };\nfunction onScrubKey(e: KeyboardEvent) {\n const el = video.value!;\n if (!el.duration) return;\n const step = STEPS[e.key];\n if (step != null) el.currentTime = Math.min(el.duration, Math.max(0, el.currentTime + step));\n else if (e.key === \"Home\") el.currentTime = 0;\n else if (e.key === \"End\") el.currentTime = el.duration;\n else return;\n e.preventDefault();\n}\n</script>\n\n<template>\n <video\n ref=\"video\"\n class=\"chai-result-card__video\"\n :src=\"src\"\n @loadedmetadata=\"onLoadedMetadata\"\n @play=\"setPlaying(true)\"\n @pause=\"setPlaying(false)\"\n @timeupdate=\"onTimeUpdate\"\n />\n <!-- One control over the whole video: click, or Tab then Space/Enter, to play or pause. The round Play badge is just its paused look. -->\n <button type=\"button\" class=\"chai-result-card__video-toggle\" :aria-label=\"playing ? 'Pause' : 'Play'\" @click=\"togglePlay\">\n <span v-if=\"!playing\" class=\"chai-result-card__play\"><PlayIcon /></span>\n </button>\n <div\n :class=\"['chai-result-card__scrubber', { 'chai-result-card__scrubber--expanded': expanded }]\"\n role=\"slider\"\n tabindex=\"0\"\n aria-label=\"Seek\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(progress * 100)\"\n :aria-valuetext=\"`${Math.round(progress * 100)}%`\"\n @click=\"scrub\"\n @keydown=\"onScrubKey\"\n >\n <div class=\"chai-result-card__scrubber-fill\" :style=\"{ width: `${progress * 100}%` }\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** The card's front: the result's image, video, audio or text, or its pending, stopped or failed state, with Download, Share and Expand over it. */\nimport { computed } from \"vue\";\nimport type { Result } from \"@chai-ui/core\";\nimport { CheckSymbolIcon, DownloadIcon, ExpandIcon, ShareIcon } from \"../icons.js\";\nimport IconButton from \"./IconButton.vue\";\nimport ResultText from \"./ResultText.vue\";\nimport VideoPlayer from \"./VideoPlayer.vue\";\n\nconst props = defineProps<{\n result: Result;\n alt: string;\n disabled?: boolean;\n mediaExpanded: boolean;\n linkCopied: boolean;\n videoTime: { current: number };\n videoWasPlaying: boolean;\n}>();\nconst emit = defineEmits<{\n download: [];\n share: [];\n expand: [];\n dimensions: [width: number, height: number];\n videoPlayingChange: [playing: boolean];\n}>();\n\nconst kind = computed(() => props.result.output?.kind);\n// \"Running with output\" is a text result streaming in: show the partial text, not the spinner.\nconst streaming = computed(() => props.result.status === \"running\" && kind.value === \"text\");\nconst pending = computed(() => (props.result.status === \"queued\" || props.result.status === \"running\") && !streaming.value);\n\nfunction onImageLoad(e: Event) {\n const img = e.currentTarget as HTMLImageElement;\n emit(\"dimensions\", img.naturalWidth, img.naturalHeight);\n}\n</script>\n\n<template>\n <div v-if=\"pending\" class=\"chai-result-card__media chai-result-card__media--pending\">\n <span class=\"chai-result-card__spinner\" role=\"img\" :aria-label=\"result.status === 'running' ? 'Running' : 'Queued'\" />\n </div>\n <!-- Stopped before any output. A stopped stream keeps its partial text and renders below like any other. -->\n <div v-else-if=\"result.status === 'cancelled' && !result.output\" class=\"chai-result-card__media chai-result-card__media--cancelled\">\n <p class=\"chai-result-card__cancelled-text\">Stopped</p>\n </div>\n <div v-else-if=\"result.status === 'error'\" class=\"chai-result-card__media chai-result-card__media--error\">\n <p class=\"chai-result-card__error-text\">{{ result.error?.message ?? \"Something went wrong.\" }}</p>\n </div>\n <div v-else-if=\"!result.output\" class=\"chai-result-card__media\" />\n <div v-else :class=\"['chai-result-card__media', { 'chai-result-card__media--fixed-height': kind === 'audio' || kind === 'text' }]\">\n <template v-if=\"kind === 'video'\">\n <!-- While expanded, the playing video is in the overlay; a still frame holds the layout here. -->\n <img v-if=\"mediaExpanded\" class=\"chai-result-card__image\" :src=\"result.output.src\" alt=\"\" />\n <VideoPlayer\n v-else\n :src=\"result.output.src\"\n :time=\"videoTime\"\n :was-playing=\"videoWasPlaying\"\n @playing-change=\"emit('videoPlayingChange', $event)\"\n @dimensions=\"(w, h) => emit('dimensions', w, h)\"\n />\n </template>\n <audio v-else-if=\"kind === 'audio'\" class=\"chai-result-card__audio\" :src=\"result.output.src\" controls />\n <ResultText v-else-if=\"kind === 'text'\" :text=\"result.output.src\" :streaming=\"streaming\" />\n <img v-else class=\"chai-result-card__image\" :src=\"result.output.src\" :alt=\"alt\" @load=\"onImageLoad\" />\n\n <div v-if=\"!mediaExpanded && !streaming\" class=\"chai-card-top chai-card-top--end\">\n <IconButton variant=\"top\" label=\"Download\" :disabled=\"disabled\" @click=\"emit('download')\"><DownloadIcon /></IconButton>\n <IconButton variant=\"top\" :label=\"linkCopied ? 'Link copied' : 'Share'\" :disabled=\"disabled\" @click=\"emit('share')\">\n <CheckSymbolIcon v-if=\"linkCopied\" /><ShareIcon v-else />\n </IconButton>\n <IconButton v-if=\"kind === 'video' || kind === 'image'\" variant=\"top\" label=\"Expand\" :disabled=\"disabled\" @click=\"emit('expand')\">\n <ExpandIcon />\n </IconButton>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The Composer bar's complement, and the last stop in the pipeline: the\n * results from one prompt, one at a time, paged with the dots when there\n * are several. Flips to show the prompt and details. Same props as React's\n * `ResultCard`; `onAction` is the `action` event.\n */\nimport { computed, nextTick, reactive, ref, watch } from \"vue\";\nimport {\n downloadFilename,\n downloadMedia,\n formatAspectRatio,\n formatCost,\n formatDuration,\n formatTokens,\n resultModelLabel,\n shareMedia,\n type ModelOption,\n type Result,\n} from \"@chai-ui/core\";\nimport { CheckIcon, CloseIcon, CopyIcon, InfoIcon, RefreshIcon, ThumbDownIcon, ThumbUpIcon } from \"./icons.js\";\nimport PageSlide from \"./PageSlide.vue\";\nimport { usePageSlide } from \"./page-slide.js\";\nimport Pagination from \"./primitives/Pagination.vue\";\nimport IconButton from \"./result-card/IconButton.vue\";\nimport MoreMenu from \"./result-card/MoreMenu.vue\";\nimport ResultMedia from \"./result-card/ResultMedia.vue\";\nimport VideoPlayer from \"./result-card/VideoPlayer.vue\";\nimport type { ResultCardMoreAction, ResultCardVote } from \"./result-card/types.js\";\n\nconst props = defineProps<{\n /** The results from one prompt: `results[0]` if there's only one, paged internally if more. */\n results: Result[];\n /** Fixed width in px. Defaults to 375; height follows the media. */\n width?: number;\n /** Max height in px of a text result before it scrolls. Defaults to 400. */\n textMaxHeight?: number;\n /** The request's prompt, shown read-only (copiable) on the info side. */\n prompt: string;\n /** Alt text for a generated image. Defaults to `prompt`. */\n altText?: (result: Result) => string;\n /** Resolves `Result.modelId` to a label, on the info side and beside the page dots. */\n models?: ModelOption[];\n /** A result's vote, if any. Controlled: what a vote means is the app's policy. */\n getVote?: (result: Result) => ResultCardVote;\n /** Extra items in the ⋯ menu. Omit to hide the menu. */\n moreActions?: ResultCardMoreAction[];\n disabled?: boolean;\n}>();\nconst emit = defineEmits<{\n /** `\"like\"`, `\"dislike\"`, `\"download\"`, `\"share\"`, `\"copy-prompt\"`, `\"retry\"`, or a `moreActions` id. */\n action: [action: string, result: Result];\n}>();\n\nconst activeIndex = ref(0);\nconst flipped = ref(false);\nconst copied = ref(false);\nconst linkCopied = ref(false);\nconst mediaExpanded = ref(false);\n// Measured off the loaded media for the aspect-ratio chip, with the id it\n// was measured from, so a stale ratio never shows after paging.\nconst measured = ref<{ id: string; width: number; height: number } | null>(null);\nconst videoTime = reactive({ current: 0 });\nconst videoWasPlaying = ref(false);\nconst front = ref<HTMLElement>();\nconst back = ref<HTMLElement>();\nconst overlay = ref<HTMLElement>();\n\nconst index = computed(() => Math.min(activeIndex.value, Math.max(0, props.results.length - 1)));\nconst result = computed(() => props.results[index.value]);\nconst kind = computed(() => result.value?.output?.kind);\nconst paginated = computed(() => props.results.length > 1);\n// An image or video runs under a dark fade into the bar; text, audio and status pages keep the plain surface.\nconst overMedia = computed(() => kind.value === \"image\" || kind.value === \"video\");\nconst vote = computed(() => (result.value && props.getVote?.(result.value)) ?? null);\nconst modelLabel = computed(() => (result.value ? resultModelLabel(result.value, props.models) : \"\"));\nconst alt = computed(() => (result.value ? (props.altText?.(result.value) ?? props.prompt) : \"\"));\nconst chips = computed(() => {\n const r = result.value;\n const dims = measured.value?.id === r?.id ? measured.value : null;\n return [\n modelLabel.value,\n formatTokens(r?.usage?.totalTokens),\n formatCost(r?.usage?.costUsd),\n formatDuration(r?.durationMs),\n dims ? formatAspectRatio(dims.width, dims.height) : undefined,\n ].filter(Boolean) as string[];\n});\nconst cardStyle = computed(() => ({\n ...(props.width != null && { \"--chai-result-card-width\": `${props.width}px` }),\n ...(props.textMaxHeight != null && { \"--chai-result-card-text-max-height\": `${props.textMaxHeight}px` }),\n}));\n\n// Paging slides, with the last image sliding out (other kinds just slide in).\nconst { slide, endSlide } = usePageSlide(() => ({\n id: result.value?.id,\n index: index.value,\n image: kind.value === \"image\" ? result.value!.output!.src : undefined,\n}));\n\nconst act = (action: string) => emit(\"action\", action, result.value!);\n\nfunction flash(flag: typeof copied) {\n flag.value = true;\n setTimeout(() => (flag.value = false), 1500);\n}\n\nfunction copyPrompt() {\n navigator.clipboard?.writeText(props.prompt).catch(() => {});\n flash(copied);\n act(\"copy-prompt\");\n}\n\nasync function download() {\n const r = result.value!;\n if (r.output) await downloadMedia(r.output.src, downloadFilename(r.id, r.output.kind, r.output.src));\n emit(\"action\", \"download\", r);\n}\n\nasync function share() {\n const r = result.value!;\n // With no share sheet the link is copied; say so, or the click looks like nothing happened.\n if (r.output && (await shareMedia(r.output.src)) === \"copied\") flash(linkCopied);\n emit(\"action\", \"share\", r);\n}\n\n// Flipping moves focus to the side now showing, so a keyboard user isn't left on a button that just turned away.\nwatch(\n flipped,\n (isFlipped) => {\n const target = isFlipped\n ? back.value?.querySelector<HTMLElement>('[aria-label=\"Close details\"]')\n : front.value?.querySelector<HTMLElement>('[aria-label=\"Show details\"]');\n target?.focus();\n },\n { flush: \"post\" }\n);\n\n// The expanded view is a modal dialog: focus moves in, Tab stays inside,\n// Escape closes, and focus returns to Expand, the only way in.\nwatch(mediaExpanded, async (open) => {\n await nextTick();\n if (open) overlay.value?.querySelector<HTMLElement>(\".chai-result-card__collapse\")?.focus();\n else front.value?.querySelector<HTMLElement>('[aria-label=\"Expand\"]')?.focus();\n});\n\nfunction onOverlayKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n mediaExpanded.value = false;\n return;\n }\n if (e.key !== \"Tab\") return;\n const focusable = [\n ...(e.currentTarget as HTMLElement).querySelectorAll<HTMLElement>('button, [tabindex=\"0\"], a[href], input, video[controls]'),\n ].filter((el) => !el.hasAttribute(\"disabled\"));\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) return;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n}\n</script>\n\n<template>\n <template v-if=\"result\">\n <div :class=\"['chai-result-card', { 'chai-result-card--flipped': flipped }]\" :style=\"cardStyle\">\n <div class=\"chai-result-card__inner\">\n <!-- The face turned away is inert, so its buttons can't be tabbed to. -->\n <div\n ref=\"front\"\n :class=\"['chai-result-card__face chai-result-card__front', { 'chai-result-card__front--paginated': paginated }]\"\n :aria-hidden=\"flipped\"\n :inert=\"flipped\"\n >\n <div class=\"chai-result-card__media-frame\">\n <PageSlide :slide=\"slide\" page-class=\"chai-result-card__media-page\" @end=\"endSlide\">\n <ResultMedia\n :result=\"result\"\n :alt=\"alt\"\n :disabled=\"disabled\"\n :media-expanded=\"mediaExpanded\"\n :link-copied=\"linkCopied\"\n :video-time=\"videoTime\"\n :video-was-playing=\"videoWasPlaying\"\n @download=\"download\"\n @share=\"share\"\n @expand=\"mediaExpanded = true\"\n @dimensions=\"(w, h) => (measured = { id: result!.id, width: w, height: h })\"\n @video-playing-change=\"videoWasPlaying = $event\"\n />\n </PageSlide>\n <div v-if=\"paginated && overMedia\" class=\"chai-card-fade\" />\n </div>\n\n <!-- With several results, the page dots are the card's last row, with the model that made this page on the left. -->\n <div v-if=\"paginated\" :class=\"['chai-card-pager-bar', { 'chai-card-pager-bar--over-media': overMedia }]\">\n <span class=\"chai-card-pager-label\">{{ modelLabel }}</span>\n <Pagination\n :count=\"results.length\"\n :index=\"index\"\n label=\"Results\"\n :disabled=\"disabled\"\n @update:index=\"activeIndex = $event\"\n />\n </div>\n\n <!-- Floating over the bottom of the media: votes and retry in one pill, details on the right. -->\n <div class=\"chai-card-bottom\">\n <div class=\"chai-card-actions\">\n <div class=\"chai-card-pill\">\n <IconButton variant=\"pill\" label=\"Like\" :active=\"vote === 'like'\" :disabled=\"disabled\" @click=\"act('like')\">\n <ThumbUpIcon />\n </IconButton>\n <IconButton variant=\"pill\" label=\"Dislike\" :active=\"vote === 'dislike'\" :disabled=\"disabled\" @click=\"act('dislike')\">\n <ThumbDownIcon />\n </IconButton>\n <IconButton variant=\"pill\" label=\"Retry\" :disabled=\"disabled\" @click=\"act('retry')\"><RefreshIcon /></IconButton>\n <MoreMenu v-if=\"moreActions?.length\" :actions=\"moreActions\" :disabled=\"disabled\" @select=\"act($event.id)\" />\n </div>\n <IconButton variant=\"round\" label=\"Show details\" :disabled=\"disabled\" @click=\"flipped = true\"><InfoIcon /></IconButton>\n </div>\n </div>\n </div>\n\n <div ref=\"back\" class=\"chai-result-card__face chai-result-card__back\" :aria-hidden=\"!flipped\" :inert=\"!flipped\">\n <button type=\"button\" class=\"chai-result-card__close\" aria-label=\"Close details\" @click=\"flipped = false\">\n <CloseIcon />\n </button>\n <div class=\"chai-result-card__prompt-box\">\n <p class=\"chai-result-card__prompt-text\">{{ prompt }}</p>\n <button\n type=\"button\"\n class=\"chai-result-card__copy\"\n :aria-label=\"copied ? 'Copied' : 'Copy prompt'\"\n :title=\"copied ? 'Copied' : 'Copy prompt'\"\n @click=\"copyPrompt\"\n >\n <CheckIcon v-if=\"copied\" /><CopyIcon v-else />\n </button>\n </div>\n <div class=\"chai-result-card__chips\">\n <span v-for=\"(chip, i) in chips\" :key=\"i\" class=\"chai-result-card__chip\">{{ chip }}</span>\n <!-- The builder's own backend checks: pass green with a check, fail red with a cross, so the verdict never relies on color alone. -->\n <span\n v-for=\"evaluation in result.evaluations\"\n :key=\"evaluation.id\"\n :class=\"[\n 'chai-result-card__chip chai-result-card__chip--evaluation',\n `chai-result-card__chip--${evaluation.passed ? 'passed' : 'failed'}`,\n ]\"\n :title=\"`${evaluation.label}: ${evaluation.passed ? 'passed' : 'failed'}`\"\n >\n <CheckIcon v-if=\"evaluation.passed\" /><CloseIcon v-else />{{ evaluation.label\n }}<span class=\"chai-visually-hidden\">{{ evaluation.passed ? \", passed\" : \", failed\" }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- The expanded view is the card's sibling, not its child: the card's\n `perspective` (for the flip) would make a nested `position: fixed`\n overlay cover only the card. The expanded video is a second element;\n `videoTime` and `videoWasPlaying` carry its place across. -->\n <div\n v-if=\"mediaExpanded && result.output && overMedia\"\n ref=\"overlay\"\n class=\"chai-result-card__expand-overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"kind === 'video' ? 'Expanded video' : 'Expanded image'\"\n @keydown=\"onOverlayKeydown\"\n >\n <div class=\"chai-result-card__expand-scrim\" role=\"presentation\" @click=\"mediaExpanded = false\" />\n <div class=\"chai-result-card__expand-frame\">\n <VideoPlayer\n v-if=\"kind === 'video'\"\n :src=\"result.output.src\"\n expanded\n :time=\"videoTime\"\n :was-playing=\"videoWasPlaying\"\n @playing-change=\"videoWasPlaying = $event\"\n />\n <img v-else class=\"chai-result-card__image\" :src=\"result.output.src\" :alt=\"alt\" />\n <button type=\"button\" class=\"chai-result-card__collapse\" aria-label=\"Collapse\" @click=\"mediaExpanded = false\">\n <CloseIcon />\n </button>\n </div>\n </div>\n </template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Turns attached media into a prompt: a drop zone for images, a video or\n * audio, a model menu with auto-select, a prompt-length menu, and submit.\n * Pair with `useMediaAnalyzer`. Same props as React's `MediaAnalyzer`, with\n * `v-model:attachments`, `v-model:model-id`, `v-model:auto-select-model`\n * and `v-model:prompt-length`.\n */\nimport \"@material/web/fab/fab.js\";\nimport { computed, ref, watch } from \"vue\";\nimport {\n DEFAULT_MAX_ATTACHMENTS_BY_KIND,\n isMediaAnalyzerAtCap,\n mediaAnalyzerModelSections,\n nextMediaAnalyzerAttachments,\n PROMPT_LENGTH_HINT,\n readMediaFiles,\n replacedNote,\n SUGGESTED_ANALYSIS_MODELS,\n type MediaAnalysisPromptLength,\n type MediaAnalyzerAttachment,\n type MediaAnalyzerSubmitPayload,\n type MediaKind,\n type ModelOption,\n} from \"@chai-ui/core\";\nimport { ArrowForwardIcon, AudioIcon, MixedMediaIcon, RemoveIcon, StopIcon, VideoIcon } from \"./icons.js\";\nimport SearchMenu from \"./primitives/SearchMenu.vue\";\n\nconst props = withDefaults(\n defineProps<{\n attachments: MediaAnalyzerAttachment[];\n maxAttachmentsByKind?: Record<MediaKind, number>;\n /** Fallback roster for a kind `modelsByKind` doesn't list. */\n models?: ModelOption[];\n /** Per-kind rosters; once a kind is attached, only its models show. Defaults to Chai's suggested OpenRouter models. */\n modelsByKind?: Partial<Record<MediaKind, ModelOption[]>>;\n /** The picked model. While `autoSelectModel` is on it's `null` until a submit routes, then the routed model. */\n modelId: string | null;\n /** The \"Auto-select model\" switch inside the model menu. Turning it on clears the pick. */\n autoSelectModel: boolean;\n /** `null` until a person picks one: the trigger says \"Prompt length\" rather than pre-filling a choice. */\n promptLength: MediaAnalysisPromptLength | null;\n promptLengthOptions: { value: MediaAnalysisPromptLength; label: string }[];\n disabled?: boolean;\n submitting?: boolean;\n submitError?: string | null;\n /** With a listener, submit turns into stop while `submitting` (wire it to `useMediaAnalyzer`'s `cancel`); without one, submit is just disabled. */\n onAbort?: () => void;\n }>(),\n { maxAttachmentsByKind: () => DEFAULT_MAX_ATTACHMENTS_BY_KIND, models: () => [], modelsByKind: () => SUGGESTED_ANALYSIS_MODELS }\n);\nconst emit = defineEmits<{\n \"update:attachments\": [next: MediaAnalyzerAttachment[]];\n \"update:modelId\": [id: string | null];\n \"update:autoSelectModel\": [next: boolean];\n \"update:promptLength\": [value: MediaAnalysisPromptLength];\n unsupportedFile: [fileName: string];\n submit: [payload: MediaAnalyzerSubmitPayload];\n}>();\n\nconst input = ref<HTMLInputElement>();\n// A count, not a boolean: dragenter/dragleave fire for every child the\n// pointer crosses too, so a boolean would flicker off over the icon or text.\nconst dragDepth = ref(0);\n// What the last attach replaced (one kind per analysis), shown until the\n// attachments change some other way. Matched by ids: a parent's ref hands\n// the list back as a reactive copy, never the same array.\nconst replaced = ref<{ note: string; ids: string } | null>(null);\nconst idsOf = (list: MediaAnalyzerAttachment[]) => list.map((a) => a.id).join();\n\nconst kind = computed(() => props.attachments[0]?.kind);\nconst atCap = computed(() => isMediaAnalyzerAtCap(props.attachments, props.maxAttachmentsByKind));\nconst sections = computed(() => mediaAnalyzerModelSections(kind.value, props.modelsByKind, props.models));\n// Looked up across every section, so a pick made before any media is attached still names itself on the trigger.\nconst selectedModel = computed(() => sections.value.flatMap((s) => s.options).find((m) => m.id === props.modelId));\nconst modelTriggerLabel = computed(\n () => selectedModel.value?.label ?? (props.autoSelectModel ? \"Auto-select model\" : \"Select model\")\n);\nconst lengthOptions = computed(() =>\n // The clarifying suffix shows only in the list, never on the trigger.\n props.promptLengthOptions.map((o) => ({ id: o.value, label: o.label, rowLabel: `${o.label} (${PROMPT_LENGTH_HINT[o.value]})` }))\n);\nconst lengthLabel = computed(() => props.promptLengthOptions.find((o) => o.value === props.promptLength)?.label ?? \"Prompt length\");\nconst isSubmitDisabled = computed(() => props.disabled || props.attachments.length === 0);\nconst showStop = computed(() => Boolean(props.submitting && props.onAbort));\n\n// Auto-select chooses at submit, so turning it on clears the current pick\n// and the trigger says what will happen until it does.\nwatch(\n () => props.autoSelectModel,\n (on, was) => {\n if (on && !was) emit(\"update:modelId\", null);\n }\n);\n\n/** Reads every file first, then applies them in drop order and commits once. */\nasync function handleFiles(files: FileList | null | undefined) {\n if (!files || files.length === 0) return;\n const { media, unsupported } = await readMediaFiles(files);\n unsupported.forEach((name) => emit(\"unsupportedFile\", name));\n if (media.length === 0) return;\n const next = media.reduce((acc, m) => nextMediaAnalyzerAttachments(acc, m, props.maxAttachmentsByKind), props.attachments);\n const note = replacedNote(props.attachments, next);\n replaced.value = note ? { note, ids: idsOf(next) } : null;\n emit(\"update:attachments\", next);\n}\n\nfunction onDrop(e: DragEvent) {\n dragDepth.value = 0;\n if (!props.disabled) void handleFiles(e.dataTransfer?.files);\n}\n\nfunction onFileChange(e: Event) {\n const el = e.target as HTMLInputElement;\n void handleFiles(el.files);\n el.value = \"\";\n}\n\nfunction remove(id: string) {\n emit(\n \"update:attachments\",\n props.attachments.filter((a) => a.id !== id)\n );\n}\n\nfunction onSubmitClick() {\n if (showStop.value) props.onAbort?.();\n else if (!isSubmitDisabled.value && !props.submitting) {\n emit(\"submit\", {\n attachments: props.attachments,\n modelId: props.modelId,\n autoSelectModel: props.autoSelectModel,\n models: kind.value ? (props.modelsByKind[kind.value] ?? props.models) : [],\n promptLength: props.promptLength,\n });\n }\n}\n</script>\n\n<template>\n <div class=\"chai-media-analyzer\">\n <div\n :class=\"[\n 'chai-media-analyzer__dropzone',\n { 'chai-media-analyzer__dropzone--disabled': atCap, 'chai-media-analyzer__dropzone--drag-active': dragDepth > 0 },\n ]\"\n @dragenter.prevent=\"dragDepth++\"\n @dragleave.prevent=\"dragDepth = Math.max(0, dragDepth - 1)\"\n @dragover.prevent\n @drop.prevent=\"onDrop\"\n >\n <span class=\"chai-media-analyzer__dropzone-icon\" aria-hidden=\"true\"><MixedMediaIcon /></span>\n <!-- `atCap` is only ever true for image. -->\n <p class=\"chai-media-analyzer__dropzone-hint\">{{ atCap ? \"Maximum images added\" : \"Add media to convert to prompt\" }}</p>\n <button type=\"button\" class=\"chai-chip-button\" :disabled=\"disabled\" @click=\"input?.click()\">Select files</button>\n <input ref=\"input\" type=\"file\" accept=\"image/*,video/*,audio/*\" multiple hidden :disabled=\"disabled\" @change=\"onFileChange\" />\n </div>\n\n <div v-if=\"attachments.length > 0\" class=\"chai-media-analyzer__thumbnails\">\n <div v-for=\"a in attachments\" :key=\"a.id\" class=\"chai-media-analyzer__thumb\">\n <img v-if=\"a.kind === 'image'\" class=\"chai-media-analyzer__thumb-img\" :src=\"a.src\" alt=\"\" />\n <span v-else class=\"chai-media-analyzer__thumb-icon\"><VideoIcon v-if=\"a.kind === 'video'\" /><AudioIcon v-else /></span>\n <button type=\"button\" class=\"chai-media-analyzer__thumb-remove\" :aria-label=\"`Remove ${a.name ?? a.kind}`\" @click=\"remove(a.id)\">\n <RemoveIcon />\n </button>\n </div>\n </div>\n\n <p v-if=\"replaced && replaced.ids === idsOf(attachments)\" class=\"chai-media-analyzer__note\" role=\"status\">{{ replaced.note }}</p>\n <p v-if=\"submitError\" class=\"chai-media-analyzer__error\" role=\"alert\">{{ submitError }}</p>\n\n <div class=\"chai-media-analyzer__controls\">\n <div class=\"chai-media-analyzer__controls-start\">\n <SearchMenu\n :options=\"sections.length === 1 ? sections[0]!.options : undefined\"\n :sections=\"sections.length > 1 ? sections : undefined\"\n :toggle-header=\"{ label: 'Auto-select model', value: autoSelectModel, onChange: (next) => emit('update:autoSelectModel', next) }\"\n :value=\"modelId\"\n :trigger-label=\"modelTriggerLabel\"\n menu-label=\"Select model\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n :panel-width=\"320\"\n @select=\"emit('update:modelId', $event.id)\"\n />\n <SearchMenu\n :options=\"lengthOptions\"\n :value=\"promptLength\"\n :trigger-label=\"lengthLabel\"\n menu-label=\"Prompt length\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"emit('update:promptLength', $event.id as MediaAnalysisPromptLength)\"\n />\n </div>\n\n <!-- The same unfilled-until-ready submit as Composer's FAB. -->\n <md-fab\n class=\"chai-media-analyzer__submit\"\n size=\"small\"\n variant=\"secondary\"\n label=\"\"\n :data-ready=\"showStop || !isSubmitDisabled || undefined\"\n :data-error=\"Boolean(submitError) || undefined\"\n :data-stop=\"showStop || undefined\"\n :aria-label=\"showStop ? 'Stop' : submitError ? 'Retry' : 'Analyze media'\"\n :aria-disabled=\"showStop ? 'false' : submitting || isSubmitDisabled ? 'true' : 'false'\"\n @click=\"onSubmitClick\"\n >\n <span slot=\"icon\"><StopIcon v-if=\"showStop\" /><ArrowForwardIcon v-else /></span>\n </md-fab>\n </div>\n </div>\n</template>\n","import { computed, onScopeDispose, shallowRef, toValue, type MaybeRefOrGetter } from \"vue\";\nimport { createComposerStore, pickReasoning, type ComposerOptions } from \"@chai-ui/core\";\nimport { useReasoning } from \"./reasoning.js\";\n\nexport type UseComposerOptions = ComposerOptions;\n\n/**\n * The Vue binding for `createComposerStore` in `@chai-ui/core`: turns a\n * `Composer`'s submit payload into a real `Request` → `Run` → `Result`.\n * Pass a getter (or ref) for options that change, e.g. `() => ({ engine, editImage: image.value })`.\n */\nexport function useComposer(options: MaybeRefOrGetter<UseComposerOptions> = {}) {\n const provided = useReasoning();\n const store = createComposerStore(\n () => toValue(options),\n () => provided.value\n );\n const state = shallowRef(store.getState());\n onScopeDispose(\n store.subscribe(() => (state.value = store.getState())),\n true\n );\n\n return {\n run: computed(() => state.value.runs[0] ?? null),\n runs: computed(() => state.value.runs),\n submit: store.submit,\n cancel: store.cancel,\n /** `undefined` without reasoning, so the Composer hides its Enhance button. */\n enhance: computed(() => (pickReasoning(toValue(options), provided.value) ? store.enhance : undefined)),\n enhancing: computed(() => state.value.enhancing),\n routing: computed(() => state.value.routing),\n /** Props for an `EditCard`, and `regions` for `Composer`. `null` when there's no `editImage`. */\n edit: computed(() => store.edit(state.value, toValue(options).editImage)),\n };\n}\n\nexport type UseComposerReturn = ReturnType<typeof useComposer>;\n","import { computed, onScopeDispose, shallowRef, toValue, type MaybeRefOrGetter } from \"vue\";\nimport { createMediaAnalyzerStore, type MediaAnalyzerOptions } from \"@chai-ui/core\";\nimport { useReasoning } from \"./reasoning.js\";\n\nexport type UseMediaAnalyzerOptions = MediaAnalyzerOptions;\n\n/**\n * The Vue binding for `createMediaAnalyzerStore` in `@chai-ui/core`, behind\n * `MediaAnalyzer`'s submit: `prompt` fills in as the text streams.\n */\nexport function useMediaAnalyzer(options: MaybeRefOrGetter<UseMediaAnalyzerOptions> = {}) {\n const provided = useReasoning();\n const store = createMediaAnalyzerStore(\n () => toValue(options),\n () => provided.value\n );\n const state = shallowRef(store.getState());\n onScopeDispose(\n store.subscribe(() => (state.value = store.getState())),\n true\n );\n\n return {\n analyzing: computed(() => state.value.analyzing),\n error: computed(() => state.value.error),\n prompt: computed(() => state.value.prompt),\n submit: store.submit,\n cancel: store.cancel,\n reset: store.reset,\n };\n}\n\nexport type UseMediaAnalyzerReturn = ReturnType<typeof useMediaAnalyzer>;\n"],"names":["_renderSlot","_createElementBlock","_createElementVNode","_createBlock","_unref","_openBlock","_Fragment","_renderList","_hoisted_3","_resolveDynamicComponent","_createTextVNode","_toDisplayString","_hoisted_4","_hoisted_1","_createVNode","_hoisted_2","_hoisted_5","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","_hoisted_13","_normalizeStyle","_normalizeClass","_hoisted_6","Toggle","_hoisted_14","_hoisted_15","_hoisted_16","Chip","VoiceWaveform","PromptField","_hoisted_11","AttachMenu","SearchMenu","_mergeProps","VoiceButton","PageSlide","RegionShape","Pagination","ExpandedImage","IconButton","VideoPlayer","h","ResultText","ResultMedia","MoreMenu"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/reasoning.ts","../src/ChaiProvider.vue","../src/dismiss.ts","../src/icons.ts","../src/composer/AttachMenu.vue","../src/composer/Chip.vue","../src/composer/PromptField.vue","../src/composer/VoiceButton.vue","../src/composer/VoiceWaveform.vue","../src/primitives/Toggle.vue","../src/primitives/SearchMenu.vue","../src/Composer.vue","../src/edit-card/ExpandedImage.vue","../src/edit-card/RegionShape.vue","../src/PageSlide.vue","../src/page-slide.ts","../src/primitives/Pagination.vue","../src/EditCard.vue","../src/result-card/IconButton.vue","../src/result-card/MoreMenu.vue","../src/result-card/ResultText.vue","../src/result-card/VideoPlayer.vue","../src/result-card/ResultMedia.vue","../src/ResultCard.vue","../src/MediaAnalyzer.vue","../src/useComposer.ts","../src/useMediaAnalyzer.ts"],"sourcesContent":["import { computed, inject, type ComputedRef, type InjectionKey } from \"vue\";\nimport type { Reasoning } from \"@chai-ui/core\";\n\nexport const reasoningKey: InjectionKey<ComputedRef<Reasoning>> = Symbol(\"chai-reasoning\");\n\n/** The nearest `ChaiProvider`'s reasoning engine and models; `undefined` outside one. */\nexport function useReasoning(): ComputedRef<Reasoning | undefined> {\n const provided = inject(reasoningKey, null);\n return computed(() => provided?.value);\n}\n","<script setup lang=\"ts\">\nimport { computed, provide } from \"vue\";\nimport { createReasoning, reasoningEngineFor, type GenerationEngine, type MediaKind } from \"@chai-ui/core\";\nimport { reasoningKey } from \"./reasoning.js\";\n\n/** The reasoning engine and models every CHAI component inside shares. Same props as React's `ChaiProvider`. */\nconst props = defineProps<{\n /** Text, image and routing model. Defaults to `DEFAULT_REASONING_MODEL`. */\n reasoningModel?: string;\n /** Per-attachment-kind models, merged over `DEFAULT_REASONING_MODEL_BY_KIND` one kind at a time. */\n reasoningModelByKind?: Partial<Record<MediaKind, string>>;\n /** The engine the reasoning models run on. Defaults to OpenRouter, independent of the generation engine. */\n reasoningEngine?: GenerationEngine;\n}>();\n\n// Created once, and again only when a different engine is passed.\nconst engine = computed(() => reasoningEngineFor({ reasoningEngine: props.reasoningEngine }));\nprovide(\n reasoningKey,\n computed(() => createReasoning(props, engine.value))\n);\n</script>\n\n<template>\n <slot />\n</template>\n","import { onScopeDispose, watch, type Ref } from \"vue\";\n\n/** While `open`, a press outside `root` or Escape calls `close`: the inline menus' popover behavior. */\nexport function useDismiss(root: Ref<HTMLElement | undefined>, open: Ref<boolean>, close: () => void) {\n function onPointerDown(e: PointerEvent) {\n if (!root.value?.contains(e.target as Node)) close();\n }\n function onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") close();\n }\n function listen(on: boolean) {\n if (on) {\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeydown);\n } else {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeydown);\n }\n }\n watch(open, listen);\n onScopeDispose(() => listen(false));\n}\n","/**\n * The same inline `currentColor` SVGs as the React package's icons, as\n * functional components. Media-action icons are traced from the result\n * card design; the `0 -960 960 960` ones are Material Symbols paths.\n */\nimport { h, type FunctionalComponent } from \"vue\";\n\n/** One shape's attributes; `tag` picks rect or circle over the default path. */\ntype Shape = Record<string, string>;\n\nconst icon =\n (viewBox: string, shapes: Shape[], traced = false): FunctionalComponent =>\n () =>\n h(\n \"svg\",\n { viewBox, \"aria-hidden\": \"true\", ...(traced && { fill: \"none\" }) },\n shapes.map(({ tag = \"path\", ...attrs }) => h(tag, attrs))\n );\n\nexport const DownloadIcon = icon(\"0 0 18 18\", [{ \"d\": \"M8.99961 11.9999L5.24961 8.2499L6.29961 7.1624L8.24961 9.1124V2.9999H9.74961V9.1124L11.6996 7.1624L12.7496 8.2499L8.99961 11.9999ZM2.99961 14.9999V11.2499H4.49961V13.4999H13.4996V11.2499H14.9996V14.9999H2.99961Z\", \"fill\": \"currentColor\" }], true);\nexport const ShareIcon = icon(\"0 0 18 18\", [{ \"d\": \"M2.99961 16.4999V5.9999H6.74961V7.4999H4.49961V14.9999H13.4996V7.4999H11.2496V5.9999H14.9996V16.4999H2.99961ZM8.24961 11.9999V3.61865L7.04961 4.81865L5.99961 3.7499L8.99961 0.749904L11.9996 3.7499L10.9496 4.81865L9.74961 3.61865V11.9999H8.24961Z\", \"fill\": \"currentColor\" }], true);\nexport const ExpandIcon = icon(\"0 0 18 18\", [{ \"d\": \"M2 6V2h4M12 2h4v4M16 12v4h-4M6 16H2v-4\", \"stroke\": \"currentColor\", \"stroke-width\": \"1.6\", \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" }], true);\nexport const ZoomInIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M796-121 533-384q-30 26-69.96 40.5Q423.08-329 378-329q-108.16 0-183.08-75Q120-479 120-585t75-181q75-75 181.5-75t181 75Q632-691 632-584.85 632-542 618-502q-14 40-42 75l264 262-44 44ZM377-389q81.25 0 138.13-57.5Q572-504 572-585t-56.87-138.5Q458.25-781 377-781q-82.08 0-139.54 57.5Q180-666 180-585t57.46 138.5Q294.92-389 377-389Zm-31-85v-82h-82v-60h82v-81h60v81h81v60h-81v82h-60Z\", \"fill\": \"currentColor\" }]);\nexport const ZoomOutIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M796-121 533-384q-30 26-70 40.5T378-329q-108 0-183-75t-75-181q0-106 75-181t182-75q106 0 180.5 75T632-585q0 43-14 83t-42 75l264 262-44 44ZM377-389q81 0 138-57.5T572-585q0-81-57-138.5T377-781q-82 0-139.5 57.5T180-585q0 81 57.5 138.5T377-389ZM275-556v-60h201v60H275Z\", \"fill\": \"currentColor\" }]);\nexport const AddIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z\", \"fill\": \"currentColor\" }]);\nexport const DeleteIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M261-120q-24.75 0-42.37-17.63Q201-155.25 201-180v-570h-41v-60h188v-30h264v30h188v60h-41v570q0 24-18 42t-42 18H261Zm438-630H261v570h438v-570ZM367-266h60v-399h-60v399Zm166 0h60v-399h-60v399ZM261-750v570-570Z\", \"fill\": \"currentColor\" }]);\nexport const VisibilityIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M600.5-379.5Q650-429 650-500t-49.5-120.5Q551-670 480-670t-120.5 49.5Q310-571 310-500t49.5 120.5Q409-330 480-330t120.5-49.5Zm-200-41Q368-453 368-500t32.5-79.5Q433-612 480-612t79.5 32.5Q592-547 592-500t-32.5 79.5Q527-388 480-388t-79.5-32.5ZM216-283Q98-366 40-500q58-134 176-217t264-83q146 0 264 83t176 217q-58 134-176 217t-264 83q-146 0-264-83Zm264-217Zm222.5 174.5Q804-391 857-500q-53-109-154.5-174.5T480-740q-121 0-222.5 65.5T102-500q54 109 155.5 174.5T480-260q121 0 222.5-65.5Z\", \"fill\": \"currentColor\" }]);\nexport const VisibilityOffIcon = icon(\"0 -960 960 960\", [{ \"d\": \"m629-419-44-44q26-71-27-118t-115-24l-44-44q17-11 38-16t43-5q71 0 120.5 49.5T650-500q0 22-5.5 43.5T629-419Zm129 129-40-40q49-36 85.5-80.5T857-500q-50-111-150-175.5T490-740q-42 0-86 8t-69 19l-46-47q35-16 89.5-28T485-800q143 0 261.5 81.5T920-500q-26 64-67 117t-95 93Zm58 226L648-229q-35 14-79 21.5t-89 7.5q-146 0-265-81.5T40-500q20-52 55.5-101.5T182-696L56-822l42-43 757 757-39 44ZM223-654q-37 27-71.5 71T102-500q51 111 153.5 175.5T488-260q33 0 65-4t48-12l-64-64q-11 5-27 7.5t-30 2.5q-70 0-120-49t-50-121q0-15 2.5-30t7.5-27l-97-97Zm305 142Zm-116 58Z\", \"fill\": \"currentColor\" }]);\nexport const CheckSymbolIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M378-246 154-470l43-43 181 181 384-384 43 43-427 427Z\", \"fill\": \"currentColor\" }]);\nexport const CloseSymbolIcon = icon(\"0 -960 960 960\", [{ \"d\": \"m249-207-42-42 231-231-231-231 42-42 231 231 231-231 42 42-231 231 231 231-42 42-231-231-231 231Z\", \"fill\": \"currentColor\" }]);\n/** Material Symbols \"mic\" — voice input. */\nexport const MicIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M408-453.92q-29-30.91-29-75.08v-251q0-41.67 29.44-70.83Q437.88-880 479.94-880t71.56 29.17Q581-821.67 581-780v251q0 44.17-29 75.08Q523-423 480-423t-72-30.92ZM480-651Zm-30 531v-136q-106-11-178-89t-72-184h60q0 91 64.29 153t155.5 62q91.21 0 155.71-62Q700-438 700-529h60q0 106-72 184t-178 89v136h-60Zm59.5-376.5Q521-510 521-529v-251q0-17-11.79-28.5T480-820q-17.42 0-29.21 11.5T439-780v251q0 19 11.5 32.5T480-483q18 0 29.5-13.5Z\", \"fill\": \"currentColor\" }]);\nexport const StopIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M240-240v-480h480v480H240Z\", \"fill\": \"currentColor\" }]);\nexport const ThumbUpIcon = icon(\"0 0 18 18\", [{ \"d\": \"M5.25039 15.7502V6.00019L10.5004 0.750193L11.8879 2.13769L10.9129 6.00019H17.2504V9.30019L14.5129 15.7502H5.25039ZM6.75039 14.2502H13.5004L15.7504 9.00019V7.50019H9.00039L10.0129 3.37519L6.75039 6.63769V14.2502ZM1.50039 15.7502V6.00019H5.25039V7.50019H3.00039V14.2502H5.25039V15.7502H1.50039Z\", \"fill\": \"currentColor\" }], true);\nexport const ThumbDownIcon = icon(\"0 0 18 18\", [{ \"d\": \"M2.24961 12C1.84961 12 1.49961 11.85 1.19961 11.55C0.899615 11.25 0.749615 10.9 0.749615 10.5V9C0.749615 8.9125 0.762115 8.81875 0.787115 8.71875C0.812115 8.61875 0.837115 8.525 0.862115 8.4375L3.11211 3.15C3.22461 2.9 3.41211 2.6875 3.67461 2.5125C3.93711 2.3375 4.21211 2.25 4.49961 2.25H12.7496V12L8.24961 16.4625C8.06211 16.65 7.84024 16.7594 7.58399 16.7906C7.32774 16.8219 7.08086 16.775 6.84336 16.65C6.60586 16.525 6.43086 16.35 6.31836 16.125C6.20586 15.9 6.18086 15.6688 6.24336 15.4313L7.08711 12H2.24961ZM11.2496 11.3625V3.75H4.49961L2.24961 9V10.5H8.99961L7.98711 14.625L11.2496 11.3625ZM14.9996 2.25C15.4121 2.25 15.7652 2.39688 16.059 2.69063C16.3527 2.98438 16.4996 3.3375 16.4996 3.75V10.5C16.4996 10.9125 16.3527 11.2656 16.059 11.5594C15.7652 11.8531 15.4121 12 14.9996 12H12.7496V10.5H14.9996V3.75H12.7496V2.25H14.9996Z\", \"fill\": \"currentColor\" }], true);\nexport const RefreshIcon = icon(\"0 0 18 18\", [{ \"d\": \"M8.99961 15.0002C7.32461 15.0002 5.90586 14.4189 4.74336 13.2564C3.58086 12.0939 2.99961 10.6752 2.99961 9.00019C2.99961 7.32519 3.58086 5.90644 4.74336 4.74394C5.90586 3.58144 7.32461 3.00019 8.99961 3.00019C9.86211 3.00019 10.6871 3.17832 11.4746 3.53457C12.2621 3.89082 12.9371 4.40019 13.4996 5.06269V3.00019H14.9996V8.25019H9.74961V6.75019H12.8996C12.4996 6.05019 11.9527 5.50019 11.259 5.10019C10.5652 4.70019 9.81211 4.50019 8.99961 4.50019C7.74961 4.50019 6.68711 4.93769 5.81211 5.81269C4.93711 6.68769 4.49961 7.75019 4.49961 9.00019C4.49961 10.2502 4.93711 11.3127 5.81211 12.1877C6.68711 13.0627 7.74961 13.5002 8.99961 13.5002C9.96211 13.5002 10.8309 13.2252 11.6059 12.6752C12.3809 12.1252 12.9246 11.4002 13.2371 10.5002H14.8121C14.4621 11.8252 13.7496 12.9064 12.6746 13.7439C11.5996 14.5814 10.3746 15.0002 8.99961 15.0002Z\", \"fill\": \"currentColor\" }], true);\nexport const MoreHorizIcon = icon(\"0 0 24 24\", [{ \"d\": \"M6.41473 14C5.86473 14 5.3939 13.8042 5.00223 13.4125C4.61056 13.0208 4.41473 12.55 4.41473 12C4.41473 11.45 4.61056 10.9792 5.00223 10.5875C5.3939 10.1958 5.86473 10 6.41473 10C6.96473 10 7.43556 10.1958 7.82723 10.5875C8.2189 10.9792 8.41473 11.45 8.41473 12C8.41473 12.55 8.2189 13.0208 7.82723 13.4125C7.43556 13.8042 6.96473 14 6.41473 14ZM12.4147 14C11.8647 14 11.3939 13.8042 11.0022 13.4125C10.6106 13.0208 10.4147 12.55 10.4147 12C10.4147 11.45 10.6106 10.9792 11.0022 10.5875C11.3939 10.1958 11.8647 10 12.4147 10C12.9647 10 13.4356 10.1958 13.8272 10.5875C14.2189 10.9792 14.4147 11.45 14.4147 12C14.4147 12.55 14.2189 13.0208 13.8272 13.4125C13.4356 13.8042 12.9647 14 12.4147 14ZM18.4147 14C17.8647 14 17.3939 13.8042 17.0022 13.4125C16.6106 13.0208 16.4147 12.55 16.4147 12C16.4147 11.45 16.6106 10.9792 17.0022 10.5875C17.3939 10.1958 17.8647 10 18.4147 10C18.9647 10 19.4356 10.1958 19.8272 10.5875C20.2189 10.9792 20.4147 11.45 20.4147 12C20.4147 12.55 20.2189 13.0208 19.8272 13.4125C19.4356 13.8042 18.9647 14 18.4147 14Z\", \"fill\": \"currentColor\" }], true);\nexport const InfoIcon = icon(\"0 0 22 22\", [{ \"d\": \"M10.0833 6.41667H11.9167V8.25H10.0833V6.41667ZM10.0833 10.0833H11.9167V15.5833H10.0833V10.0833ZM11 1.83333C5.94 1.83333 1.83333 5.94 1.83333 11C1.83333 16.06 5.94 20.1667 11 20.1667C16.06 20.1667 20.1667 16.06 20.1667 11C20.1667 5.94 16.06 1.83333 11 1.83333ZM11 18.3333C6.9575 18.3333 3.66667 15.0425 3.66667 11C3.66667 6.9575 6.9575 3.66667 11 3.66667C15.0425 3.66667 18.3333 6.9575 18.3333 11C18.3333 15.0425 15.0425 18.3333 11 18.3333Z\", \"fill\": \"currentColor\" }], true);\nexport const CloseIcon = icon(\"0 0 14 14\", [{ \"d\": \"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\", \"fill\": \"currentColor\" }], true);\nexport const CopyIcon = icon(\"0 0 8.60253 11.6462\", [{ \"d\": \"M1.01206 11.6462C0.733745 11.6462 0.495405 11.5323 0.29704 11.3044C0.0990134 11.0761 0 10.8019 0 10.4816V2.32924H1.01206V10.4816H6.57841V11.6462H1.01206ZM3.03619 9.31697C2.75787 9.31697 2.5197 9.20303 2.32167 8.97515C2.12331 8.74689 2.02413 8.47262 2.02413 8.15235V1.16462C2.02413 0.84435 2.12331 0.570082 2.32167 0.341816C2.5197 0.113939 2.75787 0 3.03619 0H7.59047C7.86879 0 8.10713 0.113939 8.30549 0.341816C8.50352 0.570082 8.60253 0.84435 8.60253 1.16462V8.15235C8.60253 8.47262 8.50352 8.74689 8.30549 8.97515C8.10713 9.20303 7.86879 9.31697 7.59047 9.31697H3.03619ZM3.03619 8.15235H7.59047V1.16462H3.03619V8.15235Z\", \"fill\": \"currentColor\" }], true);\nexport const CheckIcon = icon(\"0 0 18 18\", [{ \"d\": \"M7.1625 13.5L2.8875 9.225L3.95625 8.15625L7.1625 11.3625L14.0438 4.48125L15.1125 5.55L7.1625 13.5Z\", \"fill\": \"currentColor\" }], true);\nexport const PlayIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M320-200v-560l440 280-440 280Z\", \"fill\": \"currentColor\" }]);\nexport const ArrowForwardIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M686-450H160v-60h526L438-758l42-42 320 320-320 320-42-42 248-248Z\", \"fill\": \"currentColor\" }]);\nexport const RemoveIcon = icon(\"0 0 16 16\", [{ \"d\": \"M3.5 3.5l9 9m0-9-9 9\", \"stroke\": \"currentColor\", \"stroke-width\": \"3.5\", \"stroke-linecap\": \"round\" }], true);\nexport const VideoIcon = icon(\"0 0 24 24\", [{ \"tag\": \"rect\", \"x\": \"2.5\", \"y\": \"5\", \"width\": \"19\", \"height\": \"14\", \"rx\": \"2\", \"stroke\": \"currentColor\", \"stroke-width\": \"1.5\" }, { \"d\": \"M10 9.5v5l4.5-2.5-4.5-2.5Z\", \"fill\": \"currentColor\" }], true);\nexport const AudioIcon = icon(\"0 0 24 24\", [{ \"d\": \"M9 18V5l12-2v13M9 18a3 3 0 1 1-6 0 3 3 0 0 1 6 0Zm12-2a3 3 0 1 1-6 0 3 3 0 0 1 6 0Z\", \"stroke\": \"currentColor\", \"stroke-width\": \"1.5\", \"stroke-linecap\": \"round\", \"stroke-linejoin\": \"round\" }], true);\nexport const MixedMediaIcon = icon(\"0 0 24.1904 24.3948\", [{ \"d\": \"M2.90401 23.3661C3.05621 23.765 3.35538 24.0825 3.7464 24.2557C3.95634 24.3502 4.17678 24.3948 4.39985 24.3948C4.59404 24.3948 4.78561 24.3581 4.97194 24.2872L14.4167 20.6762C15.2407 20.3613 15.6554 19.4323 15.3405 18.6083L12.543 11.2918C12.3908 10.8929 12.0916 10.5753 11.7006 10.4021C11.3096 10.2289 10.8739 10.2158 10.4751 10.368L1.03027 13.9817C0.63138 14.1339 0.313842 14.433 0.14064 14.824C-0.0351869 15.2151 -0.045684 15.6507 0.106524 16.0496L2.90401 23.3661ZM0.859692 15.1442C0.948918 14.9448 1.109 14.7926 1.31107 14.7165L10.7559 11.1054C10.8503 11.0687 10.95 11.0503 11.0471 11.0503C11.16 11.0503 11.2728 11.074 11.3778 11.1212C11.5773 11.2104 11.7295 11.3705 11.8056 11.5752L13.9811 17.262L10.294 14.9474C9.92658 14.7165 9.48308 14.6718 9.07631 14.8293C8.66955 14.9841 8.37038 15.3122 8.24966 15.7294L7.76155 17.43L6.26308 16.4905C5.89568 16.2595 5.45218 16.2149 5.04542 16.3724C4.63865 16.5272 4.33949 16.8552 4.21877 17.2725L3.01685 21.4582L0.843947 15.7688C0.765218 15.5667 0.773091 15.3437 0.862317 15.1468L0.859692 15.1442ZM14.6057 18.8917C14.7657 19.3116 14.5558 19.7839 14.1359 19.944L4.69114 23.555C4.48907 23.6338 4.26601 23.6259 4.06919 23.5367C3.86974 23.4474 3.71753 23.2873 3.64143 23.0827L3.57845 22.9199L7.24194 21.5186L14.5453 18.7263L14.6083 18.8891L14.6057 18.8917ZM7.69594 20.503L9.00546 15.9446C9.05532 15.7662 9.18391 15.6271 9.35711 15.5615C9.42534 15.5352 9.4962 15.5221 9.56705 15.5221C9.67465 15.5221 9.78224 15.551 9.87672 15.6113L13.8945 18.1333L7.69857 20.503H7.69594ZM6.77482 20.8546L3.66505 22.0434L4.97456 17.4851C5.02442 17.3066 5.15301 17.1675 5.32622 17.1019C5.39445 17.0757 5.4653 17.0626 5.53616 17.0626C5.64375 17.0626 5.75135 17.0914 5.84582 17.1518L7.53586 18.212L6.77744 20.852L6.77482 20.8546Z\", \"fill\": \"currentColor\" }, { \"d\": \"M6.70667 15.8872C6.70667 15.8872 6.71716 15.8872 6.72241 15.8872C7.04782 15.882 7.34961 15.7534 7.57793 15.5198C7.80624 15.2863 7.92695 14.9819 7.92171 14.6565C7.91646 14.331 7.78787 14.0293 7.55431 13.8009C7.32075 13.5753 7.00846 13.4493 6.69092 13.4572C6.36551 13.4624 6.06372 13.591 5.8354 13.8246C5.60709 14.0581 5.48638 14.3625 5.49162 14.6879C5.49687 15.0134 5.62546 15.3152 5.85902 15.5435C6.08734 15.7665 6.38913 15.8872 6.70667 15.8872ZM6.70667 14.2444C6.81951 14.2444 6.92448 14.2864 7.00583 14.3652C7.08719 14.4439 7.13442 14.5515 7.13442 14.667C7.13442 14.7824 7.09243 14.89 7.01371 14.9714C6.93498 15.0527 6.82738 15.1 6.71191 15.1C6.5912 15.1 6.48885 15.058 6.4075 14.9792C6.32614 14.9005 6.27891 14.7929 6.27891 14.6775C6.27891 14.562 6.3209 14.4544 6.39962 14.373C6.47835 14.2917 6.58595 14.2444 6.70142 14.2444H6.70667Z\", \"fill\": \"currentColor\" }, { \"d\": \"M23.9034 19.6056C23.8981 19.5819 23.885 19.5636 23.8797 19.5399C23.8797 19.5137 23.8745 19.4901 23.8692 19.4638L22.7408 15.0026L22.2894 13.2181C22.2606 13.1052 22.1845 13.0107 22.0821 12.9609C21.9771 12.911 21.8564 12.9084 21.7515 12.953L16.6236 15.1994C16.4478 15.2755 16.3533 15.4697 16.4005 15.656L16.8519 17.4405C16.8519 17.4405 16.8572 17.451 16.8598 17.4589C16.8598 17.4668 16.8598 17.472 16.8624 17.4799L17.794 21.1644C17.4686 21.1565 17.1039 21.2562 16.7417 21.4662C15.8862 21.9569 15.3692 22.836 15.5372 23.5105C15.6106 23.8018 15.8048 24.0275 16.083 24.1456C16.23 24.2085 16.39 24.2374 16.5633 24.2374C16.8808 24.2374 17.2324 24.1351 17.5815 23.933C18.437 23.4422 18.954 22.5631 18.786 21.8887C18.7808 21.8651 18.7676 21.8467 18.7624 21.8231C18.7624 21.7968 18.7571 21.7732 18.7519 21.747L17.6969 17.5717L22.0926 15.6455L22.9114 18.8812C22.586 18.8734 22.2212 18.9731 21.859 19.183C21.0035 19.6738 20.4865 20.5529 20.6545 21.2274C20.728 21.5187 20.9222 21.7443 21.2004 21.8624C21.3473 21.9254 21.51 21.9543 21.6806 21.9543C21.9981 21.9543 22.3498 21.8519 22.6988 21.6499C23.5543 21.1591 24.0713 20.28 23.9007 19.6056H23.9034ZM21.5074 21.1355C21.4549 21.1145 21.4313 21.0856 21.4182 21.0332C21.3552 20.7812 21.6412 20.2144 22.2501 19.8654C22.4967 19.7236 22.7198 19.6685 22.8799 19.6685C22.9481 19.6685 23.0059 19.679 23.0505 19.6974C23.103 19.7184 23.1266 19.7473 23.1397 19.7997C23.2027 20.0517 22.9166 20.6185 22.3078 20.9676C21.9561 21.1696 21.6517 21.1985 21.5074 21.1355ZM17.5001 16.7976L17.2456 15.7872L21.6412 13.861L21.8958 14.8713L17.5001 16.7976ZM16.39 23.4186C16.3376 23.3976 16.3139 23.3688 16.3008 23.3163C16.2378 23.0644 16.5239 22.4975 17.1327 22.1485C17.3794 22.0068 17.6025 21.9517 17.7625 21.9517C17.8308 21.9517 17.8885 21.9622 17.9331 21.9805C17.9856 22.0015 18.0092 22.0304 18.0224 22.0829C18.0853 22.3348 17.7993 22.9016 17.1905 23.2507C16.8388 23.4527 16.5344 23.4816 16.39 23.4186Z\", \"fill\": \"currentColor\" }, { \"d\": \"M2.04571 7.49995C2.2504 7.54719 2.4551 7.57081 2.65192 7.57081C3.33686 7.57081 3.94831 7.30313 4.19237 6.85438C4.20549 6.83076 4.21074 6.80715 4.22124 6.78353C4.23436 6.76778 4.24748 6.75204 4.25798 6.73367L6.1737 3.23025L10.3489 4.6841L8.88721 7.35562C8.66677 7.15355 8.35973 6.99872 7.9897 6.91212C7.0817 6.70217 6.15796 6.98035 5.84042 7.55769C5.70133 7.80962 5.69083 8.09567 5.80893 8.36072C5.98475 8.75174 6.41251 9.0509 6.98723 9.18212C7.19192 9.22936 7.39662 9.25297 7.59344 9.25297C8.27837 9.25297 8.88983 8.9853 9.13389 8.53655C9.14701 8.51293 9.15226 8.48931 9.16276 8.46569C9.17588 8.44994 9.189 8.4342 9.1995 8.41583L11.2569 4.65261L12.081 3.14628C12.1361 3.04393 12.1439 2.92321 12.1019 2.81562C12.06 2.70802 11.9734 2.62404 11.8631 2.58468L6.94262 0.871025C6.76154 0.808042 6.55947 0.884146 6.46762 1.05472L5.6436 2.56106C5.6436 2.56106 5.63835 2.57156 5.63572 2.57681C5.6331 2.58206 5.62785 2.5873 5.62523 2.59255L3.94044 5.67083C3.72 5.46876 3.41296 5.31393 3.04294 5.22733C2.13494 5.01739 1.21119 5.29556 0.893651 5.8729C0.754565 6.12483 0.744067 6.41088 0.86216 6.67593C1.03799 7.06695 1.46574 7.36612 2.04046 7.49733L2.04571 7.49995ZM1.58909 6.2508C1.67306 6.09859 2.01422 5.94638 2.44722 5.94638C2.58106 5.94638 2.72277 5.96213 2.86973 5.99362C3.22926 6.0776 3.4497 6.24293 3.50743 6.37151C3.52843 6.41613 3.52056 6.445 3.50481 6.47649C3.39459 6.67593 2.84349 6.87538 2.22416 6.73367C1.86463 6.64969 1.6442 6.48436 1.58646 6.35577C1.56547 6.31116 1.57334 6.28229 1.58909 6.25342V6.2508ZM11.173 3.17777L10.7321 3.98342L6.55685 2.52957L6.99773 1.72392L11.173 3.17777ZM7.1683 8.41583C6.80878 8.33185 6.58834 8.16652 6.5306 8.03793C6.50961 7.99332 6.51748 7.96445 6.53323 7.93296C6.61721 7.78075 6.95836 7.62592 7.39137 7.62592C7.52521 7.62592 7.66692 7.64167 7.81388 7.67316C8.1734 7.75713 8.39384 7.92246 8.45158 8.05105C8.47257 8.09567 8.4647 8.12453 8.44895 8.15602C8.33873 8.35547 7.78501 8.55492 7.1683 8.41321V8.41583Z\", \"fill\": \"currentColor\" }, { \"d\": \"M13.0938 8.46027L18.1771 11.6671C18.4736 11.8535 18.8095 11.9506 19.1507 11.9506C19.2871 11.9506 19.4236 11.9348 19.5574 11.9059C20.0351 11.7983 20.4392 11.5097 20.7016 11.0977L23.9085 6.01444C24.4465 5.16155 24.1919 4.02786 23.3364 3.48988L18.2532 0.283009C17.8385 0.0232057 17.3504 -0.0633955 16.8728 0.0468243C16.3952 0.15442 15.991 0.443091 15.7286 0.855103L12.5217 5.93833C11.9838 6.79122 12.2383 7.92491 13.0938 8.46289V8.46027ZM17.046 0.813114C17.1221 0.794744 17.2008 0.786871 17.2769 0.786871C17.4711 0.786871 17.6627 0.841981 17.8307 0.946952L22.9139 4.15382C23.3994 4.46086 23.5463 5.10644 23.2393 5.59193L20.0324 10.6752C19.8828 10.9113 19.6519 11.074 19.3816 11.1344C19.1087 11.1974 18.8305 11.1475 18.5943 11.0006L13.5111 7.7937C13.0256 7.48666 12.8786 6.84108 13.1857 6.35559L16.3926 1.27236C16.5421 1.03618 16.7731 0.873472 17.0434 0.813114H17.046Z\", \"fill\": \"currentColor\" }, { \"d\": \"M16.4532 7.53394L19.353 7.78587C19.3845 7.78587 19.4133 7.78849 19.4448 7.78849C19.7991 7.78849 20.1298 7.60742 20.324 7.303C20.5313 6.97234 20.5392 6.5577 20.3397 6.2218L18.8649 3.71299C18.6785 3.39807 18.3505 3.2065 17.9857 3.20125C17.6262 3.196 17.2851 3.37708 17.0909 3.68674L15.6659 5.94625C15.4717 6.25591 15.4507 6.63643 15.6134 6.96447C15.7761 7.2925 16.091 7.50769 16.4558 7.53919L16.4532 7.53394ZM17.7548 4.104C17.8204 3.99903 17.9228 3.98591 17.9674 3.98591H17.97C18.012 3.98591 18.1196 3.99903 18.1826 4.10925L19.6574 6.61806C19.7283 6.73878 19.6784 6.84113 19.6522 6.88049C19.6285 6.91986 19.5524 7.00908 19.416 6.99596L16.5161 6.74403C16.3875 6.73353 16.3298 6.64431 16.3114 6.60494C16.2931 6.56558 16.2563 6.46586 16.3246 6.35826L17.7496 4.09876L17.7548 4.104Z\", \"fill\": \"currentColor\" }], true);\nexport const PlusIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M450-450H200v-60h250v-250h60v250h250v60H510v250h-60v-250Z\", \"fill\": \"currentColor\" }]);\nexport const RetryIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M480-160q-133 0-226.5-93.5T160-480q0-133 93.5-226.5T480-800q85 0 149 34.5T740-671v-129h60v254H546v-60h168q-38-60-97-97t-137-37q-109 0-184.5 75.5T220-480q0 109 75.5 184.5T480-220q83 0 152-47.5T728-393h62q-29 105-115 169t-195 64Z\", \"fill\": \"currentColor\" }]);\nexport const ErrorIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M503.5-289.48q9.5-9.48 9.5-23.5t-9.48-23.52q-9.48-9.5-23.5-9.5t-23.52 9.48q-9.5 9.48-9.5 23.5t9.48 23.52q9.48 9.5 23.5 9.5t23.52-9.48ZM453-433h60v-253h-60v253Zm27.27 353q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm.23-60Q622-140 721-239.5t99-241Q820-622 721.19-721T480-820q-141 0-240.5 98.81T140-480q0 141 99.5 240.5t241 99.5Zm-.5-340Z\", \"fill\": \"currentColor\" }]);\nexport const OptimizeIcon = icon(\"0 0 25 24\", [{ \"d\": \"M5 19H6.425L16.2 9.225L14.775 7.8L5 17.575V19ZM3 21V16.75L16.2 3.575C16.4 3.39167 16.6208 3.25 16.8625 3.15C17.1042 3.05 17.3583 3 17.625 3C17.8917 3 18.15 3.05 18.4 3.15C18.65 3.25 18.8667 3.4 19.05 3.6L20.425 5C20.625 5.18333 20.7708 5.4 20.8625 5.65C20.9542 5.9 21 6.15 21 6.4C21 6.66667 20.9542 6.92083 20.8625 7.1625C20.7708 7.40417 20.625 7.625 20.425 7.825L7.25 21H3ZM15.475 8.525L14.775 7.8L16.2 9.225L15.475 8.525Z\", \"fill\": \"currentColor\" }, { \"d\": \"M20 12L21.5918 15.4082L25 17L21.5918 18.5918L20 22L18.4082 18.5918L15 17L18.4082 15.4082L20 12Z\", \"fill\": \"currentColor\" }, { \"d\": \"M6 3L7.27345 5.72655L10 7L7.27345 8.27345L6 11L4.72655 8.27345L2 7L4.72655 5.72655L6 3Z\", \"fill\": \"currentColor\" }], true);\nexport const UndoIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M259-200v-60h310q70 0 120.5-46.5T740-422q0-69-50.5-115.5T569-584H274l114 114-42 42-186-186 186-186 42 42-114 114h294q95 0 163.5 64T800-422q0 94-68.5 158T568-200H259Z\", \"fill\": \"currentColor\" }]);\nexport const AttachFileIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M728-326q0 103-72.18 174.5-72.17 71.5-175 71.5Q378-80 305.5-151.5T233-326v-380q0-72.5 51.5-123.25T408-880q72 0 123.5 50.75T583-706v360q0 42-30 72t-72.5 30q-42.5 0-72.5-29.67-30-29.68-30-72.33v-370h60v370q0 17 12.5 29.5t30.64 12.5q18.14 0 30-12.5T523-346v-360q0-48-33.5-81t-81.71-33q-48.21 0-81.5 33.06T293-706v380q0 78 54.97 132T481-140q77.92 0 132.46-54Q668-248 668-326v-390h60v390Z\", \"fill\": \"currentColor\" }]);\nexport const ImageIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M180-120q-24 0-42-18t-18-42v-600q0-24 18-42t42-18h600q24 0 42 18t18 42v600q0 24-18 42t-42 18H180Zm0-60h600v-600H180v600Zm56-97h489L578-473 446-302l-93-127-117 152Zm-56 97v-600 600Z\", \"fill\": \"currentColor\" }]);\n/** Material Symbols \"globe\" — Create world. */\nexport const GlobeIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M480.27-80q-82.74 0-155.5-31.5Q252-143 197.5-197.5t-86-127.34Q80-397.68 80-480.5t31.5-155.66Q143-709 197.5-763t127.34-85.5Q397.68-880 480.5-880t155.66 31.5Q709-817 763-763t85.5 127Q880-563 880-480.27q0 82.74-31.5 155.5Q817-252 763-197.68q-54 54.31-127 86Q563-80 480.27-80Zm-.27-60q142.38 0 241.19-99.5T820-480v-13q-6 26-27.41 43.5Q771.19-432 742-432h-80q-33 0-56.5-23.5T582-512v-40H422v-80q0-33 23.5-56.5T502-712h40v-22q0-16 13.5-40t30.5-29q-25-8-51.36-12.5Q508.29-820 480-820q-141 0-240.5 98.81T140-480h150q66 0 113 47t47 113v40H330v105q34 17 71.7 26t78.3 9Z\", \"fill\": \"currentColor\" }]);\nexport const VideocamIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M140-160q-24 0-42-18t-18-42v-520q0-24 18-42t42-18h520q24 0 42 18t18 42v215l160-160v410L720-435v215q0 24-18 42t-42 18H140Zm0-60h520v-520H140v520Zm0 0v-520 520Z\", \"fill\": \"currentColor\" }]);\nexport const ContentCutIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M782-114 481-415 364-298q11 17 13.5 33t2.5 35q0 64-43 107T230-80q-64 0-107-43T80-230q0-64 43-107t107-43q18 0 35.5 5t36.5 15l116-116-118-118q-17 8-34.5 11t-35.5 3q-64 0-107-43T80-730q0-64 43-107t107-43q64 0 107 43t43 107q0 19-2.5 36T367-662l514 514v34h-99ZM599-527l-66-66 249-249h99v33L599-527ZM294-666q26-26 26-64t-26-64q-26-26-64-26t-64 26q-26 26-26 64t26 64q26 26 64 26t64-26Zm202.5 203.5Q502-468 502-476t-5.5-13.5Q491-495 483-495t-13.5 5.5Q464-484 464-476t5.5 13.5Q475-457 483-457t13.5-5.5ZM294-166q26-26 26-64t-26-64q-26-26-64-26t-64 26q-26 26-26 64t26 64q26 26 64 26t64-26Z\", \"fill\": \"currentColor\" }]);\nexport const VolumeUpIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M560-131v-62q97-28 158.5-107.5T780-481q0-101-61-181T560-769v-62q124 28 202 125.5T840-481q0 127-78 224.5T560-131ZM120-360v-240h160l200-200v640L280-360H120Zm420 48v-337q55 17 87.5 64T660-480q0 57-33 104t-87 64ZM420-648 307-540H180v120h127l113 109v-337Zm-94 168Z\", \"fill\": \"currentColor\" }]);\nexport const MusicNoteIcon = icon(\"0 -960 960 960\", [{ \"d\": \"M286.5-163.5Q243-207 243-270t43.5-106.5Q330-420 393-420q28 0 50.5 8t39.5 22v-450h234v135H543v435q0 63-43.5 106.5T393-120q-63 0-106.5-43.5Z\", \"fill\": \"currentColor\" }]);\n","<script setup lang=\"ts\">\n/** The \"+\" / \"×\" attach control: a positioned popover of the use-case actions, and the hidden file picker behind \"Add media\". */\nimport { nextTick, ref, watch, type Component } from \"vue\";\nimport { menuOpensAbove, type ComposerAttachMenuAction, type composerAttachMenuItems, type MenuPlacement } from \"@chai-ui/core\";\nimport { useDismiss } from \"../dismiss.js\";\nimport { AttachFileIcon, CloseSymbolIcon, ContentCutIcon, ImageIcon, MusicNoteIcon, PlusIcon, GlobeIcon, VideocamIcon, VolumeUpIcon } from \"../icons.js\";\n\nconst props = defineProps<{\n items: ReturnType<typeof composerAttachMenuItems>;\n /** Edit mode: one image file at a time. */\n imagesOnly?: boolean;\n disabled?: boolean;\n placement: MenuPlacement;\n}>();\nconst emit = defineEmits<{ select: [action: ComposerAttachMenuAction]; files: [files: FileList | null] }>();\n\nconst ICONS: Record<ComposerAttachMenuAction, Component> = {\n \"add-media\": AttachFileIcon,\n \"create-image\": ImageIcon,\n \"create-video\": VideocamIcon,\n \"create-world\": GlobeIcon,\n \"edit-image\": ContentCutIcon,\n \"create-speech\": VolumeUpIcon,\n \"create-music\": MusicNoteIcon,\n};\nconst open = ref(false);\nconst above = ref(false);\nconst root = ref<HTMLElement>();\nconst menu = ref<HTMLElement>();\nconst input = ref<HTMLInputElement>();\nuseDismiss(root, open, () => (open.value = false));\n\n// Up or down, before the first paint, so it never flashes on the wrong side.\nwatch(open, async (isOpen) => {\n if (!isOpen) return;\n await nextTick();\n above.value = menuOpensAbove(props.placement, root.value!.getBoundingClientRect(), menu.value!.offsetHeight, document.documentElement.clientHeight);\n});\n\nfunction pick(action: ComposerAttachMenuAction) {\n open.value = false;\n if (action === \"add-media\") input.value?.click();\n emit(\"select\", action);\n}\n\nfunction onFileChange(e: Event) {\n const el = e.target as HTMLInputElement;\n emit(\"files\", el.files);\n el.value = \"\";\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"chai-composer__attach\">\n <button\n type=\"button\"\n :class=\"['chai-composer__attach-toggle', { 'chai-composer__attach-toggle--open': open }]\"\n :disabled=\"disabled\"\n :aria-expanded=\"open\"\n aria-haspopup=\"menu\"\n :aria-label=\"open ? 'Close attach menu' : 'Add media'\"\n @click=\"open = !open\"\n >\n <CloseSymbolIcon v-if=\"open\" /><PlusIcon v-else />\n </button>\n <ul v-if=\"open\" ref=\"menu\" :class=\"['chai-composer__attach-menu', { 'chai-composer__attach-menu--above': above }]\" role=\"menu\">\n <li v-for=\"(item, i) in items\" :key=\"item.action\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" class=\"chai-composer__attach-menu-item\" @click=\"pick(item.action)\">\n <span class=\"chai-composer__attach-menu-icon\"><component :is=\"ICONS[item.action]\" /></span>{{ item.label }}\n </button>\n <hr v-if=\"item.divider && i < items.length - 1\" class=\"chai-composer__attach-menu-divider\" role=\"separator\" />\n </li>\n </ul>\n <input\n ref=\"input\"\n type=\"file\"\n :accept=\"imagesOnly ? 'image/*' : 'image/*,video/*,audio/*'\"\n :multiple=\"!imagesOnly\"\n hidden\n :disabled=\"disabled\"\n @change=\"onFileChange\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A use-case or region chip: its label, and a remove button revealed on\n * hover when it can be removed. A region chip shows its numbered badge in\n * the region's color, matching the box on the image.\n */\nimport { regionColor } from \"@chai-ui/core\";\nimport { CloseSymbolIcon } from \"../icons.js\";\n\ndefineProps<{ label: string; regionNumber?: number; removable?: boolean; disabled?: boolean }>();\nconst emit = defineEmits<{ remove: [] }>();\n</script>\n\n<template>\n <span\n :class=\"['chai-composer__chip', { 'chai-composer__chip--region': regionNumber != null }]\"\n :style=\"regionNumber != null ? { '--chai-region-color': regionColor(regionNumber) } : undefined\"\n >\n <!-- Label and button touch: whitespace between them would render as a space. -->\n <span v-if=\"regionNumber != null\" class=\"chai-composer__region-badge\" aria-hidden=\"true\">{{ regionNumber }}</span\n >{{ label }}<button\n v-if=\"removable\" type=\"button\" class=\"chai-composer__chip-remove\" :disabled=\"disabled\" :aria-label=\"`Remove ${label}`\" @click=\"emit('remove')\">\n <CloseSymbolIcon />\n </button>\n </span>\n</template>\n","<script setup lang=\"ts\">\n/**\n * One prompt textarea with its Enhance button: grows with wrapped text,\n * reveals a rewrite as it lands, and offers undo until the text is edited by\n * hand. A `heading` gives it a visible label above a filled box (a world's\n * Environment and Character); without one it's the bar's plain prompt.\n */\nimport { computed, onScopeDispose, ref, useId, watch } from \"vue\";\nimport { enhanceRevealDurationMs, MAX_ANIMATE_ENHANCE_LENGTH } from \"@chai-ui/core\";\nimport { OptimizeIcon, UndoIcon } from \"../icons.js\";\n\nconst props = defineProps<{\n value: string;\n placeholder: string;\n /** Accessible name for the plain prompt. Defaults to `placeholder`. */\n label?: string;\n heading?: string;\n note?: string;\n /** Shown under a headed field, e.g. why submit can't go yet. */\n hint?: string | null;\n onEnhance?: (value: string) => void;\n enhancing: boolean;\n disabled: boolean;\n}>();\nconst emit = defineEmits<{ change: [value: string] }>();\nconst id = useId();\n\n// Grows with wrapped text from one line, instead of a fixed row count.\nconst textarea = ref<HTMLTextAreaElement>();\nwatch(\n () => props.value,\n () => {\n const el = textarea.value;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n },\n { flush: \"post\", immediate: true }\n);\n\n// Enhance and undo. The prompt already holds the rewrite once `enhancing`\n// drops; the reveal is a decorative overlay painting it in, then gone.\nconst originalValue = ref<string | null>(null);\nconst enhancedValue = ref<string | null>(null);\nconst animatingText = ref<string | null>(null);\nconst revealedLength = ref(0);\nlet raf = 0;\n\nwatch(\n () => props.enhancing,\n (now, was) => {\n if (!was || now || originalValue.value == null || props.value === originalValue.value) return;\n const value = props.value;\n enhancedValue.value = value;\n // Long rewrites and reduced-motion requests appear at once.\n if (value.length > MAX_ANIMATE_ENHANCE_LENGTH || window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches) return;\n animatingText.value = value;\n revealedLength.value = 0;\n const duration = enhanceRevealDurationMs(value.length);\n const start = performance.now();\n const tick = (time: number) => {\n revealedLength.value = Math.min(value.length, Math.floor(((time - start) / duration) * value.length));\n if (revealedLength.value < value.length) raf = requestAnimationFrame(tick);\n else animatingText.value = null;\n };\n raf = requestAnimationFrame(tick);\n }\n);\nonScopeDispose(() => cancelAnimationFrame(raf));\n\nconst animating = computed(() => animatingText.value != null);\nconst isEnhanced = computed(() => !animating.value && enhancedValue.value != null && props.value === enhancedValue.value);\nconst enhanceBusy = computed(() => props.enhancing || animating.value);\nconst optimizeName = computed(\n () => `${isEnhanced.value ? \"Revert to original\" : \"Optimize\"} ${props.heading ? props.heading.toLowerCase() : \"prompt\"}`\n);\n\nfunction onOptimizeClick() {\n if (isEnhanced.value) {\n const original = originalValue.value;\n enhancedValue.value = null;\n originalValue.value = null;\n if (original != null) emit(\"change\", original);\n return;\n }\n originalValue.value = props.value; // for undo, before the rewrite lands\n props.onEnhance?.(props.value);\n}\n</script>\n\n<template>\n <!-- A world's labeled field: heading and Enhance above a filled box. -->\n <div v-if=\"heading\" class=\"chai-composer__world-field\">\n <div class=\"chai-composer__world-field-head\">\n <label :for=\"id\" class=\"chai-composer__world-field-label\"><strong>{{ heading }}</strong> {{ note }}</label>\n <!-- Optimize, or once a rewrite lands, undo it: until the text is edited by hand. -->\n <button\n v-if=\"onEnhance\"\n type=\"button\"\n :class=\"['chai-composer__optimize', { 'chai-composer__optimize--active': enhanceBusy }]\"\n :disabled=\"disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)\"\n :aria-label=\"optimizeName\"\n :title=\"optimizeName\"\n @click=\"onOptimizeClick\"\n >\n <UndoIcon v-if=\"isEnhanced\" /><OptimizeIcon v-else />\n </button>\n </div>\n <div class=\"chai-composer__field chai-composer__field--boxed\">\n <textarea\n :id=\"id\"\n ref=\"textarea\"\n :class=\"['chai-composer__input chai-composer__type', { 'chai-composer__input--revealing': animating }]\"\n :value=\"value\"\n :placeholder=\"placeholder\"\n :aria-describedby=\"hint ? `${id}-hint` : undefined\"\n rows=\"1\"\n :disabled=\"disabled || animating\"\n @input=\"emit('change', ($event.target as HTMLTextAreaElement).value)\"\n />\n <div v-if=\"animating\" class=\"chai-composer__reveal chai-composer__type\" aria-hidden=\"true\">\n <span class=\"chai-composer__reveal-text\">{{ animatingText!.slice(0, revealedLength) }}</span>\n </div>\n </div>\n <p v-if=\"hint\" :id=\"`${id}-hint`\" class=\"chai-composer__field-hint\">{{ hint }}</p>\n </div>\n\n <div v-else class=\"chai-composer__field\">\n <textarea\n :id=\"id\"\n ref=\"textarea\"\n :class=\"['chai-composer__input chai-composer__type', { 'chai-composer__input--revealing': animating }]\"\n :value=\"value\"\n :placeholder=\"placeholder\"\n :aria-label=\"label ?? placeholder\"\n rows=\"1\"\n :disabled=\"disabled || animating\"\n @input=\"emit('change', ($event.target as HTMLTextAreaElement).value)\"\n />\n <!-- The Enhance reveal: decorative, so hidden from screen readers, which read the textarea's final text. -->\n <div v-if=\"animating\" class=\"chai-composer__reveal chai-composer__type\" aria-hidden=\"true\">\n <span class=\"chai-composer__reveal-text\">{{ animatingText!.slice(0, revealedLength) }}</span>\n </div>\n <!-- Optimize, or once a rewrite lands, undo it: until the prompt is edited by hand. -->\n <button\n v-if=\"onEnhance\"\n type=\"button\"\n :class=\"['chai-composer__optimize', { 'chai-composer__optimize--active': enhanceBusy }]\"\n :disabled=\"disabled || (isEnhanced ? false : !value.trim() || enhanceBusy)\"\n :aria-label=\"optimizeName\"\n :title=\"optimizeName\"\n @click=\"onOptimizeClick\"\n >\n <UndoIcon v-if=\"isEnhanced\" /><OptimizeIcon v-else />\n </button>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** The mic: click to record; while recording, a stop button that transcribes; while transcribing, a spinner that cancels. */\nimport { computed } from \"vue\";\nimport type { VoiceInput, VoiceInputState } from \"@chai-ui/core\";\nimport { MicIcon, StopIcon } from \"../icons.js\";\n\nconst props = defineProps<{ voice: VoiceInput; state: VoiceInputState; disabled?: boolean }>();\n\nconst label = computed(() =>\n props.state.status === \"recording\"\n ? \"Stop recording and transcribe\"\n : props.state.status === \"transcribing\"\n ? \"Cancel transcription\"\n : \"Start voice input\"\n);\n\nfunction onClick() {\n const { status } = props.state;\n if (status === \"recording\") props.voice.stop();\n else if (status === \"transcribing\") props.voice.cancel();\n else {\n props.voice.dismiss();\n void props.voice.start();\n }\n}\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\" && props.state.status === \"recording\") props.voice.cancel();\n}\n</script>\n\n<template>\n <div class=\"chai-composer__voice\" :data-status=\"state.status\">\n <button\n type=\"button\"\n class=\"chai-composer__voice-button\"\n :disabled=\"disabled\"\n :aria-label=\"label\"\n :title=\"label\"\n @click=\"onClick\"\n @keydown=\"onKeydown\"\n >\n <span v-if=\"state.status === 'transcribing'\" class=\"chai-composer__voice-spinner\" aria-hidden=\"true\" /><StopIcon\n v-else-if=\"state.status === 'recording'\"\n /><MicIcon v-else />\n </button>\n <!-- Announces each change of state once, not every tick of the timer. -->\n <span class=\"chai-visually-hidden\" role=\"status\">{{ state.status === \"recording\" ? \"Recording\" : state.status === \"transcribing\" ? \"Transcribing\" : \"\" }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** What replaces the prompt while recording: recent mic loudness as bars, newest on the right, and the time. Decorative. */\nimport { computed } from \"vue\";\nimport { formatVoiceElapsed, VOICE_LEVEL_COUNT } from \"@chai-ui/core\";\n\nconst props = defineProps<{ levels: number[]; elapsedMs: number }>();\nconst bars = computed(() => [...Array<number>(Math.max(0, VOICE_LEVEL_COUNT - props.levels.length)).fill(0), ...props.levels]);\n</script>\n\n<template>\n <div class=\"chai-composer__waveform\" aria-hidden=\"true\">\n <div class=\"chai-composer__waveform-bars\">\n <span v-for=\"(level, i) in bars\" :key=\"i\" class=\"chai-composer__waveform-bar\" :style=\"{ height: `${Math.max(20, level * 100)}%` }\" />\n </div>\n <span class=\"chai-composer__waveform-time\">{{ formatVoiceElapsed(elapsedMs) }}</span>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** MD3 `<md-switch>`, colored from Chai tokens by `chai-switch` in style.css. Use with `v-model`. */\nimport \"@material/web/switch/switch.js\";\n\ndefineProps<{\n modelValue: boolean;\n disabled?: boolean;\n /** The switch's accessible name, e.g. \"Auto-select model\". Required unless something else labels it. */\n ariaLabel?: string;\n}>();\nconst emit = defineEmits<{ \"update:modelValue\": [value: boolean] }>();\n</script>\n\n<template>\n <md-switch\n class=\"chai-switch\"\n :aria-label=\"ariaLabel\"\n :selected.prop=\"modelValue\"\n :disabled.prop=\"disabled ?? false\"\n show-only-selected-icon\n @change=\"emit('update:modelValue', ($event.target as HTMLInputElement & { selected: boolean }).selected)\"\n />\n</template>\n","<script setup lang=\"ts\" generic=\"T extends SearchMenuOption\">\n/**\n * The searchable menu-button pattern behind every Model/option menu: a\n * trigger opening an anchored panel with a search field (a real\n * `<md-outlined-text-field>`) over a plain option list. Hand-rolled rather\n * than `<md-menu>`, so the panel sits inline under its trigger.\n */\nimport \"@material/web/checkbox/checkbox.js\";\nimport \"@material/web/textfield/outlined-text-field.js\";\nimport { computed, nextTick, ref, watch } from \"vue\";\nimport { useDismiss } from \"../dismiss.js\";\nimport { CheckIcon } from \"../icons.js\";\nimport { menuOpensAbove, type MenuPlacement } from \"@chai-ui/core\";\nimport Toggle from \"./Toggle.vue\";\nimport type { SearchMenuOption, SearchMenuSection, SearchMenuToggleHeader } from \"./search-menu.js\";\n\nconst props = withDefaults(\n defineProps<{\n /** A flat option list. Ignored if `sections` is given. */\n options?: T[];\n /** Grouped options, each under its own header with a divider between groups. */\n sections?: SearchMenuSection<T>[];\n /** A toggle pinned above the options (e.g. \"Auto-select model\"); while on, the rows are disabled but keep their check. */\n toggleHeader?: SearchMenuToggleHeader;\n /** The checked option's id, or ids with `multiple`. */\n value: string | string[] | null;\n /** Several options can be checked: each row gets a checkbox and the panel stays open on a pick. */\n multiple?: boolean;\n triggerLabel: string;\n /** Floating label on the search field, and the panel's accessible name. */\n menuLabel: string;\n disabled?: boolean;\n /** Show the search field. Off for a short fixed list. */\n searchable?: boolean;\n /** \"outlined\" matches `.chai-btn--outlined`; \"text\" is chevron and label only. */\n triggerVariant?: \"outlined\" | \"text\";\n /** Panel width in px; longer labels ellipsize. */\n panelWidth?: number;\n /** Which way the panel opens: \"auto\" (default) below when it fits, else above when that fits, else toward the side with more room. */\n placement?: MenuPlacement;\n }>(),\n { searchable: true, triggerVariant: \"outlined\", panelWidth: 280, placement: \"auto\" }\n);\nconst emit = defineEmits<{ select: [option: T] }>();\n\nconst open = ref(false);\nconst above = ref(false);\nconst search = ref(\"\");\nconst root = ref<HTMLElement>();\nconst panel = ref<HTMLElement>();\n\n// Closing also clears the search, so the menu reopens on the full list.\nfunction close() {\n open.value = false;\n search.value = \"\";\n}\n\n// The panel opens from the trigger's left edge; near the right edge of a\n// narrow screen it shifts left to fit, keeping a 16px margin on both sides.\nwatch(open, async (isOpen) => {\n if (!isOpen) return;\n await nextTick();\n const el = panel.value!;\n const rect = el.getBoundingClientRect();\n const over = rect.right - (document.documentElement.clientWidth - 16);\n if (over > 0) el.style.left = `${-Math.min(over, Math.max(0, rect.left - 16))}px`;\n // Up or down, before the first paint, so it never flashes on the wrong side.\n above.value = menuOpensAbove(props.placement, root.value!.getBoundingClientRect(), el.offsetHeight, document.documentElement.clientHeight);\n});\n\nuseDismiss(root, open, close);\n\nconst groups = computed(() => {\n const q = search.value.trim().toLowerCase();\n const raw = props.sections ?? [{ label: \"\", options: props.options ?? [] }];\n if (!q) return raw;\n return raw\n .map((g) => ({ ...g, options: g.options.filter((o) => o.label.toLowerCase().includes(q) || o.rowLabel?.toLowerCase().includes(q)) }))\n .filter((g) => g.options.length > 0);\n});\nconst hasAnyOption = computed(() => groups.value.some((g) => g.options.length > 0));\nconst isSelected = (id: string) => (Array.isArray(props.value) ? props.value.includes(id) : id === props.value);\n\nfunction pick(option: T) {\n emit(\"select\", option);\n if (!props.multiple) close();\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"chai-search-menu\">\n <button\n type=\"button\"\n :class=\"[\n triggerVariant === 'outlined' ? 'chai-btn chai-btn--outlined' : 'chai-search-menu__trigger--text',\n 'chai-search-menu__trigger',\n { 'chai-search-menu__trigger--open': open },\n ]\"\n :disabled=\"disabled\"\n :aria-expanded=\"open\"\n @click=\"open ? close() : (open = true)\"\n >\n <span class=\"chai-search-menu__trigger-label\" :title=\"triggerLabel\">{{ triggerLabel }}</span>\n <!-- Material Symbols \"keyboard_arrow_down\". -->\n <svg :class=\"['chai-search-menu__chevron', { 'chai-search-menu__chevron--open': open }]\" viewBox=\"0 -960 960 960\" aria-hidden=\"true\">\n <path d=\"M480-344 240-584l43-43 197 197 197-197 43 43-240 240Z\" fill=\"currentColor\" />\n </svg>\n </button>\n\n <div v-if=\"open\" ref=\"panel\" class=\"chai-search-menu__panel\" :class=\"{ 'chai-search-menu__panel--above': above }\" role=\"group\" :aria-label=\"menuLabel\" :style=\"{ width: `${panelWidth}px` }\">\n <div v-if=\"toggleHeader\" class=\"chai-search-menu__toggle-header\">\n <span class=\"chai-search-menu__toggle-header-label\">{{ menuLabel }}</span>\n <span class=\"chai-search-menu__toggle-header-row\">\n <span class=\"chai-search-menu__toggle-header-text\">{{ toggleHeader.label }}</span>\n <Toggle :model-value=\"toggleHeader.value\" :aria-label=\"toggleHeader.label\" @update:model-value=\"toggleHeader.onChange\" />\n </span>\n </div>\n <md-outlined-text-field\n v-if=\"searchable\"\n class=\"chai-search-menu__search\"\n :label=\"menuLabel\"\n placeholder=\"Search\"\n :value.prop=\"search\"\n @input=\"search = ($event.target as HTMLInputElement).value\"\n >\n <span slot=\"leading-icon\" class=\"chai-search-menu__search-icon\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"11\" cy=\"11\" r=\"6.5\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"m20 20-3.6-3.6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </span>\n <button v-if=\"search\" type=\"button\" slot=\"trailing-icon\" class=\"chai-search-menu__clear\" aria-label=\"Clear search\" @click=\"search = ''\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" stroke-width=\"1.5\" />\n <path d=\"m9 9 6 6m0-6-6 6\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n </md-outlined-text-field>\n\n <ul class=\"chai-search-menu__list\">\n <li v-for=\"(group, i) in groups\" :key=\"group.label || i\">\n <p v-if=\"group.label\" class=\"chai-search-menu__section-label\">{{ group.label }}</p>\n <ul class=\"chai-search-menu__section-list\" :aria-label=\"group.label || undefined\">\n <li v-for=\"o in group.options\" :key=\"o.id\">\n <!-- Plain buttons, reached with Tab: `aria-pressed` says which are picked. -->\n <button\n type=\"button\"\n :aria-pressed=\"isSelected(o.id)\"\n :disabled=\"toggleHeader?.value\"\n :class=\"['chai-search-menu__option', { 'chai-search-menu__option--selected': !multiple && isSelected(o.id) }]\"\n @click=\"pick(o)\"\n >\n <!-- Display only: the row is the one control, so the checkbox is hidden from assistive tech and the tab order. -->\n <md-checkbox\n v-if=\"multiple\"\n class=\"chai-search-menu__checkbox\"\n :checked.prop=\"isSelected(o.id)\"\n :disabled.prop=\"toggleHeader?.value ?? false\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n />\n <span class=\"chai-search-menu__option-label\">{{ o.rowLabel ?? o.label }}</span>\n <CheckIcon v-if=\"!multiple && isSelected(o.id)\" />\n </button>\n </li>\n </ul>\n <hr v-if=\"i < groups.length - 1\" class=\"chai-search-menu__divider\" role=\"separator\" />\n </li>\n <li v-if=\"!hasAnyOption\" class=\"chai-search-menu__empty\">No matches.</li>\n </ul>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The compose bar for generative AI input: prompt field, attachments, use\n * case, model and aspect-ratio menus, Enhance, and submit, all driven by\n * which props are given. Same props as React's `Composer`, with `v-model`\n * for the prompt and `v-model:…` for attachments, use cases, models, aspect\n * ratio, auto-select and regions.\n *\n * Some controls show only with somewhere for them to go, so these listeners\n * are props, checked for: `@update:attachments` (add and remove media),\n * `@update:model-id` / `@update:model-ids` (the Model menu),\n * `voiceInput` (the mic), `@update:aspect-ratio`, `@update:character` and `@update:frame-rate` (a\n * world's fields), `@update:use-cases` and `@clear-use-case` (chip\n * remove), `@update:regions`, `@enhance` (the Enhance button), `@abort` (stop\n * while submitting) and `@attach-menu-select` (the + menu's use cases).\n */\nimport \"@material/web/fab/fab.js\";\nimport { computed, onScopeDispose, ref, shallowRef, watch } from \"vue\";\nimport {\n composerAttachmentsFromFiles,\n composerAttachMenuItems,\n composerView,\n createVoiceInput,\n type ComposerAttachment,\n type ComposerAttachMenuAction,\n type ComposerPromptField,\n type GenerationUseCase,\n type ComposerSubmitPayload,\n type ComposerUseCase,\n type ComposerView,\n type EditRegion,\n type MediaKind,\n type MenuPlacement,\n type ModelOption,\n type OutputKind,\n type ParameterOption,\n type VoiceInputConfig,\n} from \"@chai-ui/core\";\nimport AttachMenu from \"./composer/AttachMenu.vue\";\nimport Chip from \"./composer/Chip.vue\";\nimport PromptField from \"./composer/PromptField.vue\";\nimport VoiceButton from \"./composer/VoiceButton.vue\";\nimport VoiceWaveform from \"./composer/VoiceWaveform.vue\";\nimport { ArrowForwardIcon, CloseSymbolIcon, ErrorIcon, ImageIcon, MusicNoteIcon, RetryIcon, StopIcon, VideocamIcon } from \"./icons.js\";\nimport SearchMenu from \"./primitives/SearchMenu.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** The prompt text. Controlled: use `v-model`. */\n modelValue: string;\n /** Defaults to \"Describe media to create\", or edit wording when the use case is an edit. */\n placeholder?: string;\n /** The prompt field's accessible name. Defaults to `placeholder`, which disappears once the person types. */\n promptLabel?: string;\n attachments?: ComposerAttachment[];\n \"onUpdate:attachments\"?: (next: ComposerAttachment[]) => void;\n /** The use-case chip. Aspect ratio only renders for an image or video use case. */\n useCase?: ComposerUseCase | null;\n onClearUseCase?: () => void;\n /** What a submit means with no use case picked. Defaults to `TEXT_USE_CASE`. Never shown as a chip. */\n defaultUseCase?: ComposerUseCase;\n /** Image and Video from one prompt, with `useCases`, `modelsByKind` and `modelIds`: a Model menu each, and a model needed in each. Other use cases run alone (`nextUseCases`). */\n multiSelectUseCases?: boolean;\n useCases?: ComposerUseCase[];\n \"onUpdate:useCases\"?: (next: ComposerUseCase[]) => void;\n /** Models per use-case kind, for `multiSelectUseCases`. A kind left out gets Chai's suggested models. */\n modelsByKind?: Partial<Record<OutputKind, ModelOption[]>>;\n /** The end user can pick several models, each producing its own result, with `modelIds`. With `multiSelectUseCases`, several per use case. */\n multiSelectModels?: boolean;\n modelIds?: string[];\n \"onUpdate:modelIds\"?: (ids: string[]) => void;\n /** Models for the use case. Leave out for Chai's suggested Fal models; `[]` for no Model menu. */\n models?: ModelOption[];\n modelId?: string | null;\n \"onUpdate:modelId\"?: (id: string | null) => void;\n /** The model is chosen at submit: `useComposer` asks the reasoning model. Turning it on clears the pick. */\n autoSelectModel?: boolean;\n /** An \"Auto-select model\" switch at the top of the Model menu, for the end user. */\n showAutoSelectToggle?: boolean;\n \"onUpdate:autoSelectModel\"?: (value: boolean) => void;\n /** Your own labels or a shorter list; ratios the models don't take are left out either way. */\n aspectRatios?: ParameterOption<string>[];\n aspectRatio?: string | null;\n \"onUpdate:aspectRatio\"?: (value: string) => void;\n /** Shows the Enhance button; your handler runs the rewrite and updates the prompt. Gets the current text, which field, and the use case on screen (`mode`). */\n onEnhance?: (value: string, field: ComposerPromptField, mode?: GenerationUseCase) => void;\n /** True while your Enhance handler is running. */\n enhancing?: boolean;\n /** A world's character field (Create world), beside the environment (`v-model`). Shows with `v-model:character`. */\n character?: string;\n \"onUpdate:character\"?: (value: string) => void;\n /** A world's frame rate menu, from the selected models' `frameRates`. */\n frameRate?: number | null;\n \"onUpdate:frameRate\"?: (value: number) => void;\n /** Create speech's Voice menu, from the one picked model's `voices` (`v-model:speech-voice`). Not `voiceInput`, which is dictation. */\n speechVoice?: string | null;\n \"onUpdate:speechVoice\"?: (value: string) => void;\n /** Create music's Genre menu, several at once, from the picked models' `genres` (`v-model:genres`). */\n genres?: string[];\n \"onUpdate:genres\"?: (values: string[]) => void;\n /**\n * Which way the bar's menus open. \"above\" for a bar docked to the bottom\n * of the screen, \"below\" for one docked to the top. \"auto\" (default)\n * measures when a menu opens: below if it fits, else above if that fits,\n * else toward the side with more room.\n */\n menuPlacement?: MenuPlacement;\n /** The last submit's failure: submit becomes retry, and the message shows inline. */\n submitError?: string | null;\n /** Overrides the built-in \"empty prompt and no attachments\" check. Ignored while `submitError` is set. */\n submitDisabled?: boolean;\n /** True while a request is in flight: with `@abort`, submit becomes stop; without, it's disabled. */\n submitting?: boolean;\n onAbort?: () => void;\n onAttachMenuSelect?: (action: ComposerAttachMenuAction) => void;\n /** Which + menu items to show. Each still shows only when it can work. */\n attachMenuActions?: ComposerAttachMenuAction[];\n /** An edit's regions (from `useComposer`'s `edit`), shown as colored chips while editing. */\n regions?: EditRegion[];\n \"onUpdate:regions\"?: (next: EditRegion[]) => void;\n /**\n * The mic, left of submit: the transcript is added to the prompt, never\n * submitted. `{ model: \"fal-ai/wizper\" }` goes through your\n * `/api/chai/fal` route; `{ transcribe }` uses any provider. Off by\n * default, with no default model.\n */\n voiceInput?: VoiceInputConfig;\n disabled?: boolean;\n }>(),\n {\n attachments: () => [],\n useCase: null,\n useCases: () => [],\n modelIds: () => [],\n modelId: null,\n aspectRatio: null,\n character: \"\",\n frameRate: null,\n speechVoice: null,\n genres: () => [],\n menuPlacement: \"auto\",\n submitError: null,\n // Left undefined unless set: Vue would make an absent boolean `false`,\n // which reads as \"never disable\".\n submitDisabled: undefined,\n regions: () => [],\n }\n);\nconst emit = defineEmits<{\n \"update:modelValue\": [value: string];\n /** Everything Composer tracks. Also what retry sends, with the same payload, when `submitError` is set. */\n submit: [payload: ComposerSubmitPayload];\n unsupportedFile: [fileName: string];\n}>();\n\nconst view = computed(() =>\n composerView({\n ...props,\n value: props.modelValue,\n onModelChange: props[\"onUpdate:modelId\"],\n onModelIdsChange: props[\"onUpdate:modelIds\"],\n })\n);\nconst menuItems = computed(() =>\n composerAttachMenuItems(props.attachMenuActions, {\n canAddMedia: Boolean(props[\"onUpdate:attachments\"]),\n canSelect: Boolean(props.onAttachMenuSelect),\n })\n);\nconst toMenuOption = (o: { value: string; label: string }) => ({ id: o.value, label: o.label });\nconst voiceMenuOptions = computed(() =>\n view.value.voiceSections\n ? { sections: view.value.voiceSections.map((s) => ({ label: s.label, options: s.options.map(toMenuOption) })) }\n : { options: view.value.voiceOptions.map(toMenuOption) }\n);\n\n// Auto-select chooses at submit, so turning it on clears the current pick\n// and the trigger reads \"Auto-select\" until routing fills in the model.\nwatch(\n () => props.autoSelectModel,\n (on, was) => {\n if (!on || was) return;\n if (view.value.multiModel) props[\"onUpdate:modelIds\"]?.([]);\n else props[\"onUpdate:modelId\"]?.(null);\n }\n);\n\n// Auto-select belongs to the Model menu it was turned on in: picking\n// another use case turns it off, so the new one's model is picked by hand.\n// Only when the end user owns the switch; a builder's setting stays.\nwatch(\n () => view.value.useCaseKey,\n () => {\n if (props.autoSelectModel && props.showAutoSelectToggle) props[\"onUpdate:autoSelectModel\"]?.(false);\n }\n);\n\nfunction pickModel(menu: ComposerView[\"modelMenus\"][number], id: string) {\n if (view.value.multiModel) props[\"onUpdate:modelIds\"]?.(menu.next(id));\n else props[\"onUpdate:modelId\"]?.(id);\n}\n\n// Which field's Enhance is running: `enhancing` is one flag for the bar.\nconst enhancingField = ref<ComposerPromptField>(\"prompt\");\nconst enhanceField = (field: ComposerPromptField) =>\n props.onEnhance &&\n ((current: string) => {\n enhancingField.value = field;\n props.onEnhance?.(current, field, view.value.enhanceMode);\n });\n\n// Voice input: a transcript is added to the prompt, never submitted.\nconst voice = createVoiceInput(\n () => props.voiceInput ?? { transcribe: async () => \"\" },\n (text) => {\n const current = props.modelValue;\n emit(\"update:modelValue\", current.trim() ? `${current.trimEnd()} ${text}` : text);\n }\n);\nconst voiceState = shallowRef(voice.getState());\nconst stopVoice = voice.subscribe(() => (voiceState.value = voice.getState()));\nonScopeDispose(() => {\n stopVoice();\n voice.dispose();\n});\n\nasync function onFiles(files: FileList | null) {\n const onAttachments = props[\"onUpdate:attachments\"];\n if (!files || files.length === 0 || !onAttachments) return;\n // Edit mode works on one image: a new one replaces it, and the edit starts over.\n const { attachments, unsupported } = await composerAttachmentsFromFiles(files, props.attachments, view.value.editing);\n unsupported.forEach((name) => emit(\"unsupportedFile\", name));\n if (attachments) onAttachments(attachments);\n}\n\nfunction removeUseCase(useCase: ComposerUseCase) {\n if (props.multiSelectUseCases) props[\"onUpdate:useCases\"]?.(props.useCases.filter((u) => u.kind !== useCase.kind));\n else props.onClearUseCase?.();\n}\n\nfunction onSubmitClick() {\n if (view.value.showStop) props.onAbort?.();\n else if (!view.value.isSubmitDisabled && !props.submitting) emit(\"submit\", view.value.payload());\n}\n</script>\n\n<template>\n <div class=\"chai-composer\">\n <div v-if=\"attachments.length > 0\" class=\"chai-composer__thumbnails\">\n <div v-for=\"a in attachments\" :key=\"a.id\" class=\"chai-composer__thumb\">\n <img v-if=\"a.kind === 'image'\" class=\"chai-composer__thumb-img\" :src=\"a.src\" alt=\"\" />\n <span v-else class=\"chai-composer__thumb-icon\"><VideocamIcon v-if=\"a.kind === 'video'\" /><MusicNoteIcon v-else-if=\"a.kind === 'audio'\" /><ImageIcon v-else /></span>\n <button\n v-if=\"props['onUpdate:attachments']\"\n type=\"button\"\n class=\"chai-composer__thumb-remove\"\n aria-label=\"Remove attachment\"\n @click=\"props['onUpdate:attachments']?.(attachments.filter((x) => x.id !== a.id))\"\n >\n <CloseSymbolIcon />\n </button>\n </div>\n </div>\n\n <ul v-if=\"view.editing && regions.length > 0\" class=\"chai-composer__regions\" aria-label=\"Edit regions\">\n <li v-for=\"r in regions\" :key=\"r.id\">\n <Chip\n :label=\"`Region ${r.number}`\"\n :region-number=\"r.number\"\n :removable=\"Boolean(props['onUpdate:regions'])\"\n :disabled=\"disabled\"\n @remove=\"props['onUpdate:regions']?.(regions.filter((x) => x.id !== r.id))\"\n />\n </li>\n </ul>\n\n <VoiceWaveform v-if=\"voiceInput && voiceState.status === 'recording'\" :levels=\"voiceState.levels\" :elapsed-ms=\"voiceState.elapsedMs\" />\n <div v-else-if=\"view.world\" class=\"chai-composer__world-fields\">\n <PromptField\n :value=\"modelValue\"\n :placeholder=\"view.placeholder\"\n heading=\"Environment\"\n note=\"(required)\"\n :hint=\"view.environmentHint\"\n :on-enhance=\"enhanceField('environment')\"\n :enhancing=\"Boolean(enhancing) && enhancingField === 'environment'\"\n :disabled=\"disabled\"\n @change=\"emit('update:modelValue', $event)\"\n />\n <PromptField\n v-if=\"props['onUpdate:character']\"\n :value=\"character\"\n :placeholder=\"view.characterPlaceholder\"\n heading=\"Character\"\n note=\"(optional)\"\n :on-enhance=\"enhanceField('character')\"\n :enhancing=\"Boolean(enhancing) && enhancingField === 'character'\"\n :disabled=\"disabled\"\n @change=\"props['onUpdate:character']?.($event)\"\n />\n </div>\n <PromptField\n v-else\n :value=\"modelValue\"\n :placeholder=\"view.placeholder\"\n :label=\"promptLabel\"\n :on-enhance=\"enhanceField('prompt')\"\n :enhancing=\"Boolean(enhancing)\"\n :disabled=\"disabled\"\n @change=\"emit('update:modelValue', $event)\"\n />\n\n <p v-if=\"submitError\" class=\"chai-composer__error\" role=\"alert\"><ErrorIcon />{{ submitError }}</p>\n <p v-if=\"voiceInput && voiceState.status === 'error'\" class=\"chai-composer__error\" role=\"alert\"><ErrorIcon />{{ voiceState.error }}</p>\n\n <div class=\"chai-composer__controls\">\n <div class=\"chai-composer__controls-start\">\n <AttachMenu\n v-if=\"menuItems.length > 0\"\n :items=\"menuItems\"\n :images-only=\"view.editing\"\n :disabled=\"disabled\"\n :placement=\"menuPlacement\"\n @select=\"onAttachMenuSelect?.($event)\"\n @files=\"onFiles\"\n />\n\n <Chip\n v-for=\"u in view.pickedUseCases\"\n :key=\"u.kind\"\n :label=\"u.label\"\n :removable=\"Boolean(multiSelectUseCases ? props['onUpdate:useCases'] : onClearUseCase)\"\n :disabled=\"disabled\"\n @remove=\"removeUseCase(u)\"\n />\n\n <!-- One Model menu, or one per use case with multi-use-case select. The auto-select switch lives inside each, so with it shown the trigger stays enabled: it's the only way back to the switch. -->\n <SearchMenu\n v-for=\"menu in view.canPickModel ? view.modelMenus : []\"\n :key=\"menu.key\"\n :placement=\"menuPlacement\"\n :options=\"menu.options\"\n :value=\"menu.value\"\n :multiple=\"menu.multiple\"\n :toggle-header=\"\n showAutoSelectToggle\n ? { label: 'Auto-select model', value: autoSelectModel, onChange: (v: boolean) => props['onUpdate:autoSelectModel']?.(v) }\n : undefined\n \"\n :trigger-label=\"menu.triggerLabel\"\n :menu-label=\"menu.menuLabel\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled || (autoSelectModel && !showAutoSelectToggle)\"\n :panel-width=\"showAutoSelectToggle ? 320 : undefined\"\n @select=\"pickModel(menu, $event.id)\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.showAspectRatio && view.aspectOptions.length > 0 && props['onUpdate:aspectRatio']\"\n :options=\"view.aspectOptions.map((o) => ({ id: o.value, label: o.label }))\"\n :value=\"view.offeredAspect\"\n :trigger-label=\"view.selectedAspect?.label ?? 'Aspect ratio'\"\n menu-label=\"Aspect ratio\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:aspectRatio']?.($event.id)\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.voiceOptions.length > 0 && props['onUpdate:speechVoice']\"\n v-bind=\"voiceMenuOptions\"\n :value=\"view.offeredVoice\"\n :trigger-label=\"view.voiceTriggerLabel\"\n menu-label=\"Voice\"\n :searchable=\"view.voiceOptions.length > view.searchableAt\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:speechVoice']?.($event.id)\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.genreOptions.length > 0 && props['onUpdate:genres']\"\n :options=\"view.genreOptions.map(toMenuOption)\"\n :value=\"view.offeredGenres\"\n multiple\n :trigger-label=\"view.genreTriggerLabel\"\n menu-label=\"Genre\"\n :searchable=\"view.genreOptions.length > view.searchableAt\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:genres']?.(view.toggledGenres($event.id))\"\n />\n\n <SearchMenu\n :placement=\"menuPlacement\"\n v-if=\"view.frameRateOptions.length > 0 && props['onUpdate:frameRate']\"\n :options=\"view.frameRateOptions.map((r) => ({ id: String(r), label: `${r}fps` }))\"\n :value=\"view.offeredFrameRate == null ? null : String(view.offeredFrameRate)\"\n :trigger-label=\"view.offeredFrameRate == null ? 'Frame rate' : `${view.offeredFrameRate}fps`\"\n menu-label=\"Frame rate\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"props['onUpdate:frameRate']?.(Number($event.id))\"\n />\n </div>\n\n <div class=\"chai-composer__controls-end\">\n <VoiceButton v-if=\"voiceInput\" :voice=\"voice\" :state=\"voiceState\" :disabled=\"disabled\" />\n <!-- MD3's md-fab has no disabled state of its own; Chai's unfilled-until-ready look comes from `data-ready` in style.css. `label=\"\"` keeps it a plain icon FAB.\n Hidden while a recording is made or transcribed: the transcript is sent once it's in the prompt to check. -->\n <md-fab\n v-if=\"!(voiceInput && (voiceState.status === 'recording' || voiceState.status === 'transcribing'))\"\n class=\"chai-composer__submit\"\n size=\"small\"\n variant=\"secondary\"\n label=\"\"\n :data-ready=\"view.showStop || !view.isSubmitDisabled || undefined\"\n :data-error=\"Boolean(submitError) || undefined\"\n :data-stop=\"view.showStop || undefined\"\n :aria-label=\"view.showStop ? 'Stop' : submitError ? 'Retry' : 'Submit'\"\n :aria-disabled=\"view.showStop ? 'false' : submitting || view.isSubmitDisabled ? 'true' : 'false'\"\n @click=\"onSubmitClick\"\n >\n <span slot=\"icon\"><StopIcon v-if=\"view.showStop\" /><RetryIcon v-else-if=\"submitError\" /><ArrowForwardIcon v-else /></span>\n </md-fab>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** The full-size image in a modal dialog: focus moves in, Escape closes, and focus returns to what opened it. */\nimport { onMounted, onUnmounted, ref } from \"vue\";\nimport { CloseSymbolIcon } from \"../icons.js\";\n\ndefineProps<{ src: string; alt: string }>();\nconst emit = defineEmits<{ close: [] }>();\nconst closeButton = ref<HTMLButtonElement>();\nlet opener: HTMLElement | null = null;\n\nonMounted(() => {\n opener = document.activeElement as HTMLElement | null;\n closeButton.value?.focus();\n});\nonUnmounted(() => opener?.focus());\n\nfunction onKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n emit(\"close\");\n } else if (e.key === \"Tab\") {\n // One control inside: keep focus on it.\n e.preventDefault();\n closeButton.value?.focus();\n }\n}\n</script>\n\n<template>\n <div class=\"chai-result-card__expand-overlay\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Expanded image\" @keydown=\"onKeydown\">\n <div class=\"chai-result-card__expand-scrim\" role=\"presentation\" @click=\"emit('close')\" />\n <div class=\"chai-result-card__expand-frame\">\n <img class=\"chai-result-card__image\" :src=\"src\" :alt=\"alt\" />\n <button ref=\"closeButton\" type=\"button\" class=\"chai-result-card__collapse\" aria-label=\"Collapse\" @click=\"emit('close')\">\n <CloseSymbolIcon />\n </button>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** One region on the image: a button to select, move or delete it, its number badge, and corner handles while selected. */\nimport { REGION_CORNERS, regionBoxStyle, type EditRegion, type RegionCorner } from \"@chai-ui/core\";\n\ndefineProps<{ region: EditRegion; selected: boolean; draft: boolean; disabled: boolean }>();\nconst emit = defineEmits<{\n dragStart: [e: PointerEvent, kind: \"move\" | RegionCorner];\n select: [];\n keydown: [e: KeyboardEvent];\n}>();\n</script>\n\n<template>\n <div\n :class=\"['chai-edit-card__region', { 'chai-edit-card__region--selected': selected, 'chai-edit-card__region--draft': draft }]\"\n :style=\"regionBoxStyle(region)\"\n >\n <button\n type=\"button\"\n class=\"chai-edit-card__region-body\"\n :aria-label=\"`Region ${region.number}${region.prompt ? `: ${region.prompt}` : ', no instruction yet'}. Arrow keys move it, Shift and arrow keys resize it.`\"\n :aria-pressed=\"selected\"\n :disabled=\"disabled\"\n @pointerdown=\"emit('dragStart', $event, 'move')\"\n @click=\"emit('select')\"\n @keydown=\"emit('keydown', $event)\"\n />\n <span class=\"chai-edit-card__badge\" aria-hidden=\"true\">{{ region.number }}</span>\n <template v-if=\"selected\">\n <span\n v-for=\"corner in REGION_CORNERS\"\n :key=\"corner\"\n :class=\"`chai-edit-card__handle chai-edit-card__handle--${corner}`\"\n aria-hidden=\"true\"\n @pointerdown=\"emit('dragStart', $event, corner)\"\n />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Renders a page with its slide. The outgoing image stays in the layout\n * while it slides away, so the card holds its height even while the new\n * image is still loading, and the new page slides in over that space. The\n * page keeps its key once the slide ends, so it isn't remounted (no\n * reloaded image, no restarted video).\n */\nimport { computed } from \"vue\";\nimport type { Slide } from \"./page-slide.js\";\n\nconst props = defineProps<{ slide: Slide | null; pageClass?: string }>();\nconst emit = defineEmits<{ end: [] }>();\n\nconst side = computed(() => (props.slide?.forward ? \"left\" : \"right\"));\nconst outgoing = computed(() => (props.slide?.active ? props.slide.from : undefined));\n</script>\n\n<template>\n <img\n v-if=\"outgoing\"\n :key=\"`out-${slide!.key}`\"\n :class=\"`chai-slide-out chai-slide-out--${side}`\"\n :src=\"outgoing\"\n alt=\"\"\n aria-hidden=\"true\"\n draggable=\"false\"\n />\n <div\n :key=\"`in-${slide?.key ?? 0}`\"\n :class=\"[pageClass, slide?.active && `chai-slide-in chai-slide-in--${side}`, outgoing && 'chai-slide-in--over']\"\n @animationend.self=\"emit('end')\"\n >\n <slot />\n </div>\n</template>\n","import { ref, watch } from \"vue\";\n\nexport interface Slide {\n /** The image paged away from, shown sliding out. Absent when it wasn't an image. */\n from?: string;\n forward: boolean;\n key: number;\n active: boolean;\n}\n\n/**\n * The slide between pages of a card: the new page comes in from the side it\n * was paged from while the last one leaves the other way. `page` gives the\n * page showing, its index, and its image, if it has one (what slides out next time).\n */\nexport function usePageSlide(page: () => { id: string | undefined; index: number; image: string | undefined }) {\n const slide = ref<Slide | null>(null);\n let shown = page();\n watch(page, (next) => {\n // No slide for someone who has asked their system for less motion.\n const reduceMotion = window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;\n if (next.id !== shown.id && shown.id !== undefined && next.id !== undefined && !reduceMotion) {\n slide.value = { from: shown.image, forward: next.index > shown.index, key: (slide.value?.key ?? 0) + 1, active: true };\n }\n // The same page getting its image (a result arriving) doesn't slide.\n shown = next;\n });\n const endSlide = () => {\n if (slide.value) slide.value = { ...slide.value, active: false, from: undefined };\n };\n return { slide, endSlide };\n}\n","<script setup lang=\"ts\">\n/**\n * Progress-style pager: a pill that fills from page 1 up to the current page\n * under a row of plain dots. One slider, not a button per dot (the dots sit\n * closer than WCAG 2.2's 24px target spacing allows): a click picks the\n * nearest dot; arrow keys, Home and End move between pages. Use with\n * `v-model:index`.\n */\nconst props = withDefaults(\n defineProps<{\n count: number;\n index: number;\n /** Accessible name for the pager, e.g. \"Results\". */\n label: string;\n /** What one page is, for the current position (\"Result 2 of 3\"). */\n itemLabel?: string;\n disabled?: boolean;\n }>(),\n { itemLabel: \"Result\" }\n);\nconst emit = defineEmits<{ \"update:index\": [index: number] }>();\n\nfunction go(next: number) {\n const clamped = Math.max(0, Math.min(props.count - 1, next));\n if (clamped !== props.index) emit(\"update:index\", clamped);\n}\n\nfunction onClick(e: MouseEvent) {\n if (props.disabled) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n go(Math.floor(((e.clientX - rect.left) / rect.width) * props.count));\n}\n\nconst KEY_STEPS: Record<string, (i: number, count: number) => number> = {\n ArrowRight: (i) => i + 1,\n ArrowUp: (i) => i + 1,\n PageDown: (i) => i + 1,\n ArrowLeft: (i) => i - 1,\n ArrowDown: (i) => i - 1,\n PageUp: (i) => i - 1,\n Home: () => 0,\n End: (_, count) => count - 1,\n};\n\nfunction onKeydown(e: KeyboardEvent) {\n const step = KEY_STEPS[e.key];\n if (props.disabled || !step) return;\n e.preventDefault();\n go(step(props.index, props.count));\n}\n</script>\n\n<template>\n <div\n :class=\"['chai-pagination', { 'chai-pagination--disabled': disabled }]\"\n role=\"slider\"\n :aria-label=\"label\"\n :aria-valuemin=\"1\"\n :aria-valuemax=\"count\"\n :aria-valuenow=\"index + 1\"\n :aria-valuetext=\"`${itemLabel} ${index + 1} of ${count}`\"\n :aria-disabled=\"disabled || undefined\"\n :tabindex=\"disabled ? -1 : 0\"\n :style=\"{ '--chai-pagination-fill': `${((index + 1) / count) * 100}%` }\"\n @click=\"onClick\"\n @keydown=\"onKeydown\"\n >\n <span class=\"chai-pagination__track\" aria-hidden=\"true\" />\n <span\n v-for=\"i in count\"\n :key=\"i\"\n :class=\"['chai-pagination__dot', { 'chai-pagination__dot--filled': i - 1 <= index }]\"\n aria-hidden=\"true\"\n />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The image editing card: the person marks regions on the image, gives each\n * one an instruction, and checks it into the Composer. It shares\n * ResultCard's frame, with region actions where the votes would be.\n *\n * Drop it in with `useComposer`'s `edit`: `v-model:active-version` and\n * `v-model:regions`, sharing the regions with the Composer's. Each edit's\n * result comes back as a new version. Same props as React's `EditCard`.\n *\n * - \"New region\" adds a box with a prompt field. Check adds the region to\n * the Composer; trash removes it. Clicking a region reopens its field.\n * - Drag a region to move it, or a corner to resize it. By keyboard:\n * arrows move the selected region, Shift + arrows resize it.\n * - Zoom keeps the image inside the card; drag (or arrow keys) to pan.\n */\nimport { computed, onMounted, onUnmounted, ref, watch } from \"vue\";\nimport {\n clampPan,\n DEFAULT_MAX_REGIONS,\n downloadFilename,\n downloadMedia,\n EDIT_ZOOM_STEPS,\n editCardWidth,\n fitBox,\n freeRegionNumber,\n newRegion,\n panForKey,\n panForZoom,\n regionBoxForKey,\n regionBoxStyle,\n regionPopoverPosition,\n resizeBox,\n shareMedia,\n type EditRegion,\n type EditVersion,\n type Pan,\n type RegionBox,\n type RegionCorner,\n type Size,\n} from \"@chai-ui/core\";\nimport ExpandedImage from \"./edit-card/ExpandedImage.vue\";\nimport RegionShape from \"./edit-card/RegionShape.vue\";\nimport {\n AddIcon,\n CheckSymbolIcon,\n CloseSymbolIcon,\n DeleteIcon,\n DownloadIcon,\n ExpandIcon,\n ShareIcon,\n VisibilityIcon,\n VisibilityOffIcon,\n ZoomInIcon,\n ZoomOutIcon,\n} from \"./icons.js\";\nimport PageSlide from \"./PageSlide.vue\";\nimport { usePageSlide } from \"./page-slide.js\";\nimport Pagination from \"./primitives/Pagination.vue\";\n\nconst props = withDefaults(\n defineProps<{\n /** The original image first, then each edit. Paged with the dots in the card's bottom row. */\n versions: EditVersion[];\n activeVersion: number;\n /** The new regions on the image, each committed with its instruction. Share them with the Composer's `regions`. */\n regions: EditRegion[];\n /** The most regions the chosen model takes (`ModelOption.maxRegions`). \"New region\" is disabled at this many. */\n maxRegions?: number;\n /** A fixed starting width in px, fitted within `maxWidth` and `maxHeight`. */\n width?: number;\n /** Sizes the card from the image's own pixel width: `0.3` makes it 30% as wide as the image. */\n scale?: number;\n /** The widest the card gets, in px. With no `width` or `scale`, the card fills `maxWidth` × `maxHeight`, keeping the image's shape. */\n maxWidth?: number;\n /** The tallest the card gets, in px. */\n maxHeight?: number;\n /** Alt text for the image. */\n alt?: string;\n disabled?: boolean;\n }>(),\n { maxRegions: DEFAULT_MAX_REGIONS, maxWidth: 630, maxHeight: 630, alt: \"Image being edited\" }\n);\nconst emit = defineEmits<{\n \"update:activeVersion\": [index: number];\n \"update:regions\": [next: EditRegion[]];\n /** After the card downloads or shares the version showing. */\n action: [action: \"download\" | \"share\", version: EditVersion];\n}>();\n\ntype Drag =\n | { kind: \"move\" | RegionCorner; id: string; x: number; y: number; box: RegionBox; moved: boolean }\n | { kind: \"pan\"; x: number; y: number; pan: Pan; moved: boolean };\n\nconst index = computed(() => Math.min(Math.max(props.activeVersion, 0), Math.max(0, props.versions.length - 1)));\nconst version = computed(() => props.versions[index.value]);\nconst ready = computed(() => version.value?.status === \"done\" && Boolean(version.value.src));\nconst paginated = computed(() => props.versions.length > 1);\nconst hasImage = computed(() => Boolean(version.value?.src || version.value?.from));\n\n// A region being drawn, not yet checked into the Composer.\nconst draft = ref<EditRegion | null>(null);\nconst selectedId = ref<string | null>(null);\nconst text = ref(\"\");\nconst hidden = ref(false);\nconst zoom = ref(1);\nconst pan = ref<Pan>({ x: 0, y: 0 });\nconst size = ref<Size>({ width: 0, height: 0 });\n// The shown image's own pixel size, kept until the next version's image loads, so the card doesn't jump between.\nconst natural = ref<Size | null>(null);\nconst expanded = ref(false);\nconst linkCopied = ref(false);\nlet drag: Drag | null = null;\nconst viewport = ref<HTMLElement>();\nconst field = ref<HTMLTextAreaElement>();\n\n// Paging slides between versions, and a different version starts clean: no half-drawn region, no zoom.\nconst { slide, endSlide } = usePageSlide(() => ({\n id: version.value?.id,\n index: index.value,\n image: version.value?.src ?? version.value?.from,\n}));\nwatch(\n () => version.value?.id,\n () => {\n draft.value = null;\n selectedId.value = null;\n zoom.value = 1;\n pan.value = { x: 0, y: 0 };\n }\n);\n\nlet observer: ResizeObserver | undefined;\nonMounted(() => {\n observer = new ResizeObserver(([entry]) => {\n if (entry) size.value = { width: entry.contentRect.width, height: entry.contentRect.height };\n });\n if (viewport.value) observer.observe(viewport.value);\n});\nonUnmounted(() => observer?.disconnect());\n\n// A region being drawn takes a free number, even if the regions changed\n// since it was started (so checking it in can't duplicate a number).\nconst shownDraft = computed(() => {\n const d = draft.value;\n return d && props.regions.some((r) => r.number === d.number) ? { ...d, number: freeRegionNumber(props.regions) } : d;\n});\nconst all = computed(() => (shownDraft.value ? [...props.regions, shownDraft.value] : props.regions));\nconst selected = computed(() => all.value.find((r) => r.id === selectedId.value) ?? null);\nconst isDraft = computed(() => selected.value != null && selected.value.id === draft.value?.id);\nconst canCheck = computed(\n () => selected.value != null && text.value.trim().length > 0 && (isDraft.value || text.value.trim() !== selected.value.prompt)\n);\nconst atCap = computed(() => all.value.length >= props.maxRegions);\nconst anyRegions = computed(() => all.value.length > 0 || (version.value?.regions.length ?? 0) > 0);\nconst zoomIndex = computed(() => EDIT_ZOOM_STEPS.indexOf(zoom.value));\n// The field sits above its region, or below it when there isn't room above.\nconst popover = computed(() =>\n selected.value && !hidden.value && size.value.width\n ? regionPopoverPosition(selected.value.box, zoom.value, pan.value, size.value, paginated.value)\n : null\n);\nconst cardWidth = computed(() =>\n editCardWidth(natural.value, { width: props.width, scale: props.scale, maxWidth: props.maxWidth, maxHeight: props.maxHeight })\n);\n\n// The field opens focused, so a new region can be described straight away.\nwatch(selectedId, (id) => id && field.value?.focus(), { flush: \"post\" });\n// The field grows with its text instead of scrolling it out of view.\nwatch(\n [text, selectedId],\n () => {\n const el = field.value;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight}px`;\n },\n { flush: \"post\" }\n);\n\nfunction select(region: EditRegion | null) {\n selectedId.value = region?.id ?? null;\n text.value = region?.prompt ?? \"\";\n}\n\nfunction setBox(id: string, box: RegionBox) {\n if (draft.value?.id === id) draft.value = { ...draft.value, box };\n else emit(\"update:regions\", props.regions.map((r) => (r.id === id ? { ...r, box } : r)));\n}\n\nfunction removeRegion(region: EditRegion) {\n if (region.id === draft.value?.id) draft.value = null;\n else emit(\"update:regions\", props.regions.filter((r) => r.id !== region.id));\n select(null);\n}\n\nfunction addRegion() {\n const region = newRegion(props.regions, zoom.value, pan.value, size.value);\n draft.value = region;\n hidden.value = false;\n select(region);\n}\n\nfunction check() {\n const region = selected.value;\n if (!region || !canCheck.value) return;\n const prompt = text.value.trim();\n if (isDraft.value) {\n emit(\"update:regions\", [...props.regions, { ...region, prompt }]);\n draft.value = null;\n } else {\n emit(\"update:regions\", props.regions.map((r) => (r.id === region.id ? { ...r, prompt } : r)));\n }\n select(null);\n}\n\nfunction clearAll() {\n draft.value = null;\n select(null);\n emit(\"update:regions\", []);\n}\n\nfunction toggleHidden() {\n hidden.value = !hidden.value;\n select(null);\n}\n\nfunction zoomTo(next: number) {\n pan.value = panForZoom(pan.value, zoom.value, next, size.value);\n zoom.value = next;\n}\n\n// --- Pointer: move and resize regions, pan the zoomed image. Moves and\n// releases bubble to the viewport, even while a region or handle holds the\n// pointer capture, so the viewport handles them all.\n\nfunction startRegionDrag(e: PointerEvent, region: EditRegion, kind: \"move\" | RegionCorner) {\n if (props.disabled || e.button !== 0) return;\n e.stopPropagation();\n (e.currentTarget as Element).setPointerCapture(e.pointerId);\n drag = { kind, id: region.id, x: e.clientX, y: e.clientY, box: region.box, moved: false };\n if (region.id !== selectedId.value) select(region);\n}\n\nfunction startPan(e: PointerEvent) {\n if (e.button !== 0) return;\n if (zoom.value > 1) (e.currentTarget as Element).setPointerCapture(e.pointerId);\n drag = { kind: \"pan\", x: e.clientX, y: e.clientY, pan: pan.value, moved: false };\n}\n\nfunction onPointerMove(e: PointerEvent) {\n const d = drag;\n const { width, height } = size.value;\n if (!d || !width) return;\n const dxPx = e.clientX - d.x;\n const dyPx = e.clientY - d.y;\n if (Math.abs(dxPx) + Math.abs(dyPx) > 2) d.moved = true;\n if (d.kind === \"pan\") {\n if (zoom.value > 1) pan.value = clampPan({ x: d.pan.x + dxPx, y: d.pan.y + dyPx }, zoom.value, size.value);\n return;\n }\n const dx = dxPx / (width * zoom.value);\n const dy = dyPx / (height * zoom.value);\n setBox(d.id, d.kind === \"move\" ? fitBox({ ...d.box, x: d.box.x + dx, y: d.box.y + dy }) : resizeBox(d.box, d.kind, dx, dy));\n}\n\nfunction onPointerUp() {\n const d = drag;\n drag = null;\n // A click on the image itself (not a drag) closes the open field.\n if (d?.kind === \"pan\" && !d.moved) select(null);\n}\n\n// --- Keyboard\n\nfunction onRegionKey(e: KeyboardEvent, region: EditRegion) {\n const box = regionBoxForKey(region.box, e.key, { shift: e.shiftKey, alt: e.altKey });\n if (box) {\n e.preventDefault();\n e.stopPropagation();\n setBox(region.id, box);\n } else if (e.key === \"Delete\" || e.key === \"Backspace\") {\n e.preventDefault();\n removeRegion(region);\n }\n}\n\nfunction onViewportKey(e: KeyboardEvent) {\n if (e.target !== e.currentTarget || zoom.value <= 1) return;\n const next = panForKey(pan.value, e.key, zoom.value, size.value);\n if (!next) return;\n e.preventDefault();\n pan.value = next;\n}\n\nfunction onFieldKey(e: KeyboardEvent) {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n check();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n if (isDraft.value) draft.value = null;\n select(null);\n }\n}\n\n// --- Media actions\n\nasync function download() {\n const v = version.value;\n if (!v?.src) return;\n await downloadMedia(v.src, downloadFilename(v.id, \"image\", v.src));\n emit(\"action\", \"download\", v);\n}\n\nasync function share() {\n const v = version.value;\n if (!v?.src) return;\n // With no share sheet the link is copied; say so, or the click looks like nothing happened.\n if ((await shareMedia(v.src)) === \"copied\") {\n linkCopied.value = true;\n setTimeout(() => (linkCopied.value = false), 1500);\n }\n emit(\"action\", \"share\", v);\n}\n\nfunction onImageLoad(e: Event) {\n const img = e.currentTarget as HTMLImageElement;\n natural.value = { width: img.naturalWidth, height: img.naturalHeight };\n}\n</script>\n\n<template>\n <template v-if=\"version\">\n <div class=\"chai-edit-card\" :style=\"{ '--chai-edit-card-width': `${cardWidth}px` }\">\n <div\n ref=\"viewport\"\n :class=\"['chai-edit-card__viewport', { 'chai-edit-card__viewport--zoomed': zoom > 1 }]\"\n role=\"group\"\n :aria-label=\"zoom > 1 ? `Image, zoomed to ${Math.round(zoom * 100)}%. Arrow keys move around.` : 'Image'\"\n :tabindex=\"zoom > 1 ? 0 : undefined\"\n @pointerdown=\"startPan\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n @pointercancel=\"onPointerUp\"\n @keydown=\"onViewportKey\"\n >\n <PageSlide :slide=\"slide\" @end=\"endSlide\">\n <div class=\"chai-edit-card__layer\" :style=\"{ transform: `translate(${pan.x}px, ${pan.y}px) scale(${zoom})`, '--chai-edit-zoom': zoom }\">\n <img\n v-if=\"version.src || version.from\"\n class=\"chai-edit-card__image\"\n :src=\"version.src ?? version.from\"\n :alt=\"alt\"\n draggable=\"false\"\n @load=\"onImageLoad\"\n />\n <div v-else class=\"chai-edit-card__placeholder\" />\n\n <template v-if=\"!hidden\">\n <span\n v-for=\"r in version.regions\"\n :key=\"`applied-${r.id}`\"\n class=\"chai-edit-card__region chai-edit-card__region--applied\"\n :style=\"regionBoxStyle(r)\"\n aria-hidden=\"true\"\n />\n <template v-if=\"ready\">\n <RegionShape\n v-for=\"r in all\"\n :key=\"r.id\"\n :region=\"r\"\n :selected=\"r.id === selectedId\"\n :draft=\"r.id === draft?.id\"\n :disabled=\"disabled\"\n @drag-start=\"(e, kind) => startRegionDrag(e, r, kind)\"\n @select=\"select(r)\"\n @keydown=\"onRegionKey($event, r)\"\n />\n </template>\n </template>\n </div>\n </PageSlide>\n\n <div v-if=\"version.status !== 'done'\" class=\"chai-edit-card__status\" role=\"status\">\n <span v-if=\"version.status === 'queued' || version.status === 'running'\" class=\"chai-edit-card__spinner\" role=\"img\" aria-label=\"Editing\" />\n <p v-else class=\"chai-edit-card__status-text\">{{ version.status === \"cancelled\" ? \"Stopped\" : (version.error ?? \"Something went wrong.\") }}</p>\n </div>\n\n <!-- Translucent backings keep these readable on any image. -->\n <div class=\"chai-card-top chai-card-top--start\" @pointerdown.stop>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n aria-label=\"Zoom in\"\n title=\"Zoom in\"\n :disabled=\"!ready || zoomIndex >= EDIT_ZOOM_STEPS.length - 1\"\n @click=\"zoomTo(EDIT_ZOOM_STEPS[zoomIndex + 1]!)\"\n >\n <ZoomInIcon />\n </button>\n <span class=\"chai-edit-card__zoom-level\" aria-live=\"polite\">{{ Math.round(zoom * 100) }}%</span>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n aria-label=\"Zoom out\"\n title=\"Zoom out\"\n :disabled=\"!ready || zoomIndex <= 0\"\n @click=\"zoomTo(EDIT_ZOOM_STEPS[zoomIndex - 1]!)\"\n >\n <ZoomOutIcon />\n </button>\n </div>\n\n <div class=\"chai-card-top chai-card-top--end\" @pointerdown.stop>\n <button type=\"button\" class=\"chai-card-top-btn\" aria-label=\"Download\" title=\"Download\" :disabled=\"disabled || !ready\" @click=\"download\">\n <DownloadIcon />\n </button>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n :aria-label=\"linkCopied ? 'Link copied' : 'Share'\"\n :title=\"linkCopied ? 'Link copied' : 'Share'\"\n :disabled=\"disabled || !ready\"\n @click=\"share\"\n >\n <CheckSymbolIcon v-if=\"linkCopied\" /><ShareIcon v-else />\n </button>\n <button type=\"button\" class=\"chai-card-top-btn\" aria-label=\"Expand\" title=\"Expand\" :disabled=\"!ready\" @click=\"expanded = true\">\n <ExpandIcon />\n </button>\n </div>\n\n <div v-if=\"paginated && hasImage\" class=\"chai-card-fade\" />\n\n <!-- Over the bottom of the image (it fills the card): the region actions. -->\n <div class=\"chai-card-bottom\" @pointerdown.stop>\n <div class=\"chai-card-actions\">\n <div class=\"chai-card-chips\">\n <button\n type=\"button\"\n class=\"chai-card-chip\"\n :disabled=\"disabled || !ready || atCap\"\n :title=\"atCap ? `This model takes up to ${maxRegions} regions` : undefined\"\n @click=\"addRegion\"\n >\n <AddIcon />New region\n </button>\n <button type=\"button\" class=\"chai-card-chip\" :disabled=\"disabled || all.length === 0\" @click=\"clearAll\">\n <CloseSymbolIcon />Clear regions\n </button>\n </div>\n <!-- Named, and given a tooltip, by what a press will do. -->\n <button\n type=\"button\"\n class=\"chai-card-round\"\n :aria-label=\"hidden ? 'Show regions' : 'Hide regions'\"\n :title=\"hidden ? 'Show regions' : 'Hide regions'\"\n :disabled=\"!anyRegions\"\n @click=\"toggleHidden\"\n >\n <VisibilityOffIcon v-if=\"hidden\" /><VisibilityIcon v-else />\n </button>\n </div>\n </div>\n\n <div\n v-if=\"popover && selected\"\n :class=\"['chai-edit-card__popover', { 'chai-edit-card__popover--above': popover.above }]\"\n :style=\"{ left: `${popover.left}px`, top: `${popover.top}px` }\"\n role=\"dialog\"\n :aria-label=\"`Region ${selected.number}`\"\n @pointerdown.stop\n >\n <div class=\"chai-edit-card__popover-header\">\n <span class=\"chai-edit-card__popover-title\">Region {{ selected.number }}</span>\n <button\n type=\"button\"\n class=\"chai-card-top-btn\"\n aria-label=\"Add region to prompt\"\n title=\"Add region to prompt\"\n :disabled=\"disabled || !canCheck\"\n @click=\"check\"\n >\n <CheckSymbolIcon />\n </button>\n <button type=\"button\" class=\"chai-card-top-btn\" aria-label=\"Delete region\" title=\"Delete region\" :disabled=\"disabled\" @click=\"removeRegion(selected)\">\n <DeleteIcon />\n </button>\n </div>\n <textarea\n ref=\"field\"\n v-model=\"text\"\n class=\"chai-edit-card__field\"\n rows=\"1\"\n placeholder=\"What should change here?\"\n :aria-label=\"`Instruction for region ${selected.number}`\"\n :disabled=\"disabled\"\n @keydown=\"onFieldKey\"\n />\n </div>\n </div>\n\n <!-- The version dots are the card's last row, under the image. -->\n <div v-if=\"paginated\" :class=\"['chai-card-pager-bar', { 'chai-card-pager-bar--over-media': hasImage }]\">\n <Pagination\n :count=\"versions.length\"\n :index=\"index\"\n label=\"Versions\"\n item-label=\"Version\"\n :disabled=\"disabled\"\n @update:index=\"emit('update:activeVersion', $event)\"\n />\n </div>\n </div>\n\n <!-- The expanded view reuses the result card's dialog, outside the card for the same reason. -->\n <ExpandedImage v-if=\"expanded && version.src\" :src=\"version.src\" :alt=\"alt\" @close=\"expanded = false\" />\n </template>\n</template>\n","<script setup lang=\"ts\">\n/** The card's small icon buttons, with the hover circle: in a dark group along the top, in the light pill, or the round button on the right. */\ndefineProps<{ variant: \"top\" | \"pill\" | \"round\"; label: string; active?: boolean; disabled?: boolean }>();\nconst CLASS = { top: \"chai-card-top-btn\", pill: \"chai-card-pill-btn\", round: \"chai-card-round\" } as const;\n</script>\n\n<template>\n <button\n type=\"button\"\n :class=\"[CLASS[variant], { 'chai-card-pill-btn--active': active }]\"\n :aria-label=\"label\"\n :aria-pressed=\"active\"\n :title=\"label\"\n :disabled=\"disabled\"\n >\n <slot />\n </button>\n</template>\n","<script setup lang=\"ts\">\n/** The ⋯ menu of app-specific actions, a positioned popover under its trigger. Closes on a pick, Escape, or a click outside. */\nimport { ref } from \"vue\";\nimport { useDismiss } from \"../dismiss.js\";\nimport { MoreHorizIcon } from \"../icons.js\";\nimport IconButton from \"./IconButton.vue\";\nimport type { ResultCardMoreAction } from \"./types.js\";\n\ndefineProps<{ actions: ResultCardMoreAction[]; disabled?: boolean }>();\nconst emit = defineEmits<{ select: [action: ResultCardMoreAction] }>();\nconst open = ref(false);\nconst root = ref<HTMLElement>();\n\nuseDismiss(root, open, () => (open.value = false));\n\nfunction pick(action: ResultCardMoreAction) {\n open.value = false;\n emit(\"select\", action);\n}\n</script>\n\n<template>\n <div ref=\"root\" class=\"chai-result-card__more\">\n <IconButton variant=\"pill\" label=\"More\" :active=\"open\" :disabled=\"disabled\" @click=\"open = !open\">\n <MoreHorizIcon />\n </IconButton>\n <ul v-if=\"open\" class=\"chai-result-card__more-menu\" role=\"menu\">\n <li v-for=\"action in actions\" :key=\"action.id\" role=\"none\">\n <button type=\"button\" role=\"menuitem\" class=\"chai-result-card__more-menu-item\" @click=\"pick(action)\">\n <span v-if=\"action.icon\" class=\"chai-result-card__more-menu-icon\"><component :is=\"action.icon\" /></span>{{ action.label }}\n </button>\n </li>\n </ul>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A text result, streaming or finished. One element for both states, so the\n * scroll position survives the moment a stream completes. Past its max\n * height it scrolls; while streaming it follows the newest text, unless the\n * person has scrolled up to read, in which case it stays where they are.\n */\nimport { onMounted, ref, watch } from \"vue\";\n\nconst props = defineProps<{ text: string; streaming: boolean }>();\nconst el = ref<HTMLElement>();\nlet follow = true;\n\nfunction followNewest() {\n if (el.value && props.streaming && follow) el.value.scrollTop = el.value.scrollHeight;\n}\n// A frame later on mount: set during mount, before the card's first paint,\n// the scroll position didn't stick in Chromium (React's effect runs after paint).\nonMounted(() => requestAnimationFrame(followNewest));\nwatch(() => [props.text, props.streaming], followNewest, { flush: \"post\" });\n\nfunction onScroll(e: Event) {\n const p = e.currentTarget as HTMLElement;\n follow = p.scrollTop + p.clientHeight >= p.scrollHeight - 24;\n}\n</script>\n\n<template>\n <!-- aria-busy: screen readers wait for the finished text instead of announcing every chunk. tabindex: keyboard users can scroll a long answer. -->\n <p\n ref=\"el\"\n :class=\"['chai-result-card__text-output', { 'chai-result-card__text-output--streaming': streaming }]\"\n :aria-busy=\"streaming\"\n tabindex=\"0\"\n @scroll=\"onScroll\"\n >{{ text }}</p>\n</template>\n","<script setup lang=\"ts\">\n/**\n * A real `<video>` with slim play/pause and scrubber chrome built on its own\n * playback API, not the browser's heavier native controls. Mounted twice\n * (inline, and in the expand overlay), so `time` and `wasPlaying` carry the\n * position and play state across the swap.\n */\nimport { ref } from \"vue\";\nimport { PlayIcon } from \"../icons.js\";\n\nconst props = defineProps<{ src: string; expanded?: boolean; time: { current: number }; wasPlaying: boolean }>();\nconst emit = defineEmits<{ playingChange: [playing: boolean]; dimensions: [width: number, height: number] }>();\nconst video = ref<HTMLVideoElement>();\nconst playing = ref(props.wasPlaying);\nconst progress = ref(0);\n\nfunction togglePlay() {\n const el = video.value!;\n if (el.paused) el.play();\n else el.pause();\n}\n\nfunction onLoadedMetadata() {\n const el = video.value!;\n el.currentTime = props.time.current;\n if (props.wasPlaying) el.play().catch(() => {});\n emit(\"dimensions\", el.videoWidth, el.videoHeight);\n}\n\nfunction setPlaying(value: boolean) {\n playing.value = value;\n emit(\"playingChange\", value);\n}\n\nfunction onTimeUpdate() {\n const el = video.value!;\n props.time.current = el.currentTime;\n if (el.duration) progress.value = el.currentTime / el.duration;\n}\n\nfunction scrub(e: MouseEvent) {\n const el = video.value!;\n if (!el.duration) return;\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n el.currentTime = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width)) * el.duration;\n}\n\n// Keyboard seeking, the slider pattern: arrows move 5s, Home/End jump.\nconst STEPS: Record<string, number> = { ArrowRight: 5, ArrowUp: 5, ArrowLeft: -5, ArrowDown: -5 };\nfunction onScrubKey(e: KeyboardEvent) {\n const el = video.value!;\n if (!el.duration) return;\n const step = STEPS[e.key];\n if (step != null) el.currentTime = Math.min(el.duration, Math.max(0, el.currentTime + step));\n else if (e.key === \"Home\") el.currentTime = 0;\n else if (e.key === \"End\") el.currentTime = el.duration;\n else return;\n e.preventDefault();\n}\n</script>\n\n<template>\n <video\n ref=\"video\"\n class=\"chai-result-card__video\"\n :src=\"src\"\n @loadedmetadata=\"onLoadedMetadata\"\n @play=\"setPlaying(true)\"\n @pause=\"setPlaying(false)\"\n @timeupdate=\"onTimeUpdate\"\n />\n <!-- One control over the whole video: click, or Tab then Space/Enter, to play or pause. The round Play badge is just its paused look. -->\n <button type=\"button\" class=\"chai-result-card__video-toggle\" :aria-label=\"playing ? 'Pause' : 'Play'\" @click=\"togglePlay\">\n <span v-if=\"!playing\" class=\"chai-result-card__play\"><PlayIcon /></span>\n </button>\n <div\n :class=\"['chai-result-card__scrubber', { 'chai-result-card__scrubber--expanded': expanded }]\"\n role=\"slider\"\n tabindex=\"0\"\n aria-label=\"Seek\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"100\"\n :aria-valuenow=\"Math.round(progress * 100)\"\n :aria-valuetext=\"`${Math.round(progress * 100)}%`\"\n @click=\"scrub\"\n @keydown=\"onScrubKey\"\n >\n <div class=\"chai-result-card__scrubber-fill\" :style=\"{ width: `${progress * 100}%` }\" />\n </div>\n</template>\n","<script setup lang=\"ts\">\n/** The card's front: the result's image, video, audio or text, or its pending, stopped or failed state, with Download, Share and Expand over it. */\nimport { computed } from \"vue\";\nimport type { Result } from \"@chai-ui/core\";\nimport { CheckSymbolIcon, DownloadIcon, ExpandIcon, ShareIcon } from \"../icons.js\";\nimport IconButton from \"./IconButton.vue\";\nimport ResultText from \"./ResultText.vue\";\nimport VideoPlayer from \"./VideoPlayer.vue\";\n\nconst props = defineProps<{\n result: Result;\n alt: string;\n disabled?: boolean;\n mediaExpanded: boolean;\n linkCopied: boolean;\n videoTime: { current: number };\n videoWasPlaying: boolean;\n}>();\nconst emit = defineEmits<{\n download: [];\n share: [];\n expand: [];\n dimensions: [width: number, height: number];\n videoPlayingChange: [playing: boolean];\n}>();\n\nconst kind = computed(() => props.result.output?.kind);\n// \"Running with output\" is a text result streaming in: show the partial text, not the spinner.\nconst streaming = computed(() => props.result.status === \"running\" && kind.value === \"text\");\nconst pending = computed(() => (props.result.status === \"queued\" || props.result.status === \"running\") && !streaming.value);\n\nfunction onImageLoad(e: Event) {\n const img = e.currentTarget as HTMLImageElement;\n emit(\"dimensions\", img.naturalWidth, img.naturalHeight);\n}\n</script>\n\n<template>\n <div v-if=\"pending\" class=\"chai-result-card__media chai-result-card__media--pending\">\n <span class=\"chai-result-card__spinner\" role=\"img\" :aria-label=\"result.status === 'running' ? 'Running' : 'Queued'\" />\n </div>\n <!-- Stopped before any output. A stopped stream keeps its partial text and renders below like any other. -->\n <div v-else-if=\"result.status === 'cancelled' && !result.output\" class=\"chai-result-card__media chai-result-card__media--cancelled\">\n <p class=\"chai-result-card__cancelled-text\">Stopped</p>\n </div>\n <div v-else-if=\"result.status === 'error'\" class=\"chai-result-card__media chai-result-card__media--error\">\n <p class=\"chai-result-card__error-text\">{{ result.error?.message ?? \"Something went wrong.\" }}</p>\n </div>\n <div v-else-if=\"!result.output\" class=\"chai-result-card__media\" />\n <div v-else :class=\"['chai-result-card__media', { 'chai-result-card__media--fixed-height': kind === 'audio' || kind === 'text' }]\">\n <template v-if=\"kind === 'video'\">\n <!-- While expanded, the playing video is in the overlay; a still frame holds the layout here. -->\n <img v-if=\"mediaExpanded\" class=\"chai-result-card__image\" :src=\"result.output.src\" alt=\"\" />\n <VideoPlayer\n v-else\n :src=\"result.output.src\"\n :time=\"videoTime\"\n :was-playing=\"videoWasPlaying\"\n @playing-change=\"emit('videoPlayingChange', $event)\"\n @dimensions=\"(w, h) => emit('dimensions', w, h)\"\n />\n </template>\n <audio v-else-if=\"kind === 'audio'\" class=\"chai-result-card__audio\" :src=\"result.output.src\" controls />\n <ResultText v-else-if=\"kind === 'text'\" :text=\"result.output.src\" :streaming=\"streaming\" />\n <img v-else class=\"chai-result-card__image\" :src=\"result.output.src\" :alt=\"alt\" @load=\"onImageLoad\" />\n\n <div v-if=\"!mediaExpanded && !streaming\" class=\"chai-card-top chai-card-top--end\">\n <IconButton variant=\"top\" label=\"Download\" :disabled=\"disabled\" @click=\"emit('download')\"><DownloadIcon /></IconButton>\n <IconButton variant=\"top\" :label=\"linkCopied ? 'Link copied' : 'Share'\" :disabled=\"disabled\" @click=\"emit('share')\">\n <CheckSymbolIcon v-if=\"linkCopied\" /><ShareIcon v-else />\n </IconButton>\n <IconButton v-if=\"kind === 'video' || kind === 'image'\" variant=\"top\" label=\"Expand\" :disabled=\"disabled\" @click=\"emit('expand')\">\n <ExpandIcon />\n </IconButton>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\n/**\n * The Composer bar's complement, and the last stop in the pipeline: the\n * results from one prompt, one at a time, paged with the dots when there\n * are several. Flips to show the prompt and details. Same props as React's\n * `ResultCard`; `onAction` is the `action` event.\n */\nimport { computed, nextTick, reactive, ref, watch } from \"vue\";\nimport {\n downloadFilename,\n downloadMedia,\n formatAspectRatio,\n formatCost,\n formatDuration,\n formatTokens,\n resultModelLabel,\n shareMedia,\n type ModelOption,\n type Result,\n} from \"@chai-ui/core\";\nimport { CheckIcon, CloseIcon, CopyIcon, InfoIcon, RefreshIcon, ThumbDownIcon, ThumbUpIcon } from \"./icons.js\";\nimport PageSlide from \"./PageSlide.vue\";\nimport { usePageSlide } from \"./page-slide.js\";\nimport Pagination from \"./primitives/Pagination.vue\";\nimport IconButton from \"./result-card/IconButton.vue\";\nimport MoreMenu from \"./result-card/MoreMenu.vue\";\nimport ResultMedia from \"./result-card/ResultMedia.vue\";\nimport VideoPlayer from \"./result-card/VideoPlayer.vue\";\nimport type { ResultCardMoreAction, ResultCardVote } from \"./result-card/types.js\";\n\nconst props = defineProps<{\n /** The results from one prompt: `results[0]` if there's only one, paged internally if more. */\n results: Result[];\n /** Fixed width in px. Defaults to 375; height follows the media. */\n width?: number;\n /** Max height in px of a text result before it scrolls. Defaults to 400. */\n textMaxHeight?: number;\n /** The request's prompt, shown read-only (copiable) on the info side. */\n prompt: string;\n /** Alt text for a generated image. Defaults to `prompt`. */\n altText?: (result: Result) => string;\n /** Resolves `Result.modelId` to a label, on the info side and beside the page dots. */\n models?: ModelOption[];\n /** A result's vote, if any. Controlled: what a vote means is the app's policy. */\n getVote?: (result: Result) => ResultCardVote;\n /** Extra items in the ⋯ menu. Omit to hide the menu. */\n moreActions?: ResultCardMoreAction[];\n disabled?: boolean;\n}>();\nconst emit = defineEmits<{\n /** `\"like\"`, `\"dislike\"`, `\"download\"`, `\"share\"`, `\"copy-prompt\"`, `\"retry\"`, or a `moreActions` id. */\n action: [action: string, result: Result];\n}>();\n\nconst activeIndex = ref(0);\nconst flipped = ref(false);\nconst copied = ref(false);\nconst linkCopied = ref(false);\nconst mediaExpanded = ref(false);\n// Measured off the loaded media for the aspect-ratio chip, with the id it\n// was measured from, so a stale ratio never shows after paging.\nconst measured = ref<{ id: string; width: number; height: number } | null>(null);\nconst videoTime = reactive({ current: 0 });\nconst videoWasPlaying = ref(false);\nconst front = ref<HTMLElement>();\nconst back = ref<HTMLElement>();\nconst overlay = ref<HTMLElement>();\n\nconst index = computed(() => Math.min(activeIndex.value, Math.max(0, props.results.length - 1)));\nconst result = computed(() => props.results[index.value]);\nconst kind = computed(() => result.value?.output?.kind);\nconst paginated = computed(() => props.results.length > 1);\n// An image or video runs under a dark fade into the bar; text, audio and status pages keep the plain surface.\nconst overMedia = computed(() => kind.value === \"image\" || kind.value === \"video\");\nconst vote = computed(() => (result.value && props.getVote?.(result.value)) ?? null);\nconst modelLabel = computed(() => (result.value ? resultModelLabel(result.value, props.models) : \"\"));\nconst alt = computed(() => (result.value ? (props.altText?.(result.value) ?? props.prompt) : \"\"));\nconst chips = computed(() => {\n const r = result.value;\n const dims = measured.value?.id === r?.id ? measured.value : null;\n return [\n modelLabel.value,\n formatTokens(r?.usage?.totalTokens),\n formatCost(r?.usage?.costUsd),\n formatDuration(r?.durationMs),\n dims ? formatAspectRatio(dims.width, dims.height) : undefined,\n ].filter(Boolean) as string[];\n});\nconst cardStyle = computed(() => ({\n ...(props.width != null && { \"--chai-result-card-width\": `${props.width}px` }),\n ...(props.textMaxHeight != null && { \"--chai-result-card-text-max-height\": `${props.textMaxHeight}px` }),\n}));\n\n// Paging slides, with the last image sliding out (other kinds just slide in).\nconst { slide, endSlide } = usePageSlide(() => ({\n id: result.value?.id,\n index: index.value,\n image: kind.value === \"image\" ? result.value!.output!.src : undefined,\n}));\n\nconst act = (action: string) => emit(\"action\", action, result.value!);\n\nfunction flash(flag: typeof copied) {\n flag.value = true;\n setTimeout(() => (flag.value = false), 1500);\n}\n\nfunction copyPrompt() {\n navigator.clipboard?.writeText(props.prompt).catch(() => {});\n flash(copied);\n act(\"copy-prompt\");\n}\n\nasync function download() {\n const r = result.value!;\n if (r.output) await downloadMedia(r.output.src, downloadFilename(r.id, r.output.kind, r.output.src));\n emit(\"action\", \"download\", r);\n}\n\nasync function share() {\n const r = result.value!;\n // With no share sheet the link is copied; say so, or the click looks like nothing happened.\n if (r.output && (await shareMedia(r.output.src)) === \"copied\") flash(linkCopied);\n emit(\"action\", \"share\", r);\n}\n\n// Flipping moves focus to the side now showing, so a keyboard user isn't left on a button that just turned away.\nwatch(\n flipped,\n (isFlipped) => {\n const target = isFlipped\n ? back.value?.querySelector<HTMLElement>('[aria-label=\"Close details\"]')\n : front.value?.querySelector<HTMLElement>('[aria-label=\"Show details\"]');\n target?.focus();\n },\n { flush: \"post\" }\n);\n\n// The expanded view is a modal dialog: focus moves in, Tab stays inside,\n// Escape closes, and focus returns to Expand, the only way in.\nwatch(mediaExpanded, async (open) => {\n await nextTick();\n if (open) overlay.value?.querySelector<HTMLElement>(\".chai-result-card__collapse\")?.focus();\n else front.value?.querySelector<HTMLElement>('[aria-label=\"Expand\"]')?.focus();\n});\n\nfunction onOverlayKeydown(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n mediaExpanded.value = false;\n return;\n }\n if (e.key !== \"Tab\") return;\n const focusable = [\n ...(e.currentTarget as HTMLElement).querySelectorAll<HTMLElement>('button, [tabindex=\"0\"], a[href], input, video[controls]'),\n ].filter((el) => !el.hasAttribute(\"disabled\"));\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) return;\n if (e.shiftKey && document.activeElement === first) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n}\n</script>\n\n<template>\n <template v-if=\"result\">\n <div :class=\"['chai-result-card', { 'chai-result-card--flipped': flipped }]\" :style=\"cardStyle\">\n <div class=\"chai-result-card__inner\">\n <!-- The face turned away is inert, so its buttons can't be tabbed to. -->\n <div\n ref=\"front\"\n :class=\"['chai-result-card__face chai-result-card__front', { 'chai-result-card__front--paginated': paginated }]\"\n :aria-hidden=\"flipped\"\n :inert=\"flipped\"\n >\n <div class=\"chai-result-card__media-frame\">\n <PageSlide :slide=\"slide\" page-class=\"chai-result-card__media-page\" @end=\"endSlide\">\n <ResultMedia\n :result=\"result\"\n :alt=\"alt\"\n :disabled=\"disabled\"\n :media-expanded=\"mediaExpanded\"\n :link-copied=\"linkCopied\"\n :video-time=\"videoTime\"\n :video-was-playing=\"videoWasPlaying\"\n @download=\"download\"\n @share=\"share\"\n @expand=\"mediaExpanded = true\"\n @dimensions=\"(w, h) => (measured = { id: result!.id, width: w, height: h })\"\n @video-playing-change=\"videoWasPlaying = $event\"\n />\n </PageSlide>\n <div v-if=\"paginated && overMedia\" class=\"chai-card-fade\" />\n </div>\n\n <!-- With several results, the page dots are the card's last row, with the model that made this page on the left. -->\n <div v-if=\"paginated\" :class=\"['chai-card-pager-bar', { 'chai-card-pager-bar--over-media': overMedia }]\">\n <span class=\"chai-card-pager-label\">{{ modelLabel }}</span>\n <Pagination\n :count=\"results.length\"\n :index=\"index\"\n label=\"Results\"\n :disabled=\"disabled\"\n @update:index=\"activeIndex = $event\"\n />\n </div>\n\n <!-- Floating over the bottom of the media: votes and retry in one pill, details on the right. -->\n <div class=\"chai-card-bottom\">\n <div class=\"chai-card-actions\">\n <div class=\"chai-card-pill\">\n <IconButton variant=\"pill\" label=\"Like\" :active=\"vote === 'like'\" :disabled=\"disabled\" @click=\"act('like')\">\n <ThumbUpIcon />\n </IconButton>\n <IconButton variant=\"pill\" label=\"Dislike\" :active=\"vote === 'dislike'\" :disabled=\"disabled\" @click=\"act('dislike')\">\n <ThumbDownIcon />\n </IconButton>\n <IconButton variant=\"pill\" label=\"Retry\" :disabled=\"disabled\" @click=\"act('retry')\"><RefreshIcon /></IconButton>\n <MoreMenu v-if=\"moreActions?.length\" :actions=\"moreActions\" :disabled=\"disabled\" @select=\"act($event.id)\" />\n </div>\n <IconButton variant=\"round\" label=\"Show details\" :disabled=\"disabled\" @click=\"flipped = true\"><InfoIcon /></IconButton>\n </div>\n </div>\n </div>\n\n <div ref=\"back\" class=\"chai-result-card__face chai-result-card__back\" :aria-hidden=\"!flipped\" :inert=\"!flipped\">\n <button type=\"button\" class=\"chai-result-card__close\" aria-label=\"Close details\" @click=\"flipped = false\">\n <CloseIcon />\n </button>\n <div class=\"chai-result-card__prompt-box\">\n <p class=\"chai-result-card__prompt-text\">{{ prompt }}</p>\n <button\n type=\"button\"\n class=\"chai-result-card__copy\"\n :aria-label=\"copied ? 'Copied' : 'Copy prompt'\"\n :title=\"copied ? 'Copied' : 'Copy prompt'\"\n @click=\"copyPrompt\"\n >\n <CheckIcon v-if=\"copied\" /><CopyIcon v-else />\n </button>\n </div>\n <div class=\"chai-result-card__chips\">\n <span v-for=\"(chip, i) in chips\" :key=\"i\" class=\"chai-result-card__chip\">{{ chip }}</span>\n <!-- The builder's own backend checks: pass green with a check, fail red with a cross, so the verdict never relies on color alone. -->\n <span\n v-for=\"evaluation in result.evaluations\"\n :key=\"evaluation.id\"\n :class=\"[\n 'chai-result-card__chip chai-result-card__chip--evaluation',\n `chai-result-card__chip--${evaluation.passed ? 'passed' : 'failed'}`,\n ]\"\n :title=\"`${evaluation.label}: ${evaluation.passed ? 'passed' : 'failed'}`\"\n >\n <CheckIcon v-if=\"evaluation.passed\" /><CloseIcon v-else />{{ evaluation.label\n }}<span class=\"chai-visually-hidden\">{{ evaluation.passed ? \", passed\" : \", failed\" }}</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- The expanded view is the card's sibling, not its child: the card's\n `perspective` (for the flip) would make a nested `position: fixed`\n overlay cover only the card. The expanded video is a second element;\n `videoTime` and `videoWasPlaying` carry its place across. -->\n <div\n v-if=\"mediaExpanded && result.output && overMedia\"\n ref=\"overlay\"\n class=\"chai-result-card__expand-overlay\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-label=\"kind === 'video' ? 'Expanded video' : 'Expanded image'\"\n @keydown=\"onOverlayKeydown\"\n >\n <div class=\"chai-result-card__expand-scrim\" role=\"presentation\" @click=\"mediaExpanded = false\" />\n <div class=\"chai-result-card__expand-frame\">\n <VideoPlayer\n v-if=\"kind === 'video'\"\n :src=\"result.output.src\"\n expanded\n :time=\"videoTime\"\n :was-playing=\"videoWasPlaying\"\n @playing-change=\"videoWasPlaying = $event\"\n />\n <img v-else class=\"chai-result-card__image\" :src=\"result.output.src\" :alt=\"alt\" />\n <button type=\"button\" class=\"chai-result-card__collapse\" aria-label=\"Collapse\" @click=\"mediaExpanded = false\">\n <CloseIcon />\n </button>\n </div>\n </div>\n </template>\n</template>\n","<script setup lang=\"ts\">\n/**\n * Turns attached media into a prompt: a drop zone for images, a video or\n * audio, a model menu with auto-select, a prompt-length menu, and submit.\n * Pair with `useMediaAnalyzer`. Same props as React's `MediaAnalyzer`, with\n * `v-model:attachments`, `v-model:model-id`, `v-model:auto-select-model`\n * and `v-model:prompt-length`.\n */\nimport \"@material/web/fab/fab.js\";\nimport { computed, ref, watch } from \"vue\";\nimport {\n DEFAULT_MAX_ATTACHMENTS_BY_KIND,\n isMediaAnalyzerAtCap,\n mediaAnalyzerModelSections,\n nextMediaAnalyzerAttachments,\n PROMPT_LENGTH_HINT,\n readMediaFiles,\n replacedNote,\n SUGGESTED_ANALYSIS_MODELS,\n type MediaAnalysisPromptLength,\n type MediaAnalyzerAttachment,\n type MediaAnalyzerSubmitPayload,\n type MediaKind,\n type ModelOption,\n} from \"@chai-ui/core\";\nimport { ArrowForwardIcon, AudioIcon, MixedMediaIcon, RemoveIcon, StopIcon, VideoIcon } from \"./icons.js\";\nimport SearchMenu from \"./primitives/SearchMenu.vue\";\n\nconst props = withDefaults(\n defineProps<{\n attachments: MediaAnalyzerAttachment[];\n maxAttachmentsByKind?: Record<MediaKind, number>;\n /** Fallback roster for a kind `modelsByKind` doesn't list. */\n models?: ModelOption[];\n /** Per-kind rosters; once a kind is attached, only its models show. Defaults to Chai's suggested OpenRouter models. */\n modelsByKind?: Partial<Record<MediaKind, ModelOption[]>>;\n /** The picked model. While `autoSelectModel` is on it's `null` until a submit routes, then the routed model. */\n modelId: string | null;\n /** The \"Auto-select model\" switch inside the model menu. Turning it on clears the pick. */\n autoSelectModel: boolean;\n /** `null` until a person picks one: the trigger says \"Prompt length\" rather than pre-filling a choice. */\n promptLength: MediaAnalysisPromptLength | null;\n promptLengthOptions: { value: MediaAnalysisPromptLength; label: string }[];\n disabled?: boolean;\n submitting?: boolean;\n submitError?: string | null;\n /** With a listener, submit turns into stop while `submitting` (wire it to `useMediaAnalyzer`'s `cancel`); without one, submit is just disabled. */\n onAbort?: () => void;\n }>(),\n { maxAttachmentsByKind: () => DEFAULT_MAX_ATTACHMENTS_BY_KIND, models: () => [], modelsByKind: () => SUGGESTED_ANALYSIS_MODELS }\n);\nconst emit = defineEmits<{\n \"update:attachments\": [next: MediaAnalyzerAttachment[]];\n \"update:modelId\": [id: string | null];\n \"update:autoSelectModel\": [next: boolean];\n \"update:promptLength\": [value: MediaAnalysisPromptLength];\n unsupportedFile: [fileName: string];\n submit: [payload: MediaAnalyzerSubmitPayload];\n}>();\n\nconst input = ref<HTMLInputElement>();\n// A count, not a boolean: dragenter/dragleave fire for every child the\n// pointer crosses too, so a boolean would flicker off over the icon or text.\nconst dragDepth = ref(0);\n// What the last attach replaced (one kind per analysis), shown until the\n// attachments change some other way. Matched by ids: a parent's ref hands\n// the list back as a reactive copy, never the same array.\nconst replaced = ref<{ note: string; ids: string } | null>(null);\nconst idsOf = (list: MediaAnalyzerAttachment[]) => list.map((a) => a.id).join();\n\nconst kind = computed(() => props.attachments[0]?.kind);\nconst atCap = computed(() => isMediaAnalyzerAtCap(props.attachments, props.maxAttachmentsByKind));\nconst sections = computed(() => mediaAnalyzerModelSections(kind.value, props.modelsByKind, props.models));\n// Looked up across every section, so a pick made before any media is attached still names itself on the trigger.\nconst selectedModel = computed(() => sections.value.flatMap((s) => s.options).find((m) => m.id === props.modelId));\nconst modelTriggerLabel = computed(\n () => selectedModel.value?.label ?? (props.autoSelectModel ? \"Auto-select model\" : \"Select model\")\n);\nconst lengthOptions = computed(() =>\n // The clarifying suffix shows only in the list, never on the trigger.\n props.promptLengthOptions.map((o) => ({ id: o.value, label: o.label, rowLabel: `${o.label} (${PROMPT_LENGTH_HINT[o.value]})` }))\n);\nconst lengthLabel = computed(() => props.promptLengthOptions.find((o) => o.value === props.promptLength)?.label ?? \"Prompt length\");\nconst isSubmitDisabled = computed(() => props.disabled || props.attachments.length === 0);\nconst showStop = computed(() => Boolean(props.submitting && props.onAbort));\n\n// Auto-select chooses at submit, so turning it on clears the current pick\n// and the trigger says what will happen until it does.\nwatch(\n () => props.autoSelectModel,\n (on, was) => {\n if (on && !was) emit(\"update:modelId\", null);\n }\n);\n\n/** Reads every file first, then applies them in drop order and commits once. */\nasync function handleFiles(files: FileList | null | undefined) {\n if (!files || files.length === 0) return;\n const { media, unsupported } = await readMediaFiles(files);\n unsupported.forEach((name) => emit(\"unsupportedFile\", name));\n if (media.length === 0) return;\n const next = media.reduce((acc, m) => nextMediaAnalyzerAttachments(acc, m, props.maxAttachmentsByKind), props.attachments);\n const note = replacedNote(props.attachments, next);\n replaced.value = note ? { note, ids: idsOf(next) } : null;\n emit(\"update:attachments\", next);\n}\n\nfunction onDrop(e: DragEvent) {\n dragDepth.value = 0;\n if (!props.disabled) void handleFiles(e.dataTransfer?.files);\n}\n\nfunction onFileChange(e: Event) {\n const el = e.target as HTMLInputElement;\n void handleFiles(el.files);\n el.value = \"\";\n}\n\nfunction remove(id: string) {\n emit(\n \"update:attachments\",\n props.attachments.filter((a) => a.id !== id)\n );\n}\n\nfunction onSubmitClick() {\n if (showStop.value) props.onAbort?.();\n else if (!isSubmitDisabled.value && !props.submitting) {\n emit(\"submit\", {\n attachments: props.attachments,\n modelId: props.modelId,\n autoSelectModel: props.autoSelectModel,\n models: kind.value ? (props.modelsByKind[kind.value] ?? props.models) : [],\n promptLength: props.promptLength,\n });\n }\n}\n</script>\n\n<template>\n <div class=\"chai-media-analyzer\">\n <div\n :class=\"[\n 'chai-media-analyzer__dropzone',\n { 'chai-media-analyzer__dropzone--disabled': atCap, 'chai-media-analyzer__dropzone--drag-active': dragDepth > 0 },\n ]\"\n @dragenter.prevent=\"dragDepth++\"\n @dragleave.prevent=\"dragDepth = Math.max(0, dragDepth - 1)\"\n @dragover.prevent\n @drop.prevent=\"onDrop\"\n >\n <span class=\"chai-media-analyzer__dropzone-icon\" aria-hidden=\"true\"><MixedMediaIcon /></span>\n <!-- `atCap` is only ever true for image. -->\n <p class=\"chai-media-analyzer__dropzone-hint\">{{ atCap ? \"Maximum images added\" : \"Add media to convert to prompt\" }}</p>\n <button type=\"button\" class=\"chai-chip-button\" :disabled=\"disabled\" @click=\"input?.click()\">Select files</button>\n <input ref=\"input\" type=\"file\" accept=\"image/*,video/*,audio/*\" multiple hidden :disabled=\"disabled\" @change=\"onFileChange\" />\n </div>\n\n <div v-if=\"attachments.length > 0\" class=\"chai-media-analyzer__thumbnails\">\n <div v-for=\"a in attachments\" :key=\"a.id\" class=\"chai-media-analyzer__thumb\">\n <img v-if=\"a.kind === 'image'\" class=\"chai-media-analyzer__thumb-img\" :src=\"a.src\" alt=\"\" />\n <span v-else class=\"chai-media-analyzer__thumb-icon\"><VideoIcon v-if=\"a.kind === 'video'\" /><AudioIcon v-else /></span>\n <button type=\"button\" class=\"chai-media-analyzer__thumb-remove\" :aria-label=\"`Remove ${a.name ?? a.kind}`\" @click=\"remove(a.id)\">\n <RemoveIcon />\n </button>\n </div>\n </div>\n\n <p v-if=\"replaced && replaced.ids === idsOf(attachments)\" class=\"chai-media-analyzer__note\" role=\"status\">{{ replaced.note }}</p>\n <p v-if=\"submitError\" class=\"chai-media-analyzer__error\" role=\"alert\">{{ submitError }}</p>\n\n <div class=\"chai-media-analyzer__controls\">\n <div class=\"chai-media-analyzer__controls-start\">\n <SearchMenu\n :options=\"sections.length === 1 ? sections[0]!.options : undefined\"\n :sections=\"sections.length > 1 ? sections : undefined\"\n :toggle-header=\"{ label: 'Auto-select model', value: autoSelectModel, onChange: (next) => emit('update:autoSelectModel', next) }\"\n :value=\"modelId\"\n :trigger-label=\"modelTriggerLabel\"\n menu-label=\"Select model\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n :panel-width=\"320\"\n @select=\"emit('update:modelId', $event.id)\"\n />\n <SearchMenu\n :options=\"lengthOptions\"\n :value=\"promptLength\"\n :trigger-label=\"lengthLabel\"\n menu-label=\"Prompt length\"\n :searchable=\"false\"\n trigger-variant=\"text\"\n :disabled=\"disabled\"\n @select=\"emit('update:promptLength', $event.id as MediaAnalysisPromptLength)\"\n />\n </div>\n\n <!-- The same unfilled-until-ready submit as Composer's FAB. -->\n <md-fab\n class=\"chai-media-analyzer__submit\"\n size=\"small\"\n variant=\"secondary\"\n label=\"\"\n :data-ready=\"showStop || !isSubmitDisabled || undefined\"\n :data-error=\"Boolean(submitError) || undefined\"\n :data-stop=\"showStop || undefined\"\n :aria-label=\"showStop ? 'Stop' : submitError ? 'Retry' : 'Analyze media'\"\n :aria-disabled=\"showStop ? 'false' : submitting || isSubmitDisabled ? 'true' : 'false'\"\n @click=\"onSubmitClick\"\n >\n <span slot=\"icon\"><StopIcon v-if=\"showStop\" /><ArrowForwardIcon v-else /></span>\n </md-fab>\n </div>\n </div>\n</template>\n","import { computed, onScopeDispose, shallowRef, toValue, type MaybeRefOrGetter } from \"vue\";\nimport { createComposerStore, pickReasoning, type ComposerOptions } from \"@chai-ui/core\";\nimport { useReasoning } from \"./reasoning.js\";\n\nexport type UseComposerOptions = ComposerOptions;\n\n/**\n * The Vue binding for `createComposerStore` in `@chai-ui/core`: turns a\n * `Composer`'s submit payload into a real `Request` → `Run` → `Result`.\n * Pass a getter (or ref) for options that change, e.g. `() => ({ engine, editImage: image.value })`.\n */\nexport function useComposer(options: MaybeRefOrGetter<UseComposerOptions> = {}) {\n const provided = useReasoning();\n const store = createComposerStore(\n () => toValue(options),\n () => provided.value\n );\n const state = shallowRef(store.getState());\n onScopeDispose(\n store.subscribe(() => (state.value = store.getState())),\n true\n );\n\n return {\n run: computed(() => state.value.runs[0] ?? null),\n runs: computed(() => state.value.runs),\n submit: store.submit,\n cancel: store.cancel,\n /** `undefined` without reasoning, so the Composer hides its Enhance button. */\n enhance: computed(() => (pickReasoning(toValue(options), provided.value) ? store.enhance : undefined)),\n enhancing: computed(() => state.value.enhancing),\n routing: computed(() => state.value.routing),\n /** Props for an `EditCard`, and `regions` for `Composer`. `null` when there's no `editImage`. */\n edit: computed(() => store.edit(state.value, toValue(options).editImage)),\n };\n}\n\nexport type UseComposerReturn = ReturnType<typeof useComposer>;\n","import { computed, onScopeDispose, shallowRef, toValue, type MaybeRefOrGetter } from \"vue\";\nimport { createMediaAnalyzerStore, type MediaAnalyzerOptions } from \"@chai-ui/core\";\nimport { useReasoning } from \"./reasoning.js\";\n\nexport type UseMediaAnalyzerOptions = MediaAnalyzerOptions;\n\n/**\n * The Vue binding for `createMediaAnalyzerStore` in `@chai-ui/core`, behind\n * `MediaAnalyzer`'s submit: `prompt` fills in as the text streams.\n */\nexport function useMediaAnalyzer(options: MaybeRefOrGetter<UseMediaAnalyzerOptions> = {}) {\n const provided = useReasoning();\n const store = createMediaAnalyzerStore(\n () => toValue(options),\n () => provided.value\n );\n const state = shallowRef(store.getState());\n onScopeDispose(\n store.subscribe(() => (state.value = store.getState())),\n true\n );\n\n return {\n analyzing: computed(() => state.value.analyzing),\n error: computed(() => state.value.error),\n prompt: computed(() => state.value.prompt),\n submit: store.submit,\n cancel: store.cancel,\n reset: store.reset,\n };\n}\n\nexport type UseMediaAnalyzerReturn = ReturnType<typeof useMediaAnalyzer>;\n"],"names":["_renderSlot","_createElementBlock","_createElementVNode","_createBlock","_unref","_openBlock","_Fragment","_renderList","_hoisted_3","_resolveDynamicComponent","_createTextVNode","_toDisplayString","_hoisted_4","_hoisted_1","_createVNode","_hoisted_2","_hoisted_5","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","_hoisted_13","_normalizeStyle","_normalizeClass","_hoisted_6","Toggle","_hoisted_14","_hoisted_15","_hoisted_16","Chip","VoiceWaveform","PromptField","_hoisted_11","AttachMenu","SearchMenu","_mergeProps","VoiceButton","PageSlide","RegionShape","Pagination","ExpandedImage","IconButton","VideoPlayer","h","ResultText","ResultMedia","MoreMenu"],"mappings":"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"}