baseline-kit 5.1.0 → 6.0.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"src-C-1u5WNS.cjs","names":[],"sources":["../packages/core/src/config/defaults.ts","../packages/core/src/config/merge.ts","../packages/core/src/types.ts","../packages/core/src/utils/parse.ts","../packages/core/src/utils/convert.ts","../packages/core/src/utils/math.ts","../packages/core/src/utils/normalize.ts","../packages/core/src/utils/padding.ts","../packages/core/src/utils/snapping.ts","../packages/core/src/utils/merge.ts","../packages/core/src/validation/guide.ts","../packages/core/src/utils/grid.ts","../packages/core/src/descriptors/guide.ts","../packages/core/src/descriptors/baseline.ts","../packages/core/src/descriptors/box.ts","../packages/core/src/descriptors/spacer.ts","../packages/core/src/descriptors/padder.ts"],"sourcesContent":["import type { ConfigSchema } from './schema'\n\nexport const DEFAULT_CONFIG: ConfigSchema = {\n base: 8,\n baseline: {\n variant: 'line',\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-baseline-color-line-theme, hsla(240, 60%, 40%, 0.15))',\n flat: 'var(--bk-baseline-color-flat-theme, hsla(230, 100%, 70%, 0.2))',\n },\n },\n guide: {\n variant: 'line',\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-guide-color-line-theme, hsla(240, 60%, 40%, 0.15))',\n pattern: 'var(--bk-guide-color-pattern-theme, hsla(230, 100%, 70%, 0.2))',\n auto: 'var(--bk-guide-color-auto-theme, hsla(200, 100%, 70%, 0.15))',\n fixed: 'var(--bk-guide-color-fixed-theme, hsla(200, 100%, 70%, 0.15))',\n },\n },\n spacer: {\n variant: 'line',\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-spacer-color-line-theme, hsla(270, 60%, 40%, 0.6))',\n flat: 'var(--bk-spacer-color-flat-theme, hsla(230, 100%, 70%, 0.2))',\n text: 'var(--bk-spacer-color-text-theme, hsla(270, 60%, 40%, 1))',\n },\n },\n box: {\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-box-color-line-theme, hsla(300, 60%, 40%, 0.6))',\n flat: 'var(--bk-box-color-flat-theme, hsla(260, 100%, 70%, 0.2))',\n text: 'var(--bk-box-color-text-theme, hsla(300, 60%, 40%, 0.9))',\n },\n },\n padder: {\n debugging: 'hidden',\n color: 'var(--bk-padder-color-theme, hsla(270, 60%, 40%, 0.6))',\n },\n} as const\n","import type { ConfigSchema } from './schema'\n\ntype PartialColors<T> = T extends { colors: infer Colors }\n ? Omit<Partial<T>, 'colors'> & { colors?: Partial<Colors> }\n : Partial<T>\n\nexport type ConfigOverrides = {\n base?: number\n baseline?: PartialColors<ConfigSchema['baseline']>\n guide?: PartialColors<ConfigSchema['guide']>\n spacer?: PartialColors<ConfigSchema['spacer']>\n box?: PartialColors<ConfigSchema['box']>\n padder?: Partial<ConfigSchema['padder']>\n}\n\ntype MergeConfigParams = ConfigOverrides & {\n parentConfig: ConfigSchema\n}\n\nconst COMPONENT_KEYS = ['baseline', 'guide', 'spacer', 'box', 'padder'] as const\n\nexport const mergeConfig = (params: MergeConfigParams): ConfigSchema => {\n const { parentConfig, base } = params\n const merged = {} as Record<string, unknown>\n\n for (const key of COMPONENT_KEYS) {\n const override = params[key]\n const inherited = parentConfig[key]\n const next = { ...inherited, ...override } as Record<string, unknown>\n\n if (\n override &&\n 'colors' in override &&\n override.colors &&\n 'colors' in inherited\n ) {\n next.colors = {\n ...(inherited.colors as Record<string, string>),\n ...(override.colors as Record<string, string>),\n }\n }\n\n merged[key] = next\n }\n\n return { base: base ?? parentConfig.base, ...merged } as ConfigSchema\n}\n\ntype CSSVariablesParams = {\n base: number\n baseline: ConfigSchema['baseline']\n guide: ConfigSchema['guide']\n spacer: ConfigSchema['spacer']\n box: ConfigSchema['box']\n padder: ConfigSchema['padder']\n}\n\nexport const createCSSVariables = (\n params: CSSVariablesParams\n): Record<string, string> => {\n const { base, baseline, guide, spacer, box, padder } = params\n return {\n '--bk-base': `${base}px`,\n '--bkbl-cl': baseline.colors.line,\n '--bkbl-cf': baseline.colors.flat,\n '--bkgd-cl': guide.colors.line,\n '--bkgd-cp': guide.colors.pattern,\n '--bkgd-ca': guide.colors.auto,\n '--bkgd-cf': guide.colors.fixed,\n '--bksp-cl': spacer.colors.line,\n '--bksp-cf': spacer.colors.flat,\n '--bksp-ct': spacer.colors.text,\n '--bkbx-cl': box.colors.line,\n '--bkbx-cf': box.colors.flat,\n '--bkbx-ct': box.colors.text,\n '--bkpd-c': padder.color,\n }\n}\n","/**\n * @baseline-kit/core - Pure type definitions\n * Framework-agnostic types for the baseline-kit system\n */\n\n// Spacing Types\nexport type Spacing =\n number | [number, number] | { start?: number; end?: number }\n\nexport type PaddingValue =\n | number\n | [number, number]\n | [number, number, number]\n | [number, number, number, number]\n | { top?: number; bottom?: number; left?: number; right?: number }\n\nexport type Padding = {\n top: number\n right: number\n bottom: number\n left: number\n}\n\nexport type SpacingProps = {\n padding?: PaddingValue\n block?: Spacing\n inline?: Spacing\n}\n\n// Grid Types\nexport type GuideVariant = 'line' | 'pattern' | 'fixed' | 'auto'\nexport type GuideColumnValue = string | number | undefined | 'auto'\nexport type GuideColumnsPattern = readonly GuideColumnValue[]\n\nexport const GRID_ALIGNMENTS = ['start', 'center', 'end'] as const\nexport type GridAlignment = (typeof GRID_ALIGNMENTS)[number]\n\nexport const PADD_VARIANTS = ['line', 'flat'] as const\nexport type PaddedVariant = (typeof PADD_VARIANTS)[number]\n\n// Component Types\nexport type Variant = 'line' | 'flat' | 'pattern'\nexport type BaselineVariant = Exclude<Variant, 'pattern'>\nexport type SnappingMode = 'none' | 'height' | 'clamp'\nexport type DebuggingMode = 'none' | 'hidden' | 'visible'\n\n// Guide Config Types (framework-agnostic)\ntype BaseGuideConfig = {\n gap?: number | string\n base?: number\n}\n\nexport type PatternConfig = BaseGuideConfig & {\n variant: 'pattern'\n columns: GuideColumnsPattern\n columnWidth?: never\n}\n\nexport type FixedConfig = BaseGuideConfig & {\n variant: 'fixed'\n columns: number\n columnWidth?: number | string\n}\n\nexport type AutoConfig = BaseGuideConfig & {\n variant: 'auto'\n columnWidth: number | string\n columns?: never\n}\n\nexport type LineConfig = BaseGuideConfig & {\n variant?: 'line'\n columns?: never\n columnWidth?: never\n}\n\nexport type GuideConfig = PatternConfig | AutoConfig | FixedConfig | LineConfig\n","export function parseUnit(\n value: string\n): { value: number; unit: string } | null {\n const match = value.trim().match(/^([+-]?[\\d.]+)([a-zA-Z%]+)$/)\n if (!match) return null\n const num = parseFloat(match[1])\n const unit = match[2]\n return { value: num, unit }\n}\n\nexport function formatValue(\n value: string | number | undefined,\n defaultValue?: number\n): string {\n if (value === undefined && defaultValue !== undefined)\n return `${defaultValue}px`\n if (\n value === 'auto' ||\n (typeof value === 'string' &&\n /^(auto|100%|0|.*(fr|vh|vw|vmin|vmax|rem))$/.test(value))\n ) {\n return String(value)\n }\n if (typeof value === 'number') return `${value}px`\n return value ?? ''\n}\n","import { parseUnit } from './parse'\n\nexport interface ConversionContext {\n parentSize?: number\n viewportWidth?: number\n viewportHeight?: number\n rootFontSize?: number\n parentFontSize?: number\n}\n\nconst DEFAULT_CONTEXT: Required<ConversionContext> = {\n parentSize: 0,\n viewportWidth: 1920,\n viewportHeight: 1080,\n rootFontSize: 16,\n parentFontSize: 16,\n}\n\nexport const ABSOLUTE_UNIT_CONVERSIONS: Record<string, number> = {\n px: 1,\n in: 96,\n cm: 37.8,\n mm: 3.78,\n pt: 1.33,\n pc: 16,\n}\n\nexport const RELATIVE_UNITS: string[] = [\n 'em',\n 'rem',\n 'vh',\n 'vw',\n 'vmin',\n 'vmax',\n '%',\n]\n\nconst RELATIVE_UNIT_RESOLVERS: Record<\n string,\n (ctx: Required<ConversionContext>) => number\n> = {\n em: (ctx) => ctx.parentFontSize,\n rem: (ctx) => ctx.rootFontSize,\n vh: (ctx) => ctx.viewportHeight / 100,\n vw: (ctx) => ctx.viewportWidth / 100,\n vmin: (ctx) => Math.min(ctx.viewportWidth, ctx.viewportHeight) / 100,\n vmax: (ctx) => Math.max(ctx.viewportWidth, ctx.viewportHeight) / 100,\n '%': (ctx) => ctx.parentSize / 100,\n}\n\nexport function convertValue(\n value: number | string | undefined,\n context?: ConversionContext\n): number | null {\n if (typeof value === 'number') return value\n if (typeof value !== 'string') return null\n\n const parsed = parseUnit(value)\n if (!parsed) return null\n\n const { value: num, unit } = parsed\n\n if (unit in ABSOLUTE_UNIT_CONVERSIONS) {\n return num * ABSOLUTE_UNIT_CONVERSIONS[unit]\n }\n\n if (unit === 'auto') return null\n\n const resolver = RELATIVE_UNIT_RESOLVERS[unit]\n if (resolver) {\n const ctx = { ...DEFAULT_CONTEXT, ...context }\n return num * resolver(ctx)\n }\n\n return null\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\ntype RowCountParams = {\n height?: number\n top: number\n bottom: number\n base: number\n}\n\nexport function calculateRowCount(params: RowCountParams): number {\n const { height, top, bottom, base } = params\n const totalHeight = (height ?? 0) - (top + bottom)\n return Math.max(1, Math.floor(totalHeight / base))\n}\n","import { convertValue, type ConversionContext } from './convert'\nimport { clamp } from './math'\n\nexport interface NormalizationOptions {\n base?: number\n round?: boolean\n clamp?: { min?: number; max?: number }\n suppressWarnings?: boolean\n context?: ConversionContext\n}\n\nexport function normalizeValue(\n value: string | number | undefined,\n options: NormalizationOptions = {}\n): number {\n const {\n base = 8,\n round: doRound = true,\n clamp: clampOptions,\n context,\n } = options\n\n if (value === 'auto') return base\n\n let num: number | null = null\n if (typeof value === 'number') {\n num = value\n } else if (typeof value === 'string') {\n num = convertValue(value, context) ?? base\n }\n if (num === null) num = base\n\n if (base <= 0) return num\n\n const normalized = doRound ? Math.round(num / base) * base : num\n\n return clampOptions !== undefined\n ? clamp(\n normalized,\n clampOptions.min ?? -Infinity,\n clampOptions.max ?? Infinity\n )\n : normalized\n}\n\nexport function normalizeValuePair(\n values:\n [string | number | undefined, string | number | undefined] | undefined,\n defaults: [number, number],\n options?: NormalizationOptions\n): [number, number] {\n if (!values) return defaults\n\n if (values[0] === undefined && values[1] === undefined) {\n return defaults\n }\n\n const first =\n values[0] !== undefined ? normalizeValue(values[0], options) : defaults[0]\n const second =\n values[1] !== undefined ? normalizeValue(values[1], options) : defaults[1]\n return [first, second]\n}\n","import type { Padding, PaddingValue, Spacing, SpacingProps } from '../types'\n\nexport function parsePadding(spacing: SpacingProps): Padding {\n if ('padding' in spacing && spacing.padding != null) {\n return parsePaddingValue(spacing.padding)\n }\n\n const blockEdges =\n 'block' in spacing && spacing.block != null\n ? parseBlock(spacing.block)\n : { top: 0, bottom: 0 }\n const inlineEdges =\n 'inline' in spacing && spacing.inline != null\n ? parseInline(spacing.inline)\n : { left: 0, right: 0 }\n\n return {\n top: blockEdges.top,\n right: inlineEdges.right,\n bottom: blockEdges.bottom,\n left: inlineEdges.left,\n }\n}\n\nfunction parsePaddingValue(padding: PaddingValue): Padding {\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding }\n }\n\n if (Array.isArray(padding)) {\n const [a = 0, b = 0, c, d] = padding\n return { top: a, right: b, bottom: c ?? a, left: d ?? b }\n }\n\n if (typeof padding === 'object') {\n return {\n top: padding.top ?? 0,\n right: padding.right ?? 0,\n bottom: padding.bottom ?? 0,\n left: padding.left ?? 0,\n }\n }\n\n return { top: 0, right: 0, bottom: 0, left: 0 }\n}\n\nfunction parseBlock(block: Spacing): Pick<Padding, 'top' | 'bottom'> {\n if (typeof block === 'number') {\n return { top: block, bottom: block }\n }\n if (Array.isArray(block)) {\n const [top, bottom] = block\n return { top: top ?? 0, bottom: bottom ?? 0 }\n }\n if (typeof block === 'object') {\n return { top: block.start ?? 0, bottom: block.end ?? 0 }\n }\n return { top: 0, bottom: 0 }\n}\n\nfunction parseInline(inline: Spacing): Pick<Padding, 'left' | 'right'> {\n if (typeof inline === 'number') {\n return { left: inline, right: inline }\n }\n if (Array.isArray(inline)) {\n const [left, right] = inline\n return { left: left ?? 0, right: right ?? 0 }\n }\n if (typeof inline === 'object') {\n return { left: inline.start ?? 0, right: inline.end ?? 0 }\n }\n return { left: 0, right: 0 }\n}\n","import type { SnappingMode, Padding, PaddingValue } from '../types'\nimport { parsePadding } from './padding'\n\nexport function calculateSnappedSpacing(\n height: number,\n base: number,\n initial: PaddingValue,\n snapping: SnappingMode\n): Padding {\n const pad: Padding = parsePadding({ padding: initial })\n\n if (snapping === 'none') {\n return pad\n }\n\n if (snapping === 'height') {\n const remainder = height % base\n if (remainder !== 0) {\n pad.bottom += base - remainder\n }\n }\n\n if (snapping === 'clamp') {\n pad.top = pad.top % base\n const remainder = height % base\n if (remainder !== 0) {\n pad.bottom += base - remainder\n }\n pad.bottom = pad.bottom % base\n }\n\n return pad\n}\n","import type { DebuggingMode } from '../types'\n\n/**\n * Combines class names, filtering out falsy values.\n * Lightweight alternative to clsx/classnames.\n */\nexport const cx = (\n ...classes: Array<string | boolean | undefined | null>\n): string => classes.filter(Boolean).join(' ').trim()\n\n/**\n * Resolves component debug/visibility state from prop and config.\n * Pure function — framework-agnostic.\n */\nexport interface DebugState {\n isShown: boolean\n isHidden: boolean\n isNone: boolean\n debugging: DebuggingMode | undefined\n}\n\nexport function resolveDebugState(\n debuggingProp?: DebuggingMode,\n debuggingConfig?: DebuggingMode\n): DebugState {\n const effective = debuggingProp ?? debuggingConfig\n return {\n isShown: effective === 'visible',\n isHidden: effective === 'hidden',\n isNone: effective === 'none',\n debugging: effective,\n }\n}\n\nexport type StyleOverrideParams = {\n key: string\n value: string\n defaultStyles: Record<string, string>\n skipDimensions?: {\n fitContent?: string[]\n auto?: string[]\n fullSize?: string[]\n }\n}\n\nexport function createStyleOverride(\n params: StyleOverrideParams | string,\n value?: string,\n defaultStyles?: Record<string, string>\n): Record<string, string> {\n const key = typeof params === 'string' ? params : params.key\n const val = typeof params === 'string' ? value! : params.value\n const defaults =\n typeof params === 'string' ? defaultStyles! : params.defaultStyles\n const skipDimensions =\n typeof params === 'object' ? params.skipDimensions : undefined\n\n if (skipDimensions) {\n if (skipDimensions.fitContent?.includes(key) && val === 'fit-content') {\n return {}\n }\n if (skipDimensions.auto?.includes(key) && val === 'auto') {\n return {}\n }\n if (\n skipDimensions.fullSize?.includes(key) &&\n (val === '100%' || val === '100vh' || val === '100vw')\n ) {\n return {}\n }\n }\n\n return val !== defaults[key] ? { [key]: val } : {}\n}\n","import type { GuideColumnsPattern, GuideColumnValue } from '../types'\n\nconst UNIT_PATTERN =\n /^\\d*\\.?\\d+(?:fr|px|%|em|rem|vh|vw|vmin|vmax|pt|pc|in|cm|mm)$/\n\nexport const isValidGuideColumnValue = (\n value: unknown\n): value is GuideColumnValue => {\n if (typeof value === 'number') return Number.isFinite(value) && value >= 0\n if (typeof value !== 'string') return false\n return value === 'auto' || value === '100%' || UNIT_PATTERN.test(value)\n}\n\nexport const isValidGuidePattern = (\n pattern: unknown\n): pattern is GuideColumnsPattern =>\n Array.isArray(pattern) &&\n pattern.length > 0 &&\n pattern.every(isValidGuideColumnValue)\n","import type { GuideConfig, GuideColumnsPattern } from '../types'\nimport { isValidGuidePattern } from '../validation/guide'\nimport { normalizeValue } from './normalize'\nimport { formatValue } from './parse'\nimport { convertValue, type ConversionContext } from './convert'\n\nexport interface GuideResult {\n template: string\n columnsCount: number\n calculatedGap: number\n isValid: boolean\n}\n\nconst INVALID_RESULT: GuideResult = {\n template: 'none',\n columnsCount: 0,\n calculatedGap: 0,\n isValid: false,\n}\n\n/**\n * Pure calculation of grid template from container width and guide config.\n * Framework-agnostic — can be used outside React.\n *\n * Sizing note: the `line` variant still reports the number of pixel tracks as\n * metadata, but React renders line guides with a CSS gradient so dense grids do\n * not allocate one DOM node per line.\n */\nexport function calculateGuideTemplate(\n width: number,\n config: GuideConfig,\n context?: ConversionContext\n): GuideResult {\n const variant = config.variant ?? 'line'\n const base = config.base ?? 8\n const gap = normalizeValue(config.gap ?? 0, { base, context })\n\n if (!width) return INVALID_RESULT\n\n switch (variant) {\n case 'line': {\n const finalGap = gap === 0 ? 0 : gap - 1\n const actualGapWithLine = finalGap + 1\n\n const columns =\n finalGap === 0\n ? Math.max(1, Math.floor(width) + 1)\n : Math.max(1, Math.floor((width + 1) / actualGapWithLine) + 1)\n\n return {\n template: `repeat(${columns}, 1px)`,\n columnsCount: columns,\n calculatedGap: gap > 0 ? gap - 1 : gap,\n isValid: true,\n }\n }\n\n case 'pattern': {\n if (!config.columns || !Array.isArray(config.columns)) {\n return INVALID_RESULT\n }\n\n if (!isValidGuidePattern(config.columns)) {\n return INVALID_RESULT\n }\n\n const columnsArr = (config.columns as GuideColumnsPattern).map((col) =>\n typeof col === 'number' ? `${col}px` : col\n )\n\n if (columnsArr.some((c) => c === '0' || c === '0px')) {\n return INVALID_RESULT\n }\n\n return {\n template: columnsArr.join(' '),\n columnsCount: columnsArr.length,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n case 'fixed': {\n const colCount = typeof config.columns === 'number' ? config.columns : 0\n if (colCount < 1) return INVALID_RESULT\n\n const colWidth = config.columnWidth\n ? formatValue(config.columnWidth)\n : '1fr'\n\n return {\n template: `repeat(${colCount}, ${colWidth})`,\n columnsCount: colCount,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n case 'auto': {\n const colWidth = config.columnWidth ?? 'auto'\n if (colWidth === 'auto') {\n return {\n template: 'repeat(auto-fill, minmax(0, 1fr))',\n columnsCount: 1,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n const colWidthStr =\n typeof colWidth === 'number' ? `${colWidth}px` : colWidth.toString()\n const pxVal = convertValue(colWidthStr, context) ?? 0\n const columns =\n pxVal > 0 ? Math.max(1, Math.floor((width + gap) / (pxVal + gap))) : 1\n\n return {\n template: `repeat(auto-fill, ${colWidthStr})`,\n columnsCount: columns,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n default: {\n const columns = Math.max(1, Math.floor(width / (gap + 1)) + 1)\n return {\n template: `repeat(${columns}, 1px)`,\n columnsCount: columns,\n calculatedGap: gap,\n isValid: true,\n }\n }\n }\n}\n\nexport const createGridSpanStyles = (\n span?: number,\n colSpan?: number,\n rowSpan?: number\n): Record<string, string> => {\n const gridStyles: Record<string, string> = {}\n\n if (span !== undefined) {\n gridStyles.gridColumn = `span ${span}`\n gridStyles.gridRow = `span ${span}`\n } else {\n if (colSpan !== undefined) {\n gridStyles.gridColumn = `span ${colSpan}`\n }\n if (rowSpan !== undefined) {\n gridStyles.gridRow = `span ${rowSpan}`\n }\n }\n\n return gridStyles\n}\n","import type { GuideVariant, GuideConfig } from '../types'\nimport { formatValue, createStyleOverride } from '../utils'\n\nexport interface GuideDescriptorParams {\n base: number\n colors: Record<GuideVariant, string>\n variant: GuideVariant\n align: string\n width?: number | string\n height?: number | string\n columnWidth?: number | string\n maxWidth?: number | string\n color?: string\n /** Pre-computed guide template result (from useGuide or calculateGuideTemplate) */\n template: string\n columnsCount: number\n calculatedGap: number\n isVisible: boolean\n}\n\nexport interface GuideDescriptor {\n containerStyle: Record<string, string>\n columnColor: string\n columnsCount: number\n calculatedGap: number\n template: string\n isVisible: boolean\n isLineVariant: boolean\n classTokens: string[]\n}\n\nexport interface GuideConfigParams {\n variant: GuideVariant\n base: number\n gap: number\n columns?: number | readonly (string | number | undefined | 'auto')[]\n columnWidth?: number | string\n}\n\n/**\n * Creates a GuideConfig from component props.\n * Pure function — no React or DOM dependency.\n */\nexport function createGuideConfig({\n variant,\n base,\n gap,\n columns,\n columnWidth,\n}: GuideConfigParams): GuideConfig {\n switch (variant) {\n case 'line':\n return { variant: 'line', gap, base }\n case 'pattern':\n if (columns && Array.isArray(columns)) {\n return {\n variant: 'pattern',\n columns: columns as readonly (string | number)[],\n gap,\n base,\n }\n }\n break\n case 'fixed':\n if (columns !== undefined) {\n const parsed =\n typeof columns === 'number' ? columns : parseInt(String(columns), 10)\n return {\n variant: 'fixed',\n columns: !isNaN(parsed) ? parsed : 12,\n columnWidth: columnWidth || '60px',\n gap,\n base,\n }\n }\n break\n }\n return { variant: 'auto', columnWidth: columnWidth || '1fr', gap, base }\n}\n\nconst GUIDE_DEFAULTS = (\n base: number,\n lineColor: string\n): Record<string, string> => ({\n '--bkgd-w': '100%',\n '--bkgd-h': '100%',\n '--bkgd-mw': 'none',\n '--bkgd-cw': '60px',\n '--bkgd-gw': '24px',\n '--bkgd-n': '12',\n '--bkgd-b': `${base}px`,\n '--bkgd-cl': lineColor,\n '--bkgd-g': '0',\n})\n\n/**\n * Computes all styles and data needed to render a Guide component.\n * Pure function — framework-agnostic.\n */\nexport function createGuideDescriptor(\n params: GuideDescriptorParams\n): GuideDescriptor {\n const {\n base,\n colors,\n variant,\n align,\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isVisible,\n } = params\n\n const defaultStyles = GUIDE_DEFAULTS(base, colors.line)\n const containerStyle: Record<string, string> = {\n // Config is wrapperless, so every guide color channel must travel with\n // the consuming guide rather than relying on root CSS variables.\n '--bkgd-cl': color ?? colors.line,\n '--bkgd-cp': color ?? colors.pattern,\n '--bkgd-ca': color ?? colors.auto,\n '--bkgd-cf': color ?? colors.fixed,\n // Always declare the containing-block default and preserve explicit CSS\n // dimensions. A viewport size is not equivalent to 100% of the parent.\n '--bkgd-w': formatValue(width ?? '100%'),\n '--bkgd-h': formatValue(height ?? '100%'),\n ...createStyleOverride({\n key: '--bkgd-mw',\n value: formatValue(maxWidth || 'none'),\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-cw',\n value: formatValue(columnWidth || '60px'),\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-n',\n value: `${columnsCount}`,\n defaultStyles,\n }),\n ...createStyleOverride({ key: '--bkgd-b', value: '0', defaultStyles }),\n ...createStyleOverride({\n key: '--bkgd-cl',\n value: color ?? colors.line,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-g',\n value: `${calculatedGap}px`,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-j',\n value: align || 'center',\n defaultStyles,\n }),\n // CSS module resolves grid-template-columns from --bkgd-t, so the inline\n // gridTemplateColumns property would be redundant.\n ...(template && template !== 'none' ? { '--bkgd-t': template } : {}),\n }\n\n const columnColor =\n color ??\n (variant && variant in colors\n ? colors[variant as keyof typeof colors]\n : undefined) ??\n colors.line\n\n const isLineVariant = variant === 'line'\n const classTokens = ['gde', isVisible ? 'v' : 'h']\n if (isLineVariant) classTokens.push('line')\n\n if (isLineVariant) {\n containerStyle['--bkgd-line-color'] = 'var(--bkgd-cl)'\n containerStyle['--bkgd-line-period'] = `${calculatedGap + 1}px`\n }\n\n return {\n containerStyle,\n columnColor,\n columnsCount,\n calculatedGap,\n template,\n isVisible,\n isLineVariant,\n classTokens,\n }\n}\n","import type { BaselineVariant } from '../types'\nimport {\n formatValue,\n normalizeValuePair,\n parsePadding,\n calculateRowCount,\n} from '../utils'\n\nexport interface BaselineDescriptorParams {\n base: number\n colors: Record<BaselineVariant, string>\n variant: BaselineVariant\n width?: number | string\n height?: number | string\n color?: string\n containerWidth: number\n containerHeight: number\n spacing: Record<string, unknown>\n isVisible: boolean\n}\n\nexport interface BaselineDescriptor {\n containerStyle: Record<string, string>\n rowCount: number\n getRowStyle: (index: number) => Record<string, string>\n padding: string | undefined\n isVisible: boolean\n classTokens: string[]\n}\n\n/**\n * Computes all styles and data needed to render a Baseline component.\n * Pure function — framework-agnostic.\n */\nexport function createBaselineDescriptor(\n params: BaselineDescriptorParams\n): BaselineDescriptor {\n const {\n base,\n colors,\n variant,\n width,\n height,\n color,\n containerWidth,\n containerHeight,\n spacing,\n isVisible,\n } = params\n\n const { top, right, bottom, left } = parsePadding(spacing)\n\n const paddingValues = [top, right, bottom, left]\n .map((v) => (v ? `${v}px` : '0'))\n .join(' ')\n const padding = paddingValues !== '0 0 0 0' ? paddingValues : undefined\n\n // The browser resolves declared CSS dimensions. A non-zero measured\n // rectangle is therefore the only reliable height for deciding how many\n // baseline rows are needed; normalizing `height` here incorrectly treats\n // relative values as if they were pixel values in a synthetic conversion\n // context. The fallback only supports DOM-less test/SSR environments before\n // the first layout measurement arrives.\n const layoutHeight =\n containerHeight > 0\n ? containerHeight\n : normalizeValuePair([undefined, height], [containerWidth, 0])[1]\n const rowCount = calculateRowCount({\n height: layoutHeight,\n top,\n bottom,\n base,\n })\n\n const containerStyle: Record<string, string> = {\n // Preserve explicit dimensions verbatim. In particular, `100vh`,\n // `100vw`, `calc(...)`, and zero must not be collapsed to the 100% CSS\n // fallback.\n ...(width !== undefined ? { '--bkbl-w': formatValue(width) } : {}),\n ...(height !== undefined ? { '--bkbl-h': formatValue(height) } : {}),\n // Config is wrapperless. Emit the resolved paint channels on the\n // consuming element even when they happen to match the descriptor's\n // defaults; CSS variables on an ancestor cannot express nested scopes.\n '--bkbl-cl': color ?? colors.line,\n '--bkbl-cf': color ?? colors.flat,\n // Rows inherit the active channel. Keeping this as a reference rather\n // than a copied literal preserves caller style overrides on the host.\n '--bkbl-c': variant === 'line' ? 'var(--bkbl-cl)' : 'var(--bkbl-cf)',\n ...(padding ? { padding } : {}),\n }\n\n const getRowStyle = (index: number): Record<string, string> => ({\n '--bkbl-rt': index === 0 ? '0px' : `${index * base}px`,\n '--bkbl-rh': variant === 'line' ? '1px' : `${base}px`,\n })\n\n const classTokens = ['bas', isVisible ? 'v' : 'h']\n\n return {\n containerStyle,\n rowCount,\n getRowStyle,\n padding,\n isVisible,\n classTokens,\n }\n}\n","import { formatValue, createGridSpanStyles } from '../utils'\n\nexport interface BoxDescriptorParams {\n base: number\n lineColor: string\n width?: number | string\n height?: number | string\n span?: number\n colSpan?: number\n rowSpan?: number\n isVisible: boolean\n}\n\nexport interface BoxDescriptor {\n boxStyle: Record<string, string>\n gridSpanStyle: Record<string, string>\n classTokens: string[]\n}\n\n/**\n * Computes styles needed to render a Box component.\n * Pure function — framework-agnostic.\n */\nexport function createBoxDescriptor(\n params: BoxDescriptorParams\n): BoxDescriptor {\n const { lineColor, width, height, span, colSpan, rowSpan, isVisible } = params\n\n const boxStyle: Record<string, string> = {\n ...(width !== undefined ? { '--bkbx-w': formatValue(width) } : {}),\n ...(height !== undefined ? { '--bkbx-h': formatValue(height) } : {}),\n // Config is context, not a DOM wrapper. The consuming Box must receive\n // its resolved painted value directly so nested/sibling Config scopes do\n // not depend on a root-level custom property.\n '--bkbx-cl': lineColor,\n }\n\n const gridSpanStyle = createGridSpanStyles(span, colSpan, rowSpan)\n\n const classTokens = ['box']\n if (isVisible) classTokens.push('v')\n\n return { boxStyle, gridSpanStyle, classTokens }\n}\n","import { formatValue, normalizeValuePair } from '../utils'\n\nexport interface SpacerDescriptorParams {\n base: number\n colors: { line: string; flat: string; text: string }\n width?: number | string\n height?: number | string\n color?: string\n variant: string\n isVisible: boolean\n}\n\nexport interface SpacerDescriptor {\n style: Record<string, string>\n normWidth: number\n normHeight: number\n classTokens: string[]\n}\n\n/**\n * Computes styles needed to render a Spacer component.\n * Pure function — framework-agnostic.\n */\nexport function createSpacerDescriptor(\n params: SpacerDescriptorParams\n): SpacerDescriptor {\n const { base, colors, width, height, color, variant, isVisible } = params\n\n const [normWidth, normHeight] = normalizeValuePair([width, height], [0, 0], {\n base,\n suppressWarnings: true,\n })\n\n const style: Record<string, string> = {\n ...(height !== undefined ? { '--bksp-h': formatValue(normHeight) } : {}),\n ...(width !== undefined ? { '--bksp-w': formatValue(normWidth) } : {}),\n '--bksp-b': `${base}px`,\n // Emit all resolved painted channels on the consumer. Config is\n // wrapperless, so comparing against defaults would erase custom values.\n '--bksp-ct': color ?? colors.text,\n '--bksp-cl': color ?? colors.line,\n '--bksp-cf': color ?? colors.flat,\n }\n\n const classTokens = ['spr']\n if (isVisible) classTokens.push(variant)\n\n return { style, normWidth, normHeight, classTokens }\n}\n","import { formatValue } from '../utils'\nimport type { Padding } from '../types'\n\nexport interface PadderDescriptorParams {\n base: number\n color: string\n width?: number | string\n height?: number | string\n padding: Padding\n enableSpacers: boolean\n isVisible: boolean\n}\n\nexport interface PadderDescriptor {\n containerStyle: Record<string, string>\n classTokens: string[]\n}\n\n/**\n * Computes styles needed to render a Padder component.\n * Pure function — framework-agnostic.\n */\nexport function createPadderDescriptor(\n params: PadderDescriptorParams\n): PadderDescriptor {\n const { base, color, width, height, padding, enableSpacers, isVisible } =\n params\n\n const containerStyle: Record<string, string> = {}\n\n if (width !== undefined && width !== 'fit-content') {\n containerStyle['--bkpd-w'] = formatValue(width)\n }\n if (height !== undefined && height !== 'fit-content') {\n containerStyle['--bkpd-h'] = formatValue(height)\n }\n\n containerStyle['--bkpd-b'] = `${base}px`\n containerStyle['--bkpd-c'] = color\n\n if (!enableSpacers) {\n const { top, right, bottom, left } = padding\n if (top > 0 || bottom > 0) {\n containerStyle.paddingBlock = `${top}px ${bottom}px`\n }\n if (left > 0 || right > 0) {\n containerStyle.paddingInline = `${left}px ${right}px`\n }\n }\n\n const classTokens = ['pad']\n if (isVisible && enableSpacers) classTokens.push('v')\n\n return { containerStyle, classTokens }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"src-C3TICsw6.js","names":[],"sources":["../packages/core/src/config/defaults.ts","../packages/core/src/config/merge.ts","../packages/core/src/types.ts","../packages/core/src/utils/parse.ts","../packages/core/src/utils/convert.ts","../packages/core/src/utils/math.ts","../packages/core/src/utils/normalize.ts","../packages/core/src/utils/padding.ts","../packages/core/src/utils/snapping.ts","../packages/core/src/utils/merge.ts","../packages/core/src/validation/guide.ts","../packages/core/src/utils/grid.ts","../packages/core/src/descriptors/guide.ts","../packages/core/src/descriptors/baseline.ts","../packages/core/src/descriptors/box.ts","../packages/core/src/descriptors/spacer.ts","../packages/core/src/descriptors/padder.ts"],"sourcesContent":["import type { ConfigSchema } from './schema'\n\nexport const DEFAULT_CONFIG: ConfigSchema = {\n base: 8,\n baseline: {\n variant: 'line',\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-baseline-color-line-theme, hsla(240, 60%, 40%, 0.15))',\n flat: 'var(--bk-baseline-color-flat-theme, hsla(230, 100%, 70%, 0.2))',\n },\n },\n guide: {\n variant: 'line',\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-guide-color-line-theme, hsla(240, 60%, 40%, 0.15))',\n pattern: 'var(--bk-guide-color-pattern-theme, hsla(230, 100%, 70%, 0.2))',\n auto: 'var(--bk-guide-color-auto-theme, hsla(200, 100%, 70%, 0.15))',\n fixed: 'var(--bk-guide-color-fixed-theme, hsla(200, 100%, 70%, 0.15))',\n },\n },\n spacer: {\n variant: 'line',\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-spacer-color-line-theme, hsla(270, 60%, 40%, 0.6))',\n flat: 'var(--bk-spacer-color-flat-theme, hsla(230, 100%, 70%, 0.2))',\n text: 'var(--bk-spacer-color-text-theme, hsla(270, 60%, 40%, 1))',\n },\n },\n box: {\n debugging: 'hidden',\n colors: {\n line: 'var(--bk-box-color-line-theme, hsla(300, 60%, 40%, 0.6))',\n flat: 'var(--bk-box-color-flat-theme, hsla(260, 100%, 70%, 0.2))',\n text: 'var(--bk-box-color-text-theme, hsla(300, 60%, 40%, 0.9))',\n },\n },\n padder: {\n debugging: 'hidden',\n color: 'var(--bk-padder-color-theme, hsla(270, 60%, 40%, 0.6))',\n },\n} as const\n","import type { ConfigSchema } from './schema'\n\ntype PartialColors<T> = T extends { colors: infer Colors }\n ? Omit<Partial<T>, 'colors'> & { colors?: Partial<Colors> }\n : Partial<T>\n\nexport type ConfigOverrides = {\n base?: number\n baseline?: PartialColors<ConfigSchema['baseline']>\n guide?: PartialColors<ConfigSchema['guide']>\n spacer?: PartialColors<ConfigSchema['spacer']>\n box?: PartialColors<ConfigSchema['box']>\n padder?: Partial<ConfigSchema['padder']>\n}\n\ntype MergeConfigParams = ConfigOverrides & {\n parentConfig: ConfigSchema\n}\n\nconst COMPONENT_KEYS = ['baseline', 'guide', 'spacer', 'box', 'padder'] as const\n\nexport const mergeConfig = (params: MergeConfigParams): ConfigSchema => {\n const { parentConfig, base } = params\n const merged = {} as Record<string, unknown>\n\n for (const key of COMPONENT_KEYS) {\n const override = params[key]\n const inherited = parentConfig[key]\n const next = { ...inherited, ...override } as Record<string, unknown>\n\n if (\n override &&\n 'colors' in override &&\n override.colors &&\n 'colors' in inherited\n ) {\n next.colors = {\n ...(inherited.colors as Record<string, string>),\n ...(override.colors as Record<string, string>),\n }\n }\n\n merged[key] = next\n }\n\n return { base: base ?? parentConfig.base, ...merged } as ConfigSchema\n}\n\ntype CSSVariablesParams = {\n base: number\n baseline: ConfigSchema['baseline']\n guide: ConfigSchema['guide']\n spacer: ConfigSchema['spacer']\n box: ConfigSchema['box']\n padder: ConfigSchema['padder']\n}\n\nexport const createCSSVariables = (\n params: CSSVariablesParams\n): Record<string, string> => {\n const { base, baseline, guide, spacer, box, padder } = params\n return {\n '--bk-base': `${base}px`,\n '--bkbl-cl': baseline.colors.line,\n '--bkbl-cf': baseline.colors.flat,\n '--bkgd-cl': guide.colors.line,\n '--bkgd-cp': guide.colors.pattern,\n '--bkgd-ca': guide.colors.auto,\n '--bkgd-cf': guide.colors.fixed,\n '--bksp-cl': spacer.colors.line,\n '--bksp-cf': spacer.colors.flat,\n '--bksp-ct': spacer.colors.text,\n '--bkbx-cl': box.colors.line,\n '--bkbx-cf': box.colors.flat,\n '--bkbx-ct': box.colors.text,\n '--bkpd-c': padder.color,\n }\n}\n","/**\n * @baseline-kit/core - Pure type definitions\n * Framework-agnostic types for the baseline-kit system\n */\n\n// Spacing Types\nexport type Spacing =\n number | [number, number] | { start?: number; end?: number }\n\nexport type PaddingValue =\n | number\n | [number, number]\n | [number, number, number]\n | [number, number, number, number]\n | { top?: number; bottom?: number; left?: number; right?: number }\n\nexport type Padding = {\n top: number\n right: number\n bottom: number\n left: number\n}\n\nexport type SpacingProps = {\n padding?: PaddingValue\n block?: Spacing\n inline?: Spacing\n}\n\n// Grid Types\nexport type GuideVariant = 'line' | 'pattern' | 'fixed' | 'auto'\nexport type GuideColumnValue = string | number | undefined | 'auto'\nexport type GuideColumnsPattern = readonly GuideColumnValue[]\n\nexport const GRID_ALIGNMENTS = ['start', 'center', 'end'] as const\nexport type GridAlignment = (typeof GRID_ALIGNMENTS)[number]\n\nexport const PADD_VARIANTS = ['line', 'flat'] as const\nexport type PaddedVariant = (typeof PADD_VARIANTS)[number]\n\n// Component Types\nexport type Variant = 'line' | 'flat' | 'pattern'\nexport type BaselineVariant = Exclude<Variant, 'pattern'>\nexport type SnappingMode = 'none' | 'height' | 'clamp'\nexport type DebuggingMode = 'none' | 'hidden' | 'visible'\n\n// Guide Config Types (framework-agnostic)\ntype BaseGuideConfig = {\n gap?: number | string\n base?: number\n}\n\nexport type PatternConfig = BaseGuideConfig & {\n variant: 'pattern'\n columns: GuideColumnsPattern\n columnWidth?: never\n}\n\nexport type FixedConfig = BaseGuideConfig & {\n variant: 'fixed'\n columns: number\n columnWidth?: number | string\n}\n\nexport type AutoConfig = BaseGuideConfig & {\n variant: 'auto'\n columnWidth: number | string\n columns?: never\n}\n\nexport type LineConfig = BaseGuideConfig & {\n variant?: 'line'\n columns?: never\n columnWidth?: never\n}\n\nexport type GuideConfig = PatternConfig | AutoConfig | FixedConfig | LineConfig\n","export function parseUnit(\n value: string\n): { value: number; unit: string } | null {\n const match = value.trim().match(/^([+-]?[\\d.]+)([a-zA-Z%]+)$/)\n if (!match) return null\n const num = parseFloat(match[1])\n const unit = match[2]\n return { value: num, unit }\n}\n\nexport function formatValue(\n value: string | number | undefined,\n defaultValue?: number\n): string {\n if (value === undefined && defaultValue !== undefined)\n return `${defaultValue}px`\n if (\n value === 'auto' ||\n (typeof value === 'string' &&\n /^(auto|100%|0|.*(fr|vh|vw|vmin|vmax|rem))$/.test(value))\n ) {\n return String(value)\n }\n if (typeof value === 'number') return `${value}px`\n return value ?? ''\n}\n","import { parseUnit } from './parse'\n\nexport interface ConversionContext {\n parentSize?: number\n viewportWidth?: number\n viewportHeight?: number\n rootFontSize?: number\n parentFontSize?: number\n}\n\nconst DEFAULT_CONTEXT: Required<ConversionContext> = {\n parentSize: 0,\n viewportWidth: 1920,\n viewportHeight: 1080,\n rootFontSize: 16,\n parentFontSize: 16,\n}\n\nexport const ABSOLUTE_UNIT_CONVERSIONS: Record<string, number> = {\n px: 1,\n in: 96,\n cm: 37.8,\n mm: 3.78,\n pt: 1.33,\n pc: 16,\n}\n\nexport const RELATIVE_UNITS: string[] = [\n 'em',\n 'rem',\n 'vh',\n 'vw',\n 'vmin',\n 'vmax',\n '%',\n]\n\nconst RELATIVE_UNIT_RESOLVERS: Record<\n string,\n (ctx: Required<ConversionContext>) => number\n> = {\n em: (ctx) => ctx.parentFontSize,\n rem: (ctx) => ctx.rootFontSize,\n vh: (ctx) => ctx.viewportHeight / 100,\n vw: (ctx) => ctx.viewportWidth / 100,\n vmin: (ctx) => Math.min(ctx.viewportWidth, ctx.viewportHeight) / 100,\n vmax: (ctx) => Math.max(ctx.viewportWidth, ctx.viewportHeight) / 100,\n '%': (ctx) => ctx.parentSize / 100,\n}\n\nexport function convertValue(\n value: number | string | undefined,\n context?: ConversionContext\n): number | null {\n if (typeof value === 'number') return value\n if (typeof value !== 'string') return null\n\n const parsed = parseUnit(value)\n if (!parsed) return null\n\n const { value: num, unit } = parsed\n\n if (unit in ABSOLUTE_UNIT_CONVERSIONS) {\n return num * ABSOLUTE_UNIT_CONVERSIONS[unit]\n }\n\n if (unit === 'auto') return null\n\n const resolver = RELATIVE_UNIT_RESOLVERS[unit]\n if (resolver) {\n const ctx = { ...DEFAULT_CONTEXT, ...context }\n return num * resolver(ctx)\n }\n\n return null\n}\n","export function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max)\n}\n\ntype RowCountParams = {\n height?: number\n top: number\n bottom: number\n base: number\n}\n\nexport function calculateRowCount(params: RowCountParams): number {\n const { height, top, bottom, base } = params\n const totalHeight = (height ?? 0) - (top + bottom)\n return Math.max(1, Math.floor(totalHeight / base))\n}\n","import { convertValue, type ConversionContext } from './convert'\nimport { clamp } from './math'\n\nexport interface NormalizationOptions {\n base?: number\n round?: boolean\n clamp?: { min?: number; max?: number }\n suppressWarnings?: boolean\n context?: ConversionContext\n}\n\nexport function normalizeValue(\n value: string | number | undefined,\n options: NormalizationOptions = {}\n): number {\n const {\n base = 8,\n round: doRound = true,\n clamp: clampOptions,\n context,\n } = options\n\n if (value === 'auto') return base\n\n let num: number | null = null\n if (typeof value === 'number') {\n num = value\n } else if (typeof value === 'string') {\n num = convertValue(value, context) ?? base\n }\n if (num === null) num = base\n\n if (base <= 0) return num\n\n const normalized = doRound ? Math.round(num / base) * base : num\n\n return clampOptions !== undefined\n ? clamp(\n normalized,\n clampOptions.min ?? -Infinity,\n clampOptions.max ?? Infinity\n )\n : normalized\n}\n\nexport function normalizeValuePair(\n values:\n [string | number | undefined, string | number | undefined] | undefined,\n defaults: [number, number],\n options?: NormalizationOptions\n): [number, number] {\n if (!values) return defaults\n\n if (values[0] === undefined && values[1] === undefined) {\n return defaults\n }\n\n const first =\n values[0] !== undefined ? normalizeValue(values[0], options) : defaults[0]\n const second =\n values[1] !== undefined ? normalizeValue(values[1], options) : defaults[1]\n return [first, second]\n}\n","import type { Padding, PaddingValue, Spacing, SpacingProps } from '../types'\n\nexport function parsePadding(spacing: SpacingProps): Padding {\n if ('padding' in spacing && spacing.padding != null) {\n return parsePaddingValue(spacing.padding)\n }\n\n const blockEdges =\n 'block' in spacing && spacing.block != null\n ? parseBlock(spacing.block)\n : { top: 0, bottom: 0 }\n const inlineEdges =\n 'inline' in spacing && spacing.inline != null\n ? parseInline(spacing.inline)\n : { left: 0, right: 0 }\n\n return {\n top: blockEdges.top,\n right: inlineEdges.right,\n bottom: blockEdges.bottom,\n left: inlineEdges.left,\n }\n}\n\nfunction parsePaddingValue(padding: PaddingValue): Padding {\n if (typeof padding === 'number') {\n return { top: padding, right: padding, bottom: padding, left: padding }\n }\n\n if (Array.isArray(padding)) {\n const [a = 0, b = 0, c, d] = padding\n return { top: a, right: b, bottom: c ?? a, left: d ?? b }\n }\n\n if (typeof padding === 'object') {\n return {\n top: padding.top ?? 0,\n right: padding.right ?? 0,\n bottom: padding.bottom ?? 0,\n left: padding.left ?? 0,\n }\n }\n\n return { top: 0, right: 0, bottom: 0, left: 0 }\n}\n\nfunction parseBlock(block: Spacing): Pick<Padding, 'top' | 'bottom'> {\n if (typeof block === 'number') {\n return { top: block, bottom: block }\n }\n if (Array.isArray(block)) {\n const [top, bottom] = block\n return { top: top ?? 0, bottom: bottom ?? 0 }\n }\n if (typeof block === 'object') {\n return { top: block.start ?? 0, bottom: block.end ?? 0 }\n }\n return { top: 0, bottom: 0 }\n}\n\nfunction parseInline(inline: Spacing): Pick<Padding, 'left' | 'right'> {\n if (typeof inline === 'number') {\n return { left: inline, right: inline }\n }\n if (Array.isArray(inline)) {\n const [left, right] = inline\n return { left: left ?? 0, right: right ?? 0 }\n }\n if (typeof inline === 'object') {\n return { left: inline.start ?? 0, right: inline.end ?? 0 }\n }\n return { left: 0, right: 0 }\n}\n","import type { SnappingMode, Padding, PaddingValue } from '../types'\nimport { parsePadding } from './padding'\n\nexport function calculateSnappedSpacing(\n height: number,\n base: number,\n initial: PaddingValue,\n snapping: SnappingMode\n): Padding {\n const pad: Padding = parsePadding({ padding: initial })\n\n if (snapping === 'none') {\n return pad\n }\n\n if (snapping === 'height') {\n const remainder = height % base\n if (remainder !== 0) {\n pad.bottom += base - remainder\n }\n }\n\n if (snapping === 'clamp') {\n pad.top = pad.top % base\n const remainder = height % base\n if (remainder !== 0) {\n pad.bottom += base - remainder\n }\n pad.bottom = pad.bottom % base\n }\n\n return pad\n}\n","import type { DebuggingMode } from '../types'\n\n/**\n * Combines class names, filtering out falsy values.\n * Lightweight alternative to clsx/classnames.\n */\nexport const cx = (\n ...classes: Array<string | boolean | undefined | null>\n): string => classes.filter(Boolean).join(' ').trim()\n\n/**\n * Resolves component debug/visibility state from prop and config.\n * Pure function — framework-agnostic.\n */\nexport interface DebugState {\n isShown: boolean\n isHidden: boolean\n isNone: boolean\n debugging: DebuggingMode | undefined\n}\n\nexport function resolveDebugState(\n debuggingProp?: DebuggingMode,\n debuggingConfig?: DebuggingMode\n): DebugState {\n const effective = debuggingProp ?? debuggingConfig\n return {\n isShown: effective === 'visible',\n isHidden: effective === 'hidden',\n isNone: effective === 'none',\n debugging: effective,\n }\n}\n\nexport type StyleOverrideParams = {\n key: string\n value: string\n defaultStyles: Record<string, string>\n skipDimensions?: {\n fitContent?: string[]\n auto?: string[]\n fullSize?: string[]\n }\n}\n\nexport function createStyleOverride(\n params: StyleOverrideParams | string,\n value?: string,\n defaultStyles?: Record<string, string>\n): Record<string, string> {\n const key = typeof params === 'string' ? params : params.key\n const val = typeof params === 'string' ? value! : params.value\n const defaults =\n typeof params === 'string' ? defaultStyles! : params.defaultStyles\n const skipDimensions =\n typeof params === 'object' ? params.skipDimensions : undefined\n\n if (skipDimensions) {\n if (skipDimensions.fitContent?.includes(key) && val === 'fit-content') {\n return {}\n }\n if (skipDimensions.auto?.includes(key) && val === 'auto') {\n return {}\n }\n if (\n skipDimensions.fullSize?.includes(key) &&\n (val === '100%' || val === '100vh' || val === '100vw')\n ) {\n return {}\n }\n }\n\n return val !== defaults[key] ? { [key]: val } : {}\n}\n","import type { GuideColumnsPattern, GuideColumnValue } from '../types'\n\nconst UNIT_PATTERN =\n /^\\d*\\.?\\d+(?:fr|px|%|em|rem|vh|vw|vmin|vmax|pt|pc|in|cm|mm)$/\n\nexport const isValidGuideColumnValue = (\n value: unknown\n): value is GuideColumnValue => {\n if (typeof value === 'number') return Number.isFinite(value) && value >= 0\n if (typeof value !== 'string') return false\n return value === 'auto' || value === '100%' || UNIT_PATTERN.test(value)\n}\n\nexport const isValidGuidePattern = (\n pattern: unknown\n): pattern is GuideColumnsPattern =>\n Array.isArray(pattern) &&\n pattern.length > 0 &&\n pattern.every(isValidGuideColumnValue)\n","import type { GuideConfig, GuideColumnsPattern } from '../types'\nimport { isValidGuidePattern } from '../validation/guide'\nimport { normalizeValue } from './normalize'\nimport { formatValue } from './parse'\nimport { convertValue, type ConversionContext } from './convert'\n\nexport interface GuideResult {\n template: string\n columnsCount: number\n calculatedGap: number\n isValid: boolean\n}\n\nconst INVALID_RESULT: GuideResult = {\n template: 'none',\n columnsCount: 0,\n calculatedGap: 0,\n isValid: false,\n}\n\n/**\n * Pure calculation of grid template from container width and guide config.\n * Framework-agnostic — can be used outside React.\n *\n * Sizing note: the `line` variant still reports the number of pixel tracks as\n * metadata, but React renders line guides with a CSS gradient so dense grids do\n * not allocate one DOM node per line.\n */\nexport function calculateGuideTemplate(\n width: number,\n config: GuideConfig,\n context?: ConversionContext\n): GuideResult {\n const variant = config.variant ?? 'line'\n const base = config.base ?? 8\n const gap = normalizeValue(config.gap ?? 0, { base, context })\n\n if (!width) return INVALID_RESULT\n\n switch (variant) {\n case 'line': {\n const finalGap = gap === 0 ? 0 : gap - 1\n const actualGapWithLine = finalGap + 1\n\n const columns =\n finalGap === 0\n ? Math.max(1, Math.floor(width) + 1)\n : Math.max(1, Math.floor((width + 1) / actualGapWithLine) + 1)\n\n return {\n template: `repeat(${columns}, 1px)`,\n columnsCount: columns,\n calculatedGap: gap > 0 ? gap - 1 : gap,\n isValid: true,\n }\n }\n\n case 'pattern': {\n if (!config.columns || !Array.isArray(config.columns)) {\n return INVALID_RESULT\n }\n\n if (!isValidGuidePattern(config.columns)) {\n return INVALID_RESULT\n }\n\n const columnsArr = (config.columns as GuideColumnsPattern).map((col) =>\n typeof col === 'number' ? `${col}px` : col\n )\n\n if (columnsArr.some((c) => c === '0' || c === '0px')) {\n return INVALID_RESULT\n }\n\n return {\n template: columnsArr.join(' '),\n columnsCount: columnsArr.length,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n case 'fixed': {\n const colCount = typeof config.columns === 'number' ? config.columns : 0\n if (colCount < 1) return INVALID_RESULT\n\n const colWidth = config.columnWidth\n ? formatValue(config.columnWidth)\n : '1fr'\n\n return {\n template: `repeat(${colCount}, ${colWidth})`,\n columnsCount: colCount,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n case 'auto': {\n const colWidth = config.columnWidth ?? 'auto'\n if (colWidth === 'auto') {\n return {\n template: 'repeat(auto-fill, minmax(0, 1fr))',\n columnsCount: 1,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n const colWidthStr =\n typeof colWidth === 'number' ? `${colWidth}px` : colWidth.toString()\n const pxVal = convertValue(colWidthStr, context) ?? 0\n const columns =\n pxVal > 0 ? Math.max(1, Math.floor((width + gap) / (pxVal + gap))) : 1\n\n return {\n template: `repeat(auto-fill, ${colWidthStr})`,\n columnsCount: columns,\n calculatedGap: gap,\n isValid: true,\n }\n }\n\n default: {\n const columns = Math.max(1, Math.floor(width / (gap + 1)) + 1)\n return {\n template: `repeat(${columns}, 1px)`,\n columnsCount: columns,\n calculatedGap: gap,\n isValid: true,\n }\n }\n }\n}\n\nexport const createGridSpanStyles = (\n span?: number,\n colSpan?: number,\n rowSpan?: number\n): Record<string, string> => {\n const gridStyles: Record<string, string> = {}\n\n if (span !== undefined) {\n gridStyles.gridColumn = `span ${span}`\n gridStyles.gridRow = `span ${span}`\n } else {\n if (colSpan !== undefined) {\n gridStyles.gridColumn = `span ${colSpan}`\n }\n if (rowSpan !== undefined) {\n gridStyles.gridRow = `span ${rowSpan}`\n }\n }\n\n return gridStyles\n}\n","import type { GuideVariant, GuideConfig } from '../types'\nimport { formatValue, createStyleOverride } from '../utils'\n\nexport interface GuideDescriptorParams {\n base: number\n colors: Record<GuideVariant, string>\n variant: GuideVariant\n align: string\n width?: number | string\n height?: number | string\n columnWidth?: number | string\n maxWidth?: number | string\n color?: string\n /** Pre-computed guide template result (from useGuide or calculateGuideTemplate) */\n template: string\n columnsCount: number\n calculatedGap: number\n isVisible: boolean\n}\n\nexport interface GuideDescriptor {\n containerStyle: Record<string, string>\n columnColor: string\n columnsCount: number\n calculatedGap: number\n template: string\n isVisible: boolean\n isLineVariant: boolean\n classTokens: string[]\n}\n\nexport interface GuideConfigParams {\n variant: GuideVariant\n base: number\n gap: number\n columns?: number | readonly (string | number | undefined | 'auto')[]\n columnWidth?: number | string\n}\n\n/**\n * Creates a GuideConfig from component props.\n * Pure function — no React or DOM dependency.\n */\nexport function createGuideConfig({\n variant,\n base,\n gap,\n columns,\n columnWidth,\n}: GuideConfigParams): GuideConfig {\n switch (variant) {\n case 'line':\n return { variant: 'line', gap, base }\n case 'pattern':\n if (columns && Array.isArray(columns)) {\n return {\n variant: 'pattern',\n columns: columns as readonly (string | number)[],\n gap,\n base,\n }\n }\n break\n case 'fixed':\n if (columns !== undefined) {\n const parsed =\n typeof columns === 'number' ? columns : parseInt(String(columns), 10)\n return {\n variant: 'fixed',\n columns: !isNaN(parsed) ? parsed : 12,\n columnWidth: columnWidth || '60px',\n gap,\n base,\n }\n }\n break\n }\n return { variant: 'auto', columnWidth: columnWidth || '1fr', gap, base }\n}\n\nconst GUIDE_DEFAULTS = (\n base: number,\n lineColor: string\n): Record<string, string> => ({\n '--bkgd-w': '100%',\n '--bkgd-h': '100%',\n '--bkgd-mw': 'none',\n '--bkgd-cw': '60px',\n '--bkgd-gw': '24px',\n '--bkgd-n': '12',\n '--bkgd-b': `${base}px`,\n '--bkgd-cl': lineColor,\n '--bkgd-g': '0',\n})\n\n/**\n * Computes all styles and data needed to render a Guide component.\n * Pure function — framework-agnostic.\n */\nexport function createGuideDescriptor(\n params: GuideDescriptorParams\n): GuideDescriptor {\n const {\n base,\n colors,\n variant,\n align,\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isVisible,\n } = params\n\n const defaultStyles = GUIDE_DEFAULTS(base, colors.line)\n const containerStyle: Record<string, string> = {\n // Config is wrapperless, so every guide color channel must travel with\n // the consuming guide rather than relying on root CSS variables.\n '--bkgd-cl': color ?? colors.line,\n '--bkgd-cp': color ?? colors.pattern,\n '--bkgd-ca': color ?? colors.auto,\n '--bkgd-cf': color ?? colors.fixed,\n // Always declare the containing-block default and preserve explicit CSS\n // dimensions. A viewport size is not equivalent to 100% of the parent.\n '--bkgd-w': formatValue(width ?? '100%'),\n '--bkgd-h': formatValue(height ?? '100%'),\n ...createStyleOverride({\n key: '--bkgd-mw',\n value: formatValue(maxWidth || 'none'),\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-cw',\n value: formatValue(columnWidth || '60px'),\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-n',\n value: `${columnsCount}`,\n defaultStyles,\n }),\n ...createStyleOverride({ key: '--bkgd-b', value: '0', defaultStyles }),\n ...createStyleOverride({\n key: '--bkgd-cl',\n value: color ?? colors.line,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-g',\n value: `${calculatedGap}px`,\n defaultStyles,\n }),\n ...createStyleOverride({\n key: '--bkgd-j',\n value: align || 'center',\n defaultStyles,\n }),\n // CSS module resolves grid-template-columns from --bkgd-t, so the inline\n // gridTemplateColumns property would be redundant.\n ...(template && template !== 'none' ? { '--bkgd-t': template } : {}),\n }\n\n const columnColor =\n color ??\n (variant && variant in colors\n ? colors[variant as keyof typeof colors]\n : undefined) ??\n colors.line\n\n const isLineVariant = variant === 'line'\n const classTokens = ['gde', isVisible ? 'v' : 'h']\n if (isLineVariant) classTokens.push('line')\n\n if (isLineVariant) {\n containerStyle['--bkgd-line-color'] = 'var(--bkgd-cl)'\n containerStyle['--bkgd-line-period'] = `${calculatedGap + 1}px`\n }\n\n return {\n containerStyle,\n columnColor,\n columnsCount,\n calculatedGap,\n template,\n isVisible,\n isLineVariant,\n classTokens,\n }\n}\n","import type { BaselineVariant } from '../types'\nimport {\n formatValue,\n normalizeValuePair,\n parsePadding,\n calculateRowCount,\n} from '../utils'\n\nexport interface BaselineDescriptorParams {\n base: number\n colors: Record<BaselineVariant, string>\n variant: BaselineVariant\n width?: number | string\n height?: number | string\n color?: string\n containerWidth: number\n containerHeight: number\n spacing: Record<string, unknown>\n isVisible: boolean\n}\n\nexport interface BaselineDescriptor {\n containerStyle: Record<string, string>\n rowCount: number\n getRowStyle: (index: number) => Record<string, string>\n padding: string | undefined\n isVisible: boolean\n classTokens: string[]\n}\n\n/**\n * Computes all styles and data needed to render a Baseline component.\n * Pure function — framework-agnostic.\n */\nexport function createBaselineDescriptor(\n params: BaselineDescriptorParams\n): BaselineDescriptor {\n const {\n base,\n colors,\n variant,\n width,\n height,\n color,\n containerWidth,\n containerHeight,\n spacing,\n isVisible,\n } = params\n\n const { top, right, bottom, left } = parsePadding(spacing)\n\n const paddingValues = [top, right, bottom, left]\n .map((v) => (v ? `${v}px` : '0'))\n .join(' ')\n const padding = paddingValues !== '0 0 0 0' ? paddingValues : undefined\n\n // The browser resolves declared CSS dimensions. A non-zero measured\n // rectangle is therefore the only reliable height for deciding how many\n // baseline rows are needed; normalizing `height` here incorrectly treats\n // relative values as if they were pixel values in a synthetic conversion\n // context. The fallback only supports DOM-less test/SSR environments before\n // the first layout measurement arrives.\n const layoutHeight =\n containerHeight > 0\n ? containerHeight\n : normalizeValuePair([undefined, height], [containerWidth, 0])[1]\n const rowCount = calculateRowCount({\n height: layoutHeight,\n top,\n bottom,\n base,\n })\n\n const containerStyle: Record<string, string> = {\n // Preserve explicit dimensions verbatim. In particular, `100vh`,\n // `100vw`, `calc(...)`, and zero must not be collapsed to the 100% CSS\n // fallback.\n ...(width !== undefined ? { '--bkbl-w': formatValue(width) } : {}),\n ...(height !== undefined ? { '--bkbl-h': formatValue(height) } : {}),\n // Config is wrapperless. Emit the resolved paint channels on the\n // consuming element even when they happen to match the descriptor's\n // defaults; CSS variables on an ancestor cannot express nested scopes.\n '--bkbl-cl': color ?? colors.line,\n '--bkbl-cf': color ?? colors.flat,\n // Rows inherit the active channel. Keeping this as a reference rather\n // than a copied literal preserves caller style overrides on the host.\n '--bkbl-c': variant === 'line' ? 'var(--bkbl-cl)' : 'var(--bkbl-cf)',\n ...(padding ? { padding } : {}),\n }\n\n const getRowStyle = (index: number): Record<string, string> => ({\n '--bkbl-rt': index === 0 ? '0px' : `${index * base}px`,\n '--bkbl-rh': variant === 'line' ? '1px' : `${base}px`,\n })\n\n const classTokens = ['bas', isVisible ? 'v' : 'h']\n\n return {\n containerStyle,\n rowCount,\n getRowStyle,\n padding,\n isVisible,\n classTokens,\n }\n}\n","import { formatValue, createGridSpanStyles } from '../utils'\n\nexport interface BoxDescriptorParams {\n base: number\n lineColor: string\n width?: number | string\n height?: number | string\n span?: number\n colSpan?: number\n rowSpan?: number\n isVisible: boolean\n}\n\nexport interface BoxDescriptor {\n boxStyle: Record<string, string>\n gridSpanStyle: Record<string, string>\n classTokens: string[]\n}\n\n/**\n * Computes styles needed to render a Box component.\n * Pure function — framework-agnostic.\n */\nexport function createBoxDescriptor(\n params: BoxDescriptorParams\n): BoxDescriptor {\n const { lineColor, width, height, span, colSpan, rowSpan, isVisible } = params\n\n const boxStyle: Record<string, string> = {\n ...(width !== undefined ? { '--bkbx-w': formatValue(width) } : {}),\n ...(height !== undefined ? { '--bkbx-h': formatValue(height) } : {}),\n // Config is context, not a DOM wrapper. The consuming Box must receive\n // its resolved painted value directly so nested/sibling Config scopes do\n // not depend on a root-level custom property.\n '--bkbx-cl': lineColor,\n }\n\n const gridSpanStyle = createGridSpanStyles(span, colSpan, rowSpan)\n\n const classTokens = ['box']\n if (isVisible) classTokens.push('v')\n\n return { boxStyle, gridSpanStyle, classTokens }\n}\n","import { formatValue, normalizeValuePair } from '../utils'\n\nexport interface SpacerDescriptorParams {\n base: number\n colors: { line: string; flat: string; text: string }\n width?: number | string\n height?: number | string\n color?: string\n variant: string\n isVisible: boolean\n}\n\nexport interface SpacerDescriptor {\n style: Record<string, string>\n normWidth: number\n normHeight: number\n classTokens: string[]\n}\n\n/**\n * Computes styles needed to render a Spacer component.\n * Pure function — framework-agnostic.\n */\nexport function createSpacerDescriptor(\n params: SpacerDescriptorParams\n): SpacerDescriptor {\n const { base, colors, width, height, color, variant, isVisible } = params\n\n const [normWidth, normHeight] = normalizeValuePair([width, height], [0, 0], {\n base,\n suppressWarnings: true,\n })\n\n const style: Record<string, string> = {\n ...(height !== undefined ? { '--bksp-h': formatValue(normHeight) } : {}),\n ...(width !== undefined ? { '--bksp-w': formatValue(normWidth) } : {}),\n '--bksp-b': `${base}px`,\n // Emit all resolved painted channels on the consumer. Config is\n // wrapperless, so comparing against defaults would erase custom values.\n '--bksp-ct': color ?? colors.text,\n '--bksp-cl': color ?? colors.line,\n '--bksp-cf': color ?? colors.flat,\n }\n\n const classTokens = ['spr']\n if (isVisible) classTokens.push(variant)\n\n return { style, normWidth, normHeight, classTokens }\n}\n","import { formatValue } from '../utils'\nimport type { Padding } from '../types'\n\nexport interface PadderDescriptorParams {\n base: number\n color: string\n width?: number | string\n height?: number | string\n padding: Padding\n enableSpacers: boolean\n isVisible: boolean\n}\n\nexport interface PadderDescriptor {\n containerStyle: Record<string, string>\n classTokens: string[]\n}\n\n/**\n * Computes styles needed to render a Padder component.\n * Pure function — framework-agnostic.\n */\nexport function createPadderDescriptor(\n params: PadderDescriptorParams\n): PadderDescriptor {\n const { base, color, width, height, padding, enableSpacers, isVisible } =\n params\n\n const containerStyle: Record<string, string> = {}\n\n if (width !== undefined && width !== 'fit-content') {\n containerStyle['--bkpd-w'] = formatValue(width)\n }\n if (height !== undefined && height !== 'fit-content') {\n containerStyle['--bkpd-h'] = formatValue(height)\n }\n\n containerStyle['--bkpd-b'] = `${base}px`\n containerStyle['--bkpd-c'] = color\n\n if (!enableSpacers) {\n const { top, right, bottom, left } = padding\n if (top > 0 || bottom > 0) {\n containerStyle.paddingBlock = `${top}px ${bottom}px`\n }\n if (left > 0 || right > 0) {\n containerStyle.paddingInline = `${left}px ${right}px`\n }\n }\n\n const classTokens = ['pad']\n if (isVisible && enableSpacers) classTokens.push('v')\n\n return { containerStyle, classTokens }\n}\n"],"mappings":"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"}