ccstatusline 2.1.5 → 2.1.6

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/README.md CHANGED
@@ -46,7 +46,7 @@
46
46
 
47
47
  ## 🆕 Recent Updates
48
48
 
49
- ### v2.1.0 - v2.1.4 - Usage widgets, links, new git insertions / deletions widgets, and reliability fixes
49
+ ### v2.1.0 - v2.1.6 - Usage widgets, links, new git insertions / deletions widgets, and reliability fixes
50
50
 
51
51
  - **🧩 New Usage widgets (v2.1.0)** - Added **Session Usage**, **Weekly Usage**, **Reset Timer**, and **Context Bar** widgets.
52
52
  - **📊 More accurate counts (v2.1.0)** - Usage/context widgets now use new statusline JSON metrics when available for more accurate token and context counts.
@@ -54,6 +54,7 @@
54
54
  - **🔗 New Link widget (v2.1.3)** - Added a new **Link** widget with clickable OSC8 rendering, preview parity, and raw mode support.
55
55
  - **➕ New Git Insertions widget (v2.1.4)** - Added a dedicated Git widget that shows only uncommitted insertions (e.g., `+42`).
56
56
  - **➖ New Git Deletions widget (v2.1.4)** - Added a dedicated Git widget that shows only uncommitted deletions (e.g., `-10`).
57
+ - **🧠 Context format fallback fix (v2.1.6)** - When `context_window_size` is missing, context widgets now infer 1M models from long-context labels such as `[1m]` and `1M context` in model identifiers.
57
58
 
58
59
  ### v2.0.26 - v2.0.29 - Performance, git internals, and workflow improvements
59
60
 
@@ -434,8 +435,8 @@ bun run example
434
435
  - **Tokens Cached** - Shows cached tokens used
435
436
  - **Tokens Total** - Shows total tokens used
436
437
  - **Context Length** - Shows current context length in tokens
437
- - **Context Percentage** - Shows percentage of context limit used (dynamic: 1M for model IDs with `[1m]` suffix, 200k otherwise)
438
- - **Context Percentage (usable)** - Shows percentage of usable context (dynamic: 800k for model IDs with `[1m]` suffix, 160k otherwise, accounting for auto-compact at 80%)
438
+ - **Context Percentage** - Shows percentage of context limit used (dynamic: 1M for model IDs with long-context labels like `[1m]` or `1M context`, 200k otherwise)
439
+ - **Context Percentage (usable)** - Shows percentage of usable context (dynamic: 800k for model IDs with long-context labels like `[1m]` or `1M context`, 160k otherwise, accounting for auto-compact at 80%)
439
440
  - **Context Bar** - Shows context usage as a progress bar with short/full display modes
440
441
  - **Terminal Width** - Shows detected terminal width (for debugging)
441
442
  - **Memory Usage** - Shows system memory usage (used/total, e.g., "Mem: 12.4G/16.0G")
@@ -51478,7 +51478,7 @@ import { execSync as execSync3 } from "child_process";
51478
51478
  import * as fs5 from "fs";
51479
51479
  import * as path4 from "path";
51480
51480
  var __dirname = "/Users/sirmalloc/Projects/Personal/ccstatusline/src/utils";
