opencode-navigator 0.21.7 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -1
- package/README.md +101 -21
- package/dist/{chunk-d1bws32s.js → chunk-dz8cfnfs.js} +4 -3
- package/dist/chunk-qmntexwm.js +0 -0
- package/dist/chunk-v6bz59xn.js +20 -0
- package/dist/icon-picker.js +175 -0
- package/dist/layout-preset-actions.js +4 -20
- package/dist/navigator-updates.js +12 -4
- package/dist/project-profile.js +12 -4
- package/dist/provider-limits.js +34 -26
- package/dist/quick-actions-settings.js +5 -13
- package/dist/rpc.js +1 -0
- package/dist/runtime-dependencies.json +10 -0
- package/dist/server.js +16 -54
- package/dist/settings-import.js +4 -3
- package/dist/sidebar-settings.js +828 -0
- package/dist/sidebar-shortcuts.js +261 -0
- package/dist/toolbar-settings.js +161 -0
- package/dist/tui.js +955 -992
- package/package.json +8 -7
- package/scripts/snapshot-runtime.mjs +32 -0
- package/scripts/update-local-snapshot.mjs +14 -3
|
@@ -0,0 +1,828 @@
|
|
|
1
|
+
import {SIDEBAR_SECTIONS,SECTION_DEFINITIONS,PLUGIN_ID,DEFAULT_SEARCH_KEY
|
|
2
|
+
} from "./chunk-dz8cfnfs.js"
|
|
3
|
+
import"./chunk-qmntexwm.js";
|
|
4
|
+
import {memo as _$memo4} from "@opentui/solid"
|
|
5
|
+
import {use as _$use} from "@opentui/solid"
|
|
6
|
+
import {createComponent as _$createComponent6} from "@opentui/solid"
|
|
7
|
+
import {effect as _$effect7} from "@opentui/solid"
|
|
8
|
+
import {createTextNode as _$createTextNode7} from "@opentui/solid"
|
|
9
|
+
import {insertNode as _$insertNode7} from "@opentui/solid"
|
|
10
|
+
import {insert as _$insert5} from "@opentui/solid"
|
|
11
|
+
import {setProp as _$setProp7} from "@opentui/solid"
|
|
12
|
+
import {createElement as _$createElement7} from "@opentui/solid"
|
|
13
|
+
import {TextAttributes as TextAttributes5} from "@opentui/core"
|
|
14
|
+
import {For as For3} from "solid-js"
|
|
15
|
+
import {DialogSurface as DialogSurface2,Tab} from "./tui.js"
|
|
16
|
+
import {useTerminalDimensions} from "@opentui/solid"
|
|
17
|
+
import {createEffect,createMemo as createMemo2,onCleanup as onCleanup2,onMount} from "solid-js"
|
|
18
|
+
import {useDialogScroll,useDialogState,useDialogs as useDialogs2,useIcons as useIcons4} from "./tui.js"
|
|
19
|
+
import {createMemo} from "solid-js"
|
|
20
|
+
import {supportsSidebarSection} from "./tui.js"
|
|
21
|
+
import {supportsPermissionMode} from "./tui.js"
|
|
22
|
+
function behaviorSettingsOptions(api,preferences,icons){const permission=preferences.autoApprovePermissions()
|
|
23
|
+
const permissionDescription=permission?"on for new sessions":"off for new sessions"
|
|
24
|
+
return [...supportsPermissionMode(api)?[{title:`${icons.icon(permission === true ? "checked" : "unchecked")} Default auto-approve permissions`,value:"auto_approve_permissions",description:permission===undefined?"follow OpenCode startup mode":permissionDescription
|
|
25
|
+
}]:[],{title:`${icons.icon(preferences.selectedStartInChat() ? "checked" : "unchecked")} Start new sessions in chat`,value:"start_in_chat",description:preferences.selectedStartInChat()?"skip Home \xB7 on":"show Home \xB7 off"
|
|
26
|
+
},{title:`${icons.icon(preferences.selectedPersistMcp() ? "checked" : "unchecked")} Remember MCP states`,value:"persist_mcp",description:preferences.selectedPersistMcp()?"on":"off"
|
|
27
|
+
},{title:`${icons.icon("settings")} Icon style`,value:"lsp_icon_style",description:preferences.selectedLspIconStyle()==="nerd"?"Nerd Font":"Text fallback"
|
|
28
|
+
},{title:`${icons.icon(preferences.selectedCornerFont() ? "checked" : "unchecked")} Multiline corner font`,value:"corner_font",description:preferences.selectedCornerFont()?"Installed":"Not installed \xB7 rectangular highlights"
|
|
29
|
+
},{title:`${icons.icon("sections")} Row density`,value:"row_density",description:preferences.selectedRowDensity()==="compact"?"Compact":"Comfortable"
|
|
30
|
+
},{title:`${icons.icon("sections")} Sidebar shortcut`,value:"toggle_key",description:preferences.selectedToggleKey()
|
|
31
|
+
},{title:`${icons.icon("selected")} Focus shortcut`,value:"focus_key",description:preferences.selectedFocusKey()
|
|
32
|
+
},{title:`${icons.icon("search")} Search Everything shortcut`,value:"search_key",description:preferences.selectedSearchKey?.()??DEFAULT_SEARCH_KEY
|
|
33
|
+
},{title:`${icons.icon("retry")} Limits refresh interval`,value:"limits_refresh",description:`${preferences.selectedLimitsRefreshMinutes()} min \xB7 minimum 1 min`
|
|
34
|
+
},{title:`${icons.icon("sections")} Toolbar overflow`,value:"toolbar_overflow",description:preferences.selectedToolbarOverflow?.()==="wrap"?"Wrap into rows":"Single row with More menu"
|
|
35
|
+
},{title:`${icons.icon("edit")} Pinned toolbar\u2026`,value:"toolbar_manager",description:"Add, reorder, or configure action and Skill buttons"
|
|
36
|
+
}]
|
|
37
|
+
}
|
|
38
|
+
import {supportsTitleVisibility} from "./tui.js"
|
|
39
|
+
function titleVisibilityOptions(api,preferences,icons){if(!supportsTitleVisibility(api))
|
|
40
|
+
return []
|
|
41
|
+
const title=preferences.selectedShowSessionTitle()
|
|
42
|
+
const date=preferences.selectedShowSessionDate()
|
|
43
|
+
return [{title:`${icons.icon(title ? "checked" : "unchecked")} Session title`,value:"session_title",description:title?"visible":"hidden"
|
|
44
|
+
},{title:`${icons.icon(date ? "checked" : "unchecked")} Creation date`,value:"session_date",description:date?"visible":"hidden"
|
|
45
|
+
}]
|
|
46
|
+
}
|
|
47
|
+
function createSettingsGroups(api,preferences,icons){const supportedSections=()=>SIDEBAR_SECTIONS.filter((name)=>supportsSidebarSection(api,name))
|
|
48
|
+
const groups=createMemo(()=>[{id:"scope",tab:"Scope",title:"Preference scope",options:[{title:`${icons.icon(preferences.preferenceScope() === "global" ? "radioOn" : "radioOff")} Global`,value:"scope:global",description:"applies to every worktree"
|
|
49
|
+
},{title:`${icons.icon(preferences.preferenceScope() === "worktree" ? "radioOn" : "radioOff")} Current worktree`,value:"scope:worktree",description:preferences.canUseWorktreeScope()?preferences.preferenceScopeLabel():"unavailable outside a worktree"
|
|
50
|
+
}]
|
|
51
|
+
},{id:"presets",tab:"Presets",title:"Layout presets",options:[...Object.keys(preferences.layoutPresets()).sort((left,right)=>left.localeCompare(right)).map((name)=>({title:`${icons.icon("presets")} ${name}`,value:`preset:custom:${encodeURIComponent(name)}`,description:preferences.workspaceProfiles?.()[name]?`profile \xB7 ${preferences.workspaceProfiles()[name]}`:"enter to apply or edit"
|
|
52
|
+
})),{title:`${icons.icon("add")} Save as\u2026`,value:"save_preset",description:"create a preset from the current layout"
|
|
53
|
+
}]
|
|
54
|
+
},{id:"sections",tab:"Sections",title:"Sections & order",options:[...titleVisibilityOptions(api,preferences,icons),...preferences.selectedSectionOrder().filter((name)=>supportsSidebarSection(api,name)).map((name,index)=>{const section=SECTION_DEFINITIONS.find((candidate)=>candidate.name===name)
|
|
55
|
+
return{title:`${icons.icon(preferences.selectedSections()[section.name] ? "checked" : "unchecked")} ${index + 1}. ${icons.section(section.name)} ${section.label}`,value:section.name,description:preferences.selectedSections()[section.name]?"visible":"hidden"
|
|
56
|
+
}})]
|
|
57
|
+
},{id:"behavior",tab:"Behavior",title:"Behavior",options:behaviorSettingsOptions(api,preferences,icons)
|
|
58
|
+
},{id:"defaults",tab:"Defaults",title:"Defaults & help",options:[{title:`${icons.icon("save")} Save current layout as default`,value:"save_layout",description:`${supportedSections().filter((name) => preferences.selectedSections()[name]).length} visible \xB7 ${supportedSections().filter((name) => preferences.selectedExpanded()[name]).length} expanded`
|
|
59
|
+
},{title:`${icons.icon("export")} Copy portable settings`,value:"export_settings",description:"versioned layout and MCP JSON"
|
|
60
|
+
},{title:`${icons.icon("add")} Import portable settings\u2026`,value:"import_settings",description:"preview pasted JSON before applying"
|
|
61
|
+
},{title:`${icons.icon("retry")} Reload settings from file`,value:"reload_settings",description:"sync saved changes from other OpenCode sessions"
|
|
62
|
+
},{title:`${icons.icon("reset")} Restore configured layout`,value:"reset_sections",description:"visibility and expansion"
|
|
63
|
+
},{title:`${icons.icon("reset")} Restore configured behavior`,value:"reset_settings",description:"startup, MCP memory, icons, shortcuts, limits, actions"
|
|
64
|
+
},{title:`${icons.icon("reset")} Clear remembered MCP states`,value:"reset_mcp",description:`scope: ${preferences.preferenceScopeLabel()}`
|
|
65
|
+
},{title:`${icons.section("skills")} Manage trusted skills`,value:"trusted_skills",description:`${preferences.skippedSkillCount()} trusted`
|
|
66
|
+
},{title:`${icons.icon("help")} Open quick setup guide`,value:"wizard",description:"tips and section settings"
|
|
67
|
+
}]
|
|
68
|
+
}])
|
|
69
|
+
const orderedGroups=createMemo(()=>["sections","scope","presets","behavior","defaults"].map((id)=>groups().find((group)=>group.id===id)))
|
|
70
|
+
return orderedGroups
|
|
71
|
+
}
|
|
72
|
+
function registerSettingsKeymap(input){return input.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.settings.previous`,run:()=>input.move(-1)},{name:`${PLUGIN_ID}.settings.next`,run:()=>input.move(1)},{name:`${PLUGIN_ID}.settings.select`,run:()=>input.select()},{name:`${PLUGIN_ID}.settings.groups`,run:()=>{if(input.activeGroup()!=="sections")
|
|
73
|
+
return
|
|
74
|
+
if(input.options()[input.active()]?.value==="mcp")
|
|
75
|
+
input.openMcpGroups()
|
|
76
|
+
if(input.options()[input.active()]?.value==="skills")
|
|
77
|
+
input.openSkillGroups()
|
|
78
|
+
}},{name:`${PLUGIN_ID}.settings.quick-actions`,run:()=>{if(input.activeGroup()==="sections"&&input.options()[input.active()]?.value==="quick_actions")
|
|
79
|
+
input.openQuickActions()
|
|
80
|
+
}},{name:`${PLUGIN_ID}.settings.item-limit`,run:()=>{const section=input.options()[input.active()]?.value
|
|
81
|
+
if(input.activeGroup()==="sections"&&SIDEBAR_SECTIONS.includes(section))
|
|
82
|
+
input.openLimitPrompt(section)
|
|
83
|
+
}},{name:`${PLUGIN_ID}.settings.previous-tab`,run:()=>input.switchGroup(-1)},{name:`${PLUGIN_ID}.settings.next-tab`,run:()=>input.switchGroup(1)},{name:`${PLUGIN_ID}.settings.move-up`,run:()=>input.reorder(input.options()[input.active()]?.value,-1)},{name:`${PLUGIN_ID}.settings.move-down`,run:()=>input.reorder(input.options()[input.active()]?.value,1)}],bindings:[{key:"up",cmd:`${PLUGIN_ID}.settings.previous`},{key:"down",cmd:`${PLUGIN_ID}.settings.next`},{key:"tab",cmd:`${PLUGIN_ID}.settings.next-tab`},{key:"shift+tab",cmd:`${PLUGIN_ID}.settings.previous-tab`},{key:"space",cmd:`${PLUGIN_ID}.settings.select`},{key:"return",cmd:`${PLUGIN_ID}.settings.select`},{key:"l",cmd:`${PLUGIN_ID}.settings.item-limit`},{key:"a",cmd:`${PLUGIN_ID}.settings.quick-actions`},{key:"g",cmd:`${PLUGIN_ID}.settings.groups`},{key:"left",cmd:`${PLUGIN_ID}.settings.move-up`},{key:"right",cmd:`${PLUGIN_ID}.settings.move-down`},{key:"shift+up",cmd:`${PLUGIN_ID}.settings.move-up`},{key:"shift+down",cmd:`${PLUGIN_ID}.settings.move-down`}]
|
|
84
|
+
})
|
|
85
|
+
}
|
|
86
|
+
import {createComponent as _$createComponent4} from "@opentui/solid"
|
|
87
|
+
import {setProp as _$setProp5} from "@opentui/solid"
|
|
88
|
+
import {effect as _$effect5} from "@opentui/solid"
|
|
89
|
+
import {createTextNode as _$createTextNode5} from "@opentui/solid"
|
|
90
|
+
import {insertNode as _$insertNode5} from "@opentui/solid"
|
|
91
|
+
import {createElement as _$createElement5} from "@opentui/solid"
|
|
92
|
+
import {createComponent as _$createComponent3} from "@opentui/solid"
|
|
93
|
+
import {effect as _$effect3} from "@opentui/solid"
|
|
94
|
+
import {createTextNode as _$createTextNode3} from "@opentui/solid"
|
|
95
|
+
import {insertNode as _$insertNode3} from "@opentui/solid"
|
|
96
|
+
import {insert as _$insert3} from "@opentui/solid"
|
|
97
|
+
import {setProp as _$setProp3} from "@opentui/solid"
|
|
98
|
+
import {createElement as _$createElement3} from "@opentui/solid"
|
|
99
|
+
import {TextAttributes as TextAttributes3} from "@opentui/core"
|
|
100
|
+
import {Show,createSignal,onCleanup} from "solid-js"
|
|
101
|
+
import {supportsSidebarSection as supportsSidebarSection3} from "./tui.js"
|
|
102
|
+
import {DialogSurface,createDialogStack,useDialogs,useIcons as useIcons3} from "./tui.js"
|
|
103
|
+
var ONBOARDING_STEPS=[{title:"A control center that stays compact",summary:"Navigator brings session state, search, and controls into OpenCode's existing sidebar.",icon:"help",features:[{icon:"sections",title:"Progressive disclosure",description:"Expand only the context you need right now."},{icon:"scope",title:"Current context",description:"Follow the active session, workspace, and worktree."},{icon:"actions",title:"Mouse and keyboard",description:"Use the same controls with either input method."}]
|
|
104
|
+
},{title:"Stay oriented while agents work",summary:"Keep current work visible without turning the sidebar into another dashboard.",icon:"todo",features:[{icon:"todo",title:"Todo filters",description:"Separate active, finished, and cancelled work."},{icon:"subagents",title:"Live subagents",description:"See running, retrying, recent, and failed child sessions; open them directly."
|
|
105
|
+
},{icon:"info",title:"Provider limits",description:"Link a matching Codex account for model quotas and confirmed banked resets."
|
|
106
|
+
}]
|
|
107
|
+
},{title:"Find anything and launch Skills safely",summary:"Search complete source lists without expanding every sidebar section.",icon:"search",features:[{icon:"search",title:"Search Everything",description:"Search Skills, Subagents, MCP, and Actions in shared tabs."
|
|
108
|
+
},{icon:"search",title:"Full source lists",description:"Search beyond sidebar visibility and item limits."},{icon:"skills",title:"Skill confirmation",description:"Review a skill and its source before inserting its command."
|
|
109
|
+
}]
|
|
110
|
+
},{title:"Run actions and check language tools",summary:"Keep frequent OpenCode commands and LSP health within one compact section.",icon:"actions",features:[{icon:"actions",title:"Quick Actions",description:"Rename, inspect timelines, copy, export, or compact the session."
|
|
111
|
+
},{icon:"lsp",title:"Compact LSP status",description:"Spot connected and failed language servers at a glance."
|
|
112
|
+
},{icon:"settings",title:"Configurable commands",description:"Choose action visibility, order, and shortcuts."
|
|
113
|
+
}]
|
|
114
|
+
},{title:"Control MCP without losing context",summary:"Manage individual servers or entire working sets directly from Navigator.",icon:"mcp",features:[{icon:"mcp",title:"Live server controls",description:"Connect, disconnect, filter, and favorite servers."},{icon:"actions",title:"Bulk operations",description:"Change eligible servers together and retry failures."
|
|
115
|
+
},{icon:"presets",title:"Safe presets",description:"Preview connections and disconnections before Apply."}]
|
|
116
|
+
},{title:"Make Navigator fit each workspace",summary:"Use the same controls with mouse or keyboard and keep only the context you need.",icon:"settings",features:[{icon:"sections",title:"Flexible layout",description:"Choose section visibility, order, expansion, and item limits."
|
|
117
|
+
},{icon:"presets",title:"Scoped presets",description:"Save layouts globally or for the current worktree."},{icon:"settings",title:"Accessible controls",description:"Change shortcuts or use Text fallback without a restart."
|
|
118
|
+
}]
|
|
119
|
+
}];
|
|
120
|
+
import {effect as _$effect} from "@opentui/solid"
|
|
121
|
+
import {memo as _$memo} from "@opentui/solid"
|
|
122
|
+
import {createComponent as _$createComponent} from "@opentui/solid"
|
|
123
|
+
import {createTextNode as _$createTextNode} from "@opentui/solid"
|
|
124
|
+
import {insertNode as _$insertNode} from "@opentui/solid"
|
|
125
|
+
import {insert as _$insert} from "@opentui/solid"
|
|
126
|
+
import {setProp as _$setProp} from "@opentui/solid"
|
|
127
|
+
import {createElement as _$createElement} from "@opentui/solid"
|
|
128
|
+
import {TextAttributes} from "@opentui/core"
|
|
129
|
+
import {For} from "solid-js"
|
|
130
|
+
import {SelectionBox,useIcons} from "./tui.js"
|
|
131
|
+
function OnboardingStep(props){const icons=useIcons()
|
|
132
|
+
const theme=()=>props.api.theme.current
|
|
133
|
+
return(()=>{var _el$=_$createElement("box"),_el$2=_$createElement("text"),_el$3=_$createTextNode(` `),_el$4=_$createElement("text"),_el$5=_$createElement("box"),_el$6=_$createElement("text"),_el$7=_$createTextNode(`Toggle: `),_el$8=_$createTextNode(` \xB7 Focus: `),_el$9=_$createTextNode(` \xB7 Icons: `),_el$1=_$createElement("box")
|
|
134
|
+
_$insertNode(_el$,_el$2)
|
|
135
|
+
_$insertNode(_el$,_el$4)
|
|
136
|
+
_$insertNode(_el$,_el$5)
|
|
137
|
+
_$insertNode(_el$,_el$6)
|
|
138
|
+
_$insertNode(_el$,_el$1)
|
|
139
|
+
_$setProp(_el$,"gap",1)
|
|
140
|
+
_$insertNode(_el$2,_el$3)
|
|
141
|
+
_$insert(_el$2,()=>icons.icon(props.step.icon),_el$3)
|
|
142
|
+
_$insert(_el$2,()=>props.step.title,null)
|
|
143
|
+
_$setProp(_el$4,"wrapMode","word")
|
|
144
|
+
_$insert(_el$4,()=>props.step.summary)
|
|
145
|
+
_$setProp(_el$5,"border",["top","bottom"])
|
|
146
|
+
_$setProp(_el$5,"paddingTop",1)
|
|
147
|
+
_$setProp(_el$5,"paddingBottom",1)
|
|
148
|
+
_$setProp(_el$5,"gap",1)
|
|
149
|
+
_$insert(_el$5,_$createComponent(For,{get each(){return props.step.features
|
|
150
|
+
},children:(feature)=>(()=>{var _el$14=_$createElement("box"),_el$15=_$createElement("text"),_el$16=_$createElement("text"),_el$17=_$createElement("b"),_el$18=_$createTextNode(` \xB7 `)
|
|
151
|
+
_$insertNode(_el$14,_el$15)
|
|
152
|
+
_$insertNode(_el$14,_el$16)
|
|
153
|
+
_$setProp(_el$14,"flexDirection","row")
|
|
154
|
+
_$setProp(_el$14,"gap",1)
|
|
155
|
+
_$setProp(_el$15,"flexShrink",0)
|
|
156
|
+
_$insert(_el$15,()=>icons.icon(feature.icon))
|
|
157
|
+
_$insertNode(_el$16,_el$17)
|
|
158
|
+
_$insertNode(_el$16,_el$18)
|
|
159
|
+
_$setProp(_el$16,"flexGrow",1)
|
|
160
|
+
_$setProp(_el$16,"minWidth",0)
|
|
161
|
+
_$setProp(_el$16,"wrapMode","word")
|
|
162
|
+
_$insert(_el$17,()=>feature.title)
|
|
163
|
+
_$insert(_el$16,()=>feature.description,null)
|
|
164
|
+
_$effect((_p$)=>{var _v$6=theme().accent,_v$7=theme().textMuted
|
|
165
|
+
_v$6!==_p$.e&&(_p$.e=_$setProp(_el$15,"fg",_v$6,_p$.e))
|
|
166
|
+
_v$7!==_p$.t&&(_p$.t=_$setProp(_el$16,"fg",_v$7,_p$.t))
|
|
167
|
+
return _p$
|
|
168
|
+
},{e:undefined,t:undefined
|
|
169
|
+
})
|
|
170
|
+
return _el$14
|
|
171
|
+
})()
|
|
172
|
+
}))
|
|
173
|
+
_$insertNode(_el$6,_el$7)
|
|
174
|
+
_$insertNode(_el$6,_el$8)
|
|
175
|
+
_$insertNode(_el$6,_el$9)
|
|
176
|
+
_$setProp(_el$6,"wrapMode","word")
|
|
177
|
+
_$insert(_el$6,()=>props.preferences.toggleKey(),_el$8)
|
|
178
|
+
_$insert(_el$6,()=>props.preferences.focusKey(),_el$9)
|
|
179
|
+
_$insert(_el$6,()=>icons.style()==="text"?"Text fallback":"Nerd Font",null)
|
|
180
|
+
_$setProp(_el$1,"flexDirection","row")
|
|
181
|
+
_$setProp(_el$1,"justifyContent","space-between")
|
|
182
|
+
_$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
183
|
+
props.onBack()
|
|
184
|
+
},get children(){var _el$10=_$createElement("text"),_el$11=_$createTextNode(` Back`)
|
|
185
|
+
_$insertNode(_el$10,_el$11)
|
|
186
|
+
_$insert(_el$10,()=>icons.icon("left"),_el$11)
|
|
187
|
+
_$effect((_$p)=>_$setProp(_el$10,"fg",theme().textMuted,_$p))
|
|
188
|
+
return _el$10
|
|
189
|
+
}}),null)
|
|
190
|
+
_$insert(_el$1,_$createComponent(SelectionBox,{paddingLeft:1,paddingRight:1,get backgroundColor(){return theme().primary
|
|
191
|
+
},onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
192
|
+
props.onAdvance()
|
|
193
|
+
},get children(){var _el$12=_$createElement("text"),_el$13=_$createTextNode(` `)
|
|
194
|
+
_$insertNode(_el$12,_el$13)
|
|
195
|
+
_$insert(_el$12,()=>props.final?"Configure sidebar":"Next",_el$13)
|
|
196
|
+
_$insert(_el$12,()=>icons.icon("right"),null)
|
|
197
|
+
_$effect((_$p)=>_$setProp(_el$12,"fg",theme().selectedListItemText,_$p))
|
|
198
|
+
return _el$12
|
|
199
|
+
}}),null)
|
|
200
|
+
_$effect((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes.BOLD,_v$3=theme().textMuted,_v$4=theme().borderSubtle,_v$5=theme().textMuted
|
|
201
|
+
_v$!==_p$.e&&(_p$.e=_$setProp(_el$2,"fg",_v$,_p$.e))
|
|
202
|
+
_v$2!==_p$.t&&(_p$.t=_$setProp(_el$2,"attributes",_v$2,_p$.t))
|
|
203
|
+
_v$3!==_p$.a&&(_p$.a=_$setProp(_el$4,"fg",_v$3,_p$.a))
|
|
204
|
+
_v$4!==_p$.o&&(_p$.o=_$setProp(_el$5,"borderColor",_v$4,_p$.o))
|
|
205
|
+
_v$5!==_p$.i&&(_p$.i=_$setProp(_el$6,"fg",_v$5,_p$.i))
|
|
206
|
+
return _p$
|
|
207
|
+
},{e:undefined,t:undefined,a:undefined,o:undefined,i:undefined
|
|
208
|
+
})
|
|
209
|
+
return _el$
|
|
210
|
+
})()
|
|
211
|
+
}
|
|
212
|
+
import {memo as _$memo2} from "@opentui/solid"
|
|
213
|
+
import {effect as _$effect2} from "@opentui/solid"
|
|
214
|
+
import {createComponent as _$createComponent2} from "@opentui/solid"
|
|
215
|
+
import {createTextNode as _$createTextNode2} from "@opentui/solid"
|
|
216
|
+
import {insertNode as _$insertNode2} from "@opentui/solid"
|
|
217
|
+
import {insert as _$insert2} from "@opentui/solid"
|
|
218
|
+
import {setProp as _$setProp2} from "@opentui/solid"
|
|
219
|
+
import {createElement as _$createElement2} from "@opentui/solid"
|
|
220
|
+
import {TextAttributes as TextAttributes2} from "@opentui/core"
|
|
221
|
+
import {For as For2} from "solid-js"
|
|
222
|
+
import {supportsSidebarSection as supportsSidebarSection2} from "./tui.js"
|
|
223
|
+
import {SelectionBox as SelectionBox2,useIcons as useIcons2} from "./tui.js"
|
|
224
|
+
function SectionConfig(props){const icons=useIcons2()
|
|
225
|
+
const theme=()=>props.api.theme.current
|
|
226
|
+
const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection2(props.api,section.name))
|
|
227
|
+
const finishIndex=sections.length
|
|
228
|
+
return(()=>{var _el$=_$createElement2("box"),_el$2=_$createElement2("text"),_el$3=_$createTextNode2(` Choose your sidebar sections`),_el$4=_$createElement2("text"),_el$6=_$createElement2("box")
|
|
229
|
+
_$insertNode2(_el$,_el$2)
|
|
230
|
+
_$insertNode2(_el$,_el$4)
|
|
231
|
+
_$insertNode2(_el$,_el$6)
|
|
232
|
+
_$setProp2(_el$,"gap",1)
|
|
233
|
+
_$insertNode2(_el$2,_el$3)
|
|
234
|
+
_$insert2(_el$2,()=>icons.icon("sections"),_el$3)
|
|
235
|
+
_$insertNode2(_el$4,_$createTextNode2(`Select what appears now. You can change visibility, order, limits, scope, and presets later with the gear button.`))
|
|
236
|
+
_$setProp2(_el$4,"wrapMode","word")
|
|
237
|
+
_$insert2(_el$,_$createComponent2(For2,{each:sections,children:(section,index)=>_$createComponent2(SelectionBox2,{flexDirection:"row",gap:1,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo2(()=>props.active===index())()?theme().backgroundElement:undefined
|
|
238
|
+
},onMouseOver:()=>props.onActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
239
|
+
props.preferences.toggleSection(section.name)
|
|
240
|
+
},get children(){return [(()=>{var _el$1=_$createElement2("text")
|
|
241
|
+
_$setProp2(_el$1,"flexShrink",0)
|
|
242
|
+
_$insert2(_el$1,()=>icons.icon(props.preferences.sections()[section.name]?"checked":"unchecked"))
|
|
243
|
+
_$effect2((_$p)=>_$setProp2(_el$1,"fg",props.preferences.sections()[section.name]?theme().accent:theme().textMuted,_$p))
|
|
244
|
+
return _el$1
|
|
245
|
+
})(),(()=>{var _el$10=_$createElement2("text"),_el$11=_$createTextNode2(` `)
|
|
246
|
+
_$insertNode2(_el$10,_el$11)
|
|
247
|
+
_$insert2(_el$10,()=>icons.section(section.name),_el$11)
|
|
248
|
+
_$insert2(_el$10,()=>section.label,null)
|
|
249
|
+
_$effect2((_$p)=>_$setProp2(_el$10,"fg",props.active===index()?theme().text:theme().textMuted,_$p))
|
|
250
|
+
return _el$10
|
|
251
|
+
})()]
|
|
252
|
+
}})
|
|
253
|
+
}),_el$6)
|
|
254
|
+
_$setProp2(_el$6,"flexDirection","row")
|
|
255
|
+
_$setProp2(_el$6,"justifyContent","space-between")
|
|
256
|
+
_$insert2(_el$6,_$createComponent2(SelectionBox2,{paddingLeft:1,paddingRight:1,onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
257
|
+
props.onBack()
|
|
258
|
+
},get children(){var _el$7=_$createElement2("text"),_el$8=_$createTextNode2(` Back`)
|
|
259
|
+
_$insertNode2(_el$7,_el$8)
|
|
260
|
+
_$insert2(_el$7,()=>icons.icon("left"),_el$8)
|
|
261
|
+
_$effect2((_$p)=>_$setProp2(_el$7,"fg",theme().textMuted,_$p))
|
|
262
|
+
return _el$7
|
|
263
|
+
}}),null)
|
|
264
|
+
_$insert2(_el$6,_$createComponent2(SelectionBox2,{paddingLeft:2,paddingRight:2,get backgroundColor(){return _$memo2(()=>props.active===finishIndex)()?theme().primary:undefined
|
|
265
|
+
},onMouseOver:()=>props.onActive(finishIndex),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
266
|
+
props.onFinish()
|
|
267
|
+
},get children(){var _el$9=_$createElement2("text"),_el$0=_$createTextNode2(` Finish`)
|
|
268
|
+
_$insertNode2(_el$9,_el$0)
|
|
269
|
+
_$insert2(_el$9,()=>icons.icon("done"),_el$0)
|
|
270
|
+
_$effect2((_$p)=>_$setProp2(_el$9,"fg",props.active===finishIndex?theme().selectedListItemText:theme().textMuted,_$p))
|
|
271
|
+
return _el$9
|
|
272
|
+
}}),null)
|
|
273
|
+
_$effect2((_p$)=>{var _v$=theme().accent,_v$2=TextAttributes2.BOLD,_v$3=theme().textMuted
|
|
274
|
+
_v$!==_p$.e&&(_p$.e=_$setProp2(_el$2,"fg",_v$,_p$.e))
|
|
275
|
+
_v$2!==_p$.t&&(_p$.t=_$setProp2(_el$2,"attributes",_v$2,_p$.t))
|
|
276
|
+
_v$3!==_p$.a&&(_p$.a=_$setProp2(_el$4,"fg",_v$3,_p$.a))
|
|
277
|
+
return _p$
|
|
278
|
+
},{e:undefined,t:undefined,a:undefined
|
|
279
|
+
})
|
|
280
|
+
return _el$
|
|
281
|
+
})()
|
|
282
|
+
}
|
|
283
|
+
function FirstRunWizard(props){const icons=useIcons3()
|
|
284
|
+
const dialogs=useDialogs(props.api)
|
|
285
|
+
const [active,setActive]=createSignal(0)
|
|
286
|
+
const [step,setStep]=createSignal(0)
|
|
287
|
+
const theme=()=>props.api.theme.current
|
|
288
|
+
const sections=SECTION_DEFINITIONS.filter((section)=>supportsSidebarSection3(props.api,section.name))
|
|
289
|
+
const finishIndex=sections.length
|
|
290
|
+
const stepCount=ONBOARDING_STEPS.length + 1
|
|
291
|
+
const configuring=()=>step()===ONBOARDING_STEPS.length
|
|
292
|
+
function finish(){dialogs.back()
|
|
293
|
+
}
|
|
294
|
+
function move(offset){if(configuring())
|
|
295
|
+
setActive((value)=>(value + offset + finishIndex + 1)%(finishIndex + 1))
|
|
296
|
+
else
|
|
297
|
+
setStep((value)=>Math.max(0,Math.min(ONBOARDING_STEPS.length,value + offset)))
|
|
298
|
+
}
|
|
299
|
+
function back(){setStep((value)=>Math.max(0,value-1))
|
|
300
|
+
}
|
|
301
|
+
function advance(){if(!configuring())
|
|
302
|
+
setStep((value)=>Math.min(ONBOARDING_STEPS.length,value + 1))
|
|
303
|
+
}
|
|
304
|
+
function select(){if(!configuring()){advance()
|
|
305
|
+
return
|
|
306
|
+
}
|
|
307
|
+
const index=active()
|
|
308
|
+
if(index===finishIndex)
|
|
309
|
+
finish()
|
|
310
|
+
else
|
|
311
|
+
props.preferences.toggleSection(sections[index].name)
|
|
312
|
+
}
|
|
313
|
+
const unregister=props.api.keymap.registerLayer({mode:"modal",priority:1000,commands:[{name:`${PLUGIN_ID}.wizard.previous`,run(){move(-1)
|
|
314
|
+
}},{name:`${PLUGIN_ID}.wizard.next`,run(){move(1)
|
|
315
|
+
}},{name:`${PLUGIN_ID}.wizard.select`,run:select
|
|
316
|
+
},{name:`${PLUGIN_ID}.wizard.back`,run:back
|
|
317
|
+
},{name:`${PLUGIN_ID}.wizard.forward`,run:advance
|
|
318
|
+
}],bindings:[{key:"up",cmd:`${PLUGIN_ID}.wizard.previous`
|
|
319
|
+
},{key:"down",cmd:`${PLUGIN_ID}.wizard.next`
|
|
320
|
+
},{key:"tab",cmd:`${PLUGIN_ID}.wizard.next`
|
|
321
|
+
},{key:"left",cmd:`${PLUGIN_ID}.wizard.back`
|
|
322
|
+
},{key:"right",cmd:`${PLUGIN_ID}.wizard.forward`
|
|
323
|
+
},{key:"space",cmd:`${PLUGIN_ID}.wizard.select`
|
|
324
|
+
},{key:"return",cmd:`${PLUGIN_ID}.wizard.select`
|
|
325
|
+
}]
|
|
326
|
+
})
|
|
327
|
+
onCleanup(unregister)
|
|
328
|
+
return _$createComponent3(DialogSurface,{get api(){return props.api
|
|
329
|
+
},get children(){return [(()=>{var _el$=_$createElement3("box"),_el$2=_$createElement3("text"),_el$3=_$createTextNode3(` Navigator setup`),_el$4=_$createElement3("text"),_el$5=_$createTextNode3(`Step `),_el$6=_$createTextNode3(`/`),_el$7=_$createTextNode3(` \xB7 `)
|
|
330
|
+
_$insertNode3(_el$,_el$2)
|
|
331
|
+
_$insertNode3(_el$,_el$4)
|
|
332
|
+
_$setProp3(_el$,"flexDirection","row")
|
|
333
|
+
_$setProp3(_el$,"justifyContent","space-between")
|
|
334
|
+
_$insertNode3(_el$2,_el$3)
|
|
335
|
+
_$insert3(_el$2,()=>icons.icon("help"),_el$3)
|
|
336
|
+
_$insertNode3(_el$4,_el$5)
|
|
337
|
+
_$insertNode3(_el$4,_el$6)
|
|
338
|
+
_$insertNode3(_el$4,_el$7)
|
|
339
|
+
_$setProp3(_el$4,"onMouseDown",(event)=>event.stopPropagation())
|
|
340
|
+
_$setProp3(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
|
|
341
|
+
finish()
|
|
342
|
+
})
|
|
343
|
+
_$insert3(_el$4,()=>step() + 1,_el$6)
|
|
344
|
+
_$insert3(_el$4,stepCount,_el$7)
|
|
345
|
+
_$insert3(_el$4,()=>icons.key("esc"),null)
|
|
346
|
+
_$effect3((_p$)=>{var _v$=TextAttributes3.BOLD,_v$2=theme().text,_v$3=theme().textMuted
|
|
347
|
+
_v$!==_p$.e&&(_p$.e=_$setProp3(_el$2,"attributes",_v$,_p$.e))
|
|
348
|
+
_v$2!==_p$.t&&(_p$.t=_$setProp3(_el$2,"fg",_v$2,_p$.t))
|
|
349
|
+
_v$3!==_p$.a&&(_p$.a=_$setProp3(_el$4,"fg",_v$3,_p$.a))
|
|
350
|
+
return _p$
|
|
351
|
+
},{e:undefined,t:undefined,a:undefined
|
|
352
|
+
})
|
|
353
|
+
return _el$
|
|
354
|
+
})(),_$createComponent3(Show,{get when(){return configuring()
|
|
355
|
+
},get fallback(){return _$createComponent3(OnboardingStep,{get api(){return props.api
|
|
356
|
+
},get preferences(){return props.preferences
|
|
357
|
+
},get step(){return ONBOARDING_STEPS[step()]
|
|
358
|
+
},get final(){return step()===ONBOARDING_STEPS.length-1
|
|
359
|
+
},onBack:back,onAdvance:advance
|
|
360
|
+
})
|
|
361
|
+
},get children(){return _$createComponent3(SectionConfig,{get api(){return props.api
|
|
362
|
+
},get preferences(){return props.preferences
|
|
363
|
+
},get active(){return active()
|
|
364
|
+
},onActive:setActive,onBack:back,onFinish:finish
|
|
365
|
+
})
|
|
366
|
+
}})]
|
|
367
|
+
}})
|
|
368
|
+
}
|
|
369
|
+
import {setProp as _$setProp4} from "@opentui/solid"
|
|
370
|
+
import {effect as _$effect4} from "@opentui/solid"
|
|
371
|
+
import {createTextNode as _$createTextNode4} from "@opentui/solid"
|
|
372
|
+
import {insertNode as _$insertNode4} from "@opentui/solid"
|
|
373
|
+
import {createElement as _$createElement4} from "@opentui/solid"
|
|
374
|
+
function openLimitsRefreshPrompt(api,preferences,dialogs){const scope=preferences.preferenceScopeLabel()
|
|
375
|
+
dialogs.prompt({title:"Limits refresh interval",description:()=>(()=>{var _el$=_$createElement4("text")
|
|
376
|
+
_$insertNode4(_el$,_$createTextNode4(`Automatic refresh in minutes (minimum 1; default 5). Manual Refresh stays immediate.`))
|
|
377
|
+
_$effect4((_$p)=>_$setProp4(_el$,"fg",api.theme.current.textMuted,_$p))
|
|
378
|
+
return _el$
|
|
379
|
+
})(),value:String(preferences.selectedLimitsRefreshMinutes()),onConfirm(value){if(preferences.preferenceScopeLabel()!==scope)
|
|
380
|
+
throw new Error("Preference scope changed; reopen this setting")
|
|
381
|
+
if(!/^\d+$/.test(value.trim()))
|
|
382
|
+
throw new Error("Enter whole minutes (at least 1 minute)")
|
|
383
|
+
preferences.setLimitsRefreshMinutes(Number(value))
|
|
384
|
+
dialogs.back()
|
|
385
|
+
}})
|
|
386
|
+
}
|
|
387
|
+
async function load(input){const path=import.meta.url.includes("/dist/")?"./toolbar-settings.js":"./open-toolbar"
|
|
388
|
+
try{return await import(path)
|
|
389
|
+
} catch(error){input.api.ui.toast({variant:"error",title:"Toolbar",message:String(error)})
|
|
390
|
+
return
|
|
391
|
+
}}
|
|
392
|
+
async function openToolbarManager(input){const route=JSON.stringify(input.api.route.current)
|
|
393
|
+
const target=input.skills?.target().key
|
|
394
|
+
const wasOpen=input.api.ui.dialog.open
|
|
395
|
+
const module=await load(input)
|
|
396
|
+
if(route===JSON.stringify(input.api.route.current)&&target===input.skills?.target().key&&(!wasOpen||input.api.ui.dialog.open)&&!input.api.lifecycle?.signal?.aborted)
|
|
397
|
+
module?.openToolbarManager(input)
|
|
398
|
+
}
|
|
399
|
+
function createSettingsSelection(input){const dialogClosed=()=>("open" in input.api.ui.dialog)&&!input.api.ui.dialog.open
|
|
400
|
+
function openLimitPrompt(section){const index=input.options().findIndex((option)=>option.value===section)
|
|
401
|
+
if(index!==-1)
|
|
402
|
+
input.setActive(index)
|
|
403
|
+
input.dialogs.prompt({title:`${SECTION_DEFINITIONS.find((item) => item.name === section).label} item limit`,description:()=>(()=>{var _el$=_$createElement5("text")
|
|
404
|
+
_$insertNode5(_el$,_$createTextNode5(`Visible items before Show all. Enter 0 for All.`))
|
|
405
|
+
_$effect5((_$p)=>_$setProp5(_el$,"fg",input.api.theme.current.textMuted,_$p))
|
|
406
|
+
return _el$
|
|
407
|
+
})(),value:String(input.preferences.selectedSectionItemLimit(section)),onConfirm(value){if(!/^\d+$/.test(value.trim()))
|
|
408
|
+
throw new Error("Enter a non-negative whole number (0 for All)")
|
|
409
|
+
input.preferences.setSectionItemLimit(section,Number(value))
|
|
410
|
+
input.dialogs.back()
|
|
411
|
+
}})
|
|
412
|
+
}
|
|
413
|
+
function openShortcut(value){const bindings={toggle_key:{title:"Sidebar shortcut",get:input.preferences.selectedToggleKey,set:input.preferences.setToggleKey
|
|
414
|
+
},focus_key:{title:"Focus shortcut",get:input.preferences.selectedFocusKey,set:input.preferences.setFocusKey
|
|
415
|
+
},search_key:{title:"Search Everything shortcut",get:input.preferences.selectedSearchKey,set:input.preferences.setSearchKey
|
|
416
|
+
}}
|
|
417
|
+
const binding=bindings[value]
|
|
418
|
+
input.dialogs.prompt({title:binding.title,description:()=>(()=>{var _el$3=_$createElement5("text")
|
|
419
|
+
_$insertNode5(_el$3,_$createTextNode5(`Use OpenCode key syntax, for example alt+s.`))
|
|
420
|
+
_$effect5((_$p)=>_$setProp5(_el$3,"fg",input.api.theme.current.textMuted,_$p))
|
|
421
|
+
return _el$3
|
|
422
|
+
})(),value:binding.get(),onConfirm(key){binding.set(key)
|
|
423
|
+
input.dialogs.back()
|
|
424
|
+
}})
|
|
425
|
+
}
|
|
426
|
+
function saveLayout(){input.preferences.saveLayoutAsDefault().then(()=>input.api.ui.toast({variant:"success",title:"Navigator settings",message:"Current layout saved as default",duration:3000
|
|
427
|
+
})).catch((error)=>input.api.ui.toast({variant:"error",title:"Navigator settings",message:error instanceof Error?error.message:"Failed to save the default layout",duration:5000
|
|
428
|
+
}))
|
|
429
|
+
}
|
|
430
|
+
function exportSettings(){const copied=input.api.renderer.copyToClipboardOSC52(input.preferences.exportPortableSettings())
|
|
431
|
+
input.api.ui.toast({variant:copied?"success":"warning",title:"Portable settings",message:copied?"Layout, MCP, and toolbar overflow copied as JSON":"Terminal clipboard is unavailable",duration:4000
|
|
432
|
+
})
|
|
433
|
+
}
|
|
434
|
+
function importSettings(){const path=import.meta.url.includes("/dist/")?"./settings-import.js":"../ui/settings-import-dialog"
|
|
435
|
+
import(path).then((module)=>{if(!dialogClosed())
|
|
436
|
+
module.openSettingsImport(input)
|
|
437
|
+
}).catch((error)=>input.api.ui.toast({variant:"error",title:"Portable settings",message:String(error)
|
|
438
|
+
}))
|
|
439
|
+
}
|
|
440
|
+
function select(value=input.options()[input.active()]?.value){if(!value)
|
|
441
|
+
return
|
|
442
|
+
const index=input.options().findIndex((option)=>option.value===value)
|
|
443
|
+
if(index!==-1)
|
|
444
|
+
input.setActive(index)
|
|
445
|
+
if(value==="scope:global"||value==="scope:worktree")
|
|
446
|
+
input.preferences.setPreferenceScope(value==="scope:global"?"global":"worktree")
|
|
447
|
+
else if(value.startsWith("preset:custom:"))
|
|
448
|
+
input.openPreset(decodeURIComponent(value.slice("preset:custom:".length)))
|
|
449
|
+
else
|
|
450
|
+
switch(value){case "toolbar_manager":{openToolbarManager(input)
|
|
451
|
+
break
|
|
452
|
+
}
|
|
453
|
+
case "toolbar_overflow":{input.preferences.toggleToolbarOverflow()
|
|
454
|
+
break
|
|
455
|
+
}
|
|
456
|
+
case "save_preset":{input.promptPreset()
|
|
457
|
+
break
|
|
458
|
+
}
|
|
459
|
+
case "save_layout":{saveLayout()
|
|
460
|
+
break
|
|
461
|
+
}
|
|
462
|
+
case "export_settings":{exportSettings()
|
|
463
|
+
break
|
|
464
|
+
}
|
|
465
|
+
case "import_settings":{importSettings()
|
|
466
|
+
break
|
|
467
|
+
}
|
|
468
|
+
case "reload_settings":{input.preferences.reloadFromFile().then(()=>input.api.ui.toast({variant:"success",title:"Navigator settings",message:"Saved settings reloaded",duration:3000
|
|
469
|
+
})).catch((error)=>input.api.ui.toast({variant:"error",title:"Navigator settings",message:error instanceof Error?error.message:"Could not reload saved settings",duration:5000
|
|
470
|
+
}))
|
|
471
|
+
break
|
|
472
|
+
}
|
|
473
|
+
case "reset_sections":{input.preferences.resetSections()
|
|
474
|
+
break
|
|
475
|
+
}
|
|
476
|
+
case "session_title":{input.preferences.toggleSessionTitleVisibility()
|
|
477
|
+
break
|
|
478
|
+
}
|
|
479
|
+
case "session_date":{input.preferences.toggleSessionDateVisibility()
|
|
480
|
+
break
|
|
481
|
+
}
|
|
482
|
+
case "persist_mcp":{input.preferences.toggleMcpPersistence()
|
|
483
|
+
break
|
|
484
|
+
}
|
|
485
|
+
case "limits_refresh":{openLimitsRefreshPrompt(input.api,input.preferences,input.dialogs)
|
|
486
|
+
break
|
|
487
|
+
}
|
|
488
|
+
case "start_in_chat":{input.preferences.toggleStartInChat()
|
|
489
|
+
break
|
|
490
|
+
}
|
|
491
|
+
case "auto_approve_permissions":{input.preferences.setAutoApprovePermissions(input.preferences.autoApprovePermissions()!==true)
|
|
492
|
+
break
|
|
493
|
+
}
|
|
494
|
+
case "lsp_icon_style":{input.preferences.toggleLspIconStyle()
|
|
495
|
+
break
|
|
496
|
+
}
|
|
497
|
+
case "corner_font":{input.preferences.toggleCornerFont()
|
|
498
|
+
break
|
|
499
|
+
}
|
|
500
|
+
case "row_density":{input.preferences.toggleRowDensity()
|
|
501
|
+
break
|
|
502
|
+
}
|
|
503
|
+
case "toggle_key":{openShortcut("toggle_key")
|
|
504
|
+
break
|
|
505
|
+
}
|
|
506
|
+
case "focus_key":{openShortcut("focus_key")
|
|
507
|
+
break
|
|
508
|
+
}
|
|
509
|
+
case "search_key":{openShortcut("search_key")
|
|
510
|
+
break
|
|
511
|
+
}
|
|
512
|
+
case "reset_settings":{input.preferences.resetPluginSettings()
|
|
513
|
+
break
|
|
514
|
+
}
|
|
515
|
+
case "reset_mcp":{input.preferences.resetMcpStates()
|
|
516
|
+
break
|
|
517
|
+
}
|
|
518
|
+
case "trusted_skills":{const path=import.meta.url.includes("/dist/")?"./trusted-skills.js":"../ui/trusted-skills-dialog"
|
|
519
|
+
import(path).then((module)=>{if(dialogClosed())
|
|
520
|
+
return
|
|
521
|
+
const{TrustedSkillsDialog
|
|
522
|
+
}=module
|
|
523
|
+
input.dialogs.open(()=>_$createComponent4(TrustedSkillsDialog,{get api(){return input.api
|
|
524
|
+
},get preferences(){return input.preferences
|
|
525
|
+
}}))
|
|
526
|
+
}).catch((error)=>input.api.ui.toast({variant:"error",title:"Trusted skills",message:String(error)
|
|
527
|
+
}))
|
|
528
|
+
break
|
|
529
|
+
}
|
|
530
|
+
case "wizard":{input.dialogs.open(()=>_$createComponent4(FirstRunWizard,{get api(){return input.api
|
|
531
|
+
},get preferences(){return input.preferences
|
|
532
|
+
}}))
|
|
533
|
+
break
|
|
534
|
+
}
|
|
535
|
+
default:{input.preferences.toggleSelectedSection(value)
|
|
536
|
+
}}}
|
|
537
|
+
function openQuickActions(){input.setActive(input.options().findIndex((option)=>option.value==="quick_actions"))
|
|
538
|
+
const path=import.meta.url.includes("/dist/")?"./quick-actions-settings.js":"../ui/quick-actions-dialog"
|
|
539
|
+
import(path).then((module)=>{if(dialogClosed())
|
|
540
|
+
return
|
|
541
|
+
const{QuickActionsDialog
|
|
542
|
+
}=module
|
|
543
|
+
input.dialogs.open(()=>_$createComponent4(QuickActionsDialog,{get api(){return input.api
|
|
544
|
+
},get preferences(){return input.preferences
|
|
545
|
+
}}))
|
|
546
|
+
}).catch((error)=>{input.api.ui.toast({variant:"error",title:"Quick actions",message:String(error),duration:4000
|
|
547
|
+
})
|
|
548
|
+
})
|
|
549
|
+
}
|
|
550
|
+
function openMcpGroups(){if(!input.mcp)
|
|
551
|
+
return
|
|
552
|
+
input.setActive(input.options().findIndex((option)=>option.value==="mcp"))
|
|
553
|
+
const path=import.meta.url.includes("/dist/")?"./mcp-groups.js":"../ui/mcp-groups-dialog"
|
|
554
|
+
import(path).then((module)=>{if(dialogClosed())
|
|
555
|
+
return
|
|
556
|
+
const{McpGroupsDialog
|
|
557
|
+
}=module
|
|
558
|
+
input.dialogs.open(()=>_$createComponent4(McpGroupsDialog,{get api(){return input.api
|
|
559
|
+
},get preferences(){return input.preferences
|
|
560
|
+
},get mcp(){return input.mcp
|
|
561
|
+
}}))
|
|
562
|
+
}).catch((error)=>{input.api.ui.toast({variant:"error",title:"MCP groups",message:String(error),duration:4000
|
|
563
|
+
})
|
|
564
|
+
})
|
|
565
|
+
}
|
|
566
|
+
function openSkillGroups(){if(!input.skills)
|
|
567
|
+
return
|
|
568
|
+
input.setActive(input.options().findIndex((option)=>option.value==="skills"))
|
|
569
|
+
const path=import.meta.url.includes("/dist/")?"./skill-groups.js":"../ui/skill-groups-dialog"
|
|
570
|
+
import(path).then((module)=>{if(dialogClosed())
|
|
571
|
+
return
|
|
572
|
+
const{SkillGroupsDialog
|
|
573
|
+
}=module
|
|
574
|
+
input.dialogs.open(()=>_$createComponent4(SkillGroupsDialog,{get api(){return input.api
|
|
575
|
+
},get preferences(){return input.preferences
|
|
576
|
+
},get skills(){return input.skills
|
|
577
|
+
}}))
|
|
578
|
+
}).catch((error)=>{input.api.ui.toast({variant:"error",title:"Skill groups",message:String(error),duration:4000
|
|
579
|
+
})
|
|
580
|
+
})
|
|
581
|
+
}
|
|
582
|
+
return{openLimitPrompt,openMcpGroups,openSkillGroups,openQuickActions,select
|
|
583
|
+
}}
|
|
584
|
+
function createSettingsDialogController(props){let body
|
|
585
|
+
const theme=()=>props.api.theme.current
|
|
586
|
+
const icons=useIcons4()
|
|
587
|
+
const dialogs=useDialogs2(props.api)
|
|
588
|
+
const scroll=useDialogScroll()
|
|
589
|
+
const dimensions=useTerminalDimensions()
|
|
590
|
+
const bodyHeight=createMemo2(()=>Math.max(4,Math.floor(dimensions().height*0.75)-10))
|
|
591
|
+
const orderedGroups=createSettingsGroups(props.api,props.preferences,icons)
|
|
592
|
+
const initialGroup=orderedGroups().find((group)=>group.options.some((option)=>option.value===props.activeValue))
|
|
593
|
+
const [activeGroup,setActiveGroup]=useDialogState("tab",initialGroup?.id??orderedGroups()[0].id)
|
|
594
|
+
const options=createMemo2(()=>orderedGroups().find((group)=>group.id===activeGroup())?.options??[])
|
|
595
|
+
const optionId=(value)=>`${PLUGIN_ID}.settings.${value}`
|
|
596
|
+
const initialActive=options().findIndex((option)=>option.value===props.activeValue)
|
|
597
|
+
const [active,setActive]=useDialogState("selection",Math.max(0,initialActive))
|
|
598
|
+
createEffect(()=>{if(active()>=options().length)
|
|
599
|
+
setActive(Math.max(0,options().length-1))
|
|
600
|
+
})
|
|
601
|
+
const contentHeight=createMemo2(()=>Math.min(bodyHeight(),Math.max(1,options().length*2-1)))
|
|
602
|
+
const footerHint=createMemo2(()=>{const common=`${icons.key("tab")} switch \xB7 ${icons.key("up/down")} navigate`
|
|
603
|
+
if(activeGroup()==="sections")
|
|
604
|
+
return `${common} \xB7 ${icons.key("enter")} toggle \xB7 l item limit${options()[active()]?.value === "quick_actions" ? " \xB7 a actions" : ""}${["mcp", "skills"].includes(options()[active()]?.value ?? "") ? " \xB7 g groups" : ""} \xB7 ${icons.key("left/right")} or ${icons.key("shift+up/down")} reorder`
|
|
605
|
+
if(activeGroup()==="presets")
|
|
606
|
+
return `${common} \xB7 ${icons.key("enter")} manage`
|
|
607
|
+
if(activeGroup()==="behavior")
|
|
608
|
+
return `${common} \xB7 ${icons.key("enter")} change`
|
|
609
|
+
if(activeGroup()==="defaults")
|
|
610
|
+
return `${common} \xB7 ${icons.key("enter")} run`
|
|
611
|
+
return `${common} \xB7 ${icons.key("enter")} select`
|
|
612
|
+
})
|
|
613
|
+
onMount(()=>{queueMicrotask(()=>{const option=options()[active()]
|
|
614
|
+
if(option)
|
|
615
|
+
body?.scrollChildIntoView(optionId(option.value))
|
|
616
|
+
})
|
|
617
|
+
})
|
|
618
|
+
function move(offset){const next=(active() + offset + options().length)%options().length
|
|
619
|
+
setActive(next)
|
|
620
|
+
const option=options()[next]
|
|
621
|
+
if(option)
|
|
622
|
+
body?.scrollChildIntoView(optionId(option.value))
|
|
623
|
+
}
|
|
624
|
+
function switchGroup(offset){const index=orderedGroups().findIndex((group)=>group.id===activeGroup())
|
|
625
|
+
const group=orderedGroups()[(index + offset + orderedGroups().length)%orderedGroups().length]
|
|
626
|
+
setActiveGroup(group.id)
|
|
627
|
+
setActive(0)
|
|
628
|
+
queueMicrotask(()=>{const option=options()[0]
|
|
629
|
+
if(option)
|
|
630
|
+
body?.scrollChildIntoView(optionId(option.value))
|
|
631
|
+
})
|
|
632
|
+
}
|
|
633
|
+
function reorder(value,direction){if(!value||!SIDEBAR_SECTIONS.includes(value))
|
|
634
|
+
return
|
|
635
|
+
props.preferences.moveSelectedSection(value,direction)
|
|
636
|
+
queueMicrotask(()=>{const next=options().findIndex((candidate)=>candidate.value===value)
|
|
637
|
+
if(next===-1)
|
|
638
|
+
return
|
|
639
|
+
setActive(next)
|
|
640
|
+
body?.scrollChildIntoView(optionId(value))
|
|
641
|
+
})
|
|
642
|
+
}
|
|
643
|
+
function runPresetAction(action,name){const path=import.meta.url.includes("/dist/")?"./layout-preset-actions.js":"./layout-preset-actions"
|
|
644
|
+
import(path).then((module)=>{if("open" in props.api.ui.dialog&&!props.api.ui.dialog.open)
|
|
645
|
+
return
|
|
646
|
+
const factory=module.createLayoutPresetActions
|
|
647
|
+
const actions=factory({api:props.api,preferences:props.preferences,mcp:props.mcp,dialogs
|
|
648
|
+
})
|
|
649
|
+
if(action==="open"&&name)
|
|
650
|
+
actions.open(name)
|
|
651
|
+
else
|
|
652
|
+
actions.prompt()
|
|
653
|
+
}).catch((error)=>props.api.ui.toast({variant:"error",title:"Layout presets",message:String(error)
|
|
654
|
+
}))
|
|
655
|
+
}
|
|
656
|
+
const selection=createSettingsSelection({api:props.api,preferences:props.preferences,mcp:props.mcp,skills:props.skills,dialogs,options,active,setActive,openPreset:(name)=>runPresetAction("open",name),promptPreset:()=>runPresetAction("prompt")
|
|
657
|
+
})
|
|
658
|
+
const unregister=registerSettingsKeymap({api:props.api,active,activeGroup,options,move,switchGroup,reorder,select:selection.select,openQuickActions:selection.openQuickActions,openMcpGroups:selection.openMcpGroups,openSkillGroups:selection.openSkillGroups,openLimitPrompt:selection.openLimitPrompt
|
|
659
|
+
})
|
|
660
|
+
onCleanup2(unregister)
|
|
661
|
+
return{active,activeGroup,contentHeight,dialogs,footerHint,icons,openLimitPrompt:selection.openLimitPrompt,openQuickActions:selection.openQuickActions,openMcpGroups:selection.openMcpGroups,openSkillGroups:selection.openSkillGroups,options,optionId,orderedGroups,reorder,select:selection.select,setActive,setActiveGroup,setBody(node){body=node
|
|
662
|
+
scroll.ref(node)
|
|
663
|
+
},restoreScroll:scroll.restore,saveScroll:scroll.save,theme
|
|
664
|
+
}}
|
|
665
|
+
import {createComponent as _$createComponent5} from "@opentui/solid"
|
|
666
|
+
import {createTextNode as _$createTextNode6} from "@opentui/solid"
|
|
667
|
+
import {insertNode as _$insertNode6} from "@opentui/solid"
|
|
668
|
+
import {effect as _$effect6} from "@opentui/solid"
|
|
669
|
+
import {insert as _$insert4} from "@opentui/solid"
|
|
670
|
+
import {setProp as _$setProp6} from "@opentui/solid"
|
|
671
|
+
import {createElement as _$createElement6} from "@opentui/solid"
|
|
672
|
+
import {memo as _$memo3} from "@opentui/solid"
|
|
673
|
+
import {TextAttributes as TextAttributes4} from "@opentui/core"
|
|
674
|
+
import {Show as Show2} from "solid-js"
|
|
675
|
+
import {SelectionBox as SelectionBox3} from "./tui.js"
|
|
676
|
+
function SettingsOptionRow(props){const model=props.controller
|
|
677
|
+
const index=()=>model.options().findIndex((candidate)=>candidate.value===props.option.value)
|
|
678
|
+
const selected=()=>model.active()===index()
|
|
679
|
+
const section=()=>props.option.value
|
|
680
|
+
return _$createComponent5(SelectionBox3,{get id(){return model.optionId(props.option.value)
|
|
681
|
+
},flexDirection:"row",gap:2,paddingLeft:1,paddingRight:1,get backgroundColor(){return _$memo3(()=>!!selected())()?model.theme().backgroundElement:undefined
|
|
682
|
+
},onMouseOver:()=>model.setActive(index()),onMouseDown:(event)=>event.stopPropagation(),onMouseUp:(event)=>{event.stopPropagation()
|
|
683
|
+
model.select(props.option.value)
|
|
684
|
+
},get children(){return [(()=>{var _el$=_$createElement6("text")
|
|
685
|
+
_$setProp6(_el$,"flexShrink",0)
|
|
686
|
+
_$insert4(_el$,()=>props.option.title)
|
|
687
|
+
_$effect6((_p$)=>{var _v$=selected()?TextAttributes4.BOLD:undefined,_v$2=model.theme().text
|
|
688
|
+
_v$!==_p$.e&&(_p$.e=_$setProp6(_el$,"attributes",_v$,_p$.e))
|
|
689
|
+
_v$2!==_p$.t&&(_p$.t=_$setProp6(_el$,"fg",_v$2,_p$.t))
|
|
690
|
+
return _p$
|
|
691
|
+
},{e:undefined,t:undefined
|
|
692
|
+
})
|
|
693
|
+
return _el$
|
|
694
|
+
})(),(()=>{var _el$2=_$createElement6("text")
|
|
695
|
+
_$setProp6(_el$2,"flexGrow",1)
|
|
696
|
+
_$insert4(_el$2,()=>props.option.description)
|
|
697
|
+
_$effect6((_$p)=>_$setProp6(_el$2,"fg",model.theme().borderSubtle,_$p))
|
|
698
|
+
return _el$2
|
|
699
|
+
})(),_$createComponent5(Show2,{get when(){return SIDEBAR_SECTIONS.includes(section())
|
|
700
|
+
},get children(){var _el$3=_$createElement6("box"),_el$8=_$createElement6("text"),_el$9=_$createTextNode6(` Items: `),_el$0=_$createElement6("text"),_el$1=_$createElement6("text")
|
|
701
|
+
_$insertNode6(_el$3,_el$8)
|
|
702
|
+
_$insertNode6(_el$3,_el$0)
|
|
703
|
+
_$insertNode6(_el$3,_el$1)
|
|
704
|
+
_$setProp6(_el$3,"flexDirection","row")
|
|
705
|
+
_$setProp6(_el$3,"flexShrink",0)
|
|
706
|
+
_$setProp6(_el$3,"gap",1)
|
|
707
|
+
_$insert4(_el$3,_$createComponent5(Show2,{get when(){return props.option.value==="quick_actions"
|
|
708
|
+
},get children(){var _el$4=_$createElement6("text"),_el$5=_$createTextNode6(` Actions`)
|
|
709
|
+
_$insertNode6(_el$4,_el$5)
|
|
710
|
+
_$setProp6(_el$4,"onMouseDown",(event)=>event.stopPropagation())
|
|
711
|
+
_$setProp6(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
|
|
712
|
+
model.openQuickActions()
|
|
713
|
+
})
|
|
714
|
+
_$insert4(_el$4,()=>model.icons.icon("actions"),_el$5)
|
|
715
|
+
_$effect6((_$p)=>_$setProp6(_el$4,"fg",model.theme().accent,_$p))
|
|
716
|
+
return _el$4
|
|
717
|
+
}}),_el$8)
|
|
718
|
+
_$insert4(_el$3,_$createComponent5(Show2,{get when(){return props.option.value==="mcp"||props.option.value==="skills"
|
|
719
|
+
},get children(){var _el$6=_$createElement6("text"),_el$7=_$createTextNode6(` Groups`)
|
|
720
|
+
_$insertNode6(_el$6,_el$7)
|
|
721
|
+
_$setProp6(_el$6,"onMouseDown",(event)=>event.stopPropagation())
|
|
722
|
+
_$setProp6(_el$6,"onMouseUp",(event)=>{event.stopPropagation()
|
|
723
|
+
if(props.option.value==="skills")
|
|
724
|
+
model.openSkillGroups()
|
|
725
|
+
else
|
|
726
|
+
model.openMcpGroups()
|
|
727
|
+
})
|
|
728
|
+
_$insert4(_el$6,()=>model.icons.icon("sections"),_el$7)
|
|
729
|
+
_$effect6((_$p)=>_$setProp6(_el$6,"fg",model.theme().accent,_$p))
|
|
730
|
+
return _el$6
|
|
731
|
+
}}),_el$8)
|
|
732
|
+
_$insertNode6(_el$8,_el$9)
|
|
733
|
+
_$setProp6(_el$8,"onMouseDown",(event)=>event.stopPropagation())
|
|
734
|
+
_$setProp6(_el$8,"onMouseUp",(event)=>{event.stopPropagation()
|
|
735
|
+
model.openLimitPrompt(section())
|
|
736
|
+
})
|
|
737
|
+
_$insert4(_el$8,()=>model.icons.icon("todo"),_el$9)
|
|
738
|
+
_$insert4(_el$8,()=>props.preferences.selectedSectionItemLimit?.(section())||"All",null)
|
|
739
|
+
_$setProp6(_el$0,"onMouseDown",(event)=>{event.stopPropagation()
|
|
740
|
+
model.reorder(props.option.value,-1)
|
|
741
|
+
})
|
|
742
|
+
_$insert4(_el$0,()=>model.icons.icon("up"))
|
|
743
|
+
_$setProp6(_el$1,"onMouseDown",(event)=>{event.stopPropagation()
|
|
744
|
+
model.reorder(props.option.value,1)
|
|
745
|
+
})
|
|
746
|
+
_$insert4(_el$1,()=>model.icons.icon("down"))
|
|
747
|
+
_$effect6((_p$)=>{var _v$3=model.theme().accent,_v$4=model.theme().accent,_v$5=model.theme().accent
|
|
748
|
+
_v$3!==_p$.e&&(_p$.e=_$setProp6(_el$8,"fg",_v$3,_p$.e))
|
|
749
|
+
_v$4!==_p$.t&&(_p$.t=_$setProp6(_el$0,"fg",_v$4,_p$.t))
|
|
750
|
+
_v$5!==_p$.a&&(_p$.a=_$setProp6(_el$1,"fg",_v$5,_p$.a))
|
|
751
|
+
return _p$
|
|
752
|
+
},{e:undefined,t:undefined,a:undefined
|
|
753
|
+
})
|
|
754
|
+
return _el$3
|
|
755
|
+
}})]
|
|
756
|
+
}})
|
|
757
|
+
}
|
|
758
|
+
function SettingsDialog(props){const model=createSettingsDialogController(props)
|
|
759
|
+
return _$createComponent6(DialogSurface2,{get api(){return props.api
|
|
760
|
+
},get children(){return [(()=>{var _el$=_$createElement7("box"),_el$2=_$createElement7("text"),_el$3=_$createTextNode7(` Navigator settings`),_el$4=_$createElement7("text")
|
|
761
|
+
_$insertNode7(_el$,_el$2)
|
|
762
|
+
_$insertNode7(_el$,_el$4)
|
|
763
|
+
_$setProp7(_el$,"flexDirection","row")
|
|
764
|
+
_$setProp7(_el$,"justifyContent","space-between")
|
|
765
|
+
_$insertNode7(_el$2,_el$3)
|
|
766
|
+
_$insert5(_el$2,()=>model.icons.icon("settings"),_el$3)
|
|
767
|
+
_$setProp7(_el$4,"onMouseDown",(event)=>event.stopPropagation())
|
|
768
|
+
_$setProp7(_el$4,"onMouseUp",(event)=>{event.stopPropagation()
|
|
769
|
+
model.dialogs.back()
|
|
770
|
+
})
|
|
771
|
+
_$insert5(_el$4,()=>model.icons.key("esc"))
|
|
772
|
+
_$effect7((_p$)=>{var _v$=TextAttributes5.BOLD,_v$2=model.theme().text,_v$3=model.theme().textMuted
|
|
773
|
+
_v$!==_p$.e&&(_p$.e=_$setProp7(_el$2,"attributes",_v$,_p$.e))
|
|
774
|
+
_v$2!==_p$.t&&(_p$.t=_$setProp7(_el$2,"fg",_v$2,_p$.t))
|
|
775
|
+
_v$3!==_p$.a&&(_p$.a=_$setProp7(_el$4,"fg",_v$3,_p$.a))
|
|
776
|
+
return _p$
|
|
777
|
+
},{e:undefined,t:undefined,a:undefined
|
|
778
|
+
})
|
|
779
|
+
return _el$
|
|
780
|
+
})(),(()=>{var _el$5=_$createElement7("text")
|
|
781
|
+
_$insertNode7(_el$5,_$createTextNode7(`Adjust sections and behavior. Changes apply immediately.`))
|
|
782
|
+
_$effect7((_$p)=>_$setProp7(_el$5,"fg",model.theme().textMuted,_$p))
|
|
783
|
+
return _el$5
|
|
784
|
+
})(),(()=>{var _el$7=_$createElement7("box")
|
|
785
|
+
_$setProp7(_el$7,"flexDirection","row")
|
|
786
|
+
_$setProp7(_el$7,"gap",1)
|
|
787
|
+
_$insert5(_el$7,_$createComponent6(For3,{get each(){return model.orderedGroups()
|
|
788
|
+
},children:(group)=>_$createComponent6(Tab,{get api(){return props.api
|
|
789
|
+
},get selected(){return model.activeGroup()===group.id
|
|
790
|
+
},paddingLeft:1,paddingRight:1,onMouseDown:()=>{model.setActiveGroup(group.id)
|
|
791
|
+
model.setActive(0)
|
|
792
|
+
},get children(){return [_$memo4(()=>model.icons.tab(group.id))," ",_$memo4(()=>group.tab)]
|
|
793
|
+
}})
|
|
794
|
+
}))
|
|
795
|
+
return _el$7
|
|
796
|
+
})(),(()=>{var _el$8=_$createElement7("scrollbox"),_el$9=_$createElement7("box")
|
|
797
|
+
_$insertNode7(_el$8,_el$9)
|
|
798
|
+
var _ref$=model.setBody
|
|
799
|
+
typeof _ref$==="function"?_$use(_ref$,_el$8):model.setBody=_el$8
|
|
800
|
+
_$setProp7(_el$8,"id",`${PLUGIN_ID}.settings.body`)
|
|
801
|
+
_$setProp7(_el$8,"scrollX",false)
|
|
802
|
+
_$setProp7(_el$8,"verticalScrollbarOptions",{visible:true
|
|
803
|
+
})
|
|
804
|
+
_$setProp7(_el$8,"horizontalScrollbarOptions",{visible:false
|
|
805
|
+
})
|
|
806
|
+
_$setProp7(_el$9,"gap",1)
|
|
807
|
+
_$insert5(_el$9,_$createComponent6(For3,{get each(){return model.options()
|
|
808
|
+
},children:(option)=>_$createComponent6(SettingsOptionRow,{get preferences(){return props.preferences
|
|
809
|
+
},controller:model,option
|
|
810
|
+
})
|
|
811
|
+
}))
|
|
812
|
+
_$effect7((_p$)=>{var{restoreScroll:_v$4,saveScroll:_v$5}=model,_v$6=model.contentHeight()
|
|
813
|
+
_v$4!==_p$.e&&(_p$.e=_$setProp7(_el$8,"renderBefore",_v$4,_p$.e))
|
|
814
|
+
_v$5!==_p$.t&&(_p$.t=_$setProp7(_el$8,"renderAfter",_v$5,_p$.t))
|
|
815
|
+
_v$6!==_p$.a&&(_p$.a=_$setProp7(_el$8,"height",_v$6,_p$.a))
|
|
816
|
+
return _p$
|
|
817
|
+
},{e:undefined,t:undefined,a:undefined
|
|
818
|
+
})
|
|
819
|
+
return _el$8
|
|
820
|
+
})(),(()=>{var _el$0=_$createElement7("text")
|
|
821
|
+
_$insert5(_el$0,()=>model.footerHint())
|
|
822
|
+
_$effect7((_$p)=>_$setProp7(_el$0,"fg",model.theme().textMuted,_$p))
|
|
823
|
+
return _el$0
|
|
824
|
+
})()]
|
|
825
|
+
}})
|
|
826
|
+
}
|
|
827
|
+
export{SettingsDialog
|
|
828
|
+
}
|