Skip to content

Commit d2016b8

Browse files
committed
feat: add groupSpacing option to group multi select
Adds a `groupSpacing` option. If set to something more than `0`, it adds spacing between the groups.
1 parent d8a10da commit d2016b8

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@clack/prompts": minor
3+
---
4+
5+
Added `groupSpacing` to control spacing between multi select groups.

packages/prompts/src/index.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,10 @@ export interface GroupMultiSelectOptions<Value> {
462462
initialValues?: Value[];
463463
required?: boolean;
464464
cursorAt?: Value;
465+
groupSpacing?: number;
465466
}
466467
export const groupMultiselect = <Value>(opts: GroupMultiSelectOptions<Value>) => {
468+
const { groupSpacing = 0 } = opts;
467469
const opt = (
468470
option: Option<Value>,
469471
state:
@@ -482,33 +484,35 @@ export const groupMultiselect = <Value>(opts: GroupMultiSelectOptions<Value>) =>
482484
const next = isItem && (options[options.indexOf(option) + 1] ?? { group: true });
483485
const isLast = isItem && (next as any).group === true;
484486
const prefix = isItem ? `${isLast ? S_BAR_END : S_BAR} ` : '';
487+
const spacingPrefix =
488+
groupSpacing > 0 && !isItem ? `\n${color.cyan(S_BAR)} `.repeat(groupSpacing) : '';
485489

486490
if (state === 'active') {
487-
return `${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${
491+
return `${spacingPrefix}${color.dim(prefix)}${color.cyan(S_CHECKBOX_ACTIVE)} ${label} ${
488492
option.hint ? color.dim(`(${option.hint})`) : ''
489493
}`;
490494
}
491495
if (state === 'group-active') {
492-
return `${prefix}${color.cyan(S_CHECKBOX_ACTIVE)} ${color.dim(label)}`;
496+
return `${spacingPrefix}${prefix}${color.cyan(S_CHECKBOX_ACTIVE)} ${color.dim(label)}`;
493497
}
494498
if (state === 'group-active-selected') {
495-
return `${prefix}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`;
499+
return `${spacingPrefix}${prefix}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`;
496500
}
497501
if (state === 'selected') {
498-
return `${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`;
502+
return `${spacingPrefix}${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${color.dim(label)}`;
499503
}
500504
if (state === 'cancelled') {
501505
return `${color.strikethrough(color.dim(label))}`;
502506
}
503507
if (state === 'active-selected') {
504-
return `${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${label} ${
508+
return `${spacingPrefix}${color.dim(prefix)}${color.green(S_CHECKBOX_SELECTED)} ${label} ${
505509
option.hint ? color.dim(`(${option.hint})`) : ''
506510
}`;
507511
}
508512
if (state === 'submitted') {
509513
return `${color.dim(label)}`;
510514
}
511-
return `${color.dim(prefix)}${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`;
515+
return `${spacingPrefix}${color.dim(prefix)}${color.dim(S_CHECKBOX_INACTIVE)} ${color.dim(label)}`;
512516
};
513517

514518
return new GroupMultiSelectPrompt({

0 commit comments

Comments
 (0)