51481
- var PACKAGE_VERSION = "2.1.5";
51481
+ var PACKAGE_VERSION = "2.1.6";
51482
51482
  function getPackageVersion() {
51483
51483
  if (/^\d+\.\d+\.\d+/.test(PACKAGE_VERSION)) {
51484
51484
  return PACKAGE_VERSION;
@@ -53032,30 +53032,77 @@ function truncateStyledText(text, maxWidth, options = {}) {
53032
53032
  }
53033
53033
 
53034
53034
  // src/utils/model-context.ts
53035
+ var DEFAULT_CONTEXT_WINDOW_SIZE = 200000;
53036
+ var USABLE_CONTEXT_RATIO = 0.8;
53035
53037
  function toValidWindowSize(value) {
53036
53038
  if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
53037
53039
  return null;
53038
53040
  }
53039
53041
  return value;
53040
53042
  }
53041
- function getContextConfig(modelId, contextWindowSize) {
53043
+ function parseContextWindowSize(modelIdentifier) {
53044
+ const delimitedMatch = /(?:\(|\[)\s*(\d+(?:[,_]\d+)*(?:\.\d+)?)\s*([km])\s*(?:\)|\])/i.exec(modelIdentifier);
53045
+ if (delimitedMatch) {
53046
+ const delimitedValue = delimitedMatch[1];
53047
+ const delimitedUnit = delimitedMatch[2];
53048
+ if (!delimitedValue || !delimitedUnit) {
53049
+ return null;
53050
+ }
53051
+ const parsed2 = Number.parseFloat(delimitedValue.replace(/[,_]/g, ""));
53052
+ if (Number.isFinite(parsed2) && parsed2 > 0) {
53053
+ return Math.round(parsed2 * (delimitedUnit.toLowerCase() === "m" ? 1e6 : 1000));
53054
+ }
53055
+ }
53056
+ const contextMatch = /\b(\d+(?:[,_]\d+)*(?:\.\d+)?)\s*([km])(?:\s*(?:token\s*)?context)?\b/i.exec(modelIdentifier);
53057
+ if (!contextMatch) {
53058
+ return null;
53059
+ }
53060
+ const contextValue = contextMatch[1];
53061
+ const contextUnit = contextMatch[2];
53062
+ if (!contextValue || !contextUnit) {
53063
+ return null;
53064
+ }
53065
+ const parsed = Number.parseFloat(contextValue.replace(/[,_]/g, ""));
53066
+ if (!Number.isFinite(parsed) || parsed <= 0) {
53067
+ return null;
53068
+ }
53069
+ return Math.round(parsed * (contextUnit.toLowerCase() === "m" ? 1e6 : 1000));
53070
+ }
53071
+ function getModelContextIdentifier(model) {
53072
+ if (typeof model === "string") {
53073
+ const trimmed = model.trim();
53074
+ return trimmed.length > 0 ? trimmed : undefined;
53075
+ }
53076
+ if (!model) {
53077
+ return;
53078
+ }
53079
+ const id = model.id?.trim();
53080
+ const displayName = model.display_name?.trim();
53081
+ if (id && displayName) {
53082
+ return `${id} ${displayName}`;
53083
+ }
53084
+ return id ?? displayName;
53085
+ }
53086
+ function getContextConfig(modelIdentifier, contextWindowSize) {
53042
53087
  const statusWindowSize = toValidWindowSize(contextWindowSize);
53043
53088
  if (statusWindowSize !== null) {
53044
53089
  return {
53045
53090
  maxTokens: statusWindowSize,
53046
- usableTokens: Math.floor(statusWindowSize * 0.8)
53091
+ usableTokens: Math.floor(statusWindowSize * USABLE_CONTEXT_RATIO)
53047
53092
  };
53048
53093
  }
53049
53094
  const defaultConfig = {
53050
- maxTokens: 200000,
53051
- usableTokens: 160000
53095
+ maxTokens: DEFAULT_CONTEXT_WINDOW_SIZE,
53096
+ usableTokens: Math.floor(DEFAULT_CONTEXT_WINDOW_SIZE * USABLE_CONTEXT_RATIO)
53052
53097
  };
53053
- if (!modelId)
53098
+ if (!modelIdentifier) {
53054
53099
  return defaultConfig;
53055
- if (modelId.toLowerCase().includes("[1m]")) {
53100
+ }
53101
+ const inferredWindowSize = parseContextWindowSize(modelIdentifier);
53102
+ if (inferredWindowSize !== null) {
53056
53103
  return {
53057
- maxTokens: 1e6,
53058
- usableTokens: 800000
53104
+ maxTokens: inferredWindowSize,
53105
+ usableTokens: Math.floor(inferredWindowSize * USABLE_CONTEXT_RATIO)
53059
53106
  };
53060
53107
  }
53061
53108
  return defaultConfig;
@@ -53070,9 +53117,8 @@ function calculateContextPercentage(context) {
53070
53117
  if (!context.tokenMetrics) {
53071
53118
  return 0;
53072
53119
  }
53073
- const model = context.data?.model;
53074
- const modelId = typeof model === "string" ? model : model?.id;
53075
- const contextConfig = getContextConfig(modelId, contextWindowMetrics.windowSize);
53120
+ const modelIdentifier = getModelContextIdentifier(context.data?.model);
53121
+ const contextConfig = getContextConfig(modelIdentifier, contextWindowMetrics.windowSize);
53076
53122
  return Math.min(100, context.tokenMetrics.contextLength / contextConfig.maxTokens * 100);
53077
53123
  }
53078
53124
 
@@ -53880,9 +53926,8 @@ class ContextPercentageWidget {
53880
53926
  return formatRawOrLabeledValue(item, "Ctx: ", `${displayPercentage.toFixed(1)}%`);
53881
53927
  }
53882
53928
  if (context.tokenMetrics) {
53883
- const model = context.data?.model;
53884
- const modelId = typeof model === "string" ? model : model?.id;
53885
- const contextConfig = getContextConfig(modelId, contextWindowMetrics.windowSize);
53929
+ const modelIdentifier = getModelContextIdentifier(context.data?.model);
53930
+ const contextConfig = getContextConfig(modelIdentifier, contextWindowMetrics.windowSize);
53886
53931
  const usedPercentage = Math.min(100, context.tokenMetrics.contextLength / contextConfig.maxTokens * 100);
53887
53932
  const displayPercentage = isInverse ? 100 - usedPercentage : usedPercentage;
53888
53933
  return formatRawOrLabeledValue(item, "Ctx: ", `${displayPercentage.toFixed(1)}%`);
@@ -53926,10 +53971,9 @@ class ContextPercentageUsableWidget {
53926
53971
  }
53927
53972
  render(item, context, settings) {
53928
53973
  const isInverse = isContextInverse(item);
53929
- const model = context.data?.model;
53930
- const modelId = typeof model === "string" ? model : model?.id;
53974
+ const modelIdentifier = getModelContextIdentifier(context.data?.model);
53931
53975
  const contextWindowMetrics = getContextWindowMetrics(context.data);
53932
- const contextConfig = getContextConfig(modelId, contextWindowMetrics.windowSize);
53976
+ const contextConfig = getContextConfig(modelIdentifier, contextWindowMetrics.windowSize);
53933
53977
  if (context.isPreview) {
53934
53978
  const previewValue = isInverse ? "88.4%" : "11.6%";
53935
53979
  return formatRawOrLabeledValue(item, "Ctx(u): ", previewValue);
@@ -56784,9 +56828,8 @@ class ContextBarWidget {
56784
56828
  used = context.tokenMetrics.contextLength;
56785
56829
  }
56786
56830
  if (total === null && context.tokenMetrics) {
56787
- const model = context.data?.model;
56788
- const modelId = typeof model === "string" ? model : model?.id;
56789
- total = getContextConfig(modelId).maxTokens;
56831
+ const modelIdentifier = getModelContextIdentifier(context.data?.model);
56832
+ total = getContextConfig(modelIdentifier).maxTokens;
56790
56833
  }
56791
56834
  if (used === null || total === null || total <= 0) {
56792
56835
  return null;
@@ -57204,6 +57247,111 @@ var ConfirmDialog = ({ message, onConfirm, onCancel, inline = false }) => {
57204
57247
  }, undefined, true, undefined, this);
57205
57248
  };
57206
57249
 
57250
+ // src/tui/components/color-menu/mutations.ts
57251
+ function updateWidgetById(widgets, widgetId, updater) {
57252
+ return widgets.map((widget) => widget.id === widgetId ? updater(widget) : widget);
57253
+ }
57254
+ function setWidgetColor(widgets, widgetId, color, editingBackground) {
57255
+ return updateWidgetById(widgets, widgetId, (widget) => {
57256
+ if (editingBackground) {
57257
+ return {
57258
+ ...widget,
57259
+ backgroundColor: color
57260
+ };
57261
+ }
57262
+ return {
57263
+ ...widget,
57264
+ color
57265
+ };
57266
+ });
57267
+ }
57268
+ function toggleWidgetBold(widgets, widgetId) {
57269
+ return updateWidgetById(widgets, widgetId, (widget) => ({
57270
+ ...widget,
57271
+ bold: !widget.bold
57272
+ }));
57273
+ }
57274
+ function resetWidgetStyling(widgets, widgetId) {
57275
+ return updateWidgetById(widgets, widgetId, (widget) => {
57276
+ const {
57277
+ color,
57278
+ backgroundColor,
57279
+ bold,
57280
+ ...restWidget
57281
+ } = widget;
57282
+ return restWidget;
57283
+ });
57284
+ }
57285
+ function clearAllWidgetStyling(widgets) {
57286
+ return widgets.map((widget) => {
57287
+ const {
57288
+ color,
57289
+ backgroundColor,
57290
+ bold,
57291
+ ...restWidget
57292
+ } = widget;
57293
+ return restWidget;
57294
+ });
57295
+ }
57296
+ function getDefaultForegroundColor(widget) {
57297
+ if (widget.type === "separator" || widget.type === "flex-separator") {
57298
+ return "white";
57299
+ }
57300
+ const widgetImpl = getWidget(widget.type);
57301
+ return widgetImpl ? widgetImpl.getDefaultColor() : "white";
57302
+ }
57303
+ function getNextIndex(currentIndex, length, direction) {
57304
+ if (direction === "right") {
57305
+ return (currentIndex + 1) % length;
57306
+ }
57307
+ return currentIndex === 0 ? length - 1 : currentIndex - 1;
57308
+ }
57309
+ function cycleWidgetColor({
57310
+ widgets,
57311
+ widgetId,
57312
+ direction,
57313
+ editingBackground,
57314
+ colors,
57315
+ backgroundColors
57316
+ }) {
57317
+ return updateWidgetById(widgets, widgetId, (widget) => {
57318
+ if (editingBackground) {
57319
+ if (backgroundColors.length === 0) {
57320
+ return widget;
57321
+ }
57322
+ const currentBgColor = widget.backgroundColor ?? "";
57323
+ let currentBgColorIndex = backgroundColors.indexOf(currentBgColor);
57324
+ if (currentBgColorIndex === -1) {
57325
+ currentBgColorIndex = 0;
57326
+ }
57327
+ const nextBgColorIndex = getNextIndex(currentBgColorIndex, backgroundColors.length, direction);
57328
+ const nextBgColor = backgroundColors[nextBgColorIndex];
57329
+ return {
57330
+ ...widget,
57331
+ backgroundColor: nextBgColor === "" ? undefined : nextBgColor
57332
+ };
57333
+ }
57334
+ if (colors.length === 0) {
57335
+ return widget;
57336
+ }
57337
+ const defaultColor = getDefaultForegroundColor(widget);
57338
+ let currentColor = widget.color ?? defaultColor;
57339
+ if (currentColor === "dim") {
57340
+ currentColor = defaultColor;
57341
+ }
57342
+ let currentColorIndex = colors.indexOf(currentColor);
57343
+ if (currentColorIndex === -1) {
57344
+ currentColorIndex = 0;
57345
+ }
57346
+ const nextColorIndex = getNextIndex(currentColorIndex, colors.length, direction);
57347
+ const nextColor = colors[nextColorIndex];
57348
+ return {
57349
+ ...widget,
57350
+ color: nextColor
57351
+ };
57352
+ });
57353
+ }
57354
+
57207
57355
  // src/tui/components/ColorMenu.tsx
57208
57356
  var jsx_dev_runtime6 = __toESM(require_jsx_dev_runtime(), 1);
57209
57357
  var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
@@ -57244,16 +57392,7 @@ var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
57244
57392
  const hexColor = `hex:${hexInput}`;
57245
57393
  const selectedWidget2 = colorableWidgets.find((widget) => widget.id === highlightedItemId);
57246
57394
  if (selectedWidget2) {
57247
- const newItems = widgets.map((widget) => {
57248
- if (widget.id === highlightedItemId) {
57249
- if (editingBackground) {
57250
- return { ...widget, backgroundColor: hexColor };
57251
- } else {
57252
- return { ...widget, color: hexColor };
57253
- }
57254
- }
57255
- return widget;
57256
- });
57395
+ const newItems = setWidgetColor(widgets, selectedWidget2.id, hexColor, editingBackground);
57257
57396
  onUpdate(newItems);
57258
57397
  }
57259
57398
  setHexInputMode(false);
@@ -57282,16 +57421,7 @@ var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
57282
57421
  const ansiColor = `ansi256:${code}`;
57283
57422
  const selectedWidget2 = colorableWidgets.find((widget) => widget.id === highlightedItemId);
57284
57423
  if (selectedWidget2) {
57285
- const newItems = widgets.map((widget) => {
57286
- if (widget.id === highlightedItemId) {
57287
- if (editingBackground) {
57288
- return { ...widget, backgroundColor: ansiColor };
57289
- } else {
57290
- return { ...widget, color: ansiColor };
57291
- }
57292
- }
57293
- return widget;
57294
- });
57424
+ const newItems = setWidgetColor(widgets, selectedWidget2.id, ansiColor, editingBackground);
57295
57425
  onUpdate(newItems);
57296
57426
  setAnsi256InputMode(false);
57297
57427
  setAnsi256Input("");
@@ -57341,12 +57471,7 @@ var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
57341
57471
  if (highlightedItemId && highlightedItemId !== "back") {
57342
57472
  const selectedWidget2 = colorableWidgets.find((widget) => widget.id === highlightedItemId);
57343
57473
  if (selectedWidget2) {
57344
- const newItems = widgets.map((widget) => {
57345
- if (widget.id === selectedWidget2.id) {
57346
- return { ...widget, bold: !widget.bold };
57347
- }
57348
- return widget;
57349
- });
57474
+ const newItems = toggleWidgetBold(widgets, selectedWidget2.id);
57350
57475
  onUpdate(newItems);
57351
57476
  }
57352
57477
  }
@@ -57354,13 +57479,7 @@ var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
57354
57479
  if (highlightedItemId && highlightedItemId !== "back") {
57355
57480
  const selectedWidget2 = colorableWidgets.find((widget) => widget.id === highlightedItemId);
57356
57481
  if (selectedWidget2) {
57357
- const newItems = widgets.map((widget) => {
57358
- if (widget.id === selectedWidget2.id) {
57359
- const { color, backgroundColor, bold, ...restWidget } = widget;
57360
- return restWidget;
57361
- }
57362
- return widget;
57363
- });
57482
+ const newItems = resetWidgetStyling(widgets, selectedWidget2.id);
57364
57483
  onUpdate(newItems);
57365
57484
  }
57366
57485
  }
@@ -57370,47 +57489,13 @@ var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
57370
57489
  if (highlightedItemId && highlightedItemId !== "back") {
57371
57490
  const selectedWidget2 = colorableWidgets.find((widget) => widget.id === highlightedItemId);
57372
57491
  if (selectedWidget2) {
57373
- const newItems = widgets.map((widget) => {
57374
- if (widget.id === selectedWidget2.id) {
57375
- if (editingBackground) {
57376
- const currentBgColor = widget.backgroundColor ?? "";
57377
- let currentBgColorIndex = bgColors.indexOf(currentBgColor);
57378
- if (currentBgColorIndex === -1)
57379
- currentBgColorIndex = 0;
57380
- let nextBgColorIndex;
57381
- if (key.rightArrow) {
57382
- nextBgColorIndex = (currentBgColorIndex + 1) % bgColors.length;
57383
- } else {
57384
- nextBgColorIndex = currentBgColorIndex === 0 ? bgColors.length - 1 : currentBgColorIndex - 1;
57385
- }
57386
- const nextBgColor = bgColors[nextBgColorIndex];
57387
- return { ...widget, backgroundColor: nextBgColor === "" ? undefined : nextBgColor };
57388
- } else {
57389
- let defaultColor = "white";
57390
- if (widget.type !== "separator" && widget.type !== "flex-separator") {
57391
- const widgetImpl = getWidget(widget.type);
57392
- if (widgetImpl) {
57393
- defaultColor = widgetImpl.getDefaultColor();
57394
- }
57395
- }
57396
- let currentColor2 = widget.color ?? defaultColor;
57397
- if (currentColor2 === "dim") {
57398
- currentColor2 = defaultColor;
57399
- }
57400
- let currentColorIndex = colors.indexOf(currentColor2);
57401
- if (currentColorIndex === -1)
57402
- currentColorIndex = 0;
57403
- let nextColorIndex;
57404
- if (key.rightArrow) {
57405
- nextColorIndex = (currentColorIndex + 1) % colors.length;
57406
- } else {
57407
- nextColorIndex = currentColorIndex === 0 ? colors.length - 1 : currentColorIndex - 1;
57408
- }
57409
- const nextColor = colors[nextColorIndex];
57410
- return { ...widget, color: nextColor };
57411
- }
57412
- }
57413
- return widget;
57492
+ const newItems = cycleWidgetColor({
57493
+ widgets,
57494
+ widgetId: selectedWidget2.id,
57495
+ direction: key.rightArrow ? "right" : "left",
57496
+ editingBackground,
57497
+ colors,
57498
+ backgroundColors: bgColors
57414
57499
  });
57415
57500
  onUpdate(newItems);
57416
57501
  }
@@ -57566,10 +57651,7 @@ var ColorMenu = ({ widgets, lineIndex, settings, onUpdate, onBack }) => {
57566
57651
  children: /* @__PURE__ */ jsx_dev_runtime6.jsxDEV(ConfirmDialog, {
57567
57652
  inline: true,
57568
57653
  onConfirm: () => {
57569
- const newItems = widgets.map((widget) => {
57570
- const { color, backgroundColor, bold, ...restWidget } = widget;
57571
- return restWidget;
57572
- });
57654
+ const newItems = clearAllWidgetStyling(widgets);
57573
57655
  onUpdate(newItems);
57574
57656
  setShowClearConfirm(false);
57575
57657
  },
@@ -58257,6 +58339,317 @@ var InstallMenu = ({
58257
58339
  };
58258
58340
  // src/tui/components/ItemsEditor.tsx
58259
58341
  var import_react37 = __toESM(require_react(), 1);
58342
+
58343
+ // src/tui/components/items-editor/input-handlers.ts
58344
+ function setPickerState(setWidgetPicker, normalizeState, updater) {
58345
+ setWidgetPicker((prev) => {
58346
+ if (!prev) {
58347
+ return prev;
58348
+ }
58349
+ return normalizeState(updater(prev));
58350
+ });
58351
+ }
58352
+ function getPickerCategories(widgetCategories) {
58353
+ return [...widgetCategories];
58354
+ }
58355
+ function normalizePickerState(state, widgetCatalog, widgetCategories) {
58356
+ const filteredCategories = getPickerCategories(widgetCategories);
58357
+ const selectedCategory = state.selectedCategory && filteredCategories.includes(state.selectedCategory) ? state.selectedCategory : filteredCategories[0] ?? null;
58358
+ const hasTopLevelSearch = state.level === "category" && state.categoryQuery.trim().length > 0;
58359
+ const effectiveCategory = hasTopLevelSearch ? "All" : selectedCategory ?? "All";
58360
+ const effectiveQuery = hasTopLevelSearch ? state.categoryQuery : state.widgetQuery;
58361
+ const filteredWidgets = filterWidgetCatalog(widgetCatalog, effectiveCategory, effectiveQuery);
58362
+ const hasSelectedType = state.selectedType ? filteredWidgets.some((entry) => entry.type === state.selectedType) : false;
58363
+ return {
58364
+ ...state,
58365
+ selectedCategory,
58366
+ selectedType: hasSelectedType ? state.selectedType : filteredWidgets[0]?.type ?? null
58367
+ };
58368
+ }
58369
+ function getPickerViewState(widgetPicker, widgetCatalog, widgetCategories) {
58370
+ const filteredCategories = getPickerCategories(widgetCategories);
58371
+ const selectedCategory = widgetPicker.selectedCategory && filteredCategories.includes(widgetPicker.selectedCategory) ? widgetPicker.selectedCategory : filteredCategories[0] ?? null;
58372
+ const hasTopLevelSearch = widgetPicker.level === "category" && widgetPicker.categoryQuery.trim().length > 0;
58373
+ const topLevelSearchEntries = hasTopLevelSearch ? filterWidgetCatalog(widgetCatalog, "All", widgetPicker.categoryQuery) : [];
58374
+ const topLevelSelectedEntry = topLevelSearchEntries.find((entry) => entry.type === widgetPicker.selectedType) ?? topLevelSearchEntries[0];
58375
+ const filteredWidgets = filterWidgetCatalog(widgetCatalog, selectedCategory ?? "All", widgetPicker.widgetQuery);
58376
+ const selectedEntry = filteredWidgets.find((entry) => entry.type === widgetPicker.selectedType) ?? filteredWidgets[0];
58377
+ return {
58378
+ filteredCategories,
58379
+ selectedCategory,
58380
+ hasTopLevelSearch,
58381
+ topLevelSearchEntries,
58382
+ topLevelSelectedEntry,
58383
+ filteredWidgets,
58384
+ selectedEntry
58385
+ };
58386
+ }
58387
+ function handlePickerInputMode({
58388
+ input,
58389
+ key,
58390
+ widgetPicker,
58391
+ widgetCatalog,
58392
+ widgetCategories,
58393
+ setWidgetPicker,
58394
+ applyWidgetPickerSelection
58395
+ }) {
58396
+ const normalizeState = (state) => normalizePickerState(state, widgetCatalog, widgetCategories);
58397
+ const {
58398
+ filteredCategories,
58399
+ selectedCategory,
58400
+ hasTopLevelSearch,
58401
+ topLevelSearchEntries,
58402
+ topLevelSelectedEntry,
58403
+ filteredWidgets,
58404
+ selectedEntry
58405
+ } = getPickerViewState(widgetPicker, widgetCatalog, widgetCategories);
58406
+ if (widgetPicker.level === "category") {
58407
+ if (key.escape) {
58408
+ if (widgetPicker.categoryQuery.length > 0) {
58409
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58410
+ ...prev,
58411
+ categoryQuery: ""
58412
+ }));
58413
+ } else {
58414
+ setWidgetPicker(null);
58415
+ }
58416
+ } else if (key.return) {
58417
+ if (hasTopLevelSearch) {
58418
+ if (topLevelSelectedEntry) {
58419
+ applyWidgetPickerSelection(topLevelSelectedEntry.type);
58420
+ }
58421
+ } else if (selectedCategory) {
58422
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58423
+ ...prev,
58424
+ level: "widget",
58425
+ selectedCategory
58426
+ }));
58427
+ }
58428
+ } else if (key.upArrow || key.downArrow) {
58429
+ if (hasTopLevelSearch) {
58430
+ if (topLevelSearchEntries.length === 0) {
58431
+ return;
58432
+ }
58433
+ let currentIndex = topLevelSearchEntries.findIndex((entry) => entry.type === widgetPicker.selectedType);
58434
+ if (currentIndex === -1) {
58435
+ currentIndex = 0;
58436
+ }
58437
+ const nextIndex = key.downArrow ? Math.min(topLevelSearchEntries.length - 1, currentIndex + 1) : Math.max(0, currentIndex - 1);
58438
+ const nextType = topLevelSearchEntries[nextIndex]?.type ?? null;
58439
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58440
+ ...prev,
58441
+ selectedType: nextType
58442
+ }));
58443
+ } else {
58444
+ if (filteredCategories.length === 0) {
58445
+ return;
58446
+ }
58447
+ let currentIndex = filteredCategories.findIndex((category) => category === selectedCategory);
58448
+ if (currentIndex === -1) {
58449
+ currentIndex = 0;
58450
+ }
58451
+ const nextIndex = key.downArrow ? Math.min(filteredCategories.length - 1, currentIndex + 1) : Math.max(0, currentIndex - 1);
58452
+ const nextCategory = filteredCategories[nextIndex] ?? null;
58453
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58454
+ ...prev,
58455
+ selectedCategory: nextCategory
58456
+ }));
58457
+ }
58458
+ } else if (key.backspace || key.delete) {
58459
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58460
+ ...prev,
58461
+ categoryQuery: prev.categoryQuery.slice(0, -1)
58462
+ }));
58463
+ } else if (input && !key.ctrl && !key.meta && !key.tab) {
58464
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58465
+ ...prev,
58466
+ categoryQuery: prev.categoryQuery + input
58467
+ }));
58468
+ }
58469
+ } else {
58470
+ if (key.escape) {
58471
+ if (widgetPicker.widgetQuery.length > 0) {
58472
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58473
+ ...prev,
58474
+ widgetQuery: ""
58475
+ }));
58476
+ } else {
58477
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58478
+ ...prev,
58479
+ level: "category"
58480
+ }));
58481
+ }
58482
+ } else if (key.return) {
58483
+ if (selectedEntry) {
58484
+ applyWidgetPickerSelection(selectedEntry.type);
58485
+ }
58486
+ } else if (key.upArrow || key.downArrow) {
58487
+ if (filteredWidgets.length === 0) {
58488
+ return;
58489
+ }
58490
+ let currentIndex = filteredWidgets.findIndex((entry) => entry.type === widgetPicker.selectedType);
58491
+ if (currentIndex === -1) {
58492
+ currentIndex = 0;
58493
+ }
58494
+ const nextIndex = key.downArrow ? Math.min(filteredWidgets.length - 1, currentIndex + 1) : Math.max(0, currentIndex - 1);
58495
+ const nextType = filteredWidgets[nextIndex]?.type ?? null;
58496
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58497
+ ...prev,
58498
+ selectedType: nextType
58499
+ }));
58500
+ } else if (key.backspace || key.delete) {
58501
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58502
+ ...prev,
58503
+ widgetQuery: prev.widgetQuery.slice(0, -1)
58504
+ }));
58505
+ } else if (input && !key.ctrl && !key.meta && !key.tab) {
58506
+ setPickerState(setWidgetPicker, normalizeState, (prev) => ({
58507
+ ...prev,
58508
+ widgetQuery: prev.widgetQuery + input
58509
+ }));
58510
+ }
58511
+ }
58512
+ }
58513
+ function handleMoveInputMode({
58514
+ key,
58515
+ widgets,
58516
+ selectedIndex,
58517
+ onUpdate,
58518
+ setSelectedIndex,
58519
+ setMoveMode
58520
+ }) {
58521
+ if (key.upArrow && selectedIndex > 0) {
58522
+ const newWidgets = [...widgets];
58523
+ const temp = newWidgets[selectedIndex];
58524
+ const prev = newWidgets[selectedIndex - 1];
58525
+ if (temp && prev) {
58526
+ [newWidgets[selectedIndex], newWidgets[selectedIndex - 1]] = [prev, temp];
58527
+ }
58528
+ onUpdate(newWidgets);
58529
+ setSelectedIndex(selectedIndex - 1);
58530
+ } else if (key.downArrow && selectedIndex < widgets.length - 1) {
58531
+ const newWidgets = [...widgets];
58532
+ const temp = newWidgets[selectedIndex];
58533
+ const next = newWidgets[selectedIndex + 1];
58534
+ if (temp && next) {
58535
+ [newWidgets[selectedIndex], newWidgets[selectedIndex + 1]] = [next, temp];
58536
+ }
58537
+ onUpdate(newWidgets);
58538
+ setSelectedIndex(selectedIndex + 1);
58539
+ } else if (key.escape || key.return) {
58540
+ setMoveMode(false);
58541
+ }
58542
+ }
58543
+ function handleNormalInputMode({
58544
+ input,
58545
+ key,
58546
+ widgets,
58547
+ selectedIndex,
58548
+ separatorChars,
58549
+ onBack,
58550
+ onUpdate,
58551
+ setSelectedIndex,
58552
+ setMoveMode,
58553
+ setShowClearConfirm,
58554
+ openWidgetPicker,
58555
+ getVisibleCustomKeybinds,
58556
+ setCustomEditorWidget
58557
+ }) {
58558
+ if (key.upArrow && widgets.length > 0) {
58559
+ setSelectedIndex(Math.max(0, selectedIndex - 1));
58560
+ } else if (key.downArrow && widgets.length > 0) {
58561
+ setSelectedIndex(Math.min(widgets.length - 1, selectedIndex + 1));
58562
+ } else if (key.leftArrow && widgets.length > 0) {
58563
+ openWidgetPicker("change");
58564
+ } else if (key.rightArrow && widgets.length > 0) {
58565
+ openWidgetPicker("change");
58566
+ } else if (key.return && widgets.length > 0) {
58567
+ setMoveMode(true);
58568
+ } else if (input === "a") {
58569
+ openWidgetPicker("add");
58570
+ } else if (input === "i") {
58571
+ openWidgetPicker("insert");
58572
+ } else if (input === "d" && widgets.length > 0) {
58573
+ const newWidgets = widgets.filter((_, i) => i !== selectedIndex);
58574
+ onUpdate(newWidgets);
58575
+ if (selectedIndex >= newWidgets.length && selectedIndex > 0) {
58576
+ setSelectedIndex(selectedIndex - 1);
58577
+ }
58578
+ } else if (input === "c") {
58579
+ if (widgets.length > 0) {
58580
+ setShowClearConfirm(true);
58581
+ }
58582
+ } else if (input === " " && widgets.length > 0) {
58583
+ const currentWidget = widgets[selectedIndex];
58584
+ if (currentWidget && currentWidget.type === "separator") {
58585
+ const currentChar = currentWidget.character ?? "|";
58586
+ const currentCharIndex = separatorChars.indexOf(currentChar);
58587
+ const nextChar = separatorChars[(currentCharIndex + 1) % separatorChars.length];
58588
+ const newWidgets = [...widgets];
58589
+ newWidgets[selectedIndex] = { ...currentWidget, character: nextChar };
58590
+ onUpdate(newWidgets);
58591
+ }
58592
+ } else if (input === "r" && widgets.length > 0) {
58593
+ const currentWidget = widgets[selectedIndex];
58594
+ if (currentWidget && currentWidget.type !== "separator" && currentWidget.type !== "flex-separator") {
58595
+ const widgetImpl = getWidget(currentWidget.type);
58596
+ if (!widgetImpl?.supportsRawValue()) {
58597
+ return;
58598
+ }
58599
+ const newWidgets = [...widgets];
58600
+ newWidgets[selectedIndex] = { ...currentWidget, rawValue: !currentWidget.rawValue };
58601
+ onUpdate(newWidgets);
58602
+ }
58603
+ } else if (input === "m" && widgets.length > 0) {
58604
+ const currentWidget = widgets[selectedIndex];
58605
+ if (currentWidget && selectedIndex < widgets.length - 1 && currentWidget.type !== "separator" && currentWidget.type !== "flex-separator") {
58606
+ const newWidgets = [...widgets];
58607
+ let nextMergeState;
58608
+ if (currentWidget.merge === undefined) {
58609
+ nextMergeState = true;
58610
+ } else if (currentWidget.merge === true) {
58611
+ nextMergeState = "no-padding";
58612
+ } else {
58613
+ nextMergeState = undefined;
58614
+ }
58615
+ if (nextMergeState === undefined) {
58616
+ const { merge: merge2, ...rest } = currentWidget;
58617
+ newWidgets[selectedIndex] = rest;
58618
+ } else {
58619
+ newWidgets[selectedIndex] = { ...currentWidget, merge: nextMergeState };
58620
+ }
58621
+ onUpdate(newWidgets);
58622
+ }
58623
+ } else if (key.escape) {
58624
+ onBack();
58625
+ } else if (widgets.length > 0) {
58626
+ const currentWidget = widgets[selectedIndex];
58627
+ if (currentWidget && currentWidget.type !== "separator" && currentWidget.type !== "flex-separator") {
58628
+ const widgetImpl = getWidget(currentWidget.type);
58629
+ if (!widgetImpl?.getCustomKeybinds) {
58630
+ return;
58631
+ }
58632
+ const customKeybinds = getVisibleCustomKeybinds(widgetImpl, currentWidget);
58633
+ const matchedKeybind = customKeybinds.find((kb) => kb.key === input);
58634
+ if (matchedKeybind && !key.ctrl) {
58635
+ if (widgetImpl.handleEditorAction) {
58636
+ const updatedWidget = widgetImpl.handleEditorAction(matchedKeybind.action, currentWidget);
58637
+ if (updatedWidget) {
58638
+ const newWidgets = [...widgets];
58639
+ newWidgets[selectedIndex] = updatedWidget;
58640
+ onUpdate(newWidgets);
58641
+ } else if (widgetImpl.renderEditor) {
58642
+ setCustomEditorWidget({ widget: currentWidget, impl: widgetImpl, action: matchedKeybind.action });
58643
+ }
58644
+ } else if (widgetImpl.renderEditor) {
58645
+ setCustomEditorWidget({ widget: currentWidget, impl: widgetImpl, action: matchedKeybind.action });
58646
+ }
58647
+ }
58648
+ }
58649
+ }
58650
+ }
58651
+
58652
+ // src/tui/components/ItemsEditor.tsx
58260
58653
  var jsx_dev_runtime9 = __toESM(require_jsx_dev_runtime(), 1);
