@flanksource/clicky-ui 0.3.23 → 0.3.25
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/data/ai/AdvancedChatConfig.cjs +3 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts +2 -1
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.js +3 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +77 -4
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +78 -5
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +19 -4
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.d.ts +2 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.js +19 -4
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +2 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +8 -1
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +2 -1
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +8 -1
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/chat/Chat.cjs +34 -7
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +9 -1
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +34 -7
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +13 -7
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +2 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +13 -7
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/ContextMeter.cjs +64 -27
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +11 -4
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +64 -27
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/Message.cjs +36 -1
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +1 -1
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +37 -2
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/approval.cjs +17 -0
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +5 -0
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +17 -0
- package/dist/data/chat/approval.js.map +1 -1
- package/dist/data/chat/fork-seed.cjs +22 -0
- package/dist/data/chat/fork-seed.cjs.map +1 -0
- package/dist/data/chat/fork-seed.d.ts +8 -0
- package/dist/data/chat/fork-seed.d.ts.map +1 -0
- package/dist/data/chat/fork-seed.js +22 -0
- package/dist/data/chat/fork-seed.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +19 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +10 -1
- package/dist/data/chat/usage-snapshot.cjs.map +1 -1
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
- package/dist/data/chat/usage-snapshot.js +10 -1
- package/dist/data/chat/usage-snapshot.js.map +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +3 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts +3 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +3 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs +15 -1
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarCombo.js +15 -1
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.cjs +7 -0
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts +2 -1
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBarSegments.js +7 -0
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/styles.css +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBarCombo.cjs","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport { isUnavailable } from \"./availability\";\nimport {\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarComboProps = {\n value: RuntimeBarValue;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n models: ChatModel[];\n selectedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n supportedEfforts: string[];\n ariaLabel: string;\n className?: string | undefined;\n onFamilyChange: (familyId: string) => void;\n onModeChange: (modeId: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarCombo({\n value,\n families,\n family,\n mode,\n selectedMode,\n models,\n selectedModel,\n selectedModelUnavailable,\n supportedEfforts,\n ariaLabel,\n className,\n onFamilyChange,\n onModeChange,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarComboProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : selectedModel?.label ?? value.model ?? \"Prompt default\";\n const effortLabel = value.effort ? effortLevelLabel(value.effort) : \"None\";\n const effortIcon = value.effort ? effortLevelIcon(value.effort) : undefined;\n const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}`;\n\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={`${ariaLabel} controls`}\n {...(className ? { className } : {})}\n menuClassName=\"max-h-[70vh] w-80 max-w-[calc(100vw-24px)] overflow-y-auto\"\n trigger={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={summary}\n aria-label={summary}\n className=\"max-w-full gap-1.5 px-density-2\"\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {modelLabel}\n </span>\n {effortIcon && (\n <Icon\n icon={effortIcon}\n className={cn(\n \"size-4 shrink-0\",\n value.effort ? effortLevelColor(value.effort) : undefined\n )}\n />\n )}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </Button>\n }\n >\n {() => (\n <div className=\"p-1 text-xs\">\n <div className=\"space-y-2 border-b border-border px-2 pb-3 pt-2\">\n <FamilySegments\n families={families}\n value={family.id}\n onChange={onFamilyChange}\n />\n <ModeSegments\n family={family}\n value={selectedMode}\n onChange={onModeChange}\n />\n <EffortSlider\n value={value.effort}\n efforts={supportedEfforts}\n onChange={onEffortChange}\n />\n </div>\n <ModelChoices\n models={models}\n familyBrand={brand}\n selectedId={selectedModel?.id ?? value.model}\n onSelect={onModelSelect}\n onClear={onModelClear}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction FamilySegments({\n families,\n value,\n onChange,\n}: {\n families: SpecRuntimeFamily[];\n value: string;\n onChange: (familyId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Family\"\n size=\"sm\"\n wrap\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability))\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n return {\n id: family.id,\n label: family.label,\n ...(brand.icon ? { icon: brand.icon } : {}),\n };\n })}\n />\n );\n}\n\nfunction ModeSegments({\n family,\n value,\n onChange,\n}: {\n family: SpecRuntimeFamily;\n value: string;\n onChange: (modeId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Runtime mode\"\n size=\"sm\"\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n id: mode.id,\n label: mode.label,\n ...(mode.title ? { title: mode.title } : {}),\n ...(mode.icon ? { icon: mode.icon } : {}),\n }))}\n />\n );\n}\n\nfunction ModelChoices({\n models,\n familyBrand,\n selectedId,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n familyBrand: ReturnType<typeof runtimeFamilyBrand>;\n selectedId?: string | undefined;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}) {\n return (\n <div className=\"space-y-0.5 py-1\">\n <ModelChoice\n label=\"Prompt default\"\n selected={!selectedId}\n onClick={onClear}\n />\n {models.map((model) => {\n const icon = providerIcon(model.provider) ?? familyBrand.icon;\n return (\n <ModelChoice\n key={model.id}\n label={model.label}\n title={model.id}\n selected={model.id === selectedId}\n {...(icon\n ? {\n icon,\n iconColor:\n providerIconColor(model.provider) ?? familyBrand.color,\n }\n : {})}\n onClick={() => onSelect(model)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction ModelChoice({\n label,\n title,\n detail,\n selected,\n icon,\n iconColor,\n onClick,\n}: {\n label: string;\n title?: string | undefined;\n detail?: string | undefined;\n selected: boolean;\n icon?: NonNullable<ReturnType<typeof providerIcon>>;\n iconColor?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={onClick}\n aria-label={detail ? `${label}. ${detail}` : label}\n {...(title ? { title } : {})}\n className=\"group flex min-h-8 w-full items-center justify-start gap-2 rounded-md px-2 py-1.5 text-left hover:bg-muted\"\n >\n {icon ? (\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted/70 ring-1 ring-border/60 group-hover:bg-background\">\n <Icon icon={icon} className={cn(\"size-3.5\", iconColor)} />\n </span>\n ) : (\n <span className=\"size-6 shrink-0\" />\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\"block truncate text-sm\", selected && \"font-semibold\")}\n >\n {label}\n </span>\n {detail && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {detail}\n </span>\n )}\n </span>\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\"\n )}\n />\n </Button>\n );\n}\n\nfunction EffortSlider({\n value,\n efforts,\n onChange,\n}: {\n value?: string | undefined;\n efforts: string[];\n onChange: (effort: string) => void;\n}) {\n const supported = [\n ...new Set(efforts.map((effort) => effort.trim()).filter(Boolean)),\n ];\n if (supported.length === 0) {\n return (\n <div className=\"flex h-8 items-center justify-center text-[11px] text-muted-foreground\">\n Fixed effort for this model\n </div>\n );\n }\n\n const options = [\"\", ...supported];\n const current = value?.trim() ?? \"\";\n const currentIndex = options.indexOf(current);\n const sliderIndex = currentIndex >= 0 ? currentIndex : 0;\n const label =\n currentIndex >= 0\n ? current\n ? effortLevelLabel(current)\n : \"None\"\n : `${effortLevelLabel(current)} unsupported`;\n const percent = (sliderIndex / (options.length - 1)) * 100;\n const firstIcon = effortLevelIcon(supported[0]!);\n const lastIcon = effortLevelIcon(supported[supported.length - 1]!);\n const selectedIcon = current ? effortLevelIcon(current) : undefined;\n\n return (\n <div\n className=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-1.5\"\n aria-label=\"Model effort\"\n >\n {firstIcon ? (\n <Icon\n icon={firstIcon}\n className={cn(\"mt-3 size-3.5\", effortLevelColor(supported[0]!))}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n <div className=\"relative h-11 pt-1\">\n <input\n type=\"range\"\n min={0}\n max={options.length - 1}\n step={1}\n value={sliderIndex}\n aria-label=\"Reasoning effort\"\n aria-valuetext={label}\n aria-invalid={currentIndex < 0}\n onChange={(event) => {\n const next = options[Number(event.target.value)];\n if (next === undefined) {\n throw new Error(\n `Invalid reasoning effort index: ${event.target.value}`\n );\n }\n onChange(next);\n }}\n className=\"h-1 w-full cursor-pointer appearance-none rounded-full bg-muted accent-foreground [&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background [&::-moz-range-thumb]:bg-foreground [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background [&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow-sm\"\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-7 -translate-x-1/2\"\n style={{ left: `${percent}%` }}\n >\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-1.5 text-[10px] font-semibold leading-none\",\n currentIndex < 0\n ? \"border-destructive/25 bg-destructive/10 text-destructive\"\n : current\n ? cn(\"border-current/25 bg-muted\", effortLevelColor(current))\n : \"border-border bg-muted text-muted-foreground\"\n )}\n title={`Effort: ${label}`}\n >\n {selectedIcon && <Icon icon={selectedIcon} className=\"size-3\" />}\n {label}\n </span>\n </span>\n </div>\n {lastIcon ? (\n <Icon\n icon={lastIcon}\n className={cn(\n \"mt-3 size-3.5\",\n effortLevelColor(supported[supported.length - 1]!)\n )}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n </div>\n );\n}\n"],"names":["runtimeFamilyBrand","effortLevelLabel","effortLevelIcon","jsx","DropdownMenu","jsxs","Button","Icon","cn","effortLevelColor","UiChevronDown","SegmentedControl","isUnavailable","providerIcon","providerIconColor","UiCheck"],"mappings":";;;;;;;;;;;;;;AAwCO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,QAAQA,iBAAAA,mBAAmB,MAAM;AACvC,QAAM,aAAa,2BACf,2BACA,+CAAe,UAAS,MAAM,SAAS;AAC3C,QAAM,cAAc,MAAM,SAASC,YAAAA,iBAAiB,MAAM,MAAM,IAAI;AACpE,QAAM,aAAa,MAAM,SAASC,YAAAA,gBAAgB,MAAM,MAAM,IAAI;AAClE,QAAM,UAAU,GAAG,SAAS,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,KAAK,UAAU,YAAY,WAAW;AAElG,SACEC,2BAAAA;AAAAA,IAACC,aAAAA;AAAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,WAAW,GAAG,SAAS;AAAA,MACtB,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,eAAc;AAAA,MACd,SACEC,2BAAAA;AAAAA,QAACC,OAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,OAAO;AAAA,UACP,cAAY;AAAA,UACZ,WAAU;AAAA,UAET,UAAA;AAAA,YAAA,MAAM,QACLH,2BAAAA;AAAAA,cAACI,KAAAA;AAAAA,cAAA;AAAA,gBACC,MAAM,MAAM;AAAA,gBACZ,WAAWC,MAAAA,GAAG,mBAAmB,MAAM,KAAK;AAAA,cAAA;AAAA,YAAA;AAAA,YAG/C,KAAK,QACJL,2BAAAA;AAAAA,cAACI,KAAAA;AAAAA,cAAA;AAAA,gBACC,MAAM,KAAK;AAAA,gBACX,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,YAGdJ,2BAAAA,IAAC,QAAA,EAAK,WAAU,0DACb,UAAA,YACH;AAAA,YACC,cACCA,2BAAAA;AAAAA,cAACI,KAAAA;AAAAA,cAAA;AAAA,gBACC,MAAM;AAAA,gBACN,WAAWC,MAAAA;AAAAA,kBACT;AAAA,kBACA,MAAM,SAASC,YAAAA,iBAAiB,MAAM,MAAM,IAAI;AAAA,gBAAA;AAAA,cAClD;AAAA,YAAA;AAAA,YAGJN,2BAAAA;AAAAA,cAACI,KAAAA;AAAAA,cAAA;AAAA,gBACC,MAAMG,cAAAA;AAAAA,gBACN,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,MAAA;AAAA,MAIH,UAAA,MACCL,2BAAAA,KAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,QAAAA,2BAAAA,KAAC,OAAA,EAAI,WAAU,mDACb,UAAA;AAAA,UAAAF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,OAAO,OAAO;AAAA,cACd,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA,OAAO;AAAA,cACP,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,MAAM;AAAA,cACb,SAAS;AAAA,cACT,UAAU;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,GACF;AAAA,QACAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,aAAa;AAAA,YACb,aAAY,+CAAe,OAAM,MAAM;AAAA,YACvC,UAAU;AAAA,YACV,SAAS;AAAA,UAAA;AAAA,QAAA;AAAA,MACX,EAAA,CACF;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACEA,2BAAAA;AAAAA,IAACQ,iBAAAA;AAAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL,MAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MACV,SAAS,SACN;AAAA,QAAO,CAAC,WACP,OAAO,MAAM,KAAK,CAAC,SAAS,CAACC,aAAAA,cAAc,KAAK,YAAY,CAAC;AAAA,MAAA,EAE9D,IAAI,CAAC,WAAW;AACf,cAAM,QAAQZ,iBAAAA,mBAAmB,MAAM;AACvC,eAAO;AAAA,UACL,IAAI,OAAO;AAAA,UACX,OAAO,OAAO;AAAA,UACd,GAAI,MAAM,OAAO,EAAE,MAAM,MAAM,KAAA,IAAS,CAAA;AAAA,QAAC;AAAA,MAE7C,CAAC;AAAA,IAAA;AAAA,EAAA;AAGT;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACEG,2BAAAA;AAAAA,IAACQ,iBAAAA;AAAAA,IAAA;AAAA,MACC,cAAW;AAAA,MACX,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAU;AAAA,MACV,SAAS,OAAO,MACb,OAAO,CAAC,SAAS,CAACC,2BAAc,KAAK,YAAY,CAAC,EAClD,IAAI,CAAC,UAAU;AAAA,QACd,IAAI,KAAK;AAAA,QACT,OAAO,KAAK;AAAA,QACZ,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAA,IAAU,CAAA;AAAA,QACzC,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAA,IAAS,CAAA;AAAA,MAAC,EACvC;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,SACEP,2BAAAA,KAAC,OAAA,EAAI,WAAU,oBACb,UAAA;AAAA,IAAAF,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,UAAU,CAAC;AAAA,QACX,SAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAEV,OAAO,IAAI,CAAC,UAAU;AACrB,YAAM,OAAOU,cAAAA,aAAa,MAAM,QAAQ,KAAK,YAAY;AACzD,aACEV,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UAEC,OAAO,MAAM;AAAA,UACb,OAAO,MAAM;AAAA,UACb,UAAU,MAAM,OAAO;AAAA,UACtB,GAAI,OACD;AAAA,YACE;AAAA,YACA,WACEW,cAAAA,kBAAkB,MAAM,QAAQ,KAAK,YAAY;AAAA,UAAA,IAErD,CAAA;AAAA,UACJ,SAAS,MAAM,SAAS,KAAK;AAAA,QAAA;AAAA,QAXxB,MAAM;AAAA,MAAA;AAAA,IAcjB,CAAC;AAAA,EAAA,GACH;AAEJ;AAEA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AACD,SACET,2BAAAA;AAAAA,IAACC,OAAAA;AAAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACA,cAAY,SAAS,GAAG,KAAK,KAAK,MAAM,KAAK;AAAA,MAC5C,GAAI,QAAQ,EAAE,MAAA,IAAU,CAAA;AAAA,MACzB,WAAU;AAAA,MAET,UAAA;AAAA,QAAA,sCACE,QAAA,EAAK,WAAU,kIACd,UAAAH,2BAAAA,IAACI,aAAK,MAAY,WAAWC,MAAAA,GAAG,YAAY,SAAS,EAAA,CAAG,EAAA,CAC1D,IAEAL,2BAAAA,IAAC,QAAA,EAAK,WAAU,mBAAkB;AAAA,QAEpCE,2BAAAA,KAAC,QAAA,EAAK,WAAU,kBACd,UAAA;AAAA,UAAAF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWK,MAAAA,GAAG,0BAA0B,YAAY,eAAe;AAAA,cAElE,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,UACCL,2BAAAA,IAAC,QAAA,EAAK,WAAU,uEACb,UAAA,OAAA,CACH;AAAA,QAAA,GAEJ;AAAA,QACAA,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAMQ,QAAAA;AAAAA,YACN,WAAWP,MAAAA;AAAAA,cACT;AAAA,cACA,CAAC,YAAY;AAAA,YAAA;AAAA,UACf;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,YAAY;AAAA,IAChB,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAA,CAAM,EAAE,OAAO,OAAO,CAAC;AAAA,EAAA;AAEnE,MAAI,UAAU,WAAW,GAAG;AAC1B,WACEL,2BAAAA,IAAC,OAAA,EAAI,WAAU,0EAAyE,UAAA,+BAExF;AAAA,EAEJ;AAEA,QAAM,UAAU,CAAC,IAAI,GAAG,SAAS;AACjC,QAAM,WAAU,+BAAO,WAAU;AACjC,QAAM,eAAe,QAAQ,QAAQ,OAAO;AAC5C,QAAM,cAAc,gBAAgB,IAAI,eAAe;AACvD,QAAM,QACJ,gBAAgB,IACZ,UACEF,YAAAA,iBAAiB,OAAO,IACxB,SACF,GAAGA,YAAAA,iBAAiB,OAAO,CAAC;AAClC,QAAM,UAAW,eAAe,QAAQ,SAAS,KAAM;AACvD,QAAM,YAAYC,YAAAA,gBAAgB,UAAU,CAAC,CAAE;AAC/C,QAAM,WAAWA,YAAAA,gBAAgB,UAAU,UAAU,SAAS,CAAC,CAAE;AACjE,QAAM,eAAe,UAAUA,4BAAgB,OAAO,IAAI;AAE1D,SACEG,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAW;AAAA,MAEV,UAAA;AAAA,QAAA,YACCF,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAWC,MAAAA,GAAG,iBAAiBC,YAAAA,iBAAiB,UAAU,CAAC,CAAE,CAAC;AAAA,UAAA;AAAA,QAAA,IAGhEN,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAA,CAAW;AAAA,QAE7BE,2BAAAA,KAAC,OAAA,EAAI,WAAU,sBACb,UAAA;AAAA,UAAAF,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK,QAAQ,SAAS;AAAA,cACtB,MAAM;AAAA,cACN,OAAO;AAAA,cACP,cAAW;AAAA,cACX,kBAAgB;AAAA,cAChB,gBAAc,eAAe;AAAA,cAC7B,UAAU,CAAC,UAAU;AACnB,sBAAM,OAAO,QAAQ,OAAO,MAAM,OAAO,KAAK,CAAC;AAC/C,oBAAI,SAAS,QAAW;AACtB,wBAAM,IAAI;AAAA,oBACR,mCAAmC,MAAM,OAAO,KAAK;AAAA,kBAAA;AAAA,gBAEzD;AACA,yBAAS,IAAI;AAAA,cACf;AAAA,cACA,WAAU;AAAA,YAAA;AAAA,UAAA;AAAA,UAEZA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,OAAO,EAAE,MAAM,GAAG,OAAO,IAAA;AAAA,cAEzB,UAAAE,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,WAAWG,MAAAA;AAAAA,oBACT;AAAA,oBACA,eAAe,IACX,6DACA,UACAA,MAAAA,GAAG,8BAA8BC,YAAAA,iBAAiB,OAAO,CAAC,IAC1D;AAAA,kBAAA;AAAA,kBAEN,OAAO,WAAW,KAAK;AAAA,kBAEtB,UAAA;AAAA,oBAAA,gBAAgBN,2BAAAA,IAACI,WAAA,EAAK,MAAM,cAAc,WAAU,UAAS;AAAA,oBAC7D;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YACH;AAAA,UAAA;AAAA,QACF,GACF;AAAA,QACC,WACCJ,2BAAAA;AAAAA,UAACI,KAAAA;AAAAA,UAAA;AAAA,YACC,MAAM;AAAA,YACN,WAAWC,MAAAA;AAAAA,cACT;AAAA,cACAC,YAAAA,iBAAiB,UAAU,UAAU,SAAS,CAAC,CAAE;AAAA,YAAA;AAAA,UACnD;AAAA,QAAA,IAGFN,+BAAC,QAAA,EAAK,WAAU,WAAA,CAAW;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAInC;;"}
|
|
1
|
+
{"version":3,"file":"RuntimeBarCombo.cjs","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport { isUnavailable } from \"./availability\";\nimport {\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarComboProps = {\n value: RuntimeBarValue;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n models: ChatModel[];\n selectedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n supportedEfforts: string[];\n locked: boolean;\n ariaLabel: string;\n className?: string | undefined;\n onFamilyChange: (familyId: string) => void;\n onModeChange: (modeId: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarCombo({\n value,\n families,\n family,\n mode,\n selectedMode,\n models,\n selectedModel,\n selectedModelUnavailable,\n supportedEfforts,\n locked,\n ariaLabel,\n className,\n onFamilyChange,\n onModeChange,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarComboProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : (selectedModel?.label ?? value.model ?? \"Prompt default\");\n const effortLabel = value.effort ? effortLevelLabel(value.effort) : \"None\";\n const effortIcon = value.effort ? effortLevelIcon(value.effort) : undefined;\n const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}${locked ? \". Model and backend are locked for this conversation; fork it to change them\" : \"\"}`;\n\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={`${ariaLabel} controls`}\n {...(className ? { className } : {})}\n menuClassName=\"max-h-[70vh] w-80 max-w-[calc(100vw-24px)] overflow-y-auto\"\n trigger={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={summary}\n aria-label={summary}\n className=\"max-w-full gap-1.5 px-density-2\"\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {modelLabel}\n </span>\n {effortIcon && (\n <Icon\n icon={effortIcon}\n className={cn(\n \"size-4 shrink-0\",\n value.effort ? effortLevelColor(value.effort) : undefined,\n )}\n />\n )}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </Button>\n }\n >\n {() => (\n <div className=\"p-1 text-xs\">\n <div className=\"space-y-2 border-b border-border px-2 pb-3 pt-2\">\n {locked && (\n <div className=\"rounded bg-muted px-2 py-1.5 text-[11px] text-muted-foreground\">\n Model and backend are locked. Fork this conversation to change\n them.\n </div>\n )}\n <FamilySegments\n families={families}\n value={family.id}\n locked={locked}\n onChange={onFamilyChange}\n />\n <ModeSegments\n family={family}\n value={selectedMode}\n locked={locked}\n onChange={onModeChange}\n />\n <EffortSlider\n value={value.effort}\n efforts={supportedEfforts}\n onChange={onEffortChange}\n />\n </div>\n <ModelChoices\n models={models}\n familyBrand={brand}\n selectedId={selectedModel?.id ?? value.model}\n locked={locked}\n onSelect={onModelSelect}\n onClear={onModelClear}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction FamilySegments({\n families,\n value,\n locked,\n onChange,\n}: {\n families: SpecRuntimeFamily[];\n value: string;\n locked: boolean;\n onChange: (familyId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Family\"\n size=\"sm\"\n wrap\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability)),\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n return {\n id: family.id,\n label: family.label,\n disabled: locked,\n ...(brand.icon ? { icon: brand.icon } : {}),\n };\n })}\n />\n );\n}\n\nfunction ModeSegments({\n family,\n value,\n locked,\n onChange,\n}: {\n family: SpecRuntimeFamily;\n value: string;\n locked: boolean;\n onChange: (modeId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Runtime mode\"\n size=\"sm\"\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n id: mode.id,\n label: mode.label,\n disabled: locked,\n ...(mode.title ? { title: mode.title } : {}),\n ...(mode.icon ? { icon: mode.icon } : {}),\n }))}\n />\n );\n}\n\nfunction ModelChoices({\n models,\n familyBrand,\n selectedId,\n locked,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n familyBrand: ReturnType<typeof runtimeFamilyBrand>;\n selectedId?: string | undefined;\n locked: boolean;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}) {\n return (\n <div className=\"space-y-0.5 py-1\">\n <ModelChoice\n label=\"Prompt default\"\n selected={!selectedId}\n disabled={locked}\n onClick={onClear}\n />\n {models.map((model) => {\n const icon = providerIcon(model.provider) ?? familyBrand.icon;\n return (\n <ModelChoice\n key={model.id}\n label={model.label}\n title={model.id}\n selected={model.id === selectedId}\n disabled={locked}\n {...(icon\n ? {\n icon,\n iconColor:\n providerIconColor(model.provider) ?? familyBrand.color,\n }\n : {})}\n onClick={() => onSelect(model)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction ModelChoice({\n label,\n title,\n detail,\n selected,\n disabled,\n icon,\n iconColor,\n onClick,\n}: {\n label: string;\n title?: string | undefined;\n detail?: string | undefined;\n selected: boolean;\n disabled: boolean;\n icon?: NonNullable<ReturnType<typeof providerIcon>>;\n iconColor?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <Button\n variant=\"ghost\"\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n aria-label={detail ? `${label}. ${detail}` : label}\n {...(title ? { title } : {})}\n className=\"group flex min-h-8 w-full items-center justify-start gap-2 rounded-md px-2 py-1.5 text-left hover:bg-muted\"\n >\n {icon ? (\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted/70 ring-1 ring-border/60 group-hover:bg-background\">\n <Icon icon={icon} className={cn(\"size-3.5\", iconColor)} />\n </span>\n ) : (\n <span className=\"size-6 shrink-0\" />\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\"block truncate text-sm\", selected && \"font-semibold\")}\n >\n {label}\n </span>\n {detail && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {detail}\n </span>\n )}\n </span>\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\",\n )}\n />\n </Button>\n );\n}\n\nfunction EffortSlider({\n value,\n efforts,\n onChange,\n}: {\n value?: string | undefined;\n efforts: string[];\n onChange: (effort: string) => void;\n}) {\n const supported = [\n ...new Set(efforts.map((effort) => effort.trim()).filter(Boolean)),\n ];\n if (supported.length === 0) {\n return (\n <div className=\"flex h-8 items-center justify-center text-[11px] text-muted-foreground\">\n Fixed effort for this model\n </div>\n );\n }\n\n const options = [\"\", ...supported];\n const current = value?.trim() ?? \"\";\n const currentIndex = options.indexOf(current);\n const sliderIndex = currentIndex >= 0 ? currentIndex : 0;\n const label =\n currentIndex >= 0\n ? current\n ? effortLevelLabel(current)\n : \"None\"\n : `${effortLevelLabel(current)} unsupported`;\n const percent = (sliderIndex / (options.length - 1)) * 100;\n const firstIcon = effortLevelIcon(supported[0]!);\n const lastIcon = effortLevelIcon(supported[supported.length - 1]!);\n const selectedIcon = current ? effortLevelIcon(current) : undefined;\n\n return (\n <div\n className=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-1.5\"\n aria-label=\"Model effort\"\n >\n {firstIcon ? (\n <Icon\n icon={firstIcon}\n className={cn(\"mt-3 size-3.5\", effortLevelColor(supported[0]!))}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n <div className=\"relative h-11 pt-1\">\n <input\n type=\"range\"\n min={0}\n max={options.length - 1}\n step={1}\n value={sliderIndex}\n aria-label=\"Reasoning effort\"\n aria-valuetext={label}\n aria-invalid={currentIndex < 0}\n onChange={(event) => {\n const next = options[Number(event.target.value)];\n if (next === undefined) {\n throw new Error(\n `Invalid reasoning effort index: ${event.target.value}`,\n );\n }\n onChange(next);\n }}\n className=\"h-1 w-full cursor-pointer appearance-none rounded-full bg-muted accent-foreground [&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background [&::-moz-range-thumb]:bg-foreground [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background [&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow-sm\"\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-7 -translate-x-1/2\"\n style={{ left: `${percent}%` }}\n >\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-1.5 text-[10px] font-semibold leading-none\",\n currentIndex < 0\n ? \"border-destructive/25 bg-destructive/10 text-destructive\"\n : current\n ? cn(\"border-current/25 bg-muted\", effortLevelColor(current))\n : \"border-border bg-muted text-muted-foreground\",\n )}\n title={`Effort: ${label}`}\n >\n {selectedIcon && <Icon icon={selectedIcon} className=\"size-3\" />}\n {label}\n </span>\n </span>\n </div>\n {lastIcon ? (\n <Icon\n icon={lastIcon}\n className={cn(\n \"mt-3 size-3.5\",\n effortLevelColor(supported[supported.length - 1]!),\n )}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n </div>\n );\n}\n"],"names":["runtimeFamilyBrand","effortLevelLabel","effortLevelIcon","jsx","DropdownMenu","jsxs","Button","Icon","cn","effortLevelColor","UiChevronDown","SegmentedControl","isUnavailable","providerIcon","providerIconColor","UiCheck"],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ export type RuntimeBarComboProps = {
|
|
|
11
11
|
selectedModel: ChatModel | undefined;
|
|
12
12
|
selectedModelUnavailable: boolean;
|
|
13
13
|
supportedEfforts: string[];
|
|
14
|
+
locked: boolean;
|
|
14
15
|
ariaLabel: string;
|
|
15
16
|
className?: string | undefined;
|
|
16
17
|
onFamilyChange: (familyId: string) => void;
|
|
@@ -19,5 +20,5 @@ export type RuntimeBarComboProps = {
|
|
|
19
20
|
onModelClear: () => void;
|
|
20
21
|
onEffortChange: (effort: string) => void;
|
|
21
22
|
};
|
|
22
|
-
export declare function RuntimeBarCombo({ value, families, family, mode, selectedMode, models, selectedModel, selectedModelUnavailable, supportedEfforts, ariaLabel, className, onFamilyChange, onModeChange, onModelSelect, onModelClear, onEffortChange, }: RuntimeBarComboProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export declare function RuntimeBarCombo({ value, families, family, mode, selectedMode, models, selectedModel, selectedModelUnavailable, supportedEfforts, locked, ariaLabel, className, onFamilyChange, onModeChange, onModelSelect, onModelClear, onEffortChange, }: RuntimeBarComboProps): import("react/jsx-runtime").JSX.Element;
|
|
23
24
|
//# sourceMappingURL=RuntimeBarCombo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBarCombo.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,wBAAwB,EAAE,OAAO,CAAC;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,GACf,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"RuntimeBarCombo.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,wBAAwB,EAAE,OAAO,CAAC;IAClC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,MAAM,EACN,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,SAAS,EACT,cAAc,EACd,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,cAAc,GACf,EAAE,oBAAoB,2CA8FtB"}
|
|
@@ -20,6 +20,7 @@ function RuntimeBarCombo({
|
|
|
20
20
|
selectedModel,
|
|
21
21
|
selectedModelUnavailable,
|
|
22
22
|
supportedEfforts,
|
|
23
|
+
locked,
|
|
23
24
|
ariaLabel,
|
|
24
25
|
className,
|
|
25
26
|
onFamilyChange,
|
|
@@ -32,7 +33,7 @@ function RuntimeBarCombo({
|
|
|
32
33
|
const modelLabel = selectedModelUnavailable ? "Unavailable selection" : (selectedModel == null ? void 0 : selectedModel.label) ?? value.model ?? "Prompt default";
|
|
33
34
|
const effortLabel = value.effort ? effortLevelLabel(value.effort) : "None";
|
|
34
35
|
const effortIcon = value.effort ? effortLevelIcon(value.effort) : void 0;
|
|
35
|
-
const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}`;
|
|
36
|
+
const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}${locked ? ". Model and backend are locked for this conversation; fork it to change them" : ""}`;
|
|
36
37
|
return /* @__PURE__ */ jsx(
|
|
37
38
|
DropdownMenu,
|
|
38
39
|
{
|
|
@@ -87,11 +88,13 @@ function RuntimeBarCombo({
|
|
|
87
88
|
),
|
|
88
89
|
children: () => /* @__PURE__ */ jsxs("div", { className: "p-1 text-xs", children: [
|
|
89
90
|
/* @__PURE__ */ jsxs("div", { className: "space-y-2 border-b border-border px-2 pb-3 pt-2", children: [
|
|
91
|
+
locked && /* @__PURE__ */ jsx("div", { className: "rounded bg-muted px-2 py-1.5 text-[11px] text-muted-foreground", children: "Model and backend are locked. Fork this conversation to change them." }),
|
|
90
92
|
/* @__PURE__ */ jsx(
|
|
91
93
|
FamilySegments,
|
|
92
94
|
{
|
|
93
95
|
families,
|
|
94
96
|
value: family.id,
|
|
97
|
+
locked,
|
|
95
98
|
onChange: onFamilyChange
|
|
96
99
|
}
|
|
97
100
|
),
|
|
@@ -100,6 +103,7 @@ function RuntimeBarCombo({
|
|
|
100
103
|
{
|
|
101
104
|
family,
|
|
102
105
|
value: selectedMode,
|
|
106
|
+
locked,
|
|
103
107
|
onChange: onModeChange
|
|
104
108
|
}
|
|
105
109
|
),
|
|
@@ -118,6 +122,7 @@ function RuntimeBarCombo({
|
|
|
118
122
|
models,
|
|
119
123
|
familyBrand: brand,
|
|
120
124
|
selectedId: (selectedModel == null ? void 0 : selectedModel.id) ?? value.model,
|
|
125
|
+
locked,
|
|
121
126
|
onSelect: onModelSelect,
|
|
122
127
|
onClear: onModelClear
|
|
123
128
|
}
|
|
@@ -129,6 +134,7 @@ function RuntimeBarCombo({
|
|
|
129
134
|
function FamilySegments({
|
|
130
135
|
families,
|
|
131
136
|
value,
|
|
137
|
+
locked,
|
|
132
138
|
onChange
|
|
133
139
|
}) {
|
|
134
140
|
return /* @__PURE__ */ jsx(
|
|
@@ -147,6 +153,7 @@ function FamilySegments({
|
|
|
147
153
|
return {
|
|
148
154
|
id: family.id,
|
|
149
155
|
label: family.label,
|
|
156
|
+
disabled: locked,
|
|
150
157
|
...brand.icon ? { icon: brand.icon } : {}
|
|
151
158
|
};
|
|
152
159
|
})
|
|
@@ -156,6 +163,7 @@ function FamilySegments({
|
|
|
156
163
|
function ModeSegments({
|
|
157
164
|
family,
|
|
158
165
|
value,
|
|
166
|
+
locked,
|
|
159
167
|
onChange
|
|
160
168
|
}) {
|
|
161
169
|
return /* @__PURE__ */ jsx(
|
|
@@ -169,6 +177,7 @@ function ModeSegments({
|
|
|
169
177
|
options: family.modes.filter((mode) => !isUnavailable(mode.availability)).map((mode) => ({
|
|
170
178
|
id: mode.id,
|
|
171
179
|
label: mode.label,
|
|
180
|
+
disabled: locked,
|
|
172
181
|
...mode.title ? { title: mode.title } : {},
|
|
173
182
|
...mode.icon ? { icon: mode.icon } : {}
|
|
174
183
|
}))
|
|
@@ -179,6 +188,7 @@ function ModelChoices({
|
|
|
179
188
|
models,
|
|
180
189
|
familyBrand,
|
|
181
190
|
selectedId,
|
|
191
|
+
locked,
|
|
182
192
|
onSelect,
|
|
183
193
|
onClear
|
|
184
194
|
}) {
|
|
@@ -188,6 +198,7 @@ function ModelChoices({
|
|
|
188
198
|
{
|
|
189
199
|
label: "Prompt default",
|
|
190
200
|
selected: !selectedId,
|
|
201
|
+
disabled: locked,
|
|
191
202
|
onClick: onClear
|
|
192
203
|
}
|
|
193
204
|
),
|
|
@@ -199,6 +210,7 @@ function ModelChoices({
|
|
|
199
210
|
label: model.label,
|
|
200
211
|
title: model.id,
|
|
201
212
|
selected: model.id === selectedId,
|
|
213
|
+
disabled: locked,
|
|
202
214
|
...icon ? {
|
|
203
215
|
icon,
|
|
204
216
|
iconColor: providerIconColor(model.provider) ?? familyBrand.color
|
|
@@ -215,6 +227,7 @@ function ModelChoice({
|
|
|
215
227
|
title,
|
|
216
228
|
detail,
|
|
217
229
|
selected,
|
|
230
|
+
disabled,
|
|
218
231
|
icon,
|
|
219
232
|
iconColor,
|
|
220
233
|
onClick
|
|
@@ -224,6 +237,7 @@ function ModelChoice({
|
|
|
224
237
|
{
|
|
225
238
|
variant: "ghost",
|
|
226
239
|
type: "button",
|
|
240
|
+
disabled,
|
|
227
241
|
onClick,
|
|
228
242
|
"aria-label": detail ? `${label}. ${detail}` : label,
|
|
229
243
|
...title ? { title } : {},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBarCombo.js","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport { isUnavailable } from \"./availability\";\nimport {\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarComboProps = {\n value: RuntimeBarValue;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n models: ChatModel[];\n selectedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n supportedEfforts: string[];\n ariaLabel: string;\n className?: string | undefined;\n onFamilyChange: (familyId: string) => void;\n onModeChange: (modeId: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarCombo({\n value,\n families,\n family,\n mode,\n selectedMode,\n models,\n selectedModel,\n selectedModelUnavailable,\n supportedEfforts,\n ariaLabel,\n className,\n onFamilyChange,\n onModeChange,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarComboProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : selectedModel?.label ?? value.model ?? \"Prompt default\";\n const effortLabel = value.effort ? effortLevelLabel(value.effort) : \"None\";\n const effortIcon = value.effort ? effortLevelIcon(value.effort) : undefined;\n const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}`;\n\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={`${ariaLabel} controls`}\n {...(className ? { className } : {})}\n menuClassName=\"max-h-[70vh] w-80 max-w-[calc(100vw-24px)] overflow-y-auto\"\n trigger={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={summary}\n aria-label={summary}\n className=\"max-w-full gap-1.5 px-density-2\"\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {modelLabel}\n </span>\n {effortIcon && (\n <Icon\n icon={effortIcon}\n className={cn(\n \"size-4 shrink-0\",\n value.effort ? effortLevelColor(value.effort) : undefined\n )}\n />\n )}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </Button>\n }\n >\n {() => (\n <div className=\"p-1 text-xs\">\n <div className=\"space-y-2 border-b border-border px-2 pb-3 pt-2\">\n <FamilySegments\n families={families}\n value={family.id}\n onChange={onFamilyChange}\n />\n <ModeSegments\n family={family}\n value={selectedMode}\n onChange={onModeChange}\n />\n <EffortSlider\n value={value.effort}\n efforts={supportedEfforts}\n onChange={onEffortChange}\n />\n </div>\n <ModelChoices\n models={models}\n familyBrand={brand}\n selectedId={selectedModel?.id ?? value.model}\n onSelect={onModelSelect}\n onClear={onModelClear}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction FamilySegments({\n families,\n value,\n onChange,\n}: {\n families: SpecRuntimeFamily[];\n value: string;\n onChange: (familyId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Family\"\n size=\"sm\"\n wrap\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability))\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n return {\n id: family.id,\n label: family.label,\n ...(brand.icon ? { icon: brand.icon } : {}),\n };\n })}\n />\n );\n}\n\nfunction ModeSegments({\n family,\n value,\n onChange,\n}: {\n family: SpecRuntimeFamily;\n value: string;\n onChange: (modeId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Runtime mode\"\n size=\"sm\"\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n id: mode.id,\n label: mode.label,\n ...(mode.title ? { title: mode.title } : {}),\n ...(mode.icon ? { icon: mode.icon } : {}),\n }))}\n />\n );\n}\n\nfunction ModelChoices({\n models,\n familyBrand,\n selectedId,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n familyBrand: ReturnType<typeof runtimeFamilyBrand>;\n selectedId?: string | undefined;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}) {\n return (\n <div className=\"space-y-0.5 py-1\">\n <ModelChoice\n label=\"Prompt default\"\n selected={!selectedId}\n onClick={onClear}\n />\n {models.map((model) => {\n const icon = providerIcon(model.provider) ?? familyBrand.icon;\n return (\n <ModelChoice\n key={model.id}\n label={model.label}\n title={model.id}\n selected={model.id === selectedId}\n {...(icon\n ? {\n icon,\n iconColor:\n providerIconColor(model.provider) ?? familyBrand.color,\n }\n : {})}\n onClick={() => onSelect(model)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction ModelChoice({\n label,\n title,\n detail,\n selected,\n icon,\n iconColor,\n onClick,\n}: {\n label: string;\n title?: string | undefined;\n detail?: string | undefined;\n selected: boolean;\n icon?: NonNullable<ReturnType<typeof providerIcon>>;\n iconColor?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <Button\n variant=\"ghost\"\n type=\"button\"\n onClick={onClick}\n aria-label={detail ? `${label}. ${detail}` : label}\n {...(title ? { title } : {})}\n className=\"group flex min-h-8 w-full items-center justify-start gap-2 rounded-md px-2 py-1.5 text-left hover:bg-muted\"\n >\n {icon ? (\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted/70 ring-1 ring-border/60 group-hover:bg-background\">\n <Icon icon={icon} className={cn(\"size-3.5\", iconColor)} />\n </span>\n ) : (\n <span className=\"size-6 shrink-0\" />\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\"block truncate text-sm\", selected && \"font-semibold\")}\n >\n {label}\n </span>\n {detail && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {detail}\n </span>\n )}\n </span>\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\"\n )}\n />\n </Button>\n );\n}\n\nfunction EffortSlider({\n value,\n efforts,\n onChange,\n}: {\n value?: string | undefined;\n efforts: string[];\n onChange: (effort: string) => void;\n}) {\n const supported = [\n ...new Set(efforts.map((effort) => effort.trim()).filter(Boolean)),\n ];\n if (supported.length === 0) {\n return (\n <div className=\"flex h-8 items-center justify-center text-[11px] text-muted-foreground\">\n Fixed effort for this model\n </div>\n );\n }\n\n const options = [\"\", ...supported];\n const current = value?.trim() ?? \"\";\n const currentIndex = options.indexOf(current);\n const sliderIndex = currentIndex >= 0 ? currentIndex : 0;\n const label =\n currentIndex >= 0\n ? current\n ? effortLevelLabel(current)\n : \"None\"\n : `${effortLevelLabel(current)} unsupported`;\n const percent = (sliderIndex / (options.length - 1)) * 100;\n const firstIcon = effortLevelIcon(supported[0]!);\n const lastIcon = effortLevelIcon(supported[supported.length - 1]!);\n const selectedIcon = current ? effortLevelIcon(current) : undefined;\n\n return (\n <div\n className=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-1.5\"\n aria-label=\"Model effort\"\n >\n {firstIcon ? (\n <Icon\n icon={firstIcon}\n className={cn(\"mt-3 size-3.5\", effortLevelColor(supported[0]!))}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n <div className=\"relative h-11 pt-1\">\n <input\n type=\"range\"\n min={0}\n max={options.length - 1}\n step={1}\n value={sliderIndex}\n aria-label=\"Reasoning effort\"\n aria-valuetext={label}\n aria-invalid={currentIndex < 0}\n onChange={(event) => {\n const next = options[Number(event.target.value)];\n if (next === undefined) {\n throw new Error(\n `Invalid reasoning effort index: ${event.target.value}`\n );\n }\n onChange(next);\n }}\n className=\"h-1 w-full cursor-pointer appearance-none rounded-full bg-muted accent-foreground [&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background [&::-moz-range-thumb]:bg-foreground [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background [&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow-sm\"\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-7 -translate-x-1/2\"\n style={{ left: `${percent}%` }}\n >\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-1.5 text-[10px] font-semibold leading-none\",\n currentIndex < 0\n ? \"border-destructive/25 bg-destructive/10 text-destructive\"\n : current\n ? cn(\"border-current/25 bg-muted\", effortLevelColor(current))\n : \"border-border bg-muted text-muted-foreground\"\n )}\n title={`Effort: ${label}`}\n >\n {selectedIcon && <Icon icon={selectedIcon} className=\"size-3\" />}\n {label}\n </span>\n </span>\n </div>\n {lastIcon ? (\n <Icon\n icon={lastIcon}\n className={cn(\n \"mt-3 size-3.5\",\n effortLevelColor(supported[supported.length - 1]!)\n )}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuntimeBarCombo.js","sources":["../../../src/data/runtime/RuntimeBarCombo.tsx"],"sourcesContent":["import { Button } from \"../../components/button\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Icon } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon, providerIconColor } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport { isUnavailable } from \"./availability\";\nimport {\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarComboProps = {\n value: RuntimeBarValue;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n models: ChatModel[];\n selectedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n supportedEfforts: string[];\n locked: boolean;\n ariaLabel: string;\n className?: string | undefined;\n onFamilyChange: (familyId: string) => void;\n onModeChange: (modeId: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarCombo({\n value,\n families,\n family,\n mode,\n selectedMode,\n models,\n selectedModel,\n selectedModelUnavailable,\n supportedEfforts,\n locked,\n ariaLabel,\n className,\n onFamilyChange,\n onModeChange,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarComboProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : (selectedModel?.label ?? value.model ?? \"Prompt default\");\n const effortLabel = value.effort ? effortLevelLabel(value.effort) : \"None\";\n const effortIcon = value.effort ? effortLevelIcon(value.effort) : undefined;\n const summary = `${ariaLabel}: ${family.label}, ${mode.label}, ${modelLabel}, effort ${effortLabel}${locked ? \". Model and backend are locked for this conversation; fork it to change them\" : \"\"}`;\n\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={`${ariaLabel} controls`}\n {...(className ? { className } : {})}\n menuClassName=\"max-h-[70vh] w-80 max-w-[calc(100vw-24px)] overflow-y-auto\"\n trigger={\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={summary}\n aria-label={summary}\n className=\"max-w-full gap-1.5 px-density-2\"\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className=\"min-w-0 truncate text-xs font-semibold text-foreground\">\n {modelLabel}\n </span>\n {effortIcon && (\n <Icon\n icon={effortIcon}\n className={cn(\n \"size-4 shrink-0\",\n value.effort ? effortLevelColor(value.effort) : undefined,\n )}\n />\n )}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </Button>\n }\n >\n {() => (\n <div className=\"p-1 text-xs\">\n <div className=\"space-y-2 border-b border-border px-2 pb-3 pt-2\">\n {locked && (\n <div className=\"rounded bg-muted px-2 py-1.5 text-[11px] text-muted-foreground\">\n Model and backend are locked. Fork this conversation to change\n them.\n </div>\n )}\n <FamilySegments\n families={families}\n value={family.id}\n locked={locked}\n onChange={onFamilyChange}\n />\n <ModeSegments\n family={family}\n value={selectedMode}\n locked={locked}\n onChange={onModeChange}\n />\n <EffortSlider\n value={value.effort}\n efforts={supportedEfforts}\n onChange={onEffortChange}\n />\n </div>\n <ModelChoices\n models={models}\n familyBrand={brand}\n selectedId={selectedModel?.id ?? value.model}\n locked={locked}\n onSelect={onModelSelect}\n onClear={onModelClear}\n />\n </div>\n )}\n </DropdownMenu>\n );\n}\n\nfunction FamilySegments({\n families,\n value,\n locked,\n onChange,\n}: {\n families: SpecRuntimeFamily[];\n value: string;\n locked: boolean;\n onChange: (familyId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Family\"\n size=\"sm\"\n wrap\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability)),\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n return {\n id: family.id,\n label: family.label,\n disabled: locked,\n ...(brand.icon ? { icon: brand.icon } : {}),\n };\n })}\n />\n );\n}\n\nfunction ModeSegments({\n family,\n value,\n locked,\n onChange,\n}: {\n family: SpecRuntimeFamily;\n value: string;\n locked: boolean;\n onChange: (modeId: string) => void;\n}) {\n return (\n <SegmentedControl\n aria-label=\"Runtime mode\"\n size=\"sm\"\n value={value}\n onChange={onChange}\n className=\"w-full\"\n options={family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n id: mode.id,\n label: mode.label,\n disabled: locked,\n ...(mode.title ? { title: mode.title } : {}),\n ...(mode.icon ? { icon: mode.icon } : {}),\n }))}\n />\n );\n}\n\nfunction ModelChoices({\n models,\n familyBrand,\n selectedId,\n locked,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n familyBrand: ReturnType<typeof runtimeFamilyBrand>;\n selectedId?: string | undefined;\n locked: boolean;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}) {\n return (\n <div className=\"space-y-0.5 py-1\">\n <ModelChoice\n label=\"Prompt default\"\n selected={!selectedId}\n disabled={locked}\n onClick={onClear}\n />\n {models.map((model) => {\n const icon = providerIcon(model.provider) ?? familyBrand.icon;\n return (\n <ModelChoice\n key={model.id}\n label={model.label}\n title={model.id}\n selected={model.id === selectedId}\n disabled={locked}\n {...(icon\n ? {\n icon,\n iconColor:\n providerIconColor(model.provider) ?? familyBrand.color,\n }\n : {})}\n onClick={() => onSelect(model)}\n />\n );\n })}\n </div>\n );\n}\n\nfunction ModelChoice({\n label,\n title,\n detail,\n selected,\n disabled,\n icon,\n iconColor,\n onClick,\n}: {\n label: string;\n title?: string | undefined;\n detail?: string | undefined;\n selected: boolean;\n disabled: boolean;\n icon?: NonNullable<ReturnType<typeof providerIcon>>;\n iconColor?: string | undefined;\n onClick: () => void;\n}) {\n return (\n <Button\n variant=\"ghost\"\n type=\"button\"\n disabled={disabled}\n onClick={onClick}\n aria-label={detail ? `${label}. ${detail}` : label}\n {...(title ? { title } : {})}\n className=\"group flex min-h-8 w-full items-center justify-start gap-2 rounded-md px-2 py-1.5 text-left hover:bg-muted\"\n >\n {icon ? (\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md bg-muted/70 ring-1 ring-border/60 group-hover:bg-background\">\n <Icon icon={icon} className={cn(\"size-3.5\", iconColor)} />\n </span>\n ) : (\n <span className=\"size-6 shrink-0\" />\n )}\n <span className=\"min-w-0 flex-1\">\n <span\n className={cn(\"block truncate text-sm\", selected && \"font-semibold\")}\n >\n {label}\n </span>\n {detail && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {detail}\n </span>\n )}\n </span>\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\",\n )}\n />\n </Button>\n );\n}\n\nfunction EffortSlider({\n value,\n efforts,\n onChange,\n}: {\n value?: string | undefined;\n efforts: string[];\n onChange: (effort: string) => void;\n}) {\n const supported = [\n ...new Set(efforts.map((effort) => effort.trim()).filter(Boolean)),\n ];\n if (supported.length === 0) {\n return (\n <div className=\"flex h-8 items-center justify-center text-[11px] text-muted-foreground\">\n Fixed effort for this model\n </div>\n );\n }\n\n const options = [\"\", ...supported];\n const current = value?.trim() ?? \"\";\n const currentIndex = options.indexOf(current);\n const sliderIndex = currentIndex >= 0 ? currentIndex : 0;\n const label =\n currentIndex >= 0\n ? current\n ? effortLevelLabel(current)\n : \"None\"\n : `${effortLevelLabel(current)} unsupported`;\n const percent = (sliderIndex / (options.length - 1)) * 100;\n const firstIcon = effortLevelIcon(supported[0]!);\n const lastIcon = effortLevelIcon(supported[supported.length - 1]!);\n const selectedIcon = current ? effortLevelIcon(current) : undefined;\n\n return (\n <div\n className=\"grid grid-cols-[auto_minmax(0,1fr)_auto] items-start gap-1.5\"\n aria-label=\"Model effort\"\n >\n {firstIcon ? (\n <Icon\n icon={firstIcon}\n className={cn(\"mt-3 size-3.5\", effortLevelColor(supported[0]!))}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n <div className=\"relative h-11 pt-1\">\n <input\n type=\"range\"\n min={0}\n max={options.length - 1}\n step={1}\n value={sliderIndex}\n aria-label=\"Reasoning effort\"\n aria-valuetext={label}\n aria-invalid={currentIndex < 0}\n onChange={(event) => {\n const next = options[Number(event.target.value)];\n if (next === undefined) {\n throw new Error(\n `Invalid reasoning effort index: ${event.target.value}`,\n );\n }\n onChange(next);\n }}\n className=\"h-1 w-full cursor-pointer appearance-none rounded-full bg-muted accent-foreground [&::-moz-range-thumb]:size-3 [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-2 [&::-moz-range-thumb]:border-background [&::-moz-range-thumb]:bg-foreground [&::-webkit-slider-thumb]:size-3 [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border-2 [&::-webkit-slider-thumb]:border-background [&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow-sm\"\n />\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute top-7 -translate-x-1/2\"\n style={{ left: `${percent}%` }}\n >\n <span\n className={cn(\n \"inline-flex h-5 shrink-0 items-center gap-1 rounded-full border px-1.5 text-[10px] font-semibold leading-none\",\n currentIndex < 0\n ? \"border-destructive/25 bg-destructive/10 text-destructive\"\n : current\n ? cn(\"border-current/25 bg-muted\", effortLevelColor(current))\n : \"border-border bg-muted text-muted-foreground\",\n )}\n title={`Effort: ${label}`}\n >\n {selectedIcon && <Icon icon={selectedIcon} className=\"size-3\" />}\n {label}\n </span>\n </span>\n </div>\n {lastIcon ? (\n <Icon\n icon={lastIcon}\n className={cn(\n \"mt-3 size-3.5\",\n effortLevelColor(supported[supported.length - 1]!),\n )}\n />\n ) : (\n <span className=\"size-3.5\" />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ function RuntimeBarSegments({
|
|
|
24
24
|
selectedMode,
|
|
25
25
|
reasoningEfforts,
|
|
26
26
|
supportedEfforts,
|
|
27
|
+
locked,
|
|
27
28
|
ariaLabel,
|
|
28
29
|
className,
|
|
29
30
|
onBackendChange,
|
|
@@ -49,6 +50,7 @@ function RuntimeBarSegments({
|
|
|
49
50
|
{
|
|
50
51
|
menuLabel: "Family",
|
|
51
52
|
title: `Family — ${family.label}`,
|
|
53
|
+
disabled: locked,
|
|
52
54
|
items: familyItems({
|
|
53
55
|
families,
|
|
54
56
|
models,
|
|
@@ -72,6 +74,7 @@ function RuntimeBarSegments({
|
|
|
72
74
|
{
|
|
73
75
|
menuLabel: "Runtime mode",
|
|
74
76
|
title: mode.title ?? "Runtime mode",
|
|
77
|
+
disabled: locked,
|
|
75
78
|
items: modeItems({
|
|
76
79
|
family,
|
|
77
80
|
selectedId: selectedMode,
|
|
@@ -94,6 +97,7 @@ function RuntimeBarSegments({
|
|
|
94
97
|
{
|
|
95
98
|
menuLabel: "Model",
|
|
96
99
|
title: selectedModelUnavailable ? "Model — unavailable selection" : value.model ? `Model — ${value.model}` : "Model — prompt default",
|
|
100
|
+
disabled: locked,
|
|
97
101
|
className: "min-w-0 max-w-56 flex-1 [&>span]:min-w-0 [&>span]:w-full [&>span>button]:w-full",
|
|
98
102
|
header: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid gap-1", children: [
|
|
99
103
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: KEY_CLASS, children: "Model id" }),
|
|
@@ -104,6 +108,7 @@ function RuntimeBarSegments({
|
|
|
104
108
|
onChange: onCustomModel,
|
|
105
109
|
...selectedModelUnavailable ? { placeholder: "Unavailable selection" } : {},
|
|
106
110
|
"aria-label": "Model id",
|
|
111
|
+
disabled: locked,
|
|
107
112
|
inputClassName: "font-mono text-xs",
|
|
108
113
|
className: "bg-background"
|
|
109
114
|
}
|
|
@@ -152,6 +157,7 @@ function RuntimeSegment({
|
|
|
152
157
|
menuLabel,
|
|
153
158
|
title,
|
|
154
159
|
header,
|
|
160
|
+
disabled = false,
|
|
155
161
|
className,
|
|
156
162
|
children
|
|
157
163
|
}) {
|
|
@@ -168,6 +174,7 @@ function RuntimeSegment({
|
|
|
168
174
|
"button",
|
|
169
175
|
{
|
|
170
176
|
type: "button",
|
|
177
|
+
disabled,
|
|
171
178
|
title,
|
|
172
179
|
className: "inline-flex h-full min-w-0 items-center gap-1.5 px-density-2 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring [[aria-expanded=true]_&]:bg-muted",
|
|
173
180
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBarSegments.cjs","sources":["../../../src/data/runtime/RuntimeBarSegments.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { InputField } from \"../../components/InputField\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport {\n DropdownMenu,\n type DropdownMenuItem,\n} from \"../../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { isUnavailable } from \"./availability\";\nimport {\n modelsForFamily,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarSegmentsProps = {\n value: RuntimeBarValue;\n models: ChatModel[];\n modelOptions: ChatModel[];\n resolvedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n reasoningEfforts: string[];\n supportedEfforts: string[];\n ariaLabel: string;\n className?: string | undefined;\n onBackendChange: (familyId: string, modeId: string) => void;\n onCustomModel: (model: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarSegments({\n value,\n models,\n modelOptions,\n resolvedModel,\n selectedModelUnavailable,\n families,\n family,\n mode,\n selectedMode,\n reasoningEfforts,\n supportedEfforts,\n ariaLabel,\n className,\n onBackendChange,\n onCustomModel,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarSegmentsProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : (resolvedModel?.label ?? value.model ?? \"Default\");\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex h-control-h w-fit max-w-full items-stretch overflow-hidden rounded-md border border-input bg-background\",\n className,\n )}\n >\n <RuntimeSegment\n menuLabel=\"Family\"\n title={`Family — ${family.label}`}\n items={familyItems({\n families,\n models,\n selectedId: family.id,\n onSelect: (familyId) => onBackendChange(familyId, selectedMode),\n })}\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n <span className={CAPTION_CLASS}>{family.label}</span>\n </RuntimeSegment>\n <RuntimeSegment\n menuLabel=\"Runtime mode\"\n title={mode.title ?? \"Runtime mode\"}\n items={modeItems({\n family,\n selectedId: selectedMode,\n onSelect: (modeId) => onBackendChange(family.id, modeId),\n })}\n >\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className={CAPTION_CLASS}>{mode.label}</span>\n </RuntimeSegment>\n <RuntimeSegment\n menuLabel=\"Model\"\n title={\n selectedModelUnavailable\n ? \"Model — unavailable selection\"\n : value.model\n ? `Model — ${value.model}`\n : \"Model — prompt default\"\n }\n className=\"min-w-0 max-w-56 flex-1 [&>span]:min-w-0 [&>span]:w-full [&>span>button]:w-full\"\n header={\n <div className=\"grid gap-1\">\n <span className={KEY_CLASS}>Model id</span>\n <InputField\n value={selectedModelUnavailable ? \"\" : (value.model ?? \"\")}\n onChange={onCustomModel}\n {...(selectedModelUnavailable\n ? { placeholder: \"Unavailable selection\" }\n : {})}\n aria-label=\"Model id\"\n inputClassName=\"font-mono text-xs\"\n className=\"bg-background\"\n />\n </div>\n }\n items={modelItems({\n models: modelOptions,\n group: `${family.label} models`,\n selectedId: selectedModelUnavailable\n ? undefined\n : (resolvedModel?.id ?? value.model),\n onSelect: onModelSelect,\n onClear: onModelClear,\n })}\n >\n <span className=\"min-w-0 truncate font-mono text-xs text-foreground\">\n {modelLabel}\n </span>\n </RuntimeSegment>\n {supportedEfforts.length > 0 && (\n <RuntimeSegment\n menuLabel=\"Reasoning effort\"\n title=\"Reasoning effort\"\n items={effortItems({\n offered: effortUniverse(\n reasoningEfforts,\n supportedEfforts,\n value.effort,\n ),\n supported: supportedEfforts,\n selected: value.effort,\n onSelect: onEffortChange,\n })}\n >\n <span className={KEY_CLASS}>Effort</span>\n <EffortGlyph effort={value.effort} />\n <span className={CAPTION_CLASS}>\n {value.effort ? effortLevelLabel(value.effort) : \"None\"}\n </span>\n </RuntimeSegment>\n )}\n </div>\n );\n}\n\nconst CAPTION_CLASS = \"truncate text-xs font-semibold text-foreground\";\nconst KEY_CLASS =\n \"text-[11px] font-semibold uppercase leading-none tracking-wide text-muted-foreground\";\n\nfunction RuntimeSegment({\n items,\n menuLabel,\n title,\n header,\n className,\n children,\n}: {\n items: DropdownMenuItem[];\n menuLabel: string;\n title: string;\n header?: ReactNode;\n className?: string | undefined;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={menuLabel}\n items={items}\n {...(header ? { header } : {})}\n menuClassName=\"min-w-56 max-w-80\"\n className={cn(\"border-l border-border first:border-l-0\", className)}\n trigger={\n <button\n type=\"button\"\n title={title}\n className=\"inline-flex h-full min-w-0 items-center gap-1.5 px-density-2 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring [[aria-expanded=true]_&]:bg-muted\"\n >\n {children}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </button>\n }\n />\n );\n}\n\nfunction EffortGlyph({ effort }: { effort?: string | undefined }) {\n const glyph = effort ? effortLevelIcon(effort) : undefined;\n if (!glyph) return null;\n return (\n <Icon\n icon={glyph}\n className={cn(\n \"size-4 shrink-0\",\n effort ? effortLevelColor(effort) : undefined,\n )}\n />\n );\n}\n\nfunction itemLabel({\n text,\n hint,\n selected,\n stacked = false,\n}: {\n text: string;\n hint?: string | undefined;\n selected: boolean;\n stacked?: boolean | undefined;\n}): ReactNode {\n return (\n <>\n <span className=\"min-w-0 flex-1\">\n <span className={cn(\"block truncate\", selected && \"font-semibold\")}>\n {text}\n </span>\n {hint && stacked && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {hint}\n </span>\n )}\n </span>\n {hint && !stacked && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {hint}\n </span>\n )}\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\",\n )}\n />\n </>\n );\n}\n\nfunction familyItems({\n families,\n models,\n selectedId,\n onSelect,\n}: {\n families: SpecRuntimeFamily[];\n models: ChatModel[];\n selectedId: string;\n onSelect: (familyId: string) => void;\n}): DropdownMenuItem[] {\n return families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability)),\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n const count = modelsForFamily(models, family).length;\n return {\n group: \"Family\",\n label: itemLabel({\n text: family.label,\n ...(count > 0 ? { hint: `${count} models` } : {}),\n selected: family.id === selectedId,\n }),\n ...(brand.icon ? { icon: brand.icon } : {}),\n onSelect: () => onSelect(family.id),\n };\n });\n}\n\nfunction modeItems({\n family,\n selectedId,\n onSelect,\n}: {\n family: SpecRuntimeFamily;\n selectedId: string;\n onSelect: (modeId: string) => void;\n}): DropdownMenuItem[] {\n return family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n group: \"Mode · runtime\",\n label: itemLabel({\n text: mode.label,\n ...(mode.title ? { hint: mode.title } : {}),\n selected: mode.id === selectedId,\n }),\n ...(mode.icon ? { icon: mode.icon } : {}),\n ...(mode.title ? { title: mode.title } : {}),\n onSelect: () => onSelect(mode.id),\n }));\n}\n\nfunction modelItems({\n models,\n group,\n selectedId,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n group: string;\n selectedId?: string | undefined;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}): DropdownMenuItem[] {\n const clear: DropdownMenuItem = {\n group: \"Model\",\n label: itemLabel({\n text: \"Prompt default\",\n hint: \"no override\",\n selected: !selectedId,\n }),\n onSelect: onClear,\n };\n return [\n clear,\n ...models.map((model) => {\n const glyph: StaticIconComponent | undefined = providerIcon(\n model.provider,\n );\n return {\n group,\n label: itemLabel({\n text: model.label,\n ...(model.id === model.label ? {} : { hint: model.id }),\n selected: model.id === selectedId,\n stacked: true,\n }),\n ...(glyph ? { icon: glyph } : {}),\n onSelect: () => onSelect(model),\n };\n }),\n ];\n}\n\nfunction effortItems({\n offered,\n supported,\n selected,\n onSelect,\n}: {\n offered: string[];\n supported: string[];\n selected?: string | undefined;\n onSelect: (effort: string) => void;\n}): DropdownMenuItem[] {\n const current = selected?.trim() ?? \"\";\n const none: DropdownMenuItem = {\n group: \"Reasoning effort\",\n label: itemLabel({\n text: \"None\",\n hint: \"single pass\",\n selected: current === \"\",\n }),\n onSelect: () => onSelect(\"\"),\n };\n return [\n none,\n ...offered.map((effort) => {\n const glyph = effortLevelIcon(effort);\n const usable = supported.includes(effort);\n return {\n group: \"Reasoning effort\",\n label: itemLabel({\n text: effortLevelLabel(effort),\n ...(usable ? {} : { hint: \"unsupported\" }),\n selected: effort === current,\n }),\n ...(glyph ? { icon: glyph } : {}),\n disabled: !usable,\n onSelect: () => onSelect(effort),\n };\n }),\n ];\n}\n\nfunction effortUniverse(\n offered: readonly string[],\n supported: readonly string[],\n selected: string | undefined,\n): string[] {\n const all = [...offered, ...supported, selected ?? \"\"]\n .map((effort) => effort.trim())\n .filter(Boolean);\n return [...new Set(all)];\n}\n"],"names":["runtimeFamilyBrand","jsxs","cn","jsx","Icon","InputField","effortLevelLabel","DropdownMenu","UiChevronDown","effortLevelIcon","effortLevelColor","Fragment","UiCheck","isUnavailable","modelsForFamily","providerIcon"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RuntimeBarSegments.cjs","sources":["../../../src/data/runtime/RuntimeBarSegments.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { InputField } from \"../../components/InputField\";\nimport { UiCheck, UiChevronDown } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport {\n DropdownMenu,\n type DropdownMenuItem,\n} from \"../../overlay/DropdownMenu\";\nimport { Icon, type StaticIconComponent } from \"../Icon\";\nimport {\n effortLevelColor,\n effortLevelIcon,\n effortLevelLabel,\n} from \"../chat/effort-icons\";\nimport { providerIcon } from \"../chat/provider-icons\";\nimport type { ChatModel } from \"../chat/types\";\nimport { runtimeFamilyBrand } from \"./RuntimeBar.model\";\nimport type { RuntimeBarValue } from \"./RuntimeBar\";\nimport { isUnavailable } from \"./availability\";\nimport {\n modelsForFamily,\n type SpecRuntimeFamily,\n type SpecRuntimeModeOption,\n} from \"./runtime-mode\";\n\nexport type RuntimeBarSegmentsProps = {\n value: RuntimeBarValue;\n models: ChatModel[];\n modelOptions: ChatModel[];\n resolvedModel: ChatModel | undefined;\n selectedModelUnavailable: boolean;\n families: SpecRuntimeFamily[];\n family: SpecRuntimeFamily;\n mode: SpecRuntimeModeOption;\n selectedMode: string;\n reasoningEfforts: string[];\n supportedEfforts: string[];\n locked: boolean;\n ariaLabel: string;\n className?: string | undefined;\n onBackendChange: (familyId: string, modeId: string) => void;\n onCustomModel: (model: string) => void;\n onModelSelect: (model: ChatModel) => void;\n onModelClear: () => void;\n onEffortChange: (effort: string) => void;\n};\n\nexport function RuntimeBarSegments({\n value,\n models,\n modelOptions,\n resolvedModel,\n selectedModelUnavailable,\n families,\n family,\n mode,\n selectedMode,\n reasoningEfforts,\n supportedEfforts,\n locked,\n ariaLabel,\n className,\n onBackendChange,\n onCustomModel,\n onModelSelect,\n onModelClear,\n onEffortChange,\n}: RuntimeBarSegmentsProps) {\n const brand = runtimeFamilyBrand(family);\n const modelLabel = selectedModelUnavailable\n ? \"Unavailable selection\"\n : (resolvedModel?.label ?? value.model ?? \"Default\");\n\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex h-control-h w-fit max-w-full items-stretch overflow-hidden rounded-md border border-input bg-background\",\n className,\n )}\n >\n <RuntimeSegment\n menuLabel=\"Family\"\n title={`Family — ${family.label}`}\n disabled={locked}\n items={familyItems({\n families,\n models,\n selectedId: family.id,\n onSelect: (familyId) => onBackendChange(familyId, selectedMode),\n })}\n >\n {brand.icon && (\n <Icon\n icon={brand.icon}\n className={cn(\"size-4 shrink-0\", brand.color)}\n />\n )}\n <span className={CAPTION_CLASS}>{family.label}</span>\n </RuntimeSegment>\n <RuntimeSegment\n menuLabel=\"Runtime mode\"\n title={mode.title ?? \"Runtime mode\"}\n disabled={locked}\n items={modeItems({\n family,\n selectedId: selectedMode,\n onSelect: (modeId) => onBackendChange(family.id, modeId),\n })}\n >\n {mode.icon && (\n <Icon\n icon={mode.icon}\n className=\"size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <span className={CAPTION_CLASS}>{mode.label}</span>\n </RuntimeSegment>\n <RuntimeSegment\n menuLabel=\"Model\"\n title={\n selectedModelUnavailable\n ? \"Model — unavailable selection\"\n : value.model\n ? `Model — ${value.model}`\n : \"Model — prompt default\"\n }\n disabled={locked}\n className=\"min-w-0 max-w-56 flex-1 [&>span]:min-w-0 [&>span]:w-full [&>span>button]:w-full\"\n header={\n <div className=\"grid gap-1\">\n <span className={KEY_CLASS}>Model id</span>\n <InputField\n value={selectedModelUnavailable ? \"\" : (value.model ?? \"\")}\n onChange={onCustomModel}\n {...(selectedModelUnavailable\n ? { placeholder: \"Unavailable selection\" }\n : {})}\n aria-label=\"Model id\"\n disabled={locked}\n inputClassName=\"font-mono text-xs\"\n className=\"bg-background\"\n />\n </div>\n }\n items={modelItems({\n models: modelOptions,\n group: `${family.label} models`,\n selectedId: selectedModelUnavailable\n ? undefined\n : (resolvedModel?.id ?? value.model),\n onSelect: onModelSelect,\n onClear: onModelClear,\n })}\n >\n <span className=\"min-w-0 truncate font-mono text-xs text-foreground\">\n {modelLabel}\n </span>\n </RuntimeSegment>\n {supportedEfforts.length > 0 && (\n <RuntimeSegment\n menuLabel=\"Reasoning effort\"\n title=\"Reasoning effort\"\n items={effortItems({\n offered: effortUniverse(\n reasoningEfforts,\n supportedEfforts,\n value.effort,\n ),\n supported: supportedEfforts,\n selected: value.effort,\n onSelect: onEffortChange,\n })}\n >\n <span className={KEY_CLASS}>Effort</span>\n <EffortGlyph effort={value.effort} />\n <span className={CAPTION_CLASS}>\n {value.effort ? effortLevelLabel(value.effort) : \"None\"}\n </span>\n </RuntimeSegment>\n )}\n </div>\n );\n}\n\nconst CAPTION_CLASS = \"truncate text-xs font-semibold text-foreground\";\nconst KEY_CLASS =\n \"text-[11px] font-semibold uppercase leading-none tracking-wide text-muted-foreground\";\n\nfunction RuntimeSegment({\n items,\n menuLabel,\n title,\n header,\n disabled = false,\n className,\n children,\n}: {\n items: DropdownMenuItem[];\n menuLabel: string;\n title: string;\n header?: ReactNode;\n disabled?: boolean;\n className?: string | undefined;\n children: ReactNode;\n}) {\n return (\n <DropdownMenu\n align=\"left\"\n menuLabel={menuLabel}\n items={items}\n {...(header ? { header } : {})}\n menuClassName=\"min-w-56 max-w-80\"\n className={cn(\"border-l border-border first:border-l-0\", className)}\n trigger={\n <button\n type=\"button\"\n disabled={disabled}\n title={title}\n className=\"inline-flex h-full min-w-0 items-center gap-1.5 px-density-2 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring [[aria-expanded=true]_&]:bg-muted\"\n >\n {children}\n <Icon\n icon={UiChevronDown}\n className=\"size-3 shrink-0 text-muted-foreground/70\"\n />\n </button>\n }\n />\n );\n}\n\nfunction EffortGlyph({ effort }: { effort?: string | undefined }) {\n const glyph = effort ? effortLevelIcon(effort) : undefined;\n if (!glyph) return null;\n return (\n <Icon\n icon={glyph}\n className={cn(\n \"size-4 shrink-0\",\n effort ? effortLevelColor(effort) : undefined,\n )}\n />\n );\n}\n\nfunction itemLabel({\n text,\n hint,\n selected,\n stacked = false,\n}: {\n text: string;\n hint?: string | undefined;\n selected: boolean;\n stacked?: boolean | undefined;\n}): ReactNode {\n return (\n <>\n <span className=\"min-w-0 flex-1\">\n <span className={cn(\"block truncate\", selected && \"font-semibold\")}>\n {text}\n </span>\n {hint && stacked && (\n <span className=\"block whitespace-normal text-[11px] leading-4 text-muted-foreground\">\n {hint}\n </span>\n )}\n </span>\n {hint && !stacked && (\n <span className=\"shrink-0 text-[11px] text-muted-foreground\">\n {hint}\n </span>\n )}\n <Icon\n icon={UiCheck}\n className={cn(\n \"size-3.5 shrink-0 text-primary\",\n !selected && \"invisible\",\n )}\n />\n </>\n );\n}\n\nfunction familyItems({\n families,\n models,\n selectedId,\n onSelect,\n}: {\n families: SpecRuntimeFamily[];\n models: ChatModel[];\n selectedId: string;\n onSelect: (familyId: string) => void;\n}): DropdownMenuItem[] {\n return families\n .filter((family) =>\n family.modes.some((mode) => !isUnavailable(mode.availability)),\n )\n .map((family) => {\n const brand = runtimeFamilyBrand(family);\n const count = modelsForFamily(models, family).length;\n return {\n group: \"Family\",\n label: itemLabel({\n text: family.label,\n ...(count > 0 ? { hint: `${count} models` } : {}),\n selected: family.id === selectedId,\n }),\n ...(brand.icon ? { icon: brand.icon } : {}),\n onSelect: () => onSelect(family.id),\n };\n });\n}\n\nfunction modeItems({\n family,\n selectedId,\n onSelect,\n}: {\n family: SpecRuntimeFamily;\n selectedId: string;\n onSelect: (modeId: string) => void;\n}): DropdownMenuItem[] {\n return family.modes\n .filter((mode) => !isUnavailable(mode.availability))\n .map((mode) => ({\n group: \"Mode · runtime\",\n label: itemLabel({\n text: mode.label,\n ...(mode.title ? { hint: mode.title } : {}),\n selected: mode.id === selectedId,\n }),\n ...(mode.icon ? { icon: mode.icon } : {}),\n ...(mode.title ? { title: mode.title } : {}),\n onSelect: () => onSelect(mode.id),\n }));\n}\n\nfunction modelItems({\n models,\n group,\n selectedId,\n onSelect,\n onClear,\n}: {\n models: ChatModel[];\n group: string;\n selectedId?: string | undefined;\n onSelect: (model: ChatModel) => void;\n onClear: () => void;\n}): DropdownMenuItem[] {\n const clear: DropdownMenuItem = {\n group: \"Model\",\n label: itemLabel({\n text: \"Prompt default\",\n hint: \"no override\",\n selected: !selectedId,\n }),\n onSelect: onClear,\n };\n return [\n clear,\n ...models.map((model) => {\n const glyph: StaticIconComponent | undefined = providerIcon(\n model.provider,\n );\n return {\n group,\n label: itemLabel({\n text: model.label,\n ...(model.id === model.label ? {} : { hint: model.id }),\n selected: model.id === selectedId,\n stacked: true,\n }),\n ...(glyph ? { icon: glyph } : {}),\n onSelect: () => onSelect(model),\n };\n }),\n ];\n}\n\nfunction effortItems({\n offered,\n supported,\n selected,\n onSelect,\n}: {\n offered: string[];\n supported: string[];\n selected?: string | undefined;\n onSelect: (effort: string) => void;\n}): DropdownMenuItem[] {\n const current = selected?.trim() ?? \"\";\n const none: DropdownMenuItem = {\n group: \"Reasoning effort\",\n label: itemLabel({\n text: \"None\",\n hint: \"single pass\",\n selected: current === \"\",\n }),\n onSelect: () => onSelect(\"\"),\n };\n return [\n none,\n ...offered.map((effort) => {\n const glyph = effortLevelIcon(effort);\n const usable = supported.includes(effort);\n return {\n group: \"Reasoning effort\",\n label: itemLabel({\n text: effortLevelLabel(effort),\n ...(usable ? {} : { hint: \"unsupported\" }),\n selected: effort === current,\n }),\n ...(glyph ? { icon: glyph } : {}),\n disabled: !usable,\n onSelect: () => onSelect(effort),\n };\n }),\n ];\n}\n\nfunction effortUniverse(\n offered: readonly string[],\n supported: readonly string[],\n selected: string | undefined,\n): string[] {\n const all = [...offered, ...supported, selected ?? \"\"]\n .map((effort) => effort.trim())\n .filter(Boolean);\n return [...new Set(all)];\n}\n"],"names":["runtimeFamilyBrand","jsxs","cn","jsx","Icon","InputField","effortLevelLabel","DropdownMenu","UiChevronDown","effortLevelIcon","effortLevelColor","Fragment","UiCheck","isUnavailable","modelsForFamily","providerIcon"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ export type RuntimeBarSegmentsProps = {
|
|
|
13
13
|
selectedMode: string;
|
|
14
14
|
reasoningEfforts: string[];
|
|
15
15
|
supportedEfforts: string[];
|
|
16
|
+
locked: boolean;
|
|
16
17
|
ariaLabel: string;
|
|
17
18
|
className?: string | undefined;
|
|
18
19
|
onBackendChange: (familyId: string, modeId: string) => void;
|
|
@@ -21,5 +22,5 @@ export type RuntimeBarSegmentsProps = {
|
|
|
21
22
|
onModelClear: () => void;
|
|
22
23
|
onEffortChange: (effort: string) => void;
|
|
23
24
|
};
|
|
24
|
-
export declare function RuntimeBarSegments({ value, models, modelOptions, resolvedModel, selectedModelUnavailable, families, family, mode, selectedMode, reasoningEfforts, supportedEfforts, ariaLabel, className, onBackendChange, onCustomModel, onModelSelect, onModelClear, onEffortChange, }: RuntimeBarSegmentsProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export declare function RuntimeBarSegments({ value, models, modelOptions, resolvedModel, selectedModelUnavailable, families, family, mode, selectedMode, reasoningEfforts, supportedEfforts, locked, ariaLabel, className, onBackendChange, onCustomModel, onModelSelect, onModelClear, onEffortChange, }: RuntimeBarSegmentsProps): import("react/jsx-runtime").JSX.Element;
|
|
25
26
|
//# sourceMappingURL=RuntimeBarSegments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RuntimeBarSegments.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBarSegments.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,wBAAwB,EAAE,OAAO,CAAC;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,eAAe,EACf,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,GACf,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"RuntimeBarSegments.d.ts","sourceRoot":"","sources":["../../../src/data/runtime/RuntimeBarSegments.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAEL,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,eAAe,CAAC;IACvB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,wBAAwB,EAAE,OAAO,CAAC;IAClC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,IAAI,EAAE,qBAAqB,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,eAAe,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5D,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,MAAM,EACN,YAAY,EACZ,aAAa,EACb,wBAAwB,EACxB,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,MAAM,EACN,SAAS,EACT,SAAS,EACT,eAAe,EACf,aAAa,EACb,aAAa,EACb,YAAY,EACZ,cAAc,GACf,EAAE,uBAAuB,2CAqHzB"}
|
|
@@ -22,6 +22,7 @@ function RuntimeBarSegments({
|
|
|
22
22
|
selectedMode,
|
|
23
23
|
reasoningEfforts,
|
|
24
24
|
supportedEfforts,
|
|
25
|
+
locked,
|
|
25
26
|
ariaLabel,
|
|
26
27
|
className,
|
|
27
28
|
onBackendChange,
|
|
@@ -47,6 +48,7 @@ function RuntimeBarSegments({
|
|
|
47
48
|
{
|
|
48
49
|
menuLabel: "Family",
|
|
49
50
|
title: `Family — ${family.label}`,
|
|
51
|
+
disabled: locked,
|
|
50
52
|
items: familyItems({
|
|
51
53
|
families,
|
|
52
54
|
models,
|
|
@@ -70,6 +72,7 @@ function RuntimeBarSegments({
|
|
|
70
72
|
{
|
|
71
73
|
menuLabel: "Runtime mode",
|
|
72
74
|
title: mode.title ?? "Runtime mode",
|
|
75
|
+
disabled: locked,
|
|
73
76
|
items: modeItems({
|
|
74
77
|
family,
|
|
75
78
|
selectedId: selectedMode,
|
|
@@ -92,6 +95,7 @@ function RuntimeBarSegments({
|
|
|
92
95
|
{
|
|
93
96
|
menuLabel: "Model",
|
|
94
97
|
title: selectedModelUnavailable ? "Model — unavailable selection" : value.model ? `Model — ${value.model}` : "Model — prompt default",
|
|
98
|
+
disabled: locked,
|
|
95
99
|
className: "min-w-0 max-w-56 flex-1 [&>span]:min-w-0 [&>span]:w-full [&>span>button]:w-full",
|
|
96
100
|
header: /* @__PURE__ */ jsxs("div", { className: "grid gap-1", children: [
|
|
97
101
|
/* @__PURE__ */ jsx("span", { className: KEY_CLASS, children: "Model id" }),
|
|
@@ -102,6 +106,7 @@ function RuntimeBarSegments({
|
|
|
102
106
|
onChange: onCustomModel,
|
|
103
107
|
...selectedModelUnavailable ? { placeholder: "Unavailable selection" } : {},
|
|
104
108
|
"aria-label": "Model id",
|
|
109
|
+
disabled: locked,
|
|
105
110
|
inputClassName: "font-mono text-xs",
|
|
106
111
|
className: "bg-background"
|
|
107
112
|
}
|
|
@@ -150,6 +155,7 @@ function RuntimeSegment({
|
|
|
150
155
|
menuLabel,
|
|
151
156
|
title,
|
|
152
157
|
header,
|
|
158
|
+
disabled = false,
|
|
153
159
|
className,
|
|
154
160
|
children
|
|
155
161
|
}) {
|
|
@@ -166,6 +172,7 @@ function RuntimeSegment({
|
|
|
166
172
|
"button",
|
|
167
173
|
{
|
|
168
174
|
type: "button",
|
|
175
|
+
disabled,
|
|
169
176
|
title,
|
|
170
177
|
className: "inline-flex h-full min-w-0 items-center gap-1.5 px-density-2 transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring [[aria-expanded=true]_&]:bg-muted",
|
|
171
178
|
children: [
|