ccstatusline 2.2.11 → 2.2.12

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
@@ -47,17 +47,20 @@
47
47
 
48
48
  ## 🆕 Recent Updates
49
49
 
50
- ### v2.2.9 - v2.2.11 - GitLab support, reset timers, context, compaction, and git widgets
50
+ ### v2.2.9 - v2.2.12 - GitLab support, reset timers, context, compaction, and git widgets
51
51
 
52
52
  - **🦊 GitLab PR/MR support** - `Git Branch` and `Git PR/MR` now support GitHub, GitLab, and compatible self-hosted remotes, using `gh` or `glab` as appropriate.
53
53
  - **🔄 Status line refresh interval** - Installed configs can set Claude Code's `statusLine.refreshInterval` from the TUI when Claude Code >=2.1.97 supports it.
54
54
  - **🧭 Wrap-around TUI navigation** - Menu/list navigation and move/reorder modes now wrap at the first and last items.
55
55
  - **📋 Clone widget shortcut** - Press `k` in the item editor to duplicate the selected widget, with fresh Powerline background color for cloned Powerline items.
56
56
  - **📊 Short bar display modes** - Context percentage, Context Bar, Session Usage, Weekly Usage, Block Timer, and reset timer widgets can use compact bar variants.
57
+ - **⏱️ Usage time cursor** - Session Usage and Weekly Usage progress bars can show the elapsed time position within the current usage window.
57
58
  - **🕒 Reset timer timestamps** - Block and Weekly Reset Timer widgets can show exact reset timestamps with compact formatting, 12/24-hour display, IANA time zones, and locale selection.
58
59
  - **🪟 Context Window widget** - Added a `Context Window` widget for total model window size, keeping `Context Length` focused on current context usage.
59
60
  - **🔁 Compaction Counter widget** - Added a `Compaction Counter` widget that tracks session context compactions, with icon/text/number formats, optional Nerd Font icon, and hide-when-zero behavior.
60
61
  - **🧮 Git file status widgets** - Added `Git Staged Files`, `Git Unstaged Files`, `Git Untracked Files`, and `Git Clean Status` for file counts and clean/dirty state.
62
+ - **🏷️ Clear context percentage labels** - `Context %` and `Context % (usable)` now label rendered values as used or left when toggling used/remaining mode.
63
+ - **⚡ More Powerline caps** - The Powerline separator editor now supports more than three start/end caps.
61
64
  - **🧠 Thinking Effort updates** - Added `xhigh`, show `default` when no effort is set, mark unknown future effort levels with `?`, and track live status JSON plus `/effort` command changes.
62
65
  - **🧮 More accurate token counts** - Streaming duplicate JSONL entries are deduped so token widgets do not overcount live Claude Code output.
63
66
  - **🏷️ Cleaner model display** - The Model widget strips trailing context suffixes like `(1M context)`; use `Context Window` when you want the total window size shown.
