baseline-kit 3.0.2 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/CHANGELOG.md +235 -0
  2. package/README.md +226 -334
  3. package/dist/baseline-kit.css +7 -22
  4. package/dist/core.cjs +1 -0
  5. package/dist/core.d.ts +354 -0
  6. package/dist/core.mjs +2 -0
  7. package/dist/guide.cjs +2 -0
  8. package/dist/guide.cjs.map +1 -0
  9. package/dist/guide.css +2 -0
  10. package/dist/guide.d.ts +146 -0
  11. package/dist/guide.mjs +586 -0
  12. package/dist/guide.mjs.map +1 -0
  13. package/dist/index.cjs +2 -2
  14. package/dist/index.cjs.map +1 -1
  15. package/dist/index.d.ts +204 -30
  16. package/dist/index.mjs +620 -1747
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/remix-server.d.ts +8 -0
  19. package/dist/remix-server.mjs +15 -0
  20. package/dist/remix-server.mjs.map +1 -0
  21. package/dist/remix.css +2 -0
  22. package/dist/remix.d.ts +177 -0
  23. package/dist/remix.mjs +989 -0
  24. package/dist/remix.mjs.map +1 -0
  25. package/dist/reset.css +43 -0
  26. package/dist/src-C-1u5WNS.cjs +2 -0
  27. package/dist/src-C-1u5WNS.cjs.map +1 -0
  28. package/dist/src-C3TICsw6.js +547 -0
  29. package/dist/src-C3TICsw6.js.map +1 -0
  30. package/dist/styles.css +1 -1
  31. package/dist/theme/dark.css +0 -8
  32. package/dist/theme/default.css +0 -10
  33. package/dist/theme/tokens.css +1 -11
  34. package/dist/theme.css +4 -19
  35. package/package.json +135 -46
  36. package/dist/README.md +0 -446
  37. package/dist/components/Baseline/Baseline.d.ts +0 -48
  38. package/dist/components/Baseline/index.d.ts +0 -6
  39. package/dist/components/Box/Box.d.ts +0 -73
  40. package/dist/components/Box/index.d.ts +0 -6
  41. package/dist/components/Config/Config.d.ts +0 -179
  42. package/dist/components/Config/defaults.d.ts +0 -25
  43. package/dist/components/Config/index.d.ts +0 -11
  44. package/dist/components/Guide/Guide.d.ts +0 -70
  45. package/dist/components/Guide/index.d.ts +0 -6
  46. package/dist/components/Guide/types.d.ts +0 -144
  47. package/dist/components/Guide/validation.d.ts +0 -82
  48. package/dist/components/Layout/Layout.d.ts +0 -73
  49. package/dist/components/Layout/index.d.ts +0 -10
  50. package/dist/components/Padder/Padder.d.ts +0 -67
  51. package/dist/components/Padder/index.d.ts +0 -10
  52. package/dist/components/Spacer/Spacer.d.ts +0 -48
  53. package/dist/components/Spacer/index.d.ts +0 -10
  54. package/dist/components/Stack/Stack.d.ts +0 -84
  55. package/dist/components/Stack/index.d.ts +0 -10
  56. package/dist/components/index.d.ts +0 -16
  57. package/dist/components/styles/index.d.ts +0 -11
  58. package/dist/components/types.d.ts +0 -102
  59. package/dist/hooks/index.d.ts +0 -11
  60. package/dist/hooks/useBaseline.d.ts +0 -55
  61. package/dist/hooks/useConfig.d.ts +0 -41
  62. package/dist/hooks/useDebug.d.ts +0 -49
  63. package/dist/hooks/useGuide.d.ts +0 -61
  64. package/dist/hooks/useIsClient.d.ts +0 -6
  65. package/dist/hooks/useMeasure.d.ts +0 -35
  66. package/dist/hooks/useVirtual.d.ts +0 -60
  67. package/dist/styles.d.ts +0 -6
  68. package/dist/theme.d.ts +0 -6
  69. package/dist/utils/convert.d.ts +0 -24
  70. package/dist/utils/grid.d.ts +0 -22
  71. package/dist/utils/index.d.ts +0 -15
  72. package/dist/utils/math.d.ts +0 -48
  73. package/dist/utils/merge.d.ts +0 -117
  74. package/dist/utils/normalize.d.ts +0 -30
  75. package/dist/utils/padding.d.ts +0 -11
  76. package/dist/utils/parse.d.ts +0 -18
  77. package/dist/utils/snapping.d.ts +0 -28
  78. package/dist/utils/ssr.d.ts +0 -26
  79. package/dist/utils/timing.d.ts +0 -45
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remix.mjs","names":[],"sources":["../packages/core/src/config/defaults.ts","../packages/core/src/config/merge.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","../packages/remix/src/Config.ts","../packages/dom/src/timing.ts","../packages/dom/src/measure.ts","../packages/dom/src/virtual.ts","../packages/remix/src/shared.ts","../packages/remix/src/Baseline.ts","../packages/remix/src/Guide.ts","../packages/remix/src/Spacer.ts","../packages/remix/src/Padder.ts","../packages/remix/src/Box.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","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","import { type Handle, type RemixNode } from 'remix/ui'\nimport {\n DEFAULT_CONFIG,\n type ConfigOverrides,\n mergeConfig,\n type ConfigSchema,\n} from '@baseline-kit/core'\n\nexport type { ConfigSchema } from '@baseline-kit/core'\nexport type { DebuggingMode } from '@baseline-kit/core'\n\nexport type ConfigProps = ConfigOverrides & {\n children?: RemixNode\n}\n\ntype RuntimeConfigProps = ConfigProps & {\n /** Internal bridge for independent client-entry hydration boundaries. */\n __baselineConfig?: ConfigSchema\n}\n\nfunction ConfigImpl(handle: Handle<RuntimeConfigProps, ConfigSchema>) {\n return () => {\n const parentConfig =\n handle.props.__baselineConfig ??\n (handle.context.get(Config) as ConfigSchema | undefined) ??\n DEFAULT_CONFIG\n const value = mergeConfig({\n parentConfig,\n base: handle.props.base,\n baseline: handle.props.baseline,\n guide: handle.props.guide,\n spacer: handle.props.spacer,\n box: handle.props.box,\n padder: handle.props.padder,\n })\n\n handle.context.set(value)\n return handle.props.children ?? null\n }\n}\n\n/**\n * Framework-native configuration scope. It is a zero-DOM component: the\n * resolved value travels through Remix context and is emitted by each\n * consuming component on its own host element.\n */\nexport const Config = ConfigImpl as unknown as (\n handle: Handle<ConfigProps, ConfigSchema>\n) => () => RemixNode\n\nexport { mergeConfig }\n","export const debounce = <T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): [T, () => void] => {\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n\n const debounced = ((...args) => {\n cancel()\n timer = setTimeout(() => fn(...args), delay)\n }) as T\n\n return [debounced, cancel]\n}\n\nexport const rafThrottle = <T extends (...args: never[]) => void>(\n fn: T\n): [T, () => void] => {\n let rafId: number | null = null\n let lastArgs: Parameters<T> | null = null\n\n const cancel = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n lastArgs = null\n }\n }\n\n const throttled = (...args: Parameters<T>) => {\n lastArgs = args\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n\n rafId = requestAnimationFrame(() => {\n fn(...lastArgs!)\n rafId = null\n lastArgs = null\n })\n }\n\n return [throttled as T, cancel]\n}\n","/**\n * Element measurement observer.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface MeasureRect {\n width: number\n height: number\n}\n\nexport interface MeasureObserverHandle {\n /** Force an immediate re-measure */\n refresh(): void\n /** Stop observing */\n disconnect(): void\n}\n\n/**\n * Observes an element's dimensions via ResizeObserver.\n * Calls `onChange` with rounded width/height whenever the size changes.\n */\nexport function createMeasureObserver(\n el: Element,\n onChange: (rect: MeasureRect) => void\n): MeasureObserverHandle {\n let prev: MeasureRect = { width: 0, height: 0 }\n\n const measure = () => {\n try {\n const rect = el.getBoundingClientRect()\n const next: MeasureRect = {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n }\n if (next.width !== prev.width || next.height !== prev.height) {\n prev = next\n onChange(next)\n }\n } catch {\n // element may have been removed\n }\n }\n\n const [throttledMeasure, cancelMeasure] = rafThrottle(measure)\n\n // Initial measurement\n measure()\n\n const observer = new ResizeObserver(throttledMeasure)\n observer.observe(el)\n\n return {\n refresh: throttledMeasure,\n disconnect() {\n observer.disconnect()\n cancelMeasure()\n },\n }\n}\n","/**\n * Virtual scroll range tracker.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface VirtualRange {\n start: number\n end: number\n}\n\nexport interface VirtualTrackerOptions {\n totalItems: number\n itemHeight: number\n buffer?: number\n}\n\nexport interface VirtualTrackerHandle {\n /** Force recalculation */\n refresh(): void\n /** Stop tracking */\n disconnect(): void\n}\n\n/**\n * Tracks which slice of a virtual list is visible in the viewport.\n * Uses IntersectionObserver + window scroll/resize events.\n */\nexport function createVirtualTracker(\n el: Element,\n options: VirtualTrackerOptions,\n onChange: (range: VirtualRange) => void\n): VirtualTrackerHandle {\n const { totalItems, itemHeight, buffer = 0 } = options\n\n if (!Number.isFinite(itemHeight) || itemHeight <= 0) {\n throw new Error(\n 'createVirtualTracker requires itemHeight to be greater than 0'\n )\n }\n\n if (!Number.isFinite(totalItems) || totalItems < 0) {\n throw new Error(\n 'createVirtualTracker requires totalItems to be 0 or greater'\n )\n }\n\n const calculateRange = (): VirtualRange => {\n const rect = el.getBoundingClientRect()\n const offsetTop = rect.top + window.scrollY\n const viewportTop = Math.max(0, window.scrollY - offsetTop - buffer)\n const viewportBottom = viewportTop + window.innerHeight + buffer * 2\n\n const start = Math.max(0, Math.floor(viewportTop / itemHeight))\n const end = Math.min(totalItems, Math.ceil(viewportBottom / itemHeight))\n return { start, end }\n }\n\n let prev: VirtualRange = { start: 0, end: totalItems }\n\n const update = () => {\n const next = calculateRange()\n if (next.start !== prev.start || next.end !== prev.end) {\n prev = next\n onChange(next)\n }\n }\n\n const [throttledUpdate, cancelUpdate] = rafThrottle(update)\n\n const listenerOptions: AddEventListenerOptions = { passive: true }\n\n window.addEventListener('scroll', throttledUpdate, listenerOptions)\n window.addEventListener('resize', throttledUpdate, listenerOptions)\n\n const intersectionObserver = new IntersectionObserver(throttledUpdate, {\n threshold: 0,\n })\n intersectionObserver.observe(el)\n\n throttledUpdate()\n\n return {\n refresh: throttledUpdate,\n disconnect() {\n window.removeEventListener('scroll', throttledUpdate, listenerOptions)\n window.removeEventListener('resize', throttledUpdate, listenerOptions)\n intersectionObserver.disconnect()\n cancelUpdate()\n },\n }\n}\n","import {\n clientEntry,\n ref,\n type Handle,\n type Props,\n type RemixNode,\n type SerializableProps,\n} from 'remix/ui'\nimport { jsx } from 'remix/ui/jsx-runtime'\nimport { DEFAULT_CONFIG } from '@baseline-kit/core'\nimport { Config } from './Config'\nimport {\n createMeasureObserver,\n createVirtualTracker,\n type MeasureRect,\n type VirtualRange,\n type VirtualTrackerHandle,\n} from '@baseline-kit/dom'\nimport type {\n ConfigSchema,\n DebuggingMode,\n SpacingProps,\n} from '@baseline-kit/core'\n\nexport type NativeStyle = Props<'div'>['style']\n\nexport type NativeComponentProps = SpacingProps & {\n className?: string\n style?: NativeStyle\n width?: number | string\n height?: number | string\n debugging?: DebuggingMode\n children?: RemixNode\n}\n\nexport function classNames(\n ...tokens: Array<string | false | null | undefined>\n) {\n return tokens.filter(Boolean).join(' ')\n}\n\nexport function mergeStyles(\n ...styles: Array<NativeStyle | undefined>\n): NativeStyle {\n const result: Record<string, string | number | null | undefined> = {}\n\n for (const style of styles) {\n if (!style) continue\n if (typeof style === 'string') {\n result.cssText = style\n continue\n }\n Object.assign(result, style)\n }\n\n return result\n}\n\nexport function getConfig(\n handle: Handle<unknown, unknown>,\n provider: (...args: never[]) => unknown,\n fallback: ConfigSchema\n): ConfigSchema {\n return (\n (handle.context.get(provider) as unknown as ConfigSchema | undefined) ??\n fallback\n )\n}\n\nexport function resolveDebugging(\n prop: DebuggingMode | undefined,\n configured: DebuggingMode\n) {\n const effective = prop ?? configured\n return {\n isShown: effective === 'visible',\n isNone: effective === 'none',\n debugging: effective,\n }\n}\n\nexport interface ElementObserverBridge {\n attach: ReturnType<typeof ref>\n getElement: () => Element | null\n}\n\nexport type RuntimeHandle = Pick<Handle, 'signal' | 'update'>\n\n// Remix counts component updates that happen before control returns to the\n// event loop. A page with many independent measured components can otherwise\n// trip that diagnostic during hydration even when every update is bounded and\n// legitimate. Keep the queue below the upstream warning threshold and spread\n// larger batches over animation frames; this also gives each batch a chance to\n// settle before the next one is reconciled.\nconst MAX_NATIVE_UPDATES_PER_FRAME = 40\nconst pendingNativeUpdates = new WeakSet<RuntimeHandle>()\nlet nativeUpdateQueue: RuntimeHandle[] = []\nlet nativeUpdateFlushScheduled = false\n\nfunction flushNativeUpdates() {\n nativeUpdateFlushScheduled = false\n\n const batch = nativeUpdateQueue.splice(0, MAX_NATIVE_UPDATES_PER_FRAME)\n for (const handle of batch) {\n if (handle.signal.aborted) {\n pendingNativeUpdates.delete(handle)\n continue\n }\n\n try {\n void handle\n .update()\n .catch(() => undefined)\n .finally(() => pendingNativeUpdates.delete(handle))\n } catch {\n pendingNativeUpdates.delete(handle)\n }\n }\n\n if (nativeUpdateQueue.length > 0) scheduleNativeUpdateFlush()\n}\n\nfunction scheduleNativeUpdateFlush() {\n if (nativeUpdateFlushScheduled) return\n nativeUpdateFlushScheduled = true\n\n if (typeof requestAnimationFrame === 'function') {\n // Yield through a timer before requesting the next frame. Remix resets\n // its cascading-update counter with a timer; scheduling the next frame\n // directly can let WebKit run it first and merge two capped batches.\n setTimeout(() => requestAnimationFrame(flushNativeUpdates), 0)\n } else {\n // The extra turn keeps the fallback equally isolated from a scheduler\n // counter reset queued by the preceding update.\n setTimeout(() => setTimeout(flushNativeUpdates, 0), 0)\n }\n}\n\nexport function queueNativeUpdate(handle: RuntimeHandle) {\n if (handle.signal.aborted || pendingNativeUpdates.has(handle)) return\n pendingNativeUpdates.add(handle)\n nativeUpdateQueue.push(handle)\n scheduleNativeUpdateFlush()\n}\n\nexport type NativeComponent<Props> = (handle: Handle<Props>) => () => RemixNode\n\n/** Capture provider context before Remix serializes an independent entry.\n * The public wrapper also works when an app component creates the consumer\n * during SSR, where walking Config's authored children cannot reach it.\n */\nexport function configuredClientEntry<P extends object>(\n entryId: string,\n implementation: NativeComponent<P & { __baselineConfig?: ConfigSchema }>\n): NativeComponent<P> {\n const Entry = clientEntry(\n entryId,\n implementation as unknown as NativeComponent<SerializableProps>\n )\n const Consumer = ((handle: Handle<P & { __baselineConfig?: ConfigSchema }>) =>\n () => {\n const inheritedConfig = handle.context.get(Config) as\n ConfigSchema | undefined\n const config =\n handle.props.__baselineConfig ??\n // A client entry may hydrate before its authored Config ancestor. The\n // serialized snapshot is the nearest scoped value for that independent\n // boundary; only fall back to live ancestry when no snapshot exists.\n inheritedConfig ??\n DEFAULT_CONFIG\n return jsx(Entry, { ...handle.props, __baselineConfig: config })\n }) as NativeComponent<P>\n return Consumer\n}\n\n/**\n * Connects the framework-native `ref` mixin to the shared DOM measurement\n * service. The component runtime owns the lifetime signal, so no React\n * effect or client-only bridge is needed.\n */\nexport function createElementObserverBridge(\n onMeasure: (rect: MeasureRect) => void\n): ElementObserverBridge {\n let element: Element | null = null\n let measureHandle: ReturnType<typeof createMeasureObserver> | undefined\n let hasNonZeroMeasurement = false\n let initialRefreshAttempts = 0\n\n const refreshUntilMeasured = (signal: AbortSignal) => {\n if (\n signal.aborted ||\n hasNonZeroMeasurement ||\n initialRefreshAttempts >= 10\n ) {\n return\n }\n\n initialRefreshAttempts += 1\n measureHandle?.refresh()\n requestAnimationFrame(() => refreshUntilMeasured(signal))\n }\n\n const attach = ref((node, signal) => {\n element = node\n\n if (typeof ResizeObserver !== 'undefined') {\n measureHandle = createMeasureObserver(node, (rect) => {\n hasNonZeroMeasurement = rect.width > 0 || rect.height > 0\n // The initial measurement can run from the ref insert callback before\n // Remix has committed the component. Deliver it on the next frame so\n // the consumer can safely request an update.\n const deliver = () => {\n if (!signal.aborted) onMeasure(rect)\n }\n if (typeof requestAnimationFrame === 'function') {\n requestAnimationFrame(deliver)\n } else {\n queueMicrotask(deliver)\n }\n })\n\n // A native client entry can hydrate descendants after this ref is\n // inserted. Re-measure on the next frame so an initial zero-sized host\n // does not permanently prevent content-driven sizing from settling.\n queueMicrotask(() => {\n if (signal.aborted) return\n measureHandle?.refresh()\n requestAnimationFrame(() => refreshUntilMeasured(signal))\n })\n }\n\n signal.addEventListener(\n 'abort',\n () => {\n measureHandle?.disconnect()\n measureHandle = undefined\n hasNonZeroMeasurement = false\n initialRefreshAttempts = 0\n element = null\n },\n { once: true }\n )\n })\n\n return { attach, getElement: () => element }\n}\n\nexport interface VirtualBridge {\n setConfig: (totalItems: number, itemHeight: number) => void\n getRange: (totalItems: number) => VirtualRange\n dispose: () => void\n}\n\n/**\n * Reuses the DOM virtual range tracker from the React adapter. Configuration\n * is refreshed after a component commit and all listeners are torn down with\n * the component's Remix handle signal.\n */\nexport function createVirtualBridge(\n handle: RuntimeHandle,\n getElement: () => Element | null,\n onRange: (range: VirtualRange) => void,\n buffer = 160\n): VirtualBridge {\n let tracker: VirtualTrackerHandle | undefined\n let currentKey = ''\n let configuredTotalItems = 0\n let range: VirtualRange = { start: 0, end: 0 }\n\n const dispose = () => {\n tracker?.disconnect()\n tracker = undefined\n currentKey = ''\n }\n\n const setConfig = (totalItems: number, itemHeight: number) => {\n const element = getElement()\n if (!element || typeof IntersectionObserver === 'undefined') return\n\n const key = `${totalItems}:${itemHeight}:${buffer}`\n if (key === currentKey) return\n\n dispose()\n currentKey = key\n configuredTotalItems = totalItems\n range = { start: 0, end: totalItems }\n onRange(range)\n\n tracker = createVirtualTracker(\n element,\n { totalItems, itemHeight, buffer },\n (next) => {\n range = next\n onRange(next)\n }\n )\n }\n\n handle.signal.addEventListener('abort', dispose, { once: true })\n\n return {\n setConfig,\n getRange(totalItems) {\n return {\n start: Math.min(Math.max(range.start, 0), totalItems),\n // A measurement update can increase the descriptor's total before\n // the queued tracker reconfiguration runs. Render the complete new\n // range for that one commit so the old one-item fallback is not\n // retained.\n end: Math.min(\n Math.max(\n totalItems !== configuredTotalItems\n ? totalItems\n : range.end || totalItems,\n 0\n ),\n totalItems\n ),\n }\n },\n dispose,\n }\n}\n","import { type Handle, type RemixNode } from 'remix/ui'\nimport { jsx } from 'remix/ui/jsx-runtime'\nimport {\n DEFAULT_CONFIG,\n createBaselineDescriptor,\n formatValue,\n type BaselineVariant,\n type ConfigSchema,\n type SpacingProps,\n} from '@baseline-kit/core'\nimport {\n getConfig,\n classNames,\n mergeStyles,\n resolveDebugging,\n createElementObserverBridge,\n createVirtualBridge,\n queueNativeUpdate,\n type NativeComponent,\n} from './shared'\nimport { Config } from './Config'\nimport { configuredClientEntry } from './shared'\n\nexport type { BaselineVariant }\n\nexport type BaselineProps = SpacingProps & {\n variant?: BaselineVariant\n width?: number | string\n height?: number | string\n base?: number\n color?: string\n debugging?: 'none' | 'hidden' | 'visible'\n className?: string\n style?: Record<string, string | number | null | undefined>\n children?: RemixNode\n ssrMode?: boolean\n}\n\ntype RuntimeBaselineProps = BaselineProps & {\n __baselineConfig?: ConfigSchema\n}\n\nfunction BaselineImpl(handle: Handle<RuntimeBaselineProps>) {\n let dimensions = { width: 0, height: 0 }\n const requestUpdate = () => {\n queueNativeUpdate(handle)\n }\n const observer = createElementObserverBridge((next) => {\n if (next.width === dimensions.width && next.height === dimensions.height)\n return\n dimensions = next\n requestUpdate()\n })\n const virtual = createVirtualBridge(\n handle,\n observer.getElement,\n requestUpdate\n )\n\n return () => {\n const props = handle.props\n const config =\n props.__baselineConfig ?? getConfig(handle, Config, DEFAULT_CONFIG)\n const base = props.base ?? config.base\n const variant = props.variant ?? config.baseline.variant\n const debugging = resolveDebugging(\n props.debugging,\n config.baseline.debugging\n )\n const descriptor = createBaselineDescriptor({\n base,\n colors: config.baseline.colors,\n variant,\n width: props.width,\n height: props.height,\n color: props.color,\n containerWidth: dimensions.width,\n containerHeight: dimensions.height,\n spacing: {\n padding: props.padding,\n block: props.block,\n inline: props.inline,\n },\n isVisible: debugging.isShown,\n })\n\n if (props.ssrMode) {\n return jsx('div', {\n className: classNames('bk-bas', 'bk-h', 'bk-ssr', props.className),\n 'data-testid': 'baseline',\n 'aria-hidden': true,\n style: mergeStyles(\n descriptor.containerStyle,\n {\n width: formatValue(props.width ?? '100%'),\n height: formatValue(props.height ?? '100%'),\n },\n props.style\n ),\n })\n }\n\n if (debugging.isShown) {\n handle.queueTask(() => virtual.setConfig(descriptor.rowCount, base))\n }\n\n const range = virtual.getRange(descriptor.rowCount)\n const rows = debugging.isShown\n ? Array.from(\n { length: Math.max(0, range.end - range.start) },\n (_, index) => {\n const rowIndex = range.start + index\n return jsx('div', {\n className: 'bk-row',\n key: rowIndex,\n 'data-row-index': rowIndex,\n style: descriptor.getRowStyle(rowIndex),\n })\n }\n )\n : []\n\n return jsx('div', {\n className: classNames(\n ...descriptor.classTokens.map((token) => `bk-${token}`),\n props.className\n ),\n 'data-testid': 'baseline',\n 'aria-hidden': true,\n style: mergeStyles(\n descriptor.containerStyle,\n {\n // Keep the SSR document useful even before the package stylesheet\n // is loaded. The CSS variables remain the canonical runtime path.\n width: formatValue(props.width ?? '100%'),\n height: formatValue(props.height ?? '100%'),\n },\n props.style\n ),\n // Runtime mixins contain callbacks and must not be serialized into a\n // parent client entry's props during SSR. The client entry recreates\n // the descriptor while hydrating.\n mix:\n typeof window === 'undefined' || props.ssrMode\n ? undefined\n : observer.attach,\n children: rows,\n })\n }\n}\n\nexport const Baseline: NativeComponent<BaselineProps> =\n configuredClientEntry<BaselineProps>(\n `${import.meta.url}#Baseline`,\n BaselineImpl\n ) as unknown as NativeComponent<BaselineProps>\n","import { type Handle, type RemixNode } from 'remix/ui'\nimport { jsx } from 'remix/ui/jsx-runtime'\nimport {\n DEFAULT_CONFIG,\n calculateGuideTemplate,\n createGuideConfig,\n createGuideDescriptor,\n type GuideVariant,\n type GuideColumnValue,\n type ConfigSchema,\n} from '@baseline-kit/core'\nimport { Config } from './Config'\nimport { configuredClientEntry } from './shared'\nimport {\n classNames,\n createElementObserverBridge,\n getConfig,\n mergeStyles,\n queueNativeUpdate,\n resolveDebugging,\n type NativeComponent,\n} from './shared'\n\nexport type GuideProps = {\n align?: string\n variant?: GuideVariant\n columns?: number | readonly GuideColumnValue[]\n columnWidth?: number | string\n maxWidth?: number | string\n color?: string\n gap?: number\n width?: number | string\n height?: number | string\n debugging?: 'none' | 'hidden' | 'visible'\n className?: string\n style?: Record<string, string | number | null | undefined>\n children?: RemixNode\n ssrMode?: boolean\n}\n\ntype RuntimeGuideProps = GuideProps & {\n __baselineConfig?: ConfigSchema\n}\n\nfunction GuideImpl(handle: Handle<RuntimeGuideProps>) {\n let dimensions = { width: 0, height: 0 }\n const requestUpdate = () => {\n queueNativeUpdate(handle)\n }\n const observer = createElementObserverBridge((next) => {\n if (next.width === dimensions.width && next.height === dimensions.height)\n return\n dimensions = next\n requestUpdate()\n })\n\n return () => {\n const props = handle.props\n const config =\n props.__baselineConfig ?? getConfig(handle, Config, DEFAULT_CONFIG)\n const variant = props.variant ?? config.guide.variant\n const debug = resolveDebugging(props.debugging, config.guide.debugging)\n const guideConfig = createGuideConfig({\n variant,\n base: config.base,\n gap: props.gap ?? 0,\n columns: props.columns,\n columnWidth: props.columnWidth,\n })\n const result = calculateGuideTemplate(dimensions.width, guideConfig, {\n viewportWidth:\n typeof window === 'undefined' ? undefined : window.innerWidth,\n viewportHeight:\n typeof window === 'undefined' ? undefined : window.innerHeight,\n })\n const descriptor = createGuideDescriptor({\n base: config.base,\n colors: config.guide.colors,\n variant,\n align: props.align ?? 'center',\n width: props.width,\n height: props.height,\n columnWidth: props.columnWidth,\n maxWidth: props.maxWidth,\n color: props.color,\n template: result.template,\n columnsCount: result.columnsCount,\n calculatedGap: result.calculatedGap,\n isVisible: debug.isShown,\n })\n\n if (props.ssrMode) {\n return jsx('div', {\n className: classNames('bk-gde', 'bk-h', 'bk-ssr', props.className),\n 'data-testid': 'guide',\n 'data-variant': variant,\n 'aria-hidden': true,\n style: mergeStyles(\n {\n width: props.width ?? '100%',\n height: props.height ?? '100%',\n maxWidth: props.maxWidth ?? 'none',\n },\n props.style\n ),\n children: props.children,\n })\n }\n\n const columns =\n !descriptor.isLineVariant && debug.isShown\n ? Array.from({ length: descriptor.columnsCount }, (_, index) =>\n jsx('div', {\n key: index,\n className: 'bk-col',\n 'data-column-index': index,\n 'data-variant': variant,\n })\n )\n : null\n const overlay = debug.isShown\n ? jsx('div', {\n className: 'bk-cols',\n 'data-variant': variant,\n children: columns,\n })\n : null\n\n return jsx('div', {\n className: classNames(\n ...descriptor.classTokens.map((token) => `bk-${token}`),\n props.className\n ),\n 'data-testid': 'guide',\n 'data-variant': variant,\n 'aria-hidden': true,\n style: mergeStyles(descriptor.containerStyle, props.style),\n // Runtime mixins contain callbacks and must not be serialized into a\n // parent client entry's props during SSR. The client entry recreates\n // the descriptor while hydrating.\n mix:\n typeof window === 'undefined' || props.ssrMode\n ? undefined\n : observer.attach,\n children: [overlay, props.children],\n })\n }\n}\n\nexport const Guide: NativeComponent<GuideProps> =\n configuredClientEntry<GuideProps>(\n `${import.meta.url}#Guide`,\n GuideImpl\n ) as unknown as NativeComponent<GuideProps>\n","import { type Handle, type RemixNode } from 'remix/ui'\nimport {\n DEFAULT_CONFIG,\n createSpacerDescriptor,\n type Variant,\n type ConfigSchema,\n} from '@baseline-kit/core'\nimport { jsx } from 'remix/ui/jsx-runtime'\nimport { Config } from './Config'\nimport { configuredClientEntry } from './shared'\nimport {\n classNames,\n getConfig,\n mergeStyles,\n resolveDebugging,\n type NativeComponent,\n} from './shared'\n\nexport type IndicatorNode = (\n value: number,\n type: 'width' | 'height'\n) => RemixNode\n\nexport type SpacerProps = {\n width?: number | string\n height?: number | string\n variant?: Variant\n color?: string\n base?: number\n debugging?: 'none' | 'hidden' | 'visible'\n className?: string\n style?: Record<string, string | number | null | undefined>\n children?: RemixNode\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n}\n\ntype RuntimeSpacerProps = SpacerProps & {\n __baselineConfig?: ConfigSchema\n}\n\nfunction SpacerImpl(handle: Handle<RuntimeSpacerProps>) {\n return () => {\n const props = handle.props\n const config =\n props.__baselineConfig ?? getConfig(handle, Config, DEFAULT_CONFIG)\n const base = props.base ?? config.base\n const variant = props.variant ?? config.spacer.variant\n const debugging = resolveDebugging(props.debugging, config.spacer.debugging)\n const descriptor = createSpacerDescriptor({\n base,\n colors: config.spacer.colors,\n width: props.width,\n height: props.height,\n color: props.color,\n variant,\n isVisible: debugging.isShown,\n })\n\n const measurements =\n debugging.isShown && props.indicatorNode\n ? [\n descriptor.normHeight !== 0\n ? jsx('span', {\n key: 'height',\n className: 'bk-indicator',\n 'aria-hidden': true,\n children: props.indicatorNode(\n descriptor.normHeight,\n 'height'\n ),\n })\n : null,\n descriptor.normWidth !== 0\n ? jsx('span', {\n key: 'width',\n className: 'bk-indicator',\n 'aria-hidden': true,\n children: props.indicatorNode(descriptor.normWidth, 'width'),\n })\n : null,\n ]\n : null\n\n return jsx('div', {\n className: classNames(\n ...descriptor.classTokens.map((token) => `bk-${token}`),\n props.className\n ),\n 'data-testid': 'spacer',\n 'data-variant': variant,\n 'data-height': `${descriptor.normHeight}px`,\n style: mergeStyles(descriptor.style, props.style),\n children: [measurements, props.children],\n })\n }\n}\n\nexport const Spacer: NativeComponent<SpacerProps> =\n configuredClientEntry<SpacerProps>(\n `${import.meta.url}#Spacer`,\n SpacerImpl\n ) as unknown as NativeComponent<SpacerProps>\n","import { type Handle, type RemixNode } from 'remix/ui'\nimport {\n DEFAULT_CONFIG,\n calculateSnappedSpacing,\n createPadderDescriptor,\n parsePadding,\n type ConfigSchema,\n type Padding,\n type Spacing,\n} from '@baseline-kit/core'\nimport { jsx } from 'remix/ui/jsx-runtime'\nimport { Config } from './Config'\nimport { configuredClientEntry } from './shared'\nimport { Spacer } from './Spacer'\nimport {\n classNames,\n createElementObserverBridge,\n getConfig,\n mergeStyles,\n queueNativeUpdate,\n resolveDebugging,\n type NativeComponent,\n} from './shared'\n\nexport type PadderProps = {\n width?: number | string\n height?: number | string\n debugging?: 'none' | 'hidden' | 'visible'\n className?: string\n style?: Record<string, string | number | null | undefined>\n block?: Spacing\n inline?: Spacing\n padding?: Parameters<typeof parsePadding>[0]['padding']\n indicatorNode?: (value: number, type: 'width' | 'height') => RemixNode\n children?: RemixNode\n ssrMode?: boolean\n}\n\ntype RuntimePadderProps = PadderProps & {\n __baselineConfig?: ConfigSchema\n}\n\nconst fullRow = { gridColumn: '1 / -1' }\nconst middleColumn = { gridRow: '2 / 3' }\nconst center = { gridRow: '2 / 3', gridColumn: '2 / 3' }\n\nfunction PadderImpl(handle: Handle<RuntimePadderProps>) {\n let base = DEFAULT_CONFIG.base\n let initialPadding: Padding = parsePadding({})\n let snappedPadding: Padding | null = null\n const observer = createElementObserverBridge(({ height }) => {\n if (handle.props.ssrMode || snappedPadding || height === 0) return\n snappedPadding = calculateSnappedSpacing(\n height,\n base,\n initialPadding,\n 'height'\n )\n queueNativeUpdate(handle)\n })\n\n return () => {\n const props = handle.props\n const config =\n props.__baselineConfig ?? getConfig(handle, Config, DEFAULT_CONFIG)\n const debug = resolveDebugging(props.debugging, config.padder.debugging)\n base = config.base\n initialPadding = parsePadding({\n padding: props.padding,\n block: props.block,\n inline: props.inline,\n })\n const padding = props.ssrMode\n ? initialPadding\n : (snappedPadding ?? initialPadding)\n const mix =\n typeof window === 'undefined' || props.ssrMode\n ? undefined\n : observer.attach\n const descriptor = createPadderDescriptor({\n base: config.base,\n color: config.padder.color,\n width: props.width,\n height: props.height,\n padding,\n enableSpacers: !debug.isNone,\n isVisible: debug.isShown,\n })\n\n if (debug.isNone) {\n return jsx('div', {\n className: classNames(\n ...descriptor.classTokens.map((token) => `bk-${token}`),\n props.className\n ),\n 'data-testid': 'padder',\n mix,\n style: mergeStyles(descriptor.containerStyle, props.style),\n children: props.children,\n })\n }\n\n const spacerVariant = config.spacer.variant\n const renderSpacer = (width: number | string, height: number | string) =>\n jsx(Spacer, {\n __baselineConfig: config,\n width: width === '100%' ? undefined : width,\n height: height === '100%' ? undefined : height,\n variant: spacerVariant,\n debugging: debug.debugging,\n indicatorNode: props.indicatorNode,\n })\n\n const children = [\n padding.top >= 0\n ? jsx('div', {\n key: 'top',\n style: fullRow,\n children: renderSpacer('100%', padding.top),\n })\n : null,\n padding.left >= 0\n ? jsx('div', {\n key: 'left',\n style: middleColumn,\n children: renderSpacer(padding.left, '100%'),\n })\n : null,\n jsx('div', {\n key: 'content',\n className: 'bk-pad-content',\n 'data-testid': 'padder-content',\n style: center,\n children: props.children,\n }),\n padding.right >= 0\n ? jsx('div', {\n key: 'right',\n style: middleColumn,\n children: renderSpacer(padding.right, '100%'),\n })\n : null,\n padding.bottom >= 0\n ? jsx('div', {\n key: 'bottom',\n style: fullRow,\n children: renderSpacer('100%', padding.bottom),\n })\n : null,\n ]\n\n return jsx('div', {\n className: classNames(\n ...descriptor.classTokens.map((token) => `bk-${token}`),\n props.className\n ),\n 'data-testid': 'padder',\n mix,\n style: mergeStyles(descriptor.containerStyle, props.style),\n children,\n })\n }\n}\n\nexport const Padder: NativeComponent<PadderProps> =\n configuredClientEntry<PadderProps>(\n `${import.meta.url}#Padder`,\n PadderImpl\n ) as unknown as NativeComponent<PadderProps>\n","import { type Handle } from 'remix/ui'\nimport { jsx } from 'remix/ui/jsx-runtime'\nimport {\n DEFAULT_CONFIG,\n calculateSnappedSpacing,\n createBoxDescriptor,\n parsePadding,\n type SnappingMode,\n type Padding,\n type ConfigSchema,\n} from '@baseline-kit/core'\nimport { Config } from './Config'\nimport { configuredClientEntry } from './shared'\nimport { Padder } from './Padder'\nimport {\n classNames,\n createElementObserverBridge,\n getConfig,\n mergeStyles,\n queueNativeUpdate,\n resolveDebugging,\n type NativeComponent,\n} from './shared'\nimport type { RemixNode } from 'remix/ui'\n\nexport type { SnappingMode }\n\nexport type BoxProps = {\n colSpan?: number\n rowSpan?: number\n span?: number\n snapping?: SnappingMode\n width?: number | string\n height?: number | string\n debugging?: 'none' | 'hidden' | 'visible'\n className?: string\n style?: Record<string, string | number | null | undefined>\n padding?: Parameters<typeof parsePadding>[0]['padding']\n block?: Parameters<typeof parsePadding>[0]['block']\n inline?: Parameters<typeof parsePadding>[0]['inline']\n children?: RemixNode\n ssrMode?: boolean\n}\n\ntype RuntimeBoxProps = BoxProps & {\n __baselineConfig?: ConfigSchema\n}\n\nfunction BoxImpl(handle: Handle<RuntimeBoxProps>) {\n let currentBase = DEFAULT_CONFIG.base\n let currentSnapping: SnappingMode = 'clamp'\n let currentInitialPadding: Padding = parsePadding({})\n let snappedPadding: Padding | null = null\n\n const requestUpdate = () => {\n queueNativeUpdate(handle)\n }\n\n const observer = createElementObserverBridge((next) => {\n if (currentSnapping === 'none' || snappedPadding || next.height === 0) {\n return\n }\n\n snappedPadding = calculateSnappedSpacing(\n next.height,\n currentBase,\n currentInitialPadding,\n currentSnapping\n )\n requestUpdate()\n })\n\n return () => {\n const props = handle.props\n const config =\n props.__baselineConfig ?? getConfig(handle, Config, DEFAULT_CONFIG)\n const snapping = props.snapping ?? 'clamp'\n const debug = resolveDebugging(props.debugging, config.box.debugging)\n const initialPadding = parsePadding({\n padding: props.padding,\n block: props.block,\n inline: props.inline,\n })\n currentBase = config.base\n currentSnapping = snapping\n currentInitialPadding = initialPadding\n const padding =\n snapping === 'none' ? initialPadding : (snappedPadding ?? initialPadding)\n const descriptor = createBoxDescriptor({\n base: config.base,\n lineColor: config.box.colors.line,\n width: props.width,\n height: props.height,\n span: props.span,\n colSpan: props.colSpan,\n rowSpan: props.rowSpan,\n isVisible: debug.isShown,\n })\n\n const padder = jsx(Padder, {\n block: [padding.top, padding.bottom],\n inline: [padding.left, padding.right],\n width: 'fit-content',\n height: props.height,\n debugging: debug.debugging,\n // Box owns the measured snap; the inner Padder must honor each new\n // padding value instead of caching a second independent measurement.\n ssrMode: true,\n children: props.children,\n })\n\n return jsx('div', {\n className: classNames(\n ...descriptor.classTokens.map((token) => `bk-${token}`),\n props.className\n ),\n 'data-testid': 'box',\n style: mergeStyles(\n descriptor.boxStyle,\n descriptor.gridSpanStyle,\n props.style\n ),\n mix:\n typeof window === 'undefined' || props.ssrMode || snapping === 'none'\n ? undefined\n : observer.attach,\n children: jsx(Config, {\n __baselineConfig: config,\n base: 1,\n spacer: { variant: 'flat' },\n children: padder,\n }),\n })\n }\n}\n\nexport const Box: NativeComponent<BoxProps> = configuredClientEntry<BoxProps>(\n `${import.meta.url}#Box`,\n BoxImpl\n) as unknown as NativeComponent<BoxProps>\n"],"mappings":"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"}
package/dist/reset.css ADDED
@@ -0,0 +1,43 @@
1
+ *,
2
+ *::before,
3
+ *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ /* Remove list styles on ul, ol elements */
10
+ ul[role='list'],
11
+ ol[role='list'] {
12
+ list-style: none;
13
+ }
14
+
15
+ /* Set core body defaults */
16
+ body {
17
+ min-height: 100vh;
18
+ text-rendering: optimizeSpeed;
19
+ line-height: 1.5;
20
+ }
21
+
22
+ /* Make images easier to work with */
23
+ img,
24
+ picture {
25
+ max-width: 100%;
26
+ display: block;
27
+ }
28
+
29
+ /* Remove all animations, transitions and smooth scroll for people that prefer not to see them */
30
+ @media (prefers-reduced-motion: reduce) {
31
+ html:focus-within {
32
+ scroll-behavior: auto;
33
+ }
34
+
35
+ *,
36
+ *::before,
37
+ *::after {
38
+ animation-duration: 0.01ms !important;
39
+ animation-iteration-count: 1 !important;
40
+ transition-duration: 0.01ms !important;
41
+ scroll-behavior: auto !important;
42
+ }
43
+ }
@@ -0,0 +1,2 @@
1
+ var e={base:8,baseline:{variant:`line`,debugging:`hidden`,colors:{line:`var(--bk-baseline-color-line-theme, hsla(240, 60%, 40%, 0.15))`,flat:`var(--bk-baseline-color-flat-theme, hsla(230, 100%, 70%, 0.2))`}},guide:{variant:`line`,debugging:`hidden`,colors:{line:`var(--bk-guide-color-line-theme, hsla(240, 60%, 40%, 0.15))`,pattern:`var(--bk-guide-color-pattern-theme, hsla(230, 100%, 70%, 0.2))`,auto:`var(--bk-guide-color-auto-theme, hsla(200, 100%, 70%, 0.15))`,fixed:`var(--bk-guide-color-fixed-theme, hsla(200, 100%, 70%, 0.15))`}},spacer:{variant:`line`,debugging:`hidden`,colors:{line:`var(--bk-spacer-color-line-theme, hsla(270, 60%, 40%, 0.6))`,flat:`var(--bk-spacer-color-flat-theme, hsla(230, 100%, 70%, 0.2))`,text:`var(--bk-spacer-color-text-theme, hsla(270, 60%, 40%, 1))`}},box:{debugging:`hidden`,colors:{line:`var(--bk-box-color-line-theme, hsla(300, 60%, 40%, 0.6))`,flat:`var(--bk-box-color-flat-theme, hsla(260, 100%, 70%, 0.2))`,text:`var(--bk-box-color-text-theme, hsla(300, 60%, 40%, 0.9))`}},padder:{debugging:`hidden`,color:`var(--bk-padder-color-theme, hsla(270, 60%, 40%, 0.6))`}},t=[`baseline`,`guide`,`spacer`,`box`,`padder`],n=e=>{let{parentConfig:n,base:r}=e,i={};for(let r of t){let t=e[r],a=n[r],o={...a,...t};t&&`colors`in t&&t.colors&&`colors`in a&&(o.colors={...a.colors,...t.colors}),i[r]=o}return{base:r??n.base,...i}},r=e=>{let{base:t,baseline:n,guide:r,spacer:i,box:a,padder:o}=e;return{"--bk-base":`${t}px`,"--bkbl-cl":n.colors.line,"--bkbl-cf":n.colors.flat,"--bkgd-cl":r.colors.line,"--bkgd-cp":r.colors.pattern,"--bkgd-ca":r.colors.auto,"--bkgd-cf":r.colors.fixed,"--bksp-cl":i.colors.line,"--bksp-cf":i.colors.flat,"--bksp-ct":i.colors.text,"--bkbx-cl":a.colors.line,"--bkbx-cf":a.colors.flat,"--bkbx-ct":a.colors.text,"--bkpd-c":o.color}},i=[`start`,`center`,`end`],a=[`line`,`flat`];function o(e){let t=e.trim().match(/^([+-]?[\d.]+)([a-zA-Z%]+)$/);return t?{value:parseFloat(t[1]),unit:t[2]}:null}function s(e,t){return e===void 0&&t!==void 0?`${t}px`:e===`auto`||typeof e==`string`&&/^(auto|100%|0|.*(fr|vh|vw|vmin|vmax|rem))$/.test(e)?String(e):typeof e==`number`?`${e}px`:e??``}var c={parentSize:0,viewportWidth:1920,viewportHeight:1080,rootFontSize:16,parentFontSize:16},l={px:1,in:96,cm:37.8,mm:3.78,pt:1.33,pc:16},u=[`em`,`rem`,`vh`,`vw`,`vmin`,`vmax`,`%`],d={em:e=>e.parentFontSize,rem:e=>e.rootFontSize,vh:e=>e.viewportHeight/100,vw:e=>e.viewportWidth/100,vmin:e=>Math.min(e.viewportWidth,e.viewportHeight)/100,vmax:e=>Math.max(e.viewportWidth,e.viewportHeight)/100,"%":e=>e.parentSize/100};function f(e,t){if(typeof e==`number`)return e;if(typeof e!=`string`)return null;let n=o(e);if(!n)return null;let{value:r,unit:i}=n;if(i in l)return r*l[i];if(i===`auto`)return null;let a=d[i];return a?r*a({...c,...t}):null}function p(e,t,n){return Math.min(Math.max(e,t),n)}function m(e){let{height:t,top:n,bottom:r,base:i}=e,a=(t??0)-(n+r);return Math.max(1,Math.floor(a/i))}function h(e,t={}){let{base:n=8,round:r=!0,clamp:i,context:a}=t;if(e===`auto`)return n;let o=null;if(typeof e==`number`?o=e:typeof e==`string`&&(o=f(e,a)??n),o===null&&(o=n),n<=0)return o;let s=r?Math.round(o/n)*n:o;return i===void 0?s:p(s,i.min??-1/0,i.max??1/0)}function g(e,t,n){return!e||e[0]===void 0&&e[1]===void 0?t:[e[0]===void 0?t[0]:h(e[0],n),e[1]===void 0?t[1]:h(e[1],n)]}function _(e){if(`padding`in e&&e.padding!=null)return v(e.padding);let t=`block`in e&&e.block!=null?y(e.block):{top:0,bottom:0},n=`inline`in e&&e.inline!=null?b(e.inline):{left:0,right:0};return{top:t.top,right:n.right,bottom:t.bottom,left:n.left}}function v(e){if(typeof e==`number`)return{top:e,right:e,bottom:e,left:e};if(Array.isArray(e)){let[t=0,n=0,r,i]=e;return{top:t,right:n,bottom:r??t,left:i??n}}return typeof e==`object`?{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0}:{top:0,right:0,bottom:0,left:0}}function y(e){if(typeof e==`number`)return{top:e,bottom:e};if(Array.isArray(e)){let[t,n]=e;return{top:t??0,bottom:n??0}}return typeof e==`object`?{top:e.start??0,bottom:e.end??0}:{top:0,bottom:0}}function b(e){if(typeof e==`number`)return{left:e,right:e};if(Array.isArray(e)){let[t,n]=e;return{left:t??0,right:n??0}}return typeof e==`object`?{left:e.start??0,right:e.end??0}:{left:0,right:0}}function x(e,t,n,r){let i=_({padding:n});if(r===`none`)return i;if(r===`height`){let n=e%t;n!==0&&(i.bottom+=t-n)}if(r===`clamp`){i.top%=t;let n=e%t;n!==0&&(i.bottom+=t-n),i.bottom%=t}return i}var S=(...e)=>e.filter(Boolean).join(` `).trim();function C(e,t){let n=e??t;return{isShown:n===`visible`,isHidden:n===`hidden`,isNone:n===`none`,debugging:n}}function w(e,t,n){let r=typeof e==`string`?e:e.key,i=typeof e==`string`?t:e.value,a=typeof e==`string`?n:e.defaultStyles,o=typeof e==`object`?e.skipDimensions:void 0;return o&&(o.fitContent?.includes(r)&&i===`fit-content`||o.auto?.includes(r)&&i===`auto`||o.fullSize?.includes(r)&&(i===`100%`||i===`100vh`||i===`100vw`))||i===a[r]?{}:{[r]:i}}var T=/^\d*\.?\d+(?:fr|px|%|em|rem|vh|vw|vmin|vmax|pt|pc|in|cm|mm)$/,E=e=>typeof e==`number`?Number.isFinite(e)&&e>=0:typeof e==`string`?e===`auto`||e===`100%`||T.test(e):!1,D=e=>Array.isArray(e)&&e.length>0&&e.every(E),O={template:`none`,columnsCount:0,calculatedGap:0,isValid:!1};function k(e,t,n){let r=t.variant??`line`,i=t.base??8,a=h(t.gap??0,{base:i,context:n});if(!e)return O;switch(r){case`line`:{let t=a===0?0:a-1,n=t+1,r=t===0?Math.max(1,Math.floor(e)+1):Math.max(1,Math.floor((e+1)/n)+1);return{template:`repeat(${r}, 1px)`,columnsCount:r,calculatedGap:a>0?a-1:a,isValid:!0}}case`pattern`:{if(!t.columns||!Array.isArray(t.columns)||!D(t.columns))return O;let e=t.columns.map(e=>typeof e==`number`?`${e}px`:e);return e.some(e=>e===`0`||e===`0px`)?O:{template:e.join(` `),columnsCount:e.length,calculatedGap:a,isValid:!0}}case`fixed`:{let e=typeof t.columns==`number`?t.columns:0;return e<1?O:{template:`repeat(${e}, ${t.columnWidth?s(t.columnWidth):`1fr`})`,columnsCount:e,calculatedGap:a,isValid:!0}}case`auto`:{let r=t.columnWidth??`auto`;if(r===`auto`)return{template:`repeat(auto-fill, minmax(0, 1fr))`,columnsCount:1,calculatedGap:a,isValid:!0};let i=typeof r==`number`?`${r}px`:r.toString(),o=f(i,n)??0,s=o>0?Math.max(1,Math.floor((e+a)/(o+a))):1;return{template:`repeat(auto-fill, ${i})`,columnsCount:s,calculatedGap:a,isValid:!0}}default:{let t=Math.max(1,Math.floor(e/(a+1))+1);return{template:`repeat(${t}, 1px)`,columnsCount:t,calculatedGap:a,isValid:!0}}}}var A=(e,t,n)=>{let r={};return e===void 0?(t!==void 0&&(r.gridColumn=`span ${t}`),n!==void 0&&(r.gridRow=`span ${n}`)):(r.gridColumn=`span ${e}`,r.gridRow=`span ${e}`),r};function j({variant:e,base:t,gap:n,columns:r,columnWidth:i}){switch(e){case`line`:return{variant:`line`,gap:n,base:t};case`pattern`:if(r&&Array.isArray(r))return{variant:`pattern`,columns:r,gap:n,base:t};break;case`fixed`:if(r!==void 0){let e=typeof r==`number`?r:parseInt(String(r),10);return{variant:`fixed`,columns:isNaN(e)?12:e,columnWidth:i||`60px`,gap:n,base:t}}}return{variant:`auto`,columnWidth:i||`1fr`,gap:n,base:t}}var M=(e,t)=>({"--bkgd-w":`100%`,"--bkgd-h":`100%`,"--bkgd-mw":`none`,"--bkgd-cw":`60px`,"--bkgd-gw":`24px`,"--bkgd-n":`12`,"--bkgd-b":`${e}px`,"--bkgd-cl":t,"--bkgd-g":`0`});function N(e){let{base:t,colors:n,variant:r,align:i,width:a,height:o,columnWidth:c,maxWidth:l,color:u,template:d,columnsCount:f,calculatedGap:p,isVisible:m}=e,h=M(t,n.line),g={"--bkgd-cl":u??n.line,"--bkgd-cp":u??n.pattern,"--bkgd-ca":u??n.auto,"--bkgd-cf":u??n.fixed,"--bkgd-w":s(a??`100%`),"--bkgd-h":s(o??`100%`),...w({key:`--bkgd-mw`,value:s(l||`none`),defaultStyles:h}),...w({key:`--bkgd-cw`,value:s(c||`60px`),defaultStyles:h}),...w({key:`--bkgd-n`,value:`${f}`,defaultStyles:h}),...w({key:`--bkgd-b`,value:`0`,defaultStyles:h}),...w({key:`--bkgd-cl`,value:u??n.line,defaultStyles:h}),...w({key:`--bkgd-g`,value:`${p}px`,defaultStyles:h}),...w({key:`--bkgd-j`,value:i||`center`,defaultStyles:h}),...d&&d!==`none`?{"--bkgd-t":d}:{}},_=u??(r&&r in n?n[r]:void 0)??n.line,v=r===`line`,y=[`gde`,m?`v`:`h`];return v&&y.push(`line`),v&&(g[`--bkgd-line-color`]=`var(--bkgd-cl)`,g[`--bkgd-line-period`]=`${p+1}px`),{containerStyle:g,columnColor:_,columnsCount:f,calculatedGap:p,template:d,isVisible:m,isLineVariant:v,classTokens:y}}function P(e){let{base:t,colors:n,variant:r,width:i,height:a,color:o,containerWidth:c,containerHeight:l,spacing:u,isVisible:d}=e,{top:f,right:p,bottom:h,left:v}=_(u),y=[f,p,h,v].map(e=>e?`${e}px`:`0`).join(` `),b=y===`0 0 0 0`?void 0:y,x=m({height:l>0?l:g([void 0,a],[c,0])[1],top:f,bottom:h,base:t});return{containerStyle:{...i===void 0?{}:{"--bkbl-w":s(i)},...a===void 0?{}:{"--bkbl-h":s(a)},"--bkbl-cl":o??n.line,"--bkbl-cf":o??n.flat,"--bkbl-c":r===`line`?`var(--bkbl-cl)`:`var(--bkbl-cf)`,...b?{padding:b}:{}},rowCount:x,getRowStyle:e=>({"--bkbl-rt":e===0?`0px`:`${e*t}px`,"--bkbl-rh":r===`line`?`1px`:`${t}px`}),padding:b,isVisible:d,classTokens:[`bas`,d?`v`:`h`]}}function F(e){let{lineColor:t,width:n,height:r,span:i,colSpan:a,rowSpan:o,isVisible:c}=e,l={...n===void 0?{}:{"--bkbx-w":s(n)},...r===void 0?{}:{"--bkbx-h":s(r)},"--bkbx-cl":t},u=A(i,a,o),d=[`box`];return c&&d.push(`v`),{boxStyle:l,gridSpanStyle:u,classTokens:d}}function I(e){let{base:t,colors:n,width:r,height:i,color:a,variant:o,isVisible:c}=e,[l,u]=g([r,i],[0,0],{base:t,suppressWarnings:!0}),d={...i===void 0?{}:{"--bksp-h":s(u)},...r===void 0?{}:{"--bksp-w":s(l)},"--bksp-b":`${t}px`,"--bksp-ct":a??n.text,"--bksp-cl":a??n.line,"--bksp-cf":a??n.flat},f=[`spr`];return c&&f.push(o),{style:d,normWidth:l,normHeight:u,classTokens:f}}function L(e){let{base:t,color:n,width:r,height:i,padding:a,enableSpacers:o,isVisible:c}=e,l={};if(r!==void 0&&r!==`fit-content`&&(l[`--bkpd-w`]=s(r)),i!==void 0&&i!==`fit-content`&&(l[`--bkpd-h`]=s(i)),l[`--bkpd-b`]=`${t}px`,l[`--bkpd-c`]=n,!o){let{top:e,right:t,bottom:n,left:r}=a;(e>0||n>0)&&(l.paddingBlock=`${e}px ${n}px`),(r>0||t>0)&&(l.paddingInline=`${r}px ${t}px`)}let u=[`pad`];return c&&o&&u.push(`v`),{containerStyle:l,classTokens:u}}Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"O",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"k",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return p}});
2
+ //# sourceMappingURL=src-C-1u5WNS.cjs.map
@@ -0,0 +1 @@
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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"}