@qodalis/react-cli 2.3.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -172,7 +172,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
172
172
  const config = useCliConfig();
173
173
  const options = (0, import_cli3.mergeCliOptions)(props.options, config.options);
174
174
  const { modules, services } = (0, import_cli3.resolveCliHostConfig)(props, config);
175
- const [controller] = (0, import_react5.useState)(
175
+ const [controller2] = (0, import_react5.useState)(
176
176
  () => new import_cli3.CliPanelController({
177
177
  config: options,
178
178
  controlled: {
@@ -186,11 +186,11 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
186
186
  }
187
187
  })
188
188
  );
189
- const s = (0, import_react5.useSyncExternalStore)(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
189
+ const s = (0, import_react5.useSyncExternalStore)(controller2.subscribe, controller2.getSnapshot, controller2.getSnapshot);
190
190
  const brand = (0, import_cli3.panelBranding)(options);
191
191
  const [rootElement, setRootElement] = (0, import_react5.useState)(null);
192
192
  (0, import_react5.useLayoutEffect)(() => {
193
- controller.setCallbacks({
193
+ controller2.setCallbacks({
194
194
  onCollapsedChange: props.onCollapsedChange,
195
195
  onHiddenChange: props.onHiddenChange,
196
196
  onMaximizedChange: props.onMaximizedChange,
@@ -204,7 +204,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
204
204
  onPaneSplit: props.onPaneSplit,
205
205
  onPaneClosed: props.onPaneClosed
206
206
  });
207
- controller.setControlled({
207
+ controller2.setControlled({
208
208
  collapsed: props.collapsed,
209
209
  hidden: props.hidden,
210
210
  maximized: props.maximized,
@@ -213,11 +213,11 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
213
213
  height: props.height,
214
214
  width: props.width
215
215
  });
216
- controller.setOptions(options);
216
+ controller2.setOptions(options);
217
217
  });
218
- (0, import_react5.useEffect)(() => controller.setRootElement(rootElement), [controller, rootElement]);
219
- (0, import_react5.useEffect)(() => () => controller.destroy(), [controller]);
220
- import_react5.default.useImperativeHandle(ref, () => controller, [controller]);
218
+ (0, import_react5.useEffect)(() => controller2.setRootElement(rootElement), [controller2, rootElement]);
219
+ (0, import_react5.useEffect)(() => () => controller2.destroy(), [controller2]);
220
+ import_react5.default.useImperativeHandle(ref, () => controller2, [controller2]);
221
221
  if (!s.visible) return null;
222
222
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
223
223
  s.hidden && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
@@ -228,7 +228,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
228
228
  "data-hide-align": s.hideAlignment,
229
229
  style: asStyle(s.themeStyles),
230
230
  title: import_cli3.PANEL_LABELS.showCli,
231
- onClick: () => controller.unhide(),
231
+ onClick: () => controller2.unhide(),
232
232
  children: [
233
233
  brand.iconUrl ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("img", { src: brand.iconUrl, alt: "", className: "cli-panel-hide-tab-icon cli-panel-brand-icon" }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.HIDE_TAB_TERMINAL_ICON, className: "cli-panel-hide-tab-icon" }),
234
234
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-hide-tab-label", children: brand.title }),
@@ -247,19 +247,19 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
247
247
  "data-closable": String(s.closable),
248
248
  "data-hideable": String(s.hideable),
249
249
  children: [
250
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PanelHeader, { controller, s, brand }),
250
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(PanelHeader, { controller: controller2, s, brand }),
251
251
  s.initialized && /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-content", style: s.collapsed ? { display: "none" } : void 0, children: [
252
252
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-tabs", children: [
253
253
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("ul", { className: "cli-panel-tab-list", children: s.tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
254
254
  "li",
255
255
  {
256
256
  className: (0, import_cli3.panelTabClass)(s, tab),
257
- onClick: () => controller.selectTab(tab.id),
258
- onDoubleClick: () => controller.startRename(tab.id),
257
+ onClick: () => controller2.selectTab(tab.id),
258
+ onDoubleClick: () => controller2.startRename(tab.id),
259
259
  onContextMenu: (e) => {
260
260
  e.preventDefault();
261
261
  e.stopPropagation();
262
- controller.openContextMenu(tab.id, e.clientX, e.clientY);
262
+ controller2.openContextMenu(tab.id, e.clientX, e.clientY);
263
263
  },
264
264
  children: tab.isEditing ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
265
265
  "input",
@@ -268,8 +268,8 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
268
268
  type: "text",
269
269
  defaultValue: tab.title,
270
270
  ref: focusAndSelect,
271
- onKeyDown: (e) => (0, import_cli3.handleRenameKey)(controller, tab.id, e.key, e.currentTarget.value),
272
- onBlur: (e) => controller.commitRename(tab.id, e.target.value),
271
+ onKeyDown: (e) => (0, import_cli3.handleRenameKey)(controller2, tab.id, e.key, e.currentTarget.value),
272
+ onBlur: (e) => controller2.commitRename(tab.id, e.target.value),
273
273
  onClick: (e) => e.stopPropagation(),
274
274
  onDoubleClick: (e) => e.stopPropagation()
275
275
  }
@@ -283,7 +283,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
283
283
  title: import_cli3.PANEL_LABELS.closeTab,
284
284
  onClick: (e) => {
285
285
  e.stopPropagation();
286
- controller.closeTab(tab.id);
286
+ controller2.closeTab(tab.id);
287
287
  },
288
288
  children: import_cli3.CLOSE_GLYPH
289
289
  }
@@ -292,7 +292,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
292
292
  },
293
293
  tab.id
294
294
  )) }),
295
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-add-tab", title: import_cli3.PANEL_LABELS.newTerminal, onClick: () => controller.addTab(), children: "+" })
295
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-add-tab", title: import_cli3.PANEL_LABELS.newTerminal, onClick: () => controller2.addTab(), children: "+" })
296
296
  ] }),