58261
58654
  var ItemsEditor = ({ widgets, onUpdate, onBack, lineNumber, settings }) => {
58262
58655
  const [selectedIndex, setSelectedIndex] = import_react37.useState(0);
@@ -58292,23 +58685,6 @@ var ItemsEditor = ({ widgets, onUpdate, onBack, lineNumber, settings }) => {
58292
58685
  const handleEditorCancel = () => {
58293
58686
  setCustomEditorWidget(null);
58294
58687
  };
58295
- const getFilteredCategories = (query) => {
58296
- return [...widgetCategories];
58297
- };
58298
- const normalizePickerState = (state) => {
58299
- const filteredCategories = getFilteredCategories(state.categoryQuery);
58300
- const selectedCategory = state.selectedCategory && filteredCategories.includes(state.selectedCategory) ? state.selectedCategory : filteredCategories[0] ?? null;
58301
- const hasTopLevelSearch = state.level === "category" && state.categoryQuery.trim().length > 0;
58302
- const effectiveCategory = hasTopLevelSearch ? "All" : selectedCategory ?? "All";
58303
- const effectiveQuery = hasTopLevelSearch ? state.categoryQuery : state.widgetQuery;
58304
- const filteredWidgets = filterWidgetCatalog(widgetCatalog, effectiveCategory, effectiveQuery);
58305
- const hasSelectedType = state.selectedType ? filteredWidgets.some((entry) => entry.type === state.selectedType) : false;
58306
- return {
58307
- ...state,
58308
- selectedCategory,
58309
- selectedType: hasSelectedType ? state.selectedType : filteredWidgets[0]?.type ?? null
58310
- };
58311
- };
58312
58688
  const shouldShowCustomKeybind = (widget, keybind) => {
58313
58689
  if (keybind.action !== "toggle-invert") {
58314
58690
  return true;
@@ -58335,7 +58711,7 @@ var ItemsEditor = ({ widgets, onUpdate, onBack, lineNumber, settings }) => {
58335
58711
  categoryQuery: "",
58336
58712
  widgetQuery: "",
58337
58713
  selectedType
58338
- }));
58714
+ }, widgetCatalog, widgetCategories));
58339
58715
  };
