@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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +279 -0
  3. package/dist/ansi/codes.d.ts +33 -0
  4. package/dist/ansi/codes.d.ts.map +1 -0
  5. package/dist/ansi/codes.js +54 -0
  6. package/dist/ansi/codes.js.map +1 -0
  7. package/dist/ansi/detect.d.ts +36 -0
  8. package/dist/ansi/detect.d.ts.map +1 -0
  9. package/dist/ansi/detect.js +82 -0
  10. package/dist/ansi/detect.js.map +1 -0
  11. package/dist/ansi/downsample.d.ts +22 -0
  12. package/dist/ansi/downsample.d.ts.map +1 -0
  13. package/dist/ansi/downsample.js +126 -0
  14. package/dist/ansi/downsample.js.map +1 -0
  15. package/dist/index.d.ts +26 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +23 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/plugin.d.ts +18 -0
  20. package/dist/plugin.d.ts.map +1 -0
  21. package/dist/plugin.js +63 -0
  22. package/dist/plugin.js.map +1 -0
  23. package/dist/primitives/box.d.ts +23 -0
  24. package/dist/primitives/box.d.ts.map +1 -0
  25. package/dist/primitives/box.js +76 -0
  26. package/dist/primitives/box.js.map +1 -0
  27. package/dist/primitives/columns.d.ts +15 -0
  28. package/dist/primitives/columns.d.ts.map +1 -0
  29. package/dist/primitives/columns.js +37 -0
  30. package/dist/primitives/columns.js.map +1 -0
  31. package/dist/primitives/join.d.ts +32 -0
  32. package/dist/primitives/join.d.ts.map +1 -0
  33. package/dist/primitives/join.js +89 -0
  34. package/dist/primitives/join.js.map +1 -0
  35. package/dist/primitives/list.d.ts +22 -0
  36. package/dist/primitives/list.d.ts.map +1 -0
  37. package/dist/primitives/list.js +25 -0
  38. package/dist/primitives/list.js.map +1 -0
  39. package/dist/primitives/styled.d.ts +28 -0
  40. package/dist/primitives/styled.d.ts.map +1 -0
  41. package/dist/primitives/styled.js +59 -0
  42. package/dist/primitives/styled.js.map +1 -0
  43. package/dist/primitives/table.d.ts +19 -0
  44. package/dist/primitives/table.d.ts.map +1 -0
  45. package/dist/primitives/table.js +50 -0
  46. package/dist/primitives/table.js.map +1 -0
  47. package/dist/primitives/wrap.d.ts +10 -0
  48. package/dist/primitives/wrap.d.ts.map +1 -0
  49. package/dist/primitives/wrap.js +69 -0
  50. package/dist/primitives/wrap.js.map +1 -0
  51. package/dist/render.d.ts +8 -0
  52. package/dist/render.d.ts.map +1 -0
  53. package/dist/render.js +219 -0
  54. package/dist/render.js.map +1 -0
  55. package/dist/theme.d.ts +12 -0
  56. package/dist/theme.d.ts.map +1 -0
  57. package/dist/theme.js +45 -0
  58. package/dist/theme.js.map +1 -0
  59. package/dist/types.d.ts +60 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. 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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"}
@@ -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"}
@@ -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"}