@@ -56136,7 +56136,7 @@ function getTerminalWidth() {
56136
56136
  function canDetectTerminalWidth() {
56137
56137
  return probeTerminalWidth() !== null;
56138
56138
  }
56139
- var __dirname = "/Users/sirmalloc/Projects/Personal/ccstatusline/src/utils", PACKAGE_VERSION = "2.2.11";
56139
+ var __dirname = "/Users/sirmalloc/Projects/Personal/ccstatusline/src/utils", PACKAGE_VERSION = "2.2.12";
56140
56140
  var init_terminal = () => {};
56141
56141
 
56142
56142
  // src/utils/renderer.ts
@@ -57127,11 +57127,21 @@ function isUsageProgressMode(mode) {
57127
57127
  function isUsageSliderMode(mode) {
57128
57128
  return mode === "slider" || mode === "slider-only";
57129
57129
  }
57130
- function makeSliderBar(percent, width = SLIDER_WIDTH) {
57130
+ function makeSliderBar(percent, width = SLIDER_WIDTH, options) {
57131
57131
  const clamped = Math.max(0, Math.min(100, percent));
57132
57132
  const filled = Math.round(clamped / 100 * width);
57133
- const empty = width - filled;
57134
- return "▓".repeat(filled) + "".repeat(empty);
57133
+ const cursorPos = options?.cursorPercent !== undefined ? Math.min(Math.floor(Math.max(0, Math.min(100, options.cursorPercent)) / 100 * width), width - 1) : -1;
57134
+ let bar = "";
57135
+ for (let i = 0;i < width; i++) {
57136
+ if (i === cursorPos) {
57137
+ bar += "│";
57138
+ } else if (i < filled) {
57139
+ bar += "▓";
57140
+ } else {
57141
+ bar += "░";
57142
+ }
57143
+ }
57144
+ return bar;
57135
57145
  }
57136
57146
  function getUsageProgressBarWidth(mode) {
57137
57147
  return mode === "progress" ? 32 : 16;
@@ -57142,6 +57152,12 @@ function isUsageInverted(item) {
57142
57152
  function isUsageCompact(item) {
57143
57153
  return isMetadataFlagEnabled(item, "compact");
57144
57154
  }
57155
+ function isUsageCursorEnabled(item) {
57156
+ return isMetadataFlagEnabled(item, "cursor");
57157
+ }
57158
+ function toggleUsageCursor(item) {
57159
+ return toggleMetadataFlag(item, "cursor");
57160
+ }
57145
57161
  function isUsageDateMode(item) {
57146
57162
  return isMetadataFlagEnabled(item, "absolute");
57147
57163
  }
@@ -57213,6 +57229,9 @@ function getUsageDisplayModifierText(item, options = {}) {
57213
57229
  if (isUsageInverted(item)) {
57214
57230
  modifiers.push("inverted");
57215
57231
  }
57232
+ if (isUsageCursorEnabled(item) && (isUsageProgressMode(mode) || isUsageSliderMode(mode))) {
57233
+ modifiers.push("time cursor");
57234
+ }
57216
57235
  if (options.includeCompact && !isUsageProgressMode(mode) && isUsageCompact(item)) {
57217
57236
  modifiers.push("compact");
57218
57237
  }
@@ -57240,7 +57259,8 @@ function cycleUsageDisplayMode(item, disabledInProgressKeys = [], includeSlider
57240
57259
  } else {
57241
57260
  nextMode = currentMode === "time" ? "progress" : currentMode === "progress" ? "progress-short" : "time";
57242
57261
  }
57243
- const nextItem = removeMetadataKeys(item, nextMode === "time" ? ["invert"] : disabledInProgressKeys);
57262
+ const keysToRemove = nextMode === "time" ? ["invert", "cursor"] : disabledInProgressKeys;
57263
+ const nextItem = removeMetadataKeys(item, keysToRemove);
57244
57264
  const nextMetadata = {
57245
57265
  ...nextItem.metadata ?? {},
57246
57266
  display: nextMode
@@ -57260,6 +57280,9 @@ function getUsagePercentCustomKeybinds(item) {
57260
57280
  if (isUsageProgressMode(mode) || isUsageSliderMode(mode)) {
57261
57281
  keybinds.push(INVERT_TOGGLE_KEYBIND);
57262
57282
  }
57283
+ if (isUsageProgressMode(mode) || isUsageSliderMode(mode)) {
57284
+ keybinds.push(CURSOR_TOGGLE_KEYBIND);
57285
+ }
57263
57286
  }
57264
57287
  return keybinds;
57265
57288
  }
@@ -57286,12 +57309,13 @@ function getUsageTimerCustomKeybinds(item, options = {}) {
57286
57309
  }
57287
57310
  return keybinds;
57288
57311
  }
57289
- var SLIDER_WIDTH = 10, PROGRESS_TOGGLE_KEYBIND, INVERT_TOGGLE_KEYBIND, COMPACT_TOGGLE_KEYBIND, DATE_TOGGLE_KEYBIND, HOUR_FORMAT_TOGGLE_KEYBIND, TIMEZONE_KEYBIND, LOCALE_KEYBIND;
57312
+ var SLIDER_WIDTH = 10, PROGRESS_TOGGLE_KEYBIND, INVERT_TOGGLE_KEYBIND, COMPACT_TOGGLE_KEYBIND, CURSOR_TOGGLE_KEYBIND, DATE_TOGGLE_KEYBIND, HOUR_FORMAT_TOGGLE_KEYBIND, TIMEZONE_KEYBIND, LOCALE_KEYBIND;
57290
57313
  var init_usage_display = __esm(() => {
57291
57314
  init_locales2();
57292
57315
  PROGRESS_TOGGLE_KEYBIND = { key: "p", label: "(p)rogress toggle", action: "toggle-progress" };
57293
57316
  INVERT_TOGGLE_KEYBIND = { key: "v", label: "in(v)ert fill", action: "toggle-invert" };
57294
57317
  COMPACT_TOGGLE_KEYBIND = { key: "s", label: "(s)hort time", action: "toggle-compact" };
57318
+ CURSOR_TOGGLE_KEYBIND = { key: "t", label: "(t)ime cursor", action: "toggle-cursor" };
57295
57319
  DATE_TOGGLE_KEYBIND = { key: "t", label: "(t)imestamp", action: "toggle-date" };
57296
57320
  HOUR_FORMAT_TOGGLE_KEYBIND = { key: "h", label: "12/24 (h)our", action: "toggle-hour-format" };
57297
57321
  TIMEZONE_KEYBIND = { key: "z", label: "time(z)one", action: "edit-timezone" };
@@ -57386,23 +57410,19 @@ class ContextPercentageWidget {
57386
57410
  }
57387
57411
  render(item, context, settings) {
57388
57412
  const isInverse = isContextInverse(item);
57413
+ const label = isInverse ? "Ctx Left: " : "Ctx Used: ";
57389
57414
  const sliderMode = getContextSliderMode(item);
57390
57415
  const contextPercentageMetrics = calculateContextPercentageMetrics(context);
57416
+ const formatContextPercentage = (displayPercentage) => {
57417
+ const sliderResult = renderContextSlider(sliderMode, displayPercentage);
57418
+ return formatRawOrLabeledValue(item, label, sliderResult ?? `${displayPercentage.toFixed(1)}%`);
57419
+ };
57391
57420
  if (context.isPreview) {
57392
- const previewPercent = isInverse ? 90.7 : 9.3;
57393
- const sliderResult = renderContextSlider(sliderMode, previewPercent);
57394
- if (sliderResult !== null) {
57395
- return formatRawOrLabeledValue(item, "Ctx: ", sliderResult);
57396
- }
57397
- return formatRawOrLabeledValue(item, "Ctx: ", `${previewPercent.toFixed(1)}%`);
57421
+ return formatContextPercentage(isInverse ? 90.7 : 9.3);
57398
57422
  }
57399
57423
  if (contextPercentageMetrics !== null) {
57400
57424
  const displayPercentage = isInverse ? 100 - contextPercentageMetrics.usedPercentage : contextPercentageMetrics.usedPercentage;
57401
- const sliderResult = renderContextSlider(sliderMode, displayPercentage);
57402
- if (sliderResult !== null) {
57403
- return formatRawOrLabeledValue(item, "Ctx: ", sliderResult);
57404
- }
57405
- return formatRawOrLabeledValue(item, "Ctx: ", `${displayPercentage.toFixed(1)}%`);
57425
+ return formatContextPercentage(displayPercentage);
57406
57426
  }
57407
57427
  return null;
57408
57428
  }
@@ -57457,35 +57477,27 @@ class ContextPercentageUsableWidget {
57457
57477
  }
57458
57478
  render(item, context, settings) {
57459
57479
  const isInverse = isContextInverse(item);
57480
+ const label = isInverse ? "Ctx(u) Left: " : "Ctx(u) Used: ";
57460
57481
  const sliderMode = getContextSliderMode(item);
57461
57482
  const modelIdentifier = getModelContextIdentifier(context.data?.model);
57462
57483
  const contextWindowMetrics = getContextWindowMetrics(context.data);
57463
57484
  const contextConfig = getContextConfig(modelIdentifier, contextWindowMetrics.windowSize);
57485
+ const formatContextPercentage = (displayPercentage) => {
57486
+ const sliderResult = renderContextSlider(sliderMode, displayPercentage);
57487
+ return formatRawOrLabeledValue(item, label, sliderResult ?? `${displayPercentage.toFixed(1)}%`);
57488
+ };
57464
57489
  if (context.isPreview) {
57465
- const previewPercent = isInverse ? 88.4 : 11.6;
57466
- const sliderResult = renderContextSlider(sliderMode, previewPercent);
57467
- if (sliderResult !== null) {
57468
- return formatRawOrLabeledValue(item, "Ctx(u): ", sliderResult);
57469
- }
57470
- return formatRawOrLabeledValue(item, "Ctx(u): ", `${previewPercent.toFixed(1)}%`);
57490
+ return formatContextPercentage(isInverse ? 88.4 : 11.6);
57471
57491
  }
57472
57492
  if (contextWindowMetrics.contextLengthTokens !== null) {
57473
57493
  const usedPercentage = Math.min(100, contextWindowMetrics.contextLengthTokens / contextConfig.usableTokens * 100);
57474
57494
  const displayPercentage = isInverse ? 100 - usedPercentage : usedPercentage;
57475
- const sliderResult = renderContextSlider(sliderMode, displayPercentage);
57476
- if (sliderResult !== null) {
57477
- return formatRawOrLabeledValue(item, "Ctx(u): ", sliderResult);
57478
- }
57479
- return formatRawOrLabeledValue(item, "Ctx(u): ", `${displayPercentage.toFixed(1)}%`);
57495
+ return formatContextPercentage(displayPercentage);
57480
57496
  }
57481
57497
  if (context.tokenMetrics) {
57482
57498
  const usedPercentage = Math.min(100, context.tokenMetrics.contextLength / contextConfig.usableTokens * 100);
57483
57499
  const displayPercentage = isInverse ? 100 - usedPercentage : usedPercentage;
57484
- const sliderResult = renderContextSlider(sliderMode, displayPercentage);
57485
- if (sliderResult !== null) {
57486
- return formatRawOrLabeledValue(item, "Ctx(u): ", sliderResult);
57487
- }
57488
- return formatRawOrLabeledValue(item, "Ctx(u): ", `${displayPercentage.toFixed(1)}%`);
57500
+ return formatContextPercentage(displayPercentage);
57489
57501
  }
57490
57502
  return null;
57491
57503
  }
@@ -64181,6 +64193,24 @@ class SessionNameWidget {
64181
64193
  }
64182
64194
  var init_SessionName = () => {};
64183
64195
 
64196
+ // src/widgets/shared/progress-bar.ts
64197
+ function makeTimerProgressBar2(percent, width, options) {
64198
+ const clampedPercent = Math.max(0, Math.min(100, percent));
64199
+ const filledWidth = Math.round(clampedPercent / 100 * width);
64200
+ const cursorPos = options?.cursorPercent !== undefined ? Math.min(Math.floor(Math.max(0, Math.min(100, options.cursorPercent)) / 100 * width), width - 1) : -1;
64201
+ let bar = "";
64202
+ for (let i = 0;i < width; i++) {
64203
+ if (i === cursorPos) {
64204
+ bar += "│";
64205
+ } else if (i < filledWidth) {
64206
+ bar += "█";
64207
+ } else {
64208
+ bar += "░";
64209
+ }
64210
+ }
64211
+ return bar;
64212
+ }
64213
+
64184
64214
  // src/widgets/SessionUsage.ts
64185
64215
  class SessionUsageWidget {
64186
64216
  getDefaultColor() {
@@ -64208,21 +64238,26 @@ class SessionUsageWidget {
64208
64238
  if (action === "toggle-invert") {
64209
64239
  return toggleUsageInverted(item);
64210
64240
  }
64241
+ if (action === "toggle-cursor") {
64242
+ return toggleUsageCursor(item);
64243
+ }
64211
64244
  return null;
64212
64245
  }
64213
64246
  render(item, context, settings) {
64214
64247
  const displayMode = getUsageDisplayMode(item);
64215
64248
  const inverted = isUsageInverted(item);
64249
+ const showCursor = isUsageCursorEnabled(item);
64216
64250
  if (context.isPreview) {
64217
64251
  const previewPercent = 20;
64218
64252
  const renderedPercent2 = inverted ? 100 - previewPercent : previewPercent;
64219
64253
  if (isUsageProgressMode(displayMode)) {
64220
64254
  const width = getUsageProgressBarWidth(displayMode);
64221
- const progressDisplay = `${makeUsageProgressBar(renderedPercent2, width)} ${renderedPercent2.toFixed(1)}%`;
64255
+ const progressBar = makeTimerProgressBar2(renderedPercent2, width, showCursor ? { cursorPercent: 50 } : undefined);
64256
+ const progressDisplay = `[${progressBar}] ${renderedPercent2.toFixed(1)}%`;
64222
64257
  return formatRawOrLabeledValue(item, "Session: ", progressDisplay);
64223
64258
  }
64224
64259
  if (isUsageSliderMode(displayMode)) {
64225
- const slider = makeSliderBar(renderedPercent2);
64260
+ const slider = makeSliderBar(renderedPercent2, undefined, showCursor ? { cursorPercent: 50 } : undefined);
64226
64261
  const sliderDisplay = displayMode === "slider" ? `${slider} ${renderedPercent2.toFixed(1)}%` : slider;
64227
64262
  return formatRawOrLabeledValue(item, "Session: ", sliderDisplay);
64228
64263
  }
@@ -64235,13 +64270,21 @@ class SessionUsageWidget {
64235
64270
  return null;
64236
64271
  const percent = Math.max(0, Math.min(100, data.sessionUsage));
64237
64272
  const renderedPercent = inverted ? 100 - percent : percent;
64273
+ const getCursorOptions = () => {
64274
+ if (!showCursor) {
64275
+ return;
64276
+ }
64277
+ const window2 = resolveUsageWindowWithFallback(data, context.blockMetrics);
64278
+ return window2 ? { cursorPercent: window2.elapsedPercent } : undefined;
64279
+ };
64238
64280
  if (isUsageProgressMode(displayMode)) {
64239
64281
  const width = getUsageProgressBarWidth(displayMode);
64240
- const progressDisplay = `${makeUsageProgressBar(renderedPercent, width)} ${renderedPercent.toFixed(1)}%`;
64282
+ const progressBar = makeTimerProgressBar2(renderedPercent, width, getCursorOptions());
64283
+ const progressDisplay = `[${progressBar}] ${renderedPercent.toFixed(1)}%`;
64241
64284
  return formatRawOrLabeledValue(item, "Session: ", progressDisplay);
64242
64285
  }
64243
64286
  if (isUsageSliderMode(displayMode)) {
64244
- const slider = makeSliderBar(renderedPercent);
64287
+ const slider = makeSliderBar(renderedPercent, undefined, getCursorOptions());
64245
64288
  const sliderDisplay = displayMode === "slider" ? `${slider} ${renderedPercent.toFixed(1)}%` : slider;
64246
64289
  return formatRawOrLabeledValue(item, "Session: ", sliderDisplay);
64247
64290
  }
@@ -64289,21 +64332,26 @@ class WeeklyUsageWidget {
64289
64332
  if (action === "toggle-invert") {
64290
64333
  return toggleUsageInverted(item);
64291
64334
  }
64335
+ if (action === "toggle-cursor") {
64336
+ return toggleUsageCursor(item);
64337
+ }
64292
64338
  return null;
64293
64339
  }
64294
64340
  render(item, context, settings) {
64295
64341
  const displayMode = getUsageDisplayMode(item);
64296
64342
  const inverted = isUsageInverted(item);
64343
+ const showCursor = isUsageCursorEnabled(item);
64297
64344
  if (context.isPreview) {
64298
64345
  const previewPercent = 12;
64299
64346
  const renderedPercent2 = inverted ? 100 - previewPercent : previewPercent;
64300
64347
  if (isUsageProgressMode(displayMode)) {
64301
64348
  const width = getUsageProgressBarWidth(displayMode);
64302
- const progressDisplay = `${makeUsageProgressBar(renderedPercent2, width)} ${renderedPercent2.toFixed(1)}%`;
64349
+ const progressBar = makeTimerProgressBar2(renderedPercent2, width, showCursor ? { cursorPercent: 50 } : undefined);
64350
+ const progressDisplay = `[${progressBar}] ${renderedPercent2.toFixed(1)}%`;
64303
64351
  return formatRawOrLabeledValue(item, "Weekly: ", progressDisplay);
64304
64352
  }
64305
64353
  if (isUsageSliderMode(displayMode)) {
64306
- const slider = makeSliderBar(renderedPercent2);
64354
+ const slider = makeSliderBar(renderedPercent2, undefined, showCursor ? { cursorPercent: 50 } : undefined);
64307
64355
  const sliderDisplay = displayMode === "slider" ? `${slider} ${renderedPercent2.toFixed(1)}%` : slider;
64308
64356
  return formatRawOrLabeledValue(item, "Weekly: ", sliderDisplay);
64309
64357
  }
@@ -64316,13 +64364,21 @@ class WeeklyUsageWidget {
64316
64364
  return null;
64317
64365
  const percent = Math.max(0, Math.min(100, data.weeklyUsage));
64318
64366
  const renderedPercent = inverted ? 100 - percent : percent;
64367
+ const getCursorOptions = () => {
64368
+ if (!showCursor) {
64369
+ return;
64370
+ }
64371
+ const window2 = resolveWeeklyUsageWindow(data);
64372
+ return window2 ? { cursorPercent: window2.elapsedPercent } : undefined;
64373
+ };
64319
64374
  if (isUsageProgressMode(displayMode)) {
64320
64375
  const width = getUsageProgressBarWidth(displayMode);
64321
- const progressDisplay = `${makeUsageProgressBar(renderedPercent, width)} ${renderedPercent.toFixed(1)}%`;
64376
+ const progressBar = makeTimerProgressBar2(renderedPercent, width, getCursorOptions());
64377
+ const progressDisplay = `[${progressBar}] ${renderedPercent.toFixed(1)}%`;
64322
64378
  return formatRawOrLabeledValue(item, "Weekly: ", progressDisplay);
64323
64379
  }
64324
64380
  if (isUsageSliderMode(displayMode)) {
64325
- const slider = makeSliderBar(renderedPercent);
64381
+ const slider = makeSliderBar(renderedPercent, undefined, getCursorOptions());
64326
64382
  const sliderDisplay = displayMode === "slider" ? `${slider} ${renderedPercent.toFixed(1)}%` : slider;
64327
64383
  return formatRawOrLabeledValue(item, "Weekly: ", sliderDisplay);
64328
64384
  }
@@ -64795,7 +64851,7 @@ var init_timezone_editor = __esm(async () => {
64795
64851
  });
64796
64852
 
64797
64853
  // src/widgets/BlockResetTimer.ts
64798
- function makeTimerProgressBar2(percent, width) {
64854
+ function makeTimerProgressBar3(percent, width) {
64799
64855
  const clampedPercent = Math.max(0, Math.min(100, percent));
64800
64856
  const filledWidth = Math.floor(clampedPercent / 100 * width);
64801
64857
  const emptyWidth = width - filledWidth;
@@ -64848,7 +64904,7 @@ class BlockResetTimerWidget {
64848
64904
  const previewPercent = inverted ? 90 : 10;
64849
64905
  if (isUsageProgressMode(displayMode)) {
64850
64906
  const barWidth = getUsageProgressBarWidth(displayMode);
64851
- const progressBar = makeTimerProgressBar2(previewPercent, barWidth);
64907
+ const progressBar = makeTimerProgressBar3(previewPercent, barWidth);
64852
64908
  return formatRawOrLabeledValue(item, "Reset ", `[${progressBar}] ${previewPercent.toFixed(1)}%`);
64853
64909
  }
64854
64910
  if (dateMode) {
@@ -64868,7 +64924,7 @@ class BlockResetTimerWidget {
64868
64924
  if (isUsageProgressMode(displayMode)) {
64869
64925
  const barWidth = getUsageProgressBarWidth(displayMode);
64870
64926
  const percent = inverted ? window2.remainingPercent : window2.elapsedPercent;
64871
- const progressBar = makeTimerProgressBar2(percent, barWidth);
64927
+ const progressBar = makeTimerProgressBar3(percent, barWidth);
64872
64928
  const percentage = percent.toFixed(1);
64873
64929
  return formatRawOrLabeledValue(item, "Reset ", `[${progressBar}] ${percentage}%`);
64874
64930
  }
@@ -64918,7 +64974,7 @@ var init_BlockResetTimer = __esm(async () => {
64918
64974
  });
64919
64975
 
64920
64976
  // src/widgets/WeeklyResetTimer.ts
64921
- function makeTimerProgressBar3(percent, width) {
64977
+ function makeTimerProgressBar4(percent, width) {
64922
64978
  const clampedPercent = Math.max(0, Math.min(100, percent));
64923
64979
  const filledWidth = Math.floor(clampedPercent / 100 * width);
64924
64980
  const emptyWidth = width - filledWidth;
@@ -65016,7 +65072,7 @@ class WeeklyResetTimerWidget {
65016
65072
  const previewPercent = inverted ? 90 : 10;
65017
65073
  if (isUsageProgressMode(displayMode)) {
65018
65074
  const barWidth = getUsageProgressBarWidth(displayMode);
65019
- const progressBar = makeTimerProgressBar3(previewPercent, barWidth);
65075
+ const progressBar = makeTimerProgressBar4(previewPercent, barWidth);
65020
65076
  return formatRawOrLabeledValue(item, "Weekly Reset ", `[${progressBar}] ${previewPercent.toFixed(1)}%`);
65021
65077
  }
65022
65078
  if (dateMode) {
@@ -65036,7 +65092,7 @@ class WeeklyResetTimerWidget {
65036
65092
  if (isUsageProgressMode(displayMode)) {
65037
65093
  const barWidth = getUsageProgressBarWidth(displayMode);
65038
65094
  const percent = inverted ? window2.remainingPercent : window2.elapsedPercent;
65039
- const progressBar = makeTimerProgressBar3(percent, barWidth);
65095
+ const progressBar = makeTimerProgressBar4(percent, barWidth);
65040
65096
  const percentage = percent.toFixed(1);
65041
65097
  return formatRawOrLabeledValue(item, "Weekly Reset ", `[${progressBar}] ${percentage}%`);
65042
65098
  }
@@ -70855,7 +70911,7 @@ var PowerlineSeparatorEditor = ({
70855
70911
  newInvertBgs[selectedIndex] = isLeftFacing;
70856
70912
  }
70857
70913
  updateSeparators(newSeparators, mode === "separator" ? newInvertBgs : undefined);
70858
- } else if ((input === "a" || input === "A") && (mode === "separator" || separators.length < 3)) {
70914
+ } else if (input === "a" || input === "A") {
70859
70915
  const newSeparators = [...separators];
70860
70916
  const newInvertBgs = mode === "separator" ? [...invertBgs] : [];
70861
70917
  const defaultChar = presetSeparators[0]?.char ?? "";
@@ -70875,7 +70931,7 @@ var PowerlineSeparatorEditor = ({
70875
70931
  updateSeparators(newSeparators, newInvertBgs);
70876
70932
  setSelectedIndex(selectedIndex + 1);
70877
70933
  }
70878
- } else if ((input === "i" || input === "I") && (mode === "separator" || separators.length < 3)) {
70934
+ } else if (input === "i" || input === "I") {
70879
70935
  const newSeparators = [...separators];
70880
70936
  const newInvertBgs = mode === "separator" ? [...invertBgs] : [];
70881
70937
  const defaultChar = presetSeparators[0]?.char ?? "";
@@ -70927,7 +70983,6 @@ var PowerlineSeparatorEditor = ({
70927
70983
  return "Powerline End Cap Configuration";
70928
70984
  }
70929
70985
  };
70930
- const canAdd = mode === "separator" || separators.length < 3;
70931
70986
  const canDelete = mode !== "separator" || separators.length > 1;
70932
70987
  return /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Box_default, {
70933
70988
  flexDirection: "column",
@@ -70979,7 +71034,7 @@ var PowerlineSeparatorEditor = ({
70979
71034
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Box_default, {
70980
71035
  children: /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Text, {
70981
71036
  dimColor: true,
70982
- children: `↑↓ select, ← → cycle${canAdd ? ", (a)dd, (i)nsert" : ""}${canDelete ? ", (d)elete" : ""}, (c)lear, (h)ex${mode === "separator" ? ", (t)oggle invert" : ""}, ESC back`
71037
+ children: `↑↓ select, ← → cycle, (a)dd, (i)nsert${canDelete ? ", (d)elete" : ""}, (c)lear, (h)ex${mode === "separator" ? ", (t)oggle invert" : ""}, ESC back`
70983
71038
  }, undefined, false, undefined, this)
70984
71039
  }, undefined, false, undefined, this),
70985
71040
  /* @__PURE__ */ jsx_dev_runtime18.jsxDEV(Box_default, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccstatusline",
3
- "version": "2.2.11",
3
+ "version": "2.2.12",
4
4
  "description": "A customizable status line formatter for Claude Code CLI",
5
5
  "module": "src/ccstatusline.ts",
6
6
  "type": "module",