58340
58716
  const applyWidgetPickerSelection = (selectedType) => {
58341
58717
  if (!widgetPicker) {
@@ -58371,238 +58747,43 @@ var ItemsEditor = ({ widgets, onUpdate, onBack, lineNumber, settings }) => {
58371
58747
  return;
58372
58748
  }
58373
58749
  if (widgetPicker) {
58374
- const filteredCategories = getFilteredCategories(widgetPicker.categoryQuery);
58375
- const selectedCategory = widgetPicker.selectedCategory && filteredCategories.includes(widgetPicker.selectedCategory) ? widgetPicker.selectedCategory : filteredCategories[0] ?? null;
58376
- const hasTopLevelSearch = widgetPicker.level === "category" && widgetPicker.categoryQuery.trim().length > 0;
58377
- const topLevelSearchEntries2 = hasTopLevelSearch ? filterWidgetCatalog(widgetCatalog, "All", widgetPicker.categoryQuery) : [];
58378
- const topLevelSelectedEntry = topLevelSearchEntries2.find((entry) => entry.type === widgetPicker.selectedType) ?? topLevelSearchEntries2[0];
58379
- const filteredWidgets = filterWidgetCatalog(widgetCatalog, selectedCategory ?? "All", widgetPicker.widgetQuery);
58380
- const selectedEntry = filteredWidgets.find((entry) => entry.type === widgetPicker.selectedType) ?? filteredWidgets[0];
58381
- if (widgetPicker.level === "category") {
58382
- if (key.escape) {
58383
- if (widgetPicker.categoryQuery.length > 0) {
58384
- setWidgetPicker((prev) => prev ? normalizePickerState({
58385
- ...prev,
58386
- categoryQuery: ""
58387
- }) : prev);
58388
- } else {
58389
- setWidgetPicker(null);
58390
- }
58391
- } else if (key.return) {
58392
- if (hasTopLevelSearch) {
58393
- if (topLevelSelectedEntry) {
58394
- applyWidgetPickerSelection(topLevelSelectedEntry.type);
58395
- }
58396
- } else if (selectedCategory) {
58397
- setWidgetPicker((prev) => prev ? normalizePickerState({
58398
- ...prev,
58399
- level: "widget",
58400
- selectedCategory
58401
- }) : prev);
58402
- }
58403
- } else if (key.upArrow || key.downArrow) {
58404
- if (hasTopLevelSearch) {
58405
- if (topLevelSearchEntries2.length === 0) {
58406
- return;
58407
- }
58408
- let currentIndex = topLevelSearchEntries2.findIndex((entry) => entry.type === widgetPicker.selectedType);
58409
- if (currentIndex === -1) {
58410
- currentIndex = 0;
58411
- }
58412
- const nextIndex = key.downArrow ? Math.min(topLevelSearchEntries2.length - 1, currentIndex + 1) : Math.max(0, currentIndex - 1);
58413
- const nextType = topLevelSearchEntries2[nextIndex]?.type ?? null;
58414
- setWidgetPicker((prev) => prev ? normalizePickerState({
58415
- ...prev,
58416
- selectedType: nextType
58417
- }) : prev);
58418
- } else {
58419
- if (filteredCategories.length === 0) {
58420
- return;
58421
- }
58422
- let currentIndex = filteredCategories.findIndex((category) => category === selectedCategory);
58423
- if (currentIndex === -1) {
58424
- currentIndex = 0;
58425
- }
58426
- const nextIndex = key.downArrow ? Math.min(filteredCategories.length - 1, currentIndex + 1) : Math.max(0, currentIndex - 1);
58427
- const nextCategory = filteredCategories[nextIndex] ?? null;
58428
- setWidgetPicker((prev) => prev ? normalizePickerState({
58429
- ...prev,
58430
- selectedCategory: nextCategory
58431
- }) : prev);
58432
- }
58433
- } else if (key.backspace || key.delete) {
58434
- setWidgetPicker((prev) => prev ? normalizePickerState({
58435
- ...prev,
58436
- categoryQuery: prev.categoryQuery.slice(0, -1)
58437
- }) : prev);
58438
- } else if (input && !key.ctrl && !key.meta && !key.tab) {
58439
- setWidgetPicker((prev) => prev ? normalizePickerState({
58440
- ...prev,
58441
- categoryQuery: prev.categoryQuery + input
58442
- }) : prev);
58443
- }
58444
- } else {
58445
- if (key.escape) {
58446
- if (widgetPicker.widgetQuery.length > 0) {
58447
- setWidgetPicker((prev) => prev ? normalizePickerState({
58448
- ...prev,
58449
- widgetQuery: ""
58450
- }) : prev);
58451
- } else {
58452
- setWidgetPicker((prev) => prev ? normalizePickerState({
58453
- ...prev,
58454
- level: "category"
58455
- }) : prev);
58456
- }
58457
- } else if (key.return) {
58458
- if (selectedEntry) {
58459
- applyWidgetPickerSelection(selectedEntry.type);
58460
- }
58461
- } else if (key.upArrow || key.downArrow) {
58462
- if (filteredWidgets.length === 0) {
58463
- return;
58464
- }
58465
- let currentIndex = filteredWidgets.findIndex((entry) => entry.type === widgetPicker.selectedType);
58466
- if (currentIndex === -1) {
58467
- currentIndex = 0;
58468
- }
58469
- const nextIndex = key.downArrow ? Math.min(filteredWidgets.length - 1, currentIndex + 1) : Math.max(0, currentIndex - 1);
58470
- const nextType = filteredWidgets[nextIndex]?.type ?? null;
58471
- setWidgetPicker((prev) => prev ? normalizePickerState({
58472
- ...prev,
58473
- selectedType: nextType
58474
- }) : prev);
58475
- } else if (key.backspace || key.delete) {
58476
- setWidgetPicker((prev) => prev ? normalizePickerState({
58477
- ...prev,
58478
- widgetQuery: prev.widgetQuery.slice(0, -1)
58479
- }) : prev);
58480
- } else if (input && !key.ctrl && !key.meta && !key.tab) {
58481
- setWidgetPicker((prev) => prev ? normalizePickerState({
58482
- ...prev,
58483
- widgetQuery: prev.widgetQuery + input
58484
- }) : prev);
58485
- }
58486
- }
58750
+ handlePickerInputMode({
58751
+ input,
58752
+ key,
58753
+ widgetPicker,
58754
+ widgetCatalog,
58755
+ widgetCategories,
58756
+ setWidgetPicker,
58757
+ applyWidgetPickerSelection
58758
+ });
58487
58759
  return;
58488
58760
  }
58489
58761
  if (moveMode) {
58490
- if (key.upArrow && selectedIndex > 0) {
58491
- const newWidgets = [...widgets];
58492
- const temp = newWidgets[selectedIndex];
58493
- const prev = newWidgets[selectedIndex - 1];
58494
- if (temp && prev) {
58495
- [newWidgets[selectedIndex], newWidgets[selectedIndex - 1]] = [prev, temp];
58496
- }
58497
- onUpdate(newWidgets);
58498
- setSelectedIndex(selectedIndex - 1);
58499
- } else if (key.downArrow && selectedIndex < widgets.length - 1) {
58500
- const newWidgets = [...widgets];
58501
- const temp = newWidgets[selectedIndex];
58502
- const next = newWidgets[selectedIndex + 1];
58503
- if (temp && next) {
58504
- [newWidgets[selectedIndex], newWidgets[selectedIndex + 1]] = [next, temp];
58505
- }
58506
- onUpdate(newWidgets);
58507
- setSelectedIndex(selectedIndex + 1);
58508
- } else if (key.escape || key.return) {
58509
- setMoveMode(false);
58510
- }
58511
- } else {
58512
- if (key.upArrow && widgets.length > 0) {
58513
- setSelectedIndex(Math.max(0, selectedIndex - 1));
58514
- } else if (key.downArrow && widgets.length > 0) {
58515
- setSelectedIndex(Math.min(widgets.length - 1, selectedIndex + 1));
58516
- } else if (key.leftArrow && widgets.length > 0) {
58517
- openWidgetPicker("change");
58518
- } else if (key.rightArrow && widgets.length > 0) {
58519
- openWidgetPicker("change");
58520
- } else if (key.return && widgets.length > 0) {
58521
- setMoveMode(true);
58522
- } else if (input === "a") {
58523
- openWidgetPicker("add");
58524
- } else if (input === "i") {
58525
- openWidgetPicker("insert");
58526
- } else if (input === "d" && widgets.length > 0) {
58527
- const newWidgets = widgets.filter((_, i) => i !== selectedIndex);
58528
- onUpdate(newWidgets);
58529
- if (selectedIndex >= newWidgets.length && selectedIndex > 0) {
58530
- setSelectedIndex(selectedIndex - 1);
58531
- }
58532
- } else if (input === "c") {
58533
- if (widgets.length > 0) {
58534
- setShowClearConfirm(true);
58535
- }
58536
- } else if (input === " " && widgets.length > 0) {
58537
- const currentWidget2 = widgets[selectedIndex];
58538
- if (currentWidget2 && currentWidget2.type === "separator") {
58539
- const currentChar = currentWidget2.character ?? "|";
58540
- const currentCharIndex = separatorChars.indexOf(currentChar);
58541
- const nextChar = separatorChars[(currentCharIndex + 1) % separatorChars.length];
58542
- const newWidgets = [...widgets];
58543
- newWidgets[selectedIndex] = { ...currentWidget2, character: nextChar };
58544
- onUpdate(newWidgets);
58545
- }
58546
- } else if (input === "r" && widgets.length > 0) {
58547
- const currentWidget2 = widgets[selectedIndex];
58548
- if (currentWidget2 && currentWidget2.type !== "separator" && currentWidget2.type !== "flex-separator") {
58549
- const widgetImpl = getWidget(currentWidget2.type);
58550
- if (!widgetImpl?.supportsRawValue()) {
58551
- return;
58552
- }
58553
- const newWidgets = [...widgets];
58554
- newWidgets[selectedIndex] = { ...currentWidget2, rawValue: !currentWidget2.rawValue };
58555
- onUpdate(newWidgets);
58556
- }
58557
- } else if (input === "m" && widgets.length > 0) {
58558
- const currentWidget2 = widgets[selectedIndex];
58559
- if (currentWidget2 && selectedIndex < widgets.length - 1 && currentWidget2.type !== "separator" && currentWidget2.type !== "flex-separator") {
58560
- const newWidgets = [...widgets];
58561
- let nextMergeState;
58562
- if (currentWidget2.merge === undefined) {
58563
- nextMergeState = true;
58564
- } else if (currentWidget2.merge === true) {
58565
- nextMergeState = "no-padding";
58566
- } else {
58567
- nextMergeState = undefined;
58568
- }
58569
- if (nextMergeState === undefined) {
58570
- const { merge: merge2, ...rest } = currentWidget2;
58571
- newWidgets[selectedIndex] = rest;
58572
- } else {
58573
- newWidgets[selectedIndex] = { ...currentWidget2, merge: nextMergeState };
58574
- }
58575
- onUpdate(newWidgets);
58576
- }
58577
- } else if (key.escape) {
58578
- onBack();
58579
- } else if (widgets.length > 0) {
58580
- const currentWidget2 = widgets[selectedIndex];
58581
- if (currentWidget2 && currentWidget2.type !== "separator" && currentWidget2.type !== "flex-separator") {
58582
- const widgetImpl = getWidget(currentWidget2.type);
58583
- if (widgetImpl) {
58584
- if (widgetImpl.getCustomKeybinds) {
58585
- const customKeybinds2 = getVisibleCustomKeybinds(widgetImpl, currentWidget2);
58586
- const matchedKeybind = customKeybinds2.find((kb) => kb.key === input);
58587
- if (matchedKeybind && !key.ctrl) {
58588
- if (widgetImpl.handleEditorAction) {
58589
- const updatedWidget = widgetImpl.handleEditorAction(matchedKeybind.action, currentWidget2);
58590
- if (updatedWidget) {
58591
- const newWidgets = [...widgets];
58592
- newWidgets[selectedIndex] = updatedWidget;
58593
- onUpdate(newWidgets);
58594
- } else if (widgetImpl.renderEditor) {
58595
- setCustomEditorWidget({ widget: currentWidget2, impl: widgetImpl, action: matchedKeybind.action });
58596
- }
58597
- } else if (widgetImpl.renderEditor) {
58598
- setCustomEditorWidget({ widget: currentWidget2, impl: widgetImpl, action: matchedKeybind.action });
58599
- }
58600
- }
58601
- }
58602
- }
58603
- }
58604
- }
58762
+ handleMoveInputMode({
58763
+ key,
58764
+ widgets,
58765
+ selectedIndex,
58766
+ onUpdate,
58767
+ setSelectedIndex,
58768
+ setMoveMode
58769
+ });
58770
+ return;
58605
58771
  }
58772
+ handleNormalInputMode({
58773
+ input,
58774
+ key,
58775
+ widgets,
58776
+ selectedIndex,
58777
+ separatorChars,
58778
+ onBack,
58779
+ onUpdate,
58780
+ setSelectedIndex,
58781
+ setMoveMode,
58782
+ setShowClearConfirm,
58783
+ openWidgetPicker,
58784
+ getVisibleCustomKeybinds,
58785
+ setCustomEditorWidget
58786
+ });
58606
58787
  });