297
297
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-instances", children: s.tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-instance", style: { display: tab.id === s.activeTabId ? void 0 : "none" }, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_cli3.panesContainerClass)(s), children: tab.panes.map((pane, i) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_react5.default.Fragment, { children: [
298
298
  i > 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
@@ -301,7 +301,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
301
301
  className: "cli-panel-pane-divider",
302
302
  onPointerDown: (e) => {
303
303
  e.preventDefault();
304
- controller.startPaneResize(tab.id, i - 1, e.clientX, (0, import_cli3.panesContainerWidth)(e.target));
304
+ controller2.startPaneResize(tab.id, i - 1, e.clientX, (0, import_cli3.panesContainerWidth)(e.target));
305
305
  },
306
306
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-pane-divider-grip" })
307
307
  }
@@ -311,7 +311,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
311
311
  {
312
312
  className: (0, import_cli3.paneClass)(s, tab.id, pane.id),
313
313
  style: (0, import_cli3.paneStyle)(pane.widthPercent),
314
- onClick: () => controller.activatePane(tab.id, pane.id),
314
+ onClick: () => controller2.activatePane(tab.id, pane.id),
315
315
  children: [
316
316
  tab.panes.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
317
317
  "button",
@@ -320,7 +320,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
320
320
  title: import_cli3.PANEL_LABELS.closePane,
321
321
  onClick: (e) => {
322
322
  e.stopPropagation();
323
- controller.closePane(pane.id);
323
+ controller2.closePane(pane.id);
324
324
  },
325
325
  children: import_cli3.CLOSE_GLYPH
326
326
  }
@@ -332,7 +332,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
332
332
  modules,
333
333
  services,
334
334
  snapshot: pane.snapshot,
335
- onReady: (engine) => controller.registerEngine(tab.id, pane.id, engine)
335
+ onReady: (engine) => controller2.registerEngine(tab.id, pane.id, engine)
336
336
  }
337
337
  ) })
338
338
  ]
@@ -350,7 +350,7 @@ var CliPanel = import_react5.default.forwardRef(function CliPanel2(props, ref) {
350
350
  {
351
351
  className: (0, import_cli3.joinClasses)("cli-panel-context-menu-item", item.destructive && "destructive"),
352
352
  disabled: item.disabled,
353
- onClick: () => (0, import_cli3.runContextMenuAction)(controller, item.action),
353
+ onClick: () => (0, import_cli3.runContextMenuAction)(controller2, item.action),
354
354
  children: item.label
355
355
  }
356
356
  )
@@ -372,13 +372,25 @@ function StatusDropdown({ s }) {
372
372
  dropdown.kind === "servers" ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-srv-meta", children: [
373
373
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-status", children: row.status }),
374
374
  row.meta.map((m) => /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-desc", children: m }, m))
375
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-status", children: row.status })
375
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
376
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "cli-panel-svc-status", children: row.status }),
377
+ row.stop && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
378
+ "button",
379
+ {
380
+ type: "button",
381
+ className: "cli-panel-svc-stop",
382
+ title: row.stop.title,
383
+ onClick: () => controller.killProcess(row.stop.pid),
384
+ children: row.stop.label
385
+ }
386
+ )
387
+ ] })
376
388
  ] }, row.key)) }),
377
389
  dropdown.rows.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-services-dropdown-empty", children: dropdown.emptyText })
378
390
  ] });
379
391
  }
380
392
  function PanelHeader({
381
- controller,
393
+ controller: controller2,
382
394
  s,
383
395
  brand
384
396
  }) {
@@ -386,8 +398,8 @@ function PanelHeader({
386
398
  const openDropdown = (e, dropdown) => {
387
399
  if (!dropdown) return;
388
400
  e.stopPropagation();
389
- if (dropdown === "services") controller.toggleServicesDropdown(e.currentTarget);
390
- else controller.toggleServersDropdown(e.currentTarget);
401
+ if (dropdown === "services") controller2.toggleServicesDropdown(e.currentTarget);
402
+ else controller2.toggleServersDropdown(e.currentTarget);
391
403
  };
392
404
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-header", children: [
393
405
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
@@ -397,7 +409,7 @@ function PanelHeader({
397
409
  onPointerDown: (e) => {
398
410
  if (!s.resizable) return;
399
411
  e.preventDefault();
400
- controller.startPanelResize(e.clientX, e.clientY);
412
+ controller2.startPanelResize(e.clientX, e.clientY);
401
413
  },
402
414
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-resize-grip" })
403
415
  }
@@ -436,25 +448,25 @@ function PanelHeader({
436
448
  )) }),
437
449
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-action-buttons", children: [
438
450
  /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "cli-panel-btn-position-wrapper", onClick: (e) => e.stopPropagation(), children: [
439
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-position", title: import_cli3.PANEL_LABELS.movePanel, onClick: () => controller.togglePositionDropdown(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.positionIcon)(s.position) }) }),
440
- s.positionDropdownOpen && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-position-dropdown", children: (0, import_cli3.positionOptions)(s).map((opt) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { className: opt.className, onClick: () => controller.setPosition(opt.position), children: [
451
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-position", title: import_cli3.PANEL_LABELS.movePanel, onClick: () => controller2.togglePositionDropdown(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.positionIcon)(s.position) }) }),
452
+ s.positionDropdownOpen && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "cli-panel-position-dropdown", children: (0, import_cli3.positionOptions)(s).map((opt) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("button", { className: opt.className, onClick: () => controller2.setPosition(opt.position), children: [
441
453
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.positionIcon)(opt.position, 16) }),
442
454
  opt.label
443
455
  ] }, opt.position)) })
444
456
  ] }),
445
- s.hideable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-hide", title: import_cli3.PANEL_LABELS.hide, onClick: () => controller.hide(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.HIDE_ICON }) }),
457
+ s.hideable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-hide", title: import_cli3.PANEL_LABELS.hide, onClick: () => controller2.hide(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.HIDE_ICON }) }),
446
458
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
447
459
  "button",
448
460
  {
449
461
  className: "cli-panel-btn",
450
462
  title: s.maximized ? import_cli3.PANEL_LABELS.restore : import_cli3.PANEL_LABELS.maximize,
451
463
  disabled: s.collapsed,
452
- onClick: () => controller.toggleMaximize(),
464
+ onClick: () => controller2.toggleMaximize(),
453
465
  children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: s.maximized ? import_cli3.RESTORE_ICON : import_cli3.MAXIMIZE_ICON })
454
466
  }
455
467
  ),
456
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn", title: s.collapsed ? import_cli3.PANEL_LABELS.expand : import_cli3.PANEL_LABELS.collapse, onClick: () => controller.toggle(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.collapseChevronIcon)(s.position, s.collapsed) }) }),
457
- s.closable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-close", title: import_cli3.PANEL_LABELS.close, onClick: () => controller.close(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.CLOSE_ICON }) })
468
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn", title: s.collapsed ? import_cli3.PANEL_LABELS.expand : import_cli3.PANEL_LABELS.collapse, onClick: () => controller2.toggle(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: (0, import_cli3.collapseChevronIcon)(s.position, s.collapsed) }) }),
469
+ s.closable && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { className: "cli-panel-btn cli-panel-btn-close", title: import_cli3.PANEL_LABELS.close, onClick: () => controller2.close(), children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { icon: import_cli3.CLOSE_ICON }) })
458
470
  ] })
