@boba-cli/chapstick 0.1.0-alpha.2
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 +166 -0
- package/dist/index.cjs +719 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +348 -0
- package/dist/index.d.ts +348 -0
- package/dist/index.js +698 -0
- package/dist/index.js.map +1 -0
- package/package.json +46 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/borders.ts","../src/colors.ts","../src/measure.ts","../src/style.ts","../src/provider.ts","../src/join.ts"],"names":["stringWidth","width","truncateLine"],"mappings":"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","file":"index.js","sourcesContent":["import type { BorderStyle } from './types.js'\n\n/**\n * Name of a border style.\n * @public\n */\nexport type BorderStyleName = 'normal' | 'rounded' | 'bold' | 'double'\n\n/**\n * Predefined border styles matching common terminal box characters.\n * @public\n */\nexport const borderStyles: Record<BorderStyleName, BorderStyle> = {\n normal: {\n top: '─',\n bottom: '─',\n left: '│',\n right: '│',\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n },\n rounded: {\n top: '─',\n bottom: '─',\n left: '│',\n right: '│',\n topLeft: '╭',\n topRight: '╮',\n bottomLeft: '╰',\n bottomRight: '╯',\n },\n bold: {\n top: '━',\n bottom: '━',\n left: '┃',\n right: '┃',\n topLeft: '┏',\n topRight: '┓',\n bottomLeft: '┗',\n bottomRight: '┛',\n },\n double: {\n top: '═',\n bottom: '═',\n left: '║',\n right: '║',\n topLeft: '╔',\n topRight: '╗',\n bottomLeft: '╚',\n bottomRight: '╝',\n },\n}\n\n/**\n * Default border style (single line).\n * @public\n */\nexport const defaultBorderStyle: BorderStyle = borderStyles.normal\n","import type {\n ColorSupport,\n EnvironmentAdapter,\n TerminalBackground,\n} from '@boba-cli/machine'\nimport type { ColorInput } from './types.js'\n\n// Re-export types from machine for convenience\nexport type { ColorSupport, TerminalBackground }\n\n/**\n * Detect terminal color support levels using an environment adapter.\n * @param env - Environment adapter to query color support\n * @returns Color support information\n * @public\n */\nexport function getColorSupport(env: EnvironmentAdapter): ColorSupport {\n return env.getColorSupport()\n}\n\n/**\n * Detect whether the terminal is using a dark or light background.\n * @param env - Environment adapter to query terminal background\n * @returns Terminal background mode\n * @public\n */\nexport function getTerminalBackground(env: EnvironmentAdapter): TerminalBackground {\n return env.getTerminalBackground()\n}\n\n/**\n * Check if the terminal appears to be using a dark background.\n * Returns true if dark or unknown (dark is a safer default for contrast).\n * @param env - Environment adapter to query terminal background\n * @returns True if the terminal is likely using a dark background\n */\nfunction isDarkTerminal(env: EnvironmentAdapter): boolean {\n const bg = getTerminalBackground(env)\n // Default to dark when unknown - it's more common and safer for contrast\n return bg !== 'light'\n}\n\n/**\n * Resolve a color input (string or adaptive light/dark) to a hex string when available.\n * @param input - Color input to resolve\n * @param env - Environment adapter for detecting terminal background\n * @returns Resolved color string or undefined\n * @public\n */\nexport function resolveColor(\n input: ColorInput | undefined,\n env: EnvironmentAdapter,\n): string | undefined {\n if (!input) {\n return undefined\n }\n if (typeof input === 'string') {\n return input\n }\n const preferDark = isDarkTerminal(env)\n return preferDark ? (input.dark ?? input.light) : (input.light ?? input.dark)\n}\n","import stringWidth from 'string-width'\n\n// Try to import from terminal-reflowjs, fall back to local implementations\nlet reflowTruncate: ((s: string, width: number) => string) | undefined\nlet reflowWordwrap: ((s: string, limit: number) => string) | undefined\n\ntry {\n // Dynamic import would be cleaner but requires async\n // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment\n const reflowjs: Record<string, unknown> = require('terminal-reflowjs')\n if (typeof reflowjs.truncate === 'function') {\n reflowTruncate = reflowjs.truncate as (s: string, width: number) => string\n }\n if (typeof reflowjs.wordwrap === 'function') {\n reflowWordwrap = reflowjs.wordwrap as (s: string, limit: number) => string\n }\n} catch {\n // terminal-reflowjs not available, will use fallback implementations\n}\n\n/**\n * Compute ANSI-aware display width.\n * @public\n */\nexport function width(text: string): number {\n return stringWidth(String(text ?? ''))\n}\n\n/**\n * Truncate a single line to maxWidth, ANSI-aware.\n */\nfunction truncateLine(line: string, maxWidth: number): string {\n if (width(line) <= maxWidth) {\n return line\n }\n\n // Character-by-character truncation for proper ANSI handling\n let acc = ''\n let inAnsi = false\n\n for (const ch of line) {\n if (ch === '\\x1b') {\n inAnsi = true\n acc += ch\n continue\n }\n\n if (inAnsi) {\n acc += ch\n // ANSI sequences end with a letter\n if (/[a-zA-Z]/.test(ch)) {\n inAnsi = false\n }\n continue\n }\n\n const nextWidth = width(acc + ch)\n if (nextWidth > maxWidth) {\n break\n }\n acc += ch\n }\n\n return acc\n}\n\n/**\n * Truncate text to a maximum width per line, ANSI-aware.\n * @public\n */\nexport function clampWidth(text: string, maxWidth?: number): string {\n if (!maxWidth || maxWidth < 1) {\n return text\n }\n\n if (reflowTruncate) {\n return text\n .split('\\n')\n .map((line) => reflowTruncate(line, maxWidth))\n .join('\\n')\n }\n\n // Fallback implementation\n return text\n .split('\\n')\n .map((line) => truncateLine(line, maxWidth))\n .join('\\n')\n}\n\n/**\n * Simple word wrap implementation.\n * Wraps at word boundaries (spaces).\n */\nfunction simpleWordwrap(text: string, maxWidth: number): string {\n const lines = text.split('\\n')\n const result: string[] = []\n\n for (const line of lines) {\n if (width(line) <= maxWidth) {\n result.push(line)\n continue\n }\n\n const words = line.split(/(\\s+)/)\n let currentLine = ''\n\n for (const word of words) {\n if (!word) continue\n\n const testLine = currentLine + word\n\n if (width(testLine) <= maxWidth) {\n currentLine = testLine\n } else {\n if (currentLine.trim()) {\n result.push(currentLine.trimEnd())\n }\n // If the word itself is longer than maxWidth, we need to break it\n if (width(word.trim()) > maxWidth) {\n let remaining = word.trim()\n while (width(remaining) > maxWidth) {\n const truncated = truncateLine(remaining, maxWidth)\n result.push(truncated)\n remaining = remaining.slice(truncated.length)\n }\n currentLine = remaining\n } else {\n currentLine = word.trimStart()\n }\n }\n }\n\n if (currentLine.trim()) {\n result.push(currentLine.trimEnd())\n }\n }\n\n return result.join('\\n')\n}\n\n/**\n * Wrap text to a maximum width, ANSI-aware.\n * @public\n */\nexport function wrapWidth(text: string, maxWidth?: number): string {\n if (!maxWidth || maxWidth < 1) {\n return text\n }\n\n if (reflowWordwrap) {\n return reflowWordwrap(text, maxWidth)\n }\n\n // Fallback implementation\n return simpleWordwrap(text, maxWidth)\n}\n\n/**\n * Pad every line with left/right spaces.\n * @public\n */\nexport function padLines(text: string, left = 0, right = 0): string {\n if (left === 0 && right === 0) {\n return text\n }\n const padLeft = ' '.repeat(Math.max(0, left))\n const padRight = ' '.repeat(Math.max(0, right))\n return text\n .split('\\n')\n .map((line) => `${padLeft}${line}${padRight}`)\n .join('\\n')\n}\n","import type { ColorSupport, EnvironmentAdapter, StyleFn } from '@boba-cli/machine'\nimport { createStyle } from '@boba-cli/machine'\nimport { defaultBorderStyle } from './borders.js'\nimport { resolveColor } from './colors.js'\nimport { clampWidth, width as textWidth, wrapWidth } from './measure.js'\nimport type {\n BorderStyle,\n ColorInput,\n HAlign,\n Spacing,\n StyleOptions,\n VAlign,\n} from './types.js'\n\ntype PaddingInput = number | Partial<Spacing>\ntype MarginInput = number | Partial<Spacing>\n\n/**\n * Keys that can be explicitly set on a style.\n * Used to track which properties have been set vs using defaults.\n * @public\n */\nexport type StyleKey = keyof StyleOptions\n\n/**\n * Context required for rendering styles.\n * @public\n */\nexport interface StyleContext {\n /** Environment adapter for detecting terminal capabilities. */\n readonly env: EnvironmentAdapter\n /** Style function for applying ANSI styling. */\n readonly styleFn: StyleFn\n}\n\n// Lazy-initialized default context for layout-only styling (no colors)\nlet defaultContext: StyleContext | undefined\n\n/**\n * Create a default StyleContext for layout-only styling (no ANSI colors).\n * This is used internally when no context is provided.\n * @public\n */\nexport function createDefaultContext(): StyleContext {\n if (!defaultContext) {\n const noColors: ColorSupport = { level: 0, hasBasic: false, has256: false, has16m: false }\n const noopEnv: EnvironmentAdapter = {\n get: () => undefined,\n getColorSupport: () => noColors,\n getTerminalBackground: () => 'unknown',\n }\n defaultContext = {\n env: noopEnv,\n styleFn: createStyle(noColors),\n }\n }\n return defaultContext\n}\n\n/**\n * Set the default StyleContext used when no context is explicitly provided.\n * This is useful for browser environments (xterm.js) where colors should always be enabled.\n * @param context - The context to use as default, or undefined to reset to no-colors default\n * @public\n */\nexport function setDefaultContext(context: StyleContext | undefined): void {\n defaultContext = context\n}\n\n/**\n * Fluent style builder for terminal strings.\n * @public\n */\nexport class Style {\n private readonly options: StyleOptions\n /** Track which properties have been explicitly set */\n private readonly setKeys: Set<StyleKey>\n /** Optional context for rendering - if not set, rendering will throw */\n private readonly context?: StyleContext\n\n constructor(\n options: StyleOptions = {},\n setKeys?: Set<StyleKey>,\n context?: StyleContext,\n ) {\n this.options = { ...options }\n this.setKeys = setKeys\n ? new Set(setKeys)\n : new Set(Object.keys(options) as StyleKey[])\n this.context = context\n }\n\n /**\n * Create a deep copy of this style.\n */\n copy(): Style {\n return new Style(structuredClone(this.options), new Set(this.setKeys), this.context)\n }\n\n /**\n * Create a copy of this style with a new context.\n * @param context - The new context to use for rendering\n */\n withContext(context: StyleContext): Style {\n return new Style(this.options, this.setKeys, context)\n }\n\n /**\n * Inherit unset properties from another style.\n * Only copies properties that are set in `other` but not set in `this`.\n * Margins and padding are NOT inherited (matching Go Lip Gloss behavior).\n */\n inherit(other: Style): Style {\n const newOptions = { ...this.options }\n const newSetKeys = new Set(this.setKeys)\n\n // Keys that should not be inherited\n const noInherit: StyleKey[] = ['padding', 'margin']\n\n for (const key of other.setKeys) {\n // Skip padding and margin - they are not inherited\n if (noInherit.includes(key)) continue\n\n // Only copy if not already set in this style\n if (!this.setKeys.has(key)) {\n ;(newOptions as Record<string, unknown>)[key] = structuredClone(\n (other.options as Record<string, unknown>)[key],\n )\n newSetKeys.add(key)\n }\n }\n\n return new Style(newOptions, newSetKeys, this.context)\n }\n\n /**\n * Check if a property has been explicitly set.\n */\n isSet(key: StyleKey): boolean {\n return this.setKeys.has(key)\n }\n\n /**\n * Unset a property, reverting to default behavior.\n */\n unset(...keys: StyleKey[]): Style {\n const newOptions = { ...this.options }\n const newSetKeys = new Set(this.setKeys)\n for (const key of keys) {\n delete (newOptions as Record<string, unknown>)[key]\n newSetKeys.delete(key)\n }\n return new Style(newOptions, newSetKeys, this.context)\n }\n\n foreground(color: ColorInput): Style {\n return this.with({ foreground: color })\n }\n\n background(color: ColorInput): Style {\n return this.with({ background: color })\n }\n\n bold(value = true): Style {\n return this.with({ bold: value })\n }\n\n italic(value = true): Style {\n return this.with({ italic: value })\n }\n\n underline(value = true): Style {\n return this.with({ underline: value })\n }\n\n strikethrough(value = true): Style {\n return this.with({ strikethrough: value })\n }\n\n padding(all: number): Style\n padding(vertical: number, horizontal: number): Style\n padding(top: number, right: number, bottom: number, left: number): Style\n padding(\n input: PaddingInput,\n right?: number,\n bottom?: number,\n left?: number,\n ): Style {\n const next = normalizeSpacing(input, right, bottom, left)\n return this.with({ padding: { ...this.options.padding, ...next } })\n }\n\n margin(all: number): Style\n margin(vertical: number, horizontal: number): Style\n margin(top: number, right: number, bottom: number, left: number): Style\n margin(\n input: MarginInput,\n right?: number,\n bottom?: number,\n left?: number,\n ): Style {\n const next = normalizeSpacing(input, right, bottom, left)\n return this.with({ margin: { ...this.options.margin, ...next } })\n }\n\n width(value: number): Style {\n return this.with({ width: value })\n }\n\n height(value: number): Style {\n return this.with({ height: value })\n }\n\n maxWidth(value: number): Style {\n return this.with({ maxWidth: value })\n }\n\n maxHeight(value: number): Style {\n return this.with({ maxHeight: value })\n }\n\n /**\n * Enable borders with the default or specified style.\n * Use borderStyle() to change the border characters without re-enabling.\n */\n border(enabled: boolean): Style\n border(style: BorderStyle): Style\n border(arg: boolean | BorderStyle = true): Style {\n if (typeof arg === 'boolean') {\n if (arg) {\n // Enable borders with current or default style\n return this.with({\n borderStyle: this.options.borderStyle ?? defaultBorderStyle,\n })\n } else {\n // Disable borders by unsetting borderStyle and borderColor\n return this.unset('borderStyle', 'borderColor')\n }\n }\n return this.with({ borderStyle: arg })\n }\n\n /**\n * Set the border style characters.\n */\n borderStyle(style: BorderStyle): Style {\n return this.with({ borderStyle: style })\n }\n\n /**\n * Set the border foreground color.\n */\n borderForeground(color: ColorInput): Style {\n return this.with({ borderColor: color })\n }\n\n /**\n * Set horizontal alignment.\n * @deprecated Use alignHorizontal() instead.\n */\n align(value: HAlign): Style {\n return this.alignHorizontal(value)\n }\n\n /**\n * Set horizontal alignment (left, center, right).\n */\n alignHorizontal(value: HAlign): Style {\n return this.with({ alignHorizontal: value })\n }\n\n /**\n * Set vertical alignment (top, center, bottom).\n * Only applies when height is set.\n */\n alignVertical(value: VAlign): Style {\n return this.with({ alignVertical: value })\n }\n\n /**\n * Enable inline mode. When true:\n * - Newlines are stripped from the input\n * - Padding and margins are not applied\n */\n inline(value = true): Style {\n return this.with({ inline: value })\n }\n\n /**\n * Render the style to a string.\n * Uses the default no-op context if none was provided.\n */\n render(text: string): string {\n const ctx = this.context ?? createDefaultContext()\n return this.renderWithContext(text, ctx)\n }\n\n /**\n * Render the style to a string with an explicit context.\n * @param text - Text to render\n * @param ctx - Context for rendering\n */\n renderWithContext(text: string, ctx: StyleContext): string {\n const opts = this.options\n const isInline = opts.inline ?? false\n\n // In inline mode, strip newlines first\n let content = text ?? ''\n if (isInline) {\n content = content.replace(/\\r?\\n/g, '')\n }\n\n const targetWidth = opts.width ?? opts.maxWidth\n const hasBorder =\n opts.borderStyle !== undefined || this.setKeys.has('borderColor')\n\n // In inline mode, skip padding/margin\n const padding = isInline\n ? { top: 0, right: 0, bottom: 0, left: 0 }\n : normalizeSpacing(opts.padding ?? 0)\n const borderWidth = hasBorder ? 2 : 0\n const innerTargetWidth =\n targetWidth !== undefined\n ? Math.max(0, targetWidth - padding.left - padding.right - borderWidth)\n : undefined\n\n if (opts.maxWidth && innerTargetWidth !== undefined) {\n content = wrapWidth(content, innerTargetWidth)\n }\n if (opts.width && opts.width > 0 && innerTargetWidth !== undefined) {\n content = clampWidth(content, innerTargetWidth)\n }\n\n const lines: string[] = content.split('\\n')\n const aligned = alignLinesHorizontal(\n lines,\n opts.alignHorizontal,\n innerTargetWidth,\n )\n\n const padded = isInline ? aligned : applySpacing(aligned, padding)\n const borderStyle = opts.borderStyle ?? defaultBorderStyle\n const bordered = hasBorder\n ? applyBorder(padded, borderStyle, opts.borderColor, ctx)\n : padded\n\n // Apply height and vertical alignment\n const sized = applyHeight(\n bordered,\n opts.height,\n opts.maxHeight,\n opts.alignVertical,\n )\n const colored = applyTextStyle(sized, opts, ctx)\n\n // In inline mode, skip margin\n if (isInline) {\n return colored.join('')\n }\n\n const withMargin = applySpacing(\n colored,\n normalizeSpacing(opts.margin ?? 0),\n ).join('\\n')\n\n return withMargin\n }\n\n private with(patch: Partial<StyleOptions>): Style {\n const newSetKeys = new Set(this.setKeys)\n for (const key of Object.keys(patch) as StyleKey[]) {\n newSetKeys.add(key)\n }\n return new Style({ ...this.options, ...patch }, newSetKeys, this.context)\n }\n}\n\nfunction normalizeSpacing(\n input: PaddingInput,\n right?: number,\n bottom?: number,\n left?: number,\n): Spacing {\n if (typeof input === 'number') {\n const v = input\n if (right === undefined && bottom === undefined && left === undefined) {\n return { top: v, right: v, bottom: v, left: v }\n }\n if (right !== undefined && bottom === undefined && left === undefined) {\n return { top: v, right, bottom: v, left: right }\n }\n return {\n top: v,\n right: right ?? 0,\n bottom: bottom ?? 0,\n left: left ?? 0,\n }\n }\n return {\n top: input.top ?? 0,\n right: input.right ?? 0,\n bottom: input.bottom ?? 0,\n left: input.left ?? 0,\n }\n}\n\nfunction alignLinesHorizontal(\n lines: string[],\n align: HAlign | undefined,\n targetWidth?: number,\n): string[] {\n // When no width is specified and no alignment, return as-is\n if (!targetWidth && !align) {\n return lines\n }\n const maxLineWidth = lines.reduce(\n (acc, line) => Math.max(acc, textWidth(line)),\n 0,\n )\n const width = targetWidth ?? maxLineWidth\n // Default to left alignment when width is set but no alignment specified\n const effectiveAlign = align ?? 'left'\n return lines.map((line) => {\n const w = textWidth(line)\n const space = Math.max(0, width - w)\n switch (effectiveAlign) {\n case 'center': {\n const left = Math.floor(space / 2)\n const right = space - left\n return `${' '.repeat(left)}${line}${' '.repeat(right)}`\n }\n case 'right':\n return `${' '.repeat(space)}${line}`\n case 'left':\n default:\n return `${line}${' '.repeat(space)}`\n }\n })\n}\n\nfunction applySpacing(lines: string[], spacing: Spacing): string[] {\n const { top, right, bottom, left } = spacing\n const spaceLeft = ' '.repeat(Math.max(0, left))\n const spaceRight = ' '.repeat(Math.max(0, right))\n const spaced = lines.map((line) => `${spaceLeft}${line}${spaceRight}`)\n const maxWidth = spaced.reduce(\n (acc, line) => Math.max(acc, textWidth(line)),\n 0,\n )\n const empty = ' '.repeat(maxWidth)\n const withTop = Array.from({ length: Math.max(0, top) }, () => empty).concat(\n spaced,\n )\n return withTop.concat(\n Array.from({ length: Math.max(0, bottom) }, () => empty),\n )\n}\n\nfunction applyBorder(\n lines: string[],\n style: BorderStyle,\n borderColor: ColorInput | undefined,\n ctx: StyleContext,\n): string[] {\n if (!style) return lines\n const widthMax = lines.reduce(\n (acc, line) => Math.max(acc, textWidth(line)),\n 0,\n )\n const top = style.top.repeat(Math.max(0, widthMax))\n const bottom = style.bottom.repeat(Math.max(0, widthMax))\n\n const wrap = (line: string) => `${style.left}${line}${style.right}`\n const sidePadded = lines.map((line) => {\n const pad = Math.max(0, widthMax - textWidth(line))\n return wrap(`${line}${' '.repeat(pad)}`)\n })\n\n const topLine = `${style.topLeft}${top}${style.topRight}`\n const bottomLine = `${style.bottomLeft}${bottom}${style.bottomRight}`\n\n const withBorder = [topLine, ...sidePadded, bottomLine]\n\n if (!borderColor) {\n return withBorder\n }\n const colored = applyColor(withBorder.join('\\n'), borderColor, ctx)\n return colored.split('\\n')\n}\n\nfunction applyHeight(\n lines: string[],\n height?: number,\n maxHeight?: number,\n vAlign?: VAlign,\n): string[] {\n let result = [...lines]\n\n if (height !== undefined && height > 0) {\n const widthMax = Math.max(...result.map(textWidth), 0)\n const blank = ' '.repeat(widthMax)\n\n if (result.length < height) {\n const missing = height - result.length\n const topPad =\n vAlign === 'bottom'\n ? missing\n : vAlign === 'center'\n ? Math.floor(missing / 2)\n : 0\n const bottomPad = missing - topPad\n\n const topFill: string[] = []\n for (let i = 0; i < topPad; i++) topFill.push(blank)\n const bottomFill: string[] = []\n for (let i = 0; i < bottomPad; i++) bottomFill.push(blank)\n result = [...topFill, ...result, ...bottomFill]\n } else if (result.length > height) {\n result = result.slice(0, height)\n }\n }\n\n if (maxHeight !== undefined && maxHeight > 0 && result.length > maxHeight) {\n result = result.slice(0, maxHeight)\n }\n\n return result\n}\n\nfunction applyTextStyle(lines: string[], opts: StyleOptions, ctx: StyleContext): string[] {\n const fg = resolveColor(opts.foreground, ctx.env)\n const bg = resolveColor(opts.background, ctx.env)\n\n const styleFn = (input: string) => {\n let instance = ctx.styleFn\n if (fg) instance = applyForeground(instance, fg)\n if (bg) instance = applyBackground(instance, bg)\n if (opts.bold) instance = instance.bold\n if (opts.italic) instance = instance.italic\n if (opts.underline) instance = instance.underline\n if (opts.strikethrough) instance = instance.strikethrough\n return instance(input)\n }\n\n return lines.map(styleFn)\n}\n\n/**\n * Apply foreground color, handling hex, named colors, and rgb().\n */\nfunction applyForeground(instance: StyleFn, color: string): StyleFn {\n // Hex color\n if (color.startsWith('#')) {\n return instance.hex(color)\n }\n // RGB function format: rgb(r, g, b)\n const rgbMatch = color.match(\n /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i,\n )\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1] ?? '0', 10)\n const g = parseInt(rgbMatch[2] ?? '0', 10)\n const b = parseInt(rgbMatch[3] ?? '0', 10)\n return instance.rgb(r, g, b)\n }\n // Named color - check if it's a valid style property\n const namedColor = color.toLowerCase() as keyof StyleFn\n const prop = instance[namedColor]\n if (typeof prop === 'function' || (typeof prop === 'object' && prop !== null)) {\n return prop as StyleFn\n }\n // Fallback: try hex anyway\n return instance.hex(color)\n}\n\n/**\n * Apply background color, handling hex, named colors, and rgb().\n */\nfunction applyBackground(instance: StyleFn, color: string): StyleFn {\n // Hex color\n if (color.startsWith('#')) {\n return instance.bgHex(color)\n }\n // RGB function format: rgb(r, g, b)\n const rgbMatch = color.match(\n /^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/i,\n )\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1] ?? '0', 10)\n const g = parseInt(rgbMatch[2] ?? '0', 10)\n const b = parseInt(rgbMatch[3] ?? '0', 10)\n return instance.bgRgb(r, g, b)\n }\n // Named color - check if style has a bg version\n const bgColor =\n `bg${color.charAt(0).toUpperCase()}${color.slice(1).toLowerCase()}` as keyof StyleFn\n const prop = instance[bgColor]\n if (typeof prop === 'function' || (typeof prop === 'object' && prop !== null)) {\n return prop as StyleFn\n }\n // Fallback: try bgHex anyway\n return instance.bgHex(color)\n}\n\nfunction applyColor(text: string, color: ColorInput, ctx: StyleContext): string {\n const resolved = resolveColor(color, ctx.env)\n if (!resolved) return text\n\n return text\n .split('\\n')\n .map((line) => {\n let instance = ctx.styleFn\n instance = applyForeground(instance, resolved)\n return instance(line)\n })\n .join('\\n')\n}\n","import type { EnvironmentAdapter, StyleFn } from '@boba-cli/machine'\nimport { Style, StyleContext } from './style.js'\n\n/**\n * Common semantic styles for terminal output.\n * @public\n */\nexport interface SemanticStyles {\n success: Style\n error: Style\n warning: Style\n info: Style\n muted: Style\n highlight: Style\n header: Style\n}\n\n/**\n * Provider interface for creating styles.\n * Enables dependency injection for better testability.\n * @public\n */\nexport interface StyleProvider {\n /**\n * Create a new style instance.\n */\n createStyle(): Style\n\n /**\n * Get semantic styles for common use cases.\n */\n readonly semanticStyles: SemanticStyles\n\n /**\n * Get the style context used by this provider.\n */\n readonly context: StyleContext\n}\n\n/**\n * Implementation using Chapstick's Style class with injected adapters.\n * @public\n */\nexport class ChapstickStyleProvider implements StyleProvider {\n readonly context: StyleContext\n\n /**\n * Create a new style provider.\n * @param env - Environment adapter for detecting terminal capabilities\n * @param styleFn - Style function for applying ANSI styling\n */\n constructor(env: EnvironmentAdapter, styleFn: StyleFn) {\n this.context = { env, styleFn }\n }\n\n createStyle(): Style {\n return new Style({}, undefined, this.context)\n }\n\n get semanticStyles(): SemanticStyles {\n const ctx = this.context\n return {\n success: new Style({}, undefined, ctx).bold(true).foreground('#50FA7B'),\n error: new Style({}, undefined, ctx).bold(true).foreground('#FF5555'),\n warning: new Style({}, undefined, ctx).bold(true).foreground('#F1FA8C'),\n info: new Style({}, undefined, ctx).foreground('#8BE9FD'),\n muted: new Style({}, undefined, ctx).foreground('#6272A4'),\n highlight: new Style({}, undefined, ctx).background('#44475A').foreground('#F8F8F2'),\n header: new Style({}, undefined, ctx).bold(true).foreground('#00D9FF').padding(0, 1),\n }\n }\n}\n","import stringWidth from 'string-width'\nimport type { HAlign, VAlign } from './types.js'\n\n/**\n * Join blocks side-by-side, padding heights and inserting spacing columns.\n * @param spacing - The spacing between blocks.\n * @param blocks - The blocks to join.\n * @public\n */\nexport function joinHorizontal(spacing: number, ...blocks: string[]): string\n/**\n * Join blocks side-by-side, padding heights and inserting spacing columns.\n * @param blocks - The blocks to join.\n * @public\n */\nexport function joinHorizontal(...blocks: string[]): string\nexport function joinHorizontal(\n first: number | string,\n ...rest: string[]\n): string {\n const spacing = typeof first === 'number' ? first : 0\n const blocks: string[] = typeof first === 'number' ? rest : [first, ...rest]\n if (blocks.length === 0) return ''\n\n const split = blocks.map((b) => b.split('\\n'))\n const widths = split.map((lines) =>\n Math.max(...lines.map((l) => stringWidth(l)), 0),\n )\n const height = Math.max(...split.map((lines) => lines.length))\n\n const padded = split.map((lines, idx) => {\n const w = widths[idx] ?? 0\n const missing = height - lines.length\n const filled = lines.concat(Array(missing).fill(''))\n return filled.map((line) => padToWidth(line, w))\n })\n\n const gap = ' '.repeat(Math.max(0, spacing))\n const rows: string[] = []\n for (let i = 0; i < height; i++) {\n rows.push(padded.map((col) => col[i] ?? '').join(gap))\n }\n return rows.join('\\n')\n}\n\n/**\n * Join blocks vertically with optional blank line spacing.\n * @param spacing - The spacing between blocks.\n * @param blocks - The blocks to join.\n * @public\n */\nexport function joinVertical(spacing: number, ...blocks: string[]): string\n/**\n * Join blocks vertically with optional blank line spacing.\n * @param blocks - The blocks to join.\n * @public\n */\nexport function joinVertical(...blocks: string[]): string\nexport function joinVertical(\n first: number | string,\n ...rest: string[]\n): string {\n const spacing = typeof first === 'number' ? first : 0\n const blocks: string[] = typeof first === 'number' ? rest : [first, ...rest]\n if (blocks.length === 0) return ''\n const gap = '\\n'.repeat(Math.max(0, spacing + 1))\n return blocks.join(gap)\n}\n\n/**\n * Place content inside a fixed rectangle with alignment.\n * @param width - The width of the rectangle.\n * @param height - The height of the rectangle.\n * @param hAlign - Horizontal alignment (left, center, right).\n * @param vAlign - Vertical alignment (top, center, bottom).\n * @param content - The content to place.\n * @public\n */\nexport function place(\n width: number,\n height: number,\n hAlign: HAlign,\n vAlign: VAlign,\n content: string,\n): string {\n const lines = content.split('\\n')\n const clamped = lines\n .slice(0, height)\n .map((line) => truncateLine(line, width))\n const paddedLines = clamped.map((line) => alignLine(line, width, hAlign))\n const missing = height - paddedLines.length\n const topPad =\n vAlign === 'top'\n ? 0\n : vAlign === 'center'\n ? Math.floor(missing / 2)\n : missing\n const bottomPad = missing - topPad\n const empty = ' '.repeat(Math.max(0, width))\n const prefix = createPadLines(empty, Math.max(0, topPad))\n const suffix = createPadLines(empty, Math.max(0, bottomPad))\n return [...prefix, ...paddedLines, ...suffix].join('\\n')\n}\n\nfunction createPadLines(line: string, count: number): string[] {\n if (count <= 0) return []\n return Array<string>(count).fill(line)\n}\n\nfunction padToWidth(input: string, width: number): string {\n const w = stringWidth(input)\n if (w >= width) return input\n return `${input}${' '.repeat(width - w)}`\n}\n\nfunction truncateLine(input: string, maxWidth: number): string {\n const w = stringWidth(input)\n if (w <= maxWidth) return input\n // Character-by-character truncation for ANSI-aware width\n let acc = ''\n for (const ch of input) {\n if (stringWidth(acc + ch) > maxWidth) break\n acc += ch\n }\n return acc\n}\n\nfunction alignLine(input: string, width: number, align: HAlign): string {\n const w = stringWidth(input)\n const space = Math.max(0, width - w)\n if (align === 'right') {\n return `${' '.repeat(space)}${input}`\n }\n if (align === 'center') {\n const left = Math.floor(space / 2)\n const right = space - left\n return `${' '.repeat(left)}${input}${' '.repeat(right)}`\n }\n return `${input}${' '.repeat(space)}`\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@boba-cli/chapstick",
|
|
3
|
+
"description": "TypeScript port of Lip Gloss terminal styling DSL",
|
|
4
|
+
"version": "0.1.0-alpha.2",
|
|
5
|
+
"dependencies": {
|
|
6
|
+
"string-width": "^7.2.0",
|
|
7
|
+
"terminal-reflowjs": "0.0.0-alpha.0",
|
|
8
|
+
"@boba-cli/machine": "0.1.0-alpha.1"
|
|
9
|
+
},
|
|
10
|
+
"devDependencies": {
|
|
11
|
+
"@types/node": "^24.10.2",
|
|
12
|
+
"typescript": "5.8.2",
|
|
13
|
+
"vitest": "^4.0.16"
|
|
14
|
+
},
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.0.0"
|
|
17
|
+
},
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"import": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"require": {
|
|
25
|
+
"types": "./dist/index.d.cts",
|
|
26
|
+
"default": "./dist/index.cjs"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"./package.json": "./package.json"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"main": "./dist/index.cjs",
|
|
35
|
+
"module": "./dist/index.js",
|
|
36
|
+
"type": "module",
|
|
37
|
+
"types": "./dist/index.d.ts",
|
|
38
|
+
"scripts": {
|
|
39
|
+
"build": "tsup",
|
|
40
|
+
"check:api-report": "pnpm run generate:api-report",
|
|
41
|
+
"check:eslint": "pnpm run lint",
|
|
42
|
+
"generate:api-report": "api-extractor run --local",
|
|
43
|
+
"lint": "eslint \"{src,test}/**/*.{ts,tsx}\"",
|
|
44
|
+
"test": "vitest run --passWithNoTests"
|
|
45
|
+
}
|
|
46
|
+
}
|