58607
58788
  const getWidgetDisplay = (widget) => {
58608
58789
  if (widget.type === "separator") {
@@ -58622,7 +58803,7 @@ var ItemsEditor = ({ widgets, onUpdate, onBack, lineNumber, settings }) => {
58622
58803
  };
58623
58804
  const hasFlexSeparator = widgets.some((widget) => widget.type === "flex-separator");
58624
58805
  const widthDetectionAvailable = canDetectTerminalWidth();
58625
- const pickerCategories = widgetPicker ? getFilteredCategories(widgetPicker.categoryQuery) : [];
58806
+ const pickerCategories = widgetPicker ? [...widgetCategories] : [];
58626
58807
  const selectedPickerCategory = widgetPicker ? widgetPicker.selectedCategory && pickerCategories.includes(widgetPicker.selectedCategory) ? widgetPicker.selectedCategory : pickerCategories[0] ?? null : null;
58627
58808
  const topLevelSearchEntries = widgetPicker && widgetPicker.level === "category" && widgetPicker.categoryQuery.trim().length > 0 ? filterWidgetCatalog(widgetCatalog, "All", widgetPicker.categoryQuery) : [];
58628
58809
  const selectedTopLevelSearchEntry = widgetPicker ? topLevelSearchEntries.find((entry) => entry.type === widgetPicker.selectedType) ?? topLevelSearchEntries[0] : null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccstatusline",
3
- "version": "2.1.5",
3
+ "version": "2.1.6",
4
4
  "description": "A customizable status line formatter for Claude Code CLI",
5
5
  "module": "src/ccstatusline.ts",
6
6
  "type": "module",