459
471
  ] }),
460
472
  /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: (0, import_cli3.glowLineClass)(s) })
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.tsx","../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx"],"sourcesContent":["export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n","import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n"],"mappings":"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","names":["import_react","import_cli","import_react","import_react","import_jsx_runtime","import_react","import_cli","import_jsx_runtime","React","CliPanel","import_react","import_cli","import_jsx_runtime","import_cli"]}
1
+ {"version":3,"sources":["../src/index.tsx","../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx"],"sourcesContent":["export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n","import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <>\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.stop && (\n <button\n type=\"button\"\n className=\"cli-panel-svc-stop\"\n title={row.stop.title}\n onClick={() => controller.killProcess(row.stop!.pid)}\n >\n {row.stop.label}\n </button>\n )}\n </>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n"],"mappings":"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","names":["import_react","import_cli","import_react","import_react","import_jsx_runtime","import_react","import_cli","import_jsx_runtime","React","CliPanel","controller","import_react","import_cli","import_jsx_runtime","import_cli"]}
package/dist/index.mjs CHANGED
@@ -162,7 +162,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
162
162
  const config = useCliConfig();
163
163
  const options = mergeCliOptions(props.options, config.options);
164
164
  const { modules, services } = resolveCliHostConfig2(props, config);
165
- const [controller] = useState2(
165
+ const [controller2] = useState2(
166
166
  () => new CliPanelController({
167
167
  config: options,
168
168
  controlled: {
@@ -176,11 +176,11 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
176
176
  }
177
177
  })
178
178
  );
179
- const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);
179
+ const s = useSyncExternalStore(controller2.subscribe, controller2.getSnapshot, controller2.getSnapshot);
180
180
  const brand = panelBranding(options);
181
181
  const [rootElement, setRootElement] = useState2(null);
