@runa-cmd/help 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +279 -0
- package/dist/ansi/codes.d.ts +33 -0
- package/dist/ansi/codes.d.ts.map +1 -0
- package/dist/ansi/codes.js +54 -0
- package/dist/ansi/codes.js.map +1 -0
- package/dist/ansi/detect.d.ts +36 -0
- package/dist/ansi/detect.d.ts.map +1 -0
- package/dist/ansi/detect.js +82 -0
- package/dist/ansi/detect.js.map +1 -0
- package/dist/ansi/downsample.d.ts +22 -0
- package/dist/ansi/downsample.d.ts.map +1 -0
- package/dist/ansi/downsample.js +126 -0
- package/dist/ansi/downsample.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +18 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +63 -0
- package/dist/plugin.js.map +1 -0
- package/dist/primitives/box.d.ts +23 -0
- package/dist/primitives/box.d.ts.map +1 -0
- package/dist/primitives/box.js +76 -0
- package/dist/primitives/box.js.map +1 -0
- package/dist/primitives/columns.d.ts +15 -0
- package/dist/primitives/columns.d.ts.map +1 -0
- package/dist/primitives/columns.js +37 -0
- package/dist/primitives/columns.js.map +1 -0
- package/dist/primitives/join.d.ts +32 -0
- package/dist/primitives/join.d.ts.map +1 -0
- package/dist/primitives/join.js +89 -0
- package/dist/primitives/join.js.map +1 -0
- package/dist/primitives/list.d.ts +22 -0
- package/dist/primitives/list.d.ts.map +1 -0
- package/dist/primitives/list.js +25 -0
- package/dist/primitives/list.js.map +1 -0
- package/dist/primitives/styled.d.ts +28 -0
- package/dist/primitives/styled.d.ts.map +1 -0
- package/dist/primitives/styled.js +59 -0
- package/dist/primitives/styled.js.map +1 -0
- package/dist/primitives/table.d.ts +19 -0
- package/dist/primitives/table.d.ts.map +1 -0
- package/dist/primitives/table.js +50 -0
- package/dist/primitives/table.js.map +1 -0
- package/dist/primitives/wrap.d.ts +10 -0
- package/dist/primitives/wrap.d.ts.map +1 -0
- package/dist/primitives/wrap.js +69 -0
- package/dist/primitives/wrap.js.map +1 -0
- package/dist/render.d.ts +8 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +219 -0
- package/dist/render.js.map +1 -0
- package/dist/theme.d.ts +12 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +45 -0
- package/dist/theme.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downsample.js","sourceRoot":"","sources":["../../src/ansi/downsample.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — Public API
|
|
3
|
+
*
|
|
4
|
+
* Barrel re-exports for the Runa help system.
|
|
5
|
+
* Layout primitives are independent and usable standalone.
|
|
6
|
+
*/
|
|
7
|
+
export { bold, dim, fg, italic, reset, strip, underline, visibleWidth } from './ansi/codes.js';
|
|
8
|
+
export { detectColorDepth, detectTermWidth, getRenderContext, resetRenderContext, } from './ansi/detect.js';
|
|
9
|
+
export { downsampleColor } from './ansi/downsample.js';
|
|
10
|
+
export { helpPlugin } from './plugin.js';
|
|
11
|
+
export type { BorderStyle, BoxOptions } from './primitives/box.js';
|
|
12
|
+
export { box } from './primitives/box.js';
|
|
13
|
+
export type { ColumnsOptions } from './primitives/columns.js';
|
|
14
|
+
export { columns } from './primitives/columns.js';
|
|
15
|
+
export type { HorizontalAlign, HorizontalJoinOptions, VerticalJoinOptions, } from './primitives/join.js';
|
|
16
|
+
export { join } from './primitives/join.js';
|
|
17
|
+
export type { ListOptions } from './primitives/list.js';
|
|
18
|
+
export { list } from './primitives/list.js';
|
|
19
|
+
export type { StyledOptions } from './primitives/styled.js';
|
|
20
|
+
export { styled } from './primitives/styled.js';
|
|
21
|
+
export type { TableOptions } from './primitives/table.js';
|
|
22
|
+
export { table } from './primitives/table.js';
|
|
23
|
+
export { defaultRenderer } from './render.js';
|
|
24
|
+
export { defaultTheme, resolveTheme } from './theme.js';
|
|
25
|
+
export type { Block, ColorDepth, HelpPluginOptions, RenderContext, RenderFnCtx, ResolvedTheme, Theme, } from './types.js';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,YAAY,EACX,eAAe,EACf,qBAAqB,EACrB,mBAAmB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGxD,YAAY,EACX,KAAK,EACL,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,GACL,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — Public API
|
|
3
|
+
*
|
|
4
|
+
* Barrel re-exports for the Runa help system.
|
|
5
|
+
* Layout primitives are independent and usable standalone.
|
|
6
|
+
*/
|
|
7
|
+
// ─── ANSI utilities ─────────────────────────────────────────
|
|
8
|
+
export { bold, dim, fg, italic, reset, strip, underline, visibleWidth } from './ansi/codes.js';
|
|
9
|
+
export { detectColorDepth, detectTermWidth, getRenderContext, resetRenderContext, } from './ansi/detect.js';
|
|
10
|
+
export { downsampleColor } from './ansi/downsample.js';
|
|
11
|
+
// ─── Plugin ─────────────────────────────────────────────────
|
|
12
|
+
export { helpPlugin } from './plugin.js';
|
|
13
|
+
// ─── Layout Primitives ──────────────────────────────────────
|
|
14
|
+
export { box } from './primitives/box.js';
|
|
15
|
+
export { columns } from './primitives/columns.js';
|
|
16
|
+
export { join } from './primitives/join.js';
|
|
17
|
+
export { list } from './primitives/list.js';
|
|
18
|
+
export { styled } from './primitives/styled.js';
|
|
19
|
+
export { table } from './primitives/table.js';
|
|
20
|
+
// ─── Theme + Renderer ───────────────────────────────────────
|
|
21
|
+
export { defaultRenderer } from './render.js';
|
|
22
|
+
export { defaultTheme, resolveTheme } from './theme.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+DAA+D;AAC/D,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/F,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,+DAA+D;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,+DAA+D;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAMlD,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,+DAA+D;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — helpPlugin()
|
|
3
|
+
*
|
|
4
|
+
* A Runa plugin that adds --help/-h as a global option and renders
|
|
5
|
+
* help output when the flag is detected. Supports 3 layers:
|
|
6
|
+
* - Layer 1: Zero-config (beautiful help out of the box)
|
|
7
|
+
* - Layer 2: Theme customization (custom colors)
|
|
8
|
+
* - Layer 3: Custom render function (full control)
|
|
9
|
+
*/
|
|
10
|
+
import type { PluginConfig } from '@runa-cmd/core';
|
|
11
|
+
import type { HelpPluginOptions } from './types.js';
|
|
12
|
+
/**
|
|
13
|
+
* Create a help plugin that intercepts --help/-h and renders help output.
|
|
14
|
+
*
|
|
15
|
+
* @param opts - Optional theme or custom render function
|
|
16
|
+
*/
|
|
17
|
+
export declare function helpPlugin(opts?: HelpPluginOptions): PluginConfig;
|
|
18
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAyC,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM1F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,iBAAsB,GAAG,YAAY,CAyCrE"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { definePlugin } from '@runa-cmd/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getRenderContext } from './ansi/detect.js';
|
|
4
|
+
import { defaultRenderer } from './render.js';
|
|
5
|
+
import { resolveTheme } from './theme.js';
|
|
6
|
+
/**
|
|
7
|
+
* Create a help plugin that intercepts --help/-h and renders help output.
|
|
8
|
+
*
|
|
9
|
+
* @param opts - Optional theme or custom render function
|
|
10
|
+
*/
|
|
11
|
+
export function helpPlugin(opts = {}) {
|
|
12
|
+
return definePlugin({
|
|
13
|
+
meta: {
|
|
14
|
+
name: '@runa-cmd/help',
|
|
15
|
+
version: '0.1.0',
|
|
16
|
+
description: 'Built-in help system with layout primitives and theming',
|
|
17
|
+
},
|
|
18
|
+
capabilities: { addGlobalOptions: true },
|
|
19
|
+
setup(api) {
|
|
20
|
+
// Add --help, -h as a global boolean option
|
|
21
|
+
api.addGlobalOption('help', z.boolean().optional().default(false).describe('Show help'), {
|
|
22
|
+
alias: ['-h'],
|
|
23
|
+
});
|
|
24
|
+
// Intercept via onGlobalFlags hook
|
|
25
|
+
api.hook('onGlobalFlags', (ctx) => {
|
|
26
|
+
if (!ctx.globalOptions?.help)
|
|
27
|
+
return;
|
|
28
|
+
const schema = api.getSchema();
|
|
29
|
+
const renderCtx = getRenderContext();
|
|
30
|
+
const theme = resolveTheme(opts.theme, renderCtx);
|
|
31
|
+
// Detect active subcommand from rawArgs positionals
|
|
32
|
+
const target = resolveTarget(schema, ctx.rawArgs);
|
|
33
|
+
const renderer = opts.render ?? defaultRenderer;
|
|
34
|
+
const output = renderer({
|
|
35
|
+
schema: target,
|
|
36
|
+
theme,
|
|
37
|
+
colorDepth: renderCtx.colorDepth,
|
|
38
|
+
termWidth: renderCtx.termWidth,
|
|
39
|
+
});
|
|
40
|
+
process.stdout.write(`${output}\n`);
|
|
41
|
+
// Stop further lifecycle execution
|
|
42
|
+
ctx.shortCircuit?.();
|
|
43
|
+
process.exit(0);
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// ─── Internal Helpers ───────────────────────────────────────
|
|
49
|
+
/**
|
|
50
|
+
* Find the target schema for help rendering.
|
|
51
|
+
* Looks at rawArgs positionals to find a matching subcommand.
|
|
52
|
+
* Falls back to the root CLI schema if no match.
|
|
53
|
+
*/
|
|
54
|
+
function resolveTarget(schema, rawArgs) {
|
|
55
|
+
// Find first positional arg (not a flag)
|
|
56
|
+
const subName = rawArgs.find((a) => !a.startsWith('-'));
|
|
57
|
+
if (!subName)
|
|
58
|
+
return schema;
|
|
59
|
+
// Search top-level commands
|
|
60
|
+
const match = schema.commands.find((cmd) => cmd.name === subName);
|
|
61
|
+
return match ?? schema;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,OAA0B,EAAE;IACtD,OAAO,YAAY,CAAC;QACnB,IAAI,EAAE;YACL,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,yDAAyD;SACtE;QACD,YAAY,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;QACxC,KAAK,CAAC,GAAG;YACR,4CAA4C;YAC5C,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBACxF,KAAK,EAAE,CAAC,IAAI,CAAC;aACb,CAAC,CAAC;YAEH,mCAAmC;YACnC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,GAAgB,EAAE,EAAE;gBAC9C,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI;oBAAE,OAAO;gBAErC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAElD,oDAAoD;gBACpD,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;gBAElD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC;gBAChD,MAAM,MAAM,GAAG,QAAQ,CAAC;oBACvB,MAAM,EAAE,MAAM;oBACd,KAAK;oBACL,UAAU,EAAE,SAAS,CAAC,UAAU;oBAChC,SAAS,EAAE,SAAS,CAAC,SAAS;iBAC9B,CAAC,CAAC;gBAEH,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC;gBAEpC,mCAAmC;gBACnC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;gBACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,+DAA+D;AAE/D;;;;GAIG;AACH,SAAS,aAAa,CAAC,MAAiB,EAAE,OAAiB;IAC1D,yCAAyC;IACzC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC;IAE5B,4BAA4B;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAClE,OAAO,KAAK,IAAI,MAAM,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Block, RenderContext } from '../types.js';
|
|
2
|
+
export type BorderStyle = 'single' | 'double' | 'rounded' | 'none';
|
|
3
|
+
/** Options for box() */
|
|
4
|
+
export interface BoxOptions {
|
|
5
|
+
/** Content string to place inside the box */
|
|
6
|
+
content: string;
|
|
7
|
+
/** Border style (default: 'single') */
|
|
8
|
+
border?: BorderStyle;
|
|
9
|
+
/** Border color — hex or named (default: none) */
|
|
10
|
+
borderColor?: string;
|
|
11
|
+
/** Inner padding [vertical, horizontal] or [top, right, bottom, left] (default: [0, 1]) */
|
|
12
|
+
padding?: [number, number] | [number, number, number, number];
|
|
13
|
+
/** Fixed width (auto-fit to content if omitted) */
|
|
14
|
+
width?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Render a bordered box with optional padding and color.
|
|
18
|
+
*
|
|
19
|
+
* @param opts - Box options
|
|
20
|
+
* @param ctx - Optional RenderContext override
|
|
21
|
+
*/
|
|
22
|
+
export declare function box(opts: BoxOptions, ctx?: RenderContext): Block;
|
|
23
|
+
//# sourceMappingURL=box.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../src/primitives/box.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKxD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAkBnE,wBAAwB;AACxB,MAAM,WAAW,UAAU;IAC1B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2FAA2F;IAC3F,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,aAAa,GAAG,KAAK,CAmDhE"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — box() primitive
|
|
3
|
+
*
|
|
4
|
+
* Renders a bordered container with configurable border style,
|
|
5
|
+
* border color, padding, and optional width constraint.
|
|
6
|
+
* Content is word-wrapped to fit within the box.
|
|
7
|
+
*/
|
|
8
|
+
import { reset } from '../ansi/codes.js';
|
|
9
|
+
import { getRenderContext } from '../ansi/detect.js';
|
|
10
|
+
import { downsampleColor } from '../ansi/downsample.js';
|
|
11
|
+
import { wrapText } from './wrap.js';
|
|
12
|
+
const BORDERS = {
|
|
13
|
+
single: { tl: '┌', tr: '┐', bl: '└', br: '┘', h: '─', v: '│' },
|
|
14
|
+
double: { tl: '╔', tr: '╗', bl: '╚', br: '╝', h: '═', v: '║' },
|
|
15
|
+
rounded: { tl: '╭', tr: '╮', bl: '╰', br: '╯', h: '─', v: '│' },
|
|
16
|
+
none: { tl: ' ', tr: ' ', bl: ' ', br: ' ', h: ' ', v: ' ' },
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Render a bordered box with optional padding and color.
|
|
20
|
+
*
|
|
21
|
+
* @param opts - Box options
|
|
22
|
+
* @param ctx - Optional RenderContext override
|
|
23
|
+
*/
|
|
24
|
+
export function box(opts, ctx) {
|
|
25
|
+
const renderCtx = ctx ?? getRenderContext();
|
|
26
|
+
const border = opts.border ?? 'single';
|
|
27
|
+
const chars = BORDERS[border];
|
|
28
|
+
const [padTop, padRight, padBottom, padLeft] = normalizePadding(opts.padding ?? [0, 1]);
|
|
29
|
+
// Determine inner width
|
|
30
|
+
const borderWidth = 2; // left + right border chars
|
|
31
|
+
const hPadding = padLeft + padRight;
|
|
32
|
+
let innerWidth;
|
|
33
|
+
if (opts.width) {
|
|
34
|
+
innerWidth = opts.width - borderWidth - hPadding;
|
|
35
|
+
if (innerWidth < 1)
|
|
36
|
+
innerWidth = 1;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
// Auto-fit: find longest content line
|
|
40
|
+
const rawLines = opts.content.split('\n');
|
|
41
|
+
const maxContentWidth = rawLines.reduce((max, line) => Math.max(max, line.length), 0);
|
|
42
|
+
innerWidth = maxContentWidth;
|
|
43
|
+
}
|
|
44
|
+
// Word-wrap content to inner width
|
|
45
|
+
const wrappedLines = wrapText(opts.content, innerWidth);
|
|
46
|
+
// Pad each content line to full inner width
|
|
47
|
+
const contentLines = wrappedLines.map((line) => `${' '.repeat(padLeft)}${line.padEnd(innerWidth)}${' '.repeat(padRight)}`);
|
|
48
|
+
// Add vertical padding lines
|
|
49
|
+
const totalInner = innerWidth + hPadding;
|
|
50
|
+
const emptyLine = ' '.repeat(totalInner);
|
|
51
|
+
const topPadLines = Array.from({ length: padTop }, () => emptyLine);
|
|
52
|
+
const bottomPadLines = Array.from({ length: padBottom }, () => emptyLine);
|
|
53
|
+
const allContentLines = [...topPadLines, ...contentLines, ...bottomPadLines];
|
|
54
|
+
// Resolve border color
|
|
55
|
+
let colorAnsi = '';
|
|
56
|
+
let colorReset = '';
|
|
57
|
+
if (opts.borderColor) {
|
|
58
|
+
colorAnsi = downsampleColor(opts.borderColor, renderCtx.colorDepth);
|
|
59
|
+
if (colorAnsi)
|
|
60
|
+
colorReset = reset;
|
|
61
|
+
}
|
|
62
|
+
// Assemble the box
|
|
63
|
+
const bc = (ch) => (colorAnsi ? `${colorAnsi}${ch}${colorReset}` : ch);
|
|
64
|
+
const topBorder = `${bc(chars.tl)}${bc(chars.h.repeat(totalInner))}${bc(chars.tr)}`;
|
|
65
|
+
const bottomBorder = `${bc(chars.bl)}${bc(chars.h.repeat(totalInner))}${bc(chars.br)}`;
|
|
66
|
+
const bodyLines = allContentLines.map((line) => `${bc(chars.v)}${line}${bc(chars.v)}`);
|
|
67
|
+
return [topBorder, ...bodyLines, bottomBorder].join('\n');
|
|
68
|
+
}
|
|
69
|
+
// ─── Internal Helpers ───────────────────────────────────────
|
|
70
|
+
function normalizePadding(padding) {
|
|
71
|
+
if (padding.length === 4)
|
|
72
|
+
return padding;
|
|
73
|
+
const [v, h] = padding;
|
|
74
|
+
return [v, h, v, h];
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=box.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"box.js","sourceRoot":"","sources":["../../src/primitives/box.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Block, RenderContext } from '../types.js';
|
|
2
|
+
/** Options for columns() */
|
|
3
|
+
export interface ColumnsOptions {
|
|
4
|
+
/** Gap between columns in spaces (default: 2) */
|
|
5
|
+
gap?: number;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Render blocks as evenly-spaced columns across terminal width.
|
|
9
|
+
*
|
|
10
|
+
* @param blocks - Array of content blocks
|
|
11
|
+
* @param opts - Column options
|
|
12
|
+
* @param ctx - Optional RenderContext override
|
|
13
|
+
*/
|
|
14
|
+
export declare function columns(blocks: Block[], opts?: ColumnsOptions, ctx?: RenderContext): Block;
|
|
15
|
+
//# sourceMappingURL=columns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../src/primitives/columns.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIxD,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC9B,iDAAiD;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAE,cAAmB,EAAE,GAAG,CAAC,EAAE,aAAa,GAAG,KAAK,CAsB9F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — columns() primitive
|
|
3
|
+
*
|
|
4
|
+
* Distributes blocks evenly across terminal width with auto-calculated
|
|
5
|
+
* column widths and word-wrapping per column.
|
|
6
|
+
*/
|
|
7
|
+
import { getRenderContext } from '../ansi/detect.js';
|
|
8
|
+
import { join } from './join.js';
|
|
9
|
+
import { wrapText } from './wrap.js';
|
|
10
|
+
/**
|
|
11
|
+
* Render blocks as evenly-spaced columns across terminal width.
|
|
12
|
+
*
|
|
13
|
+
* @param blocks - Array of content blocks
|
|
14
|
+
* @param opts - Column options
|
|
15
|
+
* @param ctx - Optional RenderContext override
|
|
16
|
+
*/
|
|
17
|
+
export function columns(blocks, opts = {}, ctx) {
|
|
18
|
+
const renderCtx = ctx ?? getRenderContext();
|
|
19
|
+
const gap = opts.gap ?? 2;
|
|
20
|
+
const numCols = blocks.length;
|
|
21
|
+
if (numCols === 0)
|
|
22
|
+
return '';
|
|
23
|
+
if (numCols === 1)
|
|
24
|
+
return blocks[0];
|
|
25
|
+
// Calculate column width: (termWidth - gaps) / numCols
|
|
26
|
+
const totalGaps = gap * (numCols - 1);
|
|
27
|
+
const colWidth = Math.floor((renderCtx.termWidth - totalGaps) / numCols);
|
|
28
|
+
if (colWidth < 1) {
|
|
29
|
+
// Terminal too narrow for multi-column — stack vertically
|
|
30
|
+
return join.vertical(blocks, { gap: 1 });
|
|
31
|
+
}
|
|
32
|
+
// Word-wrap each block to column width
|
|
33
|
+
const wrappedBlocks = blocks.map((block) => wrapText(block, colWidth).join('\n'));
|
|
34
|
+
// Use horizontal join to place side-by-side
|
|
35
|
+
return join.horizontal(wrappedBlocks, { gap, align: 'top' });
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=columns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columns.js","sourceRoot":"","sources":["../../src/primitives/columns.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQrC;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,MAAe,EAAE,OAAuB,EAAE,EAAE,GAAmB;IACtF,MAAM,SAAS,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IAE9B,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAEpC,uDAAuD;IACvD,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC;IAEzE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClB,0DAA0D;QAC1D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,uCAAuC;IACvC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAElF,4CAA4C;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Block } from '../types.js';
|
|
2
|
+
export interface VerticalJoinOptions {
|
|
3
|
+
/** Number of blank lines between blocks (default: 0) */
|
|
4
|
+
gap?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Stack blocks top-to-bottom.
|
|
8
|
+
*
|
|
9
|
+
* @param blocks - Array of Blocks to stack
|
|
10
|
+
* @param opts - Options (gap between blocks)
|
|
11
|
+
*/
|
|
12
|
+
declare function vertical(blocks: Block[], opts?: VerticalJoinOptions): Block;
|
|
13
|
+
export type HorizontalAlign = 'top' | 'center' | 'bottom';
|
|
14
|
+
export interface HorizontalJoinOptions {
|
|
15
|
+
/** Space between columns (default: 1) */
|
|
16
|
+
gap?: number;
|
|
17
|
+
/** Vertical alignment of blocks (default: 'top') */
|
|
18
|
+
align?: HorizontalAlign;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Place blocks side-by-side with alignment.
|
|
22
|
+
*
|
|
23
|
+
* @param blocks - Array of Blocks to place horizontally
|
|
24
|
+
* @param opts - Options (gap, alignment)
|
|
25
|
+
*/
|
|
26
|
+
declare function horizontal(blocks: Block[], opts?: HorizontalJoinOptions): Block;
|
|
27
|
+
export declare const join: {
|
|
28
|
+
readonly vertical: typeof vertical;
|
|
29
|
+
readonly horizontal: typeof horizontal;
|
|
30
|
+
};
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=join.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.d.ts","sourceRoot":"","sources":["../../src/primitives/join.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIzC,MAAM,WAAW,mBAAmB;IACnC,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;;;;GAKG;AACH,iBAAS,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAE,mBAAwB,GAAG,KAAK,CAIxE;AAID,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACrC,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,KAAK,CAAC,EAAE,eAAe,CAAC;CACxB;AAED;;;;;GAKG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,GAAE,qBAA0B,GAAG,KAAK,CA0C5E;AAID,eAAO,MAAM,IAAI;;;CAGP,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — join primitive
|
|
3
|
+
*
|
|
4
|
+
* Compose blocks vertically (stacked) or horizontally (side-by-side).
|
|
5
|
+
* Returns a Block (string).
|
|
6
|
+
*/
|
|
7
|
+
import { visibleWidth } from '../ansi/codes.js';
|
|
8
|
+
/**
|
|
9
|
+
* Stack blocks top-to-bottom.
|
|
10
|
+
*
|
|
11
|
+
* @param blocks - Array of Blocks to stack
|
|
12
|
+
* @param opts - Options (gap between blocks)
|
|
13
|
+
*/
|
|
14
|
+
function vertical(blocks, opts = {}) {
|
|
15
|
+
const gap = opts.gap ?? 0;
|
|
16
|
+
const separator = '\n'.repeat(gap + 1);
|
|
17
|
+
return blocks.filter((b) => b !== '').join(separator);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Place blocks side-by-side with alignment.
|
|
21
|
+
*
|
|
22
|
+
* @param blocks - Array of Blocks to place horizontally
|
|
23
|
+
* @param opts - Options (gap, alignment)
|
|
24
|
+
*/
|
|
25
|
+
function horizontal(blocks, opts = {}) {
|
|
26
|
+
const gap = opts.gap ?? 1;
|
|
27
|
+
const align = opts.align ?? 'top';
|
|
28
|
+
if (blocks.length === 0)
|
|
29
|
+
return '';
|
|
30
|
+
if (blocks.length === 1)
|
|
31
|
+
return blocks[0];
|
|
32
|
+
// Split each block into lines
|
|
33
|
+
const blockLines = blocks.map((b) => b.split('\n'));
|
|
34
|
+
// Find max height
|
|
35
|
+
const maxHeight = blockLines.reduce((max, lines) => Math.max(max, lines.length), 0);
|
|
36
|
+
// Find the visible width of each block (max across its lines)
|
|
37
|
+
const blockWidths = blockLines.map((lines) => lines.reduce((max, line) => Math.max(max, visibleWidth(line)), 0));
|
|
38
|
+
// Pad each block to maxHeight according to alignment
|
|
39
|
+
const paddedBlocks = blockLines.map((lines) => padToHeight(lines, maxHeight, align));
|
|
40
|
+
// Zip line-by-line
|
|
41
|
+
const separator = ' '.repeat(gap);
|
|
42
|
+
const resultLines = [];
|
|
43
|
+
for (let row = 0; row < maxHeight; row++) {
|
|
44
|
+
const parts = [];
|
|
45
|
+
for (let col = 0; col < paddedBlocks.length; col++) {
|
|
46
|
+
const line = paddedBlocks[col][row] ?? '';
|
|
47
|
+
if (col < paddedBlocks.length - 1) {
|
|
48
|
+
// Pad line to block width so columns align
|
|
49
|
+
const padded = line + ' '.repeat(Math.max(0, blockWidths[col] - visibleWidth(line)));
|
|
50
|
+
parts.push(padded);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// Last column — no trailing padding
|
|
54
|
+
parts.push(line);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
resultLines.push(parts.join(separator));
|
|
58
|
+
}
|
|
59
|
+
return resultLines.join('\n');
|
|
60
|
+
}
|
|
61
|
+
// ─── Public API ─────────────────────────────────────────────
|
|
62
|
+
export const join = {
|
|
63
|
+
vertical,
|
|
64
|
+
horizontal,
|
|
65
|
+
};
|
|
66
|
+
// ─── Internal Helpers ───────────────────────────────────────
|
|
67
|
+
function padToHeight(lines, maxHeight, align) {
|
|
68
|
+
const padCount = maxHeight - lines.length;
|
|
69
|
+
if (padCount === 0)
|
|
70
|
+
return lines;
|
|
71
|
+
const emptyLine = '';
|
|
72
|
+
const padLines = Array.from({ length: padCount }, () => emptyLine);
|
|
73
|
+
switch (align) {
|
|
74
|
+
case 'top':
|
|
75
|
+
return [...lines, ...padLines];
|
|
76
|
+
case 'bottom':
|
|
77
|
+
return [...padLines, ...lines];
|
|
78
|
+
case 'center': {
|
|
79
|
+
const topPad = Math.floor(padCount / 2);
|
|
80
|
+
const bottomPad = padCount - topPad;
|
|
81
|
+
return [
|
|
82
|
+
...Array.from({ length: topPad }, () => emptyLine),
|
|
83
|
+
...lines,
|
|
84
|
+
...Array.from({ length: bottomPad }, () => emptyLine),
|
|
85
|
+
];
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=join.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join.js","sourceRoot":"","sources":["../../src/primitives/join.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — list() primitive
|
|
3
|
+
*
|
|
4
|
+
* Renders a bulleted list with configurable bullet and indent.
|
|
5
|
+
* Handles multi-line items with continuation line alignment.
|
|
6
|
+
*/
|
|
7
|
+
import type { Block } from '../types.js';
|
|
8
|
+
/** Options for list() */
|
|
9
|
+
export interface ListOptions {
|
|
10
|
+
/** Bullet character (default: '•') */
|
|
11
|
+
bullet?: string;
|
|
12
|
+
/** Left indent in spaces (default: 2) */
|
|
13
|
+
indent?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Render a bulleted list.
|
|
17
|
+
*
|
|
18
|
+
* @param items - Array of items (may contain newlines for multi-line items)
|
|
19
|
+
* @param opts - List options
|
|
20
|
+
*/
|
|
21
|
+
export declare function list(items: string[], opts?: ListOptions): Block;
|
|
22
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/primitives/list.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,yBAAyB;AACzB,MAAM,WAAW,WAAW;IAC3B,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE,WAAgB,GAAG,KAAK,CAqBnE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a bulleted list.
|
|
3
|
+
*
|
|
4
|
+
* @param items - Array of items (may contain newlines for multi-line items)
|
|
5
|
+
* @param opts - List options
|
|
6
|
+
*/
|
|
7
|
+
export function list(items, opts = {}) {
|
|
8
|
+
const bullet = opts.bullet ?? '•';
|
|
9
|
+
const indent = opts.indent ?? 2;
|
|
10
|
+
const indentStr = ' '.repeat(indent);
|
|
11
|
+
// Continuation lines align after "bullet " (bullet + 1 space)
|
|
12
|
+
const continuationIndent = ' '.repeat(indent + bullet.length + 1);
|
|
13
|
+
const resultLines = [];
|
|
14
|
+
for (const item of items) {
|
|
15
|
+
const lines = item.split('\n');
|
|
16
|
+
// First line: indent + bullet + space + text
|
|
17
|
+
resultLines.push(`${indentStr}${bullet} ${lines[0]}`);
|
|
18
|
+
// Continuation lines: aligned after bullet
|
|
19
|
+
for (let i = 1; i < lines.length; i++) {
|
|
20
|
+
resultLines.push(`${continuationIndent}${lines[i]}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return resultLines.join('\n');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/primitives/list.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,KAAe,EAAE,OAAoB,EAAE;IAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IAEhC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC,8DAA8D;IAC9D,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAElE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,6CAA6C;QAC7C,WAAW,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,2CAA2C;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,WAAW,CAAC,IAAI,CAAC,GAAG,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Block, RenderContext } from '../types.js';
|
|
2
|
+
/** Options for styled() */
|
|
3
|
+
export interface StyledOptions {
|
|
4
|
+
/** Apply bold */
|
|
5
|
+
bold?: boolean;
|
|
6
|
+
/** Apply dim */
|
|
7
|
+
dim?: boolean;
|
|
8
|
+
/** Apply italic */
|
|
9
|
+
italic?: boolean;
|
|
10
|
+
/** Apply underline */
|
|
11
|
+
underline?: boolean;
|
|
12
|
+
/** Foreground color — hex (#RRGGBB) or named ANSI ('red', 'dim', etc.) */
|
|
13
|
+
color?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Padding as spaces.
|
|
16
|
+
* [vertical, horizontal] or [top, right, bottom, left]
|
|
17
|
+
*/
|
|
18
|
+
padding?: [number, number] | [number, number, number, number];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Apply text styles, color, and padding.
|
|
22
|
+
*
|
|
23
|
+
* @param text - The text to style
|
|
24
|
+
* @param opts - Styling options
|
|
25
|
+
* @param ctx - Optional RenderContext override (uses lazy singleton if omitted)
|
|
26
|
+
*/
|
|
27
|
+
export declare function styled(text: string, opts?: StyledOptions, ctx?: RenderContext): Block;
|
|
28
|
+
//# sourceMappingURL=styled.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styled.d.ts","sourceRoot":"","sources":["../../src/primitives/styled.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAExD,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC7B,iBAAiB;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gBAAgB;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,mBAAmB;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9D;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,EAAE,GAAG,CAAC,EAAE,aAAa,GAAG,KAAK,CAoCzF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @runa-cmd/help — styled() primitive
|
|
3
|
+
*
|
|
4
|
+
* Apply text styles (bold, dim, italic, underline), foreground color, and padding.
|
|
5
|
+
* Returns a Block (string). Does NOT word-wrap — that's the caller's responsibility.
|
|
6
|
+
*/
|
|
7
|
+
import { bold, dim, fg, italic, underline } from '../ansi/codes.js';
|
|
8
|
+
import { getRenderContext } from '../ansi/detect.js';
|
|
9
|
+
import { downsampleColor } from '../ansi/downsample.js';
|
|
10
|
+
/**
|
|
11
|
+
* Apply text styles, color, and padding.
|
|
12
|
+
*
|
|
13
|
+
* @param text - The text to style
|
|
14
|
+
* @param opts - Styling options
|
|
15
|
+
* @param ctx - Optional RenderContext override (uses lazy singleton if omitted)
|
|
16
|
+
*/
|
|
17
|
+
export function styled(text, opts = {}, ctx) {
|
|
18
|
+
const renderCtx = ctx ?? getRenderContext();
|
|
19
|
+
let result = text;
|
|
20
|
+
// Apply color first (innermost)
|
|
21
|
+
if (opts.color) {
|
|
22
|
+
const ansiColor = downsampleColor(opts.color, renderCtx.colorDepth);
|
|
23
|
+
result = fg(result, ansiColor);
|
|
24
|
+
}
|
|
25
|
+
// Apply styles in consistent order: bold → dim → italic → underline
|
|
26
|
+
if (opts.bold)
|
|
27
|
+
result = bold(result);
|
|
28
|
+
if (opts.dim)
|
|
29
|
+
result = dim(result);
|
|
30
|
+
if (opts.italic)
|
|
31
|
+
result = italic(result);
|
|
32
|
+
if (opts.underline)
|
|
33
|
+
result = underline(result);
|
|
34
|
+
// Apply padding
|
|
35
|
+
if (opts.padding) {
|
|
36
|
+
const [top, right, bottom, left] = normalizePadding(opts.padding);
|
|
37
|
+
const hPad = ' '.repeat(left);
|
|
38
|
+
const hPadRight = ' '.repeat(right);
|
|
39
|
+
// Split into lines to apply padding per-line
|
|
40
|
+
const lines = result.split('\n');
|
|
41
|
+
const paddedLines = lines.map((line) => `${hPad}${line}${hPadRight}`);
|
|
42
|
+
// Add vertical padding (empty lines of same width)
|
|
43
|
+
const lineWidth = hPad.length + hPadRight.length;
|
|
44
|
+
const emptyLine = ' '.repeat(lineWidth);
|
|
45
|
+
const topLines = Array.from({ length: top }, () => emptyLine);
|
|
46
|
+
const bottomLines = Array.from({ length: bottom }, () => emptyLine);
|
|
47
|
+
result = [...topLines, ...paddedLines, ...bottomLines].join('\n');
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
// ─── Internal Helpers ───────────────────────────────────────
|
|
52
|
+
function normalizePadding(padding) {
|
|
53
|
+
if (padding.length === 4) {
|
|
54
|
+
return padding;
|
|
55
|
+
}
|
|
56
|
+
const [v, h] = padding;
|
|
57
|
+
return [v, h, v, h];
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=styled.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styled.js","sourceRoot":"","sources":["../../src/primitives/styled.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAsBxD;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,OAAsB,EAAE,EAAE,GAAmB;IACjF,MAAM,SAAS,GAAG,GAAG,IAAI,gBAAgB,EAAE,CAAC;IAC5C,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,gCAAgC;IAChC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACpE,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;IAED,oEAAoE;IACpE,IAAI,IAAI,CAAC,IAAI;QAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,GAAG;QAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,SAAS;QAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAE/C,gBAAgB;IAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEpC,6CAA6C;QAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC,CAAC;QAEtE,mDAAmD;QACnD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QACjD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAEpE,MAAM,GAAG,CAAC,GAAG,QAAQ,EAAE,GAAG,WAAW,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED,+DAA+D;AAE/D,SAAS,gBAAgB,CACxB,OAA4D;IAE5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC;IACvB,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACrB,CAAC"}
|