182
182
  useLayoutEffect(() => {
183
- controller.setCallbacks({
183
+ controller2.setCallbacks({
184
184
  onCollapsedChange: props.onCollapsedChange,
185
185
  onHiddenChange: props.onHiddenChange,
186
186
  onMaximizedChange: props.onMaximizedChange,
@@ -194,7 +194,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
194
194
  onPaneSplit: props.onPaneSplit,
195
195
  onPaneClosed: props.onPaneClosed
196
196
  });
197
- controller.setControlled({
197
+ controller2.setControlled({
198
198
  collapsed: props.collapsed,
199
199
  hidden: props.hidden,
200
200
  maximized: props.maximized,
@@ -203,11 +203,11 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
203
203
  height: props.height,
204
204
  width: props.width
205
205
  });
206
- controller.setOptions(options);
206
+ controller2.setOptions(options);
207
207
  });
208
- useEffect3(() => controller.setRootElement(rootElement), [controller, rootElement]);
209
- useEffect3(() => () => controller.destroy(), [controller]);
210
- React3.useImperativeHandle(ref, () => controller, [controller]);
208
+ useEffect3(() => controller2.setRootElement(rootElement), [controller2, rootElement]);
209
+ useEffect3(() => () => controller2.destroy(), [controller2]);
210
+ React3.useImperativeHandle(ref, () => controller2, [controller2]);
211
211
  if (!s.visible) return null;
212
212
  return /* @__PURE__ */ jsxs(Fragment2, { children: [
213
213
  s.hidden && /* @__PURE__ */ jsxs(
@@ -218,7 +218,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
218
218
  "data-hide-align": s.hideAlignment,
219
219
  style: asStyle(s.themeStyles),
220
220
  title: PANEL_LABELS.showCli,
221
- onClick: () => controller.unhide(),
221
+ onClick: () => controller2.unhide(),
222
222
  children: [
223
223
  brand.iconUrl ? /* @__PURE__ */ jsx3("img", { src: brand.iconUrl, alt: "", className: "cli-panel-hide-tab-icon cli-panel-brand-icon" }) : /* @__PURE__ */ jsx3(Icon, { icon: HIDE_TAB_TERMINAL_ICON, className: "cli-panel-hide-tab-icon" }),
224
224
  /* @__PURE__ */ jsx3("span", { className: "cli-panel-hide-tab-label", children: brand.title }),
@@ -237,19 +237,19 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
237
237
  "data-closable": String(s.closable),
238
238
  "data-hideable": String(s.hideable),
239
239
  children: [
240
- /* @__PURE__ */ jsx3(PanelHeader, { controller, s, brand }),
240
+ /* @__PURE__ */ jsx3(PanelHeader, { controller: controller2, s, brand }),
241
241
  s.initialized && /* @__PURE__ */ jsxs("div", { className: "cli-panel-content", style: s.collapsed ? { display: "none" } : void 0, children: [
242
242
  /* @__PURE__ */ jsxs("div", { className: "cli-panel-tabs", children: [
243
243
  /* @__PURE__ */ jsx3("ul", { className: "cli-panel-tab-list", children: s.tabs.map((tab) => /* @__PURE__ */ jsx3(
244
244
  "li",
245
245
  {
246
246
  className: panelTabClass(s, tab),
247
- onClick: () => controller.selectTab(tab.id),
248
- onDoubleClick: () => controller.startRename(tab.id),
247
+ onClick: () => controller2.selectTab(tab.id),
248
+ onDoubleClick: () => controller2.startRename(tab.id),
249
249
  onContextMenu: (e) => {
250
250
  e.preventDefault();
251
251
  e.stopPropagation();
252
- controller.openContextMenu(tab.id, e.clientX, e.clientY);
252
+ controller2.openContextMenu(tab.id, e.clientX, e.clientY);
253
253
  },
254
254
  children: tab.isEditing ? /* @__PURE__ */ jsx3(
255
255
  "input",
@@ -258,8 +258,8 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
258
258
  type: "text",
259
259
  defaultValue: tab.title,
260
260
  ref: focusAndSelect,
261
- onKeyDown: (e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value),
262
- onBlur: (e) => controller.commitRename(tab.id, e.target.value),
261
+ onKeyDown: (e) => handleRenameKey(controller2, tab.id, e.key, e.currentTarget.value),
262
+ onBlur: (e) => controller2.commitRename(tab.id, e.target.value),
263
263
  onClick: (e) => e.stopPropagation(),
264
264
  onDoubleClick: (e) => e.stopPropagation()
265
265
  }
@@ -273,7 +273,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
273
273
  title: PANEL_LABELS.closeTab,
274
274
  onClick: (e) => {
275
275
  e.stopPropagation();
276
- controller.closeTab(tab.id);
276
+ controller2.closeTab(tab.id);
277
277
  },
278
278
  children: CLOSE_GLYPH
279
279
  }
@@ -282,7 +282,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
282
282
  },
283
283
  tab.id
284
284
  )) }),
285
- /* @__PURE__ */ jsx3("button", { className: "cli-panel-add-tab", title: PANEL_LABELS.newTerminal, onClick: () => controller.addTab(), children: "+" })
285
+ /* @__PURE__ */ jsx3("button", { className: "cli-panel-add-tab", title: PANEL_LABELS.newTerminal, onClick: () => controller2.addTab(), children: "+" })
286
286
  ] }),
287
287
  /* @__PURE__ */ jsx3("div", { className: "cli-panel-instances", children: s.tabs.map((tab) => /* @__PURE__ */ jsx3("div", { className: "cli-panel-instance", style: { display: tab.id === s.activeTabId ? void 0 : "none" }, children: /* @__PURE__ */ jsx3("div", { className: panesContainerClass(s), children: tab.panes.map((pane, i) => /* @__PURE__ */ jsxs(React3.Fragment, { children: [
288
288
  i > 0 && /* @__PURE__ */ jsx3(
@@ -291,7 +291,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
291
291
  className: "cli-panel-pane-divider",
292
292
  onPointerDown: (e) => {
293
293
  e.preventDefault();
294
- controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));
294
+ controller2.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));
295
295
  },
296
296
  children: /* @__PURE__ */ jsx3("div", { className: "cli-panel-pane-divider-grip" })
297
297
  }
@@ -301,7 +301,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
301
301
  {
302
302
  className: paneClass(s, tab.id, pane.id),
303
303
  style: paneStyle(pane.widthPercent),
304
- onClick: () => controller.activatePane(tab.id, pane.id),
304
+ onClick: () => controller2.activatePane(tab.id, pane.id),
305
305
  children: [
306
306
  tab.panes.length > 1 && /* @__PURE__ */ jsx3(
307
307
  "button",
@@ -310,7 +310,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
310
310
  title: PANEL_LABELS.closePane,
311
311
  onClick: (e) => {
312
312
  e.stopPropagation();
313
- controller.closePane(pane.id);
313
+ controller2.closePane(pane.id);
314
314
  },
315
315
  children: CLOSE_GLYPH
316
316
  }
@@ -322,7 +322,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
322
322
  modules,
323
323
  services,
324
324
  snapshot: pane.snapshot,
325
- onReady: (engine) => controller.registerEngine(tab.id, pane.id, engine)
325
+ onReady: (engine) => controller2.registerEngine(tab.id, pane.id, engine)
326
326
  }
327
327
  ) })
328
328
  ]
@@ -340,7 +340,7 @@ var CliPanel = React3.forwardRef(function CliPanel2(props, ref) {
340
340
  {
341
341
  className: joinClasses("cli-panel-context-menu-item", item.destructive && "destructive"),
342
342
  disabled: item.disabled,
343
- onClick: () => runContextMenuAction(controller, item.action),
343
+ onClick: () => runContextMenuAction(controller2, item.action),
344
344
  children: item.label
345
345
  }
346
346
  )
@@ -362,13 +362,25 @@ function StatusDropdown({ s }) {
362
362
  dropdown.kind === "servers" ? /* @__PURE__ */ jsxs("div", { className: "cli-panel-srv-meta", children: [
363
363
  /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-status", children: row.status }),
364
364
  row.meta.map((m) => /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-desc", children: m }, m))
365
- ] }) : /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-status", children: row.status })
365
+ ] }) : /* @__PURE__ */ jsxs(Fragment2, { children: [
366
+ /* @__PURE__ */ jsx3("span", { className: "cli-panel-svc-status", children: row.status }),
367
+ row.stop && /* @__PURE__ */ jsx3(
368
+ "button",
369
+ {
370
+ type: "button",
371
+ className: "cli-panel-svc-stop",
372
+ title: row.stop.title,
373
+ onClick: () => controller.killProcess(row.stop.pid),
374
+ children: row.stop.label
375
+ }
376
+ )
377
+ ] })
366
378
  ] }, row.key)) }),
367
379
  dropdown.rows.length === 0 && /* @__PURE__ */ jsx3("div", { className: "cli-panel-services-dropdown-empty", children: dropdown.emptyText })
368
380
  ] });
369
381
  }
370
382
  function PanelHeader({
371
- controller,
383
+ controller: controller2,
372
384
  s,
373
385
  brand
374
386
  }) {
@@ -376,8 +388,8 @@ function PanelHeader({
376
388
  const openDropdown = (e, dropdown) => {
377
389
  if (!dropdown) return;
378
390
  e.stopPropagation();
379
- if (dropdown === "services") controller.toggleServicesDropdown(e.currentTarget);
380
- else controller.toggleServersDropdown(e.currentTarget);
391
+ if (dropdown === "services") controller2.toggleServicesDropdown(e.currentTarget);
392
+ else controller2.toggleServersDropdown(e.currentTarget);
381
393
  };
382
394
  return /* @__PURE__ */ jsxs("div", { className: "cli-panel-header", children: [
383
395
  /* @__PURE__ */ jsx3(
@@ -387,7 +399,7 @@ function PanelHeader({
387
399
  onPointerDown: (e) => {
388
400
  if (!s.resizable) return;
389
401
  e.preventDefault();
390
- controller.startPanelResize(e.clientX, e.clientY);
402
+ controller2.startPanelResize(e.clientX, e.clientY);
391
403
  },
392
404
  children: /* @__PURE__ */ jsx3("div", { className: "cli-panel-resize-grip" })
393
405
  }
@@ -426,25 +438,25 @@ function PanelHeader({
426
438
  )) }),
427
439
  /* @__PURE__ */ jsxs("div", { className: "cli-panel-action-buttons", children: [
428
440
  /* @__PURE__ */ jsxs("div", { className: "cli-panel-btn-position-wrapper", onClick: (e) => e.stopPropagation(), children: [
429
- /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-position", title: PANEL_LABELS.movePanel, onClick: () => controller.togglePositionDropdown(), children: /* @__PURE__ */ jsx3(Icon, { icon: positionIcon(s.position) }) }),
430
- s.positionDropdownOpen && /* @__PURE__ */ jsx3("div", { className: "cli-panel-position-dropdown", children: positionOptions(s).map((opt) => /* @__PURE__ */ jsxs("button", { className: opt.className, onClick: () => controller.setPosition(opt.position), children: [
441
+ /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-position", title: PANEL_LABELS.movePanel, onClick: () => controller2.togglePositionDropdown(), children: /* @__PURE__ */ jsx3(Icon, { icon: positionIcon(s.position) }) }),
442
+ s.positionDropdownOpen && /* @__PURE__ */ jsx3("div", { className: "cli-panel-position-dropdown", children: positionOptions(s).map((opt) => /* @__PURE__ */ jsxs("button", { className: opt.className, onClick: () => controller2.setPosition(opt.position), children: [
431
443
  /* @__PURE__ */ jsx3(Icon, { icon: positionIcon(opt.position, 16) }),
432
444
  opt.label
433
445
  ] }, opt.position)) })
434
446
  ] }),
435
- s.hideable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-hide", title: PANEL_LABELS.hide, onClick: () => controller.hide(), children: /* @__PURE__ */ jsx3(Icon, { icon: HIDE_ICON }) }),
447
+ s.hideable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-hide", title: PANEL_LABELS.hide, onClick: () => controller2.hide(), children: /* @__PURE__ */ jsx3(Icon, { icon: HIDE_ICON }) }),
436
448
  /* @__PURE__ */ jsx3(
437
449
  "button",
438
450
  {
439
451
  className: "cli-panel-btn",
440
452
  title: s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize,
441
453
  disabled: s.collapsed,
442
- onClick: () => controller.toggleMaximize(),
454
+ onClick: () => controller2.toggleMaximize(),
443
455
  children: /* @__PURE__ */ jsx3(Icon, { icon: s.maximized ? RESTORE_ICON : MAXIMIZE_ICON })
444
456
  }
445
457
  ),
446
- /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn", title: s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse, onClick: () => controller.toggle(), children: /* @__PURE__ */ jsx3(Icon, { icon: collapseChevronIcon(s.position, s.collapsed) }) }),
447
- s.closable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-close", title: PANEL_LABELS.close, onClick: () => controller.close(), children: /* @__PURE__ */ jsx3(Icon, { icon: CLOSE_ICON }) })
458
+ /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn", title: s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse, onClick: () => controller2.toggle(), children: /* @__PURE__ */ jsx3(Icon, { icon: collapseChevronIcon(s.position, s.collapsed) }) }),
459
+ s.closable && /* @__PURE__ */ jsx3("button", { className: "cli-panel-btn cli-panel-btn-close", title: PANEL_LABELS.close, onClick: () => controller2.close(), children: /* @__PURE__ */ jsx3(Icon, { icon: CLOSE_ICON }) })
448
460
  ] })
449
461
  ] }),
450
462
  /* @__PURE__ */ jsx3("div", { className: glowLineClass(s) })
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx","../src/index.tsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n","export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n"],"mappings":"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","names":["useRef","useEffect","createContext","useContext","jsx","useRef","useEffect","React","useEffect","useState","resolveCliHostConfig","Fragment","jsx","React","CliPanel","resolveCliHostConfig","useState","useEffect","useRef","resolveCliHostConfig","jsx","jsxs","useRef","resolveCliHostConfig","CliEngine"]}
1
+ {"version":3,"sources":["../src/Cli.tsx","../src/CliContext.tsx","../src/CliConfigContext.tsx","../src/useCliEngine.ts","../src/CliPanel.tsx","../src/CliProvider.tsx","../src/index.tsx"],"sourcesContent":["import React, { useRef, useEffect } from 'react';\nimport { ICliModule, CliEngineSnapshot } from '@qodalis/cli-core';\nimport { CliEngine, CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { useCli } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n snapshot?: CliEngineSnapshot;\n onReady?: (engine: CliEngine) => void;\n style?: React.CSSProperties;\n className?: string;\n}\n\nexport function Cli({\n modules,\n options,\n services,\n snapshot,\n onReady,\n style,\n className,\n}: CliProps): React.JSX.Element {\n const ctx = useCli();\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const hasProvider = !!ctx.engine;\n\n // Always call the hook (React rules), but disable it when inside a CliProvider.\n const standaloneEngine = useCliEngine(containerRef, {\n ...resolveCliHostConfig({ modules, options, services }, config),\n snapshot,\n disabled: hasProvider,\n });\n\n const engine = ctx.engine ?? standaloneEngine;\n\n useEffect(() => {\n if (engine && onReady) {\n onReady(engine);\n }\n }, [engine, onReady]);\n\n // If inside a CliProvider, render nothing (provider has the terminal div).\n if (hasProvider) {\n return <></>;\n }\n\n return (\n <div\n ref={containerRef}\n style={{ height: '100%', ...style }}\n className={className}\n />\n );\n}\n","import { createContext, useContext } from 'react';\nimport { CliEngine } from '@qodalis/cli';\n\nexport interface CliContextValue {\n engine: CliEngine | null;\n}\n\nexport const CliContext = createContext<CliContextValue>({ engine: null });\n\nexport function useCli(): CliContextValue {\n return useContext(CliContext);\n}\n","import React, { createContext, useContext } from 'react';\nimport { ICliModule, CliOptions } from '@qodalis/cli-core';\nimport { CliEngineOptions } from '@qodalis/cli';\n\nexport interface CliConfigValue {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n}\n\nconst CliConfigCtx = createContext<CliConfigValue>({});\n\nexport function useCliConfig(): CliConfigValue {\n return useContext(CliConfigCtx);\n}\n\nexport interface CliConfigProviderProps extends CliConfigValue {\n children: React.ReactNode;\n}\n\nexport function CliConfigProvider({\n modules,\n options,\n services,\n children,\n}: CliConfigProviderProps): React.JSX.Element {\n return (\n <CliConfigCtx.Provider value={{ modules, options, services }}>\n {children}\n </CliConfigCtx.Provider>\n );\n}\n","import { useRef, useEffect, useState, RefObject } from 'react';\nimport { CliEngine, CreateCliEngineConfig, createCliEngine } from '@qodalis/cli';\n\nexport interface UseCliEngineConfig extends Omit<CreateCliEngineConfig, 'framework'> {\n disabled?: boolean;\n}\n\nexport function useCliEngine(\n containerRef: RefObject<HTMLElement | null>,\n config?: UseCliEngineConfig,\n): CliEngine | null {\n const [engine, setEngine] = useState<CliEngine | null>(null);\n const engineRef = useRef<CliEngine | null>(null);\n const initTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (config?.disabled || !containerRef.current) return;\n\n // Defer initialization slightly so that StrictMode's immediate\n // unmount (mount → unmount → remount) cancels the first attempt\n // via the cleanup function, while non-StrictMode proceeds normally.\n const container = containerRef.current;\n initTimerRef.current = setTimeout(() => {\n initTimerRef.current = null;\n if (!container) return;\n\n const e = createCliEngine(container, { ...config, framework: 'React' });\n\n engineRef.current = e;\n e.start().then(() => setEngine(e));\n }, 0);\n\n return () => {\n if (initTimerRef.current !== null) {\n clearTimeout(initTimerRef.current);\n initTimerRef.current = null;\n return;\n }\n if (engineRef.current) {\n engineRef.current.destroy();\n engineRef.current = null;\n setEngine(null);\n }\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return engine;\n}\n","import React, { useEffect, useLayoutEffect, useState, useSyncExternalStore } from 'react';\nimport { ICliModule, CliPanelConfig, CliPanelPosition, ICliPanelRef } from '@qodalis/cli-core';\nimport {\n CliEngine,\n CliEngineOptions,\n CliPanelController,\n CliPanelSnapshot,\n CLOSE_GLYPH,\n CLOSE_ICON,\n HIDE_ICON,\n HIDE_TAB_TERMINAL_ICON,\n MAXIMIZE_ICON,\n PANEL_LABELS,\n panelBranding,\n RESTORE_ICON,\n SvgIcon,\n TERMINAL_ICON,\n collapseChevronIcon,\n contextMenuItems,\n contextMenuStyle,\n glowLineClass,\n handleRenameKey,\n hideTabChevronIcon,\n joinClasses,\n mergeCliOptions,\n openStatusDropdown,\n paneClass,\n paneStyle,\n panelTabClass,\n panelTabDotClass,\n panelWrapperClass,\n panelWrapperStyle,\n panesContainerClass,\n panesContainerWidth,\n positionIcon,\n positionOptions,\n resolveCliHostConfig,\n runContextMenuAction,\n statusIndicators,\n svgAttrs,\n} from '@qodalis/cli';\nimport { Cli } from './Cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\n\nexport interface CliPanelOptions extends CliEngineOptions, CliPanelConfig {}\n\nexport interface CliPanelProps {\n options?: CliPanelOptions;\n modules?: ICliModule[];\n services?: Record<string, any>;\n onClose?: () => void;\n style?: React.CSSProperties;\n className?: string;\n\n // Bindable properties (controlled mode)\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n hidden?: boolean;\n onHiddenChange?: (hidden: boolean) => void;\n maximized?: boolean;\n onMaximizedChange?: (maximized: boolean) => void;\n activeTabId?: number;\n onActiveTabIdChange?: (tabId: number) => void;\n position?: CliPanelPosition;\n onPositionChange?: (position: CliPanelPosition) => void;\n height?: number;\n onHeightChange?: (height: number) => void;\n width?: number;\n onWidthChange?: (width: number) => void;\n\n // Structural events\n onTabAdded?: (event: { tabId: number }) => void;\n onTabClosed?: (event: { tabId: number }) => void;\n onPaneSplit?: (event: { paneId: number; tabId: number }) => void;\n onPaneClosed?: (event: { paneId: number }) => void;\n}\n\n/* ─── Icons ──────────────────────────────────────────────── */\n\n/** SVG attribute names in React's camelCase spelling. */\nfunction reactSvgProps(attrs: Record<string, string>): Record<string, string> {\n const props: Record<string, string> = {};\n for (const [key, value] of Object.entries(attrs)) {\n props[key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return props;\n}\n\nfunction Icon({ icon, className }: { icon: SvgIcon; className?: string }) {\n return (\n <svg className={className} {...reactSvgProps(svgAttrs(icon))}>\n {icon.shapes.map((shape, i) => React.createElement(shape.tag, { key: i, ...reactSvgProps(shape.attrs) }))}\n </svg>\n );\n}\n\n/** Focus a freshly mounted rename input and select its text. */\nconst focusAndSelect = (input: HTMLInputElement | null) => {\n if (input && document.activeElement !== input) {\n input.focus();\n input.select();\n }\n};\n\n/** React wants camelCase style keys (`colorScheme`); custom properties keep theirs. */\nconst asStyle = (style: Record<string, string>): React.CSSProperties => {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(style)) {\n out[key.startsWith('--') ? key : key.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())] = value;\n }\n return out as React.CSSProperties;\n};\n\n/* ─── Component ──────────────────────────────────────────── */\n\nexport const CliPanel = React.forwardRef<ICliPanelRef<CliEngine>, CliPanelProps>(function CliPanel(props, ref) {\n const config = useCliConfig();\n const options = mergeCliOptions<CliPanelOptions>(props.options, config.options);\n const { modules, services } = resolveCliHostConfig(props, config);\n\n const [controller] = useState(\n () =>\n new CliPanelController({\n config: options,\n controlled: {\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n },\n }),\n );\n const s = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot);\n const brand = panelBranding(options);\n const [rootElement, setRootElement] = useState<HTMLDivElement | null>(null);\n\n // Keep the controller in sync with props before the browser paints.\n useLayoutEffect(() => {\n controller.setCallbacks({\n onCollapsedChange: props.onCollapsedChange,\n onHiddenChange: props.onHiddenChange,\n onMaximizedChange: props.onMaximizedChange,\n onActiveTabIdChange: props.onActiveTabIdChange,\n onPositionChange: props.onPositionChange,\n onHeightChange: props.onHeightChange,\n onWidthChange: props.onWidthChange,\n onClose: props.onClose,\n onTabAdded: props.onTabAdded,\n onTabClosed: props.onTabClosed,\n onPaneSplit: props.onPaneSplit,\n onPaneClosed: props.onPaneClosed,\n });\n controller.setControlled({\n collapsed: props.collapsed,\n hidden: props.hidden,\n maximized: props.maximized,\n activeTabId: props.activeTabId,\n position: props.position,\n height: props.height,\n width: props.width,\n });\n controller.setOptions(options);\n });\n\n useEffect(() => controller.setRootElement(rootElement), [controller, rootElement]);\n useEffect(() => () => controller.destroy(), [controller]);\n React.useImperativeHandle(ref, () => controller, [controller]);\n\n if (!s.visible) return null;\n\n return (\n <>\n {s.hidden && (\n <button\n className=\"cli-panel-hide-tab\"\n data-position={s.position}\n data-hide-align={s.hideAlignment}\n style={asStyle(s.themeStyles)}\n title={PANEL_LABELS.showCli}\n onClick={() => controller.unhide()}\n >\n {brand.iconUrl ? (\n <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-hide-tab-icon cli-panel-brand-icon\" />\n ) : (\n <Icon icon={HIDE_TAB_TERMINAL_ICON} className=\"cli-panel-hide-tab-icon\" />\n )}\n <span className=\"cli-panel-hide-tab-label\">{brand.title}</span>\n <Icon icon={hideTabChevronIcon(s.position)} className=\"cli-panel-hide-tab-arrow\" />\n </button>\n )}\n <div\n ref={setRootElement}\n className={panelWrapperClass(s, props.className)}\n style={{ ...asStyle(panelWrapperStyle(s)), ...props.style }}\n data-position={s.position}\n data-resizable={String(s.resizable)}\n data-closable={String(s.closable)}\n data-hideable={String(s.hideable)}\n >\n <PanelHeader controller={controller} s={s} brand={brand} />\n {s.initialized && (\n <div className=\"cli-panel-content\" style={s.collapsed ? { display: 'none' } : undefined}>\n <div className=\"cli-panel-tabs\">\n <ul className=\"cli-panel-tab-list\">\n {s.tabs.map((tab) => (\n <li\n key={tab.id}\n className={panelTabClass(s, tab)}\n onClick={() => controller.selectTab(tab.id)}\n onDoubleClick={() => controller.startRename(tab.id)}\n onContextMenu={(e) => {\n e.preventDefault();\n e.stopPropagation();\n controller.openContextMenu(tab.id, e.clientX, e.clientY);\n }}\n >\n {tab.isEditing ? (\n <input\n className=\"cli-panel-tab-rename-input\"\n type=\"text\"\n defaultValue={tab.title}\n ref={focusAndSelect}\n onKeyDown={(e) => handleRenameKey(controller, tab.id, e.key, e.currentTarget.value)}\n onBlur={(e) => controller.commitRename(tab.id, e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n />\n ) : (\n <>\n <span className={panelTabDotClass(s, tab)} />\n <span className=\"cli-panel-tab-title\">{tab.title}</span>\n <button\n className=\"cli-panel-tab-close-btn\"\n title={PANEL_LABELS.closeTab}\n onClick={(e) => {\n e.stopPropagation();\n controller.closeTab(tab.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n </>\n )}\n </li>\n ))}\n </ul>\n <button className=\"cli-panel-add-tab\" title={PANEL_LABELS.newTerminal} onClick={() => controller.addTab()}>\n +\n </button>\n </div>\n\n <div className=\"cli-panel-instances\">\n {s.tabs.map((tab) => (\n <div key={tab.id} className=\"cli-panel-instance\" style={{ display: tab.id === s.activeTabId ? undefined : 'none' }}>\n <div className={panesContainerClass(s)}>\n {tab.panes.map((pane, i) => (\n <React.Fragment key={pane.id}>\n {i > 0 && (\n <div\n className=\"cli-panel-pane-divider\"\n onPointerDown={(e) => {\n e.preventDefault();\n controller.startPaneResize(tab.id, i - 1, e.clientX, panesContainerWidth(e.target));\n }}\n >\n <div className=\"cli-panel-pane-divider-grip\" />\n </div>\n )}\n <div\n className={paneClass(s, tab.id, pane.id)}\n style={paneStyle(pane.widthPercent)}\n onClick={() => controller.activatePane(tab.id, pane.id)}\n >\n {tab.panes.length > 1 && (\n <button\n className=\"cli-panel-pane-close-btn\"\n title={PANEL_LABELS.closePane}\n onClick={(e) => {\n e.stopPropagation();\n controller.closePane(pane.id);\n }}\n >\n {CLOSE_GLYPH}\n </button>\n )}\n <CliContext.Provider value={{ engine: null }}>\n <Cli\n options={options}\n modules={modules}\n services={services}\n snapshot={pane.snapshot}\n onReady={(engine) => controller.registerEngine(tab.id, pane.id, engine)}\n />\n </CliContext.Provider>\n </div>\n </React.Fragment>\n ))}\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n\n {s.contextMenu.visible && (\n <div className=\"cli-panel-context-menu\" style={asStyle(contextMenuStyle(s))} onClick={(e) => e.stopPropagation()}>\n {contextMenuItems(s).map((item) => (\n <React.Fragment key={item.action}>\n {item.separatorBefore && <div className=\"cli-panel-context-menu-separator\" />}\n <button\n className={joinClasses('cli-panel-context-menu-item', item.destructive && 'destructive')}\n disabled={item.disabled}\n onClick={() => runContextMenuAction(controller, item.action)}\n >\n {item.label}\n </button>\n </React.Fragment>\n ))}\n </div>\n )}\n\n <StatusDropdown s={s} />\n </>\n );\n});\n\n/* ─── Services / servers dropdown ────────────────────────── */\n\nfunction StatusDropdown({ s }: { s: CliPanelSnapshot }) {\n const dropdown = openStatusDropdown(s);\n if (!dropdown) return null;\n return (\n <div className=\"cli-panel-services-dropdown\" style={asStyle(dropdown.style)} onClick={(e) => e.stopPropagation()}>\n <div className=\"cli-panel-services-dropdown-header\">{dropdown.header}</div>\n <div className=\"cli-panel-services-dropdown-list\">\n {dropdown.rows.map((row) => (\n <div key={row.key} className=\"cli-panel-services-dropdown-item\">\n <span className={row.dotClass} />\n <div className=\"cli-panel-svc-info\">\n <span className=\"cli-panel-svc-name\">{row.name}</span>\n {row.description && <span className=\"cli-panel-svc-desc\">{row.description}</span>}\n </div>\n {dropdown.kind === 'servers' ? (\n <div className=\"cli-panel-srv-meta\">\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.meta.map((m) => (\n <span key={m} className=\"cli-panel-svc-desc\">\n {m}\n </span>\n ))}\n </div>\n ) : (\n <>\n <span className=\"cli-panel-svc-status\">{row.status}</span>\n {row.stop && (\n <button\n type=\"button\"\n className=\"cli-panel-svc-stop\"\n title={row.stop.title}\n onClick={() => controller.killProcess(row.stop!.pid)}\n >\n {row.stop.label}\n </button>\n )}\n </>\n )}\n </div>\n ))}\n </div>\n {dropdown.rows.length === 0 && <div className=\"cli-panel-services-dropdown-empty\">{dropdown.emptyText}</div>}\n </div>\n );\n}\n\n/* ─── Header ─────────────────────────────────────────────── */\n\nfunction PanelHeader({\n controller,\n s,\n brand,\n}: {\n controller: CliPanelController;\n s: CliPanelSnapshot;\n brand: ReturnType<typeof panelBranding>;\n}) {\n const indicators = statusIndicators(s);\n const openDropdown = (e: React.MouseEvent, dropdown?: 'services' | 'servers') => {\n if (!dropdown) return;\n e.stopPropagation();\n if (dropdown === 'services') controller.toggleServicesDropdown(e.currentTarget);\n else controller.toggleServersDropdown(e.currentTarget);\n };\n\n return (\n <div className=\"cli-panel-header\">\n <div\n className=\"cli-panel-resize-bar\"\n onPointerDown={(e) => {\n if (!s.resizable) return;\n e.preventDefault();\n controller.startPanelResize(e.clientX, e.clientY);\n }}\n >\n <div className=\"cli-panel-resize-grip\" />\n </div>\n <div className=\"cli-panel-header-content\">\n <p className=\"cli-panel-title\">\n <span className=\"cli-panel-title-icon\">\n {brand.iconUrl ? <img src={brand.iconUrl} alt=\"\" className=\"cli-panel-brand-icon\" /> : <Icon icon={TERMINAL_ICON} />}\n </span>\n {brand.title}\n </p>\n\n {s.showStatusIndicators && (\n <div className=\"cli-panel-status-indicators\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-item', item.itemClass)}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n <span className=\"cli-panel-status-label\">{item.label}</span>\n </span>\n ))}\n </div>\n )}\n\n {/* Compact indicators for left/right positions (CSS controls visibility). */}\n <div className=\"cli-panel-status-indicators-compact\">\n {indicators.map((item) => (\n <span\n key={item.key}\n className={joinClasses('cli-panel-status-compact-item', item.compactClass)}\n title={item.title}\n onClick={item.dropdown ? (e) => openDropdown(e, item.dropdown) : undefined}\n >\n {item.compactDotClass && <span className={item.compactDotClass} />}\n {item.dotClass && <span className={`cli-panel-status-dot ${item.dotClass}`} />}\n {item.icon && <span className={joinClasses('cli-panel-status-icon', item.iconClass)}>{item.icon}</span>}\n </span>\n ))}\n </div>\n\n <div className=\"cli-panel-action-buttons\">\n <div className=\"cli-panel-btn-position-wrapper\" onClick={(e) => e.stopPropagation()}>\n <button className=\"cli-panel-btn cli-panel-btn-position\" title={PANEL_LABELS.movePanel} onClick={() => controller.togglePositionDropdown()}>\n <Icon icon={positionIcon(s.position)} />\n </button>\n {s.positionDropdownOpen && (\n <div className=\"cli-panel-position-dropdown\">\n {positionOptions(s).map((opt) => (\n <button key={opt.position} className={opt.className} onClick={() => controller.setPosition(opt.position)}>\n <Icon icon={positionIcon(opt.position, 16)} />\n {opt.label}\n </button>\n ))}\n </div>\n )}\n </div>\n {s.hideable && (\n <button className=\"cli-panel-btn cli-panel-btn-hide\" title={PANEL_LABELS.hide} onClick={() => controller.hide()}>\n <Icon icon={HIDE_ICON} />\n </button>\n )}\n <button\n className=\"cli-panel-btn\"\n title={s.maximized ? PANEL_LABELS.restore : PANEL_LABELS.maximize}\n disabled={s.collapsed}\n onClick={() => controller.toggleMaximize()}\n >\n <Icon icon={s.maximized ? RESTORE_ICON : MAXIMIZE_ICON} />\n </button>\n <button className=\"cli-panel-btn\" title={s.collapsed ? PANEL_LABELS.expand : PANEL_LABELS.collapse} onClick={() => controller.toggle()}>\n <Icon icon={collapseChevronIcon(s.position, s.collapsed)} />\n </button>\n {s.closable && (\n <button className=\"cli-panel-btn cli-panel-btn-close\" title={PANEL_LABELS.close} onClick={() => controller.close()}>\n <Icon icon={CLOSE_ICON} />\n </button>\n )}\n </div>\n </div>\n <div className={glowLineClass(s)} />\n </div>\n );\n}\n","import React, { useRef } from 'react';\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliEngineOptions, resolveCliHostConfig } from '@qodalis/cli';\nimport { CliContext } from './CliContext';\nimport { useCliConfig } from './CliConfigContext';\nimport { useCliEngine } from './useCliEngine';\n\nexport interface CliProviderProps {\n modules?: ICliModule[];\n options?: CliEngineOptions;\n services?: Record<string, any>;\n children: React.ReactNode;\n style?: React.CSSProperties;\n}\n\nexport function CliProvider({\n modules,\n options,\n services,\n children,\n style,\n}: CliProviderProps): React.JSX.Element {\n const config = useCliConfig();\n const containerRef = useRef<HTMLDivElement>(null);\n const engine = useCliEngine(containerRef, resolveCliHostConfig({ modules, options, services }, config));\n\n return (\n <CliContext.Provider value={{ engine }}>\n <div ref={containerRef} style={{ height: '100%', ...style }} />\n {children}\n </CliContext.Provider>\n );\n}\n","export { Cli } from './Cli';\nexport type { CliProps } from './Cli';\nexport { CliPanel } from './CliPanel';\nexport type { CliPanelProps, CliPanelOptions } from './CliPanel';\nexport { CliProvider } from './CliProvider';\nexport type { CliProviderProps } from './CliProvider';\nexport { useCli, CliContext } from './CliContext';\nexport type { CliContextValue } from './CliContext';\nexport { CliConfigProvider, useCliConfig } from './CliConfigContext';\nexport type { CliConfigValue, CliConfigProviderProps } from './CliConfigContext';\nexport { useCliEngine } from './useCliEngine';\nexport type { UseCliEngineConfig } from './useCliEngine';\n\n// Re-export commonly used types from @qodalis/cli for convenience\nexport type { CliEngineOptions } from '@qodalis/cli';\nexport { CliEngine } from '@qodalis/cli';\n"],"mappings":"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","names":["useRef","useEffect","createContext","useContext","jsx","useRef","useEffect","React","useEffect","useState","resolveCliHostConfig","Fragment","jsx","React","CliPanel","resolveCliHostConfig","controller","useState","useEffect","useRef","resolveCliHostConfig","jsx","jsxs","useRef","resolveCliHostConfig","CliEngine"]}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/react-cli",
3
- "version": "2.3.0",
3
+ "version": "2.4.1",
4
4
  "description": "React wrapper for the @qodalis CLI terminal engine.",
5
5
  "author": "Nicolae Lupei, Qodalis Solutions",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/react-cli",
3
- "version": "2.3.0",
3
+ "version": "2.4.1",
4
4
  "description": "React wrapper for the @qodalis CLI terminal engine.",
5
5
  "author": "Nicolae Lupei, Qodalis Solutions",
6
6
  "license": "MIT",
@@ -36,8 +36,8 @@
36
36
  "react-dom": "^18.0.0 || ^19.0.0"
37
37
  },
38
38
  "dependencies": {
39
- "@qodalis/cli": "2.3.0",
40
- "@qodalis/cli-core": "2.3.0"
39
+ "@qodalis/cli": "2.4.1",
40
+ "@qodalis/cli-core": "2.4.1"
41
41
  },
42
42
  "devDependencies": {
43
43
  "tsup": "^